/***************************************************** *MFCC特征提取程序 *读取一个音频文件(.wav),将根据帧长分割后的每帧2阶MFCC *系数写在输出文件中,以","为间隔 *******************************************************/ #include #include #include #include #include #include #include #include //MFCC的特征选取,最后提取了13维左右最后结果保存在文件中 using namespace std; #define SP_EMPHASIS_FACTOR 0.97f /* 预加重的系数 */ 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 long FrmLen=1024; //可修改帧长 const unsigned long FFTLen=512; //参与FFT运算的512个数据 const double PI=3.1415926536; const int FiltNum=40; //滤波器组数,一共40组 const int PCEP=13; //最后得到的关于的13个MFCC的系数 double Hamming[FrmLen]; int temp_1; //计算次数的 vectorMFCCcoefficient; static double last=0; //一窗数据最后一个点的值,此点用于预加重 void preemphasis(double* buf, double* result, short FrmLen ); //预加重 void InitHamming(); void HammingWindow(double* result,double* data); void compute_fft(double *buffer,vector >& vecList); void FFT(const unsigned long & ulN, vector >& vecList); //FFT的实际程序 void InitFilt(double *FiltCoe1, double *FiltCoe2, int *Num); //初始化滤波器 void CFilt(double *spdata, double *FiltCoe1, double *FiltCoe2, int *Num, double...