Taula de continguts:
Vídeo: Arduino Music Notes Detector: 3 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:12
La detecció de notes musicals des del senyal d'àudio és difícil de fer sobretot a Arduino a causa de la poca memòria i potència de processament. En general, la nota no és una ona sinusoïdal pura que dificulta la detecció. Si prenem la transformació de freqüència de diversos instruments musicals, pot contenir múltiples harmònics segons la nota que es toqui. Cada instrument té una combinació pròpia de diversos harmònics. En aquest codi, he intentat crear un programa que pugui abastar el màxim d’instruments possible. Podeu consultar el vídeo adjunt en què he intentat provar els diversos tipus d’instruments, diversos tipus de tons generats pel teclat i fins i tot el so de la veu. La precisió de la detecció varia d’un instrument a l’altre. Per a alguns instruments (és a dir, piano) en un rang limitat (200-500Hz) és precís, mentre que per a alguns instruments té una precisió baixa (és a dir, harmònica).
Aquest codi fa ús d’un codi FFT desenvolupat prèviament anomenat EasyFFT.
La demostració del codi es mostra al vídeo anterior amb diversos tipus de so d’instruments i també de veu.
Subministraments
- Arduino Nano / Uno o superior
- Mòdul de micròfon per Arduino
Pas 1: Algorisme per a la detecció de notes
Com es va esmentar al pas anterior, la detecció és difícil a causa de la presència de freqüències múltiples a les mostres d'àudio.
El programa funciona en el flux següent:
1. Adquisició de dades:
- aquesta secció pren 128 mostres de dades d'àudio, la separació entre dues mostres (freqüència de mostreig) en funció de la freqüència d'interès. En aquest cas, s’utilitza l’espaiat entre dues mostres per aplicar la funció de la finestra de Hann, així com el càlcul d’amplitud / RMS. Aquest codi també fa una reducció aproximada en restar 500 del valor de lectura analògica. Aquest valor es pot canviar si cal. Per a un cas típic, aquests valors funcionen bé. A més, cal afegir algun retard per tenir una freqüència de mostreig d’uns 1200Hz. en el cas de la freqüència de mostreig de 1200Hz es pot detectar una freqüència màxima de 600 HZ.
for (int i = 0; i <128; i ++) {a = analogRead (Mic_pin) -500; // desplaçament zero aproximat suma1 = suma1 + a; // al valor mitjà suma2 = suma2 + a * a; // al valor RMS a = a * (sin (i * 3.14 / 128) * sin (i * 3.14 / 128)); // Finestra de Hann a = 4 * a; // escalar per retard de conversió float a int Microsegons (195); // basat en el rang de freqüència d'operació}
2. FFT:
Quan les dades estiguin llestes, es realitzarà FFT mitjançant EasyFFT. Aquesta funció EasyFFT es modifica per corregir FFT per a 128 mostres. El codi també es modifica per reduir el consum de memòria. La funció EasyFFT original dissenyada per tenir fins a 1028 mostres (amb la placa compatible), mentre que només necessitem 128 mostres. aquest codi redueix el consum de memòria al voltant d’un 20% en comparació amb la funció EasyFFT original.
Un cop fet el FFT, el codi retorna els cinc pics de freqüència més dominants per a una anàlisi posterior. Aquesta freqüència s’ordena en ordre descendent d’amplitud.
3. Per a cada pic, el codi detecta possibles notes associades amb ell. aquest codi només escaneja fins a 1200 Hz. No cal tenir nota igual que la freqüència amb amplitud màxima.
Totes les freqüències estan assignades entre 0 i 255, aquí es detecta la primera octava, per exemple, 65,4 Hz a 130,8 representa una octava, 130,8 Hz a 261,6 Hz representa una altra. Per a cada octava, les freqüències es mapen de 0 a 255. Aquí es mapeja a partir de C a 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);}
Els valors de la matriu NoteV s’utilitzen per assignar la nota a les freqüències detectades.
byte NoteV [13] = {8, 23, 40, 57, 76, 96, 116, 138, 162, 187, 213, 241, 255};
4. Després de calcular la nota per a cada freqüència, es pot donar el cas que hi hagi diverses freqüències que suggereixen la mateixa nota. Tenir un codi de sortida precís també té en compte les repeticions. El codi suma tots els valors de freqüència en funció de l’ordre d’amplitud i de les repeticions i arriba a la nota amb la màxima amplitud.
Pas 2: sol·licitud
L’ús del codi és senzill, però, també hi ha diverses limitacions que cal tenir en compte mentre s’utilitza el codi. El codi es pot copiar, ja que s’utilitza per a la detecció de notes. Cal tenir en compte els punts següents a l’hora d’utilitzar-lo.
1. Tasca de pins:
En funció de l’assignació de pins adjunta, cal modificar-la. Per al meu experiment, el vaig conservar al pin 7 analògic, configuració nul·la () {Serial.begin (250000); Mic_pin = A7; }
2. Sensibilitat del micròfon:
Cal modificar la sensibilitat del micròfon per tal que es pugui generar una forma d’ona amb una bona amplitud. Sobretot, el mòdul de micròfon inclou una configuració de sensibilitat. sensibilitat adequada per seleccionar-la de manera que el senyal no sigui massa petit i tampoc es desactivi a causa de l'amplitud més gran.
3. Llindar d'amplitud:
Aquest codi només s’activa si l’amplitud del senyal és prou elevada. aquest paràmetre l’ha de configurar manualment l’usuari. aquest valor depèn de la sensibilitat del micròfon i de l'aplicació.
if (suma2-suma1> 5) {
..
al codi anterior, sum2 dóna un valor RMS mentre que la suma 1 dóna un valor mitjà. de manera que la diferència entre aquests dos valors dóna l’amplitud del senyal sonor. en el meu cas, funciona correctament amb un valor d'amplitud al voltant de 5.
4. Per defecte, aquest codi imprimirà la nota detectada. tanmateix, si teniu previst fer servir la nota amb algun altre propòsit, s'hauria d'utilitzar el número assignat directament. per exemple, C = 0; C # = 1, D = 2, D # = 3 i posteriors.
5. Si l'instrument té una freqüència més alta, el codi pot donar una sortida falsa. la freqüència màxima està limitada per la freqüència de mostreig. de manera que podeu jugar per sota dels valors de retard per obtenir una sortida òptima. a sota del codi de retard de 195 microsegons. que es pot modificar per obtenir una producció òptima. Això afectarà el temps d'execució general.
{a = analogRead (Mic_pin) -500; // desplaçament zero aproximat
suma1 = suma1 + a; // al valor mitjà suma2 = suma2 + a * a; // al valor RMS a = a * (sin (i * 3,14 / 128) * sin (i * 3,14 / 128)); // Finestra de Hann a = 4 * a; // escalar per retard de conversió float a int Microsegons (195); // basat en el rang de freqüència d'operació}
6. aquest codi només funcionarà fins a 2000Hz de freqüència. eliminant el retard entre el mostreig al voltant de 3-4 kHz de freqüències de mostreig es pot obtenir.
Precaucions:
- Com es va esmentar al tutorial EasyFFT, el FFT menja una gran quantitat de memòria d'Arduino. Per tant, si teniu un programa que necessita emmagatzemar alguns valors, es recomana utilitzar una placa amb més memòria.
- Aquest codi pot funcionar bé per a un instrument / vocalista i és dolent per a un altre. La detecció precisa en temps real no és possible a causa de les limitacions computacionals.
Pas 3: estiuenc
La detecció de notes és un treball intensiu en càlculs, obtenir una sortida en temps real és molt difícil, especialment a Arduino. Aquest codi pot donar aproximadament 6,6 mostres / segons (per 195 microsegons de retard afegit). aquest codi funciona bé amb el piano i alguns altres instruments.
Espero que aquest codi i aquest tutorial siguin útils per al vostre projecte relacionat amb la música. en cas de dubte o suggeriment, no dubteu a fer comentaris o missatges.
Al proper tutorial, modificaré aquest codi per a la detecció d’acords musicals. així que estigueu atents.
Recomanat:
Com fer un lloc web bàsic mitjançant el bloc de notes: 4 passos
Com fer un lloc web bàsic mitjançant el bloc de notes: algú s’ha preguntat "com puc fer un lloc web amb un programa bàsic d'escriptura?" Bé, òbviament, no específicament … De totes maneres, aquí us mostraré com fer un BÀSIC lloc web amb només bloc de notes
Detector de notes musicals: 3 passos
Detector de notes musicals: sorprengui els seus amics i familiars amb aquest projecte que detecta la nota que toca un instrument. Aquest projecte mostrarà la freqüència aproximada, així com la nota musical reproduïda en un teclat electrònic, una aplicació de piano o qualsevol altre instrument. Detai
Com posar notes a una calculadora TI-84 Plus: 7 passos
Com posar notes a una calculadora TI-84 Plus: Desar notes i fórmules a la calculadora gràfica TI-84 Plus es pot utilitzar per estalviar temps i recordar fórmules de manera més fiable. També es pot fer servir per obtenir avantatges en exàmens com el SAT, que permeten als estudiants utilitzar aquest mètode. Al següent
Com convertir text a àudio mitjançant el bloc de notes !!: 8 passos
Com convertir text a àudio mitjançant el bloc de notes !!: aquest instructiu us mostrarà com convertir text a àudio mitjançant el bloc de notes Si us plau, subscriviu-vos al meu canal Gràcies
Fer un joc al bloc de notes i molt més: 10 passos
Fer un joc al Bloc de notes i molt més: aquest és el meu primer instructable. Així que si teniu algun suggeriment, si us plau comenteu-ho. Comencem! Quan tots sentim la paraula bloc de notes, pensem en algunes aplicacions inútils i avorrides per anotar coses. Bé, el bloc de notes és molt més que això. Podem controlar la nostra p