สารบัญ:

การประมวลผลเสียง Bluetooth และสัญญาณดิจิตอล: กรอบงาน Arduino: 10 ขั้นตอน
การประมวลผลเสียง Bluetooth และสัญญาณดิจิตอล: กรอบงาน Arduino: 10 ขั้นตอน

วีดีโอ: การประมวลผลเสียง Bluetooth และสัญญาณดิจิตอล: กรอบงาน Arduino: 10 ขั้นตอน

วีดีโอ: การประมวลผลเสียง Bluetooth และสัญญาณดิจิตอล: กรอบงาน Arduino: 10 ขั้นตอน
วีดีโอ: แนะนำการเขียนโปรแกรม Arduino 2024, พฤศจิกายน
Anonim
Image
Image
การประมวลผลเสียง Bluetooth และสัญญาณดิจิตอล: Arduino Framework
การประมวลผลเสียง Bluetooth และสัญญาณดิจิตอล: Arduino Framework

สรุป

เมื่อฉันคิดถึงบลูทูธ ฉันนึกถึงเพลง แต่น่าเสียดายที่ไมโครคอนโทรลเลอร์ส่วนใหญ่ไม่สามารถเล่นเพลงผ่านบลูทูธได้ Raspberry Pi ทำได้ แต่นั่นเป็นคอมพิวเตอร์ ฉันต้องการพัฒนาเฟรมเวิร์กบน Arduino สำหรับไมโครคอนโทรลเลอร์เพื่อเล่นเสียงผ่านบลูทูธ ในการยืดกล้ามเนื้อไมโครคอนโทรลเลอร์ของฉันอย่างเต็มที่ ฉันจะเพิ่มการประมวลผลสัญญาณดิจิทัล (DSP) แบบเรียลไทม์ลงในเสียง (การกรองความถี่สูง ตัวกรองความถี่ต่ำ และการบีบอัดช่วงไดนามิก) สำหรับเชอร์รี่ที่อยู่ด้านบน ฉันจะเพิ่มเว็บเซิร์ฟเวอร์ที่สามารถใช้กำหนดค่า DSP แบบไร้สายได้ วิดีโอแบบฝังจะแสดงพื้นฐานของเสียง Bluetooth ในการใช้งานจริง นอกจากนี้ยังแสดงให้ฉันเห็นการใช้เว็บเซิร์ฟเวอร์เพื่อทำการกรองความถี่สูง การกรองความถี่ต่ำ และการบีบอัดช่วงไดนามิก การใช้การบีบอัดช่วงไดนามิกครั้งแรกโดยเจตนาทำให้เกิดการบิดเบือนเป็นตัวอย่างของตัวเลือกพารามิเตอร์ที่ไม่ดี ตัวอย่างที่สองกำจัดการบิดเบือนนี้

สำหรับโครงการนี้ ESP32 คือไมโครคอนโทรลเลอร์ที่เลือกได้ มีค่าใช้จ่ายน้อยกว่า 10 ปอนด์และเต็มไปด้วยคุณสมบัติด้วย ADC, DAC, Wifi, Bluetooth Low Energy, Bluetooth Classic และโปรเซสเซอร์ดูอัลคอร์ 240MHz DAC ออนบอร์ดสามารถเล่นเสียงในทางเทคนิคได้ แต่เสียงจะไม่ดีนัก ฉันจะใช้ตัวถอดรหัสสเตอริโอ Adafruit I2S เพื่อสร้างสัญญาณไลน์เอาต์แทน สัญญาณนี้สามารถส่งไปยังระบบไฮไฟใดๆ ได้อย่างง่ายดาย เพื่อเพิ่มเสียงไร้สายไปยังระบบไฮไฟที่มีอยู่ของคุณได้ทันที

เสบียง

หวังว่าผู้ผลิตส่วนใหญ่จะมีเขียงหั่นขนม จัมเปอร์ สาย 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) -> เพื่อ vin บนตัวถอดรหัสสเตอริโอ

