Main Content

Simulazione dell’accelerazione in virgola fissa

Questo esempio illustra come accelerare gli algoritmi in virgola fissa utilizzando la funzione fiaccel. È possibile generare una funzione MEX dal codice MATLAB®, eseguire la funzione MEX generata e paragonare la velocità di esecuzione con la simulazione del codice MATLAB.

Descrizione dell’esempio

Questo esempio utilizza un loop di feedback del primo ordine. Utilizza inoltre un quantizzatore per evitare una crescita infinita di bit. Il segnale di output è ritardato di un campione e restituito per smorzare il segnale di input.

Copia del file richiesto

Per eseguire questo esempio è necessario avere questo file MATLAB. Copiare il file in una directory temporanea. Questo passaggio richiede i permessi di scrittura nella directory temporanea del sistema.

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

Controllo del codice della funzione di feedback di MATLAB

La funzione MATLAB che esegue il loop di feedback si trova nel file fiaccelFeedback.m. Questo codice quantizza l’input ed esegue l’azione del loop di feedback:

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

In questa funzione sono utilizzate le seguenti variabili:

  • x è il vettore del segnale di input.

  • y è il vettore del segnale di output.

  • a è il guadagno di feedback.

  • w è il segnale di output dell’unità di ritardo.

Creazione del segnale di input e inizializzazione delle variabili

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

Esecuzione della modalità normale

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

Costruzione della versione MEX del codice di feedback

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

Esecuzione della versione MEX

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

Rapporto di accelerazione

L’accelerazione del codice fornisce delle ottimizzazioni per accelerare gli algoritmi in virgola fissa, tramite la generazione di file MEX. Fixed-Point Designer™ fornisce un’appropriata funzione fiaccel per convertire il codice MATLAB in una funzione MEX, che può accelerare notevolmente la velocità di esecuzione degli algoritmi in virgola fissa.

r = t1/t2
r =

   11.3804

Pulizia dei file temporanei

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