Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

この例では、関数 fiaccel を使用して固定小数点アルゴリズムを高速化する方法を説明します。MATLAB® コードから MEX 関数を生成して実行し、実行速度を MATLAB コード シミュレーションと比較します。

例の説明

この例は 1 次フィードバック ループを使用します。ビットの無限成長を避けるため、量子化器も使用します。出力信号は 1 サンプリング分だけ遅れ、入力信号を減衰するためにフィードバックされます。

必要なファイルのコピー

この例を実行するには、この MATLAB ファイルが必要です。このファイルを一時ディレクトリにコピーします。この手順では、システムの一時ディレクトリへの書き込み権限が必要です。

tempdirObj = fidemo.fiTempdir('fiaccelbasicsdemo');
fiacceldir = tempdirObj.tempDir;
fiaccelsrc = ...
    fullfile(matlabroot,'toolbox','fixedpoint','fidemos','+fidemo','fiaccelFeedback.m');
copyfile(fiaccelsrc,fiacceldir,'f');

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

フィードバック ループを実行する MATLAB 関数は、ファイル fiaccelFeedback.m 内にあります。このコードは入力を量子化し、フィードバック ループ操作を実行します。

type(fullfile(fiacceldir,'fiaccelFeedback.m'))
function [y,w] = fiaccelFeedback(x,a,y,w)
%FIACCELFEEDBACK Quantizer and feedback loop used in FIACCELBASICSDEMO.

% Copyright 1984-2013 The MathWorks, Inc.
%#codegen

for n = 1:length(x)
    y(n) =  quantize(x(n) - a*w, true, 16, 12, 'floor', 'wrap');
    w    = y(n);    
end

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

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

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

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

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

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

rng('default');                      % Random number generator
x = fi(2*rand(1000,1)-1,true,16,15); % Input signal
a = fi(.9,true,16,15);               % Feedback gain
y = fi(zeros(size(x)),true,16,12);   % Initialize output. Fraction length
                                     % is chosen to prevent overflow
w = fi(0,true,16,12);                % Initialize delayed output
A = coder.Constant(a);               % Declare "a" constant for code
                                     % generation

ノーマル モードの実行

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

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

fiaccel fiaccelFeedback -args {x,A,y,w} -o fiaccelFeedback_mex

MEX バージョンの実行

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

高速化の比率

コードの実行速度を向上させるには、MEX ファイルの生成によって固定小数点アルゴリズムを高速化するための最適化を行います。Fixed-Point Designer™ では、MATLAB コードを MEX 関数に変換できる便利な関数 fiaccel を利用できます。これにより、固定小数点アルゴリズムの実行速度を大幅に向上させることができます。

r = t1/t2
r =

   15.4565

一時ファイルのクリーンアップ

clear fiaccelFeedback_mex;
tempdirObj.cleanUp;
%#ok<*NOPTS>