gnd (ESP32) -> เพื่อ gnd บนตัวถอดรหัสสเตอริโอ

ขั้นตอนที่ 4: การก่อสร้าง - การเดินสายไฟ I2S

การก่อสร้าง - การเดินสายไฟ I2S
การก่อสร้าง - การเดินสายไฟ I2S

ในการส่งเสียง Bluetooth จาก ESP32 ไปยังเครื่องถอดรหัสสเตอริโอ เราจะใช้วิธีการสื่อสารแบบดิจิทัลที่เรียกว่า I2S ตัวถอดรหัสสเตอริโอจะใช้สัญญาณดิจิทัลนี้และเปลี่ยนเป็นสัญญาณอะนาล็อกที่สามารถเสียบเข้ากับลำโพงหรือไฮไฟได้ I2S ต้องการเพียง 3 สายและเข้าใจง่ายพอสมควร บรรทัดนาฬิกาบิต (bclk) จะสูงและต่ำเพื่อระบุว่ามีการส่งบิตใหม่ บรรทัด data-out (dout) จะสูงหรือต่ำเพื่อระบุว่าบิตนั้นมีค่าเป็น 0 หรือ 1 และคำว่า select line (wsel) จะสูงหรือต่ำเพื่อระบุว่ากำลังส่งช่องสัญญาณซ้ายหรือขวา ไม่ใช่ไมโครคอนโทรลเลอร์ทุกตัวที่รองรับ I2S แต่ ESP32 มี 2 สาย I2S ทำให้เป็นทางเลือกที่ชัดเจนสำหรับโครงการนี้

การเดินสายไฟมีดังนี้:

27 (ESP32) -> wsel (ตัวถอดรหัสสเตอริโอ)

25 (ESP32) -> din (ตัวถอดรหัสสเตอริโอ)

26 (ESP32) -> bclk (ตัวถอดรหัสสเตอริโอ)

ขั้นตอนที่ 5: การติดตั้ง BtAudio Library

การติดตั้ง BtAudio Library
การติดตั้ง BtAudio Library
การติดตั้ง BtAudio Library
การติดตั้ง BtAudio Library

หากคุณยังไม่ได้ติดตั้ง ให้ติดตั้ง Arduino IDE และแกน Arduino สำหรับ ESP32 เมื่อคุณติดตั้งแล้วให้ไปที่หน้า Github ของฉันและดาวน์โหลดที่เก็บ ภายใน Arduino IDE ภายใต้ Sketch>>Include Library>> เลือก "Add. ZIP library" จากนั้นเลือกไฟล์ zip ที่ดาวน์โหลดมา สิ่งนี้ควรเพิ่มไลบรารี btAudio ของฉันไปยังไลบรารี Arduino ของคุณ ในการใช้ไลบรารี คุณจะต้องรวมส่วนหัวที่เกี่ยวข้องไว้ในแบบร่าง Arduino คุณจะเห็นสิ่งนี้ในขั้นตอนต่อไป

ขั้นตอนที่ 6: การใช้ BtAudio Library

การใช้ไลบรารี BtAudio
การใช้ไลบรารี BtAudio
การใช้ไลบรารี BtAudio
การใช้ไลบรารี BtAudio

เมื่อติดตั้งแล้ว ให้เชื่อมต่อ ESP32 กับคอมพิวเตอร์ผ่านไมโคร USB จากนั้นเชื่อมต่อตัวถอดรหัสสเตอริโอกับลำโพงด้วยสาย 3.5 มม. ก่อนที่คุณจะอัปโหลดภาพสเก็ตช์ คุณจะต้องเปลี่ยนแปลงบางสิ่งในตัวแก้ไข Arduino หลังจากที่คุณเลือกบอร์ดของคุณแล้ว คุณจะต้องแก้ไขรูปแบบพาร์ติชั่นภายใต้เครื่องมือ >> แผนผังพาร์ติชั่น และเลือก "ไม่มี OTA (แอปขนาดใหญ่)" หรือ "มินิมอล SPIFFS (แอปขนาดใหญ่ที่มี OTA)" นี่เป็นสิ่งจำเป็นเนื่องจากโปรเจ็กต์นี้ใช้ทั้ง WiFi และ Bluetooth ซึ่งเป็นไลบรารีที่มีหน่วยความจำมาก เมื่อคุณทำเสร็จแล้วให้อัปโหลดภาพร่างต่อไปนี้ไปยัง ESP32

#รวม

// ตั้งชื่ออุปกรณ์เสียง btAudio audio = btAudio("ESP_Speaker"); การตั้งค่าเป็นโมฆะ () { // สตรีมข้อมูลเสียงไปยัง ESP32 audio.begin (); // ส่งข้อมูลที่ได้รับไปยัง I2S DAC int bck = 26; int ws = 27; int dout = 25; เสียง. I2S(bck, dout, ws); } วงเป็นโมฆะ () { }

ร่างภาพสามารถแบ่งออกกว้างๆ ได้ 3 ขั้นตอน คือ

  1. สร้างวัตถุ btAudio ทั่วโลกที่ตั้งค่า "ชื่อบลูทูธ" ของ ESP32. ของคุณ
  2. กำหนดค่า ESP32 เพื่อรับเสียงด้วย btAudio::begin method
  3. ตั้งค่าพิน I2S ด้วยวิธี btAudio::I2S

นั่นคือด้านซอฟต์แวร์! ตอนนี้สิ่งที่คุณต้องทำคือเริ่มต้นการเชื่อมต่อ Bluetooth กับ ESP32 ของคุณ เพียงสแกนหาอุปกรณ์ใหม่ในโทรศัพท์/แล็ปท็อป/เครื่องเล่น MP3 แล้ว "ESP_Speaker" จะปรากฏขึ้น เมื่อคุณมีความสุขที่ทุกอย่างใช้งานได้ (เล่นเพลง) คุณสามารถยกเลิกการเชื่อมต่อ ESP32 จากคอมพิวเตอร์ของคุณได้ จ่ายไฟด้วยแหล่งจ่ายไฟ USB และมันจะจดจำรหัสล่าสุดที่คุณอัปโหลดไป ด้วยวิธีนี้ คุณสามารถซ่อน ESP32 ไว้เบื้องหลังระบบไฮไฟได้ตลอดไป

ขั้นตอนที่ 7: DSP - การกรอง

การขยายเครื่องรับด้วยการประมวลผลสัญญาณดิจิตอล

หากคุณทำตามขั้นตอนทั้งหมด (และฉันไม่ได้ทิ้งอะไรไว้) ตอนนี้คุณมีตัวรับสัญญาณบลูทูธที่ทำงานได้อย่างสมบูรณ์สำหรับระบบไฮไฟของคุณ แม้ว่าสิ่งนี้จะเจ๋ง แต่ก็ไม่ได้ทำให้ไมโครคอนโทรลเลอร์ถึงขีดจำกัด ESP32 มีสองคอร์ที่ทำงานที่ 240MHz นั่นหมายความว่าโครงการนี้เป็นมากกว่าผู้รับ มีความสามารถเป็นเครื่องรับ Bluetooth พร้อม Digital Signal Processor (DSP) DSP ดำเนินการทางคณิตศาสตร์กับสัญญาณตามเวลาจริงเป็นหลัก การดำเนินการที่มีประโยชน์อย่างหนึ่งเรียกว่าการกรองแบบดิจิทัล กระบวนการนี้ลดทอนความถี่ในสัญญาณที่ต่ำกว่าหรือสูงกว่าความถี่คัทออฟบางค่า ขึ้นอยู่กับว่าคุณกำลังใช้ฟิลเตอร์ความถี่สูงหรือความถี่ต่ำ

ตัวกรองความถี่สูง

ตัวกรองความถี่สูงจะลดทอนความถี่ที่ต่ำกว่าแถบความถี่ที่กำหนด ฉันได้สร้างไลบรารีตัวกรองสำหรับระบบ Arduino ตามรหัสจาก earlevel.com ความแตกต่างที่สำคัญคือฉันได้เปลี่ยนโครงสร้างคลาสเพื่อให้สร้างตัวกรองระดับสูงได้ง่ายขึ้น ตัวกรองลำดับที่สูงกว่าจะยับยั้งความถี่ที่อยู่นอกเหนือจุดตัดของคุณได้อย่างมีประสิทธิภาพมากขึ้น แต่พวกมันต้องการการคำนวณที่มากกว่ามาก อย่างไรก็ตาม ด้วยการใช้งานในปัจจุบัน คุณยังสามารถใช้ตัวกรองลำดับที่ 6 สำหรับเสียงแบบเรียลไทม์ได้อีกด้วย!

สเก็ตช์จะเหมือนกับที่พบในขั้นตอนก่อนหน้า ยกเว้นว่าเราได้เปลี่ยนลูปหลักแล้ว ในการเปิดใช้งานตัวกรองเราใช้เมธอด btAudio::createFilter วิธีนี้ยอมรับ 3 อาร์กิวเมนต์ ประการแรกคือจำนวนการเรียงซ้อนของตัวกรอง จำนวนการเรียงซ้อนของตัวกรองคือครึ่งหนึ่งของลำดับของตัวกรอง สำหรับตัวกรองลำดับที่ 6 อาร์กิวเมนต์แรกควรเป็น 3 สำหรับตัวกรองลำดับที่ 8 อาร์กิวเมนต์ที่สองคือตัวตัดตัวกรอง ฉันได้ตั้งค่านี้เป็น 1000Hz เพื่อให้มีผลอย่างมากกับข้อมูล สุดท้าย เราระบุประเภทของ filer ด้วยอาร์กิวเมนต์ที่สาม นี่ควรเป็นความถี่สูงสำหรับตัวกรองความถี่สูงและความถี่ต่ำสำหรับตัวกรองความถี่ต่ำ สคริปต์ด้านล่างจะสลับคัตออฟของความถี่นี้ระหว่าง 1000Hz ถึง 2Hz คุณควรได้ยินผลกระทบอย่างมากต่อข้อมูล

#รวม

btAudio audio = btAudio("ESP_Speaker"); การตั้งค่าเป็นโมฆะ () { audio.begin (); int bck = 26; int ws = 27; int dout = 25; เสียง. I2S(bck, dout, ws); } วงเป็นโมฆะ () { ล่าช้า (5000); audio.createFilter(3, 1000, ไฮพาส); ล่าช้า (5000); audio.createFilter(3, 2, ไฮพาส); }

ตัวกรองสัญญาณความถี่ต่ำ

ตัวกรองความถี่ต่ำทำหน้าที่ตรงกันข้ามกับตัวกรองความถี่สูงและลดความถี่ที่สูงกว่าความถี่ที่กำหนด สามารถใช้งานได้ในลักษณะเดียวกับตัวกรองความถี่สูง ยกเว้นว่าต้องเปลี่ยนอาร์กิวเมนต์ที่สามเป็นความถี่ต่ำ สำหรับภาพสเก็ตช์ด้านล่าง ฉันสลับคัทออฟความถี่ต่ำระหว่าง 2000Hz ถึง 20000Hz หวังว่าคุณจะได้ยินความแตกต่าง เสียงจะค่อนข้างอู้อี้เมื่อตัวกรองความถี่ต่ำผ่านที่ 2000Hz

#รวม

btAudio audio = btAudio("ESP_Speaker"); การตั้งค่าเป็นโมฆะ () { audio.begin (); int bck = 26; int ws = 27; int dout = 25; เสียง. I2S(bck, dout, ws); } วงเป็นโมฆะ () { ล่าช้า (5000); audio.createFilter(3, 2000, ความถี่ต่ำ); ล่าช้า (5000); audio.createFilter(3, 20000 โลว์พาส); }

ขั้นตอนที่ 8: DSP - การบีบอัดช่วงไดนามิก

พื้นหลัง

การบีบอัดช่วงไดนามิกเป็นวิธีการประมวลผลสัญญาณที่พยายามลดระดับความดังของเสียง มันบีบอัดเสียงที่ดังซึ่งอยู่เหนือธรณีประตูที่กำหนด จนถึงระดับของเสียงที่เงียบ จากนั้นจะขยายเสียงทั้งสองแบบเป็นทางเลือก ผลลัพธ์ที่ได้คือประสบการณ์การฟังที่สม่ำเสมอยิ่งขึ้น สิ่งนี้มีประโยชน์มากในขณะที่ฉันกำลังดูรายการที่มีเพลงประกอบที่ดังมากและเสียงร้องที่เบามาก ในกรณีนี้ การเพิ่มระดับเสียงไม่ได้ช่วยอะไร เนื่องจากเป็นการขยายเสียงดนตรีประกอบเท่านั้น ด้วยการบีบอัดช่วงไดนามิก ฉันสามารถลดเสียงดนตรีแบ็คกราวด์ที่ดังจนถึงระดับของเสียงร้องและได้ยินทุกอย่างถูกต้องอีกครั้ง

รหัส

การบีบอัดช่วงไดนามิกไม่ได้เกี่ยวข้องกับการลดระดับเสียงหรือการจำกัดสัญญาณเท่านั้น มันฉลาดกว่านั้นนิดหน่อย หากคุณลดระดับเสียงที่เงียบลง เสียงที่ดังก็จะลดลงเช่นกัน วิธีหนึ่งในการแก้ไขนี้คือกำหนดเกณฑ์สัญญาณ แต่ส่งผลให้มีการบิดเบือนอย่างรุนแรง การบีบอัดช่วงไดนามิกเกี่ยวข้องกับการรวมกันระหว่างเกณฑ์ที่นุ่มนวลและการกรองเพื่อลดความผิดเพี้ยนที่จะเกิดขึ้นหากคุณต้องจำกัด/ตัดสัญญาณ ผลที่ได้คือสัญญาณที่ "ตัด" เสียงดังโดยไม่ผิดเพี้ยนและปล่อยให้เสียงเงียบดังที่เป็นอยู่ รหัสด้านล่างสลับไปมาระหว่างสามระดับของการบีบอัดที่แตกต่างกัน

  1. การบีบอัดด้วยการบิดเบือน
  2. การบีบอัดโดยไม่มีการบิดเบือน
  3. ไม่มีการบีบอัด

#รวม

btAudio audio = btAudio("ESP_Speaker"); การตั้งค่าเป็นโมฆะ () { audio.begin (); int bck = 26; int ws = 27; int dout = 25; เสียง. I2S(bck, dout, ws); } วงเป็นโมฆะ () { ล่าช้า (5000); audio.compress(30, 0.0001, 0.0001, 10, 10, 0); ล่าช้า (5000); audio.compress(30, 0.0001, 0.1, 10, 10, 0); ล่าช้า (5000); เสียง. คลายการบีบอัด (); }

การบีบอัดช่วงไดนามิกมีความซับซ้อนและวิธีการบีบอัด btAudio::compress มีหลายพารามิเตอร์ ฉันจะพยายามอธิบาย (ตามลำดับ) ที่นี่:

  1. Threshold - ระดับที่เสียงลดลง (วัดเป็นเดซิเบล)
  2. เวลาโจมตี - เวลาที่คอมเพรสเซอร์เริ่มทำงานเมื่อเกินเกณฑ์
  3. เวลาปล่อย - เวลาที่คอมเพรสเซอร์หยุดทำงาน
  4. Reduction Ratio - ปัจจัยที่เสียงถูกบีบอัด
  5. ความกว้างของเข่า - ความกว้าง (เป็นเดซิเบล) รอบธรณีประตูที่คอมเพรสเซอร์ทำงานบางส่วน(เสียงที่เป็นธรรมชาติมากขึ้น)
  6. เกน (เดซิเบล) ที่เพิ่มให้กับสัญญาณหลังการบีบอัด (เพิ่ม/ลดระดับเสียง)

