麦克风阵列(2)驱动开发及调试

时间:2024-03-05 21:39:46

本文记录麦克风阵列开发涉及的驱动及音频领域的知识点。

一、框架

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提供的,根据常识判断,误差肯定存在且消除不了。

 

所以,解决方案就只能更改时钟源。

 

什么时钟源精确度高?

 

有源晶振。