ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

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

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

必要条件

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

  • MATLAB®

  • MATLAB Coder™

  • Fixed-Point Designer™

  • C コンパイラ

サポートされているコンパイラのリストは、「サポートされるコンパイラ」を参照してください。

C コードを生成する前に、C コンパイラを設定しなければなりません。「C コンパイラのセットアップ」を参照してください。

MathWorks® 製品のインストール方法の詳細は、MATLAB インストール ドキュメンテーションを参照してください。MATLAB がインストールされており、他にインストールされている MathWorks 製品を確認する場合は、MATLAB コマンド ウィンドウに ver と入力します。

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

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

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

    cd(fullfile(docroot, 'toolbox', 'coder', 'examples')) 
  3. fun_with_matlab.m および fun_with_matlab_test.m ファイルをローカル作業フォルダーにコピーします。

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

 関数 fun_with_matlab

 スクリプト fun_with_matlab_test

コード生成の準備状態をチェック

現在の作業フォルダーで、関数 fun_with_matlab.m を右クリックします。コンテキスト メニューから [コード生成の準備状態をチェック] を選択します。

コード生成の準備状態ツールでは、コード内にコード生成でサポートされない機能や関数がないかどうかを調べることができます。このツールは関数 fun_with_matlab.m がコード生成に適しているかどうかをレポートします。

エントリポイント関数がコード生成に適していない場合は、このツールはサポートされない機能と関数を含むソース ファイルのリストをレポートします。また、このレポートは、MATLAB コードをコード生成に適した状態にするために必要な作業量を示します。データ型の推奨の前に、これらの問題を解決しなければなりません。詳細は、「コード生成エラーの検出とデバッグ」を参照してください。

MATLAB Coder プロジェクトの作成と設定

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

  2. MATLAB の [アプリケーション] タブで [MATLAB Coder] を選択し、[MATLAB Coder プロジェクト] ダイアログ ボックスで [名前]fun_with_matlab_project.prj に設定します。

    または、MATLAB コマンド ラインに以下を入力します。

    coder -new fun_with_matlab_project.prj

    既定では、プロジェクトは MATLAB ワークスペースで開きます。

  3. プロジェクトの [概要] タブで、[ファイルの追加] リンクをクリックします。ファイル fun_with_matlab.m を選択し、[OK] をクリックしてファイルをプロジェクトに追加します。

入力タイプの定義

  1. プロジェクトの [概要] タブで、[タイプの自動定義] リンクをクリックします。

  2. [入力タイプの自動定義] ダイアログ ボックスで fun_with_matlab_test をテスト ファイルとして追加し、[実行] をクリックします。

    テスト ファイルが実行され、各入力信号のフィルターの出力が表示されます。

    MATLAB Coder はテスト ファイルから入力タイプを判断し、これらを表示します。

  3. [入力タイプの自動定義] ダイアログ ボックスで [次のタイプを使用] をクリックします。

    MATLAB Coderx のタイプを double(1x256) に設定します。

