Speech.h
上传用户:goak128
上传日期:2013-07-17
资源大小:155k
文件大小:3k
源码类别:

控制台编程

开发平台:

C/C++

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