Orodha ya maudhui:

Kigunduzi cha Vidokezo vya Muziki wa Arduino: Hatua 3
Kigunduzi cha Vidokezo vya Muziki wa Arduino: Hatua 3

Video: Kigunduzi cha Vidokezo vya Muziki wa Arduino: Hatua 3

Video: Kigunduzi cha Vidokezo vya Muziki wa Arduino: Hatua 3
Video: Mambo 3 Ya Kufanya Leo Ili Uondoe Stress Maishani Mwako 2024, Novemba
Anonim
Image
Image

Kugundua maelezo ya muziki kutoka kwa ishara ya sauti ni ngumu kufanya haswa kwenye Arduino kwa sababu ya kumbukumbu ndogo na nguvu ya usindikaji. Kwa ujumla, dokezo sio wimbi safi la sine linalofanya ugunduzi kuwa mgumu. Ikiwa tutachukua mabadiliko ya mara kwa mara ya vyombo anuwai vya muziki, inaweza kuwa na harmonics nyingi kulingana na kidokezo kinachochezwa. Kila chombo kina mchanganyiko wake wa saini ya anuwai anuwai. Katika nambari hii, nilijaribu kutengeneza programu ambayo inaweza kufunika vyombo vingi iwezekanavyo. Unaweza kurejelea video iliyoambatanishwa ambayo nilijaribu kujaribu anuwai ya anuwai ya anuwai, aina anuwai za tani zilizotengenezwa na kibodi, na hata sauti ya sauti inakaguliwa. Usahihi wa kugundua hutofautiana chombo kwa chombo. Kwa chombo fulani (i.e. piano) katika upeo mdogo (200-500Hz) ni sahihi, wakati chombo kingine kina usahihi mdogo (i.e. Harmonica).

Nambari hii hutumia nambari ya FFT iliyotengenezwa hapo awali iitwayo EasyFFT.

Maonyesho ya nambari yanaonyeshwa kwenye video hapo juu na aina anuwai ya sauti ya sauti na sauti.

Vifaa

- Arduino Nano / Uno au hapo juu

- Moduli ya kipaza sauti kwa Arduino

Hatua ya 1: Algorithm ya Utambuzi wa Kumbuka

Kama ilivyoelezwa katika hatua ya awali, kugundua ni ngumu kwa sababu ya uwepo wa masafa mengi kwenye sampuli za sauti.

Programu inafanya kazi katika mtiririko ufuatao:

1. Upataji wa data:

- sehemu hii inachukua sampuli 128 kutoka kwa data ya sauti, utengano kati ya sampuli mbili (masampuli ya sampuli) kulingana na masafa ya riba. Katika kesi hii, tunatumia nafasi kati ya sampuli mbili hutumiwa kutumia kazi ya dirisha la Hann na hesabu ya amplitude / RMS. Nambari hii pia hufanya sifuri mbaya kwa kutoa 500 kutoka kwa thamani ya kusoma. Thamani hii inaweza kubadilishwa ikiwa inahitajika. Kwa kesi ya kawaida, maadili haya hufanya kazi vizuri. Zaidi ya hayo, ucheleweshaji fulani unahitaji kuongezwa ili kuwa na mzunguko wa sampuli wa karibu 1200Hz. katika kesi ya masampuli ya mzunguko wa 1200Hz ya masafa ya HZ 600 yanaweza kugunduliwa.

kwa (int i = 0; i <128; i ++) {a = AnalogSoma (Mic_pin) -500; // mbaya zero shift sum1 = sum1 + a; // kwa wastani wa jumla ya thamani2 = jumla2 + a * a; // kwa thamani ya RMS a = a * (dhambi (i * 3.14 / 128) * dhambi (i * 3.14 / 128)); // Hann dirisha katika = 4 * a; // kuongeza kwa kuelea kwa ucheleweshaji wa ubadilishaji wa introMicroseconds (195); // kulingana na masafa ya operesheni}

2. FFT:

Mara tu data iko tayari, FFT inafanywa kwa kutumia EasyFFT. Kazi hii ya EasyFFT imebadilishwa kurekebisha FFT kwa sampuli 128. Nambari pia imebadilishwa ili kupunguza matumizi ya kumbukumbu. Kazi ya awali ya EasyFFT iliyoundwa kuwa na hadi sampuli 1028 (na bodi inayoendana), wakati tunahitaji sampuli 128 tu. nambari hii inapunguza matumizi ya kumbukumbu ya karibu 20% ikilinganishwa na kazi ya awali ya EasyFFT.

Mara baada ya FFT kufanywa, nambari inarudisha kilele cha juu zaidi cha masafa 5 kwa uchambuzi zaidi. Masafa haya yamepangwa kwa utaratibu wa kushuka kwa amplitude.

3. Kwa kila kilele, nambari inagundua maelezo yanayoweza kuhusishwa nayo. nambari hii hutazama tu hadi 1200 Hz. Sio lazima kuwa na kumbuka sawa na masafa na amplitude ya juu.

Masafa yote yamepangwa kati ya 0 hadi 255, hapa octave ya kwanza hugunduliwa, kwa mfano, 65.4 Hz hadi 130.8 inawakilisha octave moja, 130.8 Hz hadi 261.6 Hz inawakilisha nyingine. Kwa kila octave, masafa yamepangwa kutoka 0 hadi 255. hapa ramani inayoanzia C hadi C '.

ikiwa (f_peaks > 1040) {f_peaks = 0;} ikiwa (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);}

