本文记录麦克风阵列开发涉及的驱动及音频领域的知识点。
一、框架
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提供的,根据常识判断,误差肯定存在且消除不了。
所以,解决方案就只能更改时钟源。
什么时钟源精确度高?
有源晶振。