语音特征参数分析平台(五) 语音信号的时域特征参数
三、语音信号的时域特征参数。
这部分内容还包括了语音信号预处理的分帧和加窗的内容,因为这两部操作都是对语音信号的时域波形处理的结果,因此索性写进CSpeech类中。
1、CSpeech类的功能
1)实现裸音频数据的加窗
2)实现了裸音频数据的分帧
4)获取短时能量:采用hamming窗
5)获取短时平均振幅:采用hamming窗
6)获取短时平均过零率:采用hamming窗
7)实现基于“滑动”法的端点检测和裸音频数据的切割。
2、CSpeech类的设计:
这部分内容还包括了语音信号预处理的分帧和加窗的内容,因为这两部操作都是对语音信号的时域波形处理的结果,因此索性写进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 };
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 };
All the posts in this blog are provided "AS IS" with no warranties, and confer no rights. Except where otherwise noted, content on this site is licensed under a Creative Commons Attribution 2.5 China Mainland License.
浙公网安备 33010602011771号