Floating point 从ByteArray读取的浮点值似乎错误/不合理
上下文: 我在AS3中开发的应用程序需要一个音频库,它可以将多个音频文件混合到一个音频文件中,应用淡入淡出、缩短音频、循环并用空噪波填充。在做了一天的研究之后,我在AS3中找不到任何合适的库可以这样做,所以我开始开发自己的库 该库的功能是直接处理波形的浮点值,即我使用Floating point 从ByteArray读取的浮点值似乎错误/不合理,floating-point,precision,actionscript,Floating Point,Precision,Actionscript,上下文: 我在AS3中开发的应用程序需要一个音频库,它可以将多个音频文件混合到一个音频文件中,应用淡入淡出、缩短音频、循环并用空噪波填充。在做了一天的研究之后,我在AS3中找不到任何合适的库可以这样做,所以我开始开发自己的库 该库的功能是直接处理波形的浮点值,即我使用Sound.extract()将MP3转换为波形。任何提取都是在小块中完成的,以避免过度使用内存。除了混合过程,库的大部分功能(剪辑、淡入、剪切、循环、填充)都可以正常工作 问题: mix函数接受任意数量的源(ByteArray持有
Sound.extract()
将MP3转换为波形。任何提取都是在小块中完成的,以避免过度使用内存。除了混合过程,库的大部分功能(剪辑、淡入、剪切、循环、填充)都可以正常工作
问题:
mix函数接受任意数量的源(ByteArray持有一个32位浮点序列),读取所有浮点,将它们相加,并将结果写入输出,然后在超出范围(1.0,-1.0)时对输出进行剪裁,如本文所述:
以下是混合函数:
public function mix(sources:Vector.<ByteArray>):ByteArray
{
var mixedBA:ByteArray = new ByteArray();
var expectedLengthInBytes:uint = sources[0].length;
var floats:Vector.<Number>;
var floatSum:Number;
for each (var byteArray:ByteArray in sources)
{
byteArray.position = 0;
if (byteArray.length != expectedLengthInBytes)
{
throw new Error("Parameter sources are not all the same length (bytes)!");
}
}
var floatCount:uint = expectedLengthInBytes / FLOAT_SIZE_IN_BYTES;
for (var i:uint = 0; i < floatCount; i++)
{
floats = new Vector.<Number>();
floatSum = 0;
for each (var source:ByteArray in sources)
{
floats.push(source.readFloat());
}
for each (var float:Number in floats)
{
floatSum += float;
}
mixedBA.writeFloat(floatSum);
}
var clippedBA:ByteArray = clip(mixedBA);
return clippedBA;
}
公共函数组合(来源:Vector.):ByteArray
{
var mixedBA:ByteArray=newbytearray();
var expectedLengthInBytes:uint=sources[0]。长度;
变量浮动:向量。;
var floatSum:数字;
对于每个(变量byteArray:源中的byteArray)
{
byteArray.position=0;
if(byteArray.length!=预期长度单位)
{
抛出新错误(“参数源的长度(字节)不尽相同!”;
}
}
var floatCount:uint=expectedLengthInBytes/浮点大小(以字节为单位);
对于(变量i:uint=0;i
这只适用于少数几个音源,但当您开始将大量声音混合在一起时,ByteArray.readFloat()
函数似乎开始返回错误的浮点值,远远超出范围,从-7000.00000到1.1237128321E128(AS3似乎解释为1123712832131)到56869.0000(您知道了)
问题:
根据Adobe docsByteArray.readFloat()
返回一个32位浮点值,但将其存储在一个表示64位浮点值的数字中。此外,ByteArray.writeFloat()
还写入32位浮点,但同样采用表示64位浮点的数字
这种精度转换会产生这些极值吗?或者我找错地方了,而实际上,
Sound.extract()
中有错误(似乎不太可能,因为我提到只混合几个声音就可以了)试着打印出字节的十六进制值,无论是在“混合”之前还是之后。(如果您仍希望保留此问题,请将此信息包含在问题中。)另外,请阅读IEEE浮点表示法。对于数值运算,输入值必须是正确的类型,运算结果才有意义。如果不知道二进制表示(十六进制值),当前形式的问题是无法回答的。不正确的浮点值只表明存在问题,但无助于解决问题。字节数组从何而来?你有没有可能遇到大/小endian问题?