فهرست مطالب:

پردازش سیگنال های صوتی و دیجیتال بلوتوث: یک چارچوب آردوینو: 10 مرحله
پردازش سیگنال های صوتی و دیجیتال بلوتوث: یک چارچوب آردوینو: 10 مرحله

تصویری: پردازش سیگنال های صوتی و دیجیتال بلوتوث: یک چارچوب آردوینو: 10 مرحله

تصویری: پردازش سیگنال های صوتی و دیجیتال بلوتوث: یک چارچوب آردوینو: 10 مرحله
تصویری: Privacy, Security, Society - Computer Science for Business Leaders 2016 2024, نوامبر
Anonim
Image
Image
پردازش سیگنال های صوتی و دیجیتال بلوتوث: یک چارچوب Arduino
پردازش سیگنال های صوتی و دیجیتال بلوتوث: یک چارچوب Arduino

خلاصه

وقتی به بلوتوث فکر می کنم به موسیقی فکر می کنم اما متاسفانه اکثر میکروکنترلرها نمی توانند از طریق بلوتوث موسیقی پخش کنند. رزبری پای می تواند اما یک کامپیوتر است. من می خواهم یک چارچوب مبتنی بر Arduino برای میکروکنترلرها برای پخش صدا از طریق بلوتوث ایجاد کنم. برای انعطاف کامل عضلات میکروکنترلر ، می خواهم پردازش سیگنال دیجیتال (DSP) زمان واقعی را به صدا (فیلترینگ با گذر بالا ، فیلترینگ با گذر کم و فشرده سازی دامنه پویا) اضافه کنم. برای گیلاس بالا ، من یک وب سرور اضافه می کنم که می تواند برای پیکربندی بی سیم DSP استفاده شود. ویدئوی تعبیه شده اصول اولیه عملکرد بلوتوث را در عمل نشان می دهد. همچنین به من نشان می دهد که از سرور وب برای انجام فیلترینگ با گذر بالا ، فیلترینگ کم گذر و فشرده سازی محدوده دینامیکی استفاده می کنم. اولین استفاده از فشرده سازی دامنه پویا به طور هدفمند باعث اعوجاج به عنوان نمونه ای از انتخاب های ضعیف پارامترها می شود. مثال دوم این تحریف را حذف می کند.

برای این پروژه ، ESP32 میکروکنترلر انتخابی است. هزینه آن کمتر از 10 پوند است و دارای ویژگی های ADC ، DAC ، Wifi ، بلوتوث کم مصرف ، بلوتوث کلاسیک و پردازنده دو هسته ای 240 مگاهرتز است. DAC پردازنده می تواند صدا را از لحاظ فنی پخش کند ، اما صدای خوبی نخواهد داشت. در عوض ، از رمزگشای استریو Adafruit I2S برای تولید سیگنال خط خارج استفاده می کنم. این سیگنال به راحتی می تواند به هر سیستم HiFi ارسال شود تا فوراً صدای بی سیم را به سیستم HiFi موجود شما اضافه کند.

تدارکات

امیدوارم اکثر سازندگان دارای تخته نان ، بلوز ، کابل USB ، دستگاه های لحیم کاری منبع تغذیه باشند و فقط باید 15 پوند برای ESP32 و رمزگشای استریو هزینه کنند. در غیر این صورت ، تمام قطعات مورد نیاز در زیر لیست شده است.

  • ESP32 - تست شده بر روی ESP32 -PICO -KIT و TinyPico - 9.50 پوند/ 24 پوند
  • رمزگشای استریو Adafruit I2S - 5.51 پوند
  • تخته نان - هر کدام 3 تا 5 پوند
  • سیم های بلوز - 3 پوند
  • هدفون سیمی/سیستم Hi -Fi -
  • سرفصل فشار یا آهن لحیم کاری - 2.10 پوند / 30 پوند
  • کابل میکرو USB - 2.10 پوند/ 3 پوند
  • اتصال 3.5 میلی متری به RCA/ جک 3.5 میلی متری به جک (یا هر چیزی که بلندگوی شما نیاز دارد) - 2.40 پوند/ 1.50 پوند
  • منبع تغذیه USB - 5 پوند

مرحله 1: ساخت و ساز - تخته نان

