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数据降噪配置的几个说明:
  1. CONFIG_DNS_ENC_ENABLE必须打开

  2. 需要在配置MIC的时候参数把dns_enable置1

  3. 需要链接libdns.a和libjlsp.a库,工程需要添加 apps/common/jl_math/jl_fft.c

  4. 通过配置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); 则是双麦算法

  5. DNS参数配置可以通过传参数进行调节算法, 具体参数说明参考 include_lib/server/audio_dev.h , 目前暂时支持配置 DNS_gain_floorDNS_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

关于蓝牙通话降噪配置的几个说明:
  1. CONFIG_DNS_ENC_ENABLE和CONFIG_AEC_ENC_ENABLE必须打开

  2. aec_param.EnableBit需要与上BIT(5)

  3. req.enc.aec_enable需要置1

  4. 需要链接libaec.a、libdns.a和libjlsp.a库

  5. app_main.c任务列表需要增加dns_encoder任务,否则会打开失败

  6. aec_param的配置读取, 参数配置与说明参考 《回声消除算法》 章节

9.9.2. 常见问题

  • DNS神经网络降噪能使用多少采样率?

    答: DNS目前只支持采样率8000 或 16000,且输入通道数目前支持1/2个通道, 但是输出通道都是1通道, 详情请看当前文档 普通MIC数据降噪配置 部分。