Tôi có một hệ thống xử lý tín hiệu số dấu phẩy động hoạt động với tốc độ mẫu cố định mẫu mỗi giây được thực hiện bằng bộ xử lý x86-64. Giả sử rằng hệ thống DSP được khóa đồng bộ với bất kỳ vấn đề gì, cách tốt nhất để thực hiện bộ tạo dao động kỹ thuật số ở tần số gì?
Cụ thể, tôi muốn tạo tín hiệu: trong đó cho số mẫu .
Một ý tưởng là theo dõi một vectơ mà chúng ta xoay theo một góc trên mỗi chu kỳ đồng hồ.
Là một triển khai mã giả Matlab (triển khai thực tế là trong 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)]
Sau đó, trên mỗi chu kỳ đồng hồ, chúng ta xoay vectơ xung quanh một chút:
%% 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
Điều này cho phép bộ dao động được tính toán chỉ với 4 phép nhân trên mỗi chu kỳ. Tuy nhiên, tôi lo lắng về lỗi pha và ổn định biên độ. (Trong các thử nghiệm đơn giản, tôi đã ngạc nhiên rằng biên độ không chết hoặc phát nổ ngay lập tức - có thể sincos
hướng dẫn đảm bảo ?).
Cách đúng đắn để làm điều này là gì?
sincos
so sánh với một số phép nhân? Có bất kỳ cạm bẫy có thể để xem ra với cácmod
hoạt động?