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

PCMストリームはほぼ確実に16ビットです。したがって、代わりにBitConverter.ToDouble使用するToInt16代わりに。次に、32768.0で割って、+/-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 に答える