派生した範囲に基づく固定小数点データ型の推奨
この例では、MATLAB® Coder™ アプリを使用して静的範囲に基づいて固定小数点データ型を推奨する方法を示します。派生範囲に基づいてデータ型を推奨すると、操作範囲全体でアルゴリズムを実行するテスト ファイルを用意する必要がなくなります。一般に、このようなテスト ファイルの実行には時間がかかります。代わりに範囲を派生させることで時間を節約できます。
メモ
派生範囲の解析は非スカラー変数ではサポートされていません。
必要条件
この例には次の製品が必要です。
MATLAB
MATLAB Coder
Fixed-Point Designer™
C コンパイラ
サポートされるコンパイラ を参照してください。
mex -setup
を使用して既定のコンパイラを変更できます。既定のコンパイラの変更を参照してください。
新規フォルダーの作成と関連ファイルのコピー
ローカルの書き込み可能なフォルダーに、関数
dti.m
を作成します。関数
dti
は MATLAB の Discrete Time Integrator を実装します。function [y, clip_status] = dti(u_in) %#codegen % Discrete Time Integrator in MATLAB % % Forward Euler method, also known as Forward % Rectangular, or left-hand approximation. % The resulting expression for the output of % the block at step 'n' is % y(n) = y(n-1) + K * u(n-1) % init_val = 1; gain_val = 1; limit_upper = 500; limit_lower = -500; % Variable to hold state between % consecutive calls to this block persistent u_state; if isempty(u_state) u_state = init_val+1; end % Compute Output if (u_state > limit_upper) y = limit_upper; clip_status = -2; elseif (u_state >= limit_upper) y = limit_upper; clip_status = -1; elseif (u_state < limit_lower) y = limit_lower; clip_status = 2; elseif (u_state <= limit_lower) y = limit_lower; clip_status = 1; else y = u_state; clip_status = 0; end % Update State tprod = gain_val * u_in; u_state = y + tprod;
テスト ファイル
dti_test.m
を作成してdti
アルゴリズムの演習を行います。このテスト スクリプトは正弦波入力を使用して関数
dti
を実行します。その後、スクリプトは入力および出力信号をプロットします。% dti_test % cleanup clear dti % input signal x_in = sin(2.*pi.*(0:0.001:2)).'; pause(10); len = length(x_in); y_out = zeros(1,len); is_clipped_out = zeros(1,len); for ii=1:len data = x_in(ii); % call to the dti function init_val = 0; gain_val = 1; upper_limit = 500; lower_limit = -500; % call to the design that does DTI [y_out(ii), is_clipped_out(ii)] = dti(data); end figure('Name', [mfilename, '_plot']); subplot(2,1,1) plot(1:len,x_in) xlabel('Time') ylabel('Amplitude') title('Input Signal (Sin)') subplot(2,1,2) plot(1:len,y_out) xlabel('Time') ylabel('Amplitude') title('Output Signal (DTI)') disp('Test complete.');
タイプ | 名前 | 説明 |
---|---|---|
関数のコード | dti.m | MATLAB のエントリポイント関数 |
テスト ファイル | dti_test.m | MATLAB スクリプト。次をテストします。 dti.m |
MATLAB Coder アプリを開く
この例のファイルを含む作業フォルダーに移動します。
MATLAB ツールストリップの [アプリ] タブの [コード生成] の下で、アプリ アイコンをクリックします。
ソース ファイルの選択
プロジェクトにエントリポイント関数 dti
を追加するために、ファイル dti.m
を探して [開く] をクリックします。既定では、アプリはこのプロジェクトの情報および設定を現在のフォルダーの dti.prj
というファイルに保存します。
固定小数点変換の有効化
[数値変換] を
[固定小数点に変換]
に設定します。[次へ] をクリックして [入力の型を定義] ステップに進みます。
dti.m
のコード違反およびコード生成の準備状態の問題が検査されます。dti.m
には問題は検出されません。
入力の型の定義
[入力の型を定義] ページで、
dti_test
をテスト ファイルとして追加するためにdti_test.m
を選択して [開く] をクリックします。[入力の型の自動定義] をクリックします。
テスト ファイルが実行されます。アプリはテスト ファイルから、
u_in
の入力型をdouble(1x1)
とすることを決定します。[次へ] をクリックして [実行時の問題の確認] ステップに進みます。
実行時の問題の確認
[実行時の問題の確認] ステップでインストルメント化された MEX 関数が生成されます。dti
の呼び出しを生成された MEX 関数の呼び出しで置き換えたうえで、テスト ファイル dti_test
が実行されます。アプリが問題を検出した場合には警告およびエラー メッセージが出力されます。メッセージをクリックするとウィンドウ内の問題のあるコードが強調表示され、ここでコードを編集できます。
[実行時の問題の確認] ページでは、入力の型を定義するために使用したテスト ファイル
dti_test
が、アプリによってテスト ファイルのフィールドに入力されます。[問題の確認] をクリックします。
アプリは問題を検出しません。
[次へ] をクリックして [固定小数点に変換] ステップに進みます。
固定小数点への変換
コードに含まれる変数についてコンパイルされた情報 (データ型、サイズ、実数/複素数) が表示されます。詳細は、変数情報の表示と変更を参照してください。
関数が固定小数点変換に対応していない場合、それらが [関数の置き換え] タブに表示されます。
[解析] 矢印
をクリックします。
[派生範囲の解析を使用した範囲の解析] を選択します。
[シミュレーションを使用した範囲の解析] チェック ボックスをオフにします。
派生範囲の解析を使用するには、設計範囲が必要です。
[固定小数点に変換] ページの [変数] タブで、入力
u_in
に対して [静的最小値] を選択して-1
に設定します。[静的最大値] を1
に設定します。派生範囲情報を計算するには、すべての入力変数の静的最小値および最大値または推奨されたデータ型を少なくとも指定しなければなりません。
メモ
手動で静的範囲を入力する場合、これらの手動で入力した範囲はシミュレーション範囲よりも優先されます。アプリは、手動で入力した範囲を使用してデータ型を推奨します。推奨された型を変更およびロックすることもできます。
[解析] をクリックします。
範囲解析によって派生範囲が計算され、[変数] タブに表示されます。これらの派生範囲を使用して、既定の型推奨設定に基づく固定小数点型が変数ごとに推奨されます。推奨されるデータ型が [推奨された型] に表示されます。
関数
dti
で、出力clip_status
の最小値は-2
、最大値は2
です。% Compute Output if (u_state > limit_upper) y = limit_upper; clip_status = -2; elseif (u_state >= limit_upper) y = limit_upper; clip_status = -1; elseif (u_state < limit_lower) y = limit_lower; clip_status = 2; elseif (u_state <= limit_lower) y = limit_lower; clip_status = 1; else y = u_state; clip_status = 0; end
範囲を派生させると、アプリによって関数が解析され、次のような
clip_status
の最小値と最大値が計算されます。このアプリでは、[派生範囲のクイック解析] オプションを選択できるほか、解析に長い時間がかかる場合にタイムアウトを指定するオプションもあります。派生範囲の計算を参照してください。
浮動小数点アルゴリズムを固定小数点に変換するには、[変換] をクリックします。
固定小数点の変換プロセスでは、推奨された型がソフトウェアによって検証され、ローカル作業フォルダー内の
codegen\dti\fixpt
フォルダーに次のファイルが生成されます。dti_fixpt.m
—dti.m
の固定小数点バージョン。dti_wrapper_fixpt.m
— このファイルは、テスト ファイルにより入力された浮動小数点データ値を、変換時に入力用に指定された固定小数点型に変換します。これらの固定小数点の値は変換された固定小数点設計dti_fixpt.m
に入力されます。dti_fixpt_report.html
— このレポートは、生成された固定小数点コードと固定小数点の計測結果を表示します。dti_report.html
— このレポートは、元のアルゴリズムと固定小数点の計測結果を表示します。dti_fixpt_args.mat
— 入力引数用の構造体、出力引数用の構造体および固定小数点ファイルの名前を含む MAT ファイル。
検証中にエラーまたは警告が発生した場合、それらは [出力] タブに表示されます。型の検証を参照してください。
[出力ファイル] リストで、
dti_fixpt.m
を選択します。生成された固定小数点コードがアプリによって表示されます。シミュレーション データ インスペクターを使用して浮動小数点と固定小数点の結果をプロットします。
[設定] 矢印
をクリックします。
[プロットとレポート] 設定を展開して [シミュレーション データ インスペクターを用いてプロット] を
[はい]
に設定します。[テスト] 矢印
をクリックします。[比較プロット用の入力と出力を記録] を選択します。[テスト] をクリックします。
入力型を定義するために使用したテスト ファイルが実行され、固定小数点 MATLAB コードがテストされます。オプションでテスト ファイルを追加し、数値のテスト用に 1 つを超えるテスト ファイルを実行することを選択できます。浮動小数点と固定小数点の両方のシミュレーションが実行され、出力変数
y
の誤差が計算されます。比較プロット用の入力と出力の記録と、プロットにシミュレーション データ インスペクターを使用することを選択したため、シミュレーション データ インスペクターが開きます。シミュレーション データ インスペクターを使用して、浮動小数点と固定小数点の実行情報の表示や結果の比較を行うことができます。たとえば出力
y
の浮動小数点の値と固定小数点の値を比較するには、[y
] を選択します。[比較] をクリックします。[ベースライン] を元の実行に、[比較対象] をコンバーターの実行に設定します。[比較] をクリックします。シミュレーション データ インスペクターは、ベースラインの浮動小数点の実行と固定小数点の実行のプロットおよびそれらの差を表示します。
[検証の出力] タブに、固定小数点レポートへのリンクが表示されます。
レポートを開くために dti_fixpt_report.html リンクをクリックします。
[次へ] をクリックして [コード生成] ステップに進みます。
固定小数点 C コードの生成
[生成] ダイアログ ボックスで、[ビルド ソース] を
[固定小数点]
に、[ビルド タイプ] を[ソース コード]
に設定します。[言語] を [C] に設定します。
[生成] をクリックし、既定のプロジェクト設定を使用してライブラリを生成します。
MATLAB Coder はプロジェクトをビルドし、C スタティック ライブラリとサポート ファイルを既定のサブフォルダー
codegen/lib/dti_fixpt
に生成します。dti_fixpt.c
に対する生成コードが表示されます。生成された C コードでは、変数には固定小数点データ型が割り当てられます。[次へ] をクリックして [ワークフローの完了] ページに進みます。
[ワークフローの完了] ページでは、プロジェクトのサマリーと生成された出力ファイルへのリンクが表示されます。