我正在使用浮点数进行音频处理。结果需要转换回PCM样本,但是我发现从浮点数转换为整数的强制类型转换非常耗费时间。更加令人沮丧的是,我需要将结果剪切到短范围内(-32768至32767)。 虽然我通常会本能地认为这可以通过将浮点数转换为短整型来实现,但在Java中,这种方法失败了,因为在字节码级别上,它会产生F2I后跟I2S的结果。因此,不是简单的:
int sample = (short) flotVal;
我不得不使用这个丑陋的序列:
int sample = (int) floatVal;
if (sample > 32767) {
sample = 32767;
} else if (sample < -32768) {
sample = -32768;
}
有没有更快的方法来做这件事?
(大约总运行时间的6%似乎花费在转换上,虽然乍一看6%并不算太多,但当考虑到处理部分涉及大量矩阵乘法和IDCT时,这是令人震惊的)
编辑:上面的转换/剪辑代码(毫不奇怪)位于一个循环体中,该循环体从float[]读取浮点值并将它们放入byte[]中。我有一个测试套件,可以在几个测试用例上测量总运行时间(处理大约200MB的原始音频数据)。当将强制转换赋值“int sample =(int)floatVal”替换为将循环索引分配给样本时,从运行时差异中得出了6%。
编辑@leopoldkot:我知道Java中的截断,如原始问题所述(F2I,I2S字节码序列)。我之所以尝试将其转换为短整型,是因为我假设Java具有F2S字节码,但不幸的是它没有(最初来自68K汇编背景,其中简单的“fmove.w FP0,D0”将完全符合我的要求)。