Mục lục:

Xử lý tín hiệu kỹ thuật số & âm thanh Bluetooth: Khung Arduino: 10 bước
Xử lý tín hiệu kỹ thuật số & âm thanh Bluetooth: Khung Arduino: 10 bước

Video: Xử lý tín hiệu kỹ thuật số & âm thanh Bluetooth: Khung Arduino: 10 bước

Video: Xử lý tín hiệu kỹ thuật số & âm thanh Bluetooth: Khung Arduino: 10 bước
Video: Học lập trình Arduino KHÔNG HỀ KHÓ - Bộ KIT học tập Arduino Uno R3 BLK 2024, Tháng mười một
Anonim
Image
Image
Xử lý tín hiệu kỹ thuật số & âm thanh Bluetooth: Khung Arduino
Xử lý tín hiệu kỹ thuật số & âm thanh Bluetooth: Khung Arduino

Tóm lược

Khi tôi nghĩ đến Bluetooth, tôi nghĩ đến âm nhạc nhưng đáng buồn là hầu hết các bộ vi điều khiển không thể phát nhạc qua Bluetooth. Raspberry Pi có thể nhưng đó là một máy tính. Tôi muốn phát triển một khung dựa trên Arduino cho vi điều khiển để phát âm thanh qua Bluetooth. Để hoàn toàn linh hoạt các cơ của bộ vi điều khiển, tôi sẽ thêm Xử lý tín hiệu kỹ thuật số (DSP) theo thời gian thực vào âm thanh (lọc thông cao, lọc thông thấp và nén dải động). Đối với quả anh đào ở trên, tôi sẽ thêm một máy chủ web có thể được sử dụng để cấu hình DSP không dây. Video được nhúng hiển thị các kiến thức cơ bản về âm thanh Bluetooth trong hoạt động. Nó cũng cho thấy tôi đang sử dụng máy chủ web để thực hiện một số lọc thông cao, lọc thông thấp và nén dải động. Việc sử dụng đầu tiên của tính năng nén dải động có mục đích gây ra biến dạng như một ví dụ về các lựa chọn thông số kém. Ví dụ thứ hai loại bỏ sự biến dạng này.

Đối với dự án này, ESP32 là vi điều khiển được lựa chọn. Nó có giá dưới £ 10 và được trang bị nhiều tính năng với ADC, DAC, Wifi, Bluetooth Low Energy, Bluetooth Classic và bộ xử lý lõi kép 240MHz. Về mặt kỹ thuật, DAC tích hợp có thể phát âm thanh nhưng âm thanh sẽ không tuyệt vời. Thay vào đó, tôi sẽ sử dụng bộ giải mã âm thanh nổi Adafruit I2S để tạo ra tín hiệu đầu ra. Tín hiệu này có thể dễ dàng được gửi đến bất kỳ hệ thống HiFi nào để bổ sung ngay lập tức âm thanh không dây vào hệ thống HiFi hiện có của bạn.

Quân nhu

Hy vọng rằng hầu hết các nhà sản xuất sẽ có breadboard, jumper, cáp USB, bàn là hàn nguồn điện và sẽ chỉ phải chi 15 bảng Anh cho ESP32 và bộ giải mã âm thanh nổi. Nếu không, tất cả các phần cần thiết được liệt kê dưới đây.

  • ESP32 - được thử nghiệm trên ESP32-PICO-KIT và TinyPico - £ 9,50 / £ 24
  • Bộ giải mã âm thanh nổi Adafruit I2S - £ 5,51
  • Breadboard - £ 3 - £ 5 mỗi cái
  • Dây nhảy - £ 3
  • Tai nghe có dây / Hệ thống Hi-Fi - $$$$
  • Đầu đẩy hoặc Sắt hàn - £ 2,10 / £ 30
  • Cáp micro USB - £ 2,10 / £ 3
  • Đầu nối 3,5 mm đến RCA / giắc cắm 3,5 mm đến giắc cắm (hoặc bất cứ thứ gì loa của bạn cần) - £ 2,40 / £ 1,50
  • Nguồn điện USB - £ 5