ساخت و ساز - تخته نان
ساخت و ساز - تخته نان

اگر ESP32-PICO-KIT را خریداری کرده اید مجبور نخواهید بود هیچ پینی را لحیم کنید زیرا از قبل لحیم شده است. به سادگی آن را روی تخته نان بگذارید.

مرحله 2: ساخت و ساز - فشار سربرگ/لحیم کاری

ساخت و ساز - هدر فشار/لحیم کاری
ساخت و ساز - هدر فشار/لحیم کاری
ساخت و ساز - هدر فشار/لحیم کاری
ساخت و ساز - هدر فشار/لحیم کاری

اگر آهن لحیم کاری دارید ، پین ها را طبق دستورالعمل های موجود در وب سایت Adafruit به رسیور استریو بچسبانید. در زمان نوشتن آهن لحیم کاری من در محل کار بود که قفل شده بود. من نمی خواستم برای لحیم کاری موقت پول بدهم ، بنابراین برخی از سربرگ های فشار را از pimoroni بریدم. آنها را برش دادم تا با رمزگشای استریو متناسب شوند. این بهترین راه حل نیست (و نه نحوه استفاده از سرصفحه) ، اما ارزان ترین جایگزین برای آهن لحیم کاری است. هدر برش خورده را روی تخته نان قرار دهید. برای رمزگشایی فقط باید 1 خط 6 پین نیاز داشته باشید. شما می توانید برای ثبات شش مورد دیگر را به طرف دیگر اضافه کنید ، اما این برای این سیستم نمونه ضروری نیست. پین هایی که می توانید سرصفحه ها را درون آنها قرار دهید عبارتند از vin ، 3vo ، gnd ، wsel ، din و bclk.

مرحله 3: ساخت و ساز - سیم برق پین ها را وصل کنید

ساخت و ساز - سیم برق پین ها
ساخت و ساز - سیم برق پین ها

رمزگشای استریو را روی هدرهای فشار (پین های vin ، 3vo ، gnd ، wsel ، din و bclk) قرار دهید و آنها را محکم به هم فشار دهید. مجدداً ، این کار به طور ایده آل باید با آهن لحیم کاری انجام شود ، اما من مجبور بودم بداهه پردازی کنم. متوجه خواهید شد که تمام سیم های موجود در این دستورالعمل آبی هستند. این به این دلیل است که من هیچ سیم بلندی نداشتم ، بنابراین 1 سیم بلند را به قطعات کوچکتر بریدم. همچنین ، من کور رنگ هستم و به رنگ سیم اهمیتی نمی دهم. پین های برق به شرح زیر متصل می شوند:

3v3 (ESP32) -> برای رمزگشایی استریو

gnd (ESP32) -> برای gnd در رمزگشای استریو

مرحله 4: ساخت و ساز - سیم کشی I2S

ساختمان - سیم کشی I2S
ساختمان - سیم کشی I2S

برای ارسال صدای بلوتوث از ESP32 به رمزگشای استریو ، ما از روشی برای ارتباطات دیجیتالی به نام I2S استفاده می کنیم. رمزگشای استریو این سیگنال دیجیتالی را گرفته و به یک سیگنال آنالوگ تبدیل می کند که می تواند به بلندگو یا HiFi متصل شود. I2S فقط به 3 سیم نیاز دارد و درک آن بسیار ساده است. خط بیت ساعت (bclk) بالا و پایین می شود تا نشان دهد بیت جدید منتقل شده است. خط خروجی (dout) بالا یا پایین می شود تا نشان دهد که آیا مقدار بیت 0 یا 1 است و کلمه select line (wsel) بالا یا پایین می شود تا نشان دهد کانال چپ یا راست در حال انتقال است. همه میکروکنترلرها از I2S پشتیبانی نمی کنند اما ESP32 دارای 2 خط I2S است. این امر آن را به یک انتخاب واضح برای این پروژه تبدیل می کند.

سیم کشی به شرح زیر است:

27 (ESP32) -> wsel (رمزگشای استریو)

25 (ESP32) -> دین (رمزگشای استریو)

26 (ESP32) -> bclk (رمزگشای استریو)

مرحله 5: نصب کتابخانه BtAudio

نصب کتابخانه BtAudio
نصب کتابخانه BtAudio
نصب کتابخانه BtAudio
نصب کتابخانه BtAudio

