Mam zmiennoprzecinkowy system cyfrowego przetwarzania sygnałów, który działa ze stałą częstotliwością próbkowania próbek na sekundę, zaimplementowany przy użyciu procesora x86-64. Zakładając, że system DSP jest synchronicznie zablokowany na czymkolwiek, co jest najlepszym sposobem na wdrożenie oscylatora cyfrowego przy jakiejś częstotliwości ?f
W szczególności chcę wygenerować sygnał: gdzie dla próbki o numerze .t = n / f s n
Jednym z pomysłów jest śledzenie wektora który obracamy o kąt w każdym cyklu zegara.Δ ϕ = 2 π f / f s
Jako implementacja pseudokodu Matlab (rzeczywista implementacja znajduje się w 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)]
Następnie, w każdym cyklu zegara, obracamy nieco wektor wokół:
%% 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
Pozwala to na obliczenie oscylatora tylko przy 4 multiplikacjach na cykl. Martwię się jednak o błąd fazy i stabilność amplitudy. (W prostych testach zdziwiłem się, że amplituda nie umarła ani nie wybuchła natychmiast - być może sincos
instrukcja gwarantuje ?).
Jak to zrobić?
sincos
różni się od garstki mnożeń? Czy są jakieś pułapki, na które należy uważać podczasmod
operacji?