- 我想编写自己的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