2016-12-27 96 views
0

代碼讓我們假設我們有下面的代碼生成C++從MATLAB

function Hdl=mcadd() 
%#codegen 
Fc=0.4; 
N=100; % FIR filter order 
Hf=fdesign.lowpass('N,Fc',N,Fc); 
Hdl=design(Hf,'window','window',@hamming,'SystemObject',true); 
end 

我想低通濾波器的設計從MATLAB代碼轉換前奏相當於C++代碼,爲了這個,我已經嘗試下面的命令

codegen -args {Z} -report mcadd.m 

我從下面的命令 enter image description here

了這個命令,但我得到以下錯誤

codegen -args {Z} -report mcadd.m 
Failed to evaluate '{Z}' to non-empty array in the base workspace. 
Use help codegen for more information on using this command. 
Error using codegen (line 146) 

這裏是工作的代碼

function c=add_numbers(a,b) 
%#codegen 
c=a+b; 
disp(c) 
end 

結果

>> a=5; 
>> b=4; 
>> codegen -args {a,b} -report add_numbers.m 

Code generation successful: View report 

回答

2

有與您試圖什麼多個問題。首先,只有當函數有輸入時,才需要選項-args to codegen命令。由於您沒有輸入,因此您不需要該選項。如果函數需要輸入參數,則需要在該參數的{}之間提供一個有效的現有MATLAB變量。

您可以運行codegen mcadd爲您的函數嘗試codegen。

但是fdesign.lowpass類不支持代碼生成。這將引發一個代碼生成錯誤,說相同。當您使用filter函數或dsp.FIRFilter系統對象時,代碼生成支持篩選過程。但我認爲任何過濾器設計過程都不支持代碼生成。如果你知道你的濾波器參數,你通常在MATLAB中設計濾波器,並使用系統對象或濾波器函數在你的函數中使用濾波器係數。然後您可以爲此功能生成C代碼。

示例工作流程如下。

% Design filter in MATLAB 
Fc=0.4; 
N=100; % FIR filter order 
Hf=fdesign.lowpass('N,Fc',N,Fc); 
Hdl=design(Hf,'window','window',@hamming) 

將您的功能更改爲僅使用輸入濾波器係數對數據進行濾波。

function y=mcadd(data, coeffs) 
%#codegen 

persistent obj 
if isempty(obj) 
    obj = dsp.FIRFilter('Numerator', coeffs); 
end 

y = step(obj, data); 

end 

編譯功能如下。

codegen mcadd -args {0,coder.Constant(Hdl.Numerator)} 

上面一行假設您將一次發送一個輸入樣本進行過濾。您可以在上面的代碼中更改0以匹配您的輸入大小和類型。編譯後可以調用你的函數,

mcadd_mex(0, Hdl.Numerator) 

codegen默認生成一個mex文件的代碼。如果您想要生成的代碼並將其用於集成到其他C代碼中,請嘗試使用libgen作爲codegen,如下所示。

codegen -config:lib mcadd -args {0,coder.Constant(Hdl.Numerator)} 

MATLAB Coder應用程序將帶你通過這個步驟,使過程更容易。

+0

在此先感謝您,對於給定的代碼,您能幫助我向我展示一個可行的例子嗎?謝謝advanmce –

+0

讓我寫簡單的函數然後 –

+0

係數是設計濾波器的結果嗎?我的意思是那些過濾器的設計應該是功能的特大? –