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 sincosgarantiert der Befehl ?).
Was ist der richtige Weg, um dies zu tun?
sincosmit einer Handvoll Multiplikationen? Gibt es mögliche Fallstricke, auf die Sie bei dermodOperation achten müssen?