最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

派生範囲に基づくデータ型の推奨

この例では、関数 fiaccel を使用して静的範囲に基づいて固定小数点データ型を推奨する方法を示します。派生範囲に基づいてデータ型を推奨すると、動作範囲全体にわたってアルゴリズムを実行するテスト ファイルを提供する必要がないというメリットがあります。このようなテスト ファイルは実行に非常に長い時間がかかることが多いため、代わりに派生範囲を使用すると時間を節約できます。

メモ

派生範囲の解析は非スカラー変数ではサポートされていません。

必要条件

この例を実行するには、次の製品をインストールしなければなりません。

新規フォルダーの作成と関連ファイルのコピー

  1. ローカル作業フォルダーを作成します。たとえば、c:\dti のようにします。

  2. docroot\toolbox\fixpoint\examples フォルダーに変更します。MATLAB コマンド ラインで次のように入力します。

    cd(fullfile(docroot, 'toolbox', 'fixpoint', 'examples')) 

  3. dti.m および dti_test.m ファイルをローカル作業フォルダーにコピーします。

    入力の読み込みや、入力値の設定、テストする関数の呼び出し、テスト結果の出力など、すべての前処理と後処理を実行するための独立したテスト スクリプトを作成することをお勧めします。

    タイプ名前説明
    関数のコードdti.mMATLAB のエントリポイント関数
    テスト ファイルdti_test.mMATLAB スクリプト。次をテストします。 dti.m

 関数 dti

 関数 dti_test

固定小数点の構成オブジェクトのセットアップ

固定小数点の構成オブジェクトを作成し、テスト ファイル名を設定します。

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;

範囲の派生と固定小数点コードの生成

関数 fiaccel を使用して、浮動小数点の MATLAB 関数 dti固定小数点の MATLAB コードに変換します。固定小数点のデータ型の既定の語長を 16 に設定します。

fixptcfg.ComputeDerivedRanges = true;
fixptcfg.ComputeSimulationRanges = false;
fixptcfg.DefaultWordLength = 16;

% Derive ranges  and generate fixed-point code
fiaccel -float2fixed fixptcfg dti

fiaccel によって浮動小数点のコードが解析されます。関数 dti の入力型を指定しなかったため、変換プロセスではテスト ファイルのシミュレーションによって型が推定されます。次に変換プロセスによってアルゴリズム内の変数の範囲を派生します。これらの派生範囲を使用して変数の固定小数点型が推奨されます。変換が完了すると、型推奨レポートが生成されます。

派生範囲情報の表示

関数 dti の型推奨レポート dti_report.html へのリンクをクリックします。

レポートが Web ブラウザーで開きます。

生成された固定小数点の MATLAB コードの表示

fiaccel によって関数 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] を選択して [実行の比較] をクリックします。

シミュレーション データ インスペクターは、ベースラインの浮動小数点の実行と固定小数点の実行のプロットおよびそれらの差を表示します。