Innholdsfortegnelse:
Video: Arduino Music Notes Detector: 3 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:22
Det er vanskelig å oppdage musikknotater fra lydsignalet, spesielt på Arduino på grunn av begrenset minne og prosessorkraft. Vanligvis er notatet ikke en ren sinusbølge som gjør detekteringen vanskelig. Hvis vi tar frekvensomformingen til forskjellige musikkinstrumenter, kan den inneholde flere harmoniske basert på noten som spilles. Hvert instrument har sin egen signaturkombinasjon av forskjellige harmoniske. I denne koden prøvde jeg å lage et program som kan dekke så mange instrumenter som mulig. Du kan referere til vedlagte video der jeg prøvde å teste de forskjellige instrumenttypene, forskjellige typer toner generert av tastaturet og til og med lyd av vokal blir sjekket. Nøyaktigheten til deteksjonen varierer fra instrument til instrument. For et instrument (dvs. piano) i et begrenset område (200-500Hz) er det nøyaktig, mens et instrument har lav nøyaktighet (dvs. Harmonica).
Denne koden bruker en tidligere utviklet FFT -kode kalt EasyFFT.
Demonstrasjonen av koden vises i videoen ovenfor med forskjellige typer instrumentlyd så vel som vokal.
Rekvisita
- Arduino Nano/Uno eller over
- Mikrofonmodul for Arduino
Trinn 1: Algoritme for notedeteksjon
Som nevnt i forrige trinn, er deteksjonen vanskelig på grunn av tilstedeværelsen av flere frekvenser i lydprøvene.
Programmet fungerer i følgende flyt:
1. Datainnsamling:
- denne delen tar 128 prøver fra lyddata, skillet mellom to sampler (samplingsfrekvens) avhengig av frekvensen av interesse. I dette tilfellet bruker vi mellomrom mellom to prøver som brukes til å bruke Hann -vindusfunksjon samt amplitude/RMS -beregning. Denne koden gjør også grov nullstilling ved å trekke 500 fra analoglesingsverdi. Denne verdien kan endres om nødvendig. For et typisk tilfelle fungerer disse verdiene godt. Videre må det legges til en viss forsinkelse for å ha en samplingsfrekvens på rundt 1200Hz. i tilfelle av 1200Hz samplingsfrekvens kan maks. 600 HZ frekvens detekteres.
for (int i = 0; i <128; i ++) {a = analogRead (Mic_pin) -500; // grov null skift sum1 = sum1+a; // til gjennomsnittlig verdi sum2 = sum2+a*a; // til RMS -verdi a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // Hann -vindu i = 4*a; // skalering for float til int konvertering delayMicroseconds (195); // basert på operasjonsfrekvensområde}
2. FFT:
Når dataene er klare, utføres FFT ved hjelp av EasyFFT. Denne EasyFFT -funksjonen er modifisert for å fikse FFT for 128 prøver. Koden er også endret for å redusere minneforbruket. Den originale EasyFFT -funksjonen er designet for å ha opptil 1028 prøver (med det kompatible kortet), mens vi bare trenger 128 prøver. denne koden reduserer minneforbruket på rundt 20% sammenlignet med den originale EasyFFT -funksjonen.
Når FFT er gjort, returnerer koden de fem mest dominerende frekvenstoppene for ytterligere analyse. Denne frekvensen er ordnet i synkende amplituderekkefølge.
3. For hver topp oppdager koden mulige notater knyttet til den. denne koden skanner bare opptil 1200 Hz. Det er ikke nødvendig å notere det samme som frekvensen med maks amplitude.
Alle frekvenser er kartlagt mellom 0 og 255, her detekteres den første oktaven, for eksempel representerer 65,4 Hz til 130,8 en oktav, 130,8 Hz til 261,6 Hz representerer en annen. For hver oktav kartlegges frekvenser fra 0 til 255. her kartlegging som starter fra C til C '.
hvis (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 -matrisverdier brukes til å tilordne notatet til de detekterte frekvensene.
byte NoteV [13] = {8, 23, 40, 57, 76, 96, 116, 138, 162, 187, 213, 241, 255};
4. Etter å ha beregnet noten for hver frekvens kan det være slik at det er flere frekvenser som eksisterer, noe som antyder den samme noten. For å ha en nøyaktig utgangskode vurderes også repetisjoner. Koden summerer alle frekvensverdier basert på amplituderekkefølge og repetisjoner og topper noten med maksimal amplitude.
Trinn 2: Søknad
Bruk av koden er rett frem, men det er også flere begrensninger som må tas i betraktning mens den er. Koden kan kopieres slik den brukes til notatdeteksjon. Punktene nedenfor må vurderes mens du bruker den.
1. Pin -oppgave:
Basert på den vedlagte Pin -tildelingen må endres. For mitt eksperiment holdt jeg det til analog pin 7, ugyldig oppsett () {Serial.begin (250000); Mic_pin = A7; }
2. Mikrofonfølsomhet:
Mikrofonfølsomhet må endres slik at bølgeform kan genereres med god amplitude. Stort sett kommer mikrofonmodulen med en følsomhetsinnstilling. passende følsomhet for å bli valgt slik at signalet verken er for lite og heller ikke klippes av på grunn av høyere amplitude.
3. Amplitude -terskel:
Denne koden aktiveres bare hvis signalamplituden er høy nok. denne innstillingen må angis manuelt av brukeren. denne verdien avhenger av mikrofonfølsomhet så vel som applikasjon.
hvis (sum2-sum1> 5) {
..
i koden ovenfor gir sum2 RMS -verdi mens sum 1 gir middelverdi. så forskjellen mellom disse to verdiene gir amplituden til lydsignalet. i mitt tilfelle fungerer det skikkelig med en amplitudeverdi på rundt 5.
4. Som standard vil denne koden skrive ut det oppdagede notatet. Men hvis du planlegger å bruke lappen til et annet formål, bør det direkte tildelte nummeret brukes. for eksempel C = 0; C#= 1, D = 2, D#= 3 og videre.
5. Hvis instrumentet har høyere frekvens, kan koden gi falsk utgang. maksimal frekvens er begrenset av samplingsfrekvensen. så du kan spille rundt forsinkelsesverdiene for å få optimal utgang. i nedenstående kodeforsinkelse på 195 mikrosekunder. som kan justeres for å få optimal utgang. Dette vil påvirke den totale gjennomføringstiden.
{a = analogRead (Mic_pin) -500; // grovt nullskifte
sum1 = sum1+a; // til gjennomsnittlig verdi sum2 = sum2+a*a; // til RMS -verdi a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // Hann -vindu i = 4*a; // skalering for float til int konvertering delayMicroseconds (195); // basert på operasjonsfrekvensområde}
6. denne koden vil bare fungere til 2000Hz frekvens. ved å eliminere forsinkelsen mellom sampling rundt 3-4 kHz av samplingsfrekvenser kan oppnås.
Forholdsregler:
- Som nevnt i EasyFFT -opplæringen spiser FFT opp en enorm mengde minne om Arduino. Så hvis du har et program som trenger å lagre noen verdier, anbefales det å bruke et brett med høyere minne.
- Denne koden kan fungere godt for ett instrument/vokalist og dårlig for et annet. Sanntid Nøyaktig deteksjon er ikke mulig på grunn av beregningsbegrensninger.
Trinn 3: Sommerlig
Notatdeteksjon er beregningsintensivt arbeid, og det er veldig vanskelig å få sanntidsutdata, spesielt på Arduino. Denne koden kan gi rundt 6,6 prøver /sekunder (for 195 mikrosekunder forsinkelse lagt til). denne koden fungerer godt med piano og noen andre instrumenter.
Jeg håper denne koden og opplæringen er nyttig i prosjektet ditt knyttet til musikk. ved tvil eller forslag, kom gjerne med kommentarer eller meldinger.
I den kommende opplæringen vil jeg endre denne koden for musikk akkorddeteksjon. så følg med.
Anbefalt:
Arduino LED Music: 6 trinn
Arduino LED Music: Dette er mitt Arduino -prosjekt. Det er en VU -måler, der lysdiodene lyser opp til melodien, på en mer nøyaktig måte å si er volumet på musikken. Den består av et lyddetektorbord og 10 forskjellige fargede lysdioder som viser måleren. Jeg annonserer også
ARDUINO LED LIGHT MUSIC REACTIVE: 4 trinn
ARDUINO LED LIGHT MUSIC REACTIVE: Hei, hvis du liker LED -lys med musikk er dette en flott instruksjon for deg. Veldig enkelt
Music Visualizer With Arduino: 5 trinn
Music Visualizer With Arduino: Interactive Music VisualizerComponentsLM338T x5Potensiometer x2 (1k og 10k) 1N4006 diode x5Kondensator x2 (1uF og 10uF) Motstander x3 (416, 10k og 1k) Aux splitter
Comsave: Lock Your Notes (batch File App): 3 trinn
Comsave: Lock Your Notes (batch File App): Hei, Comsaveit lagrer notatene dine og låser dem. Bare last ned den vedlagte batchfilen (i trinn 1). Plasser den i en mappe og IKKE flytt den ut av mappen eller batchfilen vil ikke kunne finne kontoen din. MERK: Dette er en batchfil. Det genererer
Arduino Music Controller: 9 trinn (med bilder)
Arduino Music Controller: Dette er en opplæring for hvordan du kan lage en Arduino Music Controller fra 1 m lang.Gemaakt av Kyo Schelfhout, Logan Wesse og Janis MosselmansB.OM:38 kabels (13 rood, 13 zwart, 12 geel) Weerstanden: 1010 drukknoppen1 potensiometer1 printplaat (4 gaatjes