コマンド ラインでの単精度の 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