Main Content

単精度 MATLAB コードの生成

この例では、単精度の MATLAB® コードを倍精度の MATLAB コードから生成する方法について示します。この例では、単精度の MATLAB コードを表示する場合または検証オプションを使用する場合に使用する単精度変換ワークフローを示します。オプションで、単精度 C/C++ コードを生成することもできます。

前提条件

この例を実行するには、次の製品をインストールします。

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

  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.m

ex_2ndOrder_filter.m をテストする MATLAB スクリプト

単精度構成オブジェクトの設定

単精度構成オブジェクトを作成します。テスト ファイル名を指定します。テスト ファイルを使用して単精度コードを検証します。倍精度コードと単精度コードとの誤差をプロットします。その他のプロパティに既定値を使用します。

scfg = coder.config('single');
scfg.TestBenchName = 'ex_2ndOrder_filter_test';
scfg.TestNumerics = true;
scfg.LogIOForComparisonPlotting = true;

単精度 MATLAB コードの生成

倍精度の MATLAB 関数 ex_2ndOrder_filter単精度の MATLAB コードに変換するには、関数 codegen-double2single オプションと共に使用します。

codegen -double2single scfg ex_2ndOrder_filter

codegen は倍精度コードを解析します。関数 ex_2ndOrder_filter の入力型を指定しなかったため、変換プロセスではテスト ファイルの実行によって型が推定されます。変換プロセスは倍精度変数に単精度の型を選択します。インデックス変数に int32 を選択します。変換が完了すると、codegen で型推奨レポートが生成されます。

型推奨レポートの表示

変換プロセスによって変数に選択された型を確認するには、関数 ex_2ndOrder_filter の型推奨レポートを開きます。ex_2ndOrder_filter_report.html リンクをクリックします。

レポートが Web ブラウザーで開きます。変換プロセスによって次が変換されます。

  • 倍精度変数から single

  • インデックス i から int32。変換プロセスはインデックスと次元変数を int32 にキャストします。

生成された単精度の MATLAB コードの表示

単精度の MATLAB コード生成のレポートを表示するには、コマンド ウィンドウで次を行います。

  1. [単精度型のコードの生成] ステップにスクロールします。[レポートの表示] リンクをクリックします。

  2. [MATLAB ソース] ペインで、ex_2ndOrder_filter_single をクリックします。

コード生成レポートに、ex_2ndOrder_filter に対する単精度の MATLAB コードが表示されます。

潜在的なデータ型の問題の表示

単精度コードを生成する場合、codegen を使用して潜在的なデータ型の問題をコード生成レポートで強調表示できます。codegen で倍精度演算を削除できない場合、演算を行う MATLAB 式がレポートで強調表示されます。[コードの洞察] タブをクリックします。潜在的なデータ型の問題がないということは、倍精度演算が残っていないことを示します。

倍精度変数と単精度変数との比較

比較プロットのために入力と出力を記録することを選択したため、入力 x と出力 y の比較プロットを確認できます。

オプションでの単精度の C コードの生成

単精度の C コードも生成する場合は、C コード生成用にコード構成オブジェクトを作成します。関数 codegen-config オプションを指定してこの構成オブジェクトを使用します。以下に例を示します。

  1. C のスタティック ライブラリの生成用にコード構成オブジェクトを作成します。

    cfg = coder.config('lib');
    

  2. C コードを生成します。コード生成レポートの生成を有効にします。

    codegen -double2single scfg -config cfg ex_2ndOrder_filter -report
  3. C コード生成についてのコード生成レポートを表示するには、[レポートの表示] リンクをクリックします。

    [生成されるコード] ペインで、ex_2ndOrder_filter.c をクリックします。

    • 倍精度変数は C コード内に float 型をもちます。

    • インデックス i は整数です。

    単精度コードを生成する場合、codegen を使用して潜在的なデータ型の問題をコード生成レポートで強調表示できます。codegen で倍精度演算を削除できない場合、演算を行う MATLAB 式がレポートで強調表示されます。

    [コードの洞察] タブをクリックします。次に、[潜在的なデータ型の問題] を展開します。倍精度演算がないということは、倍精度演算が残っていないことを示します。

参考

| |

関連する例

詳細