本文記錄麥克風陣列開發涉及的驅動及音頻領域的知識點。
一、框架
1.系統框架如圖
2.各部分介紹
- MIC:采集外界音頻,送入ADC芯片(如ES7210)進行處理。MIC有數字MIC和模擬MIC。
- ADC芯片:對MIC送來的數據進行模->數轉換,並將數字化的音頻數據通過I2S接口送往應用處理器(AP,SoC)。
- SoC:一方面,ADC芯片有諸多配置,如采樣率、采樣位數、ADC增益,這部分功能通過I2C接口讀寫ADC芯片的寄存器完成。另一方面,SoC通過I2S接口(或其他音頻接口,如PCM等)接收音頻數據。最終目的,對音頻數據進行處理、分析,完成產品所需功能,如錄音、語音識別等。
二、開發內容
1.ADC芯片的I2C驅動
1.1 SoC側的I2C控制器驅動。這部分完成和ADC芯片的數據通路開發,在此基礎上才有后續的ADC配置等功能。關鍵點:I2C協議,設備地址。
1.2 ADC芯片的配置。需要找芯片廠商要datasheet和參考代碼。
2.I2S驅動
SoC側的I2S控制器驅動。
3.測試代碼及聯調
編寫測試代碼,讀取錄音數據。
硬件+軟件聯調。
4.錄音數據分析
分析利器:Cool Edit Pro
三、調試方法
完成上述開發,說明整個軟硬件通路已經基本沒問題。那么如何調試,進一步確定有沒有感官無法察覺的問題呢?
調試准備:
變頻音頻源:0~48KHz(正弦波)
定頻音頻源:1KHz
發現音頻源:https://onlinetonegenerator.com/frequency-sweep-generator.html
四、問題分析及解決
1.錄音音量小
調節ADC芯片的增益
2.丟幀
2.1 如何看是否丟幀?
Cool Edit-> 查看-> 光譜顯示窗,如下圖:
綠色標注的地方表明有丟幀。放大來看:
2.2 丟幀解決思路
a)從I2S控制器讀取數據有沒有問題?比如接收fifo是否溢出。
b)應用讀取數據有沒有問題?比如緩沖區設計不合理。
c)優先從a、b入手,確認沒問題再測量采樣時鍾、I2S時鍾等。
3.頻偏
3.1 如何看是否有頻偏?
使用固定頻率音頻源(如500Hz,1KHz等)進行錄音,用Matlab對錄音文件進行分析。如下圖:
1kHz的頻率應該x坐標是1000,現在是1004,相當於偏了4Hz。相應的500Hz偏了1.8Hz,2000Hz偏了7Hz。
3.2 頻偏解決思路
I2S接口有兩根時鍾線:
SCLK:Serial data bit clock
LRCLK:Serial data left and right channel frame clock
LRCLK作為聲道選擇信號,也稱幀時鍾。LRCLK的頻率等於聲音的采樣率。
發生頻偏,可能是LRCLK的頻率有誤差。
經過測量,16K采樣率下LRCLK的頻率為15.94,偏差0.375%,這樣:
500Hz就偏了:500Hz X 0.375% = 1.875Hz
1KHz就偏了:3.75Hz
數據和Matlab分析的偏差基本一致。
時鍾的偏差由何而來?
硬件上,作為時鍾源的MCLK是由SoC提供的,根據常識判斷,誤差肯定存在且消除不了。
所以,解決方案就只能更改時鍾源。
什么時鍾源精確度高?
有源晶振。