اگر قبلاً آنها را نصب نکرده اید ، Arduino IDE و هسته Arduino را برای ESP32 نصب کنید. پس از نصب آنها به صفحه Github من سر بزنید و مخزن را بارگیری کنید. در Arduino IDE در زیر Sketch >> Include Library >> "افزودن کتابخانه. ZIP" را انتخاب کنید. سپس فایل فشرده بارگیری شده را انتخاب کنید. این باید کتابخانه btAudio من را به کتابخانه های آردوینو شما اضافه کند. برای استفاده از کتابخانه باید هدر مربوطه را در طرح آردوینو قرار دهید. در مرحله بعد این را خواهید دید.

مرحله 6: استفاده از کتابخانه BtAudio

با استفاده از کتابخانه BtAudio
با استفاده از کتابخانه BtAudio
با استفاده از کتابخانه BtAudio
با استفاده از کتابخانه BtAudio

پس از نصب ، ESP32 خود را از طریق میکرو USB به رایانه خود وصل کنید و سپس رمزگشای استریو خود را با سیم 3.5 میلیمتری خود به بلندگوی خود وصل کنید. قبل از بارگذاری طرح ، باید برخی از موارد را در ویرایشگر Arduino تغییر دهید. پس از انتخاب برد خود ، باید طرح پارتیشن را در قسمت Tools >> Partition Scheme ویرایش کنید و یا "No OTA (Large APP)" یا "Minimal SPIFFS (برنامه های بزرگ با OTA)" را انتخاب کنید. این امر ضروری است زیرا این پروژه از WiFi و بلوتوث استفاده می کند که هر دو کتابخانه های بسیار سنگینی هستند. پس از انجام این کار ، طرح زیر را در ESP32 بارگذاری کنید.

#عبارتند از

// نام دستگاه صوتی را تعیین می کند btAudio audio = btAudio ("ESP_Speaker") ؛ void setup () {// داده های صوتی را به ESP32 audio.begin () منتقل می کند؛ // داده های دریافتی را به یک I2S DAC int bck = 26 خروجی می دهد. int ws = 27 ؛ int dout = 25 ؛ صوتی I2S (bck ، dout ، ws) ؛ } void loop () {}

طرح کلی را می توان به 3 مرحله تقسیم کرد:

  1. یک شیء جهانی btAudio ایجاد کنید که "نام بلوتوث" ESP32 شما را تعیین کند
  2. ESP32 را برای دریافت صدا با روش btAudio:: begin پیکربندی کنید
  3. پین های I2S را با روش btAudio:: I2S تنظیم کنید.

این در سمت نرم افزار است! اکنون تنها کاری که باید انجام دهید این است که اتصال بلوتوث را به ESP32 خود راه اندازی کنید. کافی است دستگاه های جدید را در تلفن/لپ تاپ/پخش کننده MP3 خود اسکن کنید و "ESP_Speaker" ظاهر می شود. وقتی خوشحال شدید که همه چیز در حال کار است (موسیقی پخش می شود) می توانید ESP32 را از رایانه خود جدا کنید. با منبع تغذیه USB آن را تغذیه کنید و آخرین کدی را که در آن بارگذاری کرده اید به خاطر می آورد. به این ترتیب ، می توانید ESP32 خود را برای همیشه پشت سیستم HiFi خود پنهان بگذارید.

مرحله 7: DSP - فیلتر کردن

تمدید گیرنده با پردازش سیگنال دیجیتال

اگر تمام مراحل را دنبال کردید (و من چیزی را کنار نگذاشتم) اکنون یک گیرنده بلوتوث کاملاً عملکردی برای سیستم HiFi خود دارید. در حالی که این عالی است ، میکروکنترلر را به حد خود نمی رساند. ESP32 دارای دو هسته با فرکانس 240 مگاهرتز است. این بدان معناست که این پروژه بسیار فراتر از یک گیرنده است. این دستگاه می تواند یک گیرنده بلوتوث با پردازنده سیگنال دیجیتال (DSP) باشد. DSP ها اساساً عملیات ریاضی روی سیگنال را در زمان واقعی انجام می دهند. یکی از عملیات مفید فیلترینگ دیجیتال نام دارد. این فرایند بسته به اینکه از فیلتر گذر بالا یا پایین گذر استفاده می کنید ، فرکانس های سیگنال زیر یا بالاتر از یک فرکانس قطع را تضعیف می کند.

