Kiến thức âm thanh cơ bản

Thu âm bằng micro I2S INMP441 với ESP32: nối chân, dữ liệu 24-bit và gain số

Cimo 9 phút đọc

Hướng dẫn thu âm bằng INMP441 với ESP32: nối sáu chân I2S đúng nguồn 1,8-3,3 V, chọn kênh L/R, dịch phải 8 bit để lấy dữ liệu 24-bit và áp gain số đúng headroom. Bài viết giải thích bằng số liệu độ nhạy -26 dBFS vì sao bản ghi nghe nhỏ và cách tránh clipping.

Thu âm bằng micro I2S INMP441 với ESP32: nối chân, dữ liệu 24-bit và gain số
Mục lục
  1. INMP441 là gì và cần chuẩn bị những gì?
  2. Sơ đồ nối chân INMP441 với ESP32
  3. Ví dụ: tính BCLK cho cấu hình thu 48 kHz
  4. Dữ liệu 24-bit nằm trong khung 32-bit như thế nào?
  5. Vì sao bản ghi INMP441 nghe nhỏ?
  6. Ví dụ: dự đoán mức ghi giọng nói bằng số liệu thật
  7. Gain số: tăng thế nào cho không vỡ tiếng?
  8. Ví dụ: chọn gain từ đỉnh đo được trên bàn DIY
  9. Lỗi thường gặp khi thu INMP441 và cách khoanh vùng
  10. Câu hỏi thường gặp
  11. INMP441 cấp nguồn 5 V được không?
  12. Thu mono bằng một INMP441 thì nối L/R thế nào?
  13. Vì sao phải dịch phải 8 bit dữ liệu INMP441?
  14. Tăng gain số có làm bản ghi sạch hơn không?
  15. INMP441 thu sample rate 96 kHz được không?

Micro I2S INMP441 với ESP32 là cách thu âm số gọn nhất cho dự án DIY hiện nay: micro MEMS (micro cơ điện tử siêu nhỏ) này đã tích hợp sẵn bộ chuyển đổi tương tự sang số, xuất dữ liệu 24-bit qua giao tiếp I2S (Inter-IC Sound, giao thức truyền âm thanh số giữa các IC), nên ESP32 nhận trực tiếp mẫu số mà không cần mạch khuếch đại hay ADC rời. Bài viết hướng dẫn nối đúng sáu chân, hiểu đúng định dạng dữ liệu và xử lý tình huống quen thuộc nhất: bản ghi nghe nhỏ.

Nếu chưa rõ ba đường BCLK, WS và DATA làm gì, hãy đọc trước bài I2S là gì: vai trò của BCLK, WS và DATA. Vị trí của khâu thu âm trong toàn bộ chuỗi xử lý được trình bày ở bài trụ cột ESP32 xử lý âm thanh số: kiến trúc và giới hạn thực tế.

Kiểm tra micro I2S INMP441 nối với bo ESP32 trên bàn làm việc DIY

INMP441 là gì và cần chuẩn bị những gì?

INMP441 là micro MEMS đa hướng (omnidirectional, thu đều mọi hướng) của TDK InvenSense, dạng bottom-port (lỗ thu ở mặt dưới). Bên trong gồm cảm biến MEMS, ADC và bộ lọc chống aliasing (lọc khử răng cưa trước khi số hóa). Điểm quan trọng cần nhớ: độ nhạy (sensitivity) điển hình của INMP441 là -26 dBFS tại 94 dB SPL và 1 kHz theo datasheet. Con số này quyết định trực tiếp vì sao giọng nói bình thường luôn nằm khá thấp so với mức tối đa, như sẽ thấy ở phần mức âm lượng.

Bạn cần: bo ESP32, module INMP441, dây nối ngắn và nguồn 3,3 V từ bo ESP32. Không cần điện trở kéo lên cho đường I2S, vì ngõ ra của micro là dạng push-pull.

Sơ đồ nối chân INMP441 với ESP32

Module có sáu chân: VDD, GND, SCK, WS, SD và L/R. GPIO dưới đây chỉ là ví dụ hay gặp; bạn có thể đổi chân khác nhờ GPIO matrix (ma trận định tuyến chân) của ESP32, miễn khai báo khớp trong code.

Chân INMP441Nối tới ESP32Vai trò
VDD3,3 VNguồn cấp, dải hoạt động 1,8 đến 3,3 V theo datasheet
GNDGNDMass chung, bắt buộc nối
SCKGPIO 26 (BCLK)Đồng hồ bit, nhịp cho từng bit dữ liệu
WSGPIO 25 (LRCK)Chọn từ/kênh, tần số bằng sample rate
SDGPIO 33 (DIN)Dữ liệu âm thanh ra từ micro vào ESP32
L/RGND hoặc VDDChọn kênh trái hoặc phải

Về nguồn: datasheet INMP441 (DS-INMP441-00, Rev 1.1) cho dải VDD hoạt động 1,8 V đến 3,3 V, điện áp tuyệt đối tối đa 3,63 V. Cấp 5 V sẽ làm hỏng micro. Với ESP32 chạy logic 3,3 V, cấp thẳng 3,3 V là lựa chọn tự nhiên và an toàn nhất.

Về chân L/R: L/R ở mức thấp (nối GND) thì micro phát dữ liệu vào slot trái của khung I2S; ở mức cao (nối VDD) thì phát vào slot phải, slot còn lại ở trạng thái trở kháng cao. Thu mono: nối L/R xuống GND và đọc kênh trái. Thu stereo: dùng hai micro chung SCK/WS/SD, L/R ngược nhau.

Ví dụ: tính BCLK cho cấu hình thu 48 kHz

Ví dụ: bạn cấu hình sample rate (tần số lấy mẫu) 48 kHz, khung 32-bit mỗi slot, chế độ stereo hai slot. Tần số SCK cần cấp là BCLK = 48.000 × 32 × 2 = 3.072.000 Hz, tức 3,072 MHz. Con số này nằm trong dải SCK 0,5 đến 3,2 MHz mà datasheet INMP441 cho phép, và tần số WS 48 kHz cũng nằm trong dải WS cho phép khoảng 7,8 đến 49,3 kHz. Nếu bạn nâng sample rate lên 96 kHz với cùng khung 32-bit stereo, BCLK sẽ thành 6,144 MHz, vượt giới hạn của INMP441: đó là lý do micro này thực tế chỉ phù hợp thu tới khoảng 48 kHz. Phép tính này là tính toán theo công thức với giả định truyền liên tục không nghỉ giữa các khung, không phải kết quả đo.

Dữ liệu 24-bit nằm trong khung 32-bit như thế nào?

INMP441 xuất dữ liệu 24-bit theo định dạng căn trái (left-justified): 24 bit có nghĩa chiếm phần cao nhất của slot 32-bit, 8 bit thấp còn lại là 0 đệm. Nói cách khác, giá trị đọc được từ DMA (truy cập bộ nhớ trực tiếp) là một số 32-bit đã bị dịch trái 8 bit so với giá trị 24-bit thật. Nếu quên dịch phải 8 bit trước khi dùng, biên độ tính ra sẽ sai hệ số 256 lần và các phép đo mức, FFT hay nhận dạng sẽ lệch hoàn toàn.

Cách xử lý chuẩn trong cả ESP-IDF và Arduino-ESP32 đều giống nhau: đọc mẫu 32-bit, dịch phải số học 8 bit để khôi phục số 24-bit có dấu, rồi mới chuẩn hóa về dải -1,0 đến 1,0 bằng cách chia cho 8.388.608 (2 mũ 23) nếu cần xử lý số thực. Lưu ý phải dùng biến có dấu int32_t và phép dịch phải số học để giữ đúng bit dấu cho mẫu âm.

Đoạn xử lý dưới đây là ví dụ minh họa tối thiểu cho Arduino-ESP32 dùng driver I2S cũ (driver/i2s.h). Trạng thái kiểm thử: code minh họa theo tài liệu Espressif và datasheet, chưa biên dịch và chưa chạy trên board thật trong bài viết này, bạn cần tự biên dịch và kiểm tra với phiên bản Arduino-ESP32 đang dùng, vì các bản mới đã chuyển dần sang API I2S mới.

Cấu hình gợi ý: mode master + RX, sample rate 16.000 hoặc 48.000 Hz, bits_per_sample 32 bit, channel_format chỉ kênh trái nếu L/R nối GND, communication_format I2S chuẩn. Sau khi i2s_read trả về mảng int32_t, xử lý từng mẫu như sau: int32_t sample24 = raw >> 8; float normalized = sample24 / 8388608.0f; Hai dòng này là phần cốt lõi, phần khởi tạo driver đầy đủ nên lấy từ ví dụ chính thức của phiên bản SDK bạn dùng để tránh trộn API giữa các phiên bản.

Trong ESP-IDF 5.x (driver i2s_std), nguyên tắc không đổi: cấu hình slot 32-bit, đọc bằng i2s_channel_read vào buffer int32_t, rồi dịch phải 8 bit từng mẫu.

Vì sao bản ghi INMP441 nghe nhỏ?

Đây là câu hỏi phổ biến nhất và phần lớn trường hợp không phải lỗi. Có ba nguyên nhân cộng dồn. Thứ nhất, độ nhạy -26 dBFS nghĩa là sóng sin 94 dB SPL (mức của máy hiệu chuẩn micro chuẩn, tương đương nói rất to ở sát miệng) mới đạt -26 dB so với mức tối đa số 0 dBFS. Giọng nói thường ở khoảng 60 đến 65 dB SPL tại vị trí micro cách miệng vài chục centimet sẽ thấp hơn mức tham chiếu khoảng 30 dB, tức quanh -56 dBFS: nghe nhỏ là hệ quả vật lý của độ nhạy, không phải micro hỏng. Thứ hai, nếu quên dịch phải 8 bit hoặc chia sai hệ số khi chuẩn hóa, mức hiển thị có thể sai thêm.

Ví dụ: dự đoán mức ghi giọng nói bằng số liệu thật

Ví dụ: đặt micro cách miệng 30 cm, giọng nói đo tương đương khoảng 62 dB SPL. Chênh lệch so với mức tham chiếu 94 dB SPL là 62 - 94 = -32 dB. Mức số thu được dự đoán khoảng -26 + (-32) = -58 dBFS. Đỉnh mẫu 24-bit tương ứng chỉ vào khoảng 0,13 phần trăm của toàn thang. Sóng âm chỉ là vạch mảnh ở giữa là mức đúng kỳ vọng, chưa phải micro lỗi.

Gain số: tăng thế nào cho không vỡ tiếng?

Gain số (khuếch đại bằng phép nhân trong miền số) là cách xử lý đúng: nhân mọi mẫu với hệ số cố định. Tăng 20 dB là nhân 10 lần, tăng 12 dB là nhân khoảng 4 lần. Gain số không cải thiện SNR (khoảng 61 dBA điển hình theo datasheet), nó chỉ nâng cả tín hiệu lẫn sàn nhiễu lên mức dễ nghe hơn.

Clipping (xén ngọn) xảy ra khi sau khi nhân, mẫu vượt quá giá trị lớn nhất biểu diễn được và bị cắt phẳng ở mức tối đa. Quy tắc thực hành: chọn gain sao cho đỉnh lớn nhất sau khuếch đại còn cách 0 dBFS khoảng 3 đến 6 dB.

Ví dụ: chọn gain từ đỉnh đo được trên bàn DIY

Ví dụ: bạn ghi thử một đoạn hội thoại, đỉnh lớn nhất đo được là -42 dBFS khi vỗ tay mạnh. Bạn muốn đỉnh này sau xử lý nằm ở -6 dBFS để còn 6 dB headroom (khoảng dự phòng trước khi xén ngọn). Gain cần thêm là -6 - (-42) = 36 dB, tương đương hệ số nhân 10 mũ (36/20), khoảng 63 lần. Áp hệ số này, giọng nói ở -58 dBFS sẽ lên khoảng -22 dBFS, nghe rõ hơn hẳn, trong khi tiếng vỗ tay bất ngờ to hơn đoạn thử tối đa 6 dB nữa vẫn chưa clipping. Nếu thay vì tính, bạn nhân bừa 200 lần (khoảng 46 dB), tiếng vỗ tay sẽ vượt 0 dBFS và vỡ: đó là kịch bản kiểm tra đơn giản nhất để tự trải nghiệm giới hạn của gain số ngay trên bàn làm việc.

Để hiểu vì sao xử lý ở 24-bit và 32-bit cho phép cộng gain, chỉnh EQ nhiều bước mà ít hỏng chất lượng hơn hẳn 16-bit, hãy đọc tiếp bài độ sâu bit 16/24/32-bit trong âm thanh số: dải động và xử lý DSP.

Lỗi thường gặp khi thu INMP441 và cách khoanh vùng

Triệu chứngNguyên nhân có thểCách kiểm traCách khắc phục
Toàn số 0Sai chân SD, chưa cấp clock, L/R và cấu hình kênh không khớpKiểm tra SCK/WS bằng logic analyzer, đối chiếu GPIO trong codeSửa khai báo chân và chế độ kênh
Nghe rất nhỏĐộ nhạy -26 dBFS, quên dịch phải 8 bit, chưa áp gainXem đỉnh dBFS của đoạn ghi thửDịch đúng 8 bit, áp gain số có headroom
Vỡ tiếng khi nói toGain quá lớn gây clippingĐếm số mẫu chạm mức tối đaGiảm gain, giữ dự phòng 3-6 dB
Chỉ thu một kênh hoặc im một phíaL/R chọn kênh không khớp cấu hình slotĐổi cấu hình sang kênh còn lại để đối chứngĐồng bộ L/R phần cứng và slot phần mềm

Khi dữ liệu thu về có vẻ đúng nhịp mà tiếng vẫn giật hoặc mất mẫu, vấn đề thường nằm ở buffer và DMA chứ không còn ở micro; xem thêm bài buffer DMA I2S và lỗi âm thanh bị giật trên ESP32 để khoanh vùng tiếp.

Câu hỏi thường gặp

INMP441 cấp nguồn 5 V được không?

Không. Dải hoạt động theo datasheet là 1,8 đến 3,3 V, tối đa tuyệt đối 3,63 V. Hãy cấp 3,3 V từ bo ESP32.

Thu mono bằng một INMP441 thì nối L/R thế nào?

Nối L/R xuống GND, cấu hình ESP32 đọc kênh trái, slot 32-bit.

Vì sao phải dịch phải 8 bit dữ liệu INMP441?

Vì 24 bit dữ liệu thật nằm ở phần cao của slot 32-bit, 8 bit thấp là 0 đệm. Dịch phải 8 bit mới khôi phục đúng giá trị 24-bit có dấu.

Tăng gain số có làm bản ghi sạch hơn không?

Không. Gain số nâng cả tín hiệu và sàn nhiễu, SNR không đổi.

INMP441 thu sample rate 96 kHz được không?

Thực tế không phù hợp: với khung 32-bit stereo, BCLK cần 6,144 MHz, vượt dải SCK tối đa 3,2 MHz trong datasheet. Hãy dùng tối đa khoảng 48 kHz.

Bạn đang dựng hệ thu âm, loa thông minh hoặc thiết bị xử lý tiếng nói bằng ESP32? Tham khảo thêm module micro, DAC và ampli tương thích tại Cimo để đối chiếu điện áp và định dạng I2S trước khi lắp, tránh hỏng micro vì cấp sai nguồn.

#micro I2S INMP441 với ESP32
Chia sẻ bài viết
Facebook
Cimo
Cimo
Cimo - Mọi thứ bạn cần với mức giá tốt nhất

Bài viết liên quan

Tất cả danh mục
Flash Sale
Ưu đãi hôm nay
Đấu giá