Satura rādītājs:

Arduino mūzikas piezīmju detektors: 3 soļi
Arduino mūzikas piezīmju detektors: 3 soļi

Video: Arduino mūzikas piezīmju detektors: 3 soļi

Video: Arduino mūzikas piezīmju detektors: 3 soļi
Video: Пробуем USB MIDI-контроллер Playtron 2024, Jūlijs
Anonim
Image
Image

Mūzikas piezīmju noteikšana no audio signāla ir sarežģīta, jo īpaši Arduino, jo ir ierobežota atmiņa un apstrādes jauda. Parasti piezīme nav tīrs sinusa vilnis, kas apgrūtina noteikšanu. Ja mēs ņemam vērā dažādu mūzikas instrumentu frekvenču pārveidošanu, tie var saturēt vairākas harmonikas, pamatojoties uz atskaņoto noti. Katram instrumentam ir sava dažādu harmoniku kombinācija. Šajā kodā es mēģināju izveidot programmu, kas var aptvert pēc iespējas vairāk instrumentu. Jūs varat atsaukties uz pievienoto video, kurā es mēģināju pārbaudīt dažāda veida instrumentus, tiek pārbaudīti dažādi tastatūras ģenerētie toņi un pat vokāla skaņa. Noteikšanas precizitāte dažādiem instrumentiem atšķiras. Dažiem instrumentiem (piemēram, klavierēm) ierobežotā diapazonā (200–500 Hz) tas ir precīzs, bet dažiem instrumentiem-zema precizitāte (t.i., harmonikas).

Šis kods izmanto iepriekš izstrādātu FFT kodu, ko sauc par EasyFFT.

Koda demonstrācija ir parādīta iepriekš redzamajā video ar dažāda veida instrumentu skaņu, kā arī vokālu.

Piegādes

- Arduino Nano/Uno vai augstāk

- Mikrofona modulis Arduino

1. darbība. Piezīmju noteikšanas algoritms

Kā minēts iepriekšējā solī, noteikšana ir sarežģīta, jo audio paraugos ir vairākas frekvences.

Programma darbojas šādā secībā:

1. Datu iegūšana:

- šajā sadaļā tiek ņemti 128 paraugi no audio datiem, atdalot divus paraugus (paraugu ņemšanas biežums) atkarībā no interesējošās frekvences. Šajā gadījumā mēs izmantojam atstarpi starp diviem paraugiem, lai izmantotu Hann loga funkciju, kā arī amplitūdas/RMS aprēķinu. Šis kods arī veic aptuvenu nulli, atņemot 500 no analoglasījuma vērtības. Ja nepieciešams, šo vērtību var mainīt. Tipiskā gadījumā šīs vērtības darbojas labi. Turklāt ir jāpievieno zināma aizture, lai paraugu ņemšanas frekvence būtu aptuveni 1200 Hz. 1200 Hz paraugu ņemšanas frekvences gadījumā var noteikt maksimālo 600 HZ frekvenci.

