我有一系列c ++信号处理类,它们使用32位浮点作为主要的样本数据类型。例如,所有振荡器类都为所请求的每个样本返回浮点数。对于所有类,这都是相同的,所有样本的计算都是浮点数。
我正在将这些类移植到iOS ..并且为了性能问题,我想在8.24定点操作以充分利用处理器,有消息称iOS在处理整数而不是浮点数方面有很大的性能优势。我目前在浮点数中进行所有计算,然后在输出前的最后阶段转换为SInt32,这意味着最后阶段的每个样本都需要转换。
我是否只是将我的类中使用的数据类型从Float更改为SInt32。所以我的振荡器和滤波器等通过在内部传递SInt32而不是浮点数来计算固定点?
这真的很简单吗?或者我是否必须完全重写所有不同的算法?
在执行这项任务之前,我还需要了解其他伏都教吗?
非常感谢任何有时间对此发表评论的人。非常感谢..
答案 0 :(得分:2)
这主要是一个神话。如果在Thumb模式下编译为armv6
,浮点性能通常会很慢;这不是支持Thumb 2的armv7
中的问题(我将避免进一步讨论在Xcode中不再支持的armv6)。你也想避免使用双打,因为浮点数可以使用更快的NEON(也就是高级SIMD指令)单位 - 这很容易意外;尝试启用-Wshorten
。
我也怀疑你在8.24乘法时会有明显更好的表现,尤其是在使用NEON单元时。更改float
int
/ int32_t
/ SInt32
也不会自动为8.24倍数进行必要的转换。
如果您知道将浮点数转换为整数是缓慢的,请考虑使用Accelerate.framework中的一些函数,即vDSP_vfix16()或vDSP_vfixr16()。