原文转载于:http://www.cnblogs.com/mod109/p/5767867.html#top 非常感谢。
webrtc的音频处理模块分为降噪ns(nsx),回音消除aec(回声控制acem),音频增益agc,静音检测部分。另外webrtc已经封装好了一套音频处理模块APM,如果不是有特殊必要,使用者如果要用到回声消除等较为复杂的模块时,最好使用全部的音频处理模块,不要单独编译其中一部分以免浪费宝贵的时间。
但是音频降噪,增益功能较为简单,还能直接使用。这部分源码是我从webrtc中抠出来,单独放到VS2010工程下使用。其中包括重采样以及滤波,降噪功能。这部分是直接复用之前的博文单独使用webrtc降噪功能的代码,也就是说,其实这部分博文只是从之前降噪的基础上扣出了部分声音增益的代码而已。所以关于webrtc的介绍就不多说了,如果有兴趣可以参考之前的博文;
测试效果也极为不错,从一首8000采样率的歌曲可以看到,其增益前和增益后的波形如下:
OK,波形还算比较满意吧?不过实际效果如何,还需要听一下才知道。
其实增益使用起来也很简单,简单代码如下:
void WebRtcAgcTest(char *filename, char *outfilename,int fs)
{
FILE *infp = NULL;
FILE *outfp = NULL;
short *pData = NULL;
short *pOutData = NULL;
void *agcHandle = NULL;
do
{
WebRtcAgc_Create(&agcHandle);
int minLevel = 0;
int maxLevel = 255;
int agcMode = kAgcModeFixedDigital;
WebRtcAgc_Init(agcHandle, minLevel, maxLevel, agcMode, fs);
WebRtcAgc_config_t agcConfig;
agcConfig.compressionGaindB = 20;
agcConfig.limiterEnable = 1;
agcConfig.targetLevelDbfs = 3;
WebRtcAgc_set_config(agcHandle, agcConfig);
infp = fopen(filename,"rb");
int frameSize = 80;
pData = (short*)malloc(frameSize*sizeof(short));
pOutData = (short*)malloc(frameSize*sizeof(short));
outfp = fopen(outfilename,"wb");
int len = frameSize*sizeof(short);
int micLevelIn = 0;
int micLevelOut = 0;
while(TRUE)
{
memset(pData, 0, len);
len = fread(pData, 1, len, infp);
if (len > 0)
{
int inMicLevel = micLevelOut;
int outMicLevel = 0;
uint8_t saturationWarning;
int nAgcRet = WebRtcAgc_Process(agcHandle, pData, NULL, frameSize, pOutData,NULL, inMicLevel, &outMicLevel, 0, &saturationWarning);
if (nAgcRet != 0)
{
printf("failed in WebRtcAgc_Process\n");
break;
}
micLevelIn = outMicLevel;
fwrite(pOutData, 1, len, outfp);
}
else
{
break;
}
}
} while (0);
fclose(infp);
fclose(outfp);
free(pData);
free(pOutData);
WebRtcAgc_Free(agcHandle);
}
当然,这段代码只是对于8K和16K采样率的音频,如果是32K采样率需要采用滤波分频,然后分别传入最后传出,具体用法和降噪是一样的道理,所以我就不再单独列出来了。具体用法可以下载本文所附的源码,参考32K采样率音频降噪的使用方法使用。
源码下载:WebRtcAudioTest.rar