Мазмұны:

Arduino музыкалық ноталар детекторы: 3 қадам
Arduino музыкалық ноталар детекторы: 3 қадам

Бейне: Arduino музыкалық ноталар детекторы: 3 қадам

Бейне: Arduino музыкалық ноталар детекторы: 3 қадам
Бейне: ноталар 2024, Қараша
Anonim
Image
Image

Дыбыстық сигналдан музыкалық ноталарды анықтау әсіресе жады мен өңдеу қуаты шектеулі болғандықтан Arduino -да қиын. Әдетте, нота анықтауды қиындататын таза синусоид емес. Егер біз әр түрлі музыкалық аспаптардың жиілік түрленуін қабылдайтын болсақ, онда ойналатын нотаның негізінде бірнеше гармоника болуы мүмкін. Әр аспапта әр түрлі гармониканың өзіндік қолтаңбасы бар. Бұл кодта мен мүмкіндігінше көп құралдарды қамти алатын бағдарлама жасауға тырыстым. Сіз мен әр түрлі аспаптарды, пернетақтадан шығарылатын әр түрлі дыбыстарды, тіпті вокалдың дыбысын тексеруге тырысқан бейнеге сілтеме жасай аласыз. Анықтау дәлдігі әр аспапта әр түрлі болады. Кейбір аспаптар үшін (яғни фортепиано) шектеулі диапазонда (200-500 Гц) дәл, ал кейбір аспаптарда дәлдігі төмен (яғни Гармоника).

Бұл код бұрын әзірленген EasyFFT деп аталатын FFT кодын қолданады.

Кодтың демонстрациясы жоғарыдағы бейнеде аспаптық дыбыстың әр түрлі түрлерімен, сонымен қатар вокалмен көрсетілген.

Жабдықтар

- Arduino Nano/Uno немесе одан жоғары

- Arduino үшін микрофон модулі

1 -қадам: Ескертуді анықтау алгоритмі

Алдыңғы қадамда айтылғандай, аудио үлгілерде көптеген жиіліктердің болуына байланысты анықтау қиын.

Бағдарлама келесі ағынмен жұмыс істейді:

1. Мәліметтерді алу:

- бұл бөлім аудио мәліметтерден 128 үлгіні алады, қызығушылық жиілігіне байланысты екі үлгіні бөлу (іріктеу жиілігі). Бұл жағдайда біз екі үлгі арасындағы бос орынды Ганн терезесінің функциясын, сонымен қатар амплитудасын/RMS есептеуді қолдану үшін қолданамыз. Бұл код аналогты мәннен 500 -ді алып тастау арқылы өрескел нөлдеуді де жасайды. Қажет болса, бұл мәнді өзгертуге болады. Әдеттегі жағдай үшін бұл мәндер жақсы жұмыс істейді. Сонымен қатар, 1200 Гц айналасындағы іріктеу жиілігі болуы үшін біраз кідірісті қосу қажет. 1200 Гц іріктеу жиілігі кезінде максимум 600 Гц жиілікті анықтауға болады.