فیلترهای با گذر بالا

فیلترهای High-Pass فرکانس های زیر یک باند خاص را کاهش می دهند. من یک کتابخانه فیلتر برای سیستم های آردوینو بر اساس کد از earlevel.com ساخته ام. تفاوت اصلی این است که من ساختار کلاس را تغییر داده ام تا ساخت فیلترهای مرتبه بالاتر به راحتی امکان پذیر باشد. فیلترهای مرتبه بالاتر فرکانس های فراتر از قطع شما را به طور مressثرتری سرکوب می کنند ، اما محاسبه بسیار بیشتری نیاز دارند. با این حال ، با اجرای فعلی ، حتی می توانید از فیلترهای مرتبه 6 برای صدا در زمان واقعی استفاده کنید!

طرح مشابه همان چیزی است که در مرحله قبل یافت شد با این تفاوت که ما حلقه اصلی را تغییر داده ایم. برای فعال کردن فیلترها از روش btAudio:: createFilter استفاده می کنیم. این روش 3 آرگومان را می پذیرد. اولین مورد تعداد آبشارهای فیلتر است. تعداد آبشارهای فیلتر نصف سفارش فیلتر است. برای فیلتر مرتبه 6 ، اولین آرگومان باید 3 باشد. برای فیلتر مرتبه 8 ، 4 خواهد بود. آرگومان دوم قطع فیلتر است. من این را روی 1000 هرتز تنظیم کرده ام تا تأثیر فوق العاده ای روی داده ها داشته باشد. در نهایت ، نوع فایل را با آرگومان سوم مشخص می کنیم. این باید برای فیلتر با گذر بالا و پایین برای فیلتر با گذر کم باشد. اسکریپت زیر قطع این فرکانس را بین 1000Hz و 2Hz تغییر می دهد. شما باید تأثیر چشمگیری بر داده ها بشنوید.

#عبارتند از

btAudio audio = btAudio ("ESP_Speaker") ؛ void setup () {audio.begin ()؛ int bck = 26؛ int ws = 27 ؛ int dout = 25 ؛ صوتی I2S (bck ، dout ، ws) ؛ } void loop () {تاخیر (5000)؛ audio.createFilter (3 ، 1000 ، highpass) ؛ تأخیر (5000) ؛ audio.createFilter (3 ، 2 ، highpass) ؛ }

فیلترهای کم گذر

فیلترهای کم گذر برعکس فیلترهای با گذر بالا عمل می کنند و فرکانس های بالاتر از یک فرکانس معین را سرکوب می کنند. آنها می توانند به همان روش فیلترهای با گذر بالا پیاده شوند با این تفاوت که نیاز به تغییر آرگومان سوم به lowpass دارند. برای طرح زیر ، قطع کم گذر بین 2000Hz و 20000Hz را جایگزین می کنم. امیدوارم تفاوت را بشنوید هنگامی که فیلتر کم گذر در 2000Hz است ، باید کاملا مبهم به نظر برسد.

#عبارتند از

btAudio audio = btAudio ("ESP_Speaker") ؛ void setup () {audio.begin ()؛ int bck = 26؛ int ws = 27 ؛ int dout = 25 ؛ صوتی I2S (bck ، dout ، ws) ؛ } void loop () {تاخیر (5000)؛ audio.createFilter (3، 2000، lowpass)؛ تأخیر (5000) ؛ audio.createFilter (3 ، 20000 ، lowpass) ؛ }

مرحله 8: DSP - فشرده سازی دامنه پویا

زمینه

فشرده سازی محدوده دینامیکی یک روش پردازش سیگنال است که سعی می کند بلندی صدا را یکنواخت کند. این صداهای بلند را که از یک آستانه بالاتر می روند ، به میزان صداهای کم فشار می رساند و سپس ، به صورت اختیاری هر دو را تقویت می کند. نتیجه یک تجربه بسیار بیشتر حتی گوش دادن است. این در حالی که من در حال تماشای یک برنامه با موسیقی پس زمینه بسیار بلند و آوازهای بسیار آرام بودم ، بسیار مفید بود. در این مورد ، فقط افزایش صدا کمکی نمی کند زیرا این فقط موسیقی پس زمینه را تقویت می کند. با فشرده سازی دامنه پویا ، می توانم موسیقی پس زمینه بلند را به سطح وکال کاهش دهم و همه چیز را دوباره به درستی بشنوم.

