Ho un sistema di elaborazione del segnale digitale a virgola mobile che funziona a una frequenza di campionamento fissa di campioni al secondo implementata utilizzando un processore x86-64. Supponendo che il sistema DSP sia bloccato in modo sincrono su qualsiasi questione, qual è il modo migliore per implementare un oscillatore digitale a una certa frequenza ?
In particolare, voglio generare il segnale: dove per il numero di campione .
Un'idea è quella di tenere traccia di un vettore che ruotiamo di un angolo su ciascun ciclo di clock.
Come implementazione di pseudocodice Matlab (la vera implementazione è in 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)]
Quindi, ad ogni ciclo di clock, ruotiamo un po 'il vettore intorno:
%% 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
Ciò consente all'oscillatore di essere calcolato con solo 4 moltiplicazioni per ciclo. Tuttavia, mi preoccuperei dell'errore di fase e della stabilità dell'ampiezza. (In semplici test sono rimasto sorpreso dal fatto che l'ampiezza non sia morta o esplosa immediatamente - forse l' sincos
istruzione garantisce ?).
Qual è il modo giusto per farlo?
sincos
con una manciata di moltiplicazioni? Ci sono possibili insidie a cui prestare attenzione durante l'mod
operazione?