如何将小端顺序的3个字节转换为从-1到+1的浮点数

how to convert 3 bytes in little endian order to a floating number from -1 to +1

我在小端有 3 个字节。 它们是:顶部、中间和底部(从第 23 位到第 0 位) 如何将它们转换为从 -1 到 +1 的浮点数?

3个字节是little-endian因为wav中有字符串RIFF 所以最小值为 (0x7FFFFF),最大值为 (0x800000)

http://www.labbookpages.co.uk/audio/javaWavFiles.html

for a 16 bit wav: wave frames are in 2s complementary binary between -32768; 0x8000 和 32767; 0x7FFF)

我觉得你提供的 link 不对。当然 24 位格式使用标准 two's complement arithmetic。在这种情况下,0x7FFFFF 表示 -83886080x800000 表示 8388607

在此基础上,您使用此函数将三个字节转换为带符号的整数值:

function TwosComplement24(const Bytes): Integer;
begin
  Result := 0;
  Move(Bytes, Result, 3);
  Result := (Result and fffff) - (Result and 0000);
end;

完成后,您可以像这样转换为浮点值:

function Sample24toReal(const Bytes): Double;
begin
  Result := TwosComplement24(Bytes) / 8388608;
end;

我为 3 个字节使用了一个无类型参数,但您可能希望根据读取数据的方式采用不同的方式。

另外,这段代码是假设它在小端机器上运行而编写的。如果数据是小端,而机器是大端,那么你需要反转每组三个字节。