Main Content

固定小数点シミュレーションの速度の向上

この例では、関数fiaccelを使用して固定小数点アルゴリズムを高速化する方法を示します。コードの実行速度を向上させるには、MEX ファイルの生成によって固定小数点アルゴリズムを高速化するための最適化を行います。Fixed-Point Designer™ では、MATLAB コードを MEX 関数に変換できる便利な関数 fiaccel を利用できます。これにより、固定小数点アルゴリズムの実行速度を大幅に向上させることができます。この例では、MATLAB® コードから MEX 関数を生成した後、生成した MEX 関数を実行し、その実行速度を MATLAB コード シミュレーションと比較します。

例の説明

この例は 1 次フィードバック ループを使用します。出力信号の型にキャストすることでビットの無限成長を防ぎます。出力信号は 1 サンプリング分だけ遅れ、入力信号を減衰するためにフィードバックされます。

MATLAB® フィードバック関数コードの検査

フィードバック ループを実行する MATLAB 関数は、ファイル fiaccelFeedback.m 内にあります。出力 y への添字による代入によって y の型にキャストすることで、ビットの無限成長を防ぎます。

function [y,z] = fiaccelFeedback(x,a,y,z)
    for n = 1:length(x)
        y(n) = x(n) - a*z;
        z(:) = y(n);
    end
end

この関数では、以下の変数が使用されます。

  • x は入力信号ベクトルです。

  • y は出力信号ベクトルです。

  • a はフィードバック ゲインです。

  • z は単位遅延の出力信号です。

入力信号の作成と変数の初期化

clearvars

乱数発生器の設定を既定値にします。

rng('default');

入力信号。

x = fi(2*rand(1000,1)-1,true,16,15);

フィードバック ゲイン。

a = fi(0.9,true,16,15);

出力を初期化します。オーバーフローを防止するように小数部の長さが選択されます。

y = fi(zeros(size(x)),true,16,12);

遅延出力を初期化します。

z = cast(0,'like',y);

インタープリター型 MATLAB の実行と時間の測定

tic
y1 = fiaccelFeedback(x,a,y,z);
t1 = toc;

MEX バージョンのフィードバック コードのビルド

フィードバック ゲイン パラメーター a をコード生成用に定数として宣言します。

fiaccel fiaccelFeedback -args {x,coder.Constant(a),y,z} -o fiaccelFeedback_mex

MEX バージョンの実行と時間の測定

MEX ファイルを一度実行してメモリに読み込みます。

fiaccelFeedback_mex(x,a,y1,z);

もう一度実行して時間を測定します。

tic
y2 = fiaccelFeedback_mex(x,a,y,z);
t2 = toc;

高速化の比率

MEX の実行速度を MATLAB コード シミュレーションと比較します。

ratio_of_speed_up = t1/t2
ratio_of_speed_up =

  147.5653

固定小数点のインタープリター型 MATLAB と MEX の出力が同じであることを確認

isequal(y1,y2)
ans =

  logical

   1

コード アナライザーの警告を非表示にします。

%#ok<*NOPTS>

参考