speex NS(noise suppression)函数调用 自我学习

本文有部分是借鉴网上部分作者的,尽量注明来源,如有问题,请告知本人,及时删帖

文章只为能够吸引并且与更多人一起学习,若文章有任何问题,请告知本人,本人尽快改正



头文件: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也将原语音信号消除了,同时还产生类似电流的嘶嘶声


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值