ฉันมีระบบประมวลผลสัญญาณดิจิตอลแบบลอยตัวที่ทำงานที่อัตราตัวอย่างคงที่ที่ตัวอย่างต่อวินาทีที่ใช้งานโดยใช้โปรเซสเซอร์ x86-64 สมมติว่าระบบ DSP ถูกล็อคแบบซิงโครนัสกับสิ่งใดก็ตามวิธีที่ดีที่สุดในการใช้ออสซิลเลเตอร์ดิจิตอลในความถี่คืออะไร?
โดยเฉพาะผมต้องการที่จะสร้างสัญญาณ:
แนวคิดหนึ่งคือการติดตามเวกเตอร์ที่เราหมุนตามมุมในแต่ละรอบนาฬิกา
ในฐานะที่เป็น Matlab pseudocode การใช้งาน (การใช้งานจริงใน 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
การปฏิบัติงานหรือไม่?