x86-64プロセッサを使用して実装されたサンプル/秒の固定サンプルレートで動作する浮動小数点デジタル信号処理システムがあります。DSPシステムが重要なものに同期してロックされていると仮定すると、ある周波数でデジタル発振器を実装する最良の方法は何ですか?
具体的には、信号を生成したい: ここで 、サンプル番号です。
1つのアイデアは、各クロックサイクルで角度だけ回転するベクトルを追跡することです。
Matlab擬似コード実装として(実際の実装は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)]
次に、各クロックサイクルで、ベクトルを少し回転させます。
%% 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
これにより、サイクルごとに4回の乗算で発振器を計算できます。ただし、位相誤差と振幅の安定性が心配です。(簡単なテストでは、振幅がすぐに消えたり爆発したりしなかったことに驚きました-おそらくsincos
命令が保証していますか?)
これを行う正しい方法は何ですか?
sincos
、少数の乗算と比較してどうですか?mod
操作で注意すべき落とし穴はありますか?