کد

فشرده سازی محدوده دینامیکی فقط شامل کاهش حجم یا آستانه سیگنال نیست. کمی هوشمندانه تر از آن است. اگر میزان صدا را کم کنید ، صداهای آرام و صداهای بلند نیز کاهش می یابد. یکی از راه های حل این مشکل ، آستانه سیگنال است ، اما این منجر به اعوجاج شدید می شود. فشرده سازی محدوده دینامیکی شامل ترکیبی از آستانه نرم و فیلتر برای به حداقل رساندن اعوجاج است که در صورت آستانه/قطع سیگنال ایجاد می شود. نتیجه سیگنالی است که در آن صداهای بلند بدون اعوجاج "قطع" می شوند و صداهای آرام همانطور که هستند باقی می مانند. کد زیر بین سه سطح مختلف فشرده سازی تغییر می کند.

  1. فشرده سازی با اعوجاج
  2. فشرده سازی بدون اعوجاج
  3. فشرده سازی ندارد

#عبارتند از

btAudio audio = btAudio ("ESP_Speaker") ؛ void setup () {audio.begin ()؛ int bck = 26؛ int ws = 27 ؛ int dout = 25 ؛ صوتی I2S (bck ، dout ، ws) ؛ } void loop () {تاخیر (5000)؛ audio.compress (30 ، 0.0001 ، 0.0001 ، 10 ، 10 ، 0) ؛ تأخیر (5000) ؛ audio.compress (30 ، 0.0001 ، 0.1 ، 10 ، 10 ، 0) ؛ تأخیر (5000) ؛ audio.decompress ()؛ }

فشرده سازی محدوده دینامیکی پیچیده است و روش های فشرده سازی btAudio:: دارای پارامترهای زیادی است. من سعی می کنم آنها را (به ترتیب) در اینجا توضیح دهم:

  1. آستانه - سطحی که صدا در آن کاهش می یابد (با دسی بل اندازه گیری می شود)
  2. زمان حمله - زمان لازم برای شروع کار کمپرسور پس از عبور از آستانه
  3. زمان انتشار - مدت زمان لازم برای توقف کار کمپرسور.
  4. نسبت کاهش - عاملی است که صدا را فشرده می کند.
  5. عرض زانو - عرض (بر حسب دسیبل) دور آستانه ای که کمپرسور تا حدی در آن کار می کند (صدای طبیعی تر).
  6. افزایش (دسی بل) پس از فشرده سازی (افزایش/کاهش حجم) به سیگنال اضافه می شود

اعوجاج بسیار شنیدنی در اولین استفاده از فشرده سازی به این دلیل است که آستانه بسیار پایین است و هم زمان حمله و هم زمان انتشار بسیار کوتاه است و به طور موثر منجر به یک رفتار سخت آستانه می شود. این به وضوح در مورد دوم با افزایش زمان انتشار حل می شود. این اساساً باعث می شود که کمپرسور بسیار روان تر عمل کند. در اینجا ، من فقط نشان داده ام که چگونه تغییر 1 پارامتر می تواند تأثیر چشمگیری بر صدا داشته باشد. حالا نوبت شماست که پارامترهای مختلف را آزمایش کنید.

پیاده سازی (ریاضیات جادویی - اختیاری)

من دریافتم که ساده اندیشی فشرده سازی محدوده دینامیکی چالش برانگیز است. این الگوریتم مستلزم تبدیل یک عدد صحیح 16 بیتی به دسیبل و سپس تبدیل آن به یک عدد صحیح 16 بیتی پس از پردازش سیگنال است. متوجه شدم که یک خط کد برای پردازش داده های استریو 10 میکروثانیه طول می کشد. از آنجایی که صدای استریو در 44.1 کیلوهرتز نمونه برداری می شود ، تنها 11.3 میکرو ثانیه برای DSP باقی می ماند ، این به طور غیرقابل قبولی آهسته است … با این حال ، با ترکیب یک جدول جستجوی کوچک (400 بایت) و یک روش درون یابی بر اساس تفاوتهای تقسیم شده Netwon ، می توانیم نزدیک به 17 بیت دقت را در 0.2 میکرو ثانیه بدست آوریم. به من یک سند pdf با تمام ریاضیات را برای علاقه مندان ضمیمه کرده ام. پیچیده است ، به شما هشدار داده شده است!