การบิดเบือนที่ได้ยินอย่างมากในการใช้งานครั้งแรกของการบีบอัดนั้นเป็นเพราะเกณฑ์นั้นต่ำมาก และทั้งเวลาโจมตีและเวลาที่ปล่อยนั้นสั้นมากอย่างมีประสิทธิภาพ ส่งผลให้เกิดพฤติกรรมการจำกัดที่เข้มงวด สิ่งนี้แก้ไขได้อย่างชัดเจนในกรณีที่สองโดยการเพิ่มเวลาเผยแพร่ โดยพื้นฐานแล้วจะทำให้คอมเพรสเซอร์ทำงานได้อย่างราบรื่นยิ่งขึ้น ที่นี่ ฉันได้แสดงเพียงว่าการเปลี่ยนแปลง 1 พารามิเตอร์สามารถส่งผลอย่างมากต่อเสียงได้อย่างไร ตอนนี้ถึงตาคุณแล้วที่จะทดสอบกับพารามิเตอร์ต่างๆ

The Implementation (คณิตศาสตร์เวทย์มนตร์ - ไม่บังคับ)

ฉันพบว่าการใช้การบีบอัดช่วงไดนามิกอย่างไร้เดียงสานั้นเป็นสิ่งที่ท้าทาย อัลกอริทึมต้องการการแปลงจำนวนเต็ม 16 บิตเป็นเดซิเบล แล้วแปลงกลับเป็นจำนวนเต็ม 16 บิตเมื่อคุณประมวลผลสัญญาณแล้ว ฉันสังเกตเห็นว่าโค้ดหนึ่งบรรทัดใช้เวลา 10 ไมโครวินาทีในการประมวลผลข้อมูลสเตอริโอ เนื่องจากเสียงสเตอริโอที่สุ่มตัวอย่างที่ 44.1 KHz เหลือเพียง 11.3 ไมโครวินาทีสำหรับ DSP สิ่งนี้จึงช้าอย่างไม่อาจยอมรับได้… อย่างไรก็ตาม ด้วยการรวมตารางค้นหาขนาดเล็ก (400 ไบต์) และขั้นตอนการแก้ไขตามความแตกต่างที่แบ่งของ Netwon เราจะได้รับความแม่นยำเกือบ 17 บิตใน 0.2 ไมโครวินาที. ฉันได้แนบเอกสาร pdf พร้อมคณิตศาสตร์ทั้งหมดสำหรับผู้สนใจจริงๆ มันซับซ้อน คุณถูกเตือนแล้ว!

ขั้นตอนที่ 9: อินเทอร์เฟซ Wifi

อินเทอร์เฟซ Wifi
อินเทอร์เฟซ Wifi
อินเทอร์เฟซ Wifi
อินเทอร์เฟซ Wifi

ตอนนี้คุณมีเครื่องรับ Bluetooth ที่สามารถใช้งาน DSP แบบเรียลไทม์ได้แล้ว น่าเศร้า หากคุณต้องการเปลี่ยนพารามิเตอร์ DSP คุณจะต้องยกเลิกการเชื่อมต่อจากไฮไฟ อัปโหลดภาพร่างใหม่แล้วเชื่อมต่อใหม่ นี่มันอึดอัด ในการแก้ไขปัญหานี้ ฉันได้พัฒนาเว็บเซิร์ฟเวอร์ที่คุณสามารถใช้เพื่อแก้ไขพารามิเตอร์ DSP ทั้งหมดโดยไม่ต้องเชื่อมต่อกับคอมพิวเตอร์ของคุณอีกครั้ง ภาพร่างการใช้เว็บเซิร์ฟเวอร์อยู่ด้านล่าง

