シミュレーション範囲に基づく固定小数点データ型の推奨
この例では、関数 codegen
を使用してシミュレーション範囲データに基づいて固定小数点データ型を推奨する方法を示します。
必要条件
この例を実行するには、次の製品をインストールしなければなりません。
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 | ex_2ndOrder_filter.m をテストする MATLAB スクリプト |
固定小数点の構成オブジェクトのセットアップ
固定小数点の構成オブジェクトを作成し、テスト ファイル名を設定します。
fixptcfg = coder.config('fixpt'); fixptcfg.TestBenchName = 'ex_2ndOrder_filter_test';
C コード生成の構成オブジェクトのセットアップ
C のスタティック ライブラリを生成するためにコード構成オブジェクトを作成します。コード生成レポートを有効にします。
cfg = coder.config('lib');
cfg.GenerateReport = true;
シミュレーション範囲の収集と固定小数点コードの生成
関数 codegen
を使用して、浮動小数点の MATLAB 関数 ex_2ndOrder_filter
を固定小数点の C コードに変換します。固定小数点のデータ型の既定の語長を 16 に設定します。
fixptcfg.ComputeSimulationRanges = true; fixptcfg.DefaultWordLength = 16; % Derive ranges and generate fixed-point code codegen -float2fixed fixptcfg -config cfg ex_2ndOrder_filter
codegen
によって浮動小数点のコードが解析されます。関数 ex_2ndOrder_filter
の入力型を指定しなかったため、変換プロセスではテスト ファイルのシミュレーションによって型が推定されます。次に変換プロセスによってアルゴリズム内の変数の範囲を派生します。これらの派生範囲を使用して変数の固定小数点型が推奨されます。変換が完了すると、型推奨レポートが生成されます。
範囲情報の表示
関数 ex_2ndOrder_filter
の型推奨レポート ex_2ndOrder_filter_report.html
へのリンクをクリックします。
レポートが Web ブラウザーで開きます。
生成された固定小数点の MATLAB コードの表示
codegen
によって関数 ex_2ndOrder_filter.m
の固定小数点バージョン ex_2ndOrder_filter_fixpt.m
および ex_2ndOrder_filter_fixpt
を呼び出すラッパー関数が生成されます。これらのファイルはローカルの作業フォルダーの codegen\ex_2ndOrder_filter\fixpt
フォルダーに生成されます。
function y = ex_2ndOrder_filter_fixpt(x) %#codegen fm = get_fimath(); persistent z if isempty(z) z = fi(zeros(2,1),1,16,15,fm); end % [b,a] = butter(2, 0.25) b = fi([0.0976310729378175,0.195262145875635,0.0976310729378175],... 0,16,18,fm); a = fi([1,-0.942809041582063,0.3333333333333333],1,16,14,fm); y = fi(zeros(size(x)),1,16,14,fm); for i=1:length(x) y(i) = b(1)*x(i) + z(1); z(1) = fi_signed(b(2)*x(i) + z(2)) - a(2) * y(i); z(2) = fi_signed(b(3)*x(i)) - a(3) * y(i); end end function y = fi_signed(a) coder.inline('always'); if isfi(a) && ~(issigned(a)) nt = numerictype(a); new_nt = numerictype(1,nt.WordLength + 1,... nt.FractionLength); y = fi(a,new_nt,fimath(a)); else y = a; end end function fm = get_fimath() fm = fimath('RoundingMethod','Floor',... 'OverflowAction','Wrap',... 'ProductMode','FullPrecision',... 'MaxProductWordLength',128,... 'SumMode','FullPrecision',... 'MaxSumWordLength',128); end
生成された固定小数点の C コードの表示
C コード生成についてのコード生成レポートを表示するには、型推奨レポートを表示する [レポートの表示] リンクをクリックします。
コード生成レポートが開き、ex_2ndOrder_filter_fixpt.c
に対する生成コードが表示されます。