Мазмуну:

Arduino Music Notes Detector: 3 кадам
Arduino Music Notes Detector: 3 кадам

Video: Arduino Music Notes Detector: 3 кадам

Video: Arduino Music Notes Detector: 3 кадам
Video: Только не говори никому.. Как легко можно восстановить жидкокристаллический экран.. 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 үчүн scaling to int conversion delayMicroseconds (195); // иштөө жыштыгынын диапазонунда}

2. FFT:

Маалыматтар даяр болгондон кийин, FFT EasyFFTдин жардамы менен аткарылат. Бул EasyFFT функциясы FFTди 128 үлгү үчүн оңдоо үчүн өзгөртүлгөн. Код эс тутумун азайтуу үчүн да өзгөртүлгөн. Бизге 128 үлгү гана керек болсо, баштапкы EasyFFT функциясы 1028 үлгүгө чейин (шайкеш тактасы менен) иштелип чыккан. Бул код баштапкы 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. Амплитудалык босого:

Бул код сигналдын амплитудасы жетиштүү болсо гана активдешет. бул жөндөө колдонуучу тарабынан кол менен орнотулушу керек. бул баа микрофондун сезимталдыгына жана колдонулушуна жараша болот.

эгер (сум2-сум1> 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; // сүзүү үчүн масштабдоо int конверсияны кечиктирүүMicroseconds (195); // иштөө жыштыгынын диапазонунда}

6. бул код 2000Hz жыштыгына чейин гана иштейт. үлгүлөрдүн жыштыгынын болжол менен 3-4 кГц үлгүсүн алуу ортосундагы кечигүүнү жок кылуу менен.

Cактык чаралары:

  • EasyFFT үйрөткүчүндө айтылгандай, ФФТ Ардуинонун эс тутумун жейт. Демек, эгер сизде кандайдыр бир баалуулуктарды сактоого муктаж болгон программа болсо, анда эс тутуму жогору болгон тактаны колдонуу сунушталат.
  • Бул код бир аспапта/вокалистте жакшы иштесе, экинчисинде жаман болушу мүмкүн. Реалдуу убакытта так аныктоо эсептөө чектөөлөрүнөн улам мүмкүн эмес.

3 -кадам: Жаз

Эскертүүлөрдү аныктоо-бул эсептөөчү интенсивдүү жумуш, реалдуу убакытта чыгаруу, айрыкча Arduinoдо абдан кыйын. Бул код болжол менен 6,6 үлгү /секунд бере алат (195 микросекунддук кечигүү үчүн кошулган). Бул код фортепиано жана башка аспаптар менен жакшы иштейт.

Бул код жана үйрөткүч сиздин музыкага байланыштуу долбооруңузда пайдалуу болот деп ишенем. кандайдыр бир шек же сунуш болгон учурда комментарий же билдирүү тартынбаңыз.

Алдыдагы үйрөткүчтө мен музыкалык аккордду аныктоо үчүн бул кодду өзгөртөм. андыктан байкап туруңуз.

Сунушталууда: