前面我们分享了speex在pc上测试了回声消除, 一般我们还需要一个降噪的功能,speex也是有的。且其api设计的比较方便使用,通过简单的配置就可以使能降噪功能,我们这一篇就在原来的基础上添加降噪功能,来看下效果。
参考手册的6.1 Preprocessor预处理器这一章节,
通过接口speex_preprocess_ctl(preprocess_state, request, ptr);控制预处理器的行为,
其中preprocess_state是speex_preprocess_state_init初始化预处理器的返回值,request是配置选项,见6.1.1 Preprocessor options, ptr是对应的参数
比如使能降噪就可以配置SPEEX_PREPROCESS_SET_DENOISE选项的值为1
注意上文档中有错误,文档中写的是值2表示off,实际应该是值0表示off,见代码或者代码中的说明
SPEEX_PREPROCESS_SET_NOISE_SUPPRESS 还可以设置噪声的最大衰减,默认值是
#define NOISE_SUPPRESS_DEFAULT -15
要使能降噪只需要在上一篇的基础上,在speex_preprocess_state_init后添加以下代码
int ctl_i;
float ctl_f;
ctl_i=1;
speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_DENOISE, &ctl_i); /* 打开降噪 ctl_i=1打开 2关闭*/
ctl_i=-30;
speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_NOISE_SUPPRESS, &ctl_i);
降噪是在回声消除之后,speex_preprocess_run中再进行的。
分别配置使能和不使能降噪,然后测试分别生成out3.wav,out33.wav,对比如下,
可以看到对于白噪声这种效果是很好的,消除后基本变为了一条干净的直线。
我们再来对比下SPEEX_PREPROCESS_SET_NOISE_SUPPRESS的影响,我们将SPEEX_PREPROCESS_SET_NOISE_SUPPRESS改为-5
生成out5.wav, SPEEX_PREPROCESS_SET_NOISE_SUPPRESS改为-30生成out30.wav
可以明显的看到30时降噪力度更大
以上分享了speex的降噪处理的效果,先体验一下,后面移植到具体的平台再去看如何调优。Speex的api设计的很好,使用起来比较方便,值得借鉴。