【问题标题】:DFT Matlab functionDFT Matlab函数
【发布时间】:2013-05-25 09:39:06
【问题描述】:

我编写了一个计算图像 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函数

确实! 我是不是函数有错误,或者问题出在哪里?

【问题讨论】:

    标签: image matlab dft spectrum


    【解决方案1】:

    您的代码根本不是二维 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
    

    【讨论】:

    • 我不明白!!在这种情况下,什么是“dft”
    • 它显示错误! 'double' 类型的输入参数的未定义函数 'dft'。 DFT_img2 中的错误(第 6 行) temp(:,i) = dft(a(:,i));
    • @user2287999:是的,它是伪代码!您需要实现一个名为 dft 的函数。
    • 我的任务是使用这个公式 F(i,j)=(1/nn)*a(i,j)*exp(-i*2*pi*(k i+l*j)/n);在我以这种方式创建的图像中执行 DFT: % 在图像中间画一个正方形 % m - 图像高度 % n - 图像宽度 % k - 正方形函数的维度 f = Kat(m, n,k) A = 零(m,n); A(m/2-k:m/2+k,n/2-k:n/2+k)=1; f=A;结束
    • @user2287999:该公式不正确。应该是F(k,l) = ...
    【解决方案2】:

    您的代码看起来不像 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 函数在新手中经常引起混淆,而I even wrote a short explanation 让我自己的学生对此感到困惑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多