このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
単精度 MATLAB コードの生成
この例では、単精度の MATLAB® コードを倍精度の MATLAB コードから生成する方法について示します。この例では、単精度の MATLAB コードを表示する場合または検証オプションを使用する場合に使用する単精度変換ワークフローを示します。オプションで、単精度 C/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.')
種類 | 名前 | 説明 |
---|---|---|
関数のコード | ex_2ndOrder_filter.m | エントリポイントの MATLAB 関数 |
テスト ファイル | ex_2ndOrder_filter_test.m |
|
単精度構成オブジェクトの設定
単精度構成オブジェクトを作成します。テスト ファイル名を指定します。テスト ファイルを使用して単精度コードを検証します。倍精度コードと単精度コードとの誤差をプロットします。その他のプロパティに既定値を使用します。
scfg = coder.config('single'); scfg.TestBenchName = 'ex_2ndOrder_filter_test'; scfg.TestNumerics = true; scfg.LogIOForComparisonPlotting = true;
単精度 MATLAB コードの生成
倍精度の MATLAB 関数 ex_2ndOrder_filter
を単精度の MATLAB コードに変換するには、関数 codegen
を -double2single
オプションと共に使用します。
codegen -double2single scfg ex_2ndOrder_filter
codegen
は倍精度コードを解析します。関数 ex_2ndOrder_filter
の入力型を指定しなかったため、変換プロセスではテスト ファイルの実行によって型が推定されます。変換プロセスは倍精度変数に単精度の型を選択します。インデックス変数に int32
を選択します。変換が完了すると、codegen
で型推奨レポートが生成されます。
型推奨レポートの表示
変換プロセスによって変数に選択された型を確認するには、関数 ex_2ndOrder_filter
の型推奨レポートを開きます。ex_2ndOrder_filter_report.html
リンクをクリックします。
レポートが Web ブラウザーで開きます。変換プロセスによって次が変換されます。
倍精度変数から
single
。インデックス
i
からint32
。変換プロセスはインデックスと次元変数をint32
にキャストします。
生成された単精度の MATLAB コードの表示
単精度の MATLAB コード生成のレポートを表示するには、コマンド ウィンドウで次を行います。
[
単精度型のコードの生成
] ステップにスクロールします。[レポートの表示] リンクをクリックします。[MATLAB ソース] ペインで、
ex_2ndOrder_filter_single
をクリックします。
コード生成レポートに、ex_2ndOrder_filter
に対する単精度の MATLAB コードが表示されます。
潜在的なデータ型の問題の表示
単精度コードを生成する場合、codegen
を使用して潜在的なデータ型の問題をコード生成レポートで強調表示できます。codegen
で倍精度演算を削除できない場合、演算を行う MATLAB 式がレポートで強調表示されます。[コードの洞察] タブをクリックします。潜在的なデータ型の問題がないということは、倍精度演算が残っていないことを示します。
倍精度変数と単精度変数との比較
比較プロットのために入力と出力を記録することを選択したため、入力 x
と出力 y
の比較プロットを確認できます。
オプションでの単精度の C コードの生成
単精度の C コードも生成する場合は、C コード生成用にコード構成オブジェクトを作成します。関数 codegen
の -config
オプションを指定してこの構成オブジェクトを使用します。以下に例を示します。
C のスタティック ライブラリの生成用にコード構成オブジェクトを作成します。
cfg = coder.config('lib');
C コードを生成します。コード生成レポートの生成を有効にします。
codegen -double2single scfg -config cfg ex_2ndOrder_filter -report
C コード生成についてのコード生成レポートを表示するには、[レポートの表示] リンクをクリックします。
[生成されるコード] ペインで、
ex_2ndOrder_filter.c
をクリックします。倍精度変数は C コード内に
float
型をもちます。インデックス
i
は整数です。
単精度コードを生成する場合、
codegen
を使用して潜在的なデータ型の問題をコード生成レポートで強調表示できます。codegen
で倍精度演算を削除できない場合、演算を行う MATLAB 式がレポートで強調表示されます。[コードの洞察] タブをクリックします。次に、[潜在的なデータ型の問題] を展開します。倍精度演算がないということは、倍精度演算が残っていないことを示します。
参考
coder.SingleConfig
| codegen
| coder.config