1

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

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

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

对于 16 位 wav:波形帧为 -32768 之间的 2s 互补二进制;0x8000 和 32767;0x7FFF)

4

1 回答 1

1

您提供的链接在我看来是错误的。当然,24 位格式使用标准的二进制补码算法。在这种情况下0x7FFFFF表示-83886080x800000表示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 个字节使用了无类型参数,但您可能希望根据读取数据的方式不同地执行此操作。

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

于 2019-05-22T15:26:55.507 回答