gpt4 book ai didi

iphone - 避免浮点运算

转载 作者:行者123 更新时间:2023-12-03 19:32:50 24 4
gpt4 key购买 nike

我为 iPhone 编写了一个小型软件合成器。为了进一步调整性能,我使用 Shark 测量了我的应用程序,发现我在 float/SInt16 转换上损失了大量时间。

因此,我重写了一些部分,通过预先计算返回“即用型”SInt16 示例的查找表来绕过转换。到目前为止效果很好。

目前,我正在尝试重写一些过滤器和我的 ADSR 信封实现,以仅使用整数算术,但我可以使用一些关于如何在没有 float 的情况下执行乘法/除法的技巧。
我的目标是 iPhone canonical format :

  • LPCM
  • 16 位整数样本

在不使用浮子的情况下将振幅应用于最终样本的好方法是什么?

编辑:
到目前为止我唯一想到的是,我可以通过右移当前样本来除以 2 的幂。

inBuffer[frame] = wavetable[i % cycleLengthInSamples] >> 4;

但我想不出任何优雅的方法来创建平滑的 ADSR 信封。

编辑2:感谢您的精彩回答!
我目前的做法:

  • 带上我所有的 ADSR 信封值进入正 SInt16 范围
  • 与波表中的当前值相乘(将中间值存储为 SInt32)
  • 将结果右移 16

这似乎有效:)

最佳答案

定点很好,因为在本例中您使用的是 16 位。最简单的方法是根据您需要的精度乘以 10 的幂。如果您可以使用 32 位整数作为中间值,您应该能够获得不错的精度。最后,您可以根据需要转换回 16 位 int、舍入或截断。

编辑:您想要向左移动,以使值更大。将移位结果存储为更精确的类型(32 或 64 位,具体取决于您的需要)。 如果您使用有符号类型,简单的移位将不起作用

如果要对两个定点数进行乘法或除法,请小心。相乘得到 (a*n) * (bn) 并且最终得到 abn^2 而不是 abn。除法是 (an)/(bn),即 (a/b) 而不是 ((an)/b)。这就是为什么我建议使用 10 的幂,如果你不熟悉定点,可以很容易地发现你的错误。

完成计算后,您将向右移回 16 位 int。如果你想变得更花哨,你也可以在移位之前进行舍入。

如果您确实对实现高效定点感兴趣,我建议您阅读一些内容。 http://www.digitalsignallabs.com/fp.pdf

关于iphone - 避免浮点运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1445369/

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