Isi kandungan:

Pemprosesan Isyarat Audio & Digital Bluetooth: Kerangka Arduino: 10 Langkah
Pemprosesan Isyarat Audio & Digital Bluetooth: Kerangka Arduino: 10 Langkah

Video: Pemprosesan Isyarat Audio & Digital Bluetooth: Kerangka Arduino: 10 Langkah

Video: Pemprosesan Isyarat Audio & Digital Bluetooth: Kerangka Arduino: 10 Langkah
Video: Leap Motion SDK 2024, November
Anonim
Image
Image
Pemprosesan Isyarat Audio & Digital Bluetooth: Rangka Kerja Arduino
Pemprosesan Isyarat Audio & Digital Bluetooth: Rangka Kerja Arduino

Ringkasan

Apabila saya memikirkan Bluetooth, saya memikirkan muzik tetapi sayangnya kebanyakan pengawal mikro tidak dapat memainkan muzik melalui Bluetooth. Raspberry Pi boleh tetapi itu adalah komputer. Saya ingin mengembangkan kerangka kerja Arduino untuk mikrokontroler untuk memainkan audio melalui Bluetooth. Untuk melenturkan otot mikrokontroler sepenuhnya, saya akan menambahkan Pemprosesan Isyarat Digital (DSP) masa nyata ke audio (penapisan lulus tinggi, penapisan lulus rendah dan pemampatan jarak dinamik). Untuk ceri di atas, saya akan menambahkan pelayan web yang boleh digunakan untuk mengkonfigurasi DSP secara wayarles. Video yang disematkan menunjukkan asas-asas audio Bluetooth dalam tindakan. Ini juga menunjukkan saya menggunakan pelayan web untuk melakukan beberapa penapisan lulus tinggi, penapisan lulus rendah dan pemampatan julat dinamik. Penggunaan mampatan julat dinamik yang pertama menyebabkan penyimpangan sebagai contoh pilihan parameter yang buruk. Contoh kedua menghilangkan penyelewengan ini.

Untuk projek ini, ESP32 adalah pilihan mikrokontroler. Harganya kurang dari £ 10 dan dilengkapi dengan fitur ADC, DAC, Wifi, Bluetooth Low Energy, Bluetooth Classic dan pemproses dwi-teras 240MHz. DAC onboard secara teknikal dapat memainkan audio tetapi ia tidak kedengaran hebat. Sebagai gantinya, saya akan menggunakan penyahkod stereo Adafruit I2S untuk menghasilkan isyarat keluar. Isyarat ini dapat dikirim dengan mudah ke sistem HiFi mana pun untuk menambahkan audio tanpa wayar ke sistem HiFi anda yang ada dengan serta-merta.

Bekalan

Mudah-mudahan, kebanyakan pembuat mempunyai papan roti, jumper, kabel USB, besi pemateri bekalan kuasa dan hanya perlu membelanjakan £ 15 untuk ESP32 dan penyahkod stereo. Sekiranya tidak, semua bahagian yang diperlukan adalah senarai di bawah.

  • ESP32 - diuji pada ESP32-PICO-KIT dan TinyPico - £ 9,50 / £ 24
  • Decafer Stereo Adafruit I2S - £ 5,51
  • Papan Roti - £ 3- £ 5 setiap satu
  • Wayar pelompat - £ 3
  • Fon kepala berwayar / sistem Hi-Fi - £ $$
  • Tolak Header atau Soldering Iron - £ 2.10 / £ 30
  • Kabel USB mikro - £ 2,10 / £ 3
  • Penyambung 3.5mm ke RCA / jack ke soket 3.5mm (atau apa sahaja yang diperlukan oleh pembesar suara anda) - £ 2,40 / £ 1,50
  • Bekalan Kuasa USB - £ 5

Langkah 1: Pembinaan - Papan Roti

Pembinaan - Papan Roti
Pembinaan - Papan Roti

Sekiranya anda membeli ESP32-PICO-KIT, anda tidak perlu menempelkan sebarang pin kerana ia disolder terlebih dahulu. Cukup letakkan di papan roti.

Langkah 2: Pembinaan - Tolak Header / pematerian

Pembinaan - Tolak Header / pematerian
Pembinaan - Tolak Header / pematerian
Pembinaan - Tolak Header / pematerian
Pembinaan - Tolak Header / pematerian

Sekiranya anda mempunyai besi pematerian, pasangkan pin ke penyahkod stereo mengikut arahan di laman web Adafruit. Semasa menulis besi solder saya sedang bekerja yang terkunci. Saya tidak mahu membayar besi solder sementara jadi saya memotong beberapa header tolak dari pimoroni. Saya memotongnya agar sesuai dengan penyahkod stereo. Ini bukan penyelesaian terbaik (dan bukan bagaimana header dimaksudkan untuk digunakan) tetapi ini adalah alternatif termurah untuk solder. Masukkan header potongan ke papan roti. Anda hanya perlu 1 baris 6 pin untuk penyahkod. Anda boleh menambahkan enam lagi ke sisi lain untuk kestabilan tetapi ini tidak diperlukan untuk sistem prototaip ini. Pin untuk memasukkan tajuk adalah vin, 3vo, gnd, wsel, din dan bclk.

Langkah 3: Pembinaan - Kawat Pin Kuasa

Pembinaan - Kawat Pin Kuasa
Pembinaan - Kawat Pin Kuasa

Letakkan penyahkod Stereo pada header tekan (pin vin, 3vo, gnd, wsel, din dan bclk) dan tekan keduanya dengan kuat. Sekali lagi, ini sebaiknya dilakukan dengan besi pematerian tetapi saya harus berimprovisasi. Anda akan perhatikan bahawa semua wayar dalam arahan ini berwarna biru. Ini kerana saya tidak mempunyai wayar pelompat sehingga saya memotong 1 wayar panjang menjadi kepingan yang lebih kecil. Saya juga buta warna dan tidak begitu mementingkan warna wayar. Pin kuasa dilampirkan seperti berikut:

3v3 (ESP32) -> untuk menyekat penyahkod stereo

gnd (ESP32) -> untuk gnd pada penyahkod stereo

Langkah 4: Pembinaan - Pendawaian I2S

Pembinaan - Pendawaian I2S
Pembinaan - Pendawaian I2S

Untuk menghantar audio Bluetooth dari ESP32 ke penyahkod stereo, kita akan menggunakan kaedah komunikasi digital yang disebut I2S. Penyahkod stereo akan mengambil isyarat digital ini dan mengubahnya menjadi isyarat analog yang boleh dipasang ke pembesar suara atau HiFi. I2S hanya memerlukan 3 wayar dan cukup mudah difahami. Garis jam bit (bclk) bertukar tinggi dan rendah untuk menunjukkan bit baru dihantar. Garis keluar data (dout) bertukar tinggi atau rendah untuk menunjukkan sama ada bit itu mempunyai nilai 0 atau 1 dan garis pilih kata (wsel) bertukar tinggi atau rendah untuk menunjukkan sama ada saluran kiri atau kanan sedang dihantar. Tidak setiap mikrokontroler menyokong I2S tetapi ESP32 mempunyai 2 baris I2S. Ini menjadikannya pilihan yang jelas untuk projek ini.

Pendawaian adalah seperti berikut:

27 (ESP32) -> wsel (Penyahkod stereo)

25 (ESP32) -> din (Penyahkod stereo)

26 (ESP32) -> bclk (Penyahkod stereo)

Langkah 5: Memasang Perpustakaan BtAudio

Memasang Perpustakaan BtAudio
Memasang Perpustakaan BtAudio
Memasang Perpustakaan BtAudio
Memasang Perpustakaan BtAudio

Sekiranya anda belum memasangnya, pasang Arduino IDE dan teras Arduino untuk ESP32. Setelah dipasang, lawati halaman Github saya dan muat turun repositori. Di dalam Arduino IDE di bawah Sketsa >> Sertakan Perpustakaan >> pilih "Tambah perpustakaan. ZIP". Kemudian pilih fail zip yang dimuat turun. Ini harus menambahkan perpustakaan btAudio saya ke perpustakaan Arduino anda. Untuk menggunakan perpustakaan, anda mesti memasukkan tajuk yang relevan dalam lakaran Arduino. Anda akan melihatnya pada langkah seterusnya.

Langkah 6: Menggunakan Perpustakaan BtAudio

Menggunakan Perpustakaan BtAudio
Menggunakan Perpustakaan BtAudio
Menggunakan Perpustakaan BtAudio
Menggunakan Perpustakaan BtAudio

Setelah dipasang, sambungkan ESP32 ke komputer anda melalui USB mikro dan kemudian sambungkan penyahkod stereo anda ke pembesar suara anda dengan wayar 3.5mm anda. Sebelum memuat naik lakaran, anda perlu mengubah beberapa perkara dalam editor Arduino. Setelah memilih papan anda, anda perlu mengedit skema partition di bawah Tools >> Partition Scheme dan pilih "No OTA (Large APP)" atau "Minimal SPIFFS (Large APPS with OTA)". Perkara ini diperlukan kerana projek ini menggunakan WiFi dan Bluetooth yang kedua-duanya merupakan perpustakaan yang sangat memori. Setelah selesai, muat naik lakaran berikut ke ESP32.

