zoukankan      html  css  js  c++  java
  • 麦克风阵列(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提供的,根据常识判断,误差肯定存在且消除不了。

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

    什么时钟源精确度高?

    有源晶振。

  • 相关阅读:
    CSS浮动(float、clear)通俗讲解
    JAVA 类的加载
    数据库操作 delete和truncate的区别
    正则表达式 匹配相同数字
    Oracle EBS OM 取消订单
    Oracle EBS OM 取消订单行
    Oracle EBS OM 已存在的OM订单增加物料
    Oracle EBS OM 创建订单
    Oracle EBS INV 创建物料搬运单头
    Oracle EBS INV 创建物料搬运单
  • 原文地址:https://www.cnblogs.com/rockyching2009/p/14517614.html
Copyright © 2011-2022 走看看