Sisällysluettelo:

Arduino Music Notes -ilmaisin: 3 vaihetta
Arduino Music Notes -ilmaisin: 3 vaihetta

Video: Arduino Music Notes -ilmaisin: 3 vaihetta

Video: Arduino Music Notes -ilmaisin: 3 vaihetta
Video: Arduino 8x8 Gate Sequencer Rhythm Pattern Generator with Two Rotary Encoders and OLED Display 2024, Marraskuu
Anonim
Image
Image

Muistiinpanojen havaitseminen audiosignaalista on vaikeaa varsinkin Arduinolla muistin ja prosessointitehon rajoitusten vuoksi. Yleensä nuotti ei ole puhdas siniaalto, joka vaikeuttaa havaitsemista. Jos otamme taajuusmuunnoksen eri soittimista, se voi sisältää useita harmonisia soitettavan nuotin perusteella. Jokaisella instrumentilla on oma allekirjoitusyhdistelmä eri harmonisista. Tässä koodissa yritin tehdä ohjelman, joka voi kattaa mahdollisimman monta instrumenttia. Voit viitata liitteenä olevaan videoon, jossa yritin testata erityyppisiä soittimia, näppäimistön luomia erilaisia ääniä ja jopa äänen ääntä. Tunnistuksen tarkkuus vaihtelee laitteesta toiseen. Joidenkin instrumenttien (eli pianon) rajoitetulla alueella (200-500 Hz) se on tarkka, kun taas joidenkin instrumenttien tarkkuus on heikko (eli huuliharppu).

Tämä koodi käyttää aiemmin kehitettyä FFT -koodia nimeltä EasyFFT.

Koodin esittely näkyy yllä olevassa videossa erilaisilla instrumenttiäänillä ja laululla.

Tarvikkeet

- Arduino Nano/Uno tai uudempi

- Mikrofonimoduuli Arduinolle

Vaihe 1: Algoritmi huomautusten havaitsemiseen

Kuten edellisessä vaiheessa mainittiin, havaitseminen on vaikeaa, koska ääninäytteissä on useita taajuuksia.

Ohjelma toimii seuraavasti:

1. Tietojen hankinta:

- Tämä osio ottaa 128 näytettä äänidatasta, kahden näytteen erottaminen (näytteenottotaajuus) riippuen kiinnostuksen kohteena olevasta taajuudesta. Tässä tapauksessa käytämme kahden näytteen välistä väliä Hann -ikkunatoiminnon ja amplitudi/RMS -laskennan soveltamiseen. Tämä koodi tekee myös karkean nollauksen vähentämällä 500 analogilukun arvosta. Tätä arvoa voidaan muuttaa tarvittaessa. Tyypillisessä tapauksessa tämä arvo toimii hyvin. Lisäksi on lisättävä viive, jotta näytteenottotaajuus on noin 1200 Hz. 1200 Hz: n näytteenottotaajuudella voidaan havaita enintään 600 Hz: n taajuus.

