Main Content

カスタム関数からルックアップ テーブルへの置き換え

HDL Coder™ を使用して、固定小数点型をサポートしない関数に対して近似のルックアップ テーブルを生成し、独自の関数を置き換えることができます。カスタム関数をルックアップ テーブルに置き換えるには、HDL Coder アプリまたは関数 fiaccel codegen を使用します。

HDL Coder アプリの使用

この例では、HDL Coder アプリを使用して、カスタム関数をルックアップ テーブルに置き換える方法を説明します。

アルゴリズムとテスト ファイルの作成

ローカルの書き込み可能フォルダーで、次の手順に従います。

  1. MATLAB® 関数 custom_fcn を作成します。これが置き換える元の関数です。

    function y = custom_fcn(x)
      y = 1./(1+exp(-x));
    end
  2. custom_fcn を呼び出すラッパー関数を作成します。

    function y = call_custom_fcn(x)
      y = custom_fcn(x);
    end
  3. テスト ファイル custom_test を作成します。このファイルでは call_custom_fcn を使用します。

    close all
    
    x = linspace(-10,10,1e3);
    for itr = 1e3:-1:1
       y(itr) = call_custom_fcn( x(itr) );
    end
    plot( x, y );
    

HDL Coder プロジェクトを作成して設定します。

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

  2. HDL Coder アプリを開くには、MATLAB コマンド プロンプトで、「hdlcoder」と入力します。[名前]custom_project.prj に設定し、[OK] をクリックします。プロジェクトが MATLAB ワークスペースで開きます。

  3. プロジェクト ウィンドウの [MATLAB 関数] タブで、[MATLAB 関数の追加] リンクをクリックします。call_custom_fcn.m ファイルを選択し、[OK] をクリックしてプロジェクトに追加します。

入力タイプの定義

  1. call_custom_fcn.m の入力タイプを定義するには、[MATLAB 関数] タブで [型の自動定義] をクリックします。

  2. テスト ファイルとして custom_test を追加し、[実行] をクリックします。

    このテスト ファイルから HDL Coderx を double のスカラーに決定します。

  3. [これらの型を使用] をクリックします。

custom_fcn のルックアップ テーブルへの置き換え

  1. HDL ワークフロー アドバイザーを開くには、[ワークフロー アドバイザー] をクリックし、[ワークフロー アドバイザー] ウィンドウで [固定小数点の変換] をクリックします。

  2. custom_fcn をルックアップ テーブルで置き換えるには、[関数の置換] タブで「custom_fcn」と入力し、[ルックアップ テーブル] を選択して [+] をクリックします。

    既定では、ルックアップ テーブルは線形内挿で得られる 1000 点をもち、アプリで設計の最小値と最大値としてシミュレーションの実行または派生範囲の計算から求めた値が使用されます。

  3. [シミュレーションの実行] で、[ヒストグラム データを記録] を選択し、[シミュレーションの実行] をクリックします。custom_test ファイルがテスト ファイルとして選択されていることを確認します。

    シミュレーションが実行され、[変数] タブにシミュレーションの最小値と最大値の範囲が表示されます。HDL Coder は MATLAB エディターでシミュレーションの結果をプロットします。

固定小数点型の検証

  1. [推奨された型] 列で、ソフトウェアにより推奨された固定小数点型がシミュレーション範囲全体をカバーしているか確認します。ある変数の記録済みのヒストグラム データを表示するには、変数の [推奨された型] フィールドをクリックします。

    ヒストグラムに、範囲の情報と、シミュレーションの範囲のうち推奨されたデータ型がカバーする割合 (%) が示されます。

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

    推奨された型が検証され、call_custom_fcn_fixpt という固定小数点コードが生成されます。

  3. 生成された固定小数点コードを表示するには、call_custom_fcn_fixpt リンクをクリックします。

    生成された固定小数点の関数 call_custom_fcn_fixpt.m は、custom_fcn の代わりにこの近似を呼び出します。

    function y = call_custom_fcn_fixpt(x)
      fm = get_fimath();
    
      y = fi(replacement_custom_fcn(x), 0, 14, 14, fm);
    end
    
    function fm = get_fimath()
    	fm = fimath('RoundingMethod', 'Floor',...
    	     'OverflowAction', 'Wrap',...
    	     'ProductMode','FullPrecision',...
    	     'MaxProductWordLength', 128,...
    	     'SumMode','FullPrecision',...
    	     'MaxSumWordLength', 128);
    end

コマンド ラインから

前提条件

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

MATLAB 関数 custom_fcn.m を作成します。これが、置き換える元の関数です。

function y = custom_fcn(x)
  y = 1./(1+exp(-x));
end

custom_fcn.m を呼び出すラッパー関数を作成します。

function y = call_custom_fcn(x)
  y = custom_fcn(x);
end

call_custom_fcn.m を使用するテスト ファイル custom_test.m を作成します。

close all

x = linspace(-10,10,1e3);
for itr = 1e3:-1:1
   y(itr) = call_custom_fcn( x(itr) );
end
plot( x, y );

custom_fcn を近似する、関数置き換えの構成オブジェクトを作成します。カスタム関数の関数ハンドルを指定し、ルックアップ テーブルで使用する点の数を 50 に設定します。

q = coder.approximation('Function','custom_fcn','CandidateFunction',@custom_fcn, 'NumberOfPoints',50);

fixptcfg という coder.FixptConfig オブジェクト を作成します。テスト ファイル名を指定して、数値のテストを有効にします。関数置き換えの構成オブジェクトと固定小数点の構成オブジェクトを関連付けます。

fixptcfg = coder.config('fixpt');
fixptcfg.TestBenchName = 'custom_test';
fixptcfg.TestNumerics = true;
fixptcfg.addApproximation(q);

固定小数点の MATLAB コードを生成します。

codegen -float2fixed fixptcfg call_custom_fcn

codegencall_custom_fcn_fixpt.m に固定小数点の MATLAB コードを生成します。

生成された固定小数点コードを表示するには、call_custom_fcn_fixpt リンクをクリックします。

生成されたコードには、関数 custom_fcn の代わりに replacement_custom_fcn というルックアップ テーブルの近似が含まれています。固定小数点の変換プロセスで関数の値域が推定され、内挿されたルックアップ テーブルを使用してその関数が置き換えられます。ルックアップ テーブルの点の数は、指定したとおりの 50 です。既定では、ルックアップ テーブルは線形内挿を使用し、その最小値と最大値はテスト ファイルを実行して求められます。

生成された固定小数点の関数 call_custom_fcn_fixpt は、custom_fcn の代わりにこの近似を呼び出します。

function y = call_custom_fcn_fixpt(x)
  fm = get_fimath();

  y = fi(replacement_custom_fcn(x), 0, 14, 14, fm);
end

これで、生成された固定小数点コードをテストして、結果を元のMATLAB 関数と比較することができます。生成された固定小数点コードの動作が元のコードの動作を十分に近似していない場合は、ルックアップ テーブルで使用する内挿法または点の数を変更してから、コードを生成し直してください。

参考

関連する例

詳細