Mundarija:
Video: Arduino musiqa notalari detektori: 3 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:24
Ovoz signalidan musiqiy yozuvlarni aniqlash, ayniqsa xotira va ishlov berish quvvati cheklanganligi sababli, Arduino -da qiyin. Odatda, nota aniq sinus to'lqin emas, bu aniqlanishni qiyinlashtiradi. Agar biz turli xil musiqa asboblarining chastotali o'zgarishini olsak, u chalayotgan notaga asoslangan holda bir nechta harmonikani o'z ichiga olishi mumkin. Har bir asbob turli xil harmonikalarning o'ziga xos imzo kombinatsiyasiga ega. Ushbu kodda men imkon qadar ko'proq asboblarni qamrab oladigan dastur tuzishga harakat qildim. Siz har xil turdagi asboblarni, klaviatura tomonidan ishlab chiqarilgan har xil ohanglarni va hatto vokal ovozini tekshirishga harakat qilgan videoga havola qilishingiz mumkin. Aniqlikning aniqligi asbobdan asbobga farq qiladi. Cheklangan diapazonda (200-500 Gts) ba'zi asboblar (ya'ni pianino) uchun bu aniq, ba'zi asboblarda esa aniqligi past (ya'ni Harmonica).
Bu kod ilgari ishlab chiqilgan EasyFFT deb nomlangan FFT kodidan foydalanadi.
Kodning namoyishi yuqoridagi videoda har xil turdagi asboblar ovozi va vokal bilan ko'rsatilgan.
Ta'minotlar
- Arduino Nano/Uno yoki undan yuqori
- Arduino uchun mikrofon moduli
1 -qadam: Eslatmalarni aniqlash algoritmi
Oldingi bosqichda aytib o'tilganidek, audio namunalarda bir nechta chastotalar mavjudligi sababli aniqlash qiyin.
Dastur quyidagi oqimda ishlaydi:
1. Ma'lumot olish:
- bu bo'lim audio ma'lumotlardan 128 ta namuna oladi, qiziqish chastotasiga qarab ikkita namunani ajratish (namuna olish chastotasi). Bunday holda, biz ikkita namuna orasidagi masofani ishlatamiz, Hann oynasi funktsiyasini, shuningdek amplituda/RMS hisobini qo'llaymiz. Bu kod, shuningdek, analog o'qish qiymatidan 500 ni olib, qo'pol nollashni amalga oshiradi. Agar kerak bo'lsa, bu qiymatni o'zgartirish mumkin. Oddiy holat uchun bu qiymatlar yaxshi ishlaydi. 1200Hz atrofida namuna olish chastotasiga ega bo'lish uchun biroz kechikish qo'shilishi kerak. 1200 Gts namuna olish chastotasida maksimal 600 HZ chastotasini aniqlash mumkin.
uchun (int i = 0; i <128; i ++) {a = analogRead (Mic_pin) -500; // qo'pol nol siljish sum1 = sum1+a; // o'rtacha qiymatga sum2 = sum2+a*a; // RMS qiymatiga a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // Xann oynasi = 4*a; // float to int konvertatsiya kechiktirishini o'lchash Mikrosaniyalar (195); // operatsion chastota diapazoniga asoslangan}
2. FFT:
Ma'lumot tayyor bo'lgach, FFT EasyFFT yordamida amalga oshiriladi. Bu EasyFFT funktsiyasi 128 ta namuna uchun FFTni tuzatish uchun o'zgartirilgan. Shuningdek, xotira sarfini kamaytirish uchun kod o'zgartirilgan. Original EasyFFT funktsiyasi 1028 tagacha namunaga ega bo'lishi uchun mo'ljallangan (mos keladigan karta bilan), bizga faqat 128 ta namuna kerak. Bu kod xotira sarfini 20% ga kamaytiradi, bu esa EasyFFT funksiyasiga nisbatan.
FFT tugagandan so'ng, kod keyingi tahlil qilish uchun eng tez -tez uchraydigan beshta eng yuqori chastotani qaytaradi. Bu chastota amplitudaning kamayish tartibida joylashtirilgan.
3. Har bir tepalik uchun kod u bilan bog'liq bo'lishi mumkin bo'lgan yozuvlarni aniqlaydi. bu kod faqat 1200 Gts gacha skanerlaydi. Maksimal amplitudali chastotani eslatib o'tish shart emas.
Barcha chastotalar 0 dan 255 gacha, bu erda birinchi oktava aniqlanadi, masalan, 65,4 Gts dan 130,8 gacha bitta oktavani, 130,8 Gts dan 261,6 Gts gacha boshqasini ifodalaydi. Har bir oktava uchun chastotalar 0 dan 255 gacha xaritaga tushiriladi. Bu erda xaritalar C dan C gacha boshlanadi.
if (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 = 1046 && f_peaks <= 2093) {f_peaks = 255*((f_peaks /1046) -1);}
NoteV massiv qiymatlari eslatmani aniqlangan chastotalarga berish uchun ishlatiladi.
bayt NoteV [13] = {8, 23, 40, 57, 76, 96, 116, 138, 162, 187, 213, 241, 255};
4. Har bir chastota uchun eslatmani hisoblab chiqqandan so'ng, bir xil chastotalar mavjud bo'lishi mumkin. To'g'ri chiqish kodiga ega bo'lish uchun takroriylik ham hisobga olinadi. Kod barcha chastota qiymatlarini amplitudalar tartibiga va takrorlanishlariga qo'shib qo'yadi va maksimal amplitudali yozuvni tepaga ko'taradi.
2 -qadam: ariza
Kodni ishlatish to'g'ridan -to'g'ri, shu bilan birga, bir nechta cheklovlar mavjud bo'lib, ularni esdan chiqarmaslik kerak. Kodni nusxa ko'chirish mumkin, chunki u yozuvlarni aniqlash uchun ishlatiladi. Uni ishlatishda quyidagi fikrlarni hisobga olish kerak.
1. Pinni belgilash:
Pin biriktirilgan ma'lumotlarga asoslanib, topshiriqni o'zgartirish kerak. Tajriba uchun men uni analog pin 7 da saqladim, void setup () {Serial.begin (250000); Mic_pin = A7; }
2. Mikrofon sezgirligi:
Mikrofon sezgirligini o'zgartirish kerak, bunday to'lqin shaklini yaxshi amplituda yaratish mumkin. Ko'pincha, mikrofon moduli sezuvchanlik sozlamalari bilan ta'minlangan. signal juda kichik emas va amplitudasi yuqori bo'lgani uchun uzilmaydigan darajada sezgirlikni tanlash kerak.
3. Amplituda chegarasi:
Bu kod faqat signal amplitudasi etarlicha yuqori bo'lsa faollashadi. bu sozlamani foydalanuvchi qo'lda o'rnatishi kerak. Bu qiymat mikrofonning sezgirligiga va dasturga bog'liq.
agar (sum2-sum1> 5) {
..
yuqoridagi kodda sum2 RMS qiymatini beradi, sum 1 esa o'rtacha qiymatni beradi. shuning uchun bu ikki qiymat o'rtasidagi farq tovush signalining amplitudasini beradi. mening holatimda, u 5 atrofida amplitudali qiymat bilan to'g'ri ishlaydi.
4. Odatiy bo'lib, bu kod aniqlangan yozuvni chop etadi. ammo, agar siz eslatmani boshqa maqsadda ishlatmoqchi bo'lsangiz, to'g'ridan -to'g'ri tayinlangan raqamdan foydalanish kerak. masalan C = 0; C#= 1, D = 2, D#= 3 va undan keyin.
5. Agar asbob yuqori chastotali bo'lsa, kod noto'g'ri chiqishni berishi mumkin. maksimal chastota namuna olish chastotasi bilan chegaralanadi. shuning uchun siz optimal chiqish uchun kechikish qiymatlari ostida o'ynashingiz mumkin. pastdagi kodda 195 mikrosaniyada kechikish. eng yaxshi natijaga erishish uchun sozlanishi mumkin. Bu umumiy bajarilish vaqtiga ta'sir qiladi.
{a = analogRead (Mic_pin) -500; // qo'pol nol siljishi
sum1 = sum1+a; // o'rtacha qiymatga sum2 = sum2+a*a; // RMS qiymatiga a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // Xann oynasi = 4*a; // float to int konvertatsiya kechiktirishini o'lchash Mikrosaniyalar (195); // operatsion chastota diapazoniga asoslangan}
6. bu kod faqat 2000Hz chastotagacha ishlaydi. 3-4 kHz atrofida namuna olish orasidagi kechikishni yo'q qilish orqali namuna olish chastotalarini olish mumkin.
Ehtiyot choralari:
- EasyFFT qo'llanmasida aytib o'tilganidek, FFT Arduino xotirasining katta hajmini yutadi. Agar sizda ba'zi qiymatlarni saqlash kerak bo'lgan dastur bo'lsa, xotirasi yuqori bo'lgan taxtadan foydalanish tavsiya etiladi.
- Bu kod bitta asbob/vokalchi uchun yaxshi, boshqasi uchun yomon ishlashi mumkin. Hisoblash cheklovlari tufayli aniq vaqtda aniq aniqlash mumkin emas.
3 -qadam: yoz
Eslatmalarni aniqlash-bu juda intensiv ish, real vaqtda chiqish juda qiyin, ayniqsa Arduino-da. Bu kod 6,6 ta namuna /soniya berishi mumkin (195 mikrosaniyali kechikish qo'shilgan). bu kod pianino va boshqa asboblar bilan yaxshi ishlaydi.
Umid qilamanki, ushbu kod va darslik sizning musiqangiz bilan bog'liq loyihangizda foydali bo'ladi. har qanday shubha yoki taklif bo'lsa, izoh yoki xabar yuboring.
Kelgusi darslikda men musiqa akkordlarini aniqlash uchun ushbu kodni o'zgartiraman. shuning uchun kutib turing.
Tavsiya:
Arduino va estafeta bilan musiqa: 6 qadam
Musiqa Arduino va Relay bilan: bu darslikda men sizga estafeta va Arduino bilan yangi boshlanuvchilar uchun qiziqarli loyiha yordamida qanday musiqa yaratishni ko'rsataman
Astronomiya tobuti raqsi, Arduino Uno yordamida musiqa: 5 qadam
Astronomiya tobuti raqsi, Arduino Uno yordamida musiqa: Bu blog biz sizga ko'rsatdik Astronomiya tobutining raqsi, Arduino Uno bilan, Hammangiz bilasizki, tobut raqsi astronomiyasi haqida memlar yozish haqida, shuning uchun men bu ohangni arduino uno yordamida yasashga qaror qildim. bu loyihada
Musiqa assambleyasi: Sensorli blokli o'rnatilgan virtual musiqa asbobi: 4 qadam
Musiqa assambleyasi: Sensorli blokli o'rnatilgan virtual musiqa asbobi: Ko'pchilik musiqa asboblarini chalishni o'rganmoqchi. Afsuski, ularning ba'zilari asboblarning yuqori narxi tufayli ishga tushmaydilar. Bunga asoslanib, biz boshlang'ich byudjetini kamaytirish uchun birlashtirilgan virtual musiqa asboblari tizimini yaratishga qaror qildik
Musiqa chiroq W/ Arduino: 6 qadam
Musiqa lampasi W/ Arduino: Bu men va mening sherigim (Adrian Kalvo) universitetimizdagi kurslardan birining loyihasi. Loyiha Arduino asosidagi musiqa qutisidan iborat. Musiqa piezo buzzer orqali ijro etiladi, ohanglari biz bilgan 8bitli musiqaga o'xshaydi. Quti h
Arduino musiqa pleyeri: 5 qadam
Arduino musiqa pleyeri: Hammaga salom Kecha men Internetda bemaqsad qilardim va Arduino -da qila oladigan loyihalarni qidirardim. Men bu xonim qo'shiqlari yozilgan elektron pianino klaviaturasini yasayotganini ko'rdim. Menda LCD klaviatura qalqoni bor edi, shuning uchun men masofani bosib o'taman deb o'yladim