将原始字节数据转换为 float[] 并且值需要介于 -1 和 1 之间

Converting Raw byte data to float[] and values needs to be between -1 and 1

如果我做对了,我不会这样做,但我正在使用此方法将字节数组转换为浮点数组,如 link 所示:

public static float[] ConvertByteToFloat(byte[] array) {   
        float[] floatArr = new float[array.Length / 4];   
        for (int i = 0; i < floatArr.Length; i++) {
              if (BitConverter.IsLittleEndian) {
                 Array.Reverse(array, i * 4, 4);
              }
              floatArr[i] = BitConverter.ToSingle(array, i * 4);   
        }   
        return floatArr; 
}

输入数组是包含波形原始数据的数组(没有header)

问题是我得到(转换后)像这样的值:

-9.66012E+24, 1963.15576, -5.11384777E-36, -1.19718621E-07

如何将此数组转换为浮点数组,并且其 值应介于 -1.0 和 1.0 之间?

编辑:

我的输入数组是这样开始的:

byte[] {
    232,
    255,
    235,
    255,
    232,
    255,
    235,
    255,
    232,
    255,
    235,
    255,
    232,
    255,
    235,
    255,
...
}

你可以看看the implementation of WriteSample():

    public void WriteSample(float sample)
    {
        if (WaveFormat.BitsPerSample == 16)
        {
            writer.Write((Int16)(Int16.MaxValue * sample));
            dataChunkSize += 2;
        }
        ...

请注意它如何通过将 float 乘以 Int16.MaxValue 将其转换为 16 位有符号整数。这是因为内部数据格式是 -Int16.MaxValue 和 +Int16.MaxValue.

之间的有符号 16 位整数

这意味着您正在使用的值是 Int16(又名 short),您需要将它们除以 Int16.MaxValue 将它们转换回浮点数。

例如,给定您的样本输入:

byte[] bytes = { 232, 255, 235, 255, 232, 255, 235, 255, 232, 255, 235, 255, 232, 255, 235, 255 };

for (int i = 0; i < bytes.Length - 4; i += 4)
{
    float f = BitConverter.ToInt16(bytes, i) / (float)Int16.MaxValue; 
    Console.WriteLine(f);
}