Thamani za safu ya KumbukaV hutumiwa kupeana maandishi kwa masafa yaliyogunduliwa.

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

4. Baada ya kuhesabu dokezo kwa kila mzunguko inaweza kuwa kesi kwamba kuna masafa anuwai ambayo yapo ambayo yanaonyesha maandishi sawa. Kuwa na nambari sahihi ya pato pia inazingatia marudio. Nambari hiyo inaongeza maadili yote ya masafa kulingana na mpangilio wa amplitude na marudio na inaongeza kilele na kiwango cha juu kabisa.

Hatua ya 2: Matumizi

Kutumia nambari ni moja kwa moja mbele, hata hivyo, pia kuna mapungufu mengi ambayo yanahitaji kuzingatiwa akilini wakati. Nambari inaweza kunakiliwa kama inatumiwa kugundua maandishi. Pointi hapa chini zinahitaji kuzingatiwa wakati wa kuitumia.

1. Kazi ya Pini:

Kulingana na mgawo wa Pin ulioambatanishwa unahitaji kubadilishwa. Kwa jaribio langu, niliiweka kwenye Analog pin 7, kuanzisha batili () {Serial.begin (250000); Mic_pin = A7; }

2. Usikivu wa kipaza sauti:

Usikivu wa kipaza sauti unahitaji kurekebishwa umbizo kama hilo linaweza kuzalishwa na amplitude nzuri. Kwa kawaida, moduli ya Sauti ya Sauti inakuja na mpangilio wa unyeti. unyeti unaofaa kuchaguliwa kama ishara hiyo sio ndogo sana na pia haikatwi kwa sababu ya ukubwa wa juu.

3. Kizingiti cha Amplitude:

Nambari hii inafanya kazi ikiwa tu saizi ya ishara ikiwa ni ya kutosha. mpangilio huu unahitaji kuwekwa na mtumiaji mwenyewe. Thamani hii inategemea unyeti wa kipaza sauti na pia matumizi.

ikiwa (jumla2-jumla1> 5) {

..

katika nambari iliyo hapo juu, sum2 inatoa thamani ya RMS wakati jumla 1 inatoa thamani ya maana. kwa hivyo tofauti kati ya maadili haya mawili inatoa ukubwa wa ishara ya sauti. kwa upande wangu, inafanya kazi vizuri na kiwango cha amplitude ya karibu 5.

4. Kwa chaguo-msingi, nambari hii itachapisha maandishi yaliyogunduliwa. Walakini, ikiwa unapanga kutumia noti hiyo kwa sababu nyingine, nambari iliyopewa moja kwa moja inapaswa kutumiwa. kwa mfano C = 0; C # = 1, D = 2, D # = 3 na kuendelea.

5. Ikiwa chombo kina masafa ya juu, nambari inaweza kutoa pato la uwongo. mzunguko wa juu umepunguzwa na mzunguko wa sampuli. kwa hivyo unaweza kucheza karibu chini ya maadili ya kuchelewesha kupata pato bora. katika ucheleweshaji wa nambari chini ya microseconds 195. ambayo inaweza kubadilishwa ili kupata pato bora. Hii itaathiri wakati wote wa utekelezaji.

{a = Soma Analog (Mic_pin) -500; // mabadiliko mabaya ya sifuri

jumla1 = jumla1 + a; // kwa wastani wa jumla ya thamani2 = jumla2 + a * a; // kwa thamani ya RMS a = a * (dhambi (i * 3.14 / 128) * dhambi (i * 3.14 / 128)); // Hann dirisha katika = 4 * a; // kuongeza kwa kuelea kwa ucheleweshaji wa ubadilishaji wa introMicroseconds (195); // kulingana na masafa ya operesheni}

6. nambari hii itafanya kazi hadi masafa ya 2000Hz. kwa kuondoa ucheleweshaji kati ya sampuli karibu 3-4 kHz ya masafa ya sampuli zinaweza kupatikana.

Tahadhari:

  • Kama ilivyoelezwa katika mafunzo ya EasyFFT, FFT inakula kumbukumbu kubwa ya Arduino. Kwa hivyo ikiwa una programu ambayo inahitaji kuhifadhi maadili kadhaa inashauriwa kutumia ubao ulio na kumbukumbu ya juu.
  • Nambari hii inaweza kufanya kazi vizuri kwa ala / mwimbaji mmoja na mbaya kwa mwingine. Utambuzi sahihi wa wakati halisi hauwezekani kwa sababu ya mapungufu ya kihesabu.

Hatua ya 3: Summery

Kugundua kumbuka ni kazi kubwa ya hesabu, kupata pato la wakati halisi ni ngumu sana haswa kwenye Arduino. Nambari hii inaweza kutoa karibu sampuli / sekunde 6.6 (kwa kucheleweshwa kwa microseconds 195). nambari hii inafanya kazi vizuri na piano na vyombo vingine.

Natumahi nambari hii na mafunzo yatasaidia katika mradi wako unaohusiana na muziki. ikiwa kuna shaka yoyote au maoni jisikie huru kutoa maoni au ujumbe.

Katika mafunzo yanayokuja, nitabadilisha nambari hii kwa utambuzi wa gumzo la muziki. kwa hivyo kaa chonjo.

Ilipendekeza: