Main Content

シミュレーション範囲に基づく固定小数点データ型の推奨

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

必要条件

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

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

  1. ローカルの書き込み可能なフォルダーに、関数 ex_2ndOrder_filter.m を作成します。

    function y = ex_2ndOrder_filter(x) %#codegen
      persistent z
      if isempty(z)
          z = zeros(2,1);
      end
      % [b,a] = butter(2, 0.25)
      b = [0.0976310729378175,  0.195262145875635,  0.0976310729378175];
      a = [1, -0.942809041582063,  0.3333333333333333];
    
     
      y = zeros(size(x));
      for 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);
      end
    end
    
  2. テスト ファイル ex_2ndOrder_filter_test.m を作成して ex_2ndOrder_filter アルゴリズムの演習を行います。

    意図したシステムの動作範囲全体をカバーするため、このテスト スクリプトは関数 ex_2ndOrder_filter を 3 つの入力信号、チャープ、ステップ、インパルスを使用して実行します。次に、スクリプトは出力をプロットします。

    % ex_2ndOrder_filter_test
    %
    % Define representative inputs
    N = 256;                   % Number of points
    t = linspace(0,1,N);       % Time vector from 0 to 1 second
    f1 = N/2;                  % Target frequency of chirp set to Nyquist
    x_chirp = sin(pi*f1*t.^2); % Linear chirp from 0 to Fs/2 Hz in 1 second
    x_step = ones(1,N);        % Step
    x_impulse = zeros(1,N);    % Impulse
    x_impulse(1) = 1;
    
    % Run the function under test
    x = [x_chirp;x_step;x_impulse];
    y = zeros(size(x));
    for i = 1:size(x,1)
      y(i,:) = ex_2ndOrder_filter(x(i,:));
    end
    
    % Plot the results
    titles = {'Chirp','Step','Impulse'}
    clf
    for i = 1:size(x,1)
      subplot(size(x,1),1,i)
      plot(t,x(i,:),t,y(i,:))
      title(titles{i})
      legend('Input','Output')
    end
    xlabel('Time (s)')
    figure(gcf)
    
    disp('Test complete.')
種類名前説明
関数のコードex_2ndOrder_filter.mエントリポイントの MATLAB 関数
テスト ファイルex_2ndOrder_filter_test.mex_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 に対する生成コードが表示されます。

参考

|

関連するトピック