【发布时间】:2018-12-17 09:55:23
【问题描述】:
我正在努力在 iOS (swift) 上重新实现 python 代码。
我需要对一维数据块进行 fft(numpy 样式)。每个大小为 1050(窗口音频数据)。
谢天谢地,我找到了有关如何以 numpy 样式 (link) 执行 iOS fft 的相关解释和代码。
但是,我被困在加速框架仅支持在 power of 2 input data length(或 more recently,f * 2^n,其中 f 为 3、5 或 15 且 n 至少为 3)上执行 fft 的地方。
我在窗口大小 1050 上测试了我的 python 代码。非常适合我的用例。但由于上述限制,在 iOS 上实现并不简单。
深入研究 numpy c 代码以了解他们是如何在非两个长度的幂的情况下做到这一点并不容易。这个answer 对我来说是一个很好的起点,但仍然没有得到它。
这里的速度也很重要,这就是我不考虑蛮力 dft 的原因。
非常感谢这里的任何指导。
【问题讨论】:
-
numpy 风格是什么意思?至于数据,Accelerate框架只支持2^N长度的数据。有一些用于 FFT 的 Swift 框架,但其中许多都基于 Accelerate。您可以使用一些 C 库来试试运气——比如支持任意长度数据的 Fastest Fourier Transform in the West
-
我的意思是 fft 在 python 的 numpy 库中是如何实现的。 fft 的不同实现使用不同的约定,例如零填充或其他一些调整,这有时取决于输入数据的长度。
-
无论使用何种算法,任何 FFT 实现都会产生相同的结果。 FFT 是确定性的,它不是 DFT 的近似值 - 它是 DFT,只是计算得更快。坚持它的计算方式与 numpy 相同是没有意义的。
-
@mag_zbc Accelerate 支持 c*2^n 形式的长度,其中 c 为 1、3、5 或 15 (developer.apple.com/documentation/accelerate/…)
-
(但这对@msuliman 1050 = 2*3*5*5*7 的帮助不大。)
标签: ios swift numpy fft accelerate-framework