【问题标题】:Getting Fourier Transform from Phase and Magnitude - Matlab从相位和幅度获得傅里叶变换 - Matlab
【发布时间】:2011-09-17 14:33:39
【问题描述】:

傅立叶变换F的幅值和相位定义为:

Mag = sqrt(Real(F)^2 + Imaginary(F)^2)

和

Phase = arctan(Imaginary(F)/Real(F))

我尝试编写 matlab 代码,该代码接收灰度图像矩阵,对矩阵执行 fft2(),然后根据变换计算幅度和相位。然后我希望计算傅立叶变换的虚部和实部。这是通过将前两个方程重新排列为:

Real = Mag/sqrt(1 + tan(Phase)^2)

和

Imaginary = Real*tan(Phase)

最后合并和逆fft2:

F = Real + i*Imaginary
image = ifft2(F)

我希望看到与输入相同的图像,但我得到了垃圾。我的数学错了吗?我的matlab mfile代码如下:

function y = forwardBackwardFFT(image)

F = fft2(image);
mag = sqrt(real(F).^2 + imag(F).^2);
phase = atan(imag(F)./real(F));

re = sqrt((mag.^2)./(1 + tan(phase).^2));
im = re.*tan(phase);
F = re + i*im;
f = ifft2(F);

subplot(1,2,1);
imshow(image);
Title('Original Image');

subplot(1,2,2);
imshow(f);
Title('Image after forward and backward FFT');
y = f;

非常感谢:)

【问题讨论】:

    标签: matlab image-processing signal-processing fft


    【解决方案1】:

    您的函数试图同时测试两件事:(1) 对图像进行 FFT 和逆 FFT,以及 (2) 将复数分解为实部和虚部,转换为幅度和相位,然后将其重新组合在一起再次。您应该分别测试这两个函数中的每一个,而不是一次尝试整个事情并想知道它为什么不起作用。

    要测试ifft(fft(image)) 是否返回原始图像,您可以删除或注释掉所有复数操作:

    function y = forwardBackwardFFT(image)
    
    F = fft2(image);
    %# stuff removed
    f = ifft2(F);
    
    subplot(1,2,1);
    imshow(image);
    title('Original Image');
    
    subplot(1,2,2);
    imshow(f, []);
    title('Image after forward and backward FFT');
    y = f;
    

    这有效。所以问题出在你的复数操作上。考虑当相位=0 或相位=pi/2 时会发生什么。 0的正切为0,导致被零除;并且 tan(pi/2) 是无限的。

    下面是一些有效的代码:

    mag =  sqrt(real(F).^2 + imag(F).^2);
    phase = atan2(imag(F),real(F));
    
    re = mag .* cos(phase);
    im = mag .* sin(phase);
    F = re + 1i*im;
    

    您必须执行imagesc(abs(f)) 才能显示生成的逆变换图像,以消除(几乎为零)虚部。

    获取复数幅度和相位的更惯用方法是:

    mag = abs(F);
    phase = angle(F);
    

    希望这会有所帮助。

    【讨论】:

    • 啊,非常感谢!棒极了。 atan(im./re) 和 atan2(im,re) 之间的最大区别是什么?昨天我尝试了同样的事情,从 mag、cos 和 sin 中得到 re 和 im,但它仍然给了我垃圾。根据您对 atan2() 的建议,它可以工作。非常感谢:)
    • @nibot 对不起,好久没来了。刚刚选择它作为接受的答案
    • 仅供参考;对于这种类型的东西 angle 和 atan2 返回相同的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多