جدول المحتويات:

كاشف ملاحظات الموسيقى اردوينو: 3 خطوات
كاشف ملاحظات الموسيقى اردوينو: 3 خطوات

فيديو: كاشف ملاحظات الموسيقى اردوينو: 3 خطوات

فيديو: كاشف ملاحظات الموسيقى اردوينو: 3 خطوات
فيديو: أختبار عذرية البنت 😍 | 2023 2024, شهر نوفمبر
Anonim
Image
Image

من الصعب الكشف عن الملاحظات الموسيقية من الإشارة الصوتية خاصة على Arduino بسبب محدودية الذاكرة وقوة المعالجة. بشكل عام ، المذكرة ليست موجة جيبية خالصة تجعل عملية الكشف صعبة. إذا أخذنا تحويل التردد لمختلف الآلات الموسيقية ، فقد يحتوي على توافقيات متعددة بناءً على النوتة الموسيقية التي يتم عزفها. كل آلة لها مزيج التوقيع الخاص بها من التوافقيات المختلفة. في هذا الكود ، حاولت إنشاء برنامج يمكنه تغطية أكبر عدد ممكن من الأدوات. يمكنك الرجوع إلى الفيديو المرفق الذي حاولت فيه اختبار أنواع مختلفة من الآلات ، وأنواع مختلفة من النغمات التي تولدها لوحة المفاتيح ، وحتى صوت الصوت. دقة الكشف تختلف من أداة إلى أخرى. بالنسبة لبعض الآلات (مثل البيانو) في نطاق محدود (200-500 هرتز) فهي دقيقة ، في حين أن بعض الآلات لها دقة منخفضة (مثل هارمونيكا).

يستخدم هذا الرمز رمز FFT تم تطويره مسبقًا يسمى EasyFFT.

يتم عرض شرح الرمز في الفيديو أعلاه مع أنواع مختلفة من صوت الآلة بالإضافة إلى الصوت.

اللوازم

- اردوينو نانو / أونو أو أعلى

- وحدة ميكروفون لاردوينو

الخطوة 1: خوارزمية لكشف الملاحظات

كما ذكرنا في الخطوة السابقة ، فإن الكشف صعب بسبب وجود ترددات متعددة في عينات الصوت.

يعمل البرنامج في التدفق التالي:

1. الحصول على البيانات:

- يأخذ هذا القسم 128 عينة من البيانات السمعية ، والفصل بين عينتين (تردد أخذ العينات) حسب تردد الاهتمام. في هذه الحالة ، نستخدم التباعد بين عينتين لتطبيق وظيفة Hann window وكذلك حساب السعة / RMS. يقوم هذا الكود أيضًا بعملية التصفير التقريبي بطرح 500 من قيمة القراءة التناظرية. يمكن تغيير هذه القيمة إذا لزم الأمر. في حالة نموذجية ، تعمل هذه القيم بشكل جيد. علاوة على ذلك ، يجب إضافة بعض التأخير حتى يكون تردد أخذ العينات حوالي 1200 هرتز. في حالة 1200 هرتز يمكن اكتشاف تردد أخذ العينات بحد أقصى 600 هرتز.

لـ (int i = 0 ؛ i <128 ؛ i ++) {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)) ؛ // نافذة Hann في = 4 * a ؛ // التحجيم من أجل تعويم إلى تأخير التحويل intMicroseconds (195) ؛ // بناءً على نطاق تردد التشغيل}

2. FFT:

بمجرد أن تصبح البيانات جاهزة ، يتم إجراء FFT باستخدام EasyFFT. تم تعديل وظيفة EasyFFT هذه لإصلاح FFT لـ 128 عينة. تم تعديل الكود أيضًا لتقليل استهلاك الذاكرة. تم تصميم وظيفة EasyFFT الأصلية بحيث تحتوي على ما يصل إلى 1028 عينة (مع اللوحة المتوافقة) ، بينما نحتاج فقط إلى 128 عينة. يقلل هذا الرمز من استهلاك الذاكرة بحوالي 20٪ مقارنة بوظيفة EasyFFT الأصلية.