Bước 1: Xây dựng - Breadboard

Xây dựng - Breadboard
Xây dựng - Breadboard

Nếu bạn mua ESP32-PICO-KIT, bạn sẽ không phải hàn bất kỳ chân nào vì nó đã được hàn sẵn. Đơn giản chỉ cần đặt nó trên breadboard.

Bước 2: Xây dựng - Đẩy tiêu đề / hàn

Xây dựng - Đầu đẩy / hàn
Xây dựng - Đầu đẩy / hàn
Xây dựng - Đầu đẩy / hàn
Xây dựng - Đầu đẩy / hàn

Nếu bạn có mỏ hàn, hãy hàn các chân vào bộ giải mã âm thanh nổi theo hướng dẫn trên trang web Adafruit. Tại thời điểm viết bài viết, mỏ hàn của tôi đang làm việc và đã bị khóa. Tôi không muốn trả tiền cho một cái mỏ hàn tạm thời vì vậy tôi đã cắt một số tiêu đề đẩy từ pimoroni. Tôi đã cắt chúng để chúng phù hợp với bộ giải mã âm thanh nổi. Đây không phải là giải pháp tốt nhất (và không phải là cách các tiêu đề được dự định sử dụng) nhưng nó là giải pháp thay thế rẻ nhất cho mỏ hàn. Khe cắm tiêu đề cắt lên vào breadboard. Bạn chỉ cần 1 dòng 6 chân cho bộ giải mã. Bạn có thể thêm sáu cái khác vào phía bên kia để ổn định nhưng điều này không cần thiết đối với hệ thống nguyên mẫu này. Các chân để cắm các tiêu đề vào là vin, 3vo, gnd, wsel, din và bclk.

Bước 3: Thi công - Nối dây các chân điện

Xây dựng - Nối dây các chân điện
Xây dựng - Nối dây các chân điện

Đặt bộ giải mã Âm thanh nổi trên các đầu đẩy (chân vin, 3vo, gnd, wsel, din và bclk) và đẩy chúng lại với nhau một cách chắc chắn. Một lần nữa, điều này lý tưởng nhất nên được thực hiện với một mỏ hàn nhưng tôi phải tùy cơ ứng biến. Bạn sẽ nhận thấy rằng tất cả các dây trong hướng dẫn này có màu xanh lam. Đó là bởi vì tôi không có bất kỳ dây nhảy nào nên tôi đã cắt 1 sợi dây dài thành những đoạn nhỏ hơn. Ngoài ra, tôi là người mù màu và không thực sự quan tâm đến màu sắc của dây. Các chân nguồn được gắn như sau:

3v3 (ESP32) -> để vin trên bộ giải mã âm thanh nổi

gnd (ESP32) -> sang gnd trên bộ giải mã âm thanh nổi

Bước 4: Thi công - Đấu dây I2S

Cấu tạo - Hệ thống dây I2S
Cấu tạo - Hệ thống dây I2S

Để gửi âm thanh Bluetooth từ ESP32 đến bộ giải mã âm thanh nổi, chúng tôi sẽ sử dụng một phương pháp giao tiếp kỹ thuật số được gọi là I2S. Bộ giải mã âm thanh nổi sẽ lấy tín hiệu kỹ thuật số này và biến nó thành tín hiệu analog có thể cắm vào loa hoặc HiFi. I2S chỉ yêu cầu 3 dây và rất dễ hiểu. Đồng hồ bit (bclk) dòng chuyển sang mức cao và thấp để cho biết một bit mới được truyền đi. Dòng ra dữ liệu (dout) chuyển sang cao hoặc thấp để cho biết liệu bit đó có giá trị 0 hay 1 và dòng chọn từ (wsel) chuyển sang cao hoặc thấp để cho biết kênh bên trái hay bên phải đang được truyền. Không phải mọi vi điều khiển đều hỗ trợ I2S nhưng ESP32 có 2 dòng I2S. Điều này làm cho nó trở thành một sự lựa chọn hiển nhiên cho dự án này.

Hệ thống dây điện như sau:

27 (ESP32) -> wsel (Bộ giải mã âm thanh nổi)

