离散傅里叶变换DFT
这位肖畅大哥讲的好:通俗解释离散傅里叶变换
模拟DFT
close all;
n = 0:1:39; %40个离散点
A = cos(2*pi*2*n/40); %待测频率
sum = zeros(1,40);
for freq = 0:39 %40个基信号
B = cos(2*pi*freq*n/40);
C = A.*B; %待测频率与基信号乘积
for num = 1:40 %乘积求和
sum(freq+1) = sum(freq+1) + C(num);
end
end
figure;
stem(n,A);
title('待测频率-时域信号');
figure;
stem(n,sum);
title('模拟DFT-频域信号');
解释频域图的含义:
1.频率分成40份,这是分别是基信号,0—39/40*2π(0-39)。
2.除了信号2/40*2π和38/40*2π以外,其他都为0,其中38/40*2π也可以写成2π-38/40*2π=-2/40*2π。就是说模拟DFT的结果是:检测出了待测信号的频率和负频率。
3.对比FFT结果(代码和结果图):
n = 0:1:39;
A = cos(2*pi*2*n/40);
B = fft2(A);
figure;
stem(abs(B));
title('FFT-频域信号');
C = fftshift(B); %把38/40移到-2/40
figure;
stem(abs(C));
title('频移后');
与模拟DFT有一点不同:FFT横坐标是1—40,模拟DFT是0—39。
另外一点要注意的是:FFT频移后,没有显示负频率,所以看图的时候注意,把x=21看做0频率。
抽样后的频谱幅值是原来的1/X
A = zeros(1,40); %保证频域为40刻度
n = 0:2:39; %每两个点抽样一个
A(n+1) = cos(2*pi*2*n/40);
B = fftshift(fft2(A)); %FFT+频移
figure;
stem(abs(B));
title('1/2抽样');
对比(原图—抽样)频域图:
1.抽样后的DFT频谱图幅值是原来的1/X,X是抽样间距(每X像素抽一个点)。所以需要将抽样得到的频谱乘以X。(有兴趣可以看看:为什么幅值变成1/X了)
2.抽样图多了两条竖线,对应信号:负18/40*2π和18/40*2π。这对应了图像二维采样(1)里的“频谱岛”。频谱岛之间的距离等于1/X=40/2=20(把1换成原图的刻度40)。x=1的“频谱岛”和x=21的“频谱岛”相距20,刚好验证了这一点。(有兴趣可以看看:为什么代码第一行要“保证频域为40刻度”)