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_*/