このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
カスタム関数からルックアップ テーブルへの置き換え
HDL Coder™ を使用して、固定小数点型をサポートしない関数に対して近似のルックアップ テーブルを生成し、独自の関数を置き換えることができます。カスタム関数をルックアップ テーブルに置き換えるには、HDL Coder アプリまたは関数 fiaccel
codegen
を使用します。
HDL Coder アプリの使用
この例では、HDL Coder アプリを使用して、カスタム関数をルックアップ テーブルに置き換える方法を説明します。
アルゴリズムとテスト ファイルの作成
ローカルの書き込み可能フォルダーで、次の手順に従います。
MATLAB® 関数
custom_fcn
を作成します。これが置き換える元の関数です。function y = custom_fcn(x) y = 1./(1+exp(-x)); end
custom_fcn
を呼び出すラッパー関数を作成します。function y = call_custom_fcn(x) y = custom_fcn(x); end
テスト ファイル
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 プロジェクトを作成して設定します。
この例で使用するファイルを含む作業フォルダーに移動します。
HDL Coder アプリを開くには、MATLAB コマンド プロンプトで、「
hdlcoder
」と入力します。[名前] をcustom_project.prj
に設定し、[OK] をクリックします。プロジェクトが MATLAB ワークスペースで開きます。プロジェクト ウィンドウの [MATLAB 関数] タブで、[MATLAB 関数の追加] リンクをクリックします。
call_custom_fcn.m
ファイルを選択し、[OK] をクリックしてプロジェクトに追加します。
入力タイプの定義
call_custom_fcn.m
の入力タイプを定義するには、[MATLAB 関数] タブで [型の自動定義] をクリックします。テスト ファイルとして
custom_test
を追加し、[実行] をクリックします。このテスト ファイルから HDL Coder は
x
を double のスカラーに決定します。[これらの型を使用] をクリックします。
custom_fcn のルックアップ テーブルへの置き換え
HDL ワークフロー アドバイザーを開くには、[ワークフロー アドバイザー] をクリックし、[ワークフロー アドバイザー] ウィンドウで [固定小数点の変換] をクリックします。
custom_fcn
をルックアップ テーブルで置き換えるには、[関数の置換] タブで「custom_fcn
」と入力し、[ルックアップ テーブル]
を選択して [+] をクリックします。既定では、ルックアップ テーブルは線形内挿で得られる 1000 点をもち、アプリで設計の最小値と最大値としてシミュレーションの実行または派生範囲の計算から求めた値が使用されます。
[シミュレーションの実行] で、
[ヒストグラム データを記録]
を選択し、[シミュレーションの実行] をクリックします。custom_test
ファイルがテスト ファイルとして選択されていることを確認します。シミュレーションが実行され、[変数] タブにシミュレーションの最小値と最大値の範囲が表示されます。HDL Coder は MATLAB エディターでシミュレーションの結果をプロットします。
固定小数点型の検証
[推奨された型] 列で、ソフトウェアにより推奨された固定小数点型がシミュレーション範囲全体をカバーしているか確認します。ある変数の記録済みのヒストグラム データを表示するには、変数の [推奨された型] フィールドをクリックします。
ヒストグラムに、範囲の情報と、シミュレーションの範囲のうち推奨されたデータ型がカバーする割合 (%) が示されます。
推奨された型を使用してビルドを検証するには、[型の検証] をクリックします。
推奨された型が検証され、
call_custom_fcn_fixpt
という固定小数点コードが生成されます。生成された固定小数点コードを表示するには、
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
Fixed-Point Designer™
C コンパイラ
サポートされるコンパイラを参照してください。
mex -setup
を使用して、既定のコンパイラを変更できます。既定のコンパイラの変更を参照してください。
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
codegen
が call_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 関数と比較することができます。生成された固定小数点コードの動作が元のコードの動作を十分に近似していない場合は、ルックアップ テーブルで使用する内挿法または点の数を変更してから、コードを生成し直してください。