1. 程式人生 > >speex噪音消除

speex噪音消除

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "speex/speex_preprocess.h"
#include <stdio.h>

#define NN 160

int main()
{
   short in[NN];
   int i;
   SpeexPreprocessState *st;
   int count=0;
   float f;

   st = speex_preprocess_state_init(NN, 8000);
   i=1;
   speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_DENOISE, &i);
   i=0
; speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_AGC, &i); i=8000; speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_AGC_LEVEL, &i); i=0; speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_DEREVERB, &i); f=.0; speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_DEREVERB_DECAY, &f); f=.0
; speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_DEREVERB_LEVEL, &f); while (1) { int vad; fread(in, sizeof(short), NN, stdin); if (feof(stdin)) break; vad = speex_preprocess_run(st, in); /*fprintf (stderr, "%d\n", vad);*/ fwrite(in, sizeof(short
), NN, stdout); count++; } speex_preprocess_state_destroy(st); return 0; }

函式名稱 speex_preprocess_state_init
標頭檔案 #include “speex_preprocess.h”
函式功能 初始化Speex前處理器控制代碼。
Speex前處理器控制代碼用於對原始音訊資料進行預處理。
函式宣告 SpeexPreprocessState * speex_preprocess_state_init ( int frame_size, int sampling_rate);
函式引數
frame_size,[輸入]:存放音訊資料一幀的大小,單位多少個取樣單元。
sampling_rate,[輸入]: 存放音訊資料的取樣頻率,單位Hz。
返回值 Speex前處理器控制代碼。
其他說明
如果是對一條音訊流預處理,那麼預處理從開始到結束都應該用一個Speex前處理器控制代碼,中途不要更換Speex前處理器控制代碼,也不要用一個Speex前處理器控制代碼給多條音訊流預處理,否則會導致預處理後的音訊資料不正確。當Speex前處理器控制代碼不再使用時,必須呼叫speex_preprocess_state_destroy()函式銷燬前處理器控制代碼,否則會記憶體洩漏。

函式名稱 speex_preprocess_ctl
標頭檔案 #include “speex_preprocess.h”
函式功能 控制Speex前處理器控制代碼的相關引數。
函式宣告 int speex_preprocess_ctl (SpeexPreprocessState * st, int request, void * ptr);
函式引數
st,[輸入]:存放Speex前處理器控制代碼。
request,[輸入]:存放需要控制的引數,可以為(選一至一個):

SPEEX_PREPROCESS_SET_DENOISE巨集(0x0000):
設定是否開啟Speex前處理器控制代碼的噪音抑制,ptr引數為spx_int32_t型變數的記憶體指標,1表示開啟,0表示關閉,預設為1。
SPEEX_PREPROCESS_GET_DENOISE巨集(0x0001):
獲取是否開啟Speex前處理器控制代碼的噪音抑制,ptr引數為spx_int32_t型變數的記憶體指標,1表示開啟,0表示關閉。
SPEEX_PREPROCESS_SET_AGC巨集(0x0002):
設定是否開啟Speex前處理器控制代碼的AGC自動增益控制,ptr引數為spx_int32_t型變數的記憶體指標,1表示開啟,0表示關閉,預設為0。
注意:Speex庫的AGC自動增益控制正常情況下會增大音量,但有時可能會讓減小音量,甚至直接變為靜音,所以需要謹慎使用。
SPEEX_PREPROCESS_GET_AGC巨集(0x0003):
獲取是否開啟Speex前處理器控制代碼的AGC自動增益控制,ptr引數為spx_int32_t型變數的記憶體指標,1表示開啟,0表示關閉。
SPEEX_PREPROCESS_SET_VAD巨集(0x0004):
設定是否開啟Speex前處理器控制代碼的VAD語音活動檢測,ptr引數為spx_int32_t型變數的記憶體指標,1表示開啟,0表示關閉,預設為0。
SPEEX_PREPROCESS_GET_VAD巨集(0x0005):
獲取是否開啟Speex前處理器控制代碼的VAD語音活動檢測,ptr引數為spx_int32_t型變數的記憶體指標,1表示開啟,0表示關閉。
SPEEX_PREPROCESS_SET_AGC_LEVEL巨集(0x0006):
設定AGC自動增益控制時,是否開啟Speex前處理器控制代碼的語音活動檢測,ptr引數為float型變數的記憶體指標,預設為8000.0。
SPEEX_PREPROCESS_GET_AGC_LEVEL巨集(0x0007):
獲取AGC自動增益控制時,是否開啟Speex前處理器控制代碼的語音活動檢測,ptr引數為float型變數的記憶體指標。
SPEEX_PREPROCESS_SET_DEREVERB巨集(0x0008):
設定是否開啟Speex前處理器控制代碼的消除混響,ptr引數為spx_int32_t型變數的記憶體指標,1表示開啟,0表示關閉,預設為0。
SPEEX_PREPROCESS_GET_DEREVERB巨集(0x0009):
設定是否開啟Speex前處理器控制代碼的消除混響,ptr引數為spx_int32_t型變數的記憶體指標,1表示開啟,0表示關閉。

*SPEEX_PREPROCESS_SET_DEREVERB_LEVEL巨集(0x000A):
設定Speex前處理器控制代碼的消除混響的等級,ptr引數為float型變數的記憶體指標,本標記目前無意義。
SPEEX_PREPROCESS_GET_DEREVERB_LEVEL巨集(0x000B):
獲取Speex前處理器控制代碼的消除混響的等級,ptr引數為float型變數的記憶體指標,本標記目前無意義。
SPEEX_PREPROCESS_SET_DEREVERB_DECAY巨集(0x000C):
設定Speex前處理器控制代碼的消除混響的衰減,ptr引數為float型變數的記憶體指標,本標記目前無意義。
SPEEX_PREPROCESS_GET_DEREVERB_DECAY巨集(0x000C):
獲取Speex前處理器控制代碼的消除混響的衰減,ptr引數為float型變數的記憶體指標,本標記目前無意義。*

SPEEX_PREPROCESS_SET_PROB_START巨集(0x000E):
設定VAD語音活動檢測時,從靜音到有聲音的判斷標準,ptr引數為int型變數的記憶體指標,預設為34。
SPEEX_PREPROCESS_GET_PROB_START巨集(0x000F):
獲取VAD語音活動檢測時,從靜音到有聲音的判斷標準,ptr引數為int型變數的記憶體指標。
SPEEX_PREPROCESS_SET_PROB_CONTINUE巨集(0x0010):
設定VAD語音活動檢測時,從有聲音到靜音的判斷標準,ptr引數為int型變數的記憶體指標,預設為20。
SPEEX_PREPROCESS_GET_PROB_CONTINUE巨集(0x0011):
獲取VAD語音活動檢測時,從有聲音到靜音的判斷標準,ptr引數為int型變數的記憶體指標。
SPEEX_PREPROCESS_SET_NOISE_SUPPRESS巨集(0x0012):
設定噪音抑制時,噪音的最大程度衰減的分貝值,ptr引數為spx_int32_t型變數的記憶體指標,預設為-15。
SPEEX_PREPROCESS_GET_NOISE_SUPPRESS巨集(0x0013):
獲取噪音抑制時,噪音的最大程度衰減的分貝值,ptr引數為spx_int32_t型變數的記憶體指標。
SPEEX_PREPROCESS_SET_ECHO_SUPPRESS巨集(0x0014):
設定殘餘迴音消除時,殘餘迴音的最大程度衰減的分貝值,ptr引數為spx_int32_t型變數的記憶體指標,預設為-40。
SPEEX_PREPROCESS_GET_ECHO_SUPPRESS巨集(0x0015):
獲取殘餘迴音消除時,殘餘迴音的最大程度衰減的分貝值,ptr引數為spx_int32_t型變數的記憶體指標。
SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE巨集(0x0016):
設定殘餘迴音消除時,接近末尾的殘餘迴音的最大程度衰減的分貝值。ptr引數為spx_int32_t型變數的記憶體指標,預設為-15。
SPEEX_PREPROCESS_GET_ECHO_SUPPRESS_ACTIVE巨集(0x0017):
獲取殘餘迴音消除時,接近末尾的殘餘迴音的最大程度衰減的分貝值。ptr引數為spx_int32_t型變數的記憶體指標。
SPEEX_PREPROCESS_SET_ECHO_STATE巨集(0x0018):
設定是否開啟Speex前處理器控制代碼的殘餘迴音消除,開啟後應在迴音消除後再進行預處理。ptr引數為SpeexEchoState結構體變數的記憶體指標,也就是Speex聲學回音消除器控制代碼,為NULL表示關閉。
SPEEX_PREPROCESS_GET_ECHO_STATE巨集(0x0019):
獲取是否開啟Speex前處理器控制代碼的殘餘迴音消除。ptr引數為SpeexEchoState結構體指標變數的記憶體指標,也就是用來存放Speex聲學回音消除器控制代碼,如果Speex聲學回音消除器控制代碼為NULL表示關閉。
SPEEX_PREPROCESS_SET_AGC_INCREMENT巨集(0x001A):
設定AGC自動增益控制時,每秒增益最大增量的分貝值,ptr引數為spx_int32_t型變數的記憶體指標,預設為12。
SPEEX_PREPROCESS_GET_AGC_INCREMENT巨集(0x001B):
獲取AGC自動增益控制時,每秒增益最大增量的分貝值,ptr引數為spx_int32_t型變數的記憶體指標。
SPEEX_PREPROCESS_SET_AGC_DECREMENT巨集(0x001C):
設定AGC自動增益控制時,每秒增益最大減量的分貝值,ptr引數為spx_int32_t型變數的記憶體指標,預設為-40。
SPEEX_PREPROCESS_GET_AGC_DECREMENT巨集(0x001D):
獲取AGC自動增益控制時,每秒增益最大減量的分貝值,ptr引數為spx_int32_t型變數的記憶體指標。
SPEEX_PREPROCESS_SET_AGC_MAX_GAIN巨集(0x001C):
設定AGC自動增益控制時,增益最大增加的分貝值,ptr引數為spx_int32_t型變數的記憶體指標,預設為30。
SPEEX_PREPROCESS_GET_AGC_MAX_GAIN巨集(0x001C):
獲取AGC自動增益控制時,增益最大增加的分貝值,ptr引數為spx_int32_t型變數的記憶體指標。

