2014-12-05 405 views
2
  • 我想编写自己的2维DFT函数并减少循环。

我尝试实现是离散傅立叶变换: 2 Dimensional DFT在MATLAB上编写自己的fft2()函数

使用变换的可分特性(实际上指数函数),我们可以把这种情况视为两个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; 

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

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

% // "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的fft2()函数进行比较时,我的显示比MATLAB的结果更暗。我在这里错过了什么?实施错误?

变换我自己的函数结果: The transform result of my own function

变换MATLAB FFT2()函数的结果: enter image description here

+1

对于“黑色图像”和较暗的结果,尝试在'imshow(image,[])'中添加方括号。这将相应地缩放结果。这可能会做到。 – kkuilla 2014-12-05 11:55:46

+0

@kkuilla我已经尝试过,但不幸的是它没有工作:/ – mehmet 2014-12-05 12:02:05

+1

你确实有缩放问题。尝试做一个分开的对话,它可能会让你对一些缺少的东西有所了解。它看起来像FFT本身是rigth,但规模worng – 2014-12-05 12:56:07

回答

1

我很高兴你解决你的问题,但不幸的是你的回答是不完全正确的。确实如此,但是正如我所评论的那样,im2double会将所有内容标准化为1,因此会显示您的缩放结果。你想要什么(如果你正在寻找性能)不是在做im2double然后乘以255,而是直接投射到double()

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秒。