语音特征参数分析平台(四) 语音信号的数字信号转换和频域特征参数获取
二、数字信号转换:
在语音处理中,往往需要对输入的原始语音信号进行信号处理。包括对输入语音信号的8~16位转换,截取,抽样以及相关的FFT变换。
在进行FFT变换部分,采用了osalp的开源fft库,在其基础上实现了短时FFT。osalp的源代码和说明可以从http://osalp.sourceforge.net 得到。
本文中所涉及的德数字信号变换由CWaveConvertor类负责,
1、CWaveConvertor类的功能:
1)实现输入裸音频数据的短时FFT变换和逆变换:默认情况下取基数为2,256点
2)获取输入裸音频数据的功率谱
3)获取输入裸音频数据的对数功率谱
4)获取输入裸音频数据的LPC倒谱
5)对输入8bit单声道裸音频数据,转化为double型:便于通用的音频分析
6)对输入的16bit单声道裸音频数据,转化为double:同上
7)对输入8bit双声道裸音频数据,转化为double型:同上
8)对输入16bit双声道裸音频数据,转化为double型:同上
9)对输入裸音频数据进行抽样
10)对输入裸音频数据进行截取
2、CWaveConvertor类的设计。
1 //////////////////////////////////////////////////////////////////////////
2 // 负责实现音频裸数据的各种转换
3 class CWaveConvertor
4 {
5 public:
6 CWaveConvertor(void);
7 ~CWaveConvertor(void);
8
9 public:
10 // 实现信号的前向Fourier变换
11 static void ConverToFFT(
12 unsigned int nSamples, // 样本数量
13 unsigned int nShorts, // 短时点数
14 const double* pRealIn, // 输入信号的实部
15 double* pRealOut, // 输出的实部
16 double* pImageOut); // 输出的虚部
17
18 // 实现信号的逆向Fourier变换
19 static void ConvertToRFT(
20 unsigned int nSamples, // 样本数量
21 unsigned int nShorts, // 短时点数
22 const double* pRealIn, // 输入信号
23 double* pRealOut, // 输出信号的实部
24 double* pImageOut); // 输出信号的虚部
25
26 // 获取输入信号的功率谱
27 static void ConvertToPowerSpectral(
28 unsigned int nSamples, // 样本数量
29 unsigned int nShorts, // 短时点数
30 const double* pRealIn, // 输入信号
31 double* pDataOut // 输出的功率谱
32 );
33
34 // 获取输入信号的对数功率谱
35 static void ConvertToLogPowerSpectral(
36 unsigned int nSamples, // 样本数量
37 unsigned int nShorts, // 短时点数
38 const double* pRealIn, // 输入信号
39 double* pDataOut // 输出的对数功率谱
40 );
41
42 // 获取输入信号的倒谱
43 static void ConvertToCepStrum(
44 unsigned int nSamples, // 样本数量
45 unsigned int nShorts, // 短时点数
46 const double* pRealIn, // 输入信号的
47 double* pDataOut // 输出的倒谱
48 );
49
50 // 对输入的8位信号,转化为double类型序列
51 static void ConvertToDoubleMono(
52 const byte* pDataIn, // 输入样本序列
53 unsigned int nCount, // 样本数量
54 double* pDataOut // 输出double类型序列
55 );
56
57 // 对输入的16位信号,转化为double类型序列
58 static void ConvertToDoubleMono(
59 const int* pDataIn, // 输入样本序列
60 unsigned int nCount, // 样本数量
61 double* pDataOut // 输出double类型序列
62 );
63
64 // 对输入的8位信号,转化为双声道double序列
65 static void ConvertToDoubleStereo(
66 const byte* pDataIn, // 输入样本序列
67 unsigned int nCount, // 样本数量
68 double* pDataOutLeft, // 输出左声道double类型序列
69 double* pDataOutRight // 输出右声道double类型序列
70 );
71
72 // 对输入的16位信号,转化为双声道double序列
73 static void ConvertToDoubleStereo(
74 const int* pDataIn, // 输入样本序列
75 unsigned int nCount, // 样本数量
76 double* pDataOutLeft, // 输出左声道double类型序列
77 double* pDataOutRight // 输出右声道double类型序列
78 );
79
80 // 对输入信号进行抽样
81 static void ConvertToSample(
82 const double* pDataIn, /*输入样本序列*/
83 unsigned int nCount, /*输入样本数量*/
84 double* pDataOut, /*输出抽样样本*/
85 unsigned int nWinSize /*抽样窗口宽度*/
86 );
87
88 // 对输入信号进行截取
89 static void GetData(
90 const double* pDataIn, // 输入样本序列
91 unsigned int nCount, // 输入样本数量
92 unsigned int nStart, // 起始下标
93 unsigned int nLen, // 截取长度
94 double* pDataOut // 截取后的序列
95 );
96 };
2 // 负责实现音频裸数据的各种转换
3 class CWaveConvertor
4 {
5 public:
6 CWaveConvertor(void);
7 ~CWaveConvertor(void);
8
9 public:
10 // 实现信号的前向Fourier变换
11 static void ConverToFFT(
12 unsigned int nSamples, // 样本数量
13 unsigned int nShorts, // 短时点数
14 const double* pRealIn, // 输入信号的实部
15 double* pRealOut, // 输出的实部
16 double* pImageOut); // 输出的虚部
17
18 // 实现信号的逆向Fourier变换
19 static void ConvertToRFT(
20 unsigned int nSamples, // 样本数量
21 unsigned int nShorts, // 短时点数
22 const double* pRealIn, // 输入信号
23 double* pRealOut, // 输出信号的实部
24 double* pImageOut); // 输出信号的虚部
25
26 // 获取输入信号的功率谱
27 static void ConvertToPowerSpectral(
28 unsigned int nSamples, // 样本数量
29 unsigned int nShorts, // 短时点数
30 const double* pRealIn, // 输入信号
31 double* pDataOut // 输出的功率谱
32 );
33
34 // 获取输入信号的对数功率谱
35 static void ConvertToLogPowerSpectral(
36 unsigned int nSamples, // 样本数量
37 unsigned int nShorts, // 短时点数
38 const double* pRealIn, // 输入信号
39 double* pDataOut // 输出的对数功率谱
40 );
41
42 // 获取输入信号的倒谱
43 static void ConvertToCepStrum(
44 unsigned int nSamples, // 样本数量
45 unsigned int nShorts, // 短时点数
46 const double* pRealIn, // 输入信号的
47 double* pDataOut // 输出的倒谱
48 );
49
50 // 对输入的8位信号,转化为double类型序列
51 static void ConvertToDoubleMono(
52 const byte* pDataIn, // 输入样本序列
53 unsigned int nCount, // 样本数量
54 double* pDataOut // 输出double类型序列
55 );
56
57 // 对输入的16位信号,转化为double类型序列
58 static void ConvertToDoubleMono(
59 const int* pDataIn, // 输入样本序列
60 unsigned int nCount, // 样本数量
61 double* pDataOut // 输出double类型序列
62 );
63
64 // 对输入的8位信号,转化为双声道double序列
65 static void ConvertToDoubleStereo(
66 const byte* pDataIn, // 输入样本序列
67 unsigned int nCount, // 样本数量
68 double* pDataOutLeft, // 输出左声道double类型序列
69 double* pDataOutRight // 输出右声道double类型序列
70 );
71
72 // 对输入的16位信号,转化为双声道double序列
73 static void ConvertToDoubleStereo(
74 const int* pDataIn, // 输入样本序列
75 unsigned int nCount, // 样本数量
76 double* pDataOutLeft, // 输出左声道double类型序列
77 double* pDataOutRight // 输出右声道double类型序列
78 );
79
80 // 对输入信号进行抽样
81 static void ConvertToSample(
82 const double* pDataIn, /*输入样本序列*/
83 unsigned int nCount, /*输入样本数量*/
84 double* pDataOut, /*输出抽样样本*/
85 unsigned int nWinSize /*抽样窗口宽度*/
86 );
87
88 // 对输入信号进行截取
89 static void GetData(
90 const double* pDataIn, // 输入样本序列
91 unsigned int nCount, // 输入样本数量
92 unsigned int nStart, // 起始下标
93 unsigned int nLen, // 截取长度
94 double* pDataOut // 截取后的序列
95 );
96 };
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号