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


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

    一、框架

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

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

    什么时钟源精确度高?

    有源晶振。

  • 相关阅读:
    Git的基本使用(只是基本使用)
    GET与POST的比较
    GO开发:链表
    阿里云啊
    以太坊区块和交易存储
    以太坊私有链部署合约
    以太坊go-ethereum签名部分源码解析
    GO开发:接口
    区块链开发:以太坊网络
    Go开发[八]goroutine和channel
  • 原文地址:https://www.cnblogs.com/rockyching2009/p/14517614.html
Copyright © 2020-2023  润新知