1

如果我做对了,我不会这样做,但是我正在使用这种方法将字节数组转换为浮点数组,如以下链接所示:

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; 
}

输入数组是一个包含波形原始数据的数组(没有标题)

问题是我得到(转换后)值,例如:

-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,
...
}
4

1 回答 1

3

您可以查看以下实现WriteSample()

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

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

这意味着您正在使用的值是Int16(aka 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);
}
于 2017-05-22T11:26:39.150 回答