コマンド ラインでの単精度の C コードの生成
この例では、単精度の C コードを倍精度の MATLAB® コードからコマンド ラインで生成する方法について示します。
前提条件
この例を実行するには、次の製品をインストールします。
MATLAB
MATLAB Coder™
Fixed-Point Designer™
C コンパイラ
サポートされるコンパイラ を参照してください。
mex -setupを使用して既定のコンパイラを変更できます。既定のコンパイラの変更を参照してください。
コード ファイルの作成
ローカルの書き込み可能なフォルダーに、関数
ex_2ndOrder_filter.mを作成します。function y = ex_2ndOrder_filter(x) %#codegen persistent z if isempty(z) z = zeros(2,1); end % [b,a] = butter(2, 0.25) b = [0.0976310729378175, 0.195262145875635, 0.0976310729378175]; a = [1, -0.942809041582063, 0.3333333333333333]; y = zeros(size(x)); for i = 1:length(x) y(i) = b(1)*x(i) + z(1); z(1) = b(2)*x(i) + z(2) - a(2) * y(i); z(2) = b(3)*x(i) - a(3) * y(i); end end
テスト ファイル
ex_2ndOrder_filter_test.mを作成してex_2ndOrder_filterアルゴリズムの演習を行います。次のような事前処理と事後処理を行うテスト スクリプトを個別に作成することをお勧めします。
入力値の設定
テストする関数の呼び出し
テスト結果の出力
意図したシステムの動作範囲全体をカバーするため、このテスト スクリプトは関数
ex_2ndOrder_filterを 3 つの入力信号、チャープ、ステップ、インパルスを使用して実行します。次に、スクリプトは出力をプロットします。% ex_2ndOrder_filter_test % % Define representative inputs N = 256; % Number of points t = linspace(0,1,N); % Time vector from 0 to 1 second f1 = N/2; % Target frequency of chirp set to Nyquist x_chirp = sin(pi*f1*t.^2); % Linear chirp from 0 to Fs/2 Hz in 1 second x_step = ones(1,N); % Step x_impulse = zeros(1,N); % Impulse x_impulse(1) = 1; % Run the function under test x = [x_chirp;x_step;x_impulse]; y = zeros(size(x)); for i = 1:size(x,1) y(i,:) = ex_2ndOrder_filter(x(i,:)); end % Plot the results titles = {'Chirp','Step','Impulse'} clf for i = 1:size(x,1) subplot(size(x,1),1,i) plot(t,x(i,:),t,y(i,:)) title(titles{i}) legend('Input','Output') end xlabel('Time (s)') figure(gcf) disp('Test complete.')
入力引数の型の決定
入力引数 x の型を決定するには、coder.getArgTypes を使用してテスト ファイル ex_2ndOrder_filter_test.m を実行します。
types = coder.getArgTypes('ex_2ndOrder_filter_test', 'ex_2ndOrder_filter');
テスト ファイルが実行され、各入力信号のフィルターの出力が表示されます。coder.getArgTypes は x の入力型を 1 行 256 列の double とすることを決定します。
単精度の MEX を生成して実行し、数値的動作を検証
単精度の C コードを生成する前に、生成された単精度コードの動作の検証に使用できる単精度の MEX 関数を生成します。単精度の MEX コードが必要であることを示すには、
-singleCオプションを使用します。codegen -singleC ex_2ndOrder_filter -args types -report
MEX の生成中に、コード ジェネレーターによって単精度変換の問題が検出されます。C/C++ コードを生成する前に、この問題を解決します。この例には単精度変換の問題はありません。
生成された MEX は単精度と倍精度の入力を受け入れます。同じテスト ファイルを使用して、倍精度の MATLAB 関数と単精度の MEX 関数を実行できます。単精度の MEX 関数を呼び出すためにテスト ファイルを変更する必要はありません。
テスト ファイル
ex_2ndOrder_filter_test.mを実行します。このファイルは倍精度の MATLAB 関数ex_2ndOrder_filter.mを呼び出します。ex_2ndOrder_filter_test
テスト ファイルが実行され、各入力信号のフィルターの出力が表示されます。
倍精度の関数
ex_2ndOrder_filterの呼び出しを単精度の関数ex_2ndOrder_filter_mexの呼び出しで置き換えてテスト ファイルex_2ndOrder_filter_testを実行します。coder.runTest('ex_2ndOrder_filter_test', 'ex_2ndOrder_filter')
テスト ファイルが実行され、各入力信号のフィルターの出力が表示されます。単精度の MEX 関数は倍精度の MATLAB 関数と同じ結果を生成します。
単精度の C コードの生成
C のスタティック ライブラリ、ダイナミック ライブラリまたは実行可能ファイルを生成するためのコード構成オブジェクトを作成します。
cfg = coder.config('lib');単精度の C コードを生成するには、
-singleCオプションを使用してcodegenを呼び出します。コード生成レポートの生成を有効にします。codegen -config cfg -singleC ex_2ndOrder_filter -args {types{1}} -report
生成された単精度の C コードの表示
C コード生成についてのコード生成レポートを表示するには、[レポートの表示] リンクをクリックします。
[生成されるコード] ペインで、ex_2ndOrder_filter.c をクリックします。
倍精度変数は C コード内に
float型をもちます。インデックス
iは整数です。
潜在的なデータ型の問題の表示
単精度コードを生成する場合、codegen を使用して潜在的なデータ型の問題をコード生成レポートで強調表示できます。codegen で倍精度演算を削除できない場合、演算を行う MATLAB 式がレポートで強調表示されます。
[コードの洞察] タブをクリックします。[潜在的なデータ型の問題] を展開します。倍精度演算がないということは、倍精度演算が残っていないことを示します。
参考
codegen | coder.config | coder.getArgTypes | coder.runTest