我在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)
答案 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个字节中使用了无类型参数,但您可能希望根据读取数据的方式来做不同的选择。
此外,假设此代码在一点字节序的机器上运行,也可以编写该代码。如果数据是小字节序,而机器是大字节序,则需要反转每组三个字节。