- 我想編寫自己的2維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的結果更暗。我在這裏錯過了什麼?實施錯誤?
變換我自己的函數結果:
變換MATLAB FFT2()函數的結果:
對於「黑色圖像」和較暗的結果,嘗試在'imshow(image,[])'中添加方括號。這將相應地縮放結果。這可能會做到。 – kkuilla 2014-12-05 11:55:46
@kkuilla我已經嘗試過,但不幸的是它沒有工作:/ – mehmet 2014-12-05 12:02:05
你確實有縮放問題。嘗試做一個分開的對話,它可能會讓你對一些缺少的東西有所瞭解。它看起來像FFT本身是rigth,但規模worng – 2014-12-05 12:56:07