मेरे पास एक फ्लोटिंग-पॉइंट डिजिटल सिग्नल प्रोसेसिंग सिस्टम है जो x86-64 प्रोसेसर का उपयोग करके नमूने प्रति सेकंड की निश्चित नमूना दर पर संचालित होता है । यह मानते हुए कि डीएसपी प्रणाली को जो भी मामलों में समकालिक रूप से बंद किया गया है, कुछ आवृत्ति पर एक डिजिटल थरथरानवाला लागू करने का सबसे अच्छा तरीका क्या है ?f
विशेष रूप से, मैं संकेत उत्पन्न करना चाहता हूं: जहां नमूना संख्या लिए ।टी = n / च रों n
एक तरीका यह एक सदिश का ट्रैक रखने के है जो हम एक कोण से बारी बारी से Δ φ = 2 π च / च रों प्रत्येक घड़ी पर चक्र।
मतलूब स्यूडोकोड कार्यान्वयन के रूप में (वास्तविक कार्यान्वयन 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
ऑपरेशन के साथ बाहर देखने के लिए कोई संभावित नुकसान हैं ?