mfcc特征提取,c++代码实现


通过波形文件数据,进行MFCC特征提取,做相关滤波、加窗、fft变换等,得到13维mfcc特征,若在13维基础上继续做一阶二阶差分可得到24维mfcc特征
资源截图
代码片段和文件信息
#include “stdafx.h“
#include “getmfcc.h“
#include
#include
#include
#include
#include
#include
#include  
#include  
#include  

//#include

using namespace std;

typedef struct _TWavHeader
{
        int rId;    //标志符(RIFF)
        int rLen;   //数据大小包括数据头的大小和音频文件的大小
        int wId;    //格式类型(“WAVE“)
        int fId;    //“fmt“

        int fLen;   //Sizeof(WAVEFORMATEX)

        short wFormatTag;       //编码格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
        short nChannels;        //声道数,单声道为1,双声道为2
        int nSamplesPerSec;   //采样频率
        int nAvgBytesPerSec;  //每秒的数据量
        short nBlockAlign;      //块对齐
        short wBitsPerSample;   //WAVE文件的采样大小
        int dId;              //“data“
        int wSampleLength;    //音频数据的大小
}TWavHeader;

const int FS=16;
const int FrmLen=20*FS;  //窗口长度
const unsigned long FFTLen=512; //参与FFT运算的512个数据
const double PI=3.1415926536;
const int FiltNum=25;   //滤波器组数,一共25组
const int PCEP=13;     //MFCC的阶数,最后得到的关于的13个MFCC的系数 
const int GmmNum=8;
const double infinite=1e+32;
double Hamming[FrmLen];

vectorxishu;

typedef struct _GmmPara
{
double weight;  //存放权值
double mean[PCEP];  //存放均值
double variance[PCEP];  //存放方差
}GmmPara;

GmmPara  para[GmmNum];


void InitHamming();
void HammingWindow(short* buffloat* data);
float GetSTE(short* data);
int GetZcr(short *data);
void compute_fft(float *buffervector >& vecList);
void FFT(const unsigned long & ulN vector >& vecList); //FFT的实际程序
void display(const unsigned long & ulN vector >& vecList); 
void InitFilt(float *FiltCoe1 float *FiltCoe2 int *Num); //初始化滤波器
void CFilt(float *spdata float *FiltCoe1 float *FiltCoe2 int *Num float *Envector >& vecList);
void MFCC(float *En); //计算MFCC的13个系数
void cluster();
void EM();
float CalculateLikelihood();
void WritePara();

int getmfcc(char *pathCString Name)
{
TWavHeader waveheader;
FILE *sourcefile;
short buffer[FrmLen];
float data[FrmLen];  //加窗后得到的数据
int index=0count=0;
float energy=0.0sum=0.0;
float FiltCoe1[FFTLen/2+1];  //左系数
float FiltCoe2[FFTLen/2+1];  //右系数
int Num[FFTLen/2+1];     //决定每个点属于哪一个滤波器,一般而言,每个点会包含在相邻的两个滤波器中,这里是与该点相关的第二个滤波器
float En[FiltNum+1];         //频带能量

vector > vecList;
ofstream outfile1(Name);          //建立音频文件所对应的.txt文件,用于存储提取MFCC的内容
sourcefile=fopen(path“rb“);     //打开要提取的音频文件

fread(&waveheadersizeof(struct _TWavHeader)1sourcefile);  
//从文件sourcefile中读入1个_TWavHeader字节的数据项到waveheader所确定的地址中
InitHamming();//初始化汉明窗
InitFilt(FiltCoe1FiltCoe2Num); //初始化MEL滤波系数

/*int fread( void *buffer size_t size size_t num FILE *stream );
函数fread()读取[num]个对象(每个对象大小为size(大小)指定的字节数)
并把它们替换到由buffer(缓冲区)指定的数组. 数据来自给出的输入流. 
函数的返回值是读取的内容数量... 
*/
while(fread(buffersizeof(short)FrmLensourcefile)==FrmLen)
{
Hamm

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      97341  2010-05-13 16:43  MFCCDebuggetmfcc.obj

     文件     135239  2010-05-13 16:36  MFCCDebugmfcc.exe

     文件     507032  2010-05-13 16:36  MFCCDebugmfcc.ilk

     文件      14126  2010-05-08 09:02  MFCCDebugmfcc.obj

     文件    5896884  2010-05-08 09:02  MFCCDebugmfcc.pch

     文件     525312  2010-05-13 16:36  MFCCDebugmfcc.pdb

     文件       2624  2010-05-12 09:36  MFCCDebugmfcc.res

     文件      54496  2010-05-12 15:15  MFCCDebugmfccDlg.obj

     文件     105357  2010-05-08 09:02  MFCCDebugStdAfx.obj

     文件     459776  2010-05-13 16:43  MFCCDebugvc60.idb

     文件     487424  2010-05-13 16:43  MFCCDebugvc60.pdb

     文件      15184  2010-05-17 09:51  MFCCgetmfcc.cpp

     文件         58  2010-05-08 16:15  MFCCgetmfcc.h

     文件      35812  2010-05-12 09:36  MFCCmfcc.aps

     文件       1289  2010-05-17 10:26  MFCCmfcc.clw

     文件       2035  2010-05-05 16:36  MFCCmfcc.cpp

     文件       4246  2010-05-06 16:39  MFCCmfcc.dsp

     文件        514  2010-05-05 16:36  MFCCmfcc.dsw

     文件       1302  2010-05-05 16:36  MFCCmfcc.h

     文件     115712  2010-05-17 10:29  MFCCmfcc.ncb

     文件      57856  2010-05-17 10:29  MFCCmfcc.opt

     文件        679  2010-05-13 16:43  MFCCmfcc.plg

     文件       5457  2010-05-12 09:36  MFCCmfcc.rc

     文件      11024  2010-05-12 10:59  MFCCmfccDlg.cpp

     文件       1833  2010-05-08 15:09  MFCCmfccDlg.h

     文件       3543  2010-05-05 16:36  MFCCReadMe.txt

     文件       1078  2010-05-05 16:36  MFCC
esmfcc.ico

     文件        396  2010-05-05 16:36  MFCC
esmfcc.rc2

    ..A.SH.      3072  2010-05-06 15:47  MFCC
esThumbs.db

     文件        866  2010-05-08 15:09  MFCC
esource.h

............此处省略8个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)