iOS 上的 fft numpy 风格以非两个数据长度的幂加速

Posted

技术标签:

【中文标题】iOS 上的 fft numpy 风格以非两个数据长度的幂加速【英文标题】:fft numpy style on iOS accelerate with non power of two data length 【发布时间】: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 的帮助不大。) 【参考方案1】:

IIRC,对于 fft,引擎盖下,numpy 使用 fftpack,一个旧的 NCAR Fortran 数学库的 C 转换。实际的 numpy fft 没有在 Python 代码中实现。您很可能使用 Xcode 编译一些 fftpack C 代码,并使用桥接头从 iOS Swift 代码中调用它。

【讨论】:

【参考方案2】:

您的答案/cmets 指导我使用 c/c++ 代码来获得所需的结果。 (我最初并不认为这是一种选择)。

我最终使用了opencv dft 函数(它在内部实现了 fft),它产生了与 numpy 的 fft 相似的结果(+ 根据他们的文档,它比 numpy 快)。

【讨论】:

以上是关于iOS 上的 fft numpy 风格以非两个数据长度的幂加速的主要内容,如果未能解决你的问题,请参考以下文章

Numpy fft 冻结更长的样本

Python NumPy 将 FFT 转换为文件

Scipy 频谱图与多个 Numpy FFT

Spark 以非连接列上的条件连接

Numpy | 23 IO

返回 Numpys FFT 的数据并在音频文件中找到每秒的幅度和频率