语音特征参数分析平台(五) 语音信号的时域特征参数

三、语音信号的时域特征参数。

这部分内容还包括了语音信号预处理的分帧和加窗的内容,因为这两部操作都是对语音信号的时域波形处理的结果,因此索性写进CSpeech类中。
1、CSpeech类的功能
1)实现裸音频数据的加窗
2)实现了裸音频数据的分帧
4)获取短时能量:采用hamming窗
5)获取短时平均振幅:采用hamming窗
6)获取短时平均过零率:采用hamming窗
7)实现基于“滑动”法的端点检测和裸音频数据的切割。

2、CSpeech类的设计:

  1 //////////////////////////////////////////////////////////////////////////
  2 // class CSpeech
  3 //
  4 // 功能:    进行语音参数分析
  5 // 创建人:    陈文凯 (chwkai@gmail.com)
  6 // 创建日期:2005年5月21日
  7 // 修改人:
  8 // 修改日期:
  9 // 版本
 10 class CSpeech
 11 {
 12 public:
 13     CSpeech(void);
 14     ~CSpeech(void);
 15 
 16 public:
 17     // 用于判断是否过零
 18     // sgn(nValue) = 1, nValue >= 0
 19     //               = -1, nValue < 0
 20     inline static int Sgn(double nValue)
 21     {
 22         return (nValue >= 0 ? 1 : -1);
 23     }
 24 
 25     // 返回海明窗计算的窗口函数
 26     // w(n) = (0.54 - 0.46 * cos((2 * pi * n) / (N - 1))) , 0 <= n <= N - 1
 27     //      = 0
 28     // 其中N为窗口长度,n为采样在窗口中的位置
 29     inline static double HammingWinFunc(unsigned int n, unsigned int nWinSize)
 30     {
 31         return ((0 <= n && n < nWinSize) ?
 32             (0.54 - 0.46 * cos((2 * pi * n) / (nWinSize - 1))) : 0);
 33     }
 34 
 35     // 对输入数据加窗
 36     static void AddWindow(
 37         unsigned int nWinSize,        // 处理窗宽度
 38         double* pData,                // 输入数据
 39         unsigned int nInLen            // 输入数据长度
 40         );
 41 
 42     // 对输入数据加窗
 43     static void AddWindow(
 44         unsigned int nWinSize,        // 处理窗宽度
 45         const double* pDataIn,        // 输入数据
 46         unsigned int nInLen,        // 输入数据长度
 47         double* pDataOut            // 输出数据
 48         );
 49 
 50     // 计算输入信号序列的短时平均过零率,输入数据为加窗后的数据
 51     static void GetZero(
 52         unsigned int nWinSize,        /*处理窗口大小*/
 53         const double* pDataIn,            /*输入信号序列*/
 54         unsigned int nInLen,        /*输入信号序列长度*/
 55         double* pDataOut            /*输出过零率序列*/
 56         );
 57 
 58     // 计算输入信号序列的短时能量,输入数据为加窗后的数据
 59     static void GetEnergy(
 60         unsigned int nWinSize,        /*处理窗口大小*/
 61         const double* pDataIn,            /*输入信号序列*/
 62         unsigned int nInLen,        /*输入信号序列长度*/
 63         double* pDataOut            /*输出短时能量序列*/
 64         );
 65 
 66     // 计算输入信号序列的平均振幅,输入数据为加窗后的数据
 67     static void GetAvgVibration(
 68         unsigned int nWinSize,        /*处理窗口大小*/
 69         const double* pDataIn,        /*输入信号序列*/
 70         unsigned int nInLen,        /*输入信号序列长度*/
 71         double* pDataOut            /*输出平均振幅序列*/
 72         );
 73     
 74     // 对输入采样序列进行声韵切割,返回切割所得声母和韵母数量
 75     static unsigned int SubSyllable(
 76         unsigned int nFrameSize,    // 每帧包含采样数
 77         double* pDataIn,            // 输入采样序列
 78         unsigned int nInLen,        // 输入采样数
 79         double* pDataOut            // 去掉寂静帧后的采样序列
 80         );
 81 
 82     // 对输入采样序列进行端点检测
 83     static unsigned int SubSection(
 84         const double* pDataIn,        // 输入采样序列
 85         unsigned int nInLen,        // 输入采样数
 86         const double* pEnergy,        // 输入样本序列分帧的短时能量
 87         const double* pZero,        // 输入样本序列分帧的短时过零率
 88         unsigned int nFrameSize,    // 每帧包含采样数
 89         double* pDataOut,            // 去掉寂静帧后的采样序列
 90         unsigned int nWinSize = 50    // 统计窗窗包含帧数
 91         );
 92 
 93     // 对输入采样序列进行端点检测
 94     static unsigned int SubSection(
 95         const double* pDataIn,        // 输入采样序列,已加窗
 96         unsigned int nInLen,        // 输入采样数
 97         unsigned int nFrameSize,    // 每帧包含采样数
 98         double* pDataOut,            // 去掉寂静帧后的采样序列
 99         unsigned int nWinSize = 50    // 统计窗窗包含帧数
100         );
101 
102 };
posted @ 2005-08-01 21:38  海南K.K  阅读(2829)  评论(0)    收藏  举报