Speech.h
上传用户:goak128
上传日期:2013-07-17
资源大小:155k
文件大小:3k
- #ifndef _CSPEECH_H_
- #define _CSPEECH_H_
- // 定义pi值
- #ifndef pi
- #define pi 3.1415926535897932384626434
- #endif
- #include <math.h>
- // 帧类型
- 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_*/