我有一个浮点数字信号处理系统,它以固定的采样率运行使用 x86-64 处理器实现的每秒采样数。假设 DSP 系统同步锁定到任何事情,在某个频率下实现数字振荡器的最佳方法是什么?
具体来说,我想生成信号:
一个想法是跟踪向量我们旋转一个角度在每个时钟周期。
作为一个 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
指令保证?)。
这样做的正确方法是什么?