固定小数点の変換

  1. プロジェクトの [概要] タブの [固定小数点の変換] ペインで、[ビルド時に固定小数点に変換] を選択します。

    まず固定小数点データ型を定義しなければならないことがプロジェクトに示されます。

  2. [固定小数点の変換] ペインの [固定小数点型の定義と検証] をクリックします。

    [固定小数点の変換] ウィンドウが開き、エントリポイント MATLAB 関数用にインストルメント化された MEX 関数が生成されます。MEX 関数の生成後、コードに含まれる変数についてコンパイルされた情報 (データ型、サイズ、実数/複素数) が表示されます。詳細は、「変数情報の表示と変更」を参照してください。

    MEX 関数の生成が失敗した場合は、エラー メッセージのリンクが表示され、ビルドの問題の原因となったコードに移動できるようになります。固定小数点の変換に対応していない関数がコードに含まれている場合は、それらの関数が [関数の置き換え] タブに表示されます。詳細は、「シミュレーションの実行」を参照してください。

  3. [シミュレーションを実行] をクリックして、実行するテスト ファイルとして fun_with_matlab_test ファイルが選択されていることを確認します。テスト ファイルを追加して、シミュレーション中に複数のテスト ファイルを実行することも選択できます。複数のテスト ファイルを実行する場合、シミュレーションの結果は変換ツールによってマージされます。結果をクリアするには、[変数] タブを右クリックして [テーブル全体をリセット] を選択します。

  4. [シミュレーションを実行] をクリックして、[ヒストグラム データを記録] を選択します。

    既定では、[コード カバレッジを表示] オプションが選択されています。このオプションを指定すると、テスト ファイルが目的の動作範囲でアルゴリズムをテストしていることを確認する際に役立つコード カバレッジ情報が表示されます。

  5. [シミュレーションを実行] ボタンをクリックします。

    シミュレーションが実行され、MATLAB コードの左側に色分けされたコード カバレッジ バーが表示されます。この情報を確認して、テスト ファイルがアルゴリズムを適切にテストしていることを確認します。ここで、コードの左側にあるダーク グリーンのバーは、アルゴリズムを実行するたびにコードが実行されることを示します。オレンジのバーは、横にあるコードが 1 回のみ実行されることを示します。この例では、該当コードは永続変数を初期化するコードであるため、この動作は予想どおりです。テスト ファイルがコードの一部に対応していない場合は、テストを更新するか、テスト ファイルを追加してください。詳細は、「コード カバレッジ」を参照してください。

    値の横に ... が付いている場合、その値は丸められています。カーソルを ... の上に置くと、実際の値が表示されます。

    [変数] タブにシミュレーションの最小範囲と最大範囲が表示されます。ソフトウェアは、シミュレーション範囲のデータを使用し、既定の型推奨の設定に基づき固定小数点の型を変数ごとに推奨し、[推奨された型] 列に表示します。[型の検証] オプションが有効になります。

  6. 推奨された型を検証して、これらの型がシミュレーション範囲全体をカバーしていることを確認します。変数についてログが作成されたヒストグラム データを表示するには、その変数の [推奨された型] フィールドをクリックします。

    推奨されたデータ型を変更するには、必要な型を [推奨された型] フィールドに入力するか、ヒストグラムのコントロールを使用します。ヒストグラムの詳細は、「ヒストグラム」を参照してください。

  7. 推奨された型を使用してビルドを検証するには、[型の検証] をクリックします。

    推奨された型が検証されて、"検証が成功しました" というメッセージが表示され、[数値のテスト] オプションが有効になります。固定小数点データ型が検証されたことがプロジェクトに示されます。

    検証時にエラーまたは警告が発生した場合は、[型の検証の出力] タブに表示されます。詳細は、「型の検証」を参照してください。

  8. [数値のテスト] をクリックして [比較プロット用の入力と出力を記録] を選択し、[数値のテスト] ボタンをクリックします。

    入力型を定義するために使用したテスト ファイルが実行され、固定小数点 MATLAB コードがテストされます。オプションでテスト ファイルを追加し、数値のテスト用に複数のテスト ファイルを実行することを選択できます。浮動小数点と固定小数点の両方のシミュレーションが実行され、出力変数 y の誤差が計算されます。比較プロット用に入力と出力のログを作成するように選択しているため、スカラー出力ごとに追加的なプロットが 1 つ生成されます。

    最大誤差は 0.03% 未満です。この例では、この誤差が許容可能なため、固定小数点 C コードを生成できます。

    誤差が許容可能でない場合は、固定小数点データ型または元のアルゴリズムを変更します。詳細は、「数値のテスト」を参照してください。

  9. MATLAB Coder プロジェクトに戻ります。

