Main Content

La traduction de cette page n'est pas à jour. Cliquez ici pour voir la dernière version en anglais.

Accélération de la simulation en virgule fixe

Cet exemple montre comment accélérer des algorithmes virgule fixe à l’aide de la fonction fiaccel. Vous générez une fonction MEX à partir du code MATLAB®, exécutez la fonction MEX générée, et comparez la vitesse d’exécution avec la simulation de code MATLAB.

Description de l’exemple

Cet exemple utilise une boucle de rétroaction du premier ordre. Il utilise également un quantificateur pour éviter la croissance infinie des bits. Le signal de sortie est retardé par un échantillonnage et réinjecté pour amortir le signal d’entrée.

Copier le fichier requis

Vous avez besoin de ce fichier MATLAB pour faire tourner cet exemple. Copiez-le dans un répertoire temporaire. Cette étape nécessite une autorisation d’écriture dans le répertoire temporaire du système.

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

Inspecter le code de la fonction de rétroaction MATLAB

La fonction MATLAB qui exécute la boucle de rétroaction se trouve dans le fichier fiaccelFeedback.m. Ce code quantifie l’entrée et exécute l’action de la boucle de rétroaction :

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

Les variables suivantes sont utilisées dans cette fonction :

  • x est le vecteur du signal d’entrée.

  • y est le vecteur du signal de sortie.

  • a est le gain de la rétroaction.

  • w est le signal de sortie retardé par une unité.

Créer le signal d’entrée et initialisez les variables

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

Exécuter le mode normal

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

Créer la version MEX du code de rétroaction

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

Exécutez la version MEX

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

Taux d’accélération

L’accélération du code permet d’optimiser l’accélération des algorithmes virgule fixe via la génération de fichiers MEX. Fixed-Point Designer™ propose la fonction fiaccel pratique pour convertir votre code MATLAB en fonction MEX, ce qui peut accélérer fortement la vitesse d’exécution de vos algorithmes virgule fixe.

r = t1/t2
r =

   11.3804

Nettoyer les fichiers temporaires

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