فهرست مطالب:
تصویری: آشکارساز یادداشت های موسیقی آردوینو: 3 مرحله
2024 نویسنده: John Day | [email protected]. آخرین اصلاح شده: 2024-01-30 08:53
تشخیص نت های موسیقی از سیگنال صوتی به ویژه در آردوینو به دلیل محدودیت حافظه و قدرت پردازشی دشوار است. به طور کلی ، یادداشت یک موج سینوسی خالص نیست که تشخیص را دشوار کند. اگر فرکانس سازهای مختلف موسیقی را در نظر بگیریم ، ممکن است بر اساس نت در حال اجرا دارای هارمونیک های متعددی باشد. هر ساز ترکیبی از امضای هارمونیک های مختلف خود را دارد. در این کد ، من سعی کردم برنامه ای بسازم که بتواند تا آنجا که ممکن است سازها را پوشش دهد. ممکن است به ویدئوی پیوست شده مراجعه کنید که در آن سعی کردم انواع سازها ، انواع مختلف آهنگ های ایجاد شده توسط صفحه کلید و حتی صدای آوازی را بررسی کنم. دقت تشخیص در دستگاه های مختلف متفاوت است. برای برخی از سازها (یعنی پیانو) در محدوده محدود (200-500 هرتز) دقیق است ، در حالی که برخی از سازها دارای دقت پایین هستند (یعنی هارمونیکا).
این کد از یک کد FFT که قبلاً توسعه یافته به نام EasyFFT استفاده می کند.
نمایش کد در ویدئوی بالا با انواع مختلف صدای ساز و همچنین آوازی نشان داده شده است.
تدارکات
- Arduino Nano/Uno یا بالاتر
- ماژول میکروفون برای آردوینو
مرحله 1: الگوریتم تشخیص یادداشت ها
همانطور که در مرحله قبل ذکر شد ، تشخیص به دلیل وجود فرکانس های متعدد در نمونه های صوتی دشوار است.
برنامه به صورت زیر عمل می کند:
1. جمع آوری داده ها:
- در این بخش 128 نمونه از داده های صوتی گرفته می شود ، که بین دو نمونه (فرکانس نمونه برداری) بسته به فراوانی مورد نظر جدا می شود. در این مورد ، ما از فاصله بین دو نمونه برای اعمال عملکرد پنجره Hann و همچنین محاسبه دامنه/RMS استفاده می کنیم. این کد همچنین با کسر 500 از مقدار خوانده شده آنالوگ صفر می کند. در صورت نیاز می توان این مقدار را تغییر داد. برای یک مورد معمولی ، این مقادیر به خوبی کار می کنند. بعلاوه ، باید تاخیری به آن اضافه شود تا فرکانس نمونه برداری در حدود 1200 هرتز باشد. در مورد فرکانس نمونه برداری 1200Hz حداکثر فرکانس 600 HZ قابل تشخیص است.
برای (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)) ؛ // پنجره هان در = 4*a؛ // مقیاس بندی برای تأخیر تبدیل float به int میکرو ثانیه (195) ؛ // بر اساس محدوده فرکانس عملکرد}
2. FFT:
پس از آماده شدن داده ها ، FFT با استفاده از EasyFFT انجام می شود. این عملکرد EasyFFT برای رفع FFT برای 128 نمونه اصلاح شده است. کد نیز برای کاهش مصرف حافظه اصلاح شده است. عملکرد EasyFFT اصلی برای داشتن حداکثر 1028 نمونه (با برد سازگار) طراحی شده است ، در حالی که ما فقط به 128 نمونه نیاز داریم. این کد در مقایسه با عملکرد EasyFFT اصلی ، مصرف حافظه را حدود 20 درصد کاهش می دهد.
پس از انجام 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- پس از محاسبه نت برای هر فرکانس ، ممکن است فرکانس های متعددی وجود داشته باشند که نت یکسانی را نشان می دهد. برای داشتن کد خروجی دقیق نیز تکرارها را در نظر بگیرید. کد همه مقادیر فرکانس را بر اساس ترتیب دامنه و تکرارها جمع می کند و با حداکثر دامنه ، نت را به حداکثر می رساند.
مرحله 2: برنامه
استفاده از کد مستقیماً رو به جلو است ، با این حال ، محدودیت های متعددی نیز وجود دارد که باید هنگام استفاده از آن در نظر داشته باشید. کد را می توان کپی کرد زیرا برای تشخیص یادداشت استفاده می شود. نکات زیر هنگام استفاده از آن باید مورد توجه قرار گیرد.
1. تخصیص پین:
با توجه به پیوند ضمیمه شده ، باید تغییر دهید. برای آزمایش من ، آن را در پین 7 آنالوگ نگه داشتم ،
void setup () {Serial.begin (250000)؛ Mic_pin = A7؛ }
2. حساسیت میکروفون:
حساسیت میکروفون باید اصلاح شود تا شکل موج با دامنه خوب ایجاد شود. بیشتر ماژول میکروفون دارای تنظیمات حساسیت است. حساسیت مناسب برای انتخاب به گونه ای که سیگنال نه خیلی کوچک باشد و نه به دلیل دامنه بیشتر قطع شود.
3. آستانه دامنه:
این کد تنها در صورتی فعال می شود که دامنه سیگنال به اندازه کافی بالا باشد. این تنظیم باید توسط کاربر به صورت دستی تنظیم شود. این مقدار بستگی به حساسیت میکروفون و همچنین کاربرد دارد.
if (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 به int میکرو ثانیه (195) ؛ // بر اساس محدوده فرکانس عملکرد}
6. این کد فقط تا فرکانس 2000Hz کار می کند. با حذف تاخیر بین نمونه برداری در حدود 3-4 کیلوهرتز فرکانس نمونه برداری می توان به دست آورد.
موارد احتیاط:
- همانطور که در آموزش EasyFFT ذکر شد ، FFT حجم زیادی از حافظه آردوینو را می خورد. بنابراین اگر برنامه ای دارید که نیاز به ذخیره مقادیر دارد ، توصیه می شود از یک برد با حافظه بالاتر استفاده کنید.
- این کد ممکن است برای یک ساز/خواننده خوب عمل کند و برای دیگری بد باشد. تشخیص دقیق زمان واقعی به دلیل محدودیت های محاسباتی امکان پذیر نیست.
مرحله 3: تابستانی
تشخیص توجه از نظر محاسباتی کار فشرده ای است ، بدست آوردن خروجی در زمان واقعی بسیار مشکل است مخصوصاً در آردوینو. این کد می تواند حدود 6.6 نمونه /ثانیه بدهد (برای 195 میکرو ثانیه تأخیر اضافه شده است). این کد با پیانو و برخی از سازهای دیگر به خوبی کار می کند.
امیدوارم این کد و آموزش در پروژه شما در زمینه موسیقی مفید باشد. در صورت هر گونه تردید یا پیشنهاد ، لطفاً نظر یا پیام دهید.
در آموزش بعدی ، این کد را برای تشخیص آکورد موسیقی تغییر خواهم داد. پس منتظر باشید
توصیه شده:
چشمک زدن یادداشت موسیقی: 5 مرحله
چشمک زدن موزیکال توجه: مواد: 4 چراغ LED (فیروزه ای ، آبی) دستگاه CNC دستگاه چاپگر سه بعدی Wire SolidWorks لحیم کاری آهن و لحیم کاری 2 مقاومت 200 اهمی چسب داغ 9 ولتری باتری و متصل کننده مته این پروژه بسیار ساده است و نباید خیلی طول بکشد
سربندهای تاج گل را برای جشنواره های موسیقی تابستانی ، عروسی ها ، مناسبت های ویژه روشن کنید: 8 مرحله (همراه با تصاویر)
هدبندهای تاج گلدار برای جشنواره های موسیقی تابستانی ، عروسی ها ، مناسبت های خاص: شب را با یک هدبند LED زیبا با گل روشن کنید! مناسب برای هر عروسی ، جشنواره موسیقی ، لباس ، لباس و مناسبت های خاص! کیت هایی با همه چیزهایی که شما نیاز دارید سربند روشن کن در کارگاه کارگاه پوشیدنی موجود است
آشکارساز دود IOT: آشکارساز دود موجود را با IOT به روز کنید: 6 مرحله (همراه با تصاویر)
آشکارساز دود IOT: آشکارساز دود موجود را با IOT به روز کنید: فهرست مشارکت کنندگان ، مخترع: Tan Siew Chin ، Tan Yit Peng ، Tan Wee Heng ناظر: دکتر Chia Kim Seng گروه مهندسی مکاترونیک و رباتیک ، دانشکده مهندسی برق و الکترونیک ، Universiti Tun حسین اونن مالزی. توزیع
چراغ های کریسمس DIY به موسیقی - چراغ های خانه رقصیده: 15 مرحله (همراه با تصاویر)
چراغ های کریسمس DIY به موسیقی تنظیم می شوند - چراغ های خانه رقصیده: چراغ های کریسمس DIY به موسیقی تنظیم می شوند - چراغ های خانه رقصیده این DIY مبتدی نیست. شما نیاز به درک قوی در زمینه الکترونیک ، گردش ، برنامه نویسی BASIC و اطلاعات عمومی در مورد ایمنی برق دارید. این DIY برای یک فرد با تجربه است بنابراین
بلندگوهای ضد آب که شناور هستند - & quot؛ شناور است ، یادداشت می کند و یادداشت ها را تکان می دهد! & quot ؛: 7 مرحله (همراه با تصاویر)
اسپیکرهای ضد آب که شناور هستند - & quot؛ شناور می شود ، یادداشت می کند و یادداشت ها را تکان می دهد! & quot ؛: این پروژه بلندگوی ضد آب با الهام از سفرهای زیادی به رودخانه گیلا در آریزونا (و SNL's & quot؛ من در قایق هستم! & quot؛ ) ما از رودخانه شناور می شویم یا خطوطی را به ساحل متصل می کنیم تا شناورهای ما درست در محل اردوگاه ما بمانند. همه ح