通过FFT创建的较小频率空间的IFFT的比例校正

时间:2017-02-16 17:24:49

标签: matlab fft scaling ifft

这可能被视为this question的转贴,但我正在寻求对此问题进行更深入的解释以及如何正确解决此问题。

我想研究44x44矩阵中体素的PSF / SRF。为此,我创建了一个更大的矩阵(4400x4400),因此较小矩阵中的1个体素对应于较大矩阵中的100x100体素。我将值设置为100 ^ 2个体素中的1个。

现在我对大矩阵进行FFT,并对频率空间的中心部分(44x44)进行IFFT。这是代码:

A = zeros(4400,4400); 
A(2201:2300,2201:2300) = 1;
B = fftshift(fft2(A));
C = ifft2(ifftshift(B(2179:2222,2179:2222)));
D = numel(C)/numel(B) * C;

figure, subplot(1,3,1), imshow(A), subplot(1,3,2), imshow(real(C)), subplot(1,3,3), imshow(real(D));

问题如下:我希望新44x44矩阵的体素值为1.但是,使用这个数字因子校正它们会减少到0.35。如果我不应用修正,他们会达到巨大的价值。

1 个答案:

答案 0 :(得分:0)

对于初学者,让我试着澄清缩放问题:对于DFT / IDFT,有关输入大小的各种缩放约定。您要么在DFT 中需要1 / N的因子,要么在IDFT 中需要1 / N因子,或者在两者中需要1 / sqrt(N)因子。所有人都有利有弊,所有人都同样有效。

Matlab使用IDFT约定中的1 / N as you can see in the documentation

在您的示例中,前向DFT的大小为4400,后向IDFT的大小为44.因此,IDFT缩放比匹配前向变换的因子小100,因此您的值也是100的因子大。由于您正在进行2-D DFT / IDFT,因子100缺失两次,因此您的重新缩放应为100 ^ 2。你的数字(C)/数字(B)就是这样,我只是试图给你解释它。

您可能看不到1的原因是您只绘制了反DFT的实部。由于你进行了一些移位,你可能已经引入了一个阶段,因此信号的一部分位于虚部。

编辑:另一个原因是您在转换回来之前将B截断到中心44 x 44窗口。由于A不受带宽限制,B也有能量在此窗口之外。截断你正在失去一部分。因此,产生的振幅较低并不奇怪。

这是放大B图像以显示此现象:

Zoom on B

红色方块是你保留的,其他一切都被截断了。由于Parsevals定理,图像和傅里叶域中的总能量相等,因此通过截断,您还必须降低图像域中信号的能量。