gpt4 book ai didi

java - 性能: float 转换为整数并将结果裁剪到范围

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:41:15 26 4
gpt4 key购买 nike

我正在用 float 做一些音频处理。结果需要转换回 PCM 样本,我注意到从 float 到 int 的转换非常昂贵。更令人沮丧的是,我需要将结果限制在一个短的范围内(-32768 到 32767)。虽然我通常会本能地假设这可以通过简单地将 float 转换为 short 来确保,但这在 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”被分配循环索引到 sample 时,运行时差异得出 6% 的结论。

  • 编辑 @leopoldkot:我知道 Java 中的截断,如原始问题(F2I、I2S 字节码序列)中所述。我只是尝试了简短的转换,因为我假设 Java 有一个 F2S 字节码,不幸的是它没有(最初来自 68K 汇编背景,一个简单的“fmove.w FP0,D0”就可以完成我想要的) .

最佳答案

对于在范围内的值,您可以将两个比较变成一个比较。这可以将成本减半。如果该值太负,目前您只执行一次比较。 (这可能不是您的典型案例)

if (sample + 0x7fff8000 < 0x7fff0000)
sample = sample < 0 ? -32768 : 32767;

关于java - 性能: float 转换为整数并将结果裁剪到范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2922759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com