固定小数点 C コードの生成

  1. MATLAB Coder プロジェクトで、[固定小数点の変換] ペインに [変換準備完了] が表示されていることを確認してから、[ビルド] タブを選択します。

  2. このタブで [出力タイプ][C/C++ スタティック ライブラリ] に設定します。

    既定の出力ファイル名は fun_with_matlab です。

  3. [ビルド] をクリックし、既定のプロジェクト設定を使用してライブラリを生成します。

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

  4. 生成されたコードを表示するには、[レポートの表示] をクリックします。

    コード生成レポートが開き、fun_with_matlab_fixpt.c に対する生成コードが表示されます。生成された C コードの変数には実数型が代入されておらず、固定小数点データ型が代入されています。

    この場合、生成されたコードは最適化されていません。つまり、MultiWordAdd などのさまざまなユーティリティ関数が含まれています。MATLAB Coder がこれらのユーティリティ関数を生成するのは、入力を加算または乗算した結果が 32 ビットを超える和または積になるためです。語長と fimath 設定を変更すると、生成されたコードを最適化できます。

固定小数点 C コードの最適化

  1. 固定小数点の変換ツールで、[詳細設定] をクリックして型推奨の詳細設定を表示します。

    fimath の [乗算器モード] および [加算器モード] の設定はいずれも [完全精度] に設定されています。FullPrecision モードでは、乗算の語長はオペランドの語長の和に等しくなります。

  2. fimath の [乗算器モード][加算器モード][精度を指定] に設定します。

    [精度を指定] を選択すると、[乗算器の語長][乗算器の小数部の長さ][加算器の語長][加算器の小数部の長さ] の各設定が有効になります。乗算器の語長と加算器の語長はいずれも 32 に設定されているため、生成されたコードでこれらの語長は 32 に制限されます。

  3. [型の検証] をクリックします。

    型推奨設定を変更したため、型を再度検証しなければなりません。

    推奨された型が検証され、"検証が成功しました" というメッセージが表示されます。

  4. [数値のテスト] ボタンをクリックします。

    最大誤差は依然として 0.03% 未満であるため、固定小数点 C コードを生成できます。

  5. コードを再生成して、fun_with_matlab_fixpt.c に対する生成 C コードを表示します。今回は、生成されたコードの語長が 32 ビットを超えていないため、生成されたコードにユーティリティ関数は含まれていません。

    void fun_with_matlab_fixpt(const short x[256], short y[256])
    {
      int i0;
      int i;
      int i1;
      short b_y;
      int i2;
      int i3;
    
      /*  [b,a] = butter(2, 0.25) */
      for (i0 = 0; i0 < 256; i0++) {
        y[i0] = 0;
      }
    
      for (i = 0; i < 256; i++) {
        i0 = 25593 * x[i];
        if (i0 >= 0) {
          i1 = (int)((unsigned int)i0 >> 2);
        } else {
          i1 = ~(int)((unsigned int)~i0 >> 2);
        }
    
        i0 = i1 + (z[0] << 15);
        if (i0 >= 0) {
          b_y = (short)((unsigned int)i0 >> 16);
        } else {
          b_y = (short)~(int)((unsigned int)~i0 >> 16);
        }
    
        i0 = 25593 * x[i];
        if (i0 >= 0) {
          i2 = (int)((unsigned int)i0 >> 1);
        } else {
          i2 = ~(int)((unsigned int)~i0 >> 1);
        }
    
        i0 = (i2 + (z[1] << 15)) - (-30894 * b_y << 1);
        if (i0 >= 0) {
          z[0] = (short)((unsigned int)i0 >> 15);
        } else {
          z[0] = (short)~(int)((unsigned int)~i0 >> 15);
        }
    
        i0 = 25593 * x[i];
        if (i0 >= 0) {
          i3 = (int)((unsigned int)i0 >> 2);
        } else {
          i3 = ~(int)((unsigned int)~i0 >> 2);
        }
    
        i0 = i3 - 21844 * b_y;
        if (i0 >= 0) {
          z[1] = (short)((unsigned int)i0 >> 15);
        } else {
          z[1] = (short)~(int)((unsigned int)~i0 >> 15);
        }
    
        y[i] = b_y;
      }
    }
この情報は役に立ちましたか?