如何在matlab中从DFT谱中求出峰值(r,θ)?

如何在matlab中从DFT谱中求出峰值(r,θ)?,matlab,fft,spectrum,Matlab,Fft,Spectrum,假设我有一个矩阵M 我对它应用DFT并将它移到中心 img_fft = fft2(double(M)); img_spec = abs(img_fft); img_shift = fftshift(img_spec); 然后根据我的问题,我如何才能找到光谱的峰值,即峰值的(u,v)? 非常感谢 用于确定图像中最大值出现的位置。然而,问题是忽略DC值,它很可能是迄今为止光谱中最大的成分。因此,您应该找到最大值,即当前的DC值,并将其设置为NaN。一旦您这样做,下一个最大值就是您要搜索的答案 因此

假设我有一个矩阵M 我对它应用DFT并将它移到中心

img_fft = fft2(double(M));
img_spec = abs(img_fft);
img_shift = fftshift(img_spec);
然后根据我的问题,我如何才能找到光谱的峰值,即峰值的(u,v)? 非常感谢

用于确定图像中最大值出现的位置。然而,问题是忽略DC值,它很可能是迄今为止光谱中最大的成分。因此,您应该找到最大值,即当前的DC值,并将其设置为
NaN
。一旦您这样做,下一个最大值就是您要搜索的答案

因此,请首先执行以下操作:

idx = find(img_shift == max(img_shift(:)));
img_shift(idx) = NaN;
如果将此处的最大值设置为
NaN
,则下次调用
find
,它将忽略此位置,并在搜索最大值时跳过此位置。现在,再次调用
find

[u,v] = find(img_shift == max(img_shift(:)));
这里,
u
将是图像的水平位置,
v
将是垂直位置。现在,这将正确返回不是DC值的最大峰值。但是,这与中心无关,因为您已经移动了图像,因此一旦完成上述操作,您需要执行以下操作:

[rows, cols] = size(img_fft);

u = u - floor(rows/2);
v = v - floor(cols/2);
现在,这将把原点移到图像的中心,这样就可以找到相对于图像中心的最大峰值

您现在可以根据您的问题使用
u
v
来确定
r
theta
。换言之:

r = sqrt(u^2 + v^2);
theta = atan2(v, u);

根据您的评论,一个小提示是您遇到了两个共享最大值的值。这是因为光谱是对称的。在执行
查找
之后,您将得到两个答案。因此,任何一个答案都会给出正确的结果。您可以选择
r,theta
对中的任意一对,也可以修改
find
语句,使其只返回一个答案。换句话说,请执行以下操作:

[u,v] = find(img_shift == max(img_shift(:)), 1);

注意末尾的第二个参数
1
。这意味着只返回一个结果。

OMG!你真是天才!你怎么能学到这么多matlab技术!如果r和θ都出现2个值怎么办?我发现我的矩阵中有一个,r和θ给出了2X1矩阵results@Iamrubbishinprogramming-啊,是的。那是因为光谱是对称的。选择
r
theta
对中的任意一个,它将为您提供正确的结果。因此,
r(1)
theta(1)
将是一个答案,
r(2)
theta(2)
将是另一个答案。哦,我猜是这样的!谢谢,爱慕@rayryeng@Iamrubbishinprogramming-我已编辑了我的答案。看看它是否有用!