采样对象
40个离散点,在实空间的40个点内,有2个周期:
采样周期:1/2
每两个点抽样一个,所以抽样结果如下:
对抽样结果分别进行模拟DFT和FFT运算,得到抽样信号的频谱图:
对比两图发现:
1.DFT得到的频谱是40个频率刻度,而FFT得到的只有20个频率刻度。
2.DFT得到的频谱有4个频率分量,而FFT只有两个频率分量。
所以哪个方法得到的结果是对的呢?再回答这个问题前,先看看下面这个离散点只有20个的2(周期)信号图以及他的频谱图(注:此信号不是原信号):
是的,这两个频域图一模一样,连频域的刻度都一样。实空间的曲线也是一样的(因为都是两个周期,且离散点都是20个),只有横轴的范围不一样:一个是1—40,另一个是1—20。是的,FFT把抽样函数当做相同周期的另一个函数了。
造成这一结果的原因在于:抽样函数的离散点减少了,少于原来40个点了。之前说过,频谱会按照离散点的取值,划分频谱图里的频率刻度。40个点划40个频率,20个点划20个基频。
所以只需要把没有采样的点置0,保持40个采样点,就可以得到采样信号的频谱了:
可以看到,这样抽样后的频谱图和之间的DFT是一样的,所以我们以后抽样的时候,没有抽到的部分也要保留下来并置0。
代码:
close all;
%% 原信号
n = 0:1:39; %40个离散点
A = cos(2*pi*n*2/40); %频率:2个周期
figure; stem(n,A); hold on; plot(n,A); title('原信号');
%% 抽样信号
n = 0:2:39; %20个离散点
A = cos(2*pi*2*n/40);
figure; stem(n,A); hold on; plot(n,A); title('抽样信号');
%% 抽样信号作FFT和DFT
A = cos(2*pi*2*n/40);
B = fft2(A);
figure; stem(B); title('抽样信号FFT');
sum = zeros(1,20);
for freq = 0:2:39
B = cos(2*pi*freq*n/40);
C = A.*B;
for num = 0:19
sum(freq/2+1) = sum(freq/2+1) + C(num+1);
end
end
figure; stem(n,sum); title('抽样信号DFT');
%% 原信号20个离散点
n = 0:1:19; %20个离散点
A = cos(2*pi*n*2/20); %频率:2个周期
figure; stem(n,A); hold on; plot(n,A); title('20离散点信号');
B = fft2(A);
figure; stem(B); title('20离散点信号FFT');
sum = zeros(1,20);
for freq = 0:1:19
B = cos(2*pi*freq*n/20);
C = A.*B;
for num = 0:19
sum(freq+1) = sum(freq+1) + C(num+1);
end
end
figure; stem(n,sum); title('20离散点信号DFT');
%% 修改后的采样信号频谱
A = zeros(1,40); %40个离散点
for num = 0:2:39 %抽样1/2
A(num+1) = cos(2*pi*2*num/40);
end
n = 0:1:39;
figure; stem(n,A); title('40离散点抽样信号');
B = fft2(A);
figure; stem(B); title('40离散点抽样信号FFT');