跳转至

增益调节(GAIN)


1、简介

CI14LP 芯片的音频增益链路分布在三个层面:

  • 录音模拟增益:MADC 麦克风升压级增益(madc_set_mic_gain,-2dB~24dB);
  • 录音数字增益:MADC 数字增益(madc_set_digital_gain,-64dB~63dB);
  • 放音增益:DCODEC DAC 模拟/数字/混音增益,以及 codec_manager 封装的统一音量接口(cm_set_codec_dac_gain)。

另外 MADC 内置 ALC(自动电平控制),可按目标电平自动调整录音增益,SDK 还提供 ALC 自动切换组件(components\alg\alc_auto_switch)根据噪声场景动态开关 ALC。


2、API

2.1 录音增益(MADC,ci14lp_madc.h)

函数名 描述
madc_set_mic_gain 设置麦克风升压级增益(-2dB~24dB,步进2dB)
madc_set_digital_gain 设置数字增益(-64dB~63dB,步进1dB)
madc_mic_bias_enable MIC 偏置电压使能
madc_mic_input_mode MIC 输入模式(单端/差分)
madc_set_alc_target_level ALC 目标电平
madc_set_alc_max_gain / madc_set_alc_min_gain ALC 增益上下限
madc_set_alc_hold_time / madc_set_alc_attack_time / madc_set_alc_decay_time ALC 保持/上升/衰减时间
madc_alc_enable ALC 使能
madc_alc_init ALC 参数结构体初始化
madc_set_noise_gate_threshold 噪声门限阈值

2.2 放音增益(DCODEC,ci14lp_dcodec.h)

函数名 描述
dcodec_dac_analog_gain DAC 模拟增益
dcodec_dac_digital_gain DAC 数字增益
dcodec_dac_mixer_gain DAC 混音增益
dcodec_adc_gain ADC 增益
dcodec_adc_mixer_gain ADC 混音增益

2.3 codec_manager 统一增益接口(codec_manager.h)

函数名 描述
cm_set_codec_dac_gain 设置 DAC(播放)增益,有效范围 1~100
cm_set_codec_adc_gain 设置 ADC(录音)增益
cm_set_codec_adc_digital_gain 设置 ADC 数字增益
cm_set_codec_alc 录音 ALC 使能控制

3、增益配置结构体

codec 注册时的增益初始配置(cm_codec_gain_config_t):

typedef struct
{
    uint32_t input_mode_l;    //!ADC 左声道输入模式选择(单端/差分)
    uint32_t input_mode_r;    //!ADC 右声道输入模式选择
    uint32_t mic_amp_l;       //!MIC 左声道增益设置(-2dB~24dB)
    uint32_t mic_amp_r;       //!MIC 右声道增益设置
    uint32_t dig_gain_l;      //!左声道数字增益 -64dB~63dB
    uint32_t dig_gain_r;      //!右声道数字增益 -64dB~63dB
} cm_codec_gain_config_t;

MADC ALC 配置结构体(madc_alc_config_t):

typedef struct
{
    madc_alc_level_t target_level;             //ALC目标电平(-9 ~ -22.5dB)
    madc_alc_hold_time_t hold_time;            //保持时间(2ms~65536ms)
    madc_alc_time_t decay_time;                //衰减时间(32ms~512ms)
    madc_alc_time_t attack_time;               //上升时间(32ms~512ms)
    functional_state_t noise_gate;             //噪声门控使能
    madc_noise_gate_threshold_t noise_gate_threshold;  //噪声门限(0~42dB)
    functional_state_t snr_en;                 //SNR优化器使能
    madc_alc_gain_t max_gain;                  //ALC最大增益(0~42.5dB)
    madc_alc_gain_t min_gain;                  //ALC最小增益(0~42.5dB)
    functional_state_t alc_en;                 //ALC使能
} madc_alc_config_t;

4、示例

以下代码通过 codec_manager 设置播放音量(内部调用底层 DAC 增益):

//音量范围1~100
cm_set_codec_dac_gain(PLAY_CODEC_ID, CM_CHA_LEFT, 50);

示例工程中播放音量调节的完整写法(projects\offline_asr_sample\src\system_msg_deal.c,将 1~7 档用户音量映射到 DAC 增益):

//vol为用户音量档位(1~7),映射到播放增益
audio_play_set_vol_gain(45*vol/VOLUME_MAX + 5);

以下代码直接配置 MADC 数字增益(一般用于采音调试):

#include "ci_madc.h"

//开启MADC时钟
scu_set_device_clock_en(HAL_MADC_BASE, ENABLE);
//设置左声道数字增益为10dB
madc_set_digital_gain(MADC_CHANNEL_LEFT, 10);
//设置麦克风升压级增益为16dB
madc_set_mic_gain(MADC_CHANNEL_LEFT, 16);

以下代码配置 ALC 自动切换组件(components\alg\alc_auto_switch\alc_auto_switch.h),根据稳态/非稳态噪声场景自动开关 ALC:

#include "alc_auto_switch.h"

alc_auto_switch_config_t alc_config;
alc_config.alc_auto_switch_ban_mode = NORMAL;         //正常模式,按门限控制
alc_config.thr_for_non_stationary_on = 10000;         //非稳态噪声上门限
alc_config.thr_for_non_stationary_off = 3000;         //非稳态噪声下门限
alc_config.thr_for_stationary_on = 7000;              //稳态噪声上门限
alc_config.thr_for_stationary_off = 1000;             //稳态噪声下门限
alc_config.alc_off_codec_adc_gain = 20;               //ALC关闭时PGA增益

void *hd = alc_auto_switch_create(&alc_config);       //创建模块
//每帧调用,返回0成功
switch_alc_state_automatic(hd, pcm, 320);

5、特别说明

  • ALC(自动电平控制)开启后增益会随输入电平自动变化,如需固定增益做录音比对,请先关闭 ALC;
  • MADC 的 SNR 优化器打开后数字增益范围限制在 -40dB~+61dB;
  • PA(功放)的操作需要在 DAC 关闭的情况下进行,不然会影响采音(参见 audio_play_hw_pa_da_ctl 接口);
  • 增益调整会直接影响 AVAD/SVAD 低功耗唤醒门限,调整录音增益后需同步评估低功耗唤醒灵敏度。

6、API 参考

本模块接口声明于:

  • driver\ci14lp_chip_driver\inc\ci14lp_madc.h
  • driver\ci14lp_chip_driver\inc\ci14lp_dcodec.h
  • components\codec_manager\codec_manager.h
  • components\alg\alc_auto_switch\alc_auto_switch.h