#sertakan

// Menetapkan nama peranti audio btAudio audio = btAudio ("ESP_Speaker"); batal persediaan () {// mengalirkan data audio ke ESP32 audio.begin (); // mengeluarkan data yang diterima ke I2S DAC int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } gelung kosong () {}

Lakaran boleh dibahagikan kepada 3 langkah:

  1. Buat objek btAudio global yang menetapkan "nama Bluetooth" ESP32 anda
  2. Konfigurasikan ESP32 untuk menerima audio dengan kaedah btAudio:: begin
  3. Tetapkan pin I2S dengan kaedah btAudio:: I2S.

Itu sahaja dari sisi perisian! Sekarang yang perlu anda lakukan ialah memulakan sambungan Bluetooth ke ESP32 anda. Cukup imbas peranti baru di telefon / komputer riba / pemain MP3 anda dan "ESP_Speaker" akan muncul. Setelah anda gembira kerana semuanya berfungsi (muzik dimainkan) anda boleh memutuskan sambungan ESP32 dari komputer anda. Kuasakannya dengan bekalan kuasa USB dan ia akan mengingati kod terakhir yang anda muat naik ke dalamnya. Dengan cara ini, anda boleh membiarkan ESP32 anda tersembunyi di belakang sistem HiFi anda selama-lamanya.

Langkah 7: DSP - Penapisan

Memperluas Penerima dengan Pemprosesan Isyarat Digital

Sekiranya anda mengikuti semua langkah (dan saya tidak meninggalkan apa-apa) anda kini mempunyai penerima Bluetooth yang berfungsi sepenuhnya untuk sistem HiFi anda. Walaupun ini sejuk, ia tidak mendorong mikrokontroler ke hadnya. ESP32 mempunyai dua teras yang beroperasi pada 240MHz. Ini bermaksud projek ini lebih dari sekadar penerima. Ia memiliki kemampuan untuk menjadi penerima Bluetooth dengan Digital Signal Processor (DSP). DSP pada dasarnya melakukan operasi matematik pada isyarat dalam masa nyata. Satu operasi yang berguna dipanggil Penapisan Digital. Proses ini mengurangkan frekuensi dalam isyarat di bawah atau di atas frekuensi pemotongan tertentu, bergantung pada sama ada anda menggunakan penapis lulus tinggi atau lulus rendah.

Penapis hantaran tinggi

Penapis High-Pass mengurangkan frekuensi di bawah jalur tertentu. Saya telah membina perpustakaan penapis untuk sistem Arduino berdasarkan kod dari earlevel.com. Perbezaan utama adalah bahawa saya telah menukar struktur kelas untuk membolehkan pembinaan penapis yang lebih tinggi dengan lebih mudah. Penapis pesanan yang lebih tinggi menekan frekuensi di luar jangka masa anda dengan lebih berkesan tetapi ia memerlukan pengiraan yang lebih banyak. Namun, dengan pelaksanaannya sekarang, anda bahkan boleh menggunakan penapis pesanan ke-6 untuk audio masa nyata!

Lakarannya sama seperti yang dijumpai pada langkah sebelumnya kecuali kita telah menukar gelung utama. Untuk mengaktifkan penapis, kami menggunakan kaedah btAudio:: createFilter. Kaedah ini menerima 3 hujah. Yang pertama ialah bilangan lata turas. Bilangan lata turas adalah separuh turutan penapis. Untuk saringan pesanan ke-6, argumen pertama mestilah 3. Untuk saringan pesanan ke-8, ia adalah 4. Argumen kedua ialah pemotongan penapis. Saya telah menetapkan ini ke 1000Hz untuk memberi kesan yang sangat dramatik pada data. Akhirnya, kami menentukan jenis pemfail dengan argumen ketiga. Ini harus highpass untuk saringan lulus tinggi dan lowpass untuk saringan lorong rendah. Skrip di bawah ini menukar pemotongan frekuensi ini antara 1000Hz dan 2Hz. Anda mesti mendengar kesan dramatik pada data.

#sertakan