مرحله 9: رابط Wifi

رابط Wifi
رابط Wifi
رابط Wifi
رابط Wifi

اکنون شما یک گیرنده بلوتوث دارید که می تواند DSP را در زمان واقعی اجرا کند. متأسفانه ، اگر می خواهید هر یک از پارامترهای DSP را تغییر دهید ، باید اتصال HiFi خود را قطع کرده ، یک طرح جدید بارگذاری کرده و سپس دوباره وصل شوید. این دست و پا چلفتی است. برای رفع این مشکل ، من یک سرور وب ایجاد کردم که می توانید از آن برای ویرایش تمام پارامترهای DSP بدون اتصال مجدد به کامپیوتر خود استفاده کنید. طرح استفاده از سرور وب در زیر آمده است.

#عبارتند از

#شامل btAudio audio = btAudio ("ESP_Speaker") ؛ webDSP وب ؛ void setup () {Serial.begin (115200)؛ audio.begin ()؛ int bck = 26؛ int ws = 27 ؛ int dout = 25 ؛ صوتی I2S (bck ، dout ، ws) ؛ // با شناسه WiFi و گذرواژه خود جایگزین کنید const char* ssid = "SSID"؛ const char* رمز عبور = "PASSWORD"؛ web.begin (ssid ، رمز عبور و صدا) ؛ } void loop () {web._server.handleClient ()؛ }

کد یک آدرس IP به ESP32 شما اختصاص می دهد که می توانید از آن برای دسترسی به صفحه وب استفاده کنید. اولین باری که این کد را اجرا می کنید باید آن را به کامپیوتر خود وصل کنید. به این ترتیب می توانید آدرس IP اختصاص داده شده به ESP32 خود را در مانیتور سریال خود مشاهده کنید. اگر می خواهید به این صفحه وب دسترسی پیدا کنید ، کافی است این آدرس IP را در هر مرورگر وب (تست شده در chrome) وارد کنید.

در حال حاضر ما باید با روش فعال کردن بلوتوث و I2S آشنا باشیم. تفاوت اصلی در استفاده از آبجکت webDSP است. این آبجکت Wifi SSID و رمز عبور شما را به عنوان آرگومان و همچنین اشاره گر به شی btAudio می برد. در حلقه اصلی ، ما به طور مداوم از شیء webDSP می خواهیم تا به داده های ورودی از صفحه وب گوش دهد و سپس پارامترهای DSP را به روز کند. به عنوان نکته پایانی ، باید توجه داشت که هر دو بلوتوث و Wifi از یک رادیو در ESP32 استفاده می کنند. این بدان معناست که ممکن است از زمان وارد کردن پارامترها در صفحه وب تا زمانی که اطلاعات واقعاً به ESP32 برسد ، تا 10 ثانیه منتظر بمانید.

مرحله 10: برنامه های آینده

امیدوارم از این آموزش لذت ببرید و اکنون Bluetooth Audio و DSP به HiFi شما اضافه شده است. با این حال ، من فکر می کنم فضای زیادی برای رشد در این پروژه وجود دارد و من فقط می خواستم به برخی از مسیرهای آینده که ممکن است در پیش بگیرم اشاره کنم.

  • فعال کردن پخش وای فای صدا (برای بهترین کیفیت صدا)
  • برای فعال کردن دستورات صوتی از میکروفون I2S استفاده کنید
  • یک اکولایزر کنترل شده با WiFi ایجاد کنید
  • آن را زیبا کنید (تخته نان طراحی محصول عالی را فریاد نمی زند)

هنگامی که برای پیاده سازی این ایده ها پیش می روم ، دستورالعمل های بیشتری خواهم ساخت. یا شاید شخص دیگری این ویژگی ها را پیاده سازی کند. این لذت ساختن همه چیز به صورت منبع باز است!

توصیه شده: