Turinys:
Video: „Arduino“muzikos užrašų detektorius: 3 žingsniai
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:45
Dėl ribotos atminties ir apdorojimo galios sunku nustatyti muzikos įrašus iš garso signalo, ypač naudojant „Arduino“. Paprastai pastaba nėra gryna sinusinė banga, kuri apsunkina aptikimą. Jei paimsime įvairių muzikos instrumentų dažnio transformaciją, jame gali būti kelios harmonikos, atsižvelgiant į grojamą natą. Kiekvienas instrumentas turi savitą įvairių harmonikų derinį. Šiuo kodu bandžiau sukurti programą, kuri galėtų apimti kuo daugiau instrumentų. Galite nurodyti pridėtą vaizdo įrašą, kuriame bandžiau išbandyti įvairių tipų instrumentus, tikrinami įvairių tipų klaviatūros sukurti tonai ir net balso garsas. Aptikimo tikslumas skiriasi priklausomai nuo prietaiso. Kai kuriems instrumentams (t. Y. Fortepijonui) ribotame diapazone (200–500 Hz) jis yra tikslus, o kai kuriems instrumentams-žemas (pvz., Armonika).
Šis kodas naudoja anksčiau sukurtą FFT kodą, vadinamą „EasyFFT“.
Kodo demonstravimas parodytas aukščiau esančiame vaizdo įraše su įvairių tipų instrumentų garsu ir vokalu.
Prekės
- „Arduino Nano/Uno“arba naujesnė versija
- „Arduino“mikrofono modulis
1 žingsnis: užrašų aptikimo algoritmas
Kaip minėta ankstesniame žingsnyje, aptikti sunku, nes garso mėginiuose yra keli dažniai.
Programa veikia tokia seka:
1. Duomenų rinkimas:
- šiame skyriuje paimami 128 mėginiai iš garso duomenų, atskiriant du mėginius (mėginių ėmimo dažnis), atsižvelgiant į dominantį dažnį. Šiuo atveju mes naudojame atstumą tarp dviejų mėginių, naudojamų Hann lango funkcijai, taip pat amplitudės/RMS apskaičiavimui. Šis kodas taip pat atlieka apytikslį nulį, atimdamas 500 iš analoginės vertės. Jei reikia, šią vertę galima pakeisti. Įprastu atveju šios vertybės gerai veikia. Be to, reikia pridėti šiek tiek vėlavimo, kad mėginių ėmimo dažnis būtų apie 1200 Hz. 1200 Hz mėginių ėmimo dažnio atveju galima aptikti ne daugiau kaip 600 Hz dažnį.
už (int i = 0; i <128; i ++) {a = analogRead (Mic_pin) -500; // apytikslis nulinio poslinkio suma1 = suma1+a; // iki vidutinės vertės suma2 = suma2+a*a; // į RMS reikšmę a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // Hanno langas = 4*a; // mastelio keitimas į plūdę į int konversijos uždelsimąMikrosekundės (195); // pagal veikimo dažnių diapazoną}
2. FFT:
Kai duomenys yra paruošti, FFT atliekamas naudojant „EasyFFT“. Ši „EasyFFT“funkcija modifikuota taip, kad FFT būtų nustatyta 128 mėginiams. Kodas taip pat pakeistas siekiant sumažinti atminties suvartojimą. Originali „EasyFFT“funkcija skirta iki 1028 mėginių (su suderinama plokšte), o mums reikia tik 128 mėginių. šis kodas sumažina atminties suvartojimą maždaug 20%, palyginti su originalia „EasyFFT“funkcija.
Kai FFT bus atliktas, kodas grąžins 5 populiariausias dažnio viršūnes tolesnei analizei. Šis dažnis yra išdėstytas mažėjančia amplitudės tvarka.
3. Kiekvienos smailės metu kodas nustato galimas su juo susietas natas. šis kodas nuskaito tik iki 1200 Hz. Nebūtina turėti tokio paties užrašo kaip dažnis su maksimalia amplitude.
Visi dažniai yra suskirstyti nuo 0 iki 255, čia aptinkama pirmoji oktava, pavyzdžiui, 65,4–130,8 reiškia vieną oktavą, 130,8–261,6 Hz - kitą. Kiekvienos oktavos dažniai yra susiejami nuo 0 iki 255. čia atvaizduojama pradedant nuo C iki 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“masyvo vertės naudojamos pastabai priskirti aptiktiems dažniams.
baitas NoteV [13] = {8, 23, 40, 57, 76, 96, 116, 138, 162, 187, 213, 241, 255};
4. Apskaičiavus kiekvieno dažnio natą, gali būti, kad egzistuoja keli dažniai, rodantys tą pačią natą. Norint turėti tikslų išvesties kodą, atsižvelgiama ir į pasikartojimus. Kodas prideda visas dažnio reikšmes, remdamasis amplitudės tvarka ir pakartojimais, ir pasiekia didžiausią amplitudę.
2 žingsnis: taikymas
Kodo naudojimas yra tiesioginis, tačiau taip pat yra keletas apribojimų, kuriuos reikia nepamiršti. Kodą galima nukopijuoti, nes jis naudojamas užrašams aptikti. Naudojant jį reikia atsižvelgti į žemiau pateiktus punktus.
1. Smeigtuko priskyrimas:
Remiantis pridedamu kaiščio priskyrimu, jį reikia pakeisti. Savo eksperimentui aš jį laikiau 7 analoginiame kaištyje, void setup () {Serial.begin (250000); Mic_pin = A7; }
2. Mikrofono jautrumas:
Mikrofono jautrumą reikia keisti, todėl gali būti sukurta gera bangos forma. Dažniausiai mikrofono modulis yra su jautrumo nustatymu. reikia pasirinkti tokį jautrumą, kad signalas nebūtų nei per mažas, nei dėl didesnės amplitudės nenutrūktų.
3. Amplitudės slenkstis:
Šis kodas aktyvuojamas tik tuo atveju, jei signalo amplitudė yra pakankamai aukšta. šį nustatymą vartotojas turi nustatyti rankiniu būdu. ši vertė priklauso nuo mikrofono jautrumo ir taikymo.
jei (suma2-suma1> 5) {
..
aukščiau pateiktame kode suma2 suteikia RMS vertę, o suma 1 - vidutinę vertę. taigi skirtumas tarp šių dviejų verčių suteikia garso signalo amplitudę. mano atveju jis veikia tinkamai, kai amplitudės vertė yra maždaug 5.
4. Pagal numatytuosius nustatymus šis kodas išspausdins aptiktą užrašą. tačiau, jei planuojate naudoti užrašą kokiam nors kitam tikslui, turėtumėte naudoti tiesiogiai priskirtą numerį. Pavyzdžiui, C = 0; C#= 1, D = 2, D#= 3 ir toliau.
5. Jei prietaisas turi didesnį dažnį, kodas gali duoti klaidingą išvestį. maksimalų dažnį riboja mėginių ėmimo dažnis. todėl, norėdami gauti optimalią išvestį, galite žaisti žemiau vėlavimo verčių. žemiau kodo uždelsimo 195 mikrosekundės. kuris gali būti koreguojamas, kad būtų pasiekta optimali išvestis. Tai turės įtakos bendram vykdymo laikui.
{a = analogRead (Mic_pin) -500; // grubus nulinis poslinkis
suma1 = suma1+a; // iki vidutinės vertės suma2 = suma2+a*a; // į RMS reikšmę a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // Hanno langas = 4*a; // mastelio keitimas į plūdę į int konversijos uždelsimąMikrosekundės (195); // pagal veikimo dažnių diapazoną}
6. šis kodas veiks tik iki 2000Hz dažnio. pašalinus vėlavimą tarp mėginių ėmimo, galima gauti apie 3-4 kHz dažnio atrankos dažnius.
Atsargumo priemonės:
- Kaip minėta „EasyFFT“pamokoje, FFT sunaudoja didžiulį „Arduino“atminties kiekį. Taigi, jei turite programą, kuriai reikia išsaugoti kai kurias vertes, rekomenduojama naudoti didesnės atminties plokštę.
- Šis kodas gali tikti vienam instrumentui/vokalistui ir blogai kitam. Realaus laiko tikslus aptikimas neįmanomas dėl skaičiavimo apribojimų.
3 žingsnis: vasara
Pastabų aptikimas yra daug skaičiavimų reikalaujantis darbas, todėl labai sunku gauti išvestį realiuoju laiku, ypač naudojant „Arduino“. Šis kodas gali duoti apie 6,6 mėginio per sekundę (pridėtas 195 mikrosekundžių uždelsimas). šis kodas puikiai tinka fortepijonui ir kai kuriems kitiems instrumentams.
Tikiuosi, kad šis kodas ir pamoka padės jūsų projekte, susijusiame su muzika. kilus abejonėms ar pasiūlymams, nedvejodami komentuokite ar praneškite.
Būsimoje pamokoje pakeisiu šį muzikos akordų aptikimo kodą. tad sekite naujienas.
Rekomenduojamas:
„Arduino“užrašų knygelė: 6 žingsniai
„Arduino Noteboard“: ši instrukcija parodys, kaip sukurti „Arduino Noteboard“. Ši plokštė gali groti visą A-oktavą ir jų plokščias vietas. Medžiagos: 18 laidų-vyrų-16 laidų 16 mygtukų 18 mini trumpiklių laidų4 vyrų kaiščių
Muzikos natų detektorius: 3 žingsniai
Muzikos natų detektorius: nustebinkite savo draugus ir šeimos narius šiuo projektu, kuris aptinka instrumentu grojamą natą. Šiame projekte bus rodomas apytikslis dažnis ir muzikos nata, grojama elektronine klaviatūra, fortepijono programa ar bet kuriuo kitu instrumentu. Detai
Muzikos surinkėjas: integruotas virtualus muzikos instrumentas su blokiniu jutikliniu jutikliu: 4 žingsniai
Muzikos surinkėjas: integruotas virtualus muzikos instrumentas su blokiniu jutikliniu jutikliu: yra daug žmonių, norinčių išmokti groti muzikos instrumentais. Deja, kai kurie iš jų to nepradeda dėl didelės instrumentų kainos. Remdamiesi ja, nusprendėme sukurti integruotą virtualių muzikos instrumentų sistemą, kad sumažintume biudžetą pradedant
Sukurkite paprastą pranešimų šifravimo/iššifravimo įrenginį naudodami užrašų knygelę: 5 žingsniai
Sukurkite paprastą pranešimų šifravimo/iššifravimo įrenginį naudodami užrašų knygelę: Sveiki, naudodami šią paprastą HTML programą galite užšifruoti ir iššifruoti savo pranešimą slaptažodžiu. Pirmiausia aš jums parodysiu, kaip jį sukurti, o tada parodysiu, kaip jį naudoti. Pradėkime
Padarykite „Madlib“naudodami užrašų knygelę: 6 žingsniai
Padarykite „Madlib“naudodami užrašų knygelę: ši instrukcija išmokys jus padaryti madlibą naudojant užrašų knygelę