请注意,对于简单的2D DFT而不是O(N2logN)O(N4)
也就是说,既然你提到你想沿着类似雷达的模式的波束获取频谱信息,听起来你真的对计算每个这样的波束的 1D FFT 更感兴趣。在这种情况下,对于个光束,计算复杂度将是。MO(MNlogN)
作为说明,让我们处理下图:
我们将使用以下示例 matlab 代码从中提取一组M
% Number of beams to extract
M = 200;
% Convert the input image "img" to polar coordinates
c = size(img)/2+1;
N = max(size(img));
angles = 2*pi*[0:M-1]/M;
radius = [0:floor(N/2)-1];
imgpolar = zeros(length(radius), length(angles));
for ii=1:length(radius)
xi = min(max(1, floor(c(2)+radius(ii)*cos(angles))), size(img,2));
yi = min(max(1, floor(c(1)-radius(ii)*sin(angles))), size(img,1));
imgpolar(ii,:) = img(sub2ind(size(img), yi, xi));
end
% Compute the FFT for each beam angle
ImgFD = fft(imgpolar,[],1);
figure(1);
freqs = [0:size(ImgFD,1)-1]/size(ImgFD,1);
surf(angles, freqs, 10*log10(abs(ImgFD)+1), 'EdgeColor', 'None');
view(2);
colormap("gray");
xlabel('Beam angle (radians)');
ylabel('Normalized frequency');
产生:
可以将其折叠为作为光束角度函数的振幅总和,以给出:
SumAmplitudes = sum(abs(ImgFD),1);
figure(2);
hold off; plot(angles, 10*log10(SumAmplitudes+1));
xlabel('beam angle (radians)');
ylabel('Sum of amplitudes (dB)');
作为旁注,如果您可以使用沿这些光束的幅度平方和(而不是幅度之和),那么由于Parseval 定理,您可以直接在空间域中执行此操作(这将使计算复杂度降低到O(MN),主要是转换为极坐标)。使用以下代码可以看到等价(对于幅度平方和):
% Compare the result of square amplitude summation in the frequency domain vs spatial domain
SumFD = sum(abs(ImgFD).^2,1)/size(ImgFD,1);
SumSD = sum(abs(imgpolar).^2,1);
figure(3);
hold off; plot(angles, 10*log10(SumFD+1), 'b');
hold on; plot(angles, 10*log10(SumSD+1), 'r:');
xlabel('beam angle (radians)');
ylabel('Sum of squared amplitudes (dB)');
legend('Frequency domain', 'Spatial domain', "location", "southwest");
请注意在空间域和频域中计算的曲线的重叠:
更新:
如果您实际上正在计算 2D 频率图中类似雷达的波束,正如您在另一篇文章中所建议的那样,那么您最好回到执行 2D FFT,这将是有序的O(N2logN). 然后,您可以将频率系数之和转换为极坐标形式,这将增加一个小的O(N2),所以结果仍然以 2D FFT 为主。