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录音时的特征提取。这个特征提取的函数调用过程与上述的一致。

猜你喜欢

转载自blog.csdn.net/lbaihao/article/details/85043639