使用 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 框架的源代码构建 NumPy?