音频模块
Supported ICs: [RTL8735C]
概述
audio_module 提供 AP 侧音频采集与播放功能,通过内建音频硬件支持模拟麦克风 (AMIC) 与数字麦克风 (DMIC) 输入,并经由 DAC 驱动扬声器或耳机输出。
在多媒体框架中,音频模块可作为 source(采集)将音频数据送入上游处理单元(如 AAC 编码器),亦可作为 sink(播放)接收来自网络或本地播放的解码音频。
[Audio Source] --> [audio_module] --> SISO --> [aac_module] --> ...
(capture) (DMA/ALC)
... --> [aad_module] --> SISO --> [audio_module] --> [Speaker/Headphone]
(playback)
audio_params_t audio_params;
mm_module_ctrl(audio_ctx, CMD_AUDIO_GET_PARAMS, (int)&audio_params);
audio_params.sample_rate = ASR_16KHZ;
audio_params.channel = 1;
audio_params.use_mic_type = USE_AUDIO_AMIC;
audio_params.mic_gain = MIC_20DB;
audio_params.avsync_en = 1;
mm_module_ctrl(audio_ctx, CMD_AUDIO_SET_PARAMS, (int)&audio_params);
mm_module_ctrl(audio_ctx, MM_CMD_SET_QUEUE_LEN, 6);
mm_module_ctrl(audio_ctx, MM_CMD_INIT_QUEUE_ITEMS, MMQI_FLAG_STATIC);
mm_module_ctrl(audio_ctx, CMD_AUDIO_APPLY, 0);
sample_rate
选择音频采样率。
常量 |
数值 |
说明 |
|---|---|---|
|
0 |
8000 Hz,窄带语音 |
|
1 |
16000 Hz,宽带语音 |
|
2 |
32000 Hz |
|
3 |
44100 Hz,CD 质量 |
|
4 |
48000 Hz |
|
5 |
88200 Hz |
|
6 |
96000 Hz |
备注
ASP 算法 (AEC、NS、AGC) 仅支持 8 kHz 与 16 kHz。使用更高采样率时会绕过 ASP 处理。
word_length
常量 |
数值 |
说明 |
|---|---|---|
|
0 |
16 位 PCM (默认) |
|
1 |
24 位 PCM |
channel
声道数:1(单声道)或 2(立体声)。使用 USE_AUDIO_STEREO_DMIC 时,两个声道默认会合并为单一单声道串流。
use_mic_type
选择麦克风输入类型。
常量 |
数值 |
说明 |
|---|---|---|
|
0 |
模拟麦克风 |
|
1 |
左数字麦克风 |
|
2 |
右数字麦克风 |
|
3 |
立体声数字麦克风 |
mic_gain
模拟麦克风输入增益(仅在 use_mic_type = USE_AUDIO_AMIC 时有效)。
常量 |
数值 |
说明 |
|---|---|---|
|
0 |
0 dB 增益 |
|
1 |
20 dB 增益 |
|
2 |
30 dB 增益 |
|
3 |
40 dB 增益 (默认) |
dmic_l_gain / dmic_r_gain
数字麦克风增强增益(仅在使用 DMIC 时有效)。左右声道可独立设置。
常量 |
数值 |
说明 |
|---|---|---|
|
0 |
0 dB 增益 (默认) |
|
1 |
12 dB 增益 |
|
2 |
24 dB 增益 |
|
3 |
36 dB 增益 |
ADC_gain
ADC 数字音量控制输入(模拟转数字)增益。范围:-17.625 dB (0x00) ~ 30 dB (0x7F)。默认值:0x66(约 20 dB)。
可在运行时通过 CMD_AUDIO_SET_ADC_GAIN 修改。
DAC_gain
DAC 数字音量控制输出(数字转模拟)增益。范围:-65.625 dB (0x00) ~ 0 dB (0xAF)。默认值:0xAF (0 dB)。
可在运行时通过 CMD_AUDIO_SET_DAC_GAIN 修改。
备注
应优先配置数字增益。仅在数字增益不足以满足需求时,才使用模拟增益 (mic_gain)。过大的模拟增益会引入明显的噪声。
mix_mode
设为 1 时,模块会将最多 4 个 PCM 输入串流混音为单一输出。这可实现多串流混音(例如本地播放 + 网络音频)。默认值:0(单一输入)。
hpf_set
高通滤波器截止频率索引 (0–7)。截止频率约为:
fc ≈ 5e-3 / (hpf_fc + 1) × fs
默认值:0(HPF 关闭)。用于滤除直流偏移与低频噪声。
enable_record
设为 1 以启用音频录制数据路径。默认值:0。
avsync_en
设为 1 以启用硬件对齐的时间戳,用于音视频同步。在 MIMO 管线(MP4 录制、RTSP 串流)中同时使用音频与视频时需要启用此功能。
音频模块配置时机
请在 CMD_AUDIO_APPLY 之前配置 audio_params_t。应用程序启动后,仅使用音频控制路径可安全处理的命令进行运行时修改。
若需要在串流运行中修改采样率、麦克风类型、声道数或 HPF 设置,请更新 audio_params_t 并调用 CMD_AUDIO_SET_RESET 重新初始化音频编解码器:
audio_params.sample_rate = ASR_48KHZ;
mm_module_ctrl(audio_ctx, CMD_AUDIO_SET_PARAMS, (int)&audio_params);
mm_module_ctrl(audio_ctx, CMD_AUDIO_SET_RESET, 0); // 重新初始化
mm_module_ctrl(audio_ctx, CMD_AUDIO_SET_TRX, 1); // 重新启动 TX+RX
客户常见需求速查
需求 |
支持时机 |
建议做法 |
|---|---|---|
修改采样率 |
仅 init-time |
在 |
修改麦克风类型 |
仅 init-time |
在 |
调整麦克风音量 |
支持 runtime 修改 |
使用 |
调整扬声器音量 |
支持 runtime 修改 |
使用 |
静音 / 取消静音麦克风 |
支持 runtime 操作 |
使用 |
静音 / 取消静音扬声器 |
支持 runtime 操作 |
使用 |
启动 / 停止采集 |
支持 runtime 操作 |
使用 |
启动 / 停止播放 |
支持 runtime 操作 |
使用 |
启用 / 禁用 AEC |
支持 runtime 操作 |
使用 |
修改 AEC 强度 |
支持 runtime 修改 |
使用 |
启用 / 禁用 NS |
支持 runtime 操作 |
使用 |
启用 / 禁用 AGC |
支持 runtime 操作 |
使用 |
更新 EQ 系数 |
支持 runtime 修改 |
更新 |
修改 HPF 截止频率 |
仅 init-time |
在 |
CMD_AUDIO_* 参数速查表
以下三张表按配置时机列出所有音频相关参数,以及在 AP 应用代码中使用的对应 command。
仅 Init-time — 在 CMD_AUDIO_APPLY 之前于 audio_params_t 中设置。运行时修改需要调用 CMD_AUDIO_SET_RESET。
参数 |
|
说明 |
|---|---|---|
采样率 |
|
|
字长 |
|
|
声道数 |
|
1(单声道)或 2(立体声) |
麦克风类型 |
|
|
AMIC 模拟增益 |
|
|
DMIC 左增强 |
|
|
DMIC 右增强 |
|
与左 DMIC 相同选项 |
HPF 截止 |
|
0–7。fc ≈ 5e-3 / (hpf_fc + 1) × fs |
混音模式 |
|
0 = 单一输入,1 = 最多 4 个输入混音 |
录制路径 |
|
0 = 禁用,1 = 启用 |
音视频同步 |
|
0 = 禁用,1 = 启用(用于 MP4 / RTSP) |
麦克风 EQ(5 组) |
|
每组双二阶滤波器的启用开关与系数(请参阅 EQ 设置) |
扬声器 EQ(5 组) |
|
每组双二阶滤波器的启用开关与系数(请参阅 EQ 设置) |
Init + Runtime — 可在 CMD_AUDIO_APPLY 前于 audio_params_t 中设置初始值,并在串流启动后使用对应命令更新。
Init 字段 |
运行时 CMD |
API 函数 |
说明 |
|---|---|---|---|
|
|
|
ADC 数字音量(−17.625 至 30 dB) |
|
|
|
DAC 数字音量(−65.625 至 0 dB) |
RX ASP 参数 |
|
— |
设置 RX ASP 配置(所有 AEC/AGC/NS 设置) |
TX ASP 参数 |
|
— |
设置 TX ASP 配置(所有 AGC/NS 设置) |
麦克风 EQ |
|
|
从当前的 |
扬声器 EQ |
|
|
从当前的 |
仅 Runtime — 仅在 CMD_AUDIO_APPLY 之后可用。这些在 audio_params_t 中没有对应的初始化设置。
CMD |
参数 / 用法 |
说明 |
|---|---|---|
|
0 = 静音,1 = 取消静音 |
静音/取消静音麦克风输入(数据路径填零) |
|
0 = 静音,1 = 取消静音 |
静音/取消静音扬声器输出(数据路径填零) |
|
0 = 停止,1 = 启动 |
启动 / 停止 TX(播放),不影响 RX |
|
0 = 停止,1 = 启动 |
启动 / 停止 RX(采集),不影响 TX |
|
0 = 停止,1 = 启动 |
同时启动 / 停止 TX 与 RX |
|
0 = 禁用,1 = 启用 |
动态启用 / 禁用 AEC 处理 |
|
0 = 禁用,1–3 = 积极程度 |
动态启用 / 禁用 NS 处理 |
|
0 = 禁用,1–3 = 积极程度 |
动态启用 / 禁用 AGC 处理 |
|
0 = 禁用,1 = 启用 |
动态启用 / 禁用语音活动检测 |
|
1–50 |
设置 AEC 消除强度(越高越积极) |
|
0 = 禁用,1 = 启用 |
决定下次重置时是否启用 AEC |
|
0–3 |
决定下次重置时是否启用 NS |
|
0–3 |
决定下次重置时是否启用 AGC |
|
AEC 模式值 |
设置 AEC 模式(仅 NEWAEC) |
|
0–3 |
设置音频调试日志级别(0 = 无,1 = 全部,2 = 警告+错误,3 = 仅错误) |
|
0 |
使用当前的 |
|
ASR 常量 |
更新参数中的采样率(需 |
|
返回 int(通过指针) |
获取音频帧持续时间(毫秒) |
|
返回 uint32_t(通过指针) |
获取第一个数据帧的时间戳(用于音视频同步) |
|
0 |
强制取消初始化音频编解码器 |
Audio Codec
音频编码与解码由独立的 MMF 模块提供,详细说明请参阅 MMF 开发指南 :
aac_module— AAC 编码器(PCM 转 AAC 比特流)aad_module— AAC 解码器(AAC 比特流转 PCM)
比特率选择指南
采样率 |
比特率 |
使用案例 |
|---|---|---|
8 kHz |
16 kbps |
语音,窄带 |
16 kHz |
24–32 kbps |
语音,宽带 |
24 kHz |
48 kbps |
优质音频 |
48 kHz |
64–128 kbps |
高质量立体声 |
备注
较高比特率可提供更好的质量,但需要更多带宽。对于实时串流应用,请根据网络条件选择比特率。
音频优化
本节介绍音频的软件和硬件优化方案。
音频设置
增益设置
模拟麦克风增益设置
音频模拟输入增益可分为模拟增益和数字增益。
模拟麦克风增益
支持 0、20、30、40 dB 的增益优化。
用户可使用 audio_mic_analog_gain 或设置音频模块的参数 mic_gain 来设置。
ADC 增益 - ADC 音量
ADC 增益可用于设置输入 (模拟至数字) 增益。
范围为 -17.625dB (0x00) ~ 30dB (0x7F)。
用户可使用函数 audio_adc_digital_vol 或使用 CMD_AUDIO_SET_ADC_GAIN 来控制音频模块。
数字增益配置可用于控制音频输出增益。客户可通过 DAC 音量设置合理的增益值,以获得适当的音频输出音量。基本上将增益设置为 0dB (0xAF),输出振幅将符合开发板音频输出音量要求。请注意,当输出增益设置过大时会发生声音断裂。
如果模拟增益过大,会影响声音效果且噪声会变得明显。
建议: 客户应首先配置数字增益。如果需要增加音频信号增益但数字增益已达到最大范围,则再配置模拟增益。
数字麦克风增益设置
麦克风 |
说明 |
|---|---|
左麦克风增益 |
左 DMIC 增益支持 0、12、24、36 dB 增益优化。 使用 |
右麦克风增益 |
右 DMIC 增益支持 0、12、24、36 dB 增益优化。 使用 |
DAC 增益 - DAC 音量
DAC 增益可用于设置输出数字 (至模拟) 增益。
范围为 -65.625dB (0x00) ~ 0dB (0xAF)。
用户可使用函数 audio_dac_digital_vol 或使用 CMD_AUDIO_SET_DAC_GAIN 来控制音频模块。
HPF 设置
提供了一个高通滤波器让用户过滤低频噪声。这是用来过滤直流电源产生的噪声,建议设置默认值 0。如果用户想使用其他滤波器,请参考 EQ 设置。
以下是函数:
void audio_adc_l_hpf(audio_t *obj, BOOL en, audio_hpf_fc hpf_fc);
参数说明:
参数 |
说明 |
|---|---|
obj |
应用软件中定义的音频对象 |
en |
是否启用高通滤波器 |
hpf_fc |
设置截止频率,值为 0~7; fc ~= 5e-3 / (hpf_fc + 1) * fs |
EQ 设置
提供了五组双二阶滤波器,分别用于左数字麦克风 (模拟麦克风)、右数字麦克风和音频输出。
一组双二阶滤波器可通过寄存器设置切换为高通、低通、带通、陷波峰值、低架和高架滤波器。
以下是使用 EQ 的提示:
选择双二阶滤波器
用户可先使用以下网站配置偏好的滤波器类型、采样率、截止频率、Q 值和增益:
https://www.earlevel.com/main/2021/09/02/biquad-calculator-v3/
获取寄存器值
用户可使用 AmebaPro3_EQ_tool.exe 生成寄存器设置。例如,如果选择截止频率 200Hz 和 Q 值 0.707 的高通滤波器,用户可以输入设置并获取此设置的寄存器值 (0x1e45618, 0x1c000000, 0x2000000, 0x3c72d61, 0x1e35d500)。
设置寄存器值
获取寄存器值后,用户可使用以下函数应用滤波器设置:
void audio_input_l_eq(audio_t *obj, audio_eq eq, BOOL en, u32 h0, u32 b0, u32 b1, u32 a0, u32 a1);
void audio_input_r_eq(audio_t *obj, audio_eq eq, BOOL en, u32 h0, u32 b0, u32 b1, u32 a0, u32 a1);
void audio_output_l_eq(audio_t *obj, audio_eq eq, BOOL en, u32 h0, u32 b0, u32 b1, u32 a0, u32 a1);
参数说明:
参数 |
说明 |
|---|---|
obj |
应用软件中定义的音频对象 |
eq |
选择 EQ 编号,可为 0~4 |
en |
是否启用 EQ 滤波器 |
h0, b0, b1, a0, a1 |
从 AmebaPro3_EQ_tool.exe 获取的寄存器值 |
使用 MMF 设置时,用户也可以在 audio_params_t 中设置 EQ 参数。
其他设置
命令 |
说明 |
|---|---|
CMD_AUDIO_SET_RESET |
重新初始化音频设置以及 ASP 算法。 修改设置后需重置音频 |
CMD_AUDIO_SET_SAMPLERATE |
设置采样率。重置后才能应用新设置 |
CMD_AUDIO_SET_TRX |
停止/启动 TX 和 RX 而不重新初始化 |
CMD_AUDIO_SET_MIC_ENABLE |
静音/取消静音麦克风输入 (设为 0) |
CMD_AUDIO_SET_SPK_ENABLE |
静音/取消静音扬声器输出 (设为 0) |
备注
如果使用音频编解码器,请确保采样率与音频编解码器使用的采样率相符。
音频 ASP 算法
下表显示一些常见的音频问题及其原因,以及使用 ASP 算法的调整方式。
情况 |
算法 |
案例 |
|---|---|---|
失真 |
AGC |
|
音量过低 |
AGC |
|
回声或啸叫 |
AEC |
|
间歇性语音 |
AEC, NS |
|
噪声本底 |
NS |
|
机械声 |
网络、设备 |
|
备注
音频信号处理 (ASP) 基于数字音频信号。如果音频信号已经失真,ASP 无法保证获得预期的结果。
启用 ASP 算法
要使用 ASP 算法,用户需要在配置中启用 ASP 库。
在 module_audio.h 中启用 ENABLE_ASP,并使用 3A (AGC: 自动增益控制;ANS: 自适应噪声抑制;AEC: 声学回声消除) 算法以获得更好的音频效果。
备注
参数、采样率和麦克风增益,以及 NS、AEC、AGC 和其他算法的初始化将在 CMD_AUDIO_APPLY 和 CMD_AUDIO_SET_RESET 时设置。
要启用 ASP 功能,用户可以使用 ASP.h 中的以下参数:
// =================== 启用 ASP 算法 (ASP.h) ================
typedef struct CTNS_cfg_s {
int16_t NS_EN;
int NSLevel;
int16_t HPFEnable;
int16_t QuickConvergenceEnable;
int16_t Reserve1;
} CTNS_cfg_t;
typedef struct CTAGC_cfg_s {
int16_t AGC_EN;
CT_AGC_MODE AGCMode;
int16_t ReferenceLvl;
int16_t RatioFormat; // Ratio format: 0 => integer, range 1~50, 1 => 8.8 fix point, range 26~50*256 (mapping 26/256~50)
int16_t AttackTime;
int16_t ReleaseTime;
int16_t Ratio[3];
int16_t Threshold[3]; // Threshold1, Threshold2, NoiseGateLvl
int16_t KneeWidth;
int16_t NoiseFloorAdaptEnable;
int16_t RMSDetectorEnable;
int16_t MaxGainLimit;
} CTAGC_cfg_t;
typedef struct CTAEC_cfg_s {
int16_t AEC_EN;
int16_t EchoTailLen;
int16_t CNGEnable;
int16_t PPLevel;
int16_t DTControl;
int16_t ConvergenceTime;
int16_t Reserve1;
} CTAEC_cfg_t;
typedef struct VQE_SND_STATE_s {
int16_t DoA; // in degrees
int16_t ERLE; // in dB
int16_t SinLvldB; // in dBFs
int16_t SoutLvldB; // in dBFs after AGC (if AGC is enabled)
int16_t DTState; // 0 = single talk or 1 = double talk
int16_t HCDetectState; // 1 = detected, 0 = not detected
uint8_t AECRun;
uint8_t AGCRun;
uint8_t NSRun;
uint8_t BFRun;
uint8_t Reserve1;
uint8_t Reserve2;
uint8_t Reserve3;
uint8_t Reserve4;
} VQE_SND_STATE_t;
typedef struct VQE_RCV_STATE_s {
int16_t RinLvldB;
int16_t RoutLvldB;
int16_t HCDetectState; // 1 = detected, 0 = not detected
uint8_t AGCRun;
uint8_t NSRun;
uint8_t Reserve1;
uint8_t Reserve2;
uint8_t Reserve3;
uint8_t Reserve4;
} VQE_RCV_STATE_t;
参数详解
CTAEC_cfg_t (AEC 配置)
参数 |
说明 |
|---|---|
AEC_EN |
在 AEC 过程中启用 AEC 模块 |
EchoTailLen |
回声消除过程所依赖的缓冲区长度;设置越高 CPU 使用率越高 建议 16KHz 使用 64,8KHz 使用 128。支持 32/64/128 |
CNGEnable |
启用舒适噪声生成,设置 0 或 1 |
PPLevel |
AEC 的细部调整值;越高阶回声消除越积极 (高阶也可能消除 更多本地端信号)。支持 1~50 |
DTControl |
AEC 的粗略调整值,支持 1 (允许一些低残余)、2 (可能衰减 最多 6dB 本地端)、3 (可能衰减最多 9dB 本地端) |
ConvergenceTime |
AEC 初始化收敛时间 (毫秒),支持 100~1000 |
CTAGC_cfg_t (AGC 配置)
参数 |
说明 |
|---|---|
AGC_EN |
在 AGC 过程中启用 AGC 模块 |
AGCMode |
设置 AGC 模式;值为 0 (CT_ALC)、1 (CT_LIMITER) |
ReferenceLvl |
输出目标参考 level (dBFS),支持 0,1,…,30 (0,-1,…,-30dBFs) |
RatioFormat |
调整比率的设置格式,0 => 整数 (范围 1~50), 1 => 8.8 定点 (范围 26~50*256) |
AttackTime |
信号振幅压缩变化的转换时间,支持 1~500 |
ReleaseTime |
信号振幅提升变化的转换时间,支持 1~500 |
Ratio[3] |
支持三个比率用于调整 AGC 增益曲线 |
Threshold[3] |
支持三个阈值用于调整 AGC 增益曲线;第一和第二项指 AGC_Threshold1 和 AGC_Threshold2,支持 0~81; 最后一项指 AGC_NoiseGateLvl,支持 50~90 |
KneeWidth |
调整 AGC 增益曲线的拐点宽度,支持 0~10 |
NoiseFloorAdaptEnable |
是否在 AGC 上使用噪声检测;启用此配置时 AGC 将忽略 一些背景噪声,设置 0 或 1 |
RMSDetectorEnable |
设为 0 用于峰值检测,设为 1 用于 RMS 检测 |
MaxGainLimit |
AGC 将应用的最大增益 (dB),支持 6,12,18,24,30 |
CTNS_cfg_t (NS 配置)
参数 |
说明 |
|---|---|
NS_EN |
在 NS 过程中启用 NS 模块 |
NSLevel |
设置 NS 过程的积极程度 (dB,越高越积极),支持 3~35 |
HPFEnable |
是否在 NS 之前启用 HPF,设置 0 或 1 |
QuickConvergenceEnable |
设置 NS 收敛速度,1 为立即抑制 (快速),0 为平滑抑制 |
ASP 算法使用
以下是 ASP 算法的配置:
配置 |
说明 |
|---|---|
支持采样率 |
8K 和 16K 音频 |
默认设置 |
module_audio.c 中的
|
获取 RX ASP 参数 |
使用 |
获取 TX ASP 参数 |
使用 |
设置 RX ASP 参数 |
使用 |
设置 TX ASP 参数 |
使用 |
启用 AGC (RX/TX) |
将 |
启用 NS (RX/TX) |
将 |
启用 AEC (RX) |
将 |
AEC 设置
AEC 算法包含三个部分:延迟调整策略、线性回声估计和非线性回声抑制。
命令 |
说明 |
|---|---|
CMD_AUDIO_RUN_AEC |
动态切换 AEC_process() 的使用 |
CMD_AUDIO_SET_AEC_ENABLE |
决定在音频重置期间是否启用 AEC_init() |
CMD_AUDIO_SET_AEC_LEVEL |
可设置消除强度 |
NS 设置
NS 算法旨在减少噪声或环境声音,因此建议在其他 ASP 算法之前使用。
命令 |
说明 |
|---|---|
CMD_AUDIO_SET_NS_ENABLE |
决定在音频重置期间是否启用 NSx_init() |
CMD_AUDIO_RUN_NS |
动态切换 NSx_process() 的使用 |
AGC 设置
AGC 算法用于平衡串流音频的音量。
命令 |
说明 |
|---|---|
CMD_AUDIO_SET_AGC_ENABLE |
决定在音频重置期间是否启用 AGC_init() |
CMD_AUDIO_RUN_AGC |
动态切换 AGC_process() 的使用 |
关于媒体示例的使用方式,请参考 媒体示例 。