2014-12-05 120 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秒。