У мене є система цифрової обробки сигналів з плаваючою комою, яка працює з фіксованою швидкістю вибірки зразків в секунду, реалізована за допомогою процесора 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
інструкція гарантує ?).
Який правильний спосіб це зробити?
sincos
порівнюється час виконання з кількома множеннями? Чи можливі підводні камені, на які слід стежити за допомогоюmod
операції?