2008-09-15 11 views
24

मैं एक नमूना DirectX से एक बफर में आयोजित की है। यह एक नोट से नमूना खेला गया है और एक उपकरण से कब्जा कर लिया गया है। मैं नमूना की आवृत्ति का विश्लेषण कैसे करूं (जैसे गिटार ट्यूनर करता है)? मेरा मानना ​​है कि एफएफटी शामिल हैं, लेकिन मेरे पास हाउटो के लिए कोई संकेत नहीं है।आप पीसीएम या डब्ल्यूएवी नमूना की मौलिक आवृत्ति का विश्लेषण कैसे करते हैं?

उत्तर

5

FFTs (फास्ट फूरियर Transforms) वास्तव में शामिल किया जाएगा। एफएफटी आपको निश्चित आवृत्तियों और अलग-अलग आयामों की सरल साइन लहरों के साथ किसी एनालॉग सिग्नल का अनुमान लगाने की अनुमति देता है। आप अनिवार्य रूप से क्या कर रहे हैं नमूना ले रहे हैं और इसे आयाम में विभाजित कर रहे हैं-> आवृत्ति जोड़े, और उसके बाद आवृत्ति लेना जो उच्चतम आयाम से मेल खाता है।

उम्मीद है कि एक और इसलिए पाठक अंतराल मैं सिद्धांत और कोड के बीच जा रहा हूँ भर सकते हैं!

+3

इस दृष्टिकोण में गंभीर सटीकता की समस्याएं हैं, खासकर संगीत संदर्भ में। एंडोलिथ बताते हैं, एफएफटी आपको आवृत्तियों की एक श्रृंखला के भीतर तीव्रता देता है; सीमा एफएफटी खिड़की के आकार के छोटे (और तेज़) बड़े हैं।इससे भी बदतर, कुल रेंज 0 से 44100 हर्ट्ज (रेडबुक ऑडियो के लिए) है, जबकि एक सामान्य संगीत नोट 1000Hz से लगभग हमेशा अच्छी तरह से होता है, इसलिए आपके अधिकांश संकल्प उच्च आवृत्ति बैंड पर बर्बाद हो जाते हैं। – MusiGenesis

1

एक DFT लागू करें और उसके बाद परिणामों से मौलिक आवृत्ति निकाले जाते हैं। डीएफटी सूचना के लिए चारों ओर गुगल करने से आपको वह जानकारी मिल जाएगी जो आपको चाहिए - मैं आपको कुछ लोगों से जोड़ूंगा, लेकिन गणित के ज्ञान की अपेक्षाओं में वे काफी भिन्न हैं।

शुभकामनाएं।

4

गिटार ट्यूनर FFT या DFT के प्रयोग नहीं करते। आमतौर पर वे सिर्फ शून्य क्रॉसिंग की गणना करते हैं। आपको मौलिक आवृत्ति नहीं मिल सकती है क्योंकि कुछ तरंगों के पास दूसरों की तुलना में अधिक शून्य क्रॉसिंग होते हैं लेकिन आप आमतौर पर मौलिक आवृत्ति का एक से अधिक प्राप्त कर सकते हैं। यह नोट प्राप्त करने के लिए पर्याप्त है हालांकि आप एक या अधिक ऑक्टेट्स बंद हो सकते हैं।

कम पास छानने शून्य क्रॉसिंग गिनती से पहले आम तौर पर अतिरिक्त शून्य क्रॉसिंग से छुटकारा पा सकते। कम पास फिल्टर ट्यूनिंग आवृत्ति की सीमा आप पता लगाने के लिए चाहते हैं के कुछ knowlegde की आवश्यकता है, हालांकि

+2

मुझे संदेह है कि वे शून्य क्रॉसिंग की गणना करते हैं। एक ठेठ गिटार तरंग में प्रति चक्र कई शून्य क्रॉसिंग हैं। http://www.flickr.com/photos/[email protected]/4180888094/ वे शायद एक साधारण स्वायत्तता करते हैं। – endolith

