本文有部分是借鉴网上部分作者的,尽量注明来源,如有问题,请告知本人,及时删帖
文章只为能够吸引并且与更多人一起学习,若文章有任何问题,请告知本人,本人尽快改正
头文件:speex/speex_preprocess.h
1、创建结构体:SpeexPreprocessState *st
2、初始化处理函数:
SpeexPreprocessState *speex_preprocess_state_init(int frame_size, int sampling_rate);
frame_size:处理数据长度(为采样率的10-20ms的长度)
sampling_rate:采样率(8/16/32K)
返回值:返回结构体指针
3、设置降噪的相关参数:
int speex_preprocess_ctl(SpeexPreprocessState *st, int request, void *ptr);
St:初始化的结构体
Request:设置目标的参数类型,根据speex_preprocess.h中宏定义选择
Ptr:对应宏的参数值
返回值: 0 正常
-1 未知参数request
降噪所用到的宏定义为:
/** Set preprocessor denoiser state */
#define SPEEX_PREPROCESS_SET_DENOISE 0 设置是否打开Speex预处理器句柄的噪音抑制,ptr参数为spx_int32_t型变量的内存指针,1表示开启,0表示关闭,默认为1。
/** Set maximum attenuation of the noise in dB (negative number) */
#define SPEEX_PREPROCESS_SET_NOISE_SUPPRESS 18 设置噪音抑制时,噪音的最大程度衰减的分贝值,ptr参数为spx_int32_t型变量的内存指针,默认为-15。
4、处理函数:int speex_preprocess_run(SpeexPreprocessState *st, spx_int16_t *x);
St:初始化的结构体
X:处理前后的数据存储空间
若是开启VAD,才会有返回值,1代表语音,0代表安静或噪声
针对降噪处理则不存在返回值
5、销毁、释放结构体:void speex_preprocess_state_destroy(SpeexPreprocessState *st);
St:初始化的结构体
附上程序源码:
环境:Linux
#include "speex/speex_preprocess.h"
#include <stdio.h>
#define FRAME_SIZE 640 //帧长度,1152
#define FRAME_SAMPLERATE 32000//16000 //采样率
#define DENOISE_DB -50 //噪声DB
int main(int argn, char* argv[]) {
char* szInFilename = NULL;//输入文件名
char* szOutFilename = NULL;//输出文件名
FILE* pInFileHandle = NULL;//声明pInFileHandle为输入文件指向file类型的指针
FILE* pOutFileHandle = NULL;//声明指向输出文件的指针
short in[FRAME_SAMPLERATE];//数据传输
int i;
int count=0;
float f;
SpeexPreprocessState *st;//创建结构体
printf("starting....\r\n");
if(argn != 3){//输入参数判断
printf("please input 2 parameters\r\n");
return -1;
}
szInFilename = argv[1];//传输文件名
szOutFilename = argv[2];
pInFileHandle = fopen(szInFilename, "rb");//打开只读二进制文件并检查
pOutFileHandle = fopen(szOutFilename, "wb");//打开只写二进制文件并检查
//准确设置pcm音频的音频采样率,和帧长度
st = speex_preprocess_state_init(FRAME_SIZE, FRAME_SAMPLERATE);//初始化
//设置降噪参数,其中DENOISE_DB默认是-25,单位是dB(分贝)
int denoise = 1;
int noiseSuppress = DENOISE_DB;
speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_DENOISE, &denoise);//降噪
speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_NOISE_SUPPRESS, &noiseSuppress);//设置噪声的dB
while (1)
{
//int vad;
int iLen = fread(in, 1, FRAME_SIZE, pInFileHandle);//读取指定长度的数据
if(iLen <= 0) break; //判断是否读取出现错误或者读到末尾
if (feof(pInFileHandle))break;
speex_preprocess_run(st, in);
fwrite(in,1, FRAME_SIZE, pOutFileHandle);
count++;
}
speex_preprocess_state_destroy(st);
fclose(pInFileHandle);
fclose(pOutFileHandle);
return 0;
}
结果显示对比:
原信号、衰减值为-5、-20、-50、-100,在一定衰减值范围内,随着衰减值的增大,降噪的幅值越明显,但是在去噪的同时speex也将原语音信号消除了,同时还产生类似电流的嘶嘶声