Ich habe ein digitales Gleitkomma-Signalverarbeitungssystem, das mit einer festen Abtastrate von Abtastungen pro Sekunde arbeitet und mit einem x86-64-Prozessor implementiert ist. Unter der Annahme, dass das DSP-System synchron zu allen wichtigen Punkten verriegelt ist, wie lässt sich ein digitaler Oszillator mit einer bestimmten Frequenz am besten implementieren ?f
Insbesondere möchte ich das Signal erzeugen: wobei für die .t = n / f s n
Eine Idee ist, einen Vektor zu verfolgen den wir in jedem Taktzyklus um einen Winkel drehen .Δ ϕ = 2 π f / f s
Als Matlab-Pseudocode-Implementierung (die eigentliche Implementierung befindet sich 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)]
Dann drehen wir den Vektor bei jedem Taktzyklus ein wenig:
%% 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
Dadurch kann der Oszillator mit nur 4 Multiplikationen pro Zyklus berechnet werden. Ich würde mir jedoch Sorgen um Phasenfehler und Amplitudenstabilität machen. (In einfachen Tests war ich überrascht, dass die Amplitude nicht sofort starb oder explodierte - vielleicht sincos
garantiert der Befehl ?).
Was ist der richtige Weg, um dies zu tun?
sincos
mit einer Handvoll Multiplikationen? Gibt es mögliche Fallstricke, auf die Sie bei dermod
Operation achten müssen?