1. 程式人生 > >HTK特徵提取(MFCC)程式碼分析(一)

HTK特徵提取(MFCC)程式碼分析(一)

HTK特徵提取工具HCopy主要呼叫了HParm.c和HSigP.c這兩個C檔案裡面的函式來實現了原始波形訊號到MFCC的轉換。特徵提取的資料全部放在記憶體中處理,函式呼叫過程如下:

main()->OpenSpeechFile->OpenParmFile->OpenBuffer->OpenAsChannel->FillBufFromChannel->GetFrameFromChannel->ConvertFrame

函式功能分析如下:

HTime OpenParmFile(char *src)

功能說明:
首先呼叫b =  OpenBuffer(&iStack,src,0,srcFF,TRI_UNDEF,TRI_UNDEF))提取特徵MFCC引數並儲存在b中。最後呼叫 ReadAsTable(cb, i, &o)和AddToBuffer(pb, o)將MFCC引數儲存在全域性變數pb結構體中。main()中後面會呼叫一個函式PutTargetFile(s)將pb中的MFCC資料儲存到s檔案中。疑問:pb和b都屬於ParmBuf結構體,不知道為何要轉移儲存?
輸入說明:
fn需要提取特徵的原始波形檔名。
輸出說明:
HTime一幀波形的時間長度。

ParmBuf OpenBuffer(MemHeap *x, char *fn, int maxObs, FileFormat ff, TriState enSpeechDet, TriState silMeasure)

功能說明:
首先初始化特徵提取的資訊結構體ParmBuf。最後呼叫 OpenAsChannel(pbuf,maxObs,fn,ff,silMeasure)提取特徵。
輸入說明:
fn需要提取特徵的原始波形檔名。
輸出說明:
pbuf特徵提取結果的所有資訊都存放在這個結構體中

static ReturnStatus OpenAsChannel(ParmBuf pbuf, int maxObs, char *fname, FileFormat ff,TriState silMeasure)

功能說明:
首先呼叫了SetUpForCoding(pbuf->mem,cf,cf->frSize)獲取特徵提取的配置引數並初始化一組三角濾波器。接著呼叫GetWaveDirect(pbuf->in.w,&(cf->nSamples))讀取原始波形資料並儲存在pbuf->in.w中。最後呼叫 FillBufFromChannel(pbuf,MAX_INT)提取特徵。
輸入說明:
pbuf特徵提取的資訊結構體。
fname需要提取特徵的原始波形檔名。
輸出說明:
SUCCESS OR FAIL表示特徵提取是否成功。

static void FillBufFromChannel(ParmBuf pbuf,int minRows)

功能說明:
首先呼叫newRows=FramesInChannel(pbuf,pbuf->chType)來獲原始波形的幀數。接著根據幀數迴圈呼叫
GetFrameFromChannel(pbuf,pbuf->chType,fp1)計算每一幀波形的13維MFCC靜態引數並儲存在fp1中。最後呼叫AddQualifiers(pbuf,fp1,pbuf->qen-pbuf->qst+1,cf,head,tail)計算MFCC的速度和加速動態引數(各13維,加上靜態引數就一共是39維)。注意:這個函式中有一條語句fp1 = (float*) pbuf->main.data + pbuf->main.nRows*cf->nCols,這說明MFCC資料最終是存放在pbuf->main.data中。
輸入說明:
pbuf特徵提取的資訊結構體。
輸出說明:

static int GetFrameFromChannel(ParmBuf pbuf,int chType,void *vp)

功能說明:
首先呼叫GetWave(pbuf->in.w,1,cf->s+1)順序獲取每一幀的波形資料並儲存在cf->s中,接著呼叫ConvertFrame(cf, (float *) vp)計算每一幀波形的13維MFCC靜態引數並儲存在vp中。 
輸入說明:
pbuf特徵提取的資訊結構體。
vp是13維MFCC靜態引數儲存的資料區。
輸出說明:

static int ConvertFrame(IOConfig cf, float *pbuf)

功能說明:
首先呼叫PreEmphasise(cf->s,cf->preEmph)對每一幀波形做預加重,接著呼叫Ham(cf->s)給每一幀波形加漢明窗,然後呼叫Wave2FBank(cf->s, cf->fbank, rawE?NULL:&te, cf->fbInfo)計算每一幀波形對於各個三角mel頻率濾波器的輸出能量,最後呼叫FBank2MFCC(cf->fbank, cf->c, cf->numCepCoef)計算DCT倒譜13維靜態引數。
輸入說明:
cf特徵提取的資訊結構體。
pbuf是13維MFCC靜態引數儲存的資料區。
輸出說明:
處理好的MFCC靜態資料總數量。

以上是HCopy對波形檔案的特徵提取過程。在HTK中還有一個地方需要做特徵提取,就是直接通過MIC錄音時的特徵提取。這個特徵提取的函式呼叫過程與上述的一致。