9.9. DNS神经网络降噪算法
概述
提供DNS神经网络降噪算法的配置和使用说明
9.9.1. 应用实例
普通MIC数据降噪配置
蓝牙通话降噪配置
进入 demo_DevKitBoard/include/app_config.h
,开启宏 CONFIG_DNS_ENC_ENABLE
。
9.9.1.1. 普通MIC数据降噪配置
union audio_req req = {0};
req.enc.channel_bit_map = BIT(CONFIG_AUDIO_ADC_CHANNEL_L);
req.enc.frame_size = sample_rate / 100 * 4 * channel; //收集够多少字节PCM数据就回调一次fwrite
req.enc.output_buf_len = req.enc.frame_size * 3; //底层缓冲buf至少设成3倍frame_size
req.enc.cmd = AUDIO_ENC_OPEN;
req.enc.channel = channel;
req.enc.volume = __this->gain;
req.enc.sample_rate = sample_rate;
req.enc.format = "pcm";
req.enc.sample_source = "mic";
if (sample_rate == 8000 || sample_rate == 16000)) {
req.enc.dns_enable = 1; //打开降噪功能
}
//配置DNS参数
struct aec_s_attr parm = {0};
parm.DNS_gain_floor = 0.05;
parm.DNS_over_drive = 1;
req.enc.aec_attr = &parm;
err = server_request(__this->enc_server, AUDIO_REQ_ENC, &req);
Note
- 关于普通MIC数据降噪配置的几个说明:
CONFIG_DNS_ENC_ENABLE必须打开
需要在配置MIC的时候参数把dns_enable置1
需要链接libdns.a和libjlsp.a库,工程需要添加
apps/common/jl_math/jl_fft.c
通过配置channel_bit_map的通道数量, 来控制选择单/双麦降噪算法(其他配置不变), 如配置
req.enc.channel_bit_map = BIT(CONFIG_AUDIO_ADC_CHANNEL_L);
则是单麦算法, 配置req.enc.channel_bit_map = BIT(CONFIG_AUDIO_ADC_CHANNEL_L) | BIT(CONFIG_AUDIO_ADC_CHANNEL_R);
则是双麦算法DNS参数配置可以通过传参数进行调节算法, 具体参数说明参考
include_lib/server/audio_dev.h
, 目前暂时支持配置DNS_gain_floor
与DNS_over_drive
9.9.1.2. 蓝牙通话降噪配置
#define AEC_EN BIT(0)
#define NLP_EN BIT(1)
#define ANS_EN BIT(2)
/*aec module enable bit define*/
#define AEC_MODE_ADVANCE (AEC_EN | NLP_EN | ANS_EN)
struct aec_s_attr aec_param = {0};
aec_param.EnableBit = AEC_MODE_ADVANCE;
req.enc.aec_attr = &aec_param;
req.enc.aec_enable = 1; //使能aec_enable
get_cfg_file_aec_config(&aec_param);
#if 0
aec_param.ANS_NoiseLevel = 2.2e3f; //初始噪声水平,用来加速降噪收敛,跟 mic 信号的信噪比有关。 Mic 信号信噪比高, 该值可以小一点, 反之则需要稍微大一点。default: 2.2e3f(0 ~ 32767)
#endif
aec_param.EnableBit |= BIT(5); //BIT(5)是DNS标志位
aec_param.AGC_echo_look_ahead = 100;
aec_param.AGC_echo_hold = 400;
aec_param.ES_Unconverge_OverDrive = aec_param.ES_MinSuppress;
if (req.enc.sample_rate == 16000) {
aec_param.wideband = 1;
aec_param.hw_delay_offset = 50;
} else {
aec_param.wideband = 0;
aec_param.hw_delay_offset = 75;
}
err = server_request(__this->enc_server, AUDIO_REQ_ENC, &req);
Note
- 关于蓝牙通话降噪配置的几个说明:
CONFIG_DNS_ENC_ENABLE和CONFIG_AEC_ENC_ENABLE必须打开
aec_param.EnableBit需要与上BIT(5)
req.enc.aec_enable需要置1
需要链接libaec.a、libdns.a和libjlsp.a库
app_main.c任务列表需要增加dns_encoder任务,否则会打开失败
aec_param的配置读取, 参数配置与说明参考 《回声消除算法》 章节
9.9.2. 常见问题
DNS神经网络降噪能使用多少采样率?
答: DNS目前只支持采样率8000 或 16000,且输入通道数目前支持1/2个通道, 但是输出通道都是1通道, 详情请看当前文档
普通MIC数据降噪配置
部分。