Audio ADC

概述

Audio ADC 进行麦克风模拟信号到数字信号的转换,以及数字信号的处理,最终输出高信噪比的低速高比特数字信号。 Audio ADC 主要包含以下 3 个部分:

  • AMIC:Analog Microphone

  • SDM-ADC:Sigma Delta Modulator Analog to Digital Converter

  • RX-DFE:Receive Digital Front End

Audio ADC 的框架如下图所示。

../../_images/Audio_ADC_framework.png

Audio ADC framework

备注

框架图只画出了部分通道,实际总共有 3 个 MIC bias 开关、 3 个 ADC(AMIC)通道、4 个 PDM(DMIC)通道和 8 个 RX-DFE 通道。

AMIC

AMIC 是 Audio ADC 的模拟部分,接收来自麦克风的模拟信号。主要包含 MIC 信号处理,MIC bias 开关和电压控制,PGA(Programmable Gain Amplifier)控制。 AMIC 模块支持如下特性:

  • 支持 3 路模拟 MIC 输入,每一路 MIC 的输出都可以连接到任意一路 RX-DFE 通道。

  • 支持 3 路 MIC bias,每一路 MIC bias 的电压可以配置,一路 MIC bias 既可以控制一路 MIC 开关,也可以同时控制多路 MIC 的开关。

  • PGA 模块控制模拟增益,支持的范围为 -6 dB ~ 12 dB。

SDM-ADC

SDM-ADC 模块将模拟 MIC 信号转换成 4 比特的高采样率数字信号

RX-DFE

RX-DFE 概述

RX-DFE 是 Audio ADC 的数字部分,接收来自 SDM-ADC 模块或 PDM 模块输出的高速低比特数字信号,进行降采样、数字滤波和增益控制等处理,最终输出高信噪比的低速高比特数字信号。

RX-DFE 输入信号包括:

  • 4 比特的 SDM-ADC 数字信号:模拟 MIC 信号经过 SDM(Sigma Delta Modulator)ADC 转换得到。

  • 1 比特的 PDM(Pulse Density Modulation,脉冲密度调制)数字信号。如果使用 PDM 输入可以参看 PDM 模块文档。

RX-DFE 输出为固定 24 bits 数字信号。

RX-DFE 与其它模块的连接关系如下图所示。

../../_images/Audio_ADC_RXDFE_connection.png

Audio RX-DFE 与其它模块连接示意图

RX-DFE 功能特性

  • SDM 模式下,输入数字信号位宽为 4 比特,采样率为 7.68 MHz / 8 MHz。

  • PDM 模式下,输入数字信号位宽为 1 比特,采样率为时钟的整数倍分频(如 1/2/4/8/0.96/1.92/3.072/3.84/7.68 MHz)。

  • 输出数字信号位宽为 24 bits。

  • 支持多种输出采样率,典型的输出信号采样率为 8 KHz、16 KHz、32 KHz 和 48 KHz 等。

  • 支持对输出数字音频信号的功率控制,调整精度为 0.1875 dB,范围为 -95.8125 dB ~ +95.8125 dB。

  • 支持两级高通滤波器(HPF)。

  • 支持多种同步启动控制方案。

  • 支持 15.36 MHz / 16 MHz / 32 MHz 等多种时钟模式。

  • 支持 PPM calibration。

  • 支持 8 个 RX-DFE 通道。

  • 支持 ADA-dump 功能和 polling 两种 debug 方式。

RX-DFE 架构

RX-DFE 主要由两级 SINC 抽取滤波器、PPM 滤波器、半带抽取滤波器(HBF)、高通滤波器(HPF)、幅度控制器等组成,如下图所示。

../../_images/Audio_ADC_RXDFE_structure.png

RX-DFE 结构图

备注

SINC 抽取滤波器和 HBF 滤波器用于降采样,PPM 滤波器用于频偏校准,HPF 滤波器用于滤除低频噪声,幅度控制器用于控制信号增益。

RX-DFE 分成两级,第一级由 SINC 滤波器和 HPF 滤波器组成,第一级将数据进行降采样之后输出给第二级时,也会同时输出给 ANC 模块用于降噪。

RX-DFE 第二级由 PPM 滤波器、SINC 滤波器、HBF 滤波器、HPF 滤波器、幅度控制器组成。第二级输入可以来自第一级的输出,也可以来自 I2S 或者 dbg_bus,第二级输入默认来自第一级输出。

RX-DFE 不仅可以用来接收和处理来自 MIC 的数据,也可以接收和处理 I2S 数据,或者用来 dump 一些 debug 点的数据(详细可查看 Audio Dump 模块介绍)。

RX-DFE 有 3 种启动方式:

  • Self trigger:自启动方式,在 RX-DFE 配置完成的同时也已启动。

  • Timer trigger:timer 触发启动方式,是一种硬件自动触发的启动方式,即在 audio timer 计数值达到目标计数值时,硬件会同时触发多个 audio 模块的启动,可以实现多个 RX-DFE 通道或者 RX-DFE 和别的 Audio 模块同时启动。

  • Software trigger:软件触发启动方式,是一种软件触发的启动方式,就是将 audio 模块的启动开关放到同一个寄存器里,通过操作这个寄存器实现多个模块同时启动。

接口使用说明

  1. 初始化 Audio ADC:wq_audio_adc_init()

  2. 配置并打开 MIC:wq_audio_adc_analog_start()

  • 在配置 MIC 时,推荐多个 MIC 同时进行配置,MIC 的参数配置采用 bitmap 的方式,可以一次性将所有 MIC 的配置传入。

  • MIB bias 的配置和硬件设计有关,请根据实际的硬件进行配置。

  • 打开 MIC 需要花费大约 50 ms 时间,所以推荐注册 MIC 启动完成回调来确认 MIC 已启动完成。

  1. 配置并打开 RX-DFE:wq_audio_adc_digital_start()

  • 如果使用 timer trigger,则需要申请一个 timer,并将 timer id 配置给 RX-DFE

  • 推荐将低时延模式关闭,低时延模式会通过直接 bypass HBF 来节约一点点硬件延时,但使用 HBF 可以能够保持更好的频率响应,所以低时延模式只在对时延要求非常高时考虑打开。

  • 推荐将 HPF 打开(bypass HPF 关闭),HPF 可以将 DC offset 和低频噪声滤除掉,如果需要保留低频信号时考虑将其关闭。

  1. 如果需要接收来自 RX-DFE 的数据,则需要申请 RX-FIFO,并将 RX-FIFO 连接到 RX-DFE 通道上。

  2. 申请 RX-FIFO 时将会配置好 DMA 通道,将接收 buffer 挂载到 DMA 上,RX-DFE 启动后,DMA 将会从 RX-FIFO 中读取数据并保存到 buffer 中。

  3. 关闭 RX-DFE:wq_audio_adc_digital_stop()

  4. 关闭 MIC:wq_audio_adc_analog_stop()

参考示例

examples/unity_test/acore/components/test_case/test_audio_adc_dac_loopback.c

API 介绍

union wq_audio_adc_en
#include <wq_audio_adc.h>

Audio ADC analog channel enable config.

Public Members

uint8_t adc0_en

Enable ADC analog channel 0.

uint8_t adc1_en

Enable ADC analog channel 1.

uint8_t adc2_en

Enable ADC analog channel 2.

uint8_t reserved

Reserved.

struct wq_audio_adc_en::[anonymous] _b
uint8_t bitmap

ADC analog channel enable bitmap.

struct wq_audio_adc_analog_cfg
#include <wq_audio_adc.h>

Audio ADC analog channel config.

Public Members

wq_audio_adc_en_u adc_en

ADC analog channel enable config.

wq_mic_adc_micbias_u micbias

ADC analog channel micbias config.

wq_mic_adc_micbias_voltage_u micbias_voltage

ADC analog channel micbias voltage config.

struct wq_audio_adc_config
#include <wq_audio_adc.h>

Audio ADC digital channel config.

Public Members

wq_rx_dfe_config_t dfe

ADC digital channel (RX-DFE) config.

WQ_AUDIO_TIMER_ID timer_id

ADC digital channel starting trigger timer ID.

Typedefs

typedef enum _WQ_AUDIO_ADC_DIG_CHN WQ_AUDIO_ADC_DIG_CHN

Audio ADC digital channel.

typedef enum _WQ_AUDIO_ADC_PORT WQ_AUDIO_ADC_PORT

Audio ADC analog port.

typedef enum _WQ_AUDIO_ADC_SAMPLING_RATE WQ_AUDIO_ADC_SAMPLING_RATE

Audio ADC output data sample rate.

typedef union wq_audio_adc_en wq_audio_adc_en_u

Audio ADC analog channel enable config.

typedef struct wq_audio_adc_analog_cfg wq_audio_adc_analog_cfg_t

Audio ADC analog channel config.

typedef struct wq_audio_adc_config wq_audio_adc_config_t

Audio ADC digital channel config.

typedef void (*wq_audio_adc_timer_done_callback)(void)

Audio ADC analog port starting done callback.

Functions

WQ_RET wq_audio_adc_init(void)

Initialize audio ADC. This interface should be called before all ADC operations.

返回:

WQ_RET_OK - success, other - failed.

WQ_RET wq_audio_adc_deinit(void)

Deinitialize audio ADC.

返回:

WQ_RET_OK - success, other - failed.

WQ_RET wq_audio_adc_digital_open(WQ_AUDIO_ADC_PORT port, WQ_AUDIO_ADC_DIG_CHN chn, const wq_audio_adc_config_t *cfg)

Start audio ADC digital channel.

参数:
  • port -- Analog port connected to digital channel.

  • chn -- Digital channel.

  • cfg -- Digital channel config.

返回:

WQ_RET_OK - success, other - failed.

WQ_RET wq_audio_adc_digital_close(WQ_AUDIO_ADC_PORT port, WQ_AUDIO_ADC_DIG_CHN chn)

Stop audio ADC digital channel.

参数:
  • port -- Analog port connected to digital channel.

  • chn -- Digital channel.

返回:

WQ_RET_OK - success, other - failed.

void wq_audio_adc_data_start(WQ_AUDIO_ADC_DIG_CHN chn)

Start audio ADC digital channel to receive data.

参数:

chn -- Digital channel.

void wq_audio_adc_set_ppm(int32_t ppm)

Set frequency deviation PPM (parts per million).

参数:

ppm -- PPM value, unit is 0.01 ppm, that means the actually PPM equal to (ppm * 0.01).

WQ_RET wq_audio_adc_analog_open(const wq_audio_adc_analog_cfg_t *param, wq_audio_adc_timer_done_callback cb)

Start audio ADC analog port. It is recommended to config multiple analog MIC at the same time.

参数:
  • param -- Analog port config, include port enable, micbias id config and micbias voltage config.

  • cb -- Start complete callback.

返回:

WQ_RET_OK - success, other - failed.

WQ_RET wq_audio_adc_analog_close(const wq_audio_adc_analog_cfg_t *param)

Stop audio ADC analog port.

参数:

param -- Analog port config, include port enable, micbias id config and micbias voltage config.

返回:

WQ_RET_OK - success, other - failed.

WQ_RET wq_audio_adc_digital_gain_set(WQ_AUDIO_ADC_DIG_CHN chn, int16_t gain)

Set audio ADC digital gain.

备注

The target gain is the step code, one step corresponds to 0.1875 dB, so the dB value of gain is gain * 0.1875 dB. The target gain range is -511 ~ 511.

参数:
  • chn -- Digital channel.

  • gain -- Target digital gain step code.

返回:

WQ_RET_OK - success, other - failed.

WQ_RET wq_audio_adc_analog_gain_set(WQ_AUDIO_ADC_PORT port, WQ_MIC_ADC_GAIN gain)

Set ADC analog gain.

参数:
  • port -- Analog MIC port

  • gain -- Target analog gain

返回:

WQ_RET_OK for success else error.

WQ_RET wq_audio_adc_ana_gain_init(WQ_MIC_ADC_GAIN ana_gain)

Set ADC analog gain.

参数:

ana_gain -- Target analog gain

返回:

WQ_RET_OK for success else error.

WQ_RET wq_audio_adc_analog_gain_get(WQ_AUDIO_ADC_PORT port, int8_t *gain)

Get ADC analog gain.

参数:
  • port -- Analog MIC port

  • gain -- Analog gain pointer

返回:

WQ_RET_OK for success else error.

WQ_RET wq_audio_adc_sample_rate_set(WQ_AUDIO_ADC_DIG_CHN chn, uint32_t out_fs, bool less_delay_mode_en)

Set audio ADC sample rate.

备注

Please call this interface after ADC open, and before RX-FIFO link. If set the sample rate after ADC started, some dirty data should be discarded, it is recommended to discard no less than 10 sample points.

参数:
  • chn -- Digital channel

  • out_fs -- Output sample rate

  • less_delay_mode_en -- Less delay mode enable. We will use half band filter as much as possible by default, because half band filter has better frequency response. But half band filter will generate more delay, if need to reduce hardware delay, less delay mode cab be enabled, and all half band filter would be bypassed.

返回:

WQ_RET_OK - success, other - failed.

void wq_audio_adc_ultra_sound_chn_select(WQ_AUDIO_ADC_DIG_CHN chn)

Select audio ADC digital channel of ultra sound loopback to adc.

参数:

chn -- Digital channel.