25 (ESP32) -> din (Bộ giải mã âm thanh nổi)

26 (ESP32) -> bclk (Bộ giải mã âm thanh nổi)

Bước 5: Cài đặt Thư viện BtAudio

Cài đặt Thư viện BtAudio
Cài đặt Thư viện BtAudio
Cài đặt Thư viện BtAudio
Cài đặt Thư viện BtAudio

Nếu bạn chưa cài đặt chúng, hãy cài đặt Arduino IDE và lõi Arduino cho ESP32. Sau khi bạn đã cài đặt chúng, hãy truy cập trang Github của tôi và tải xuống kho lưu trữ. Trong IDE Arduino dưới Sketch >> Bao gồm Thư viện >> chọn "Thêm thư viện. ZIP". Sau đó chọn tệp zip đã tải xuống. Điều này sẽ thêm thư viện btAudio của tôi vào các thư viện Arduino của bạn. Để sử dụng thư viện, bạn sẽ phải bao gồm tiêu đề có liên quan trong bản phác thảo Arduino. Bạn sẽ thấy điều này trong bước tiếp theo.

Bước 6: Sử dụng Thư viện BtAudio

Sử dụng Thư viện BtAudio
Sử dụng Thư viện BtAudio
Sử dụng Thư viện BtAudio
Sử dụng Thư viện BtAudio

Sau khi cài đặt, hãy kết nối ESP32 với máy tính của bạn qua micro USB, sau đó kết nối bộ giải mã âm thanh nổi với loa bằng dây 3,5mm. Trước khi tải lên bản phác thảo, bạn sẽ cần thay đổi một số thứ trong trình chỉnh sửa Arduino. Sau khi bạn đã chọn bảng của mình, bạn sẽ cần phải chỉnh sửa sơ đồ phân vùng trong Công cụ >> Sơ đồ phân vùng và chọn "Không có OTA (ỨNG dụng lớn)" hoặc "SPIFFS tối thiểu (APPS lớn có OTA)". Điều này là cần thiết vì dự án này sử dụng cả WiFi và Bluetooth, cả hai đều là những thư viện rất nặng về bộ nhớ. Khi bạn đã hoàn thành việc này, hãy tải bản phác thảo sau lên ESP32.

#bao gồm

// Đặt tên của thiết bị âm thanh btAudio audio = btAudio ("ESP_Speaker"); void setup () {// truyền dữ liệu âm thanh tới ESP32 audio.begin (); // xuất dữ liệu nhận được tới I2S DAC int bck = 26; int ws = 27; int dout = 25; âm thanh. I2S (bck, dout, ws); } void loop () {}

Nói chung, bản phác thảo có thể được chia thành 3 bước:

  1. Tạo một đối tượng btAudio chung đặt "tên Bluetooth" của ESP32 của bạn
  2. Định cấu hình ESP32 để nhận âm thanh bằng phương thức btAudio:: begin
  3. Đặt các chân I2S bằng phương thức btAudio:: I2S.

Đó là nó về mặt phần mềm! Bây giờ tất cả những gì bạn cần làm là bắt đầu kết nối Bluetooth với ESP32 của bạn. Chỉ cần quét các thiết bị mới trên điện thoại / máy tính xách tay / máy nghe nhạc MP3 của bạn và "ESP_Speaker" sẽ xuất hiện. Khi bạn hài lòng vì mọi thứ đang hoạt động (phát nhạc), bạn có thể ngắt kết nối ESP32 khỏi máy tính của mình. Cấp nguồn cho nó bằng nguồn điện USB và nó sẽ ghi nhớ mã cuối cùng mà bạn đã tải lên nó. Bằng cách này, bạn có thể để ESP32 ẩn sau hệ thống HiFi của mình mãi mãi.

Bước 7: DSP - Lọc

Mở rộng bộ thu với xử lý tín hiệu kỹ thuật số