#รวม

#include btAudio audio = btAudio("ESP_Speaker"); เว็บ DSP เว็บ; การตั้งค่าเป็นโมฆะ () { Serial.begin (115200); เสียง.begin(); int bck = 26; int ws = 27; int dout = 25; เสียง. I2S(bck, dout, ws); // แทนที่ด้วย WiFi ID และรหัสผ่านของคุณ const char* ssid = "SSID"; const char* password = "รหัสผ่าน"; web.begin(ssid, รหัสผ่าน, &audio); } วงเป็นโมฆะ () { web._server.handleClient (); }

รหัสกำหนดที่อยู่ IP ให้กับ ESP32 ของคุณ ซึ่งคุณสามารถใช้เพื่อเข้าถึงหน้าเว็บได้ ครั้งแรกที่คุณเรียกใช้รหัสนี้ คุณควรแนบรหัสนี้กับคอมพิวเตอร์ของคุณ ด้วยวิธีนี้ คุณจะเห็นที่อยู่ IP ที่กำหนดให้กับ ESP32 ของคุณบนจอภาพแบบอนุกรมของคุณ หากคุณต้องการเข้าถึงหน้าเว็บนี้ เพียงป้อนที่อยู่ IP นี้ลงในเว็บเบราว์เซอร์ใดก็ได้ (ทดสอบบน Chrome)

ถึงตอนนี้เราควรคุ้นเคยกับวิธีการเปิดใช้งาน Bluetooth และ I2S แล้ว ความแตกต่างที่สำคัญคือการใช้อ็อบเจ็กต์ webDSP ออบเจ็กต์นี้ใช้ Wifi SSID และรหัสผ่านของคุณเป็นอาร์กิวเมนต์รวมถึงตัวชี้ไปยังอ็อบเจ็กต์ btAudio ในลูปหลัก เรารับอ็อบเจ็กต์ webDSP อย่างต่อเนื่องเพื่อฟังข้อมูลขาเข้าจากหน้าเว็บ จากนั้นอัปเดตพารามิเตอร์ DSP เป็นจุดปิด ควรสังเกตว่าทั้ง Bluetooth และ Wifi ใช้วิทยุเดียวกันบน ESP32 ซึ่งหมายความว่าคุณอาจต้องรอนานถึง 10 วินาทีนับจากเมื่อคุณป้อนพารามิเตอร์บนหน้าเว็บจนถึงเวลาที่ข้อมูลไปถึง ESP32 จริงๆ

ขั้นตอนที่ 10: แผนการในอนาคต

หวังว่าคุณจะชอบคำแนะนำนี้และตอนนี้ได้เพิ่ม Bluetooth Audio และ DSP ลงในไฮไฟของคุณแล้ว อย่างไรก็ตาม ฉันคิดว่ายังมีช่องว่างอีกมากสำหรับการเติบโตในโครงการนี้ และฉันแค่อยากจะชี้ให้เห็นทิศทางในอนาคตที่อาจจะดำเนินการ

  • เปิดใช้งานการสตรีมเสียงผ่าน Wifi (เพื่อคุณภาพเสียงที่ดีที่สุด)
  • ใช้ไมโครโฟน I2S เพื่อเปิดใช้งานคำสั่งเสียง
  • พัฒนาอีควอไลเซอร์ที่ควบคุมด้วย WiFi
  • ทำให้สวยงาม (เขียงหั่นขนมไม่ได้ออกแบบผลิตภัณฑ์ที่ยอดเยี่ยม)

เมื่อฉันนำแนวคิดเหล่านี้ไปปฏิบัติจริง ฉันจะสร้างผู้แนะนำเพิ่มเติม หรืออาจมีคนอื่นนำคุณลักษณะเหล่านี้ไปใช้ นั่นคือความสุขในการทำให้ทุกอย่างเป็นโอเพ่นซอร์ส!

แนะนำ: