2

我从波形文件中获得了原始音乐数据的 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++;
}
4

2 回答 2

1

Your PCM stream is almost certainly 16 bit. So instead of BitConverter.ToDouble use ToInt16 instead. Then divide by 32768.0 to get into the the range +/- 1.0

于 2013-01-28T16:57:13.800 回答
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();
    }
于 2016-08-25T22:43:11.237 回答