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錄音時的特徵提取。這個特徵提取的函數調用過程與上述的一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章