www.pudn.com > hmmPlatform.rar > Speech.h
#ifndef _CSPEECH_H_ #define _CSPEECH_H_ // 定义pi值 #ifndef pi #define pi 3.1415926535897932384626434 #endif #include// 帧类型 typedef enum _frameType { FrameSlient = 0, // 寂静帧 FrameSM, // 声母 FrameYM // 韵母 } FrameType; ////////////////////////////////////////////////////////////////////////// // class CSpeech // // 功能: 进行语音参数分析 // 创建人: 陈文凯 (chwkai@gmail.com) // 创建日期:2005年5月21日 // 修改人: // 修改日期: // 版本 class CSpeech { public: CSpeech(void); ~CSpeech(void); public: // 用于判断是否过零 // sgn(nValue) = 1, nValue >= 0 // = -1, nValue < 0 inline static int Sgn(double nValue) { return (nValue >= 0 ? 1 : -1); } // 返回海明窗计算的窗口函数 // w(n) = (0.54 - 0.46 * cos((2 * pi * n) / (N - 1))) , 0 <= n <= N - 1 // = 0 // 其中N为窗口长度,n为采样在窗口中的位置 inline static double HammingWinFunc(unsigned int n, unsigned int nWinSize) { return ((0 <= n && n < nWinSize) ? (0.54 - 0.46 * cos((2 * pi * n) / (nWinSize - 1))) : 0); } // 对输入数据加窗 static void AddWindow( unsigned int nWinSize, // 处理窗宽度 double* pData, // 输入数据 unsigned int nInLen // 输入数据长度 ); // 对输入数据加窗 static void AddWindow( unsigned int nWinSize, // 处理窗宽度 const double* pDataIn, // 输入数据 unsigned int nInLen, // 输入数据长度 double* pDataOut // 输出数据 ); // 计算输入信号序列的短时平均过零率,输入数据为加窗后的数据 static void GetZero( unsigned int nWinSize, /*处理窗口大小*/ const double* pDataIn, /*输入信号序列*/ unsigned int nInLen, /*输入信号序列长度*/ double* pDataOut /*输出过零率序列*/ ); // 计算输入信号序列的短时能量,输入数据为加窗后的数据 static void GetEnergy( unsigned int nWinSize, /*处理窗口大小*/ const double* pDataIn, /*输入信号序列*/ unsigned int nInLen, /*输入信号序列长度*/ double* pDataOut /*输出短时能量序列*/ ); // 计算输入信号序列的平均振幅,输入数据为加窗后的数据 static void GetAvgVibration( unsigned int nWinSize, /*处理窗口大小*/ const double* pDataIn, /*输入信号序列*/ unsigned int nInLen, /*输入信号序列长度*/ double* pDataOut /*输出平均振幅序列*/ ); // 对输入采样序列进行声韵切割,返回切割所得声母和韵母数量 static unsigned int SubSyllable( unsigned int nFrameSize, // 每帧包含采样数 double* pDataIn, // 输入采样序列 unsigned int nInLen, // 输入采样数 double* pDataOut // 去掉寂静帧后的采样序列 ); // 对输入采样序列进行端点检测 static unsigned int SubSection( const double* pDataIn, // 输入采样序列 unsigned int nInLen, // 输入采样数 const double* pEnergy, // 输入样本序列分帧的短时能量 const double* pZero, // 输入样本序列分帧的短时过零率 unsigned int nFrameSize, // 每帧包含采样数 double* pDataOut, // 去掉寂静帧后的采样序列 unsigned int nWinSize = 50 // 统计窗窗包含帧数 ); // 对输入采样序列进行端点检测 static unsigned int SubSection( const double* pDataIn, // 输入采样序列,已加窗 unsigned int nInLen, // 输入采样数 unsigned int nFrameSize, // 每帧包含采样数 double* pDataOut, // 去掉寂静帧后的采样序列 unsigned int nWinSize = 50 // 统计窗窗包含帧数 ); }; #endif /*_CSPEECH_H_*/