विषयसूची:

Arduino संगीत नोट्स डिटेक्टर: 3 चरण
Arduino संगीत नोट्स डिटेक्टर: 3 चरण

वीडियो: Arduino संगीत नोट्स डिटेक्टर: 3 चरण

वीडियो: Arduino संगीत नोट्स डिटेक्टर: 3 चरण
वीडियो: Arduino Music: Note Detector 2024, नवंबर
Anonim
Image
Image

सीमित मेमोरी और प्रोसेसिंग पावर के कारण विशेष रूप से Arduino पर ऑडियो सिग्नल से संगीत नोट्स का पता लगाना मुश्किल है। आम तौर पर, नोट शुद्ध साइन वेव नहीं होता है जिससे पता लगाना मुश्किल हो जाता है। यदि हम विभिन्न संगीत वाद्ययंत्रों के आवृत्ति परिवर्तन को लें, तो इसमें बजाए जाने वाले नोट के आधार पर कई हार्मोनिक्स हो सकते हैं। प्रत्येक उपकरण का विभिन्न हार्मोनिक्स का अपना हस्ताक्षर संयोजन होता है। इस कोड में, मैंने एक ऐसा प्रोग्राम बनाने की कोशिश की जो अधिक से अधिक उपकरणों को कवर कर सके। आप संलग्न वीडियो का उल्लेख कर सकते हैं जिसमें मैंने विभिन्न प्रकार के उपकरणों का परीक्षण करने की कोशिश की, कीबोर्ड द्वारा उत्पन्न विभिन्न प्रकार के स्वर, और यहां तक कि स्वर की ध्वनि की भी जाँच की जाती है। पता लगाने की सटीकता उपकरण से उपकरण में भिन्न होती है। सीमित रेंज (200-500 हर्ट्ज) में कुछ उपकरण (यानी पियानो) के लिए यह सटीक है, जबकि कुछ उपकरणों में इसकी सटीकता कम है (यानी हारमोनिका)।

यह कोड पहले से विकसित FFT कोड का उपयोग करता है जिसे EasyFFT कहा जाता है।

कोड का प्रदर्शन उपरोक्त वीडियो में विभिन्न प्रकार के इंस्ट्रूमेंट साउंड के साथ-साथ वोकल के साथ दिखाया गया है।

आपूर्ति

- अरुडिनो नैनो/यूनो या इसके बाद के संस्करण

- Arduino के लिए माइक्रोफ़ोन मॉड्यूल

चरण 1: नोट डिटेक्शन के लिए एल्गोरिथम

जैसा कि पिछले चरण में उल्लेख किया गया है, ऑडियो नमूनों में कई आवृत्तियों की उपस्थिति के कारण पता लगाना मुश्किल है।

कार्यक्रम निम्नलिखित प्रवाह में काम करता है:

1. डाटा अधिग्रहण:

- यह खंड ऑडियो डेटा से 128 नमूने लेता है, ब्याज की आवृत्ति के आधार पर दो नमूनों (नमूना आवृत्ति) के बीच अलगाव। इस मामले में, हम दो नमूनों के बीच रिक्ति का उपयोग कर रहे हैं जिसका उपयोग हन विंडो फ़ंक्शन के साथ-साथ आयाम/आरएमएस गणना को लागू करने के लिए किया जाता है। यह कोड एनालॉग्रेड मान से 500 घटाकर रफ ज़ीरोइंग भी करता है। यदि आवश्यक हो तो यह मान बदला जा सकता है। एक विशिष्ट मामले के लिए, यह मान अच्छी तरह से काम करता है। इसके अलावा, लगभग 1200Hz की नमूना आवृत्ति के लिए कुछ देरी को जोड़ने की आवश्यकता है। 1200 हर्ट्ज नमूना आवृत्ति के मामले में अधिकतम 600 हर्ट्ज आवृत्ति का पता लगाया जा सकता है।

for(int i=0;i<128;i++) {a=analogRead(Mic_pin)-500; // रफ जीरो शिफ्ट सम1=sum1+a; // औसत मूल्य के लिए sum2=sum2+a*a; // से आरएमएस मान a=a*(sin(i*3.14/128)*sin(i*3.14/128)); // हन विंडो = ४ * ए; // फ्लोट के लिए स्केलिंग से इंट रूपांतरण देरीमाइक्रोसेकंड (195); // ऑपरेशन फ़्रीक्वेंसी रेंज के आधार पर}

2. एफएफटी:

डेटा तैयार होने के बाद, EasyFFT का उपयोग करके FFT किया जाता है। यह EasyFFT फ़ंक्शन 128 नमूनों के लिए FFT को ठीक करने के लिए संशोधित किया गया है। स्मृति खपत को कम करने के लिए कोड को भी संशोधित किया गया है। मूल EasyFFT फ़ंक्शन को 1028 नमूने (संगत बोर्ड के साथ) के लिए डिज़ाइन किया गया है, जबकि हमें केवल 128 नमूनों की आवश्यकता है। यह कोड मूल EasyFFT फ़ंक्शन की तुलना में लगभग 20% की मेमोरी खपत को कम करता है।

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

3. प्रत्येक चोटी के लिए, कोड इसके साथ जुड़े संभावित नोटों का पता लगाता है। यह कोड केवल 1200 हर्ट्ज तक स्कैन करता है। अधिकतम आयाम के साथ आवृत्ति के समान नोट करना आवश्यक नहीं है।

सभी आवृत्तियों को 0 से 255 के बीच मैप किया जाता है, यहां पहले सप्तक का पता लगाया गया है, उदाहरण के लिए, 65.4 हर्ट्ज से 130.8 एक सप्तक का प्रतिनिधित्व करता है, 130.8 हर्ट्ज से 261.6 हर्ट्ज दूसरे का प्रतिनिधित्व करता है। प्रत्येक सप्तक के लिए, आवृत्तियों को 0 से 255 तक मैप किया जाता है। यहां मैपिंग सी से सी तक शुरू होती है।

अगर(f_peaks>1040){f_peaks=0;} if(f_peaks>=65.4 && f_peaks=130.8 && f_peaks=261.6 && f_peaks=523.25 && f_peaks =१०४६ && f_peaks<=2093) {f_peaks=255*((f_peaks/1046)-1);}

NoteV सरणी मानों का उपयोग नोट को ज्ञात आवृत्तियों को असाइन करने के लिए किया जाता है।

बाइट NoteV[13]={8, 23, 40, 57, 76, 96, 116, 138, 162, 187, 213, 241, 255};

4. प्रत्येक बारंबारता के लिए नोट की गणना करने के बाद ऐसा हो सकता है कि कई बारंबारताएं मौजूद हों जो एक ही नोट का सुझाव देती हों। एक सटीक आउटपुट कोड होना भी दोहराव पर विचार करता है। कोड आयाम क्रम और दोहराव के आधार पर सभी आवृत्ति मानों को जोड़ता है और अधिकतम आयाम के साथ नोट को शिखर पर रखता है।

चरण 2: आवेदन

कोड का उपयोग सीधे आगे है, हालाँकि, कई सीमाएँ भी हैं जिन्हें इसे ध्यान में रखने की आवश्यकता है। कोड को कॉपी किया जा सकता है क्योंकि इसका उपयोग नोट डिटेक्शन के लिए किया जाता है। इसका उपयोग करते समय नीचे दिए गए बिंदुओं पर विचार करने की आवश्यकता है।

1. पिन असाइनमेंट:

संलग्न पिन के आधार पर असाइनमेंट को संशोधित करने की आवश्यकता है। अपने प्रयोग के लिए, मैंने इसे एनालॉग पिन 7 पर रखा, शून्य सेटअप () {Serial.begin (२५००००); माइक_पिन = ए7; }

2. माइक्रोफोन संवेदनशीलता:

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

3. आयाम दहलीज:

यह कोड तभी सक्रिय होता है जब सिग्नल का आयाम पर्याप्त हो। इस सेटिंग को उपयोगकर्ता द्वारा मैन्युअल रूप से सेट करने की आवश्यकता है। यह मान माइक्रोफ़ोन संवेदनशीलता के साथ-साथ अनुप्रयोग पर भी निर्भर करता है।

अगर(sum2-sum1>5){

..

उपरोक्त कोड में, sum2 RMS मान देता है जबकि योग 1 माध्य मान देता है। इसलिए इन दो मानों के बीच का अंतर ध्वनि संकेत का आयाम देता है। मेरे मामले में, यह लगभग 5 के आयाम मान के साथ ठीक से काम करता है।

4. डिफ़ॉल्ट रूप से, यह कोड पता लगाए गए नोट को प्रिंट करेगा। हालाँकि, यदि आप किसी अन्य उद्देश्य के लिए नोट का उपयोग करने की योजना बना रहे हैं, तो सीधे निर्दिष्ट संख्या का उपयोग किया जाना चाहिए। उदाहरण के लिए सी = 0; सी # = 1, डी = 2, डी # = 3 और आगे।

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

{a=analogRead(Mic_pin)-500; // रफ जीरो शिफ्ट

योग 1 = योग 1 + ए; // औसत मूल्य के लिए sum2=sum2+a*a; // से आरएमएस मान a=a*(sin(i*3.14/128)*sin(i*3.14/128)); // हन विंडो = ४ * ए; // फ्लोट के लिए स्केलिंग से इंट रूपांतरण देरीमाइक्रोसेकंड (195); // ऑपरेशन फ़्रीक्वेंसी रेंज के आधार पर}

6. यह कोड 2000Hz फ़्रीक्वेंसी तक ही काम करेगा। नमूने के बीच की देरी को समाप्त करके लगभग 3-4 kHz नमूना आवृत्तियों को प्राप्त किया जा सकता है।

एहतियात:

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

चरण 3: सारांश

नोट का पता लगाना कम्प्यूटेशनल रूप से गहन कार्य है, विशेष रूप से Arduino पर रीयल-टाइम आउटपुट प्राप्त करना बहुत मुश्किल है। यह कोड लगभग 6.6 नमूने/सेकंड दे सकता है (195 माइक्रोसेकंड विलंब के लिए जोड़ा गया)। यह कोड पियानो और कुछ अन्य उपकरणों के साथ अच्छी तरह से काम करता है।

मुझे आशा है कि यह कोड और ट्यूटोरियल संगीत से संबंधित आपके प्रोजेक्ट में सहायक होंगे। किसी भी संदेह या सुझाव के मामले में टिप्पणी या संदेश के लिए स्वतंत्र महसूस करें।

आगामी ट्यूटोरियल में, मैं संगीत कॉर्ड डिटेक्शन के लिए इस कोड को संशोधित करूंगा। तो मिले रहें ।

सिफारिश की: