簡介
在這個系列的上一篇文章中,我們介紹了ESP32 I2S音頻總線的相關知識,簡要了解了什么是I2S總線、它的通信格式,以及相關的底層API函數(shù)。沒有看過上篇文章的可以點擊文章進行回顧:
[ESP32 I2S音頻總線學習筆記(一):初識I2S通信與配置基礎]
這篇文章將介紹一個小案例——ESP32驅動INMP441讀取音頻數(shù)據(jù),它是關于如何使用I2S讀取數(shù)據(jù)的一個應用,主要是將ESP32讀取到的音頻數(shù)據(jù)發(fā)送到串口上并實時顯示波形,這個我們可以通過串口繪圖儀來實現(xiàn)。在這之前先來看一下INMP441這個模塊吧
INMP441全向麥克風模塊

NMP441是一款高性能、低功耗、數(shù)字輸出,帶底部端口的全向MEMS麥克風。該完整的INMP441解決方案由一個MEMS傳感器、信號調節(jié)模塊、數(shù)字混合濾波器、電源管理和行業(yè)標準的24位I2S接口組成。I2S接口允許INMP441直接連接到數(shù)字處理器,如DSP和微控制器,無需額外的音頻解碼器。NMP441具有高信噪比,是一種適用于近場應用的理想選擇。
產品特性:
具有高精度24位數(shù)據(jù)的數(shù)字I2S接口
高信噪比為61 dBA
高靈敏度-26 dBFS
從60 Hz到15 kHz的穩(wěn)定頻率響應
低功耗:低電流消耗1.4 mA
高PSR:-75 dBFS
功能框圖
INMP441模塊使用到的芯片內置ADC,用于將采集到的模擬信號轉換成數(shù)字信號,上面還有濾波器和硬件控制、電源相關的引腳。
引腳定義
| VDD | 輸入電源,1.8V至3.3V |
|---|---|
| GND | 電源地 |
| SCK | I2S接口的串行數(shù)據(jù)時鐘 |
| WS | 用于I2S接口的串行數(shù)據(jù)字選擇 |
| SD | I2S接口的串行數(shù)據(jù)輸出 |
| L/R | 左/右聲道選擇 |
其中L/R是 左/右聲道選擇。設置為低電平時,麥克風在I2S幀的左聲道輸出信號。設置為高電平時,麥克風在右聲道輸出信號。
安裝I2S驅動
上篇文章我們在介紹I2S底層API函數(shù)提到,在使用I2S通信時需要加載I2S驅動,不知道小伙伴們還記不記得。這個加載I2S驅動的函數(shù)就是:esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, int queue_size, void *i2s_queue),里面有4個參數(shù)需要配置,在上次都有提到每個參數(shù)的意義。 其中比較復雜的是i2s_config這個結構體變量,我們需要對結構體的每個參數(shù)進行配置,如下:
除了后面幾個整型變量,每個結構體成員其實是一個枚舉類型
I2S工作模式mode
音頻采樣率bits_per_sample
通道格式channel_format
通信傳輸格式communication_format
知道了每個參數(shù)的含義以及知道它可以配置哪些參數(shù),就可以調用i2s_driver_install這個函數(shù)了。 這里我們舉一個安裝I2S驅動的例子,就比較容易理解了。同時配置的時候,我們把它放在一個函數(shù)里面,起名為i2s_install( )。
配置I2S引腳
I2S通信最重要的三個信號是位時鐘BCK、字時鐘WS、數(shù)據(jù)引腳SD,因此我們需要對其引腳進行配置,設置I2S引腳的函數(shù)是esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin),第一個參數(shù)傳入I2S端口,填I2S_NUM_0或I2S_NUM_1, 第二個參數(shù)是結構體如下:
其中mck_io_num; bck_io_num,ws_io_num等都是整型變量,data_out_num如果我們沒有用到就傳入-1,在driver/i2s.h頭文件定義了
假設我們要配置的引腳位時鐘BCK、字時鐘WS、數(shù)據(jù)引腳SD分別是D13, D12, D14,同樣把要配置的參數(shù)寫入一個函數(shù)i2s_setpin()里面,配置I2S引腳示例如下:
安裝完I2S驅動和配置好I2S引腳后,我們只要在setup()函數(shù)里面調用這兩個函數(shù)就可以了。
讀取I2S數(shù)據(jù)
上面只是對I2S進行了一下初始化,要通過INMP441讀取i2s數(shù)據(jù),我們只需要調用esp_err_t i2s_read(i2s_port_t i2s_num, void *dest, size_t size, size_t *bytes_read, TickType_t ticks_to_wait);這個函數(shù)。因為前面在初始化I2S時的量化位數(shù)是16位,所以每個采樣點的數(shù)據(jù)大小為2字節(jié),我們將讀取到的數(shù)據(jù)放入一個緩存區(qū)數(shù)組sBuffer,將數(shù)組長度bufferLen定義為64,確保每次從I2S接口讀取時能獲得足夠的音頻數(shù)據(jù)。 如果讀取成功2s_read這個函數(shù)會返回一個ESP_OK,成功后就進入數(shù)據(jù)處理部分。這里我們將讀取到的音頻數(shù)據(jù)求均值然后可以用串口繪圖儀觀察它的數(shù)據(jù)波形,代碼如下:
完整代碼
接線圖
寫完代碼后就可以開始接線了,接線圖如下圖所示:供電這里接3.3V,L/R接地。
實驗效果
一開始接收到的是外界的聲音,波形是雜亂無章的。后面用嘴吹氣,波形會跟著吹氣變化,不吹氣波形是平緩不變的,后面大概吹了幾次,可以看到波形變化,如下圖:
總結
本篇文章介紹了通過ESP32的I2S通信實時讀取INMP441麥克風模塊的音頻數(shù)據(jù),并通過串口繪圖儀顯示音頻數(shù)據(jù)波形。后面我們還會介紹使用INMP441采集音頻并實時播放音頻,感興趣的可以先關注收藏一下!
審核編輯 黃宇
-
I2S
+關注
關注
1文章
78瀏覽量
43769 -
ESP32
+關注
關注
21文章
1049瀏覽量
20532 -
音頻總線
+關注
關注
0文章
3瀏覽量
224
發(fā)布評論請先 登錄
全面解析I2S、TDM、PCM音頻總線
請問ESP-WROOM-32 I2S音頻信號幅度讀取異常怎么解決?
如何從INMP441 I2S麥克風向ESP32輸入音頻?
音頻接口I2S實驗
基于FPGA和AD1836的I2S接口設計
i2s音頻總線學習
i2s和i2c的區(qū)別
I2S接口工作原理_I2S接口介紹
幾種常見的I2S數(shù)據(jù)格式
I2S、TDM、PCM音頻總線
基于I2S接口的Linux內核音頻技術

ESP32 I2S音頻總線學習筆記(二):I2S讀取INMP441音頻數(shù)據(jù)
評論