मैं तात्कालिक आवृत्ति की गणना करने के सिद्धांत के लिए नया हूं, और इस पर बहुत सारे प्रश्न आए। आप इस पाठ के अंत में उन सभी को बुलेट-पॉइंट सूची में पाते हैं। पाठ थोड़ा लंबा हो सकता है, इसके लिए मुझे क्षमा करें, लेकिन मैंने वास्तव में अपने दम पर उस समस्या पर काम करने की कोशिश की।
तो मैं तात्कालिक आवृत्ति में रुचि रखता हूं एक वास्तविक मूल्य का संकेत है । गणना एक विश्लेषणात्मक संकेत की मदद से की जाती है, कहाँ पे का हिल्बर्ट परिवर्तन है ।
विश्लेषणात्मक संकेत से तात्कालिक आवृत्तियों की गणना करने के लिए मैंने कागज का अनुसरण किया:
1992 से आर्थर ई। बार्न्स द्वारा तात्कालिक आवृत्ति और तात्कालिक बैंडविड्थ की गणना । इस पत्र में उन्होंने तात्कालिक आवृत्ति की गणना करने के लिए कई तरीकों का परिचय दिया। मैं लिखता हूं, सभी सूत्र उन्होंने (और मैंने इस्तेमाल किया) एक पल में प्रस्तावित किया।
"सीखने" के लिए, मैंने MATLAB में एक बहुत ही सरल और दो और अधिक जटिल संकेतों के साथ खेला, और उनकी तात्कालिक आवृत्तियों को प्राप्त करना चाहता था।
Fs = 1000; % sampling-rate = 1kHz
t = 0:1/Fs:10-1/Fs; % 10s 'Timevector'
chirp_signal = chirp(t,0,1,2); % 10s long chirp-signal, signal 1
added_sinusoid = chirp_signal + sin(2*pi*t*10); % chirp + sin(10Hz), signal 2
modulated_sinusoid = chirp_signal .* sin(2*pi*t*10); % chirp * sin(10Hz), signal 3
उन तीन संकेतों के समय डोमेन में प्लॉट निम्नलिखित दिखते हैं:
कागज से सभी विधियों को लागू करने के बाद मुझे प्राप्त सभी तात्कालिक आवृत्तियों के भूखंड निम्नलिखित हैं:
शुद्ध चिरप संकेत की तात्कालिक आवृत्तियाँ : अतिरिक्त साइनसॉइड के साथ चिरप संकेत की तात्कालिक आवृत्तियाँ : संशोधित चिरप संकेत की तात्कालिक आवृत्तियाँ: कृपया ध्यान दें, कि तीनों छवियों में, प्लॉट 3 और 4 की y- अक्ष को ज़ूम इन किया गया है, इसलिए उन का आयाम संकेत बहुत छोटे हैं!
तात्कालिक आवृत्ति के लिए विश्लेषणात्मक संकेत से प्राप्त होने की पहली संभावना है:
function [instantaneous_frequency] = f2(analytic_signal,Fs)
factor = Fs/(2*pi);
instantaneous_frequency = factor * diff(unwrap(angle(analytic_signal)));
% Insert leading 0 in return-vector to maintain size
instantaneous_frequency = [0 instantaneous_frequency];
end
अब पेपर बार्न्स में विश्लेषणात्मक संकेत से तात्कालिक आवृत्तियों की गणना करने के लिए चार अन्य तरीके सुझाते हैं (या कहा जाता है कि संकलन)। उन्होंने ऊपरी सूत्र का भी उल्लेख किया है, लेकिन यह राय है कि यह चरण में अस्पष्टताओं के कारण अव्यावहारिक है। मुझे लगता है, वह इस unwrap()
विधि के बारे में नहीं जानता था , या इसके पीछे का गणित अधिक सटीक था। (मैं खुद उस पद्धति के बारे में आज ही सीख पाया, जब तात्कालिक आवृत्तियों पर कुछ अन्य स्रोत कोड देख रहा था)
अपने कागज में, सूत्र में लेबल नंबर (2) है, इसलिए, मैंने f (t) सूचकांक 2 दिया। अन्य सभी सूचकांक कागज में उनकी संख्या के समान तरीके से मेल खाते हैं।
चरण में अस्पष्टता के कारण, वह सुझाव देता है:
function [instantaneous_frequency] = f3(analytic_signal,Fs,T)
x = real(analytic_signal);
y = imag(analytic_signal);
diff_x = diff(x);
diff_y = diff(y);
factor = Fs/(2*pi);
a = x(2:end).*diff_y;
b = y(2:end).*diff_x;
c = x(2:end).^2;
d = y(2:end).^2;
instantaneous_frequency = factor * ((a-b)./(c+d));
% Insert leading 0 in return-vector to maintain size
instantaneous_frequency = [0 instantaneous_frequency];
end
फिर बार्नर ने तीन और सूत्र दिए जो उन्होंने "तात्कालिक आवृत्ति सन्निकटन" के नाम दिए:
function[instantaneous_frequency] = f9(analytic_signal, Fs, T)
x = real(analytic_signal);
y = imag(analytic_signal);
factor = Fs/(2*pi*T);
a = x(1:end-T).*y(1+T:end);
b = x(1+T:end).*y(1:end-T);
c = x(1:end-T).*x(1+T:end);
d = y(1:end-T).*y(1+T:end);
instantaneous_frequency = factor.*atan((a-b)./(c+d));
% Append 0 to return-vector to maintain size
instantaneous_frequency = [instantaneous_frequency zeros(1,T)];
end
function [instantaneous_frequency] = f11(analytic_signal, Fs, T)
x = real(analytic_signal);
y = imag(analytic_signal);
factor = Fs/(4*pi*T);
a = x(1:end-2*T).*y(1+2*T:end);
b = x(1+2*T:end).*y(1:end-2*T);
c = x(1:end-2*T).*x(1+2*T:end);
d = y(1:end-2*T).*y(1+2*T:end);
instantaneous_frequency = factor.*atan((a-b)./(c+d));
% Append and insert 0s to maintain size
instantaneous_frequency = [zeros(1,T) instantaneous_frequency zeros(1,T)];
end
function [instantaneous_frequency] = formula14(analytic_signal, Fs, T);
x = real(analytic_signal);
y = imag(analytic_signal);
factor = 2*Fs/(pi*T);
a = x(1:end-T).*y(1+T:end);
b = x(1+T:end).*y(1:end-T);
c = (x(1:end-T)+x(1+T:end)).^2;
d = (y(1:end-T)+y(1+T:end)).^2;
instantaneous_frequency = factor * ((a-b)./(c+d));
% Append and insert 0s to maintain size
instantaneous_frequency = [instantaneous_frequency zeros(1,T)];
end
सभी 3 सन्निकटन में सूत्र T को Fs (T = Fs = 1000 = 1s) पर सेट किया गया था, जैसा कि कागज में सुझाया गया है।
अब मेरे प्रश्न हैं:
- सूत्र f2 और f3 शुद्ध चिर सिग्नल के लिए समान परिणाम देते हैं। मुझे लगता है कि यह अच्छा है, क्योंकि वे उसी की गणना करते हैं। तीन सन्निकटन विधियाँ समान नहीं लौटती हैं, कुछ भी नहीं जो इसके करीब है! वह मामला क्या है? (मुझे आशा है कि यह सिर्फ एक प्रोग्रामिंग-बग नहीं है ...)
- हालांकि वे समान लौटाते हैं, विशेष रूप से भूखंड के अंत में वे बहुत 'झंझट' शुरू करते हैं । उसके लिए स्पष्टीकरण क्या है? मैंने पहले एलियासिंग जैसी चीज के बारे में सोचा था, लेकिन संकेतों की आवृत्ति की तुलना में मेरी नमूने की आवृत्ति काफी अधिक है, इसलिए मुझे लगता है कि इसे बाहर रखा जा सकता है।
शुद्ध चिर सिग्नल पर कम से कम f2 और f3 उपयुक्त काम करने लगते हैं, लेकिन f2 और f3 सहित सभी विधियाँ भयानक रूप से विफल होने लगती हैं, जब यह संकेत में एक से अधिक आवृत्तियों पर आता है। वास्तव में एक संकेत में एक से अधिक आवृत्ति होने के बजाय हमेशा ऐसा होता है। तो कोई कैसे (अधिक या कम) सही तात्कालिक आवृत्ति प्राप्त कर सकता है?
- मैं वास्तव में यह भी नहीं जानता कि क्या करना है, जब सिग्नल में एक से अधिक आवृत्ति मौजूद हो। गणना एक दिए गए बिंदु के लिए एक समय में एक नंबर लौटाती है, तो क्या करना चाहिए जब यहां, अधिक आवृत्तियों मौजूद हैं? सभी आवृत्तियों या ऐसा कुछ का औसत लौटाएं?
और मेरा शायद सबसे महत्वपूर्ण सवाल यह है कि वास्तविक और विस्तृत सॉफ्टवेयर में कैसे संभाला जाता है? मान लें कि मैं 1.75 s पर संग्राहक संकेत की तात्कालिक आवृत्ति जानना चाहता हूं, और मैंने विधि f2 को चुना, इससे मैं 'भाग्यशाली' हो सकता हूं और 6 के करीब एक संख्या प्राप्त कर सकता हूं [हर्ट्ज] जो सही उत्तर देने की सबसे अधिक संभावना है, या मैं मेरे परिणामों को उसके बगल में रखें और अचानक मुझे कुछ वायर्ड मिले, उच्च करने के लिए रास्ता, परिणाम, क्योंकि मैंने दुर्भाग्य से स्पाइक में एक मूल्य उठाया था। इसे कैसे संभाला जा सकता है? माध्य के साथ इसे पोस्टप्रोसेस करके या इससे भी बेहतर मीडियन फ़िल्टर? मुझे लगता है कि यहां तक कि वास्तव में विशेष रूप से उन क्षेत्रों में मुश्किल हो सकती है जहां कई स्पाइक्स एक दूसरे के बगल में हैं।
और एक आखिरी, इतना महत्वपूर्ण प्रश्न नहीं, ऐसा क्यों है कि तात्कालिक आवृत्तियों पर मुझे मिलने वाले अधिकांश पेपर भूगोल के क्षेत्र से हैं, खासकर भूकंप जैसी भूकंपीय घटनाओं की गणना में। बार्न का पेपर एक उदाहरण के रूप में भी लेता है। कई क्षेत्रों में तात्कालिक आवृत्ति दिलचस्प नहीं है?
यह अब तक है, मैं हर उत्तर के लिए बहुत आभारी हूं, खासकर जब कोई मुझे एक वास्तविक सॉफ्टवेयर परियोजना में इसे लागू करने के लिए सुझाव देता है ;)
तरह का संबंध है, पैट्रिक