Main Content

Acelerar la simulación de punto fijo

Este ejemplo muestra cómo acelerar algoritmos de punto fijo utilizando la función fiaccel. La aceleración de código ofrece optimizaciones para acelerar algoritmos de punto fijo mediante la generación de archivos MEX. Fixed-Point Designer™ ofrece una práctica función fiaccel para convertir código de MATLAB en una función MEX, que puede acelerar enormemente la velocidad de ejecución de los algoritmos de punto fijo. En este ejemplo, se genera una función MEX a partir de código de MATLAB®, se ejecuta la función MEX generada y se compara la velocidad de ejecución con la simulación de código de MATLAB.

Descripción del ejemplo

Este ejemplo utiliza un bucle de retroalimentación de primer orden. La conversión al tipo de señal de salida evita el crecimiento infinito de bits. La señal de salida se retrasa una muestra y se retroalimenta para amortiguar la señal de entrada.

Inspeccionar el código de la función de retroalimentación de MATLAB®

La función de MATLAB que realiza el bucle de retroalimentación se encuentra en el archivo fiaccelFeedback.m. La asignación con subíndice en la salida y se convierte al tipo y y evita el crecimiento infinito de 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

En esta función se utilizan las siguientes variables:

  • x es el vector de la señal de entrada.

  • y es el vector de la señal de salida.

  • a es la ganancia de retroalimentación.

  • z es la señal de salida con retraso unitario.

Crear la señal de entrada e inicializar las variables

clearvars

Restablezca el generador de números aleatorios a su valor predeterminado.

rng('default');

Señal de entrada.

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

Ganancia de retroalimentación.

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

Inicialice la salida. La longitud de fracción se elige para evitar el desbordamiento.

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

Inicialice la salida retrasada.

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

Ejecutar Interpreted MATLAB y el tiempo

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

Crear la versión MEX del código de retroalimentación

Declare el parámetro de ganancia de retroalimentación a constante para la generación de código.

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

Ejecutar el tiempo y la versión de MEX

Realice la ejecución una vez para cargar el archivo MEX en la memoria.

fiaccelFeedback_mex(x,a,y1,z);

Realice la ejecución de nuevo para el tiempo.

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

Índice de aceleración

Compare la velocidad de ejecución de MEX con la simulación de código de MATLAB.

ratio_of_speed_up = t1/t2
ratio_of_speed_up =

  235.2984

Verificar que las salidas de MEX e Interpreted MATLAB en punto fijo son idénticas

isequal(y1,y2)
ans =

  logical

   1

Suprima las advertencias del analizador de código.

%#ok<*NOPTS>

Consulte también