我编写了一个函数来计算图像的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函数
真的!我是在功能上出错了,还是哪里出了问题?
发布于 2013-05-25 09:43:17
您的代码根本不是2D DFT。
编写2D DFT的最简单方法是对每个列执行一维DFT,然后对结果的每一行执行一维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发布于 2014-10-01 08:25:57
您的代码看起来不像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))您可能想咨询MATLAB的帮助关于fftshift函数和它到底做了什么。这个fftshift函数是新手和我自己的学生对此经常感到困惑的原因。
https://stackoverflow.com/questions/16748266
复制相似问题