Nếu bạn đã làm theo tất cả các bước (và tôi không bỏ sót gì) thì giờ đây bạn đã có bộ thu Bluetooth hoạt động đầy đủ cho hệ thống HiFi của mình. Mặc dù điều này rất tuyệt nhưng nó không thực sự đẩy bộ vi điều khiển đến giới hạn của nó. ESP32 có hai lõi hoạt động ở tần số 240MHz. Điều đó có nghĩa là dự án này không chỉ là một bộ thu. Nó có khả năng trở thành bộ thu Bluetooth với Bộ xử lý tín hiệu kỹ thuật số (DSP). Các DSP về cơ bản thực hiện các phép toán trên tín hiệu trong thời gian thực. Một hoạt động hữu ích được gọi là Lọc kỹ thuật số. Quá trình này làm giảm tần số trong tín hiệu dưới hoặc trên một tần số cắt nhất định, tùy thuộc vào việc bạn đang sử dụng bộ lọc thông cao hay thông thấp.

Bộ lọc thông cao

Bộ lọc High-Pass làm giảm tần số dưới một dải nhất định. Tôi đã xây dựng một thư viện bộ lọc cho các hệ thống Arduino dựa trên mã từ earlevel.com. Sự khác biệt chính là tôi đã thay đổi cấu trúc lớp để cho phép xây dựng các bộ lọc bậc cao dễ dàng hơn. Các bộ lọc thứ tự cao hơn loại bỏ các tần số vượt quá ngưỡng của bạn hiệu quả hơn nhưng chúng đòi hỏi tính toán nhiều hơn. Tuy nhiên, với cách triển khai hiện tại, bạn thậm chí có thể sử dụng bộ lọc bậc 6 cho âm thanh thời gian thực!

Bản phác thảo giống như bản phác thảo được tìm thấy ở bước trước ngoại trừ việc chúng ta đã thay đổi vòng lặp chính. Để kích hoạt các bộ lọc, chúng tôi sử dụng phương thức btAudio:: createFilter. Phương thức này chấp nhận 3 đối số. Đầu tiên là số tầng lọc. Số tầng của bộ lọc bằng một nửa bậc của bộ lọc. Đối với bộ lọc bậc 6, đối số đầu tiên phải là 3. Đối với bộ lọc bậc 8, đối số thứ hai là giới hạn bộ lọc. Tôi đã đặt điều này thành 1000Hz để có hiệu ứng thực sự ấn tượng trên dữ liệu. Cuối cùng, chúng tôi chỉ định loại bộ lọc với đối số thứ ba. Đây phải là thông cao cho bộ lọc thông cao và thông thấp cho bộ lọc thông thấp. Tập lệnh dưới đây chuyển vùng cắt của tần số này giữa 1000Hz và 2Hz. Bạn sẽ nghe thấy một hiệu ứng mạnh mẽ trên dữ liệu.

#bao gồm

btAudio audio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; âm thanh. I2S (bck, dout, ws); } void loop () {delay (5000); audio.createFilter (3, 1000, highpass); chậm trễ (5000); audio.createFilter (3, 2, highpass); }

Bộ lọc thông thấp

Bộ lọc thông thấp làm ngược lại với bộ lọc thông cao và triệt tiêu các tần số trên một tần số nhất định. Chúng có thể được triển khai theo cách tương tự như bộ lọc thông cao ngoại trừ việc chúng yêu cầu thay đổi đối số thứ ba thành thông thấp. Đối với bản phác thảo bên dưới, tôi xen kẽ mức cắt tần số thấp giữa 2000Hz và 20000Hz. Hy vọng rằng bạn sẽ nghe thấy sự khác biệt. Nó sẽ nghe khá nghẹt khi bộ lọc thông thấp ở 2000Hz.

#bao gồm

btAudio audio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; âm thanh. I2S (bck, dout, ws); } void loop () {delay (5000); audio.createFilter (3, 2000, lowpass); chậm trễ (5000); audio.createFilter (3, 20000, lowpass); }

Bước 8: DSP - Nén dải động

Tiểu sử

Nén dải động là một phương pháp xử lý tín hiệu cố gắng làm giảm độ lớn của âm thanh. Nó nén âm thanh lớn, vượt quá một ngưỡng nhất định, xuống mức độ yên tĩnh và sau đó, tùy chọn khuếch đại cả hai. Kết quả là trải nghiệm nghe đồng đều hơn nhiều. Điều này thực sự hữu ích khi tôi đang xem một chương trình với nhạc nền rất lớn và giọng hát rất êm. Trong trường hợp này, chỉ tăng âm lượng không giúp ích được gì vì điều này chỉ làm khuếch đại nhạc nền. Với tính năng nén dải động, tôi có thể giảm âm lượng nhạc nền to bằng giọng hát và nghe lại mọi thứ bình thường.

Mật mã

Nén dải động không chỉ liên quan đến việc giảm âm lượng hoặc ngưỡng tín hiệu. Nó thông minh hơn thế một chút. Nếu bạn giảm âm lượng, âm thanh yên tĩnh sẽ bị giảm cũng như âm thanh lớn. Một cách để giải quyết vấn đề này là ngưỡng tín hiệu nhưng điều này dẫn đến sự biến dạng nghiêm trọng. Nén dải động liên quan đến sự kết hợp của ngưỡng mềm và lọc để giảm thiểu sự biến dạng mà một tín hiệu sẽ nhận được nếu bạn định ngưỡng / cắt tín hiệu. Kết quả là tín hiệu trong đó các âm thanh lớn được "cắt bớt" mà không bị biến dạng và các âm thanh yên tĩnh được giữ nguyên như cũ. Đoạn mã dưới đây chuyển đổi giữa ba cấp độ nén khác nhau.

  1. Nén có biến dạng
  2. Nén mà không bị biến dạng
  3. Không nén

#bao gồm

btAudio audio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; âm thanh. I2S (bck, dout, ws); } void loop () {delay (5000); audio.compress (30, 0,0001, 0,0001, 10, 10, 0); chậm trễ (5000); audio.compress (30, 0,0001, 0,1, 10, 10, 0); chậm trễ (5000); audio.decompress (); }

Nén dải động phức tạp và các phương pháp nén btAudio:: có nhiều tham số. Tôi sẽ thử và giải thích chúng (theo thứ tự) ở đây:

  1. Threshold - Mức giảm âm thanh (đo bằng decibel)
  2. Thời gian tấn công - Thời gian cần thiết để máy nén bắt đầu hoạt động sau khi vượt quá ngưỡng
  3. Thời gian nhả - Thời gian cần thiết để máy nén ngừng hoạt động.
  4. Tỷ lệ giảm - hệ số mà âm thanh được nén.
  5. Chiều rộng đầu gối - Chiều rộng (tính bằng decibel) xung quanh ngưỡng mà máy nén hoạt động một phần (âm thanh tự nhiên hơn).
  6. Độ lợi (decibel) được thêm vào tín hiệu sau khi nén (tăng / giảm âm lượng)

Sự biến dạng âm thanh rất rõ ràng trong lần sử dụng nén đầu tiên là do ngưỡng này rất thấp và cả thời gian tấn công và thời gian giải phóng đều rất ngắn, dẫn đến hành vi vượt ngưỡng cứng. Điều này rõ ràng được giải quyết trong trường hợp thứ hai bằng cách tăng thời gian phát hành. Điều này về cơ bản làm cho máy nén hoạt động một cách trơn tru hơn nhiều. Ở đây, tôi chỉ trình bày cách thay đổi 1 tham số có thể có tác động lớn đến âm thanh như thế nào. Bây giờ đến lượt bạn thử nghiệm với các thông số khác nhau.

Thực hiện (toán học kỳ diệu - tùy chọn)

Tôi nhận thấy rằng việc triển khai nén Dải động một cách thuần túy là một thách thức. Thuật toán yêu cầu chuyển đổi số nguyên 16 bit thành decibel và sau đó chuyển đổi nó trở lại số nguyên 16 bit sau khi bạn đã xử lý tín hiệu. Tôi nhận thấy rằng một dòng mã mất 10 micro giây để xử lý dữ liệu âm thanh nổi. Vì âm thanh nổi được lấy mẫu ở 44,1 KHz chỉ để lại 11,3 micro giây cho DSP, điều này là chậm không thể chấp nhận được… Tuy nhiên, bằng cách kết hợp một bảng tra cứu nhỏ (400 byte) và quy trình nội suy dựa trên sự khác biệt đã chia của Netwon, chúng tôi có thể thu được độ chính xác gần 17 bit trong 0,2 micro giây. Tôi đã đính kèm một tài liệu pdf với tất cả các phép toán cho những người thực sự quan tâm. Nó phức tạp, bạn đã được cảnh báo!

