جدول المحتويات:
فيديو: كاشف ملاحظات الموسيقى اردوينو: 3 خطوات
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:37
من الصعب الكشف عن الملاحظات الموسيقية من الإشارة الصوتية خاصة على 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 ميكروثانية تأخير). هذا الرمز يعمل بشكل جيد مع البيانو وبعض الآلات الأخرى.
آمل أن يكون هذا الرمز والبرنامج التعليمي مفيدًا في مشروعك المتعلق بالموسيقى. في حالة وجود أي شك أو اقتراح لا تتردد في التعليق أو الرسالة.
في البرنامج التعليمي القادم ، سأقوم بتعديل هذا الرمز لاكتشاف وتر الموسيقى. ابقي على اتصال.
موصى به:
كيفية تعديل المؤازرة للحصول على ملاحظات الحلقة المغلقة: 7 خطوات
كيفية تعديل المؤازرة للحصول على ملاحظات الحلقة المغلقة: أثناء قيادة المؤازرة باستخدام متحكم دقيق (مثل Arduino) ، يمكنك فقط إعطائه أوامر الموقع المستهدف (في إشارة PPM). مع هذا الطلب ، سينتقل المؤازر إلى هذا الهدف موقعك. لكنها ليست لحظية! أنت لا تعرف بالضبط متى
فتحت باب المرآب مع ملاحظات باستخدام Esp8266 كخادم ويب: 6 خطوات
فتح باب المرآب مع ملاحظات باستخدام Esp8266 كخادم ويب: مرحبًا ، سأوضح لك كيفية عمل طريقة بسيطة للقيام بفتح باب المرآب. - ESP8266 مشفر كخادم ويب ، يمكن فتح الباب في كل مكان في العالم - باستخدام ملاحظات ، ستعرف أن الباب مفتوح أو مغلق في الوقت الفعلي - بسيط ، اختصار واحد فقط لجعلني
فاتنة ملاحظات الفيديو ماندالا: 6 خطوات
ماندالا مدهش بملاحظات الفيديو: في هذا Instructable ، سأوضح لك كيفية إنشاء ماندالا فيديو رائعة باستخدام كاميرا وشاشة فقط ، والتي يمكنك العثور عليها عادةً في متجر التوفير بحوالي 50 دولارًا. سيتم إنشاء الصورة على الشاشة بدون أي شيء
أرخص اردوينو -- أصغر اردوينو -- اردوينو برو ميني -- البرمجة -- اردوينو نينو: 6 خطوات (مع صور)
أرخص اردوينو || أصغر اردوينو || اردوينو برو ميني || البرمجة || اردوينو نينو: …………………………. الرجاء الاشتراك في قناتي على يوتيوب لمزيد من مقاطع الفيديو ……. يدور هذا المشروع حول كيفية التعامل مع أصغر وأرخص اردوينو على الإطلاق. أصغر وأرخص اردوينو هو اردوينو برو ميني. إنه مشابه لاردوينو
كاشف الدخان IOT: تحديث كاشف الدخان الموجود باستخدام IOT: 6 خطوات (بالصور)
كاشف الدخان IOT: تحديث كاشف الدخان الموجود باستخدام IOT: قائمة المساهمين ، المخترع: Tan Siew Chin ، Tan Yit Peng ، Tan Wee Heng المشرف: الدكتور Chia Kim Seng ، قسم الهندسة الميكاترونية والروبوتية ، كلية الهندسة الكهربائية والإلكترونية ، Universiti Tun حسين اون ماليزيا توزيع