par (int i = 0; i <128; i ++) {a = analogRead (Mic_pin) -500; // aptuvenā nulles nobīdes summa1 = summa1+a; // līdz vidējai vērtībai summa2 = summa2+a*a; // uz RMS vērtību a = a*(sin (i*3,14/128)*sin (i*3,14/128)); // Hanna logs = 4*a; // mērogošana pludiņam uz int konversijas aizkaviMikrosekundes (195); // pamatojoties uz darbības frekvenču diapazonu}

2. FFT:

Kad dati ir gatavi, FFT tiek veikta, izmantojot EasyFFT. Šī EasyFFT funkcija ir pārveidota, lai fiksētu FFT 128 paraugiem. Kods ir arī mainīts, lai samazinātu atmiņas patēriņu. Oriģinālā EasyFFT funkcija, kas paredzēta līdz 1028 paraugiem (ar saderīgu plāksni), savukārt mums ir nepieciešami tikai 128 paraugi. šis kods samazina atmiņas patēriņu par aptuveni 20% salīdzinājumā ar sākotnējo EasyFFT funkciju.

Kad FFT ir izdarīts, kods tālākai analīzei atgriež piecas dominējošākās frekvences virsotnes. Šī frekvence ir sakārtota dilstošā amplitūdas secībā.

3. Katram pīķim kods nosaka iespējamās ar to saistītās piezīmes. šis kods skenē tikai līdz 1200 Hz. Nav nepieciešams, lai piezīme būtu tāda pati kā frekvence ar maksimālo amplitūdu.

Visas frekvences ir kartētas no 0 līdz 255, šeit tiek konstatēta pirmā oktāva, piemēram, no 65,4 Hz līdz 130,8 ir viena oktāva, no 130,8 Hz līdz 261,6 Hz ir cita. Katrai oktāvai frekvences tiek kartētas no 0 līdz 255. šeit kartēšana, sākot no C līdz C '.

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 masīva vērtības tiek izmantotas, lai piešķirtu piezīmi konstatētajām frekvencēm.

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

4. Pēc piezīmes aprēķināšanas katrai frekvencei var gadīties, ka pastāv vairākas frekvences, kas liecina par vienu un to pašu piezīmi. Lai iegūtu precīzu izvades kodu, tiek ņemti vērā arī atkārtojumi. Kods saskaita visas frekvences vērtības, pamatojoties uz amplitūdas secību un atkārtojumiem, un piezīmē maksimālo amplitūdu.

2. darbība

Koda izmantošana ir vienkārša, taču ir arī vairāki ierobežojumi, kas jāpatur prātā, kamēr to izmanto. Kodu var kopēt, jo tas tiek izmantots piezīmju noteikšanai. Lietojot to, jāņem vērā tālāk minētie punkti.

1. Piespraudes piešķiršana:

Pamatojoties uz pievienoto Pin piešķiršanu, tas ir jāmaina. Eksperimentam es to turēju pie 7. analogās tapas, void setup () {Serial.begin (250000); Mic_pin = A7; }

2. Mikrofona jutība:

Mikrofona jutība ir jāmaina, un šādu viļņu formu var ģenerēt ar labu amplitūdu. Pārsvarā mikrofona modulim ir jutības iestatījums. jāizvēlas atbilstoša jutība, lai signāls nebūtu ne pārāk mazs, ne arī netiktu izgriezts augstākas amplitūdas dēļ.

3. Amplitūdas slieksnis:

Šis kods aktivizējas tikai tad, ja signāla amplitūda ir pietiekami augsta. šis iestatījums lietotājam ir jāiestata manuāli. šī vērtība ir atkarīga no mikrofona jutības, kā arī no lietojuma.

ja (summa2-summa1> 5) {

..

iepriekš minētajā kodā summa2 dod RMS vērtību, bet summa 1 - vidējo vērtību. tāpēc atšķirība starp šīm divām vērtībām dod skaņas signāla amplitūdu. manā gadījumā tas darbojas pareizi ar amplitūdas vērtību aptuveni 5.

4. Pēc noklusējuma šis kods izdrukās konstatēto piezīmi. tomēr, ja plānojat piezīmi izmantot kādam citam mērķim, jāizmanto tieši piešķirtais numurs. piemēram, C = 0; C#= 1, D = 2, D#= 3 un tālāk.

5. Ja instrumentam ir augstāka frekvence, kods var sniegt nepatiesu izvadi. maksimālo frekvenci ierobežo paraugu ņemšanas biežums. tāpēc, lai iegūtu optimālu izvadi, varat spēlēt zemāk par aizkaves vērtībām. zem koda aizkaves 195 mikrosekundes. ko var pielāgot, lai iegūtu optimālu rezultātu. Tas ietekmēs kopējo izpildes laiku.

{a = analogRead (Mic_pin) -500; // aptuvena nulles nobīde

summa1 = summa1+a; // līdz vidējai vērtībai summa2 = summa2+a*a; // uz RMS vērtību a = a*(sin (i*3,14/128)*sin (i*3,14/128)); // Hanna logs = 4*a; // mērogošana pludiņam uz int konversijas aizkaviMikrosekundes (195); // pamatojoties uz darbības frekvenču diapazonu}

6. šis kods darbosies tikai līdz 2000Hz frekvencei. novēršot aizkavi starp paraugu ņemšanu, var iegūt aptuveni 3-4 kHz paraugu ņemšanas frekvences.

Piesardzības pasākumi:

  • Kā minēts EasyFFT apmācībā, FFT patērē milzīgu Arduino atmiņu. Tātad, ja jums ir programma, kurai ir jāsaglabā dažas vērtības, ieteicams izmantot tāfeli ar lielāku atmiņu.
  • Šis kods var labi darboties vienam instrumentam/vokālistam un slikts citam. Reālā laikā Precīza noteikšana nav iespējama skaitļošanas ierobežojumu dēļ.

3. solis: vasara

Piezīmju noteikšana ir skaitļošanas ziņā intensīvs darbs, reāllaika izvades iegūšana ir ļoti sarežģīta, īpaši Arduino. Šis kods var dot aptuveni 6,6 paraugus sekundē (pievienota 195 mikrosekundes aizture). šis kods labi darbojas ar klavierēm un dažiem citiem instrumentiem.

Es ceru, ka šis kods un apmācība palīdzēs jūsu projektā, kas saistīts ar mūziku. ja rodas šaubas vai ieteikumi, nekautrējieties komentēt vai ziņot.

Gaidāmajā apmācībā es modificēšu šo kodu mūzikas akordu noteikšanai. tāpēc sekojiet līdzi.

Ieteicams: