J'ai un système de traitement du signal numérique à virgule flottante qui fonctionne à un taux d'échantillonnage fixe de échantillons par seconde implémenté à l'aide d'un processeur x86-64. En supposant que le système DSP est verrouillé de manière synchrone sur tout ce qui compte, quelle est la meilleure façon de mettre en œuvre un oscillateur numérique à une fréquence ?
Plus précisément, je veux générer le signal:
Une idée est de garder une trace d'un vecteur que nous faisons tourner d'un angle à chaque cycle d'horloge.
En tant qu'implémentation de pseudocode Matlab (l'implémentation réelle 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)]
Ensuite, à chaque cycle d'horloge, nous faisons tourner un peu le vecteur:
%% 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
Cela permet à l'oscillateur d'être calculé avec seulement 4 multiplications par cycle. Cependant, je m'inquiéterais de l'erreur de phase et de la stabilité de l'amplitude. (Dans des tests simples, j'ai été surpris que l'amplitude ne meure pas ou n'explose pas immédiatement - peut-être que l' sincos
instruction garantit ?).
Quel est le bon moyen de le faire?
sincos
compare-t-il à une poignée de multiplications? Y a-t-il des pièges possibles à surveiller lors de l'mod
opération?