INHOUDSOPGAWE:
Video: Arduino Music Notes Detector: 3 stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:24
Vanweë beperkte geheue en verwerkingskrag is dit moeilik om musieknotas uit die klanksignaal op te spoor, veral op Arduino. Oor die algemeen is die noot nie 'n suiwer sinusgolf wat die opsporing bemoeilik nie. As ons die frekwensietransformasie van verskillende musiekinstrumente gebruik, kan dit verskeie harmonieke bevat, gebaseer op die noot wat gespeel word. Elke instrument het sy eie kenmerkende kombinasie van verskillende harmonieke. In hierdie kode het ek probeer om 'n program te maak wat soveel as moontlik instrumente kan dek. U kan die aangehegte video verwys waarin ek die verskillende tipes instrumente probeer toets het, verskillende soorte klanke wat deur die klawerbord gegenereer word, en selfs die klank van die stem. Die akkuraatheid van die opsporing wissel van instrument tot instrument. Vir sommige instrumente (dws klavier) in 'n beperkte reeks (200-500Hz) is dit akkuraat, terwyl sommige instrumente 'n lae akkuraatheid het (dws Harmonica).
Hierdie kode maak gebruik van 'n voorheen ontwikkelde FFT -kode genaamd EasyFFT.
Die demonstrasie van die kode word in die video hierbo getoon met verskillende soorte instrumentklank sowel as vokaal.
Voorrade
- Arduino Nano/Uno of hoër
- Mikrofoonmodule vir Arduino
Stap 1: Algoritme vir die opsporing van note
Soos in die vorige stap genoem, is die opsporing moeilik as gevolg van die teenwoordigheid van veelvuldige frekwensies in die klankmonsters.
Die program werk in die volgende vloei:
1. Data -verkryging:
- hierdie afdeling neem 128 monsters van klankdata, die skeiding tussen twee monsters (steekproeffrekwensie), afhangende van die frekwensie van belangstelling. In hierdie geval gebruik ons afstand tussen twee monsters wat gebruik word om Hann -vensterfunksie sowel as amplitude/RMS -berekening toe te pas. Hierdie kode doen ook 'n growwe nulstelling deur 500 af te trek van analoogleeswaarde. Hierdie waarde kan verander word indien nodig. Vir 'n tipiese geval werk hierdie waardes goed. Verder moet 'n bietjie vertraging bygevoeg word om 'n bemonsteringsfrekwensie van ongeveer 1200Hz te hê. in die geval van 'n monsterneming van 1200Hz kan 'n maksimum van 600 Hz frekwensie opgespoor word.
vir (int i = 0; i <128; i ++) {a = analogRead (Mic_pin) -500; // ruwe nulverskuiwingsom1 = som1+a; // tot gemiddelde waarde som2 = som2+a*a; // tot RMS -waarde a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // Hann -venster in = 4*a; // skaal vir float na int omskakelingsvertragingMicroseconds (195); // gebaseer op die frekwensiebereik van die werking}
2. FFT:
Sodra data gereed is, word FFT uitgevoer met EasyFFT. Hierdie EasyFFT -funksie is aangepas om FFT vir 128 monsters reg te stel. Die kode word ook aangepas om die geheueverbruik te verminder. Die oorspronklike EasyFFT -funksie is ontwerp om tot 1028 monsters (met die versoenbare bord) te hê, terwyl ons slegs 128 monsters benodig. hierdie kode verminder die geheueverbruik van ongeveer 20% in vergelyking met die oorspronklike EasyFFT -funksie.
Sodra FFT klaar is, gee die kode die top 5 mees dominante frekwensiepieke vir verdere analise. Hierdie frekwensie is gerangskik in dalende volgorde van amplitude.
3. Vir elke hoogtepunt, ontdek die kode moontlike notas wat daarmee verband hou. hierdie kode skandeer slegs tot 1200 Hz. Dit is nie nodig om dieselfde te let as die frekwensie met die maksimum amplitude nie.
Alle frekwensies word tussen 0 en 255 gekarteer, hier word die eerste oktaaf opgespoor, byvoorbeeld, 65,4 Hz tot 130,8 verteenwoordig een oktaaf, 130,8 Hz tot 261,6 Hz verteenwoordig 'n ander. Vir elke oktaaf word frekwensies van 0 tot 255 gekarteer. Hier word kartering begin van C tot C '.
as (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 -skikkingwaardes word gebruik om die noot aan die bespeurde frekwensies toe te ken.
byte NoteV [13] = {8, 23, 40, 57, 76, 96, 116, 138, 162, 187, 213, 241, 255};
4. Nadat die noot vir elke frekwensie bereken is, kan dit wees dat daar veelvuldige frekwensies bestaan wat dieselfde noot suggereer. Om 'n akkurate uitsetkode te hê, word ook herhalings in ag geneem. Die kode tel alle frekwensiewaarde op gebaseer op amplitude volgorde en herhalings en tel die noot met maksimum amplitude.
Stap 2: Toepassing
Die gebruik van die kode is eenvoudig, maar daar is ook verskeie beperkings wat in gedagte gehou moet word. Die kode kan gekopieer word soos dit gebruik word vir die opsporing van note. Die volgende punte moet in ag geneem word tydens die gebruik daarvan.
1. Speldopdrag:
Op grond van die aangehegte Pin -opdrag moet dit gewysig word. Vir my eksperiment het ek dit op analoog pen 7 gehou, ongeldige opstelling () {Serial.begin (250000); Mic_pin = A7; }
2. Mikrofoon sensitiwiteit:
Die mikrofoongevoeligheid moet aangepas word, so 'n golfvorm kan met 'n goeie amplitude gegenereer word. Die mikrofoonmodule het meestal 'n sensitiwiteitsinstelling. gepaste sensitiwiteit om so gekies te word dat die sein nie te klein is nie en ook nie afsny as gevolg van 'n hoër amplitude nie.
3. Amplitude -drempel:
Hierdie kode word slegs geaktiveer as die seinamplitude hoog genoeg is. hierdie instelling moet deur die gebruiker met die hand gestel word. hierdie waarde hang af van die mikrofoongevoeligheid sowel as die toepassing.
as (som2-som1> 5) {
..
in die kode hierbo gee sum2 RMS waarde terwyl som 1 gemiddelde waarde gee. dus gee die verskil tussen hierdie twee waardes die amplitude van die klanksein. in my geval werk dit behoorlik met 'n amplitudewaarde van ongeveer 5.
4. Hierdie kode sal standaard die gedrukte noot afdruk. Maar as u van plan is om die nota vir 'n ander doel te gebruik, moet die direk toegewysde nommer gebruik word. byvoorbeeld C = 0; C#= 1, D = 2, D#= 3 en verder.
5. As die instrument 'n hoër frekwensie het, kan die kode vals uitset lewer. die maksimum frekwensie word beperk deur die bemonsteringsfrekwensie. sodat u onder die vertragingswaardes kan speel om 'n optimale uitset te kry. in die onderstaande kodevertraging van 195 mikrosekondes. wat aangepas kan word om optimale uitset te kry. Dit sal die algehele uitvoeringstyd beïnvloed.
{a = analogRead (Mic_pin) -500; // rowwe nulverskuiwing
som1 = som1+a; // tot gemiddelde waarde som2 = som2+a*a; // tot RMS -waarde a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // Hann -venster in = 4*a; // skaal vir float na int omskakeling vertragingMicroseconds (195); // gebaseer op die frekwensiebereik van die werking}
6. hierdie kode werk slegs tot 2000Hz frekwensie. deur die vertraging tussen die bemonstering uit te skakel, kan ongeveer 3-4 kHz van bemonsteringsfrekwensies verkry word.
Voorsorgmaatreëls:
- Soos genoem in die EasyFFT -tutoriaal, eet die FFT baie geheue aan Arduino op. As u dus 'n program het wat sekere waardes moet stoor, word dit aanbeveel om 'n bord met 'n hoër geheue te gebruik.
- Hierdie kode werk goed vir een instrument/sanger en sleg vir 'n ander. Intydse akkurate opsporing is nie moontlik nie, as gevolg van rekenkundige beperkings.
Stap 3: Somerig
Let op dat opsporing 'n rekenaarintensiewe werk is, en dit is baie moeilik om real-time uitset te kry, veral op Arduino. Hierdie kode kan ongeveer 6,6 monsters /sekondes gee (vir 195 mikrosekondes vertraging bygevoeg). hierdie kode werk goed saam met die klavier en ander instrumente.
Ek hoop dat hierdie kode en tutoriaal nuttig kan wees in u projek rakende musiek. In geval van twyfel of voorstelle, voel vry om kommentaar of boodskappe te lewer.
In die komende tutoriaal verander ek hierdie kode vir die opsporing van musiekakkoorde. bly dus ingeskakel.
Aanbeveel:
Astronomia Coffin Dance Meme Music Using Arduino Uno: 5 Stappe
Astronomia Coffin Dance Meme Music Using Arduino Uno: This blog we have shown you Astronomia Coffin Dance Tune With Arduino Uno Soos jy almal weet oor die dra van memes oor doodskis astronomie, so ek het besluit om hierdie melodie te maak met behulp van arduino uno Hier is die stappe en benodigdhede wat gebruik word in hierdie projek
Tobias - Arduino Music Box With TVout: 5 stappe (met foto's)
Tobias - Arduino Music Box With TVout: Laat ek eers Tobias, die reuse -teddiebeer van my vriendin, voorstel, wat die inspirasie is vir hierdie projek. terwyl sy weg is by die werk. Die projek wa
Azimuthal -projeksie 3D -kaartversiering X Folk Music Puzzle Puzzle - Arduino: 7 stappe
Azimuthal Projection 3D Map Decoration X Folk Music Puzzle Game - Arduino: INLEIDING Die volgende bladsy sal u leer hoe om 'n Arduino -projek te skep, wat twee hooffunksies het - eenvoudige versiering met beligting en volksmusiek -puzzelspel, wat die velde van geografie, meetkunde insluit , kaarte, Verenigde Nasies, en
Arduino Music Controller: 9 stappe (met foto's)
Arduino Music Controller: Dit is 'n tutoriaal hoe jy 'n Arduino Music Controller van 1 m lank kan maak. Gemaakt deur Kyo Schelfhout, Logan Wesse en Janis MosselmansB.OM:38 kabels (13 rood, 13 zwart, 12 geel) drukplaat (4 gaatjes
Arduino Music Reactive Desktop Lamp: 8 stappe (met foto's)
Arduino Music Reactive Desktop Lamp: Hallo almal! In hierdie weergawe maak ons 'n reaktiewe LED -lessenaarlamp met eenvoudige komponente en basiese Arduino -programmering. Dit maak 'n indrukwekkende effek waar die lig op alle klanke en musiek sal dans. Ek het hierdie projek voltooi met 'n spanmaat