MATLAB Coder アプリを使用した単精度の C コードの生成
この例では、MATLAB® Coder™ アプリを使用して倍精度の MATLAB コードから単精度の C コードを生成する方法について示します。
前提条件
この例を実行するには、次の製品をインストールします。
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.')
MATLAB Coder アプリを開く
この例で使用するファイルを含む作業フォルダーに移動します。
MATLAB ツールストリップの [アプリ] タブの [コード生成] の下で、アプリ アイコンをクリックします。
ソース ファイルの選択
プロジェクトにエントリポイント関数 ex_2ndOrder_filter
を追加するために、ファイル ex_2ndOrder_filter.m
を探して [開く] をクリックします。既定では、アプリはこのプロジェクトの情報および設定を現在のフォルダーの ex_2ndOrder_filter.prj
というファイルに保存します。
単精度変換の有効化
[数値変換] を
[単精度に変換]
に設定します。[次へ] をクリックして [入力の型を定義] ステップに進みます。
ex_2ndOrder_filter.m
のコード違反およびコード生成の準備状態の問題が検査されます。ex_2ndOrder_filter.m
には問題は検出されません。
入力の型の定義
[入力の型を定義] ページで、
ex_2ndOrder_filter_test
をテスト ファイルとして追加するためにex_2ndOrder_filter_test
を参照します。[開く] をクリックします。[入力の型の自動定義] をクリックします。
テスト ファイルが実行され、各入力信号のフィルターの出力が表示されます。アプリは
x
の入力の型がdouble(1x256)
であると判断します。[次へ] をクリックして [実行時の問題の確認] ステップに進みます。
実行時の問題の確認
単精度変換の問題を検出および修正するには、[実行時の問題の確認] ステップを実行します。
[実行時の問題の確認] ページでは、入力の型を定義するために使用したテスト ファイル
ex_2ndOrder_filter_test
が、アプリによってテスト ファイルのフィールドに入力されます。[問題の確認] をクリックします。
アプリは
ex_2ndOrder_filter
から単精度の MEX 関数を生成します。ex_2ndOrder_filter
の呼び出しを生成された MEX 関数の呼び出しで置き換えたうえで、テスト ファイルex_2ndOrder_filter_test
が実行されます。アプリが問題を検出した場合には警告およびエラー メッセージが出力されます。メッセージをクリックするとウィンドウ内の問題のあるコードが強調表示され、ここでコードを編集できます。この例ではアプリは問題を検出しません。[次へ] をクリックして [コード生成] ページに移動します。
単精度の C コードの生成
[生成] ダイアログ ボックスで、[ビルド タイプ] を
[スタティック ライブラリ]
に設定します。[言語] を [C] に設定します。
その他の設定については、既定値を使用します。
コードを生成するには、[生成] をクリックします。
MATLAB Coder はプロジェクトをビルドし、C スタティック ライブラリとサポート ファイルを既定のサブフォルダー
codegen/lib/ex_2ndOrder_filter
に生成します。
生成された C コードの表示
ex_2ndOrder_filter.c
に対する生成コードが表示されます。
倍精度変数は C コード内に
float
型をもちます。インデックス
i
は整数です。
潜在的なデータ型の問題の表示
単精度コードを生成する場合、アプリを使用して潜在的なデータ型の問題をコード生成レポートで強調表示できます。アプリで倍精度演算を削除できない場合、演算を行う MATLAB 式がレポートで強調表示されます。
[レポートの表示] リンクをクリックして、コード生成レポートを開きます。
[コードの洞察] タブをクリックします。[潜在的なデータ型の問題] を展開します。倍精度演算がないということは、倍精度演算が残っていないことを示します。