+1

अधिक शून्य क्रॉसिंग वास्तव में एक साधारण ट्यूनर के लिए कोई फर्क नहीं पड़ता। याद रखें कि एक ट्यूनर को मौलिक की सटीक आवृत्ति की आवश्यकता नहीं होती है। इसे नोट जानने की जरूरत है। प्रति चक्र अधिक शून्य क्रॉसिंग की गिनती करके यह एक उच्च ऑक्टेट पर लॉक हो सकता है लेकिन एक सीबी अभी भी एक सीबी होगा और दो सेंट बहुत अधिक होगा, फिर भी दो सेंट बहुत अधिक होगा। ऑटोकॉर्पोरेशन अधिक उन्नत प्रसंस्करण के लिए बहुत अच्छा है लेकिन यह ट्यूनर के लिए अधिक है। – Mendelt

4

एक छोटी सी अधिक विशेष रूप से:

आप एक इनपुट सरणी में कच्चे पीसीएम के साथ शुरू करते हैं, तो क्या आप मूल रूप से एक ग्राफ है तरंग आयाम बनाम समय का। एक एफएफटी करने से यह आवृत्ति हिस्टोग्राम में आवृत्ति के लिए 0 से 1/2 इनपुट नमूना दर में बदल जाएगा। परिणाम सरणी में प्रत्येक प्रविष्टि का मान इसी उप-आवृत्ति की 'ताकत' होगी।

FFT(N, input, output); 
max = max_i = 0; 
for(i=0;i<N;i++) 
    if (output[i]>max) max_i = i; 
root = S/2.0 * max_i/N ; 
+0

मुझे संक्षिप्त सादगी पसंद है लेकिन लूप के साथ समस्या का संदेह है। आउटपुट निश्चित रूप से इनपुट के समान आकार नहीं होगा – Waslap

+0

यह बिल्कुल वही आकार है। एफएफटी करना एक ट्रेडऑफ है - आप केवल एक बड़े समय अवधि का विश्लेषण करके ठीक आवृत्ति संकल्प (कई आउटपुट डिब्बे) प्राप्त कर सकते हैं। यदि विश्लेषण को एक बहुत ही सटीक समय (छोटे इनपुट नमूना आकार) तक सीमित कर दिया जाता है तो आपको आवृत्ति डोमेन में कम रिज़ॉल्यूशन मिलता है। – AShelly

17

वहाँ भी अन्य एल्गोरिदम कि समय आधारित है कर रहे हैं, नहीं आवृत्ति आधारित:

तो जड़ आवृत्ति आकार एन के एक इनपुट सरणी एस नमूने/सेकंड में नमूना दिया खोजने के लिए। स्वत: सहसंबंध पिच पहचान के लिए अपेक्षाकृत सरल एल्गोरिदम है। संदर्भ: ऑटो सहसंबंध और अन्य एल्गोरिदम कि पढ़े जाने योग्य हैं की http://cnx.org/content/m11714/latest/

मैं लिखा है सी # कार्यान्वयन। http://code.google.com/p/yaalp/ देखें।

http://code.google.com/p/yaalp/source/browse/#svn/trunk/csaudio/WaveAudio/WaveAudio फ़ाइलों को सूचीबद्ध करता है, और PitchDetection.cs वह वही है जिसे आप चाहते हैं।

(परियोजना जीपीएल है, तो शब्दों को समझने अगर आप कोड का उपयोग करें)।

+2

मैं इस जवाब को कई बार वोट देना चाहता हूं। इस समस्या के लिए एफएफटी एक भयानक समाधान है; यह किराने की दुकान में टैंक चलाने की तरह है। निश्चित रूप से, यह अच्छा है, लेकिन यह वास्तव में सबसे अच्छा तरीका नहीं है। Autocorrelation आमतौर पर इस समस्या के लिए सही समाधान माना जाता है; जैसे ऑटोोट्यून/मेलोडीन/सिंगस्टार/आप इसे नाम दें। शून्य क्रॉसिंग आधारित समाधान केवल लागू होते हैं जब आपके पास हर्मेनिक व्यवहार का विशिष्ट ज्ञान होता है। Autocorrelation भी बहुत कुशलता से लागू किया जा सकता है। –

+5

वाह, क्या? मैं असहमत हूं। आवृत्ति-डोमेन समाधान बिल्कुल एक भयानक समाधान नहीं है। हार्मोनिक उत्पाद स्पेक्ट्रम या सेप्स्ट्रल विधियों को लागू करने और उचित रूप से मजबूत करने के लिए आसान हैं। Autocorrelation * आमतौर पर * किसी भी माध्यम से सही समाधान माना जाता है; यह कई मान्य समाधानों में से एक है। सच है, यद्यपि: शून्य क्रॉसिंग पिच का विश्वसनीय संकेतक नहीं है। –

+1

ऑटो-कॉरपोरेशन आमतौर पर एफएफटी की तुलना में अधिक संगणकीय रूप से गहन है। हम अक्सर ऑटो-कॉरपोरेशन करने के लिए एफएफटी का उपयोग करते हैं, वास्तव में, क्योंकि यह तेज़ है। जब आप एफएफटी के साथ ऐसा कर सकते हैं तो निष्क्रिय स्वायत्तता का उपयोग करना सामने वाले दरवाजे का उपयोग करने के बजाय किराने की दुकान की दीवार के माध्यम से एक टैंक चला रहा है। – endolith

19

एफएफटी आपको यह पता लगाने में मदद कर सकता है कि आवृत्ति कहां है, लेकिन यह आपको बिल्कुल आवृत्ति क्या नहीं बता सकती है। FFT में प्रत्येक बिंदु एक आवृत्तियों की "बिन" है, इसलिए वहाँ अपने FFT में एक चोटी है कि अगर, तुम सब जानते हैं कि आवृत्ति आप चाहते हैं कि बिन, या आवृत्तियों की सीमा के भीतर कहीं है।

यदि आप इसे वास्तव में सटीक चाहते हैं, तो आपको एक उच्च रिज़ॉल्यूशन और बहुत सारे डिब्बे (= बहुत सारी मेमोरी और गणना के बहुत सारे) के साथ एक लंबे एफएफटी की आवश्यकता है। आप लॉग-स्केल्ड स्पेक्ट्रम पर quadratic interpolation का उपयोग करके कम-रिज़ॉल्यूशन FFT से वास्तविक चोटी का अनुमान लगा सकते हैं, जो आश्चर्यजनक रूप से अच्छी तरह से काम करता है।

यदि कम्प्यूटेशनल लागत सबसे महत्वपूर्ण है, तो आप सिग्नल को उस फॉर्म में प्राप्त करने का प्रयास कर सकते हैं जिसमें आप शून्य क्रॉसिंग को गिन सकते हैं, और फिर जितना अधिक आप गिनते हैं, उतना सटीक आपके माप।

हालांकि इनमें से कोई भी काम नहीं करेगा अगर fundamental is missing, हालांकि। :)

मैं कुछ अलग एल्गोरिदम here रेखांकित किया है, और अंतर्वेशित FFT आमतौर पर सबसे सटीक है (हालांकि यह केवल when the fundamental is the strongest harmonic काम करता है - नहीं तो आप इसे खोजने के बारे में होशियार होने की जरूरत है) के साथ, एक करीबी दूसरा शून्य क्रॉसिंग (हालांकि यह केवल for waveforms with one crossing per cycle काम करता है)। इन शर्तों में से कोई भी सामान्य नहीं है।

ध्यान रखें कि मौलिक आवृत्ति के ऊपर आंशिक पियानो या गिटार जैसे कई उपकरणों में सही हार्मोनिक्स नहीं हैं। प्रत्येक आंशिक actually a little bit out of tune, या inharmonic है। तो एफएफटी में उच्च आवृत्ति शिखर मौलिक के पूर्णांक गुणांक पर बिल्कुल नहीं होंगे, और तरंग आकार एक चक्र से अगले चक्र में थोड़ा बदल जाएगा, जो स्वत: सहसंबंध को फेंकता है।

वास्तव में सटीक आवृत्ति पढ़ने के लिए, मैं मौलिक अनुमान लगाने के लिए स्वत: सहसंबंध का उपयोग करने के लिए कहूंगा, फिर चतुर्भुज इंटरपोलेशन का उपयोग करके सही चोटी पाएं। (आप सीपीयू चक्रों को बचाने के लिए आवृत्ति डोमेन में स्वत: सहसंबंध कर सकते हैं।) बहुत सारे मिलचास हैं, और वास्तव में उपयोग करने का सही तरीका आपके आवेदन पर निर्भर करता है।

एक पीसीएम ऑडियो सिग्नल में मौलिक आवृत्तियों की
+1

साथ ही साथ मौलिक सिद्धांतों के साथ, स्ट्रिंग उपकरणों से सिग्नल पर निपटने के लिए सहानुभूतिपूर्ण अनुनाद का मुद्दा भी है। विशेष रूप से गिटार के लिए उपकरण ट्यूनिंग परिदृश्य में, किसी भी समय पर तारों को ट्यून नहीं किया जा रहा है और यदि ट्यून किए गए पिच के करीब खेला गया स्ट्रिंग के साथ संयोग आंशिक होता है। – marko

3

रिट्रीवल एक मुश्किल काम है, और वहाँ एक बहुत इसके बारे में बात करने के लिए ...

वैसे भी हो सकता है, आमतौर पर समय आधारित पद्धति, पॉलीफोनिक संकेतों के लिए उपयुक्त नहीं हैं क्योंकि कई मौलिक आवृत्तियों के कारण विभिन्न हार्मोनिक घटकों के योग द्वारा दी गई एक जटिल लहर शून्य-क्रॉसिंग दर है जो केवल निम्नतम आवृत्ति घटक से निर्भर करती है ... आवृत्ति डोमेन में भी एफएफटी सबसे उपयुक्त विधि नहीं है, आवृत्ति के बाद से नोट्स के बीच अंतर एक घातीय पैमाने का पालन करें, रैखिक नहीं। इसका मतलब यह है कि एफएफटी विधि में उपयोग किए जाने वाले निरंतर आवृत्ति संकल्प, कम आवृत्ति नोट्स को हल करने के लिए अपर्याप्त हो सकते हैं यदि समय डोमेन में विश्लेषण विंडो का आकार पर्याप्त नहीं है।

एक और उपयुक्त विधि निरंतर-क्यू ट्रांसफॉर्म होगा, जो अलग-अलग प्राप्त करने के लिए सिग्नल के कम-पास फ़िल्टरिंग और क्षीणन (यानी नमूना आवृत्ति प्रत्येक चरण को रोकना) की प्रक्रिया के बाद लागू किया गया है। विभिन्न आवृत्ति संकल्प के साथ subbands। इस तरह डीएफटी की गणना अनुकूलित है। समस्या यह है कि समय संकल्प परिवर्तनीय है, और निचले उपबंधों के लिए बढ़ता है ...

अंत में, यदि हम एक ही नोट की मौलिक आवृत्ति का अनुमान लगाने की कोशिश कर रहे हैं, तो एफएफटी/डीएफटी विधियां ठीक हैं। चीजें एक पॉलीफोनिक संदर्भ के लिए बदलती हैं, जिसमें विभिन्न ध्वनियों के आंशिक रूप से ओवरलैप होते हैं और उनके चरण अंतर के आधार पर उनके आयाम को योग/रद्द करते हैं, और इसलिए एक वर्णक्रमीय चोटी विभिन्न हार्मोनिक सामग्री (विभिन्न नोटों से संबंधित) से संबंधित हो सकती है। इस मामले में सहसंबंध अच्छे नतीजे नहीं देते ...

संबंधित मुद्दे