【发布时间】:2013-07-01 12:51:28
【问题描述】:
我有一个 .wav 单声道文件(16 位,44.1kHz),我使用下面的代码。如果我没有错,这会给我一个介于 -1 和 1 之间的值的输出,我可以应用 FFT(稍后转换为频谱图)。但是,我的输出与 -1 和 1 相差无几。
这是我输出的一部分
7.01214599609375
17750.2552337646
8308.42733764648
0.000274658203125
1.00001525878906
0.67291259765625
1.3458251953125
16.0000305175781
24932
758.380676269531
0.0001068115234375
这是我从另一个帖子中得到的代码
编辑 1:
public static Double[] prepare(String wavePath, out int SampleRate)
{
Double[] data;
byte[] wave;
byte[] sR = new byte[4];
System.IO.FileStream WaveFile = System.IO.File.OpenRead(wavePath);
wave = new byte[WaveFile.Length];
data = new Double[(wave.Length - 44) / 4];//shifting the headers out of the PCM data;
WaveFile.Read(wave, 0, Convert.ToInt32(WaveFile.Length));//read the wave file into the wave variable
/***********Converting and PCM accounting***************/
for (int i = 0; i < data.Length; i += 2)
{
data[i] = BitConverter.ToInt16(wave, i) / 32768.0;
}
/**************assigning sample rate**********************/
for (int i = 24; i < 28; i++)
{
sR[i - 24] = wave[i];
}
SampleRate = BitConverter.ToInt16(sR, 0);
return data;
}
编辑 2:我每第二个数字输出 0
0.009002685546875
0
0.009613037109375
0
0.0101318359375
0
0.01080322265625
0
0.01190185546875
0
0.01312255859375
0
0.014068603515625
【问题讨论】:
-
该代码过于简单和错误。简单化:这取决于 WAV 文件的比特率如何执行转换。错误:它读取四个字节并使用 UInt16.MaxValue 而不是 Int32.MaxValue 对其进行规范化。
-
如果在那之前没有人回答,我可以在几个小时内提供详细的答案。如果您仍然需要帮助并且我没有提供答案,请在 7 小时内通过评论记住我。
-
是的,希望您能提供详细的答复。我对音频处理有点陌生,所以请多多包涵。我应该录制一个声音并对其应用 FFT 并将其转换为频谱图,以便我能够设置采样率和否。通过 Naudio lib 的 wav 文件的通道。谢谢
-
正如 Daniel 指出的那样,您的主要问题是您通过除以“UInt16.MaxValue”来规范化 32 位值。您需要除以
Int.MaxValue,这将为您提供 -1 .. 1 范围内的值。此外,您可以使用for (int i = 0; i < data.Length; i += 4)简化代码,并删除索引中的乘法。 -
或者......很难说,因为你的代码很混乱。如果您使用的是单声道声音(即一个通道),那么您的样本应该是 16 位的,因此您应该使用
BitConverter.ToInt16,并且在循环中只增加 2。