Kazalo:
Video: Detektor glasbenih zapiskov Arduino: 3 koraki
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:03
Odkrivanje glasbenih zapisov iz zvočnega signala je težko, zlasti na Arduinu zaradi omejenega pomnilnika in procesorske moči. Na splošno opomba ni čisti sinusni val, ki otežuje odkrivanje. Če vzamemo frekvenčno transformacijo različnih glasbenih inštrumentov, lahko vsebuje več harmonik, ki temeljijo na noti, ki se igra. Vsak instrument ima svojo lastno kombinacijo različnih harmonikov. V tej kodi sem poskušal narediti program, ki bi lahko zajemal čim več instrumentov. Lahko si ogledate priloženi video, v katerem sem poskušal preizkusiti različne vrste inštrumentov, preveriti različne vrste tonov, ki jih ustvarja tipkovnica, in celo zvok vokala. Natančnost zaznavanja se razlikuje od instrumenta do instrumenta. Pri nekaterih inštrumentih (tj. Klavirju) v omejenem razponu (200-500Hz) je natančen, pri nekaterih instrumentih pa ima nizko natančnost (npr. Harmonika).
Ta koda uporablja predhodno razvito kodo FFT, imenovano EasyFFT.
Predstavitev kode je prikazana v zgornjem videu z različnimi vrstami zvoka instrumentov in vokalom.
Zaloge
- Arduino Nano/Uno ali novejši
- Modul mikrofona za Arduino
1. korak: Algoritem za zaznavanje zapiskov
Kot je bilo omenjeno v prejšnjem koraku, je odkrivanje težko zaradi prisotnosti več frekvenc v zvočnih vzorcih.
Program deluje v naslednjem toku:
1. Zbiranje podatkov:
- v tem razdelku je 128 vzorcev iz zvočnih podatkov, ločitev med dvema vzorcema (frekvenca vzorčenja) pa je odvisna od frekvence, ki nas zanima. V tem primeru uporabljamo razmik med dvema vzorcema za uporabo Hannove okenske funkcije in izračun amplitude/RMS. Ta koda izvede tudi grobo ničliranje tako, da od vrednosti analognega branja odšteje 500. To vrednost lahko po potrebi spremenite. Za tipičen primer te vrednosti dobro delujejo. Poleg tega je treba dodati nekaj zamude, da bo frekvenca vzorčenja okoli 1200Hz. pri frekvenci vzorčenja 1200Hz je mogoče zaznati največ 600 HZ frekvence.
for (int i = 0; i <128; i ++) {a = analogRead (Mic_pin) -500; // grobo ničelno premikanje sum1 = sum1+a; // do povprečne vrednosti sum2 = sum2+a*a; // v vrednost RMS a = a*(sin (i*3,14/128)*sin (i*3,14/128)); // Hannovo okno v = 4*a; // skaliranje zamika pretvorbe float v intMicroseconds (195); // glede na frekvenčni razpon delovanja}
2. FFT:
Ko so podatki pripravljeni, se FFT izvede z uporabo EasyFFT. Ta funkcija EasyFFT je spremenjena tako, da popravi FFT za 128 vzorcev. Koda je spremenjena tudi za zmanjšanje porabe pomnilnika. Prvotna funkcija EasyFFT, zasnovana tako, da ima do 1028 vzorcev (z združljivo ploščo), medtem ko potrebujemo le 128 vzorcev. ta koda zmanjša porabo pomnilnika za približno 20% v primerjavi s prvotno funkcijo EasyFFT.
Ko je FFT končan, koda vrne prvih 5 najbolj prevladujočih frekvenčnih vrhov za nadaljnjo analizo. Te frekvence so razporejene po padajočem vrstnem redu amplitude.
3. Za vsak vrh koda zazna morebitne opombe, povezane z njim. ta koda skenira le do 1200 Hz. Ni nujno, da je zapis enak frekvenci z največjo amplitudo.
Vse frekvence so preslikane med 0 in 255, tukaj je zaznana prva oktava, na primer 65,4 Hz do 130,8 predstavlja eno oktavo, 130,8 Hz do 261,6 Hz drugo. Za vsako oktavo so frekvence preslikane od 0 do 255. tukaj preslikave začenši od C do 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);}
Vrednosti matrike NoteV se uporabljajo za dodelitev note zaznanim frekvencam.
bajta NoteV [13] = {8, 23, 40, 57, 76, 96, 116, 138, 162, 187, 213, 241, 255};
4. Po izračunu note za vsako frekvenco se lahko zgodi, da obstaja več frekvenc, ki nakazujejo isto noto. Za natančno izhodno kodo so upoštevane tudi ponovitve. Koda sešteje vse vrednosti frekvence, ki temeljijo na vrstnem redu amplitud in ponovitvah, ter opombo doseže z največjo amplitudo.
2. korak: Aplikacija
Uporaba kode je preprosta, vendar je pri tem treba upoštevati tudi več omejitev. Kodo je mogoče kopirati, saj se uporablja za zaznavanje zapiskov. Pri uporabi je treba upoštevati spodnje točke.
1. Dodelitev zatičev:
Na podlagi priložene dodelitve Pin je treba spremeniti. Za svoj poskus sem ga obdržal na analognem pin 7, void setup () {Serial.begin (250000); Mic_pin = A7; }
2. Občutljivost mikrofona:
Občutljivost mikrofona je treba spremeniti, tako da se lahko oblikuje valovna oblika z dobro amplitudo. Večinoma ima modul mikrofon nastavitev občutljivosti. ustrezno občutljivost, ki jo je treba izbrati tako, da signal ni premajhen in se zaradi večje amplitude ne odreže.
3. Prag amplitude:
Ta koda se aktivira le, če je amplituda signala dovolj visoka. to nastavitev mora uporabnik nastaviti ročno. ta vrednost je odvisna od občutljivosti mikrofona in uporabe.
if (sum2-sum1> 5) {
..
v zgornji kodi sum2 daje vrednost RMS, vsota 1 pa srednjo vrednost. zato razlika med tema dvema vrednostma daje amplitudo zvočnega signala. v mojem primeru deluje pravilno z vrednostjo amplitude okoli 5.
4. Ta koda bo privzeto natisnila zaznano opombo. če pa nameravate beležko uporabiti za kakšen drug namen, je treba uporabiti neposredno dodeljeno številko. na primer C = 0; C#= 1, D = 2, D#= 3 in naprej.
5. Če ima instrument višjo frekvenco, lahko koda poda napačen izhod. največja frekvenca je omejena s frekvenco vzorčenja. tako da se lahko poigrate pod vrednostmi zakasnitve, da dobite optimalno moč. v spodnji zamudi kode 195 mikrosekund. ki jih je mogoče spremeniti, da bi dobili optimalno moč. To bo vplivalo na celoten čas izvedbe.
{a = analogRead (Mic_pin) -500; // grobi premik nič
vsota1 = vsota1+a; // do povprečne vrednosti sum2 = sum2+a*a; // v RMS vrednost a = a*(sin (i*3,14/128)*sin (i*3,14/128)); // Hannovo okno v = 4*a; // skaliranje zamika pretvorbe float v intMicroseconds (195); // glede na frekvenčni razpon delovanja}
6. ta koda bo delovala le do frekvence 2000Hz. z odpravo zakasnitve med vzorčenjem lahko dobimo frekvence vzorčenja okoli 3-4 kHz.
Previdnostni ukrepi:
- Kot je omenjeno v vadnici EasyFFT, FFT poje ogromno pomnilnika Arduina. Torej, če imate program, ki mora shraniti nekatere vrednosti, je priporočljivo uporabiti ploščo z večjim pomnilnikom.
- Ta koda lahko dobro deluje za enega inštrumenta/vokalista in slabo za drugega. Natančno zaznavanje v realnem času zaradi računalniških omejitev ni mogoče.
3. korak: Poletje
Zaznavanje zapiskov je računalniško intenzivno delo, pridobivanje rezultatov v realnem času je zelo težko, zlasti na Arduinu. Ta koda lahko daje približno 6,6 vzorcev /sekundo (za 195 mikrosekund je dodana zamuda). ta koda dobro deluje s klavirjem in nekaterimi drugimi instrumenti.
Upam, da sta vam ta koda in vadnica v pomoč pri vašem projektu, povezanem z glasbo. v primeru dvoma ali predloga vas prosimo, da komentirate ali pošljete sporočilo.
V prihajajoči vadnici bom to kodo spremenil za zaznavanje glasbenih akordov. zato ostanite z nami.
Priporočena:
Detektor glasbenih not: 3 koraki
Detektor glasbenih not: Presenetite svoje prijatelje in družino s tem projektom, ki zazna noto, ki jo igra instrument. Ta projekt bo prikazal približno frekvenco in glasbeno noto, ki se igra na elektronski klaviaturi, aplikaciji za klavir ali katerem koli drugem instrumentu. Podrobnosti
Stroj za kolo glasbenih vtisov nocojšnje oddaje: 7 korakov
Stroj za glasbene impresije Tonight Show -a: Navdih za ta stroj je iz segmenta Tonight Show -a z Jimmyjem Fallonom v klicu "Kolo glasbenih vtisov". Najprej pritisnete gumb na škatli in na plošči LCD se prikaže naključni pevec in pesem. Potem morate posnemati
Kako zgraditi lasten anemometer z uporabo trstičnih stikal, senzorja Hallovih učinkov in nekaj zapiskov na Nodemcu - 2. del - Programska oprema: 5 korakov (s slikami)
Kako zgraditi svoj lastni anemometer z uporabo trstičnih stikal, senzorja Hallovih učinkov in nekaj zapiskov na Nodemcu - 2. del - Programska oprema: Uvod To je nadaljevanje prve objave "Kako zgraditi svoj lastni anemometer z uporabo trstičnih stikal, senzorja Hall efekta in nekaterih ostankov" na Nodemcu - 1. del - Strojna oprema " - kjer pokažem, kako sestaviti merilnik hitrosti in smeri vetra
Comsave: Zaklepanje zapiskov (aplikacija paketne datoteke): 3 koraki
Comsave: Zaklepanje zapiskov (aplikacija paketne datoteke): Pozdravljeni, Comsaveit shrani vaše zapiske in jih zaklene. Prenesite samo priloženo paketno datoteko (v 1. koraku). Postavite jo v mapo in je NE premaknite iz mape ali paketna datoteka ne bo mogla najti vašega računa. OPOMBA: To je paketna datoteka. Na splošno je
IOT detektor dima: Posodobite obstoječi detektor dima z IOT: 6 korakov (s slikami)
IOT detektor dima: Posodobite obstoječi detektor dima z IOT: Seznam sodelavcev, Izumitelj: Tan Siew Chin, Tan Yit Peng, Tan Wee Heng Nadzornik: dr. Chia Kim Seng Oddelek za mehatronski in robotski inženiring, Fakulteta za elektrotehniko in elektroniko, Univerza Tun Hussein Onn Malaysia. Distributer