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
작업에주의 할만한 함정이 있습니까?