使用 Apple Accelerate 框架选择实数和复数 2D FFT

Posted

技术标签:

【中文标题】使用 Apple Accelerate 框架选择实数和复数 2D FFT【英文标题】:Choosing Real vs Complex 2D FFTs using apple Accelerate framework 【发布时间】:2012-12-15 03:56:53 【问题描述】:

谁能建议使用正确的 FFT(实数或复数)?我看过here,但仍有疑问。

我想做图像关联来识别子图像在主图像中的位置。我了解 FFT 和 iFFT 的基础知识。

计划:

    对主映像执行 FFT。 512x512 对子图像进行复共轭。 对子图像执行 FFT。 30x30,但用零填充到 512x512 将两个结果矩阵相乘 对结果执行 iFFT 即使结果应该(大部分)是实数,也要取结果矩阵的大小 寻找对应于最大相关性的最大值。

我无法获得预期的结果。

如果我使用真正的 2d fft (vDSP_fft2dzrip),结果是压缩格式,这使得很难使用 vDSP_zvmul 乘以两个结果矩阵。

如果我使用复数 fft (vDSP_fft2dzip),我根本无法获得任何相关性。

苹果示例和大多数音频示例对正向 FFT 的结果没有任何作用,除了逆向。

谁能帮助我开始使用图像关联?第一个问题...我可以使用复杂的 FFT 并避免打包格式吗?

【问题讨论】:

【参考方案1】:

实数和复数 FFT 之间的唯一区别在于,实数 FFT 可以通过使用将 2^n 实数 FFT 转换为 2^(n-1) 复数 FFT 的巧妙打包方案稍微更有效。两种情况下的结果应该相同。因此,如果我是您,为了简单起见,我会坚持使用复杂的 FFT,至少在您一切正常之前。

你也看过vImageConvolve_ARGB8888吗?它似乎可以做你想做的事,而且省力:)

【讨论】:

我试图在不确定的环境中识别街道标志,当我尝试 vImageConvolve 时,图像的白色区域使目标图像过载。我不确定如何对卷积进行归一化,因此决定尝试频域方法。 vImageConvolve 函数肯定会使用频域实现,这是对非平凡图像实现该算法的唯一实用方法。也许您可以尝试浮动变体,或者先缩放图像? vImageConvolve 的文档说它正在做 Kernel(x,y) * Pixel(x,y) / M x N 的总和。我相信它在空间模式下进行卷积.它将目标滑过大图像并计算每个点的平均值。白色区域覆盖和细节区域。我确实在两张图像上都尝试了 Sobel 边缘检测,但树的边缘太多,它也不起作用。 无论算法是在空间域还是频域执行,结果都会几乎完全一样。唯一的区别是到达那里所需的时间。 回答了原来的问题。如果您不担心速度,使用“真正的”FFT 没有任何优势。

以上是关于使用 Apple Accelerate 框架选择实数和复数 2D FFT的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apple Accelerate 框架的希尔伯特变换(分析信号)?

为什么Apple Accelerate框架有时会很慢?

如何从链接到 Apple Accelerate 框架的源代码构建 NumPy?

Apple Accelerate vDSP fft vs DFT 和比例因子

使用 Accelerate 框架的对称带矩阵的特征值

iOS Accelerate Framework vImage - 性能改进?