/* Can’t set loudness */
/* Get loudness /
SPEEX_PREPROCESS_GET_AGC_LOUDNESS 33
/* Can’t set gain */
/* Get current gain (int32 percent) /
SPEEX_PREPROCESS_GET_AGC_GAIN 35
/* Can’t set spectrum size */
/* Get spectrum size for power spectrum (int32) /
SPEEX_PREPROCESS_GET_PSD_SIZE 37
/* Can’t set power spectrum */
/* Get power spectrum (int32[] of squared values) /
SPEEX_PREPROCESS_GET_PSD 39
/* Can’t set noise size */
/* Get spectrum size for noise estimate (int32) /
SPEEX_PREPROCESS_GET_NOISE_PSD_SIZE 41
/* Can’t set noise estimate */
/* Get noise estimate (int32[] of squared values) /
SPEEX_PREPROCESS_GET_NOISE_PSD 43
/* Can’t set speech probability */
/* Get speech probability in last frame (int32). /
SPEEX_PREPROCESS_GET_PROB 45
/* Set preprocessor Automatic Gain Control level (int32) /
SPEEX_PREPROCESS_SET_AGC_TARGET 46
/* Get preprocessor Automatic Gain Control level (int32) /
SPEEX_PREPROCESS_GET_AGC_TARGET 47

ptr,[輸入&輸出]:存放控制引數。
本引數是根據request引數來定義的。
返回值
0:成功。
非0:失敗,request引數無效。

函式名稱 speex_preprocess_run
標頭檔案 #include “speex_preprocess.h”
函式功能 根據Speex前處理器控制代碼,對一幀16位有符號整型單聲道原始音訊資料進行預處理。
函式宣告 int speex_preprocess_run (SpeexPreprocessState * st, spx_int16_t * x);
函式引數 st,[輸入]:
存放Speex前處理器控制代碼。
x,[輸入]:
存放一幀16位有符號整型單聲道原始音訊資料的記憶體指標。
返回值
1:預處理完畢,如果開啟語音活動檢測,表示本幀音訊資料為有聲音。
0:預處理完畢,如果開啟語音活動檢測,表示本幀音訊資料為靜音。

函式名稱 speex_preprocess_state_destroy
標頭檔案 #include “speex_preprocess.h”
函式功能
銷燬一個Speex前處理器控制代碼。
函式宣告 void speex_preprocess_state_destroy (SpeexPreprocessState * st);
函式引數
st,[輸入]:存放Speex前處理器控制代碼。
返回值 無