このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
この例では,最小/最大ログ作成のMATLAB®コードをインストルメント化し,データ型を推奨するツールを使用することによって,固定小数点データ型を設定する方法を説明します。
使用する関数は以下のとおりです。
buildInstrumentedMex
——計測機能が有効な墨西哥人関数をビルドする
showInstrumentationResults
——計測結果を表示する
clearInstrumentationResults
——計測結果をクリアする
この例で固定小数点に変換する関数は,2次直接型2転置フィルターです。実際の作業では,このサンプル関数を独自の関数で置き換えて以下の手順を実行できます。
函数[y, z] = fi_2nd_order_df2t_filter (b, a, x, y, z)为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);结束结束
MATLAB®関数をインストルメント化するには,関数がコード生成に適していなければなりません。コード生成の詳細については,buildInstrumentedMex
のリファレンスページを参照してください。buildInstrumentedMex
の使用にはMATLAB®编码器™ライセンスは必要ありません。
この関数では,変数y
およびz
は入力と出力の両方として使用されます。これは以下の理由から重要なパターンです。
関数の外でy
およびz
のデータ型を設定できるので,固定小数点と浮動小数点型の両方で関数を再利用できます。
生成されたCコードは,関数の引数リスト内の参照としてy
およびz
を作成します。このパターンの詳細については,ドキュメンテーションの”MATLAB®からのコード生成”、“ユーザーガイド”、“生成效率和可重用的代码”,“生成高效的代码”,“消除冗余拷贝函数输入”を参照してください。
この例により実際の作業が妨げられないようにするため,以下のコードを実行してテスト関数を一時ディレクトリにコピーしてください。
tempdirObj = fidemo.fiTempdir (“fi_instrumentation_fixed_point_filter_demo”);
拷贝文件(fullfile (matlabroot,“工具箱”,“定点”,“fidemos”,' + fidemo ',...“fi_2nd_order_df2t_filter.m”),“。”,“f”);
以下のコードを実行して現在の状態を取得し,グローバル状態をリセットします。
FIPREF_STATE = (fipref);重置(fipref)
この例では,設計の要件によって入力x
のデータ型が決まります。これらの要件は符号付き16ビットの非整数です。
N = 256;x = fi (0 (N, 1), 1, 16日15);
また,設計の要件によって,40ビットのアキュムレータをもつDSPターゲットの固定小数点演算も決まります。この例では,負方向の丸めとオーバーフローのラップを使用して,効率的なコードを生成します。
F = fimath (“RoundingMethod”,“地板”,...“OverflowAction”,“包装”,...“ProductMode”,“KeepLSB”,...“ProductWordLength”现年40岁的...“SumMode”,“KeepLSB”,...“SumWordLength”, 40);
以下の係数は,次によって作成された2次ローパスフィルターに対応します。
(num窝]=黄油(0.125 2,)
係数の値は,フィルターの出力および状態に割り当てられる値の範囲に影響します。
Num = [0.0299545822080925 0.0599091644161849 0.0299545822080925];Den = [1 -1.4542435862515900 0.5740619150839550];
設計の要件によって決まる係数のデータ型は,16ビットの語長として指定され,最高精度にスケーリングされます。定数係数からfi
オブジェクトを作成するためのパターンは以下のとおりです。
1.既定の最も近い正の整数方向への丸めと飽和オーバーフロー設定を使用して,係数をfi
オブジェクトにキャストします。これにより,係数の精度が高くなります。
2.fimath
に負方向の丸めとオーバーフローのラップ設定を付加して演算を制御します。これにより,より効率的なCコードが生成されます。
b = fi (num 1 16);b.fimath = F;一个= fi(窝,1 16);a.fimath = F;
フィルター係数をbuildInstrumentedMex
コマンドに定数として渡すことで,フィルター係数をこのフィルターの実装にハードコードします。
B = coder.Constant (B);= coder.Constant ();
係数の値および入力の値によって,出的力y
および状態ベクトルz
のデータ型が決まります。値の最大範囲を保持して潜在的なオーバーフローを特定しデータ型を推奨できるように,スケーリングされた双データ型の値を作成します。
yisd = fi (0 (N, 1), 1, 16日15日“数据类型”,“ScaledDouble”,“fimath”F);zisd = fi(0(2, 1), 1, 16日15日“数据类型”,“ScaledDouble”,“fimath”F);
MATLAB®コードをインストルメント化するには,buildInstrumentedMex
コマンドを使用してMATLAB®関数から墨西哥人関数を作成します。buildInstrumentedMex
への入力はfiaccel
への入力と同じですが,buildInstrumentedMex
にはfi
オブジェクトの制限がありません。buildInstrumentedMex
の出力は,計測機能を挿入された墨西哥人関数です。この墨西哥人関数を実行すると,すべての名前付き変数および中間値について,シミュレーションされた最小値と最大値が記録されます。
“o”
オプションを使用して,生成される墨西哥人関数に名前を付けます。“o”
オプションを使用しない場合は,元のMATLAB®関数の名前の最後に“_mex”
を付けた名前が墨西哥人関数に付けられます。墨西哥人関数にMATLAB®関数と同じ名前を付けることもできますが,墨西哥人関数の方がMATLAB®関数より優先されるため,同じ名前の墨西哥人関数が再生成されるか削除されてクリアされるまではMATLAB®関数に対する変更が実行されない点に注意する必要があります。
buildInstrumentedMexfi_2nd_order_df2t_filter...- ofilter_scaled_double...arg游戏{B, A, x, yisd zisd}
このシステムのテストベンチは,チャープ信号およびステップ信号を実行するように設定されています。一般に,システムのテストベンチは,広範囲な入力信号をカバーします。
最初のテストベンチではチャープ入力を使用します。チャープ信号は広範囲な周波数をカバーするため,優れた代表的な入力となっています。
t = linspace (0, 1, N);从0到1秒的时间向量f1 = N / 2;%啁啾目标频率设置为奈奎斯特xchirp =罪(π* f1 * t ^ 2);%线性啁啾从0到Fs/ 2hz在1秒x (:) = xchirp;将啁啾投射到定点
シミュレーション実行の最小値と最大値を記録するには,インストルメント化した墨西哥人関数を実行しなければなりません。その後の実行で計測結果が集積されていき,その集積はclearInstrumentationResults
によって計測結果がクリアされるまで続きます。
分子と分母の係数が定数としてコンパイルされているため,生成された墨西哥人関数への入力として指定されないという点に注意してください。
ychirp = filter_scaled_double (x, yisd zisd);
フィルター処理されたチャープ信号のプロットは,フィルターのローパス動作をこれらの特定の係数と共に表示します。低周波数は通過し,高周波数は減衰されます。
clf情节(t x,“c”t ychirp“bo - - - - - -”)标题(“唧唧喳喳”)传说(“输入”,“Scaled-double输出”)图(gcf);drawnow;
showInstrumentationResults
コマンドは,計測された値を示すコード生成レポートを表示します。showInstrumentationResults
への入力は,結果表示の対象にするインストルメント化された墨西哥人関数の名前です。
以下に,showInstrumentationResults
コマンドのオプションのリストを示します。
-defaultDT T
:双に推奨される既定のデータ型。ここで,T
はnumerictype
オブジェクトまたは字符串{remainFloat, double, single, int8, int16, int32, int64, uint8, uint16, uint32, uint64}
のいずれかとなります。既定の設定はremainFloat
です。
-nocode
印刷可能なレポートにMATLABコードを表示しません。変数テーブルのログのみを表示します。このオプションは,打印オプションと組み合わせた場合にのみ有効になります。
-optimizeWholeNumbers
シミュレーションの最小/最大値のログに常に0または正の整数であることが示されている変数の語長を最適化します。
-percentSafetyMargin N
シミュレーションの最小/最大値に対する安全余裕。ここで,N
は割合を示します。
可打印的
印刷可能なレポートを作成し,システムブラウザーで開きます。
-proposeFL
指定された語長について小数部の長さを推奨します。
-proposeWL
指定された小数部の長さについて語長を推奨します。
オーバーフローの可能性は,スケーリングされた双データ型をもつfi
オブジェクトにのみ表示されます。
この特定の設計は語長が固定のDSP用なので,proposeFL
フラグを使用して,小数部の長さを推奨します。
showInstrumentationResultsfilter_scaled_double-proposeFL
インストルメント化されたコード生成レポート内の式または変数にカーソルを合わせると,シミュレーションの最小値と最大値が表示されます。この設計では,入力の範囲は1 ~ + 1であり,すべての変数の値や中間結果の範囲も1 ~ + 1になります。つまり,データ型がすべて非整数(小数部の長さは語長より1ビット短い)になる可能性を示します。ただし,この関数に対して他の種類の入力を使用した場合は,常にそうなるとは限りません。最終的な固定小数点データ型を設定する前に,多くの種類の入力をテストすることが重要です。
次のテストベンチはステップ入力で実行されます。ステップ入力はシステムの動作を特徴付けるために使用されることがあるので,優れた代表的な入力となっています。
xstep = [(N / 2,1);的(N / 2,1)];x (:) = xstep;
計測結果は集積され,その集積はclearInstrumentationResults
によって計測結果がクリアされるまで続きます。
ystep = filter_scaled_double (x, yisd zisd);clf情节(t x,“c”t ystep“bo - - - - - -”)标题(“步骤”)传说(“输入”,“Scaled-double输出”)图(gcf);drawnow;
インストルメント化されたコード生成レポートで現在の範囲の100%の位置にあるx
が示すように,ステップの入力とチャープ入力が両方とも最大範囲である場合,ステップ入力ではオーバーフローが発生しますが,チャープ入力では発生しません。これは,テストベンチには多数のさまざまな入力をもつ必要があることを意味します。この例の目的上,入力は2つだけ使用しましたが,実際のテストベンチではさらに多くの入力を使用します。
showInstrumentationResultsfilter_scaled_double-proposeFL
オーバーフローを避けるには,インストルメント化されたコード生成レポートに示されているy
およびz
の推奨された小数部の長さである14ビットに基づいて,推奨された固定小数点プロパティを設定します。
ワークフローのこの時点では,実際の固定小数点型(前述のデータ型を決定する手順で使用したスケーリングされた双型とは異なる)を使用します。
易= fi (0 (N, 1), 1, 16日14日“fimath”F);子= fi(0(2, 1), 1, 16日14日“fimath”F);
固定小数点入力とbuildInstrumentedMex
コマンドを使って,インストルメント化した固定小数点墨西哥人関数を作成します。
buildInstrumentedMexfi_2nd_order_df2t_filter...- ofilter_fixed_point...arg游戏{B, A, x,咦,子}
固定小数点に変換したら,固定小数点の入力を使用してテストベンチを再実行し,設計を検証します。
チャープ入力を使用して固定小数点アルゴリズムを実行し,設計を検証します。
x (:) = xchirp;[y, z] = filter_fixed_point (x,咦,zi);[ysd, zsd] = filter_scaled_double (x, yisd zisd);Err = double(y) - double(ysd);
固定小数点の出力とスケーリングされた双の出力を比較して,設計基準を満たしていることを確認します。
clf次要情节(211);情节(t, x,“c”t ysd“bo - - - - - -”、t、y,“mx”)包含(“时间(s)”);ylabel (“振幅”)传说(“输入”,“Scaled-double输出”,“定点输出”);标题(定点唧唧喳喳的)次要情节(212);情节(t,呃,“r”)、标题(“错误”),包含(“t”);ylabel (“呃”);图(gcf);drawnow;
変数と中間結果を調べて,最小値/最大値が範囲内であることを確認します。
showInstrumentationResultsfilter_fixed_point
ステップ入力を使用して固定小数点アルゴリズムを実行し,設計を検証します。
ステップ入力の実行の効果のみを確認できるように,以下のコードを実行して前の計測結果をクリアします。
clearInstrumentationResultsfilter_fixed_point
固定小数点フィルターを通過するステップ入力を実行し,スケーリングされた双フィルターの出力と比較します。
x (:) = xstep;[y, z] = filter_fixed_point (x,咦,zi);[ysd, zsd] = filter_scaled_double (x, yisd zisd);Err = double(y) - double(ysd);
スケーリングされた双の出力に対して固定小数点の出力をプロットし,設計基準を満たしていることを確認します。
clf次要情节(211);情节(t, x,“c”t ysd“bo - - - - - -”、t、y,“mx”)标题(“定点一步”);传奇(“输入”,“Scaled-double输出”,“定点输出”)次要情节(212);情节(t,呃,“r”)、标题(“错误”),包含(“t”);ylabel (“呃”);图(gcf);drawnow;
変数と中間結果を調べて,最小値/最大値が範囲内であることを確認します。
showInstrumentationResultsfilter_fixed_point
以下のコードを実行してグローバル状態を復元します。
fipref (FIPREF_STATE);clearInstrumentationResultsfilter_fixed_pointclearInstrumentationResultsfilter_scaled_double清晰的fi_2nd_order_df2t_filter_fixed_instrumented清晰的fi_2nd_order_df2t_filter_float_instrumented
以下のコードを実行して一時ディレクトリを削除します。
tempdirObj.cleanUp;% #好< * ASGLU >