从相位和幅度进行傅里叶变换 - Matlab

Dav*_*son 19 matlab signal-processing fft image-processing

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

Mag = sqrt(Real(F)^2 + Imaginary(F)^2)
Run Code Online (Sandbox Code Playgroud)

Phase = arctan(Imaginary(F)/Real(F))
Run Code Online (Sandbox Code Playgroud)

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

Real = Mag/sqrt(1 + tan(Phase)^2)
Run Code Online (Sandbox Code Playgroud)

Imaginary = Real*tan(Phase)
Run Code Online (Sandbox Code Playgroud)

最后组合和逆fft2:

F = Real + i*Imaginary
image = ifft2(F)
Run Code Online (Sandbox Code Playgroud)

我希望看到与输入相同的图像,但我得到了垃圾.我的数学错了吗?我的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;
Run Code Online (Sandbox Code Playgroud)

非常感谢 :)

nib*_*bot 19

您的功能是尝试同时测试两件事:(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;
Run Code Online (Sandbox Code Playgroud)

有效.所以问题在于复杂的数字操作.考虑当phase = 0或phase = 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;
Run Code Online (Sandbox Code Playgroud)

您必须这样做imagesc(abs(f))才能显示生成的逆变换图像,以摆脱(几乎为零)虚构组件.

获得复数的幅度和相位的更惯用的方法是简单地做:

mag = abs(F);
phase = angle(F);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.