Indholdsfortegnelse:
Video: Arduino Music Notes Detector: 3 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:26
Det er svært at finde musiknoter fra lydsignalet, især på Arduino på grund af begrænset hukommelse og processorkraft. Generelt er noten ikke en ren sinusbølge, der gør detekteringen vanskelig. Hvis vi tager frekvensomformningen af forskellige musikinstrumenter, kan den indeholde flere harmoniske baseret på den tone, der spilles. Hvert instrument har sin egen signaturkombination af forskellige harmoniske. I denne kode forsøgte jeg at lave et program, der kan dække så mange instrumenter som muligt. Du kan referere vedhæftet video, hvor jeg forsøgte at teste de forskellige typer instrumenter, forskellige typer toner genereret af tastaturet og endda lyd af vokal kontrolleres. Detektionens nøjagtighed varierer fra instrument til instrument. For nogle instrumenter (dvs. klaver) i et begrænset område (200-500Hz) er det nøjagtigt, mens et instrument har lav nøjagtighed (dvs. Harmonica).
Denne kode gør brug af en tidligere udviklet FFT -kode kaldet EasyFFT.
Demonstrationen af koden vises i ovenstående video med forskellige typer instrumentlyd samt vokal.
Forbrugsvarer
- Arduino Nano/Uno eller højere
- Mikrofonmodul til Arduino
Trin 1: Algoritme til notedetektion
Som nævnt i det foregående trin er detektionen vanskelig på grund af tilstedeværelsen af flere frekvenser i lydprøverne.
Programmet fungerer i følgende flow:
1. Dataindsamling:
- dette afsnit tager 128 prøver fra lyddata, adskillelsen mellem to sampler (samplingsfrekvens) afhængigt af frekvensen af interesse. I dette tilfælde bruger vi afstand mellem to prøver, der bruges til at anvende Hann -vinduesfunktion samt amplitude/RMS -beregning. Denne kode foretager også grov nulstilling ved at trække 500 fra analoglæsningsværdien. Denne værdi kan om nødvendigt ændres. I et typisk tilfælde fungerer disse værdier godt. Desuden skal der tilføjes en vis forsinkelse for at have en samplingsfrekvens på omkring 1200Hz. i tilfælde af 1200Hz samplingsfrekvens kan maks. 600 HZ frekvens detekteres.
for (int i = 0; i <128; i ++) {a = analogRead (Mic_pin) -500; // groft nul skift sum1 = sum1+a; // til gennemsnitsværdi sum2 = sum2+a*a; // til RMS -værdi a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // Hann vindue i = 4*a; // skalering for float til int -konverteringsforsinkelseMicroseconds (195); // baseret på driftsfrekvensområde}
2. FFT:
Når data er klar, udføres FFT ved hjælp af EasyFFT. Denne EasyFFT -funktion er ændret til at reparere FFT til 128 prøver. Koden er også ændret for at reducere hukommelsesforbruget. Den originale EasyFFT -funktion designet til at have op til 1028 prøver (med det kompatible kort), mens vi kun har brug for 128 prøver. denne kode reducerer hukommelsesforbruget på omkring 20% i forhold til den originale EasyFFT -funktion.
Når FFT er udført, returnerer koden de 5 mest dominerende frekvenstoppe til yderligere analyse. Denne frekvens er arrangeret i faldende rækkefølge af amplitude.
3. For hver top registrerer koden mulige noter, der er knyttet til den. denne kode scanner kun op til 1200 Hz. Det er ikke nødvendigt at have note det samme som frekvensen med maksimal amplitude.
Alle frekvenser er kortlagt mellem 0 og 255, her detekteres den første oktav, for eksempel repræsenterer 65,4 Hz til 130,8 en oktav, 130,8 Hz til 261,6 Hz repræsenterer en anden. For hver oktav kortlægges frekvenser fra 0 til 255. her kortlægning, der 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 -arrayværdier bruges til at tildele noten til de detekterede frekvenser.
byte NoteV [13] = {8, 23, 40, 57, 76, 96, 116, 138, 162, 187, 213, 241, 255};
4. Efter beregning af note for hver frekvens kan det være tilfældet, at der findes flere frekvenser, hvilket tyder på den samme note. At have en nøjagtig outputkode overvejer også gentagelser. Koden tilføjer alle frekvensværdier baseret på amplitudeorden og gentagelser og topper noten med maksimal amplitude.
Trin 2: Ansøgning
Brug af koden er ligetil, men der er også flere begrænsninger, der skal huskes på, mens den. Koden kan kopieres, når den bruges til notedetektering. Nedenstående punkter skal overvejes, mens du bruger det.
1. Pin -tildeling:
Baseret på den vedhæftede Pin -opgave skal ændres. Til mit eksperiment holdt jeg det til analog pin 7, ugyldig opsætning () {Serial.begin (250000); Mic_pin = A7; }
2. Mikrofonfølsomhed:
Mikrofonfølsomhed skal ændres, sådan bølgeform kan genereres med god amplitude. For det meste leveres mikrofonmodulet med en følsomhedsindstilling. passende følsomhed til at blive valgt, så signalet hverken er for lille og heller ikke klipper af på grund af højere amplitude.
3. Amplitude tærskel:
Denne kode aktiveres kun, hvis signalamplituden er høj nok. denne indstilling skal indstilles manuelt af brugeren. denne værdi afhænger af mikrofonfølsomhed samt applikation.
hvis (sum2-sum1> 5) {
..
i ovenstående kode giver sum2 RMS -værdi, mens sum 1 giver middelværdi. så forskellen mellem disse to værdier giver lydsignalets amplitude. i mit tilfælde fungerer det korrekt med en amplitudeværdi på omkring 5.
4. Som standard udskriver denne kode den registrerede note. Men hvis du planlægger at bruge sedlen til et andet formål, skal det direkte tildelte nummer bruges. for eksempel C = 0; C#= 1, D = 2, D#= 3 og fremefter.
5. Hvis instrumentet har en højere frekvens, kan koden give falsk output. den maksimale frekvens er begrænset af prøveudtagningsfrekvensen. så du kan lege med under forsinkelsesværdier for at få et optimalt output. i nedenstående kodeforsinkelse på 195 mikrosekunder. som kan justeres for at få et optimalt output. Dette vil påvirke den samlede udførelsestid.
{a = analogRead (Mic_pin) -500; // groft nulskift
sum1 = sum1+a; // til gennemsnitsværdi sum2 = sum2+a*a; // til RMS -værdi a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // Hann vindue i = 4*a; // skalering for float til int -konverteringsforsinkelseMicroseconds (195); // baseret på driftsfrekvensområde}
6. denne kode fungerer kun indtil 2000Hz frekvens. ved at eliminere forsinkelsen mellem sampling omkring 3-4 kHz af samplingsfrekvenser kan opnås.
Forholdsregler:
- Som nævnt i EasyFFT -øvelsen spiser FFT en enorm mængde hukommelse af Arduino. Så hvis du har et program, der skal gemme nogle værdier, anbefales det at bruge et kort med højere hukommelse.
- Denne kode fungerer muligvis godt for et instrument/vokalist og dårligt for et andet. Realtid Nøjagtig registrering er ikke mulig på grund af beregningsmæssige begrænsninger.
Trin 3: Sommerlig
Bemærk detektering er beregningsintensivt arbejde, det er meget svært at få output i realtid, især på Arduino. Denne kode kan give omkring 6,6 prøver /sekunder (i 195 mikrosekunder tilføjet forsinkelse). denne kode fungerer godt med klaveret og nogle andre instrumenter.
Jeg håber, at denne kode og vejledning kan være nyttige i dit projekt relateret til musik. i tilfælde af tvivl eller forslag er du velkommen til at kommentere eller sende beskeder.
I den kommende vejledning vil jeg ændre denne kode til detektering af akkorder. så følg med.
Anbefalede:
Tobias - Arduino Music Box With TVout: 5 trin (med billeder)
Tobias - Arduino Music Box With TVout: Lad mig først og fremmest præsentere Tobias, min kærestes kæmpe bamse, som er inspirationen til dette projekt. Tobias har en personlighed, opbygget over tid, mens vi spøgende undrer os over, hvad han gør mens hun er væk på arbejde. Projektet
Arduino LED Music: 6 trin
Arduino LED Music: Dette er mit Arduino -projekt. Det er en VU -måler, hvor lysdioderne lyser op til melodien, på en mere præcis måde at sige er lydstyrken på musikken. Det består af et lyddetektortavle og 10 forskelligt farvede lysdioder, der viser måleren. Jeg annoncerer også
ARDUINO LED LIGHT MUSIC REACTIVE: 4 trin
ARDUINO LED LIGHT MUSIC REACTIVE: Hej, hvis du elsker LED -lys med musik, er dette en god instruktion for dig. Meget let
Music Visualizer With Arduino: 5 trin
Music Visualizer With Arduino: Interactive Music VisualizerComponentsLM338T x5Potentiometer x2 (1k og 10k) 1N4006 diode x5Capacitor x2 (1uF og 10uF) Modstande x3 (416, 10k og 1k) Aux splitter
Arduino Music Controller: 9 trin (med billeder)
Arduino Music Controller: Dette er en vejledning til, hvordan du kan bruge en Arduino Music Controller til 1 m lang.Gemaakt af Kyo Schelfhout, Logan Wesse og Janis MosselmansB.OM:38 kabels (13 rood, 13 zwart, 12 geel) Weerstanden: 1010 drukknoppen1 potentiometer1 printplade (4 gaatjes