Main Content

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

シミュレーション範囲に基づくデータ型の推奨

この例では、関数 fiaccel を使用してシミュレーション範囲データに基づいて固定小数点データ型を推奨する方法を示します。

必要条件

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

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

  1. ローカルの作業フォルダー (例: c:\ex_2ndOrder_filter) を作成します。

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

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

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

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

    タイプ名前説明
    関数のコードex_2ndOrder_filter.mMATLAB のエントリポイント関数
    テスト ファイルex_2ndOrder_filter_test.mex_2ndOrder_filter.m をテストする MATLAB スクリプト

 関数 ex_2ndOrder_filter

 ex_2ndOrder_filter_test スクリプト

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

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

cfg = coder.config('fixpt');
cfg.TestBenchName = 'ex_2ndOrder_filter_test';

シミュレーション範囲の収集と固定小数点コードの生成

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

cfg.ComputeSimulationRanges = true;
cfg.DefaultWordLength = 16;

% Derive ranges  and generate fixed-point code
fiaccel -float2fixed cfg ex_2ndOrder_filter

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

範囲情報の表示

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

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

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

fiaccel によって関数 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