在MATLAB上编写自己的fft2()函数

时间:2014-12-05 11:36:55

标签: matlab fft dft

  • 我想用减少的循环编写自己的2维DFT函数。

我尝试实现的是离散傅立叶变换: 2 Dimensional DFT

使用transform(实际指数函数)的可分性属性,我们可以将其写为两个1维DFT的乘法。然后,我们可以计算变换的行(下面的矩阵wM)和列(下面的矩阵wN)的指数项。然后,对于求和过程,我们可以将它们乘以" F = wM * original_matrix * wN"

这是我写的代码:

f = imread('cameraman.tif');

[M, N, ~] = size(f);
wM        = zeros(M, M);
wN        = zeros(N, N);

for u = 0 : (M - 1)
    for x = 0 : (M - 1)
        wM(u+1, x+1) = exp(-2 * pi * 1i / M * x * u);
    end    
end

for v = 0 : (N - 1)
    for y = 0 : (N - 1)
        wN(y+1, v+1) = exp(-2 * pi * 1i / N * y * v);
    end    
end

F = wM * im2double(f) * wN;

首先,我不想使用MxM和NxN次运行的2个循环。如果我使用巨大的矩阵(或图像),那将是一个问题。有没有机会让这段代码更快(例如消除循环)?

第二件事是显示傅立叶变换结果。我使用下面的代码显示变换:

% // "log" method
fl = log(1 + abs(F));
fm = max(fl(:));
imshow(im2uint8(fl / fm))

% // "abs" method
fa = abs(F);
fm = max(fa(:));
imshow(fa / fm)

当我使用" abs"方法,我只看到黑色的身影,没有别的。有什么问题" abs"你觉得哪种方法?

最后一件事是我将自己的函数的转换结果与MATLAB'进行比较。 s fft2()函数',我的显示比MATLAB更暗的数字'结果。我在这里错过了什么?实施误解?

我自己的功能的转换结果: The transform result of my own function

MATLAB fft2()函数的转换结果: enter image description here

2 个答案:

答案 0 :(得分:1)

我很高兴你解决了你的问题,但遗憾的是你的答案并不完全正确。确实它完成了这项工作,但正如我评论的那样,im2double会将所有内容规范化为1,从而显示您的缩放结果。您想要的是什么(如果您正在寻找性能)没有im2double然后乘以255,而是直接转换为double()

答案 1 :(得分:0)

您可以使用meshgrid消除循环。 例如:

M = 1024;
tic
[ mX, mY ] = meshgrid( 0 : M - 1, 0 : M - 1 );
wM1 = exp( -2 * pi * 1i / M .* mX .* mY );
toc
tic
for u = 0 : (M - 1)
    for x = 0 : (M - 1)
        wM2( u + 1, x + 1 ) = exp( -2 * pi * 1i / M * x * u );
    end    
end
toc
all( wM1( : ) == wM2( : ) )

我的系统时间是: 经过的时间是0.130923秒。 经过的时间是0.493163秒。