بمجرد الانتهاء من FFT ، تُرجع الشفرة أعلى 5 قمم تردد مهيمنة لمزيد من التحليل. يتم ترتيب هذا التردد بترتيب تنازلي من حيث السعة.

3. لكل ذروة ، يكتشف الكود الملاحظات المحتملة المرتبطة به. يقوم هذا الرمز بمسح حتى 1200 هرتز فقط. ليس من الضروري ملاحظة نفس التردد مع السعة القصوى.

يتم تعيين جميع الترددات بين 0 إلى 255 ،

هنا يتم الكشف عن أوكتاف الأول ، على سبيل المثال ، يمثل 65.4 هرتز إلى 130.8 أوكتافًا واحدًا ، ويمثل 130.8 هرتز إلى 261.6 هرتز آخر. لكل أوكتاف ، يتم تعيين الترددات من 0 إلى 255. هنا رسم الخرائط بدءًا من C إلى 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 لتعيين الملاحظة للترددات المكتشفة.

بايت NoteV [13] = {8، 23، 40، 57، 76، 96، 116، 138، 162، 187، 213، 241، 255} ؛

4. بعد حساب الملاحظة لكل تردد ، قد يكون هناك عدة ترددات موجودة مما يوحي بنفس الملاحظة. للحصول على رمز إخراج دقيق ، يجب أيضًا مراعاة التكرار. يجمع الكود جميع قيم التردد بناءً على ترتيب السعة والتكرار ويبلغ ذروته مع السعة القصوى.

الخطوة الثانية: التقديم

يعد استخدام الكود أمرًا مباشرًا ، ومع ذلك ، هناك أيضًا العديد من القيود التي يجب وضعها في الاعتبار أثناء ذلك. يمكن نسخ الكود حيث يتم استخدامه للكشف عن الملاحظات. يجب مراعاة النقاط أدناه أثناء استخدامه.

1. تحديد رقم التعريف الشخصي:

بناءً على تعيين رقم التعريف الشخصي المرفق ، يلزم تعديله. بالنسبة لتجربتي ، احتفظت بها على Analog pin 7 ،

إعداد باطل () {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)) ؛ // نافذة Hann في = 4 * a ؛ // التحجيم من أجل تعويم إلى تأخير التحويل intMicroseconds (195) ؛ // بناءً على نطاق تردد العملية}

6. سيعمل هذا الرمز فقط حتى تردد 2000 هرتز. من خلال القضاء على التأخير بين أخذ العينات حول kHz 3-4 من ترددات أخذ العينات يمكن الحصول عليها.

احتياطات:

  • كما هو مذكور في البرنامج التعليمي EasyFFT ، تستهلك FFT قدرًا كبيرًا من ذاكرة Arduino. لذلك إذا كان لديك برنامج يحتاج إلى تخزين بعض القيم ، فمن المستحسن استخدام لوحة ذات ذاكرة أعلى.
  • قد يعمل هذا الرمز جيدًا مع آلة / مطرب وسيئ لآلة أخرى. لا يمكن الاكتشاف الدقيق في الوقت الفعلي بسبب القيود الحسابية.

الخطوة 3: تلخيصي

يعد اكتشاف الملاحظات عملاً حسابيًا مكثفًا ، كما أن الحصول على مخرجات في الوقت الفعلي أمر صعب للغاية خاصة على Arduino. يمكن أن يعطي هذا الرمز حوالي 6.6 عينة / ثانية (مع إضافة 195 ميكروثانية تأخير). هذا الرمز يعمل بشكل جيد مع البيانو وبعض الآلات الأخرى.

آمل أن يكون هذا الرمز والبرنامج التعليمي مفيدًا في مشروعك المتعلق بالموسيقى. في حالة وجود أي شك أو اقتراح لا تتردد في التعليق أو الرسالة.

في البرنامج التعليمي القادم ، سأقوم بتعديل هذا الرمز لاكتشاف وتر الموسيقى. ابقي على اتصال.

موصى به: