У меня есть система цифровой обработки сигналов с плавающей запятой, которая работает с фиксированной частотой дискретизации отсчетов в секунду, реализованная с использованием процессора x86-64. Предполагая, что система DSP синхронно связана с любыми вопросами, каков наилучший способ реализовать цифровой генератор на некоторой частоте ?f
В частности, я хочу сгенерировать сигнал: где для номера выборки .t = n / f s n
Одна идея состоит в том, чтобы отслеживать вектор который мы поворачиваем на угол на каждом тактовом цикле.Δ ϕ = 2 π f / f s
В качестве реализации псевдокода 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
операции?