btAudio audio = btAudio ("ESP_Speaker"); batal persediaan () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } gelung kosong () {kelewatan (5000); audio.createFilter (3, 1000, jalan raya tinggi); kelewatan (5000); audio.createFilter (3, 2, jalan raya tinggi); }

Penapis lulus rendah

Penapis lulus rendah melakukan kebalikan dari penapis lulus tinggi dan menekan frekuensi di atas frekuensi tertentu. Mereka dapat dilaksanakan dengan cara yang sama seperti penapis lulus tinggi kecuali mereka memerlukan mengubah argumen ketiga menjadi lowpass. Untuk lakaran di bawah ini saya ganti jalan pintas rendah antara 2000Hz dan 20000Hz. Mudah-mudahan, anda akan mendengar perbezaannya. Kedengarannya agak teredam ketika saringan low-pass berada pada 2000Hz.

#sertakan

btAudio audio = btAudio ("ESP_Speaker"); batal persediaan () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } gelung kosong () {kelewatan (5000); audio.createFilter (3, 2000, lowpass); kelewatan (5000); audio.createFilter (3, 20000, lowpass); }

Langkah 8: DSP - Pemampatan Julat Dinamik

Latar belakang

Mampatan julat dinamik adalah kaedah pemprosesan isyarat yang berusaha untuk meratakan kekuatan audio. Ia memampatkan suara kuat, yang naik di atas ambang tertentu, ke tahap yang tenang dan kemudian, secara opsional memperkuat keduanya. Hasilnya adalah pengalaman mendengar yang lebih hebat lagi. Ini sangat berguna semasa saya menonton rancangan dengan muzik latar yang sangat kuat dan vokal yang sangat sunyi. Dalam kes ini, hanya meningkatkan volume tidak membantu kerana ini hanya memperkuat muzik latar. Dengan pemampatan jarak jauh yang dinamik, saya dapat mengurangkan muzik latar yang kuat ke tahap vokal dan mendengar semuanya dengan betul lagi.

Kod tersebut

Mampatan julat dinamik tidak hanya melibatkan penurunan volume atau ambang isyarat. Ia sedikit lebih bijak daripada itu. Sekiranya anda menurunkan kelantangan, suara yang tenang akan dikurangkan dan juga bunyi yang kuat. Salah satu cara untuk mengatasi ini adalah dengan memberi isyarat minimum tetapi ini mengakibatkan penyelewengan yang teruk. Mampatan julat dinamik melibatkan kombinasi ambang lembut dan penapisan untuk meminimumkan distorsi yang akan diperoleh sekiranya anda melakukan ambang / klip isyarat. Hasilnya adalah isyarat di mana bunyi yang kuat "dipotong" tanpa herotan dan suara yang sunyi dibiarkan begitu sahaja. Kod di bawah beralih antara tiga tahap pemampatan yang berbeza.

  1. Pemampatan dengan penyelewengan
  2. Mampatan tanpa herotan
  3. Tiada Pemampatan

#sertakan

btAudio audio = btAudio ("ESP_Speaker"); batal persediaan () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } gelung kosong () {kelewatan (5000); audio.compress (30, 0.0001, 0.0001, 10, 10, 0); kelewatan (5000); audio.compress (30, 0.0001, 0.1, 10, 10, 0); kelewatan (5000); audio.decompress (); }

Mampatan julat dinamik adalah rumit dan kaedah kompres btAudio:: mempunyai banyak parameter. Saya akan mencuba dan menerangkannya (mengikut urutan) di sini:

  1. Ambang - Tahap di mana audio berkurang (diukur dalam desibel)
  2. Masa serangan - Masa yang diperlukan untuk pemampat mula berfungsi setelah ambang telah dilampaui
  3. Masa pelepasan - Masa yang diperlukan agar pemampat berhenti berfungsi.
  4. Nisbah Pengurangan - faktor di mana audio dimampatkan.
  5. Lebar Lutut - Lebar (dalam desibel) di sekitar ambang di mana pemampat berfungsi sebahagian (bunyi lebih semula jadi).
  6. Keuntungan (desibel) ditambahkan ke isyarat selepas pemampatan (peningkatan / penurunan kelantangan)

Penyelewengan yang sangat terdengar pada penggunaan pertama pemampatan adalah kerana ambang batasnya sangat rendah dan kedua-dua masa serangan dan masa pelepasan sangat pendek dengan berkesan sehingga menghasilkan tingkah laku keras. Ini dapat diselesaikan dengan jelas dalam kes kedua dengan meningkatkan masa pelepasan. Ini pada dasarnya menyebabkan pemampat bertindak dengan cara yang lebih lancar. Di sini, saya hanya menunjukkan bagaimana mengubah 1 parameter boleh memberi kesan dramatik pada audio. Sekarang giliran anda untuk bereksperimen dengan parameter yang berbeza.

