पिच का पता लगाने में सुधार के लिए टिप्स


21

मैं एक साधारण वेब ऐप पर काम कर रहा हूं जो उपयोगकर्ता को उसके गिटार को ट्यून करने की अनुमति देता है। मैं सिग्नल प्रोसेसिंग में एक वास्तविक शुरुआत कर रहा हूं, इसलिए यदि मेरा प्रश्न अनुचित है, तो बहुत मुश्किल न समझें।

इसलिए, मैं एफएफटी एल्गोरिथ्म का उपयोग करके मौलिक आवृत्ति प्राप्त करने में कामयाब रहा और इस बिंदु पर एप्लिकेशन किसी तरह कार्यात्मक है। हालाँकि, सुधार की गुंजाइश है, अभी मैं एफएफटी एल्गोरिथ्म में कच्चे pcm भेजता हूं, लेकिन मैं सोच रहा था कि शायद कुछ पूर्व / पोस्ट एल्गोरिदम / फ़िल्टर हैं जो पता लगाने में सुधार कर सकते हैं। क्या आप कोई सुझाव दे सकते हैं?

मेरी मुख्य समस्या यह है कि जब यह एक निश्चित आवृत्ति का पता लगाता है तो यह उस आवृत्ति को 1-2sec के लिए दिखाता है और फिर अन्य यादृच्छिक आवृत्तियों के लिए कूदता है और फिर से वापस आता है, भले ही ध्वनि निरंतर हो।

अगर किसी को इस तरह की चीजों का अनुभव है, तो मुझे किसी अन्य प्रकार के अनुकूलन में भी दिलचस्पी है।

जवाबों:


20

मुझे लगता है कि अन्य आवृत्तियों का अनुमान लगा रहा है जो मौलिक के हार्मोनिक्स हैं? जैसे आप 100 हर्ट्ज खेल रहे हैं और इसके बदले 200 हर्ट्ज या 300 हर्ट्ज निकालता है? सबसे पहले, आपको अपने खोज स्थान को उन आवृत्तियों तक सीमित करना चाहिए जो एक गिटार होने की संभावना है। वह उच्चतम मौलिक खोज करें जिसकी आपको आवश्यकता है और उस तक सीमित होने की संभावना है।

मौलिक खोजने में एफएफटी से बेहतर काम करेगा ऑटोकॉर्पेशन , अगर फंडामेंटिक्स की तुलना में मौलिक आयाम में कम है (या पूरी तरह से गायब है, लेकिन यह गिटार के साथ एक मुद्दा नहीं है):

यहां छवि विवरण दर्ज करें

आप मौलिक और कम से कम हार्मोनिक्स पर जोर देने के लिए कम आवृत्तियों को भारित करने की कोशिश कर सकते हैं, या इस तरह एक चोटी-पिकिंग एल्गोरिथ्म का उपयोग कर सकते हैं और फिर आवृत्ति में सबसे कम चुन सकते हैं।

इसके अलावा, आपको एफएफटी लागू करने से पहले अपने सिग्नल को विंडो करना चाहिए। आप इसे केवल एक विंडो फ़ंक्शन द्वारा गुणा करते हैं , जो आवृत्ति स्पेक्ट्रम क्लीनर बनाने के लिए तरंग की शुरुआत और अंत से दूर होता है। फिर आपको व्यापक के बजाय आवृत्ति घटकों के लिए लंबा संकीर्ण स्पाइक्स मिलते हैं।

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

यहाँ है इस सब के लिए मेरे उदाहरण पायथन कोड


यह वही है जिसकी मुझे तलाश थी, बहुत अच्छा जवाब, धन्यवाद!
वैलेंटाइन रादु

2
टेप किए गए विंडो फ़ंक्शन द्वारा गुणा करने से वास्तव में आपके सिग्नल में कोई वर्णक्रमीय रेखाएं निकल जाएंगी, जिससे वे व्यापक हो जाएंगे। यह आपको क्या खरीद सकता है, हालांकि, गतिशील रेंज है, जो आपको पहचानने की अनुमति देता है, उदाहरण के लिए, एक उच्च-शक्ति हस्तक्षेप करने वाली टोन की उपस्थिति में एक बहुत कम शक्ति वाली वर्णक्रमीय रेखा।
जेसन आर

@ जैसनआर ने यह तथ्य दिया कि यह ऐसे वातावरण में काम करने के लिए डिज़ाइन किया गया है जिसमें उच्च-शक्ति के हस्तक्षेप की टोन (एस) की संभावना वास्तव में कम है, क्या आप सुझाव देते हैं कि हैमिंग विंडो का उपयोग न करना बेहतर है?
वैलेंटाइन रादु

1
मैं पुष्टि कर सकता हूं कि हमिंग विंडो का उपयोग करने से मुझे रीडिंग स्थिर रखने के अपने लक्ष्य के करीब मिल गया। अभी, जब मैं एक ए 4 खेलता हूं तो मुझे ज्यादातर समय 440 हर्ट्ज मिलता है और केवल बहुत कम ही मुझे 650 हर्ट्ज या इतने के करीब पढ़ने को मिलता है। मैं अनुमान लगा रहा हूं कि वे हार्मोनिक्स हैं? इसके अलावा, मैं नोटिस में मदद नहीं कर सकता कि उच्च आवृत्ति के लिए ऐप निर्दोष काम करता है और कम के लिए यह विफल होने लगता है। शायद इसलिए कि मैं चरम परिमाण आवृत्ति बिन का पता लगाने के लिए FTT का उपयोग कर रहा हूं और निम्न आवृत्तियों के लिए हमेशा मौलिक नहीं है?
वैलेंटाइन रादु

1
@mindnoise: 660 हर्ट्ज 440 हर्ट्ज का हार्मोनिक नहीं है, लेकिन यह 220 हर्ट्ज का एक हार्मोनिक है, या 440 के ऊपर एक सही पांचवां है। एक और स्ट्रिंग प्रतिध्वनि या विरूपण या कुछ और हो सकता है? यदि आप एफएफटी की साजिश रच सकते हैं और इसे देख सकते हैं तो इस तरह के मुद्दों का पता लगाना बहुत आसान है। हां, कम आवृत्तियों को फ़िल्टर किया जा सकता है और उच्चतर के सापेक्ष कम किया जा सकता है, या तो यांत्रिक प्रभावों से या आपके एनालॉग सर्किटरी द्वारा।
एंडोलिथ

12

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

इस स्टैकओवरफ़्लो प्रश्न में पिच के आकलन के कुछ वैकल्पिक तरीकों की एक सूची शामिल है जो बेहतर परिणाम दे सकती है।

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

ADDED # 2: यह इतनी बार पूछा जाता है कि मैंने इस विषय पर एक लंबा ब्लॉग पोस्ट लिखा: http://www.musepaw.com/2012/04/musical-pitch-is-not-just-fft-frequency.html


बस उस ब्लॉग पर गए (और टिप्पणी की) जो आपने अभी हमें भेजा है।
रॉबर्ट ब्रिस्टो-जॉनसन

5

मैंने पॉलीफोनिक संगीत पर पिच का पता लगाने में कई साल बिताए - जैसे कि एक एमपी 3 रिकॉर्डिंग के भीतर एक गिटार एकल के नोट्स का पता लगाना। मैंने विकिपीडिया पर एक खंड भी लिखा है जो प्रक्रिया का संक्षिप्त विवरण देता है (नीचे दिए गए लिंक में "पिच का पता लगाने" उपधारा देखें)।

जब एक एकल कुंजी को एक पियानो पर दबाया जाता है, तो जो हम सुनते हैं वह ध्वनि कंपन की केवल एक आवृत्ति नहीं है, बल्कि विभिन्न गणितीय रूप से संबंधित आवृत्तियों पर होने वाले कई ध्वनि कंपन का एक संयोजन है। विभिन्न आवृत्तियों पर कंपन के इस सम्मिश्रण के तत्वों को हार्मोनिक्स या धारावाहिक के रूप में जाना जाता है। उदाहरण के लिए, यदि हम पियानो पर मिडिल सी की दबाते हैं, तो कम्पोजिट के हारमोन्स की व्यक्तिगत आवृत्तियों को 261.6 हर्ट्ज पर मौलिक आवृत्ति के रूप में शुरू किया जाएगा, 523 हर्ट्ज दूसरा हार्मोनिक होगा, 785 हर्ट्ज 3 जी हार्मोनिक होगा, 1046 हर्ट्ज होगा 4 डी हार्मोनिक होना, आदि बाद के हार्मोनिक्स मौलिक आवृत्ति के पूर्णांक गुणक हैं, 261.6 हर्ट्ज (उदा: 2 x 261.6 = 523, 3 x 261.6 = 785, 4 x 261.6 = 1046)।

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

अब समाप्त किया जा रहा है, मैं कहा जाता है एक नि: शुल्क प्रदर्शन अनुप्रयोग के भीतर मेरी पिच का पता लगाने इंजन के लिए स्रोत कोड जारी करने के लिए फैसला किया है PitchScope प्लेयर । PitchScope Player वेब पर उपलब्ध है, और आप Windows के निष्पादन योग्य डाउनलोड को मेरे एल्गोरिथ्म को अपने चुनने के एमपी 3 फ़ाइल पर काम पर देख सकते हैं। GitHub.com का नीचे दिया गया लिंक आपको मेरे पूर्ण स्रोत कोड तक ले जाएगा जहां आप देख सकते हैं कि मैं कस्टम लॉगरिदमिक डीएफटी ट्रांसफॉर्म के साथ हारमोंस का पता कैसे लगा सकता हूं, और फिर ऐसे भाग (हार्मोनिक्स) खोजता हूं, जिनकी आवृत्तियों से सही एंगर संबंध संतुष्ट हो जाता है, जो 'परिभाषित करता है' पिच '।

मेरा पिच डिटेक्शन एलगोरिदम वास्तव में एक दो चरण की प्रक्रिया है: ए) पहले स्केलपेक का पता लगाया जाता है ('स्केलपाइच' में 12 संभावित पिच मान हैं: {ई, एफ, एफ #, जी, जी #, ए, ए #, बी, सी, सी #, डी। , D #}) b) और ScalePitch निर्धारित होने के बाद, फिर ऑक्टेव की गणना 4 संभावित ऑक्टेव-कैंडिडेट नोटों के सभी हार्मोनिक्स की जांच करके की जाती है। एल्गोरिथ्म को एक पॉलीफोनिक एमपी 3 फ़ाइल के भीतर किसी भी समय सबसे प्रमुख पिच (एक संगीत नोट) का पता लगाने के लिए डिज़ाइन किया गया है। यह आमतौर पर एक वाद्य एकल के नोटों से मेल खाती है। मेरे 2 स्टेज पिच डिटेक्शन एल्गोरिथ्म के लिए C ++ स्रोत कोड में रुचि रखने वाले लोग GitHub.com पर SPitchCalc.cpp फ़ाइल के भीतर Estimate_ScalePitch () फ़ंक्शन को शुरू करना चाहते हैं।

https://github.com/CreativeDetectors/PitchScope_Player

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

नीचे एक पॉलीफोनिक एमपी 3 रिकॉर्डिंग पर गिटार सोलो के 3 सेकंड के लिए एक लॉगरिदमिक डीएफटी (मेरे सी ++ सॉफ़्टवेयर द्वारा बनाई गई) की छवि है। यह दर्शाता है कि एकल खेलते समय गिटार पर व्यक्तिगत नोटों के लिए हारमोंस कैसे दिखाई देते हैं। इस लॉगरिदमिक डीएफटी पर प्रत्येक नोट के लिए हम इसके कई हार्मोनिक्स को लंबवत रूप से देख सकते हैं, क्योंकि प्रत्येक हार्मोनिक की एक ही समय-चौड़ाई होगी। नोट का ऑक्टेव निर्धारित होने के बाद, हम फंडामेंटल की आवृत्ति जानते हैं।

यहां छवि विवरण दर्ज करें

नीचे दिए गए आरेख में ऑक्टेव डिटेक्शन एल्गोरिदम दिखाया गया है, जिसे मैंने सही ऑक्टेव-कैंडिडेट नोट (यानी, सही फंडामेंटल) लेने के लिए विकसित किया है, एक बार उस नोट के लिए स्केल स्केल निर्धारित किया गया है। C ++ में उस विधि को देखने के इच्छुक लोगों को FundCandidCalcer.cpp नामक फाइल के अंदर Calc_Best_Octave_Candidate () फ़ंक्शन पर जाना चाहिए, जो GitHub में मेरे स्रोत कोड में निहित है।

यहां छवि विवरण दर्ज करें


जेम्स, क्या आपका डीएफटी पिच डिटेक्टर एक लापता (या कमजोर) मौलिक के साथ नोटों का पता लगाता है?
रॉबर्ट ब्रिस्टो-जॉनसन

हां, मेरा 2 स्टेज पिच डिटेक्शन एल्गोरिदम नोटों का पता लगाएगा, भले ही सिग्नल में "गायब (या कमजोर) मौलिक" हो - यह इस 2 चरण की प्रक्रिया की एक बड़ी ताकत है। फंडामेंटल दूसरे चरण में निर्धारित किया जाता है जब ऑक्टेव डिटेक्शन उस समय-चौड़ाई पर किया जाता है जिसे आप लॉगरिदमिक डीएफटी आरेख पर नोट्स के लिए देखते हैं। चूँकि यह पिच डिटेक्शन फंक्शन एक पॉलीफोनिक एमपी सिग्नल की उलझन के भीतर काम करता है, यह उन नोटों का पता लगाएगा जो फंडामेंटल सहित कई हार्मोनिक्स गायब हैं। मैंने अभी इस उत्तर को एक दूसरे आरेख में जोड़ा है जो मेरे ऑक्टेव डिटेक्शन एल्गोरिदम को समझाता है।
जेम्स पॉल मिलार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.