注:本实验使用matlab仿真,得到两个不同频率信号相加后的时域图像,并对其进行频谱分析。由于在计算机中储存的都是离散信号数据,因此这里我们采用采样频率1KHZ,采样点数2000个点的序列来代表时域信号f(t)
1.实验代码:
fs=1000; %设置序列采样频率
N=1000; %设置采样总长度,便于修改
n=0:1:N-1; %设置采样序列
t=n/fs; %时域单位转换,得到时间t
yt=sin(2*pi*t)+sin(100*pi*t); %两时域频率信号相加
subplot(1,2,1); %设置图像布局
plot(t(1:N),yt(1:N)); %绘时域曲线y(t)
title('y(t)=sin(2*pi*t)+sin(100*pi*t)');
xlabel('时域t');
ylabel('y(t)');
Y=fft(yt); %对y(t)使用FFT变换得到频谱
w=((2*pi*fs)/N)*n; %频域单位转换,得到模拟角频率w
subplot(1,2,2); %设置图像布局
plot(w(1:N/2),(2/N)*abs(Y(1:N/2))); %绘幅频曲线,这里用(2/N)*abs(Y(1:150))得到其真实幅度值
title('y(t)的幅频曲线');
xlabel('频域w');
ylabel('|Y(w)|');
2.实验结果
(1).低频大信号sin(2*pi*t)加上高频微小信号0.01*sin(100*pi*t),结果:
(2).低频大信号sin(2*pi*t)加上高频小信号0.1*sin(100*pi*t),结果:
(3).低频大信号sin(2*pi*t)加上高频大信号sin(100*pi*t),结果:
(4).低频大信号sin(2*pi*t)加上高频巨大信号5*sin(100*pi*t),结果:
总结:
(1).从时域上可以看到,信号中的低频成分决定了其边沿变化的“大小”和“速率”,信号中的高频成分决定了信号的“厚度”和“密度”。
(2).把这个信号放大后,你就可以看到它的高频成分了。如下图所示:
因此,当你在示波器上看到一个信号,你可以这样估算它的最高频率分量—把信号一直放大,直到找到它两个波峰与波峰的最小距离Tmin,这个就是由于其最高频率分量引起的,
其频率值为fh=1/Tmin
(3).由信号幅频曲线可以清晰地看到其频率分量的大小,与我们时域信号完全对应。这也再次证明了FFT算法的可靠性。
3.补充—FFT的频谱泄露
仔细观察幅频曲线你会发现,在大信号分量的根部,线条变粗了。如下图:
把它用序列表示,并放大观察:
理论上我们得到的不应该是一条垂直的细线吗?是什么造成了这种”频谱能量转移”的问题?
原因:其实,这是因为我们把无限长的信号截取成一段有限长信号来分析频谱造成的。无限长的信号截取成一段有限长信号的过程可以理解为乘一个窗函数,这时频域就是卷积了窗函数对应的频谱。我们知道窗函数的频谱是抽样函数的形状,这样大幅度频率的能量就部分转移到了周围的频率上,使其幅值变大。
危害:频谱泄露会引起不同频率分量间的干扰,强信号的“旁瓣”可能会淹没弱信号的主频线,或者我们会把强信号的“旁瓣”误认为是一个频率分量,造成“假信号”。
处理办法:1.可以增加截取的有限长信号的长度(增加采样点数),点数越多,频谱泄露越少。但不能无限增加长度,要考虑运算量的问题。2.使用缓变窗而不是矩形窗来截取信号,比如用三角形窗、升余弦窗等。