0

我编写了一个计算图像 DFT 的函数,我的目的是在不使用 fftshift 命令的情况下显示幅度谱。DFT_img.m 看起来像这样:

function f = DFT_img(a);
  [n m]=size(a);
  for i =1:n
    k=1;
    for j =1:n
      l=1;
      F(i,j)=(1/n*n)*a(i,j)*exp(-i*2*pi*(k*i+l*j)/n);
      l=l+1;
    end
    k=k+1;
  end
  f=F;

当我在命令行窗口中编写命令时

A = imread("lena.tiff");
ans = DFT_img(A);
spectrum = log(abs(ans));
mesh(spectrum)

我没有得到相同的结果

fftshift matlab函数

做 !!!我的功能是否有错误,或者问题出在哪里?

4

2 回答 2

1

您的代码根本不是 2D DFT。

编写 2D DFT 的最简单方法是对每一列执行 1D DFT,然后对结果的每一行执行 1D DFT。

在伪代码中:

temp = zeros(size(a));
f = zeros(size(a));

for i = (1:m)
    temp(:,i) = dft(a(:,i));
end

for j = (1:n)
    f(j,:) = dft(temp(j,:));
end
于 2013-05-25T09:43:17.673 回答
0

您的代码看起来不像 DFT,并且索引号存在一些问题:请注意,DFT 被定义为从 0:N-1 开始的复指数之和,而不是像在您的代码中那样从 1:N 开始。长话短说:试试这个功能(粘贴到 kmv_dft2.m 文件中):

function F =  kmv_dft2(f)

[M, N] = size(f);
F = zeros(M,N);

for k = 0:M-1
    for l = 0:N-1
        F(k+1,l+1) = dft_atomic_sum(f,k,l,M,N);
    end
end

%% computing a core of DFT2
function F_kl = dft_atomic_sum(f,k,l,M,N)

F_kl = 0;

for m=0:M-1
    for n=0:N-1
        F_kl = F_kl + f(m+1,n+1)*exp(-i*2*pi*( k*m/M   + l*n/N) );        
    end
end

现在检查一下并与 MATLAB FFT 实现进行比较

%%% input 2D signal
f = magic(5) 

%% Fast Fourier Transform
F_fft = fftshift(fft2(f))

%% Slow Discrete Fouriers Transform
F =  fftshift(kmv_dft2(f))

您可能想咨询有关fftshift函数的 MATLAB 帮助以及它的具体作用。这个fftshift函数在新手中一直是一个困惑的根源,我什至为我自己的学生写了一个简短的解释。

于 2014-10-01T08:25:57.530 回答