for (int i = 0; i <128; i ++) {a = analoginen luku (Mic_pin) -500; // karkea nollan siirtymä summa1 = summa1+a; // keskiarvoon summa2 = summa2+a*a; // RMS -arvoon a = a*(sin (i*3,14/128)*sin (i*3,14/128)); // Hann -ikkuna = 4*a; // skaalaus floatista int -muuntoviiveeseenMikrosekuntia (195); // perustuu toimintataajuusalueeseen}

2. FFT:

Kun tiedot ovat valmiit, FFT suoritetaan EasyFFT: llä. Tämä EasyFFT -toiminto on muutettu korjaamaan FFT 128 näytteelle. Koodia on myös muokattu muistin kulutuksen vähentämiseksi. Alkuperäinen EasyFFT -toiminto on suunniteltu jopa 1028 näytteelle (yhteensopivan levyn kanssa), kun taas tarvitsemme vain 128 näytettä. tämä koodi vähentää muistin kulutusta noin 20% verrattuna alkuperäiseen EasyFFT -toimintoon.

Kun FFT on tehty, koodi palauttaa viisi hallitsevinta taajuuspiikkiä lisäanalyysiä varten. Tämä taajuus on järjestetty laskevaan amplitudijärjestykseen.

3. Koodi tunnistaa jokaiselle huippulle mahdolliset siihen liittyvät nuotit. tämä koodi skannaa vain 1200 Hz asti. Ei tarvitse olla samaa muistia kuin taajuus, jolla on maksimiamplitudi.

Kaikki taajuudet on kartoitettu välillä 0 - 255, tässä havaitaan ensimmäinen oktaavi, esimerkiksi 65,4 Hz - 130,8 edustaa yhtä oktaavia, 130,8 - 261,6 Hz edustaa toista. Jokaiselle oktaaville taajuudet kartoitetaan 0: sta 255: een. Kartoitus alkaa C: stä 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 -taulukon arvoja käytetään nuotin osoittamiseen havaituille taajuuksille.

tavu NoteV [13] = {8, 23, 40, 57, 76, 96, 116, 138, 162, 187, 213, 241, 255};

4. Jokaisen taajuuden nuotin laskemisen jälkeen voi olla niin, että on olemassa useita taajuuksia, jotka viittaavat samaan nuottiin. Tarkan tulostuskoodin saaminen ottaa huomioon myös toistot. Koodi laskee yhteen kaikki taajuusarvot amplitudijärjestyksen ja toistojen perusteella ja nostaa nuotin huippuihin maksimiamplitudilla.

Vaihe 2: Sovellus

Koodin käyttö on suoraviivaista, mutta on myös useita rajoituksia, jotka on pidettävä mielessä sen aikana. Koodi voidaan kopioida, koska sitä käytetään nuotin havaitsemiseen. Alla olevat kohdat on otettava huomioon sitä käytettäessä.

1. Pin -tehtävä:

Liitännän perusteella Pin -määritystä on muutettava. Kokeessa pidin sen analogisessa nastassa 7, void setup () {Serial.begin (250000); Mic_pin = A7; }

2. Mikrofonin herkkyys:

Mikrofonin herkkyyttä on muutettava, joten aaltomuoto voidaan luoda hyvällä amplitudilla. Useimmiten mikrofonimoduulissa on herkkyysasetus. sopiva herkkyys valittava siten, että signaali ei ole liian pieni eikä myöskään leikkaa pois korkeamman amplitudin vuoksi.

3. Amplitudikynnys:

Tämä koodi aktivoituu vain, jos signaalin amplitudi on riittävän korkea. käyttäjän on määritettävä tämä asetus manuaalisesti. tämä arvo riippuu mikrofonin herkkyydestä ja sovelluksesta.

jos (summa2-summa1> 5) {

..

yllä olevassa koodissa summa2 antaa RMS -arvon ja summa 1 antaa keskiarvon. joten näiden kahden arvon välinen ero antaa äänisignaalin amplitudin. minun tapauksessani se toimii kunnolla amplitudiarvolla noin 5.

4. Oletuksena tämä koodi tulostaa havaitun muistiinpanon. kuitenkin, jos aiot käyttää muistiinpanoa johonkin muuhun tarkoitukseen, tulee käyttää suoraan määritettyä numeroa. esimerkiksi C = 0; C#= 1, D = 2, D#= 3 ja siitä eteenpäin.

5. Jos laitteella on korkeampi taajuus, koodi voi antaa väärän lähdön. näytteenottotaajuus rajoittaa enimmäistaajuutta. joten voit pelata alle viivearvojen saadaksesi optimaalisen tuloksen. alla koodiviive 195 mikrosekuntia. joita voidaan säätää optimaalisen tehon saavuttamiseksi. Tämä vaikuttaa kokonaisaikaan.

{a = analoginen luku (Mic_pin) -500; // karkea nollan siirto

summa1 = summa1+a; // keskiarvoon summa2 = summa2+a*a; // RMS -arvoon a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // Hann -ikkuna = 4*a; // skaalaus floatista int -muuntoviiveeseenMikrosekuntia (195); // perustuu toimintataajuusalueeseen}

6. tämä koodi toimii vain 2000 Hz: n taajuuteen asti. poistamalla näytteenoton välisen viiveen noin 3-4 kHz näytteenottotaajuuksista.

Varotoimenpiteet:

  • Kuten EasyFFT -opetusohjelmassa mainittiin, FFT syö valtavasti Arduinon muistia. Joten jos sinulla on ohjelma, joka tarvitsee tallentaa joitain arvoja, on suositeltavaa käyttää levyä, jossa on enemmän muistia.
  • Tämä koodi voi toimia hyvin yhdelle instrumentille/laulajalle ja huono toiselle. Reaaliaikainen Tarkka havaitseminen ei ole mahdollista laskentarajoitusten vuoksi.

Vaihe 3: Kesä

Huomautusten havaitseminen on laskennallisesti intensiivistä työtä, reaaliaikaisen tuloksen saaminen on erittäin vaikeaa erityisesti Arduinolla. Tämä koodi voi antaa noin 6,6 näytettä /sekunti (195 mikrosekunnin viive lisätty). tämä koodi toimii hyvin pianon ja joidenkin muiden instrumenttien kanssa.

Toivon, että tämä koodi ja opetusohjelma ovat hyödyllisiä musiikkiin liittyvässä projektissasi. jos sinulla on epäilyksiä tai ehdotuksia, kommentoi tai lähetä viesti.

Tulevassa opetusohjelmassa muutan tätä koodia musiikin sointujen havaitsemiseksi. joten pysy kuulolla.

Suositeltava: