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

时间:2019-05-22 10:15:24

标签: numbers lazarus floating 24-bit

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

3个字节为小尾数,因为wav中有字符串RIFF 因此最小值为(0x7FFFFF),最大值为(0x800000)

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

对于16位WAV:波形帧在-32768之间以2s补码二进制形式存在; 0x8000和32767; 0x7FFF)

1 个答案:

答案 0 :(得分:1)

您提供的链接对我来说似乎是错误的。当然,24位格式使用标准的two's complement arithmetic。在这种情况下,0x7FFFFF代表-8388608,而0x800000代表8388607

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

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

一旦设置好,就可以转换为这样的浮点值:

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

我在3个字节中使用了无类型参数,但您可能希望根据读取数据的方式来做不同的选择。

此外,假设此代码在一点字节序的机器上运行,也可以编写该代码。如果数据是小字节序,而机器是大字节序,则需要反转每组三个字节。