增益调节(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.hdriver\ci14lp_chip_driver\inc\ci14lp_dcodec.hcomponents\codec_manager\codec_manager.hcomponents\alg\alc_auto_switch\alc_auto_switch.h