我从波形文件中获得了原始音乐数据的pcm流,并希望将其转换为双数组(之后应用fft)。
我现在得到的结果包含非常高或低的双数字(1.0E-200和1.0E + 300),我不确定这些是否正确。
这是我现在正在使用的代码:
WaveStream pcm = WaveFormatConversionStream.CreatePcmStream(mp3);
double[] real = new double[pcm.Length];
byte[] buffer = new byte[8];
int count = 0;
while ((read = pcm.Read(buffer, 0, buffer.Length)) > 0)
{
real[count] = BitConverter.ToDouble(buffer, 0);
count++;
}
答案 0 :(得分:1)
您的PCM流几乎肯定是16位。因此,而不是BitConverter.ToDouble
使用ToInt16
。然后除以32768.0进入范围+/- 1.0
答案 1 :(得分:0)
我意识到这个问题已经过时了;但是,我想我可能会提供这种替代方法来调用BitConverter.ToDouble。
public static double[] ToDoubleArray(this byte[] bytes)
{
Debug.Assert(bytes.Length % sizeof(double) == 0, "byte array must be aligned on the size of a double.");
double[] doubles = new double[bytes.Length / sizeof(double)];
GCHandle pinnedDoubles = GCHandle.Alloc(doubles, GCHandleType.Pinned);
Marshal.Copy(bytes, 0, pinnedDoubles.AddrOfPinnedObject(), bytes.Length);
pinnedDoubles.Free();
return doubles;
}
public static double[] ToDoubleArray(this MemoryStream stream)
{
return stream.ToArray().ToDoubleArray();
}