二维FFTW帮助

4

我目前正在尝试通过fftw_plan_dft_2d计算图像的fft。

为了使用这个函数,我将图像数据线性化成一个输入数组,并调用上面提到的函数(详见下文)。

ftw_plan fftw_plan_dft_2d(int n0, int n1,
                            fftw_complex *in, fftw_complex *out,
                            int sign, unsigned flags);

该函数修改一个大小与原始图像像素数相等的复杂数组out。

您是否知道这是计算图像2D FFT的正确方法?如果是,那么out中的数据代表什么?即,该数组中哪些是高频值,哪些是低频值?

谢谢, djs22

2个回答

6
一个二维FFT等同于在一个操作中将1D FFT应用于图像的每一行,然后对第一次操作的输出的所有列进行1D FFT。
2D FFT的输出与1D FFT的输出非常相似,只不过您有复杂的幅度在x、y维度上而不是单个维度。随着x和y索引的增加,空间频率也会增加。
FFTW手册中有一个部分(这里),涵盖了实际数据的实际到复杂的二维FFT输出数据的组织形式,假设这是您正在使用的方式。

谢谢你的回答。我遇到的问题是这个二维FFT返回一个一维数组。将其重新配置为适当大小的二维数组很容易,但我还不太确定如何处理数据。<br/>我相当确定这意味着我的最低频率内容将位于左上角,而较高频率内容将位于右下角?<br/>关于手册中的那一部分,正如你所说,那明确是针对实数到复数函数的,但不幸的是我正在使用fftw_plan_dft_2d。 - djs22
@djs22:好的 - 这个数组实际上不是一维的,它是按行主序排列的n0 x n1 - 请参阅FFTW手册的第2.2节。 - Paul R

0

没问题。 尝试计算两个方案:

plan1 = fftw_plan_dft_2d(image->rows, image->cols, in, fft, FFTW_FORWARD, FFTW_ESTIMATE); 
plan2 = fftw_plan_dft_2d(image->rows, image->cols, fft, ifft, FFTW_BACKWARD, FFTW_ESTIMATE);

你将在ifft中获得原始数据。

希望能帮到你 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接