このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
シミュレーション範囲に基づく固定小数点データ型の推奨
この例では、関数 codegen
を使用してシミュレーション範囲データに基づいて固定小数点データ型を推奨する方法を示します。
必要条件
この例を実行するには、次の製品をインストールしなければなりません。
MATLAB®
MATLAB Coder™
Fixed-Point Designer™
C コンパイラ
サポートされるコンパイラを参照してください。
mex -setup
を使用して既定のコンパイラを変更できます。既定のコンパイラの変更を参照してください。
新規フォルダーの作成と関連ファイルのコピー
ローカルの作業フォルダー (例:
c:\ex_2ndOrder_filter
) を作成します。docroot\toolbox\fixpoint\examples
フォルダーに移動します。MATLAB コマンド ラインで以下のように入力します。cd(fullfile(docroot, 'toolbox', 'fixpoint', 'examples'))
ex_2ndOrder_filter.m
およびex_2ndOrder_filter_test.m
ファイルをローカル作業フォルダーにコピーします。種類 名前 説明 関数のコード 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
に対する生成コードが表示されます。