Pelaksanaan (matematik ajaib - pilihan)

Saya mendapati bahawa naif melaksanakan pemampatan julat Dinamik menjadi sesuatu yang mencabar. Algoritma memerlukan penukaran bilangan bulat 16-bit menjadi desibel dan kemudian mengubahnya menjadi integer 16-bit setelah anda memproses isyarat. Saya perhatikan bahawa satu baris kod memerlukan 10 mikrodetik untuk memproses data stereo. Sebagai sampel audio stereo pada 44.1 KHz hanya tinggal 11.3 mikrodetik untuk DSP, ini tidak dapat diterima dengan perlahan … Walau bagaimanapun, dengan menggabungkan jadual pencarian kecil (400 bait) dan prosedur interpolasi berdasarkan perbezaan terbahagi Netwon, kita dapat memperoleh ketepatan hampir 17 bit dalam 0.2 mikrodetik. Saya telah melampirkan dokumen pdf dengan semua matematik untuk yang benar-benar berminat. Ini rumit, anda sudah diberi amaran!

Langkah 9: Antara Muka Wifi

Antara Muka Wifi
Antara Muka Wifi
Antara Muka Wifi
Antara Muka Wifi

Kini anda mempunyai penerima Bluetooth yang mampu menjalankan DSP masa nyata. Malangnya, jika anda ingin mengubah parameter DSP, anda perlu memutuskan sambungan dari HiFi anda, muat naik lakaran baru dan kemudian sambungkan semula. Ini kekok. Untuk memperbaikinya, saya mengembangkan pelayan web yang boleh anda gunakan untuk mengedit semua parameter DSP tanpa menyambung semula ke komputer anda. Sketsa untuk menggunakan pelayan laman web ada di bawah.

#sertakan

#masuk btAudio audio = btAudio ("ESP_Speaker"); webDSP web; persediaan tidak sah () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); // ganti dengan ID WiFi dan kata laluan anda const char * ssid = "SSID"; const char * kata laluan = "PASSWORD"; web.begin (ssid, kata laluan, & audio); } gelung kosong () {web._server.handleClient (); }

Kod memberikan alamat IP ke ESP32 anda yang boleh anda gunakan untuk mengakses laman web. Kali pertama anda menjalankan kod ini, anda mesti melampirkannya ke komputer anda. Dengan cara itu anda dapat melihat alamat IP yang diberikan pada ESP32 anda pada monitor bersiri anda. Sekiranya anda ingin mengakses laman web ini, masukkan alamat IP ini ke mana-mana penyemak imbas web (diuji pada chrome).

Sekarang kita sudah biasa dengan kaedah mengaktifkan Bluetooth dan I2S. Perbezaan utama adalah penggunaan objek webDSP. Objek ini menggunakan SSID dan kata laluan Wifi anda sebagai argumen dan juga penunjuk ke objek btAudio. Dalam gelung utama, kami terus mendapatkan objek webDSP untuk mendengar data masuk dari laman web dan kemudian mengemas kini parameter DSP. Sebagai titik penutup, perlu diperhatikan bahawa Bluetooth dan Wifi menggunakan radio yang sama pada ESP32. Ini bermaksud bahawa anda mungkin harus menunggu hingga 10 saat dari saat anda memasukkan parameter di laman web hingga ketika maklumat tersebut benar-benar mencapai ESP32.

Langkah 10: Rancangan Masa Depan

Mudah-mudahan, anda menikmati instruksinya ini dan kini telah menambahkan Audio Bluetooth dan DSP ke HiFi anda. Namun, saya rasa ada banyak ruang untuk berkembang dalam projek ini dan saya hanya ingin menunjukkan beberapa petunjuk masa depan yang mungkin saya ambil.

  • Dayakan streaming audio Wifi (untuk kualiti audio terbaik)
  • Gunakan mikrofon I2S untuk mengaktifkan perintah suara
  • membangunkan penyamaan terkawal WiFi
  • Jadikannya cantik (papan roti tidak menjerit reka bentuk produk yang hebat)

Apabila saya mula melaksanakan idea-idea ini, saya akan membuat lebih banyak pengajaran. Atau mungkin orang lain akan melaksanakan ciri-ciri ini. Itulah kegembiraan menjadikan semua sumber terbuka!

Disyorkan: