首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DFT Matlab函数

DFT Matlab函数
EN

Stack Overflow用户
提问于 2013-05-25 09:39:06
回答 2查看 4.9K关注 0票数 0

我编写了一个函数来计算图像的DFT,我的前提是不用fftshift命令显示振幅谱。DFT_img.m看起来是这样的:

代码语言:javascript
复制
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;

当我在命令窗口中写入命令时

代码语言:javascript
复制
A = imread("lena.tiff");
ans = DFT_img(A);
spectrum = log(abs(ans));
mesh(spectrum)

我得到的结果和

fftshift matlab函数

真的!我是在功能上出错了,还是哪里出了问题?

EN

回答 2

Stack Overflow用户

发布于 2013-05-25 09:43:17

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

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

伪码:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-10-01 08:25:57

您的代码看起来不像DFT,并且在索引编号方面有一些问题:注意,DFT定义为从0:n到1的复指数的和,而不是像代码中的1:N。长话短说:尝试这个函数(粘贴在kmv_dft2.m文件中):

代码语言:javascript
复制
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实现进行比较。

代码语言:javascript
复制
%%% input 2D signal
f = magic(5) 

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

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

您可能想咨询MATLAB的帮助关于fftshift函数和它到底做了什么。这个fftshift函数是新手和我自己的学生对此经常感到困惑的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16748266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档