虽然我一直在访问,但这是我第一次提问。
问题如下:
我目前正在尝试分离包含以下属性的WAVE数据文件中信号的基频:
- PCM音频格式即线性量化
- 8000 Hz采样率
- 每个样本16位
- 16000字节速率
仅有一个通道,没有交错。
获取字节值:
System.IO.FileStream WaveFile = System.IO.File.OpenRead(@"c:\tet\fft.wav");
byte[] data = new byte[WaveFile.Length];
WaveFile.Read(data,0,Convert.ToInt32(WaveFile.Length));
将其转换为Double类型的数组:
for (int i = 0; i < 32768; i++)//this is only for a relatively small chunk of the file
{
InReal[i] =BitConverter.ToDouble(data, (i + 1) * 8 + 44);
}
最后将其传递给转换函数。
FFT FftObject = new FFT();
FftObject.Transform(InReal, InImg, 0, 32768, out outReal, out outImg, false);
现在的第一个问题是,我理解wav文件的PCM值应该在-1和1之间,但是当转换为Double时,我得到了这些值:
2.65855908666825E-235
2.84104982662944E-285
-1.58613492930337E+235
-1.25617351166869E+264
1.58370933499389E-242
6.19284549187335E-245
-2.92969500042228E+254
-5.90042665390976E+226
3.11954507295188E-273
3.06831908609091E-217
NaN
2.77113146323761E-302
6.76597919848376E-306
-1.55843653898344E+291
这些是数组的前几个,剩余的数组也在这些限制之内。
我的结论是我有某种代码故障,但似乎找不到它。任何帮助都将不胜感激。
第二个问题是,因为我只向FFT算法提供响应向量中的真实数据,所以我只能期望得到真实部分数据吗?
非常感谢您。
short
(ToInt16),而不是double
。此外,如果我没记错的话,BitConverter的字节序取决于它运行的CPU,所以要小心不要出现问题。 - Joachim Isaksson