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>