Main Content

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. L’accélération du code permet d’optimiser l’accélération des algorithmes en 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. Dans cet exemple, 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. La conversion en un type de signal de sortie permet d'éviter une croissance infinie des bits. Le signal de sortie est retardé par un échantillonnage et réinjecté pour amortir le signal d’entrée.

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. L’affectation indicée dans la sortie y effectue une conversion dans le type de y et empêche la croissance infinie des bits.

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

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

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

clearvars

Règle les paramètres du générateur de nombres aléatoires sur leurs valeurs par défaut.

rng('default');

Signal d'entrée.

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

Gain de la rétroaction.

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

Initialiser la sortie. La longueur des fractions est choisie de manière à éviter tout overflow.

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

Initialiser la sortie retardée.

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

Exécuter Interpreted MATLAB et Time

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

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

Déclarer le paramètre de gain de rétroaction a constant pour la génération de code.

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

Exécuter la version MEX et Time

Exécuter une fois afin de charger le fichier MEX en mémoire.

fiaccelFeedback_mex(x,a,y1,z);

Réexécuter ensuite.

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

Taux d’accélération

Comparer la vitesse d’exécution MEX avec la simulation de code MATLAB.

ratio_of_speed_up = t1/t2
ratio_of_speed_up =

  192.2929

Vérifier que les sorties Interpreted MATLAB virgule fixe et MEX sont identiques

isequal(y1,y2)
ans =

  logical

   1

Supprimer les avertissements Code Analyzer.

%#ok<*NOPTS>

Voir aussi