Агуулгын хүснэгт:

Arduino хөгжмийн тэмдэглэл илрүүлэгч: 3 алхам
Arduino хөгжмийн тэмдэглэл илрүүлэгч: 3 алхам

Видео: Arduino хөгжмийн тэмдэглэл илрүүлэгч: 3 алхам

Видео: Arduino хөгжмийн тэмдэглэл илрүүлэгч: 3 алхам
Видео: Аймшигт сүнсний 35 видео: 2023 оны Мега эмхэтгэл [V1] 2024, Арваннэгдүгээр
Anonim
Image
Image

Аудио дохионоос хөгжмийн тэмдэглэлийг илрүүлэх нь санах ой, боловсруулалтын хүчин чадал хязгаарлагдмал тул Arduino дээр үүнийг хийхэд хэцүү байдаг. Ерөнхийдөө тэмдэглэл нь илрүүлэхэд хүндрэл учруулдаг цэвэр синус долгион биш юм. Хэрэв бид янз бүрийн хөгжмийн зэмсгийн давтамжийн хувиргалтыг авч үзвэл тоглож буй нот дээр үндэслэн олон гармоник агуулж болно. Хэрэгсэл бүр өөрийн гэсэн гарын үсэг бүхий янз бүрийн гармоник хослолтой байдаг. Энэ кодонд би аль болох олон хэрэгслийг багтаасан програм хийхийг оролдсон. Би хавсаргасан видеог үзээд янз бүрийн төрлийн багаж хэрэгсэл, гарны янз бүрийн өнгө аяс, тэр байтугай дууны дууг шалгахыг оролдсон болно. Илрүүлэх нарийвчлал нь багаж тус бүрт өөр өөр байдаг. Хязгаарлагдмал хүрээнд (200-500Гц) зарим хөгжмийн зэмсгийн хувьд (жишээ нь төгөлдөр хуур) нарийвчлал сайтай байдаг бол зарим хэрэгсэлд нарийвчлал багатай байдаг (жишээ нь Harmonica).

Энэ код нь өмнө нь боловсруулсан 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; // to 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; // to RMS утга a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // = 4*a дахь Ханн цонх; // float to int -ийн хөрвүүлэлтийг хойшлуулах масштабыг нэмэгдүүлэхMicroseconds (195); // ажиллагааны давтамжийн мужид үндэслэсэн}

6. Энэ код нь зөвхөн 2000Hz давтамж хүртэл ажиллах болно. 3-4 кГц орчим түүвэрлэх давтамжийг авах боломжтой.

Урьдчилан сэргийлэх:

  • EasyFFT зааварт дурдсанчлан, FFT нь Arduino -ийн асар их санах ойг иддэг. Тиймээс, хэрэв танд зарим утгыг хадгалах програм байгаа бол илүү өндөр санах ойтой самбар ашиглахыг зөвлөж байна.
  • Энэ код нь нэг хэрэгсэл/гоцлол дуучны хувьд сайн, нөгөө нь муу байж магадгүй юм. Тооцооллын хязгаарлалтын улмаас бодит цаг хугацаанд нарийвчлалтай илрүүлэх боломжгүй байна.

Алхам 3: Зун

Тэмдэглэл илрүүлэх нь тооцооллын хувьд маш эрчимтэй ажил бөгөөд бодит цаг хугацаанд гаралт авах нь ялангуяа Arduino дээр маш хэцүү байдаг. Энэ код нь ойролцоогоор 6.6 дээж /секунд өгөх боломжтой (195 микросекунд саатал нэмэгдсэн). Энэ код нь төгөлдөр хуур болон бусад бусад хэрэгслүүдтэй сайн ажилладаг.

Энэхүү код, заавар нь хөгжимтэй холбоотой төсөлд тань тусална гэж найдаж байна. ямар нэгэн эргэлзээ, санал байвал чөлөөтэй сэтгэгдэл бичих эсвэл мессеж бичих боломжтой.

Удахгүй болох хичээл дээр би хөгжмийн хөвч илрүүлэх энэ кодыг өөрчлөх болно. тиймээс биднийг хүлээж байгаарай.

Зөвлөмж болгож буй: