我有一个浮点数字信号处理系统,它使用x86-64处理器以每秒样本的固定样本速率运行。假设DSP系统被同步锁定在任何问题上,那么在某个频率实现数字振荡器的最佳方法是什么?f
具体来说,我想生成信号: 其中,对于样本编号, 。吨= ñ / ˚F 小号 Ñ
一种想法是跟踪矢量,在每个时钟周期我们旋转角度。Δ φ = 2 π ˚F / ˚F 小号
作为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
?