派生した範囲に基づく固定小数点データ型の推奨
この例では、関数 codegen
を使用して静的範囲に基づいて固定小数点データ型を推奨する方法を示します。派生範囲に基づいてデータ型を推奨すると、動作範囲全体にわたってアルゴリズムを実行するテスト ファイルを提供する必要がないというメリットがあります。このようなテスト ファイルは実行に非常に長い時間がかかることが多いため、代わりに派生範囲を使用すると時間を節約できます。
メモ
派生範囲の解析は非スカラー変数ではサポートされていません。
必要条件
この例を実行するには、次の製品をインストールしなければなりません。
MATLAB®
MATLAB Coder™
Fixed-Point Designer™
C コンパイラ
サポートされるコンパイラを参照してください。
mex -setup
を使用して既定のコンパイラを変更できます。既定のコンパイラの変更を参照してください。
新規フォルダーの作成と関連ファイルのコピー
ローカル作業フォルダーを作成します。たとえば、
c:\dti
のようにします。docroot\toolbox\fixpoint\examples
フォルダーに変更します。MATLAB コマンド ラインで次のように入力します。cd(fullfile(docroot, 'toolbox', 'fixpoint', 'examples'))
dti.m
およびdti_test.m
ファイルをローカル作業フォルダーにコピーします。種類 名前 説明 関数のコード dti.m
MATLAB のエントリポイント関数 テスト ファイル dti_test.m
MATLAB スクリプト。次をテストします。 dti.m
固定小数点の構成オブジェクトのセットアップ
固定小数点の構成オブジェクトを作成し、テスト ファイル名を設定します。
fixptcfg = coder.config('fixpt'); fixptcfg.TestBenchName = 'dti_test';
設計範囲の指定
関数 dti
の入力パラメーター u_in
の設計範囲情報を指定します。
fixptcfg.addDesignRangeSpecification('dti', 'u_in', -1.0, 1.0)
シミュレーション データ インスペクターによるプロット作成の有効化
生成された固定小数点の MATLAB コードを検証するために、テスト ファイルを実行することを選択します。比較プロット用に入力データと出力データを記録し、その結果をシミュレーション データ インスペクターでプロットすることを選択します。
fixptcfg.TestNumerics = true; fixptcfg.LogIOForComparisonPlotting = true; fixptcfg.PlotWithSimulationDataInspector = true;
C コード生成の構成オブジェクトのセットアップ
C のスタティック ライブラリを生成するためにコード構成オブジェクトを作成します。コード生成レポートを有効にします。
cfg = coder.config('lib');
cfg.GenerateReport = true;
範囲の導出と固定小数点コードの生成
関数 codegen
を使用して、浮動小数点の MATLAB 関数 dti
を固定小数点の C コードに変換します。固定小数点のデータ型の既定の語長を 16 に設定します。
fixptcfg.ComputeDerivedRanges = true; fixptcfg.ComputeSimulationRanges = false; fixptcfg.DefaultWordLength = 16; % Derive ranges and generate fixed-point code codegen -float2fixed fixptcfg -config cfg dti
codegen
によって浮動小数点のコードが解析されます。関数 dti
の入力型を指定しなかったため、変換プロセスではテスト ファイルのシミュレーションによって型が推定されます。次に変換プロセスによってアルゴリズム内の変数の範囲を派生します。これらの派生範囲を使用して変数の固定小数点型が推奨されます。変換が完了すると、型推奨レポートが生成されます。
派生範囲情報の表示
関数 dti
の型推奨レポート dti_report.html
へのリンクをクリックします。
レポートが Web ブラウザーで開きます。
生成された固定小数点の MATLAB コードの表示
codegen
によって関数 dti
の固定小数点バージョン dti_fxpt.m
および dti_fxpt
を呼び出すラッパー関数が生成されます。これらのファイルはローカルの作業フォルダーの codegen\dti\fixpt
フォルダーに生成されます。
function [y, clip_status] = dti_fixpt(u_in) %#codegen % Discrete Time Integrator in MATLAB % % Forward Euler method, also known as Forward Rectangular, or left-hand % approximation. The resulting expression for the output of the block at % step 'n' is y(n) = y(n-1) + K * u(n-1) % fm = get_fimath(); init_val = fi(1, 0, 1, 0, fm); gain_val = fi(1, 0, 1, 0, fm); limit_upper = fi(500, 0, 9, 0, fm); limit_lower = fi(-500, 1, 10, 0, fm); % variable to hold state between consecutive calls to this block persistent u_state; if isempty(u_state) u_state = fi(init_val+fi(1, 0, 1, 0, fm), 1, 16, 6, fm); end % Compute Output if (u_state > limit_upper) y = fi(limit_upper, 1, 16, 6, fm); clip_status = fi(-2, 1, 16, 13, fm); elseif (u_state >= limit_upper) y = fi(limit_upper, 1, 16, 6, fm); clip_status = fi(-1, 1, 16, 13, fm); elseif (u_state < limit_lower) y = fi(limit_lower, 1, 16, 6, fm); clip_status = fi(2, 1, 16, 13, fm); elseif (u_state <= limit_lower) y = fi(limit_lower, 1, 16, 6, fm); clip_status = fi(1, 1, 16, 13, fm); else y = fi(u_state, 1, 16, 6, fm); clip_status = fi(0, 1, 16, 13, fm); end % Update State tprod = fi(gain_val * u_in, 1, 16, 14, fm); u_state(:) = y + tprod; end function fm = get_fimath() fm = fimath('RoundingMethod', 'Floor', 'OverflowAction', 'Wrap', 'ProductMode', 'FullPrecision', 'MaxProductWordLength', 128, 'SumMode', 'FullPrecision', 'MaxSumWordLength', 128); end
浮動小数点の実行と固定小数点の実行の比較
比較プロット用の入力と出力の記録と、プロットにシミュレーション データ インスペクターを使用することを選択したため、シミュレーション データ インスペクターが開きます。
シミュレーション データ インスペクターを使用して、浮動小数点と固定小数点の実行情報の表示や結果の比較を行うことができます。たとえば [比較] タブで出力 y
の浮動小数点の値と固定小数点の値を比較するには、[y
] を選択して [実行の比較] をクリックします。
シミュレーション データ インスペクターは、ベースラインの浮動小数点の実行と固定小数点の実行のプロットおよびそれらの差を表示します。
生成された固定小数点の C コードの表示
C コード生成についてのコード生成レポートを表示するには、型推奨レポートを表示する [レポートの表示] リンクをクリックします。
コード生成レポートが開き、dti_fixpt.c
に対する生成コードが表示されます。