Bước 9: Giao diện Wifi

Giao diện Wifi
Giao diện Wifi
Giao diện Wifi
Giao diện Wifi

Bây giờ bạn có một bộ thu Bluetooth có khả năng chạy DSP thời gian thực. Đáng buồn thay, nếu bạn muốn thay đổi bất kỳ thông số DSP nào, bạn sẽ cần ngắt kết nối khỏi HiFi của mình, tải lên bản phác thảo mới và sau đó kết nối lại. Điều này thật khó hiểu. Để khắc phục điều này, tôi đã phát triển một máy chủ web mà bạn có thể sử dụng để chỉnh sửa tất cả các thông số DSP mà không cần kết nối lại với máy tính của mình. Bản phác thảo để sử dụng máy chủ web là bên dưới.

#bao gồm

#include btAudio audio = btAudio ("ESP_Speaker"); webDSP web; void setup () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; âm thanh. I2S (bck, dout, ws); // thay thế bằng ID và mật khẩu WiFi của bạn const char * ssid = "SSID"; const char * password = "MẬT KHẨU"; web.begin (ssid, mật khẩu & âm thanh); } void loop () {web._server.handleClient (); }

Mã chỉ định địa chỉ IP cho ESP32 của bạn mà bạn có thể sử dụng để truy cập trang web. Lần đầu tiên bạn chạy mã này, bạn nên gắn nó vào máy tính của mình. Bằng cách đó, bạn có thể thấy địa chỉ IP được gán cho ESP32 trên màn hình nối tiếp của mình. Nếu bạn muốn truy cập trang web này, chỉ cần nhập địa chỉ IP này vào bất kỳ trình duyệt web nào (được thử nghiệm trên chrome).

Bây giờ chúng ta đã làm quen với phương pháp bật Bluetooth và I2S. Sự khác biệt chính là việc sử dụng một đối tượng webDSP. Đối tượng này lấy SSID và mật khẩu Wifi của bạn làm đối số cũng như một con trỏ đến đối tượng btAudio. Trong vòng lặp chính, chúng tôi liên tục nhận được đối tượng webDSP để lắng nghe dữ liệu đến từ trang web và sau đó cập nhật các tham số DSP. Cuối cùng, cần lưu ý rằng cả Bluetooth và Wifi đều sử dụng cùng một đài trên ESP32. Điều này có nghĩa là bạn có thể phải đợi tối đa 10 giây kể từ khi bạn nhập các thông số trên trang web đến khi thông tin thực sự đến được ESP32.

Bước 10: Kế hoạch tương lai

Hy vọng rằng bạn thích phần hướng dẫn này và bây giờ đã thêm Bluetooth Audio và DSP vào HiFi của bạn. Tuy nhiên, tôi nghĩ rằng có rất nhiều cơ hội để phát triển trong dự án này và tôi chỉ muốn chỉ ra một số hướng đi trong tương lai mà tôi có thể thực hiện.

  • Bật phát trực tuyến âm thanh qua Wi-Fi (để có chất lượng âm thanh tốt nhất)
  • Sử dụng micrô I2S để bật lệnh thoại
  • phát triển bộ cân bằng điều khiển WiFi
  • Làm cho nó đẹp (breadboard không hét lên thiết kế sản phẩm tuyệt vời)

Khi tôi bắt đầu triển khai những ý tưởng này, tôi sẽ đưa ra nhiều hướng dẫn hơn. Hoặc có thể ai đó sẽ triển khai các tính năng này. Đó là niềm vui của việc làm cho mọi thứ đều là mã nguồn mở!

Đề xuất: