将原始字节数据转换为 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);
}
如果我做对了,我不会这样做,但我正在使用此方法将字节数组转换为浮点数组,如 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.
这意味着您正在使用的值是 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);
}