Main Content

MATLAB Coder アプリを使用した単精度の C コードの生成

この例では、MATLAB® Coder™ アプリを使用して倍精度の MATLAB コードから単精度の 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.')

MATLAB Coder アプリを開く

  1. この例で使用するファイルを含む作業フォルダーに移動します。

  2. MATLAB ツールストリップの [アプリ] タブの [コード生成] の下で、アプリ アイコンをクリックします。

ソース ファイルの選択

プロジェクトにエントリポイント関数 ex_2ndOrder_filter を追加するために、ファイル ex_2ndOrder_filter.m を探して [開く] をクリックします。既定では、アプリはこのプロジェクトの情報および設定を現在のフォルダーの ex_2ndOrder_filter.prj というファイルに保存します。

単精度変換の有効化

  1. [数値変換][単精度に変換] に設定します。

  2. [次へ] をクリックして [入力の型を定義] ステップに進みます。

    ex_2ndOrder_filter.m のコード違反およびコード生成の準備状態の問題が検査されます。ex_2ndOrder_filter.m には問題は検出されません。

入力の型の定義

  1. [入力の型を定義] ページで、ex_2ndOrder_filter_test をテスト ファイルとして追加するために ex_2ndOrder_filter_test を参照します。[開く] をクリックします。

  2. [入力の型の自動定義] をクリックします。

    テスト ファイルが実行され、各入力信号のフィルターの出力が表示されます。アプリは x の入力の型が double(1x256) であると判断します。

  3. [次へ] をクリックして [実行時の問題の確認] ステップに進みます。

実行時の問題の確認

単精度変換の問題を検出および修正するには、[実行時の問題の確認] ステップを実行します。

  1. [実行時の問題の確認] ページでは、入力の型を定義するために使用したテスト ファイル ex_2ndOrder_filter_test が、アプリによってテスト ファイルのフィールドに入力されます。

  2. [問題の確認] をクリックします。

    アプリは ex_2ndOrder_filter から単精度の MEX 関数を生成します。ex_2ndOrder_filter の呼び出しを生成された MEX 関数の呼び出しで置き換えたうえで、テスト ファイル ex_2ndOrder_filter_test が実行されます。アプリが問題を検出した場合には警告およびエラー メッセージが出力されます。メッセージをクリックするとウィンドウ内の問題のあるコードが強調表示され、ここでコードを編集できます。この例ではアプリは問題を検出しません。

  3. [次へ] をクリックして [コード生成] ページに移動します。

単精度の C コードの生成

  1. [生成] ダイアログ ボックスで、[ビルド タイプ][スタティック ライブラリ] に設定します。

  2. [言語][C] に設定します。

  3. その他の設定については、既定値を使用します。

  4. コードを生成するには、[生成] をクリックします。

    MATLAB Coder はプロジェクトをビルドし、C スタティック ライブラリとサポート ファイルを既定のサブフォルダー codegen/lib/ex_2ndOrder_filter に生成します。

生成された C コードの表示

ex_2ndOrder_filter.c に対する生成コードが表示されます。

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

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

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

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

[レポートの表示] リンクをクリックして、コード生成レポートを開きます。

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

関連する例

詳細