for (int i = 0; i <128; i ++) {a = analogRead (Mic_pin) -500; // өрескел нөлдік ығысу сом1 = sum1+a; // орташа мәнге sum2 = sum2+a*a; // RMS мәніне a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // = 4*a ішіндегі Ханн терезесі; // float to int түрлендіруінің кешігуінің масштабыMicroseconds (195); // жұмыс жиілігінің диапазонына негізделген}

2. FFT:

Деректер дайын болғаннан кейін FFT EasyFFT көмегімен орындалады. Бұл EasyFFT функциясы 128 үлгі үшін FFT түзету үшін өзгертілген. Сондай -ақ, код жадты тұтынуды азайту үшін өзгертілген. Түпнұсқа EasyFFT функциясы 1028 үлгіге дейін (үйлесімді тақтамен), ал бізге тек 128 үлгі қажет. бұл код бастапқы EasyFFT функциясымен салыстырғанда жад шығынын шамамен 20% төмендетеді.

FFT аяқталғаннан кейін, код одан әрі талдау үшін жиіліктің ең басым 5 шыңын қайтарады. Бұл жиілік амплитудасының кему ретімен орналасқан.

3. Әр шың үшін код онымен байланысты ықтимал жазбаларды анықтайды. бұл код тек 1200 Гц дейінгі сканерлейді. Максималды амплитудасы бар жиілік сияқты ескерту қажет емес.

Барлық жиіліктер 0 -ден 255 -ке дейін салыстырылады.

мұнда бірінші октава анықталады, мысалы, 65,4 Гц - 130,8 бір октаваны, 130,8 Гц - 261,6 Гц екіншісін білдіреді. Әр октава үшін жиіліктер 0 -ден 255 -ке дейін салыстырылады. Мұнда картография С -тан С -ға дейін.

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 жиымының мәндері жазбаны анықталған жиіліктерге тағайындау үшін қолданылады.

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

4. Әр жиілікке ескертуді есептегеннен кейін, бір нотаны білдіретін бірнеше жиіліктер болуы мүмкін. Нақты шығу коды болуы үшін қайталауды да қарастырады. Код амплитудалық тәртіпке және қайталауға негізделген барлық жиілік мәндерін қосады және максималды амплитудасы бар жазбаны шыңға шығарады.

2 -қадам: Өтініш

Кодты пайдалану тікелей, алайда, сонымен қатар, көптеген шектеулер бар, оларды ескеру қажет. Жазбаны анықтау үшін кодты көшіруге болады. Оны пайдалану кезінде төмендегі тармақтарды ескеру қажет.

1. Пин тағайындау:

Қосылған пин негізінде тағайындауды өзгерту қажет. Эксперимент үшін мен оны аналогтық пин 7 -де сақтадым, void setup () {Serial.begin (250000); Mic_pin = A7; }

2. Микрофон сезімталдығы:

Микрофон сезімталдығын өзгерту қажет, мұндай толқын пішіні жақсы амплитудада жасалуы мүмкін. Көбінесе микрофон модулі сезімталдық параметрімен келеді. сигналдың амплитудасы тым кіші емес, сонымен қатар үзілмейтін етіп сәйкес сезімталдықты таңдау керек.

3. Амплитудалық табалдырық:

Бұл код сигнал амплитудасы жеткілікті жоғары болса ғана іске қосылады. бұл параметрді қолданушы қолмен орнатуы керек. Бұл мән микрофон сезімталдығына және қолданылуына байланысты.

егер (sum2-sum1> 5) {

..

жоғарыдағы кодта sum2 RMS мәнін береді, ал 1 сомасы орташа мәнді береді. сондықтан бұл екі мән арасындағы айырмашылық дыбыстық сигналдың амплитудасын береді. менің жағдайда, ол амплитудасы шамамен 5 -ке сәйкес жұмыс істейді.

4. Әдепкі бойынша, бұл код анықталған жазбаны басып шығарады. алайда егер сіз жазбаны басқа мақсатта қолдануды жоспарласаңыз, онда тікелей тағайындалған нөмірді қолдану қажет. мысалы C = 0; C#= 1, D = 2, D#= 3 және одан әрі.

5. Егер құралдың жиілігі жоғары болса, код жалған шығыс беруі мүмкін. максималды жиілік іріктеу жиілігімен шектеледі. оңтайлы нәтиже алу үшін кешігу мәндерінің астында ойнауға болады. төмендегі кодта 195 микросекундқа кешігу. оңтайлы өнім алу үшін оны өзгертуге болады. Бұл жалпы орындалу уақытына әсер етеді.

{a = analogRead (Mic_pin) -500; // өрескел нөлдік ығысу

sum1 = sum1+a; // орташа мәнге sum2 = sum2+a*a; // RMS мәніне a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // = 4*a ішіндегі Ханн терезесі; // float to int түрлендіруінің кешігуінің масштабыMicroseconds (195); // жұмыс жиілігінің диапазонына негізделген}

6. бұл код тек 2000 Гц жиілікке дейін жұмыс істейді. іріктеу арасындағы кідірісті жою арқылы шамамен 3-4 кГц іріктеу жиіліктерін алуға болады.

Сақтық шаралары:

  • EasyFFT оқулығында айтылғандай, FFT Arduino жадының үлкен көлемін жейді. Егер сізде кейбір мәндерді сақтау қажет бағдарлама болса, жады жоғары тақтаны пайдалану ұсынылады.
  • Бұл код бір аспапта/вокалистте жақсы жұмыс істесе, екіншісінде нашар болуы мүмкін. Нақты уақытта есептеу шектеулеріне байланысты дәл анықтау мүмкін емес.

3 -қадам: жаз

Ескертулерді анықтау-бұл қарқынды жұмыс, нақты уақыттағы өнімді шығару өте қиын, әсіресе Arduino. Бұл код шамамен 6,6 үлгі /секунд бере алады (195 микросекундқа кідіріс қосылды). бұл код фортепианода және басқа да аспаптарда жақсы жұмыс істейді.

Бұл код пен оқулық сіздің музыкаға қатысты жобаңызда пайдалы болады деп үміттенемін. кез келген күмән немесе ұсыныс болса, түсініктеме немесе хабарлама жіберіңіз.

Алдағы оқулықта мен музыкалық аккордты анықтау үшін осы кодты өзгертемін. сондықтан күтіңіз.

Ұсынылған: