Tengo un sistema de procesamiento de señal digital de punto flotante que funciona a una frecuencia de muestreo fija de muestras por segundo implementado utilizando un procesador x86-64. Suponiendo que el sistema DSP está bloqueado sincrónicamente para lo que sea que importe, ¿cuál es la mejor manera de implementar un oscilador digital a alguna frecuencia ?
Específicamente, quiero generar la señal:
Una idea es hacer un seguimiento de un vector que rotamos en un ángulo en cada ciclo de reloj.
Como una implementación de pseudocódigo de Matlab (la implementación real está en C):
%% Initialization code
f_s = 32768; % sample rate [Hz]
f = 19.875; % some constant frequency [Hz]
v = [1 0]; % initial condition
d_phi = 2*pi * f / f_s; % change in angle per clock cycle
% initialize the rotation matrix (only once):
R = [cos(d_phi), -sin(d_phi) ; ...
sin(d_phi), cos(d_phi)]
Luego, en cada ciclo de reloj, giramos el vector un poco:
%% in-loop code
while (forever),
v = R*v; % rotate the vector by d_phi
y = v(1); % this is the sine wave we're generating
output(y);
end
Esto permite que el oscilador se calcule con solo 4 multiplicaciones por ciclo. Sin embargo, me preocuparía el error de fase y la estabilidad de la amplitud. (En pruebas simples me sorprendió que la amplitud no muriera o explotara de inmediato, ¿tal vez la sincos
instrucción garantiza ?).
¿Cuál es la forma correcta de hacer esto?
sincos
compara el tiempo de ejecución de un puñado de multiplicaciones? ¿Hay posibles dificultades a tener en cuenta con lamod
operación?