Contenuto principale

La traduzione di questa pagina non è aggiornata. Fai clic qui per vedere l'ultima versione in inglese.

Simulazione dell’accelerazione in virgola fissa

Questo esempio illustra come accelerare gli algoritmi in virgola fissa utilizzando la funzione fiaccel. 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. In questo esempio, si genera una funzione MEX dal codice MATLAB, si esegue la funzione MEX generata e si confronta la velocità di esecuzione con la simulazione del codice MATLAB.

Descrizione dell’esempio

Questo esempio utilizza un loop di feedback del primo ordine. La conversione nel tipo di segnale di output impedisce la crescita infinita dei bit. Il segnale di output è ritardato di un campione e restituito per smorzare il segnale di input.

Controllo del codice della funzione di feedback di MATLAB

La funzione MATLAB che esegue il loop di feedback si trova nel file fiaccelFeedback.m. L'assegnazione con pedice nell'output y esegue la conversione nel tipo y e impedisce la crescita infinita dei bit.

function [y,z] = fiaccelFeedback(x,a,y,z)
    for n = 1:length(x)
        y(n) = x(n) - a*z;
        z(:) = y(n);
    end
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.

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

Creazione del segnale di input e inizializzazione delle variabili

clearvars

Riportare le impostazioni del generatore di numeri al valore predefinito.

rng('default');

Segnale di input.

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

Gain di feedback.

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

Inizializzare l'output. La lunghezza della frazione viene scelta per evitare l'overflow.

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

Inizializzare l'output ritardato.

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

Esecuzione di MATLAB interpretato e temporizzazione

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

Costruzione della versione MEX del codice di feedback

Dichiarare il parametro del gain di feedback a costante per la generazione di codice.

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

Esecuzione della versione MEX e temporizzazione

Eseguire una volta per caricare il file MEX in memoria.

fiaccelFeedback_mex(x,a,y1,z);

Eseguire nuovamente per temporizzare.

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

Rapporto di accelerazione

Confrontare la velocità di esecuzione di MEX con la simulazione del codice MATLAB.

ratio_of_speed_up = t1/t2
ratio_of_speed_up =

  208.5636

Verifica dell'uguaglianza tra gli output di MATLAB interpretato in virgola fissa e gli output di MEX

isequal(y1,y2)
ans =

  logical

   1

Sopprimere gli avvisi dell'analizzatore di codice.

%#ok<*NOPTS>

Vedi anche