应用离散傅里叶变换(DFT),分析离散信号x[k]。根据信号傅里叶变换建立的时域与频域之间的对应关系,可以得到有限长序列的离散傅里叶变换(DFT)与四种确定信号傅里叶变换的之间的关系,实现由DFT分析其频谱。
(1) 确定DFT计算的参数;
(2) 进行理论值与计算值比较,讨论信号频谱分析过程中误差原因及改善方法。
答:信号下x[k]基频,可以确定基波周期N=16,为显示k=0,1,…31,所以取N=32。
Matlab程序如下:
N=32; k=0:N-1;
x=cos(3*pi*k/8);
X=fft(x);
subplot(2,1,1);
stem(k-N/2,abs(fftshift(X)));
ylabel('Magnitude');
xlabel('Frequency (rad)');
subplot(2,1,2);
stem(k-N/2,angle(fftshift(X)));
ylabel('Phase');
xlabel('Frequency (rad)');
(2)由幅频特性,X[m]在m=6和-6处有值,幅度为16,可以算出基频,与理论值相符。若选取N不是16或16的整数倍,将发生频谱泄露现象。
2.利用FFT分析信号的频谱;
(1) 确定DFT计算的参数;
(2) 进行理论值与计算值比较,讨论信号频谱分析过程中误差原因及改善方法。
答:(1)信号无限长,因此需要对其进行截短。该序列单调衰减,当k>=30时,序列已几乎衰减为0,因此只取序列在区间[0,30]上的数值进行分析。
Matlab程序如下:
k=0:30;
k1=-15:15;
x=0.5.^k;
X=fft(x);
subplot(2,1,1);
plot(k-15,abs(fftshift(X)),k1,(1+0.25-cos(k1*pi/15)).^(-0.5),'r');
ylabel('Magnitude');
xlabel('Frequency (rad)');
subplot(2,1,2);
plot(k-15,angle(fftshift(X)));
ylabel('Phase');
xlabel('Frequency (rad)');
(2)幅频图中蓝线表示计算中,红线表示理论值,可以看出计算值与理论值基本一致,但存在一定误差。因截取序列长度M=30时,该序列几乎衰减为0,且取作FFT点数N>=M,所以计算值与理论值差别不大。若产生较大误差,可能是截取信号长度过短,可以截取较长时间的样点进行分析,或者在截取的离散序列之后补零,得到一个更长的序列,这样可以增加频谱图的更多细节。
k=[0,1,2,3,4,5]
x=[2,3,3,1,0,5]
X=fft(x);
subplot(2,1,1);
stem(k-3,abs(fftshift(X)));
ylabel('Magnitude');
xlabel('Frequency (rad)');
subplot(2,1,2);
stem(k-3,angle(fftshift(X)));
ylabel('Phase');
xlabel('Frequency (rad)');
N=32; k=0:N-1;
x=cos(7*pi*k/16)+cos(9*pi*k/16)+cos(pi*k/2);
X=fft(x);
subplot(2,1,1);
stem(k-N/2,abs(fftshift(X)));
ylabel('Magnitude');
xlabel('Frequency (rad)');
subplot(2,1,2);
stem(k-N/2,angle(fftshift(X)));
ylabel('Phase');
xlabel('Frequency (rad)');
三个基频,,分别对应频谱图中m=±7,±9,±8这三组点,幅值均为16。若N选取不合适(不是32或32的整数倍),将出现杂频,频谱图X[m]中不能完全分辨出三个频率。
N=64; k=0:N-1;
x=cos(2*pi*k/15)+0.75*cos(2.3*pi*k/15);
X=fft(x);
subplot(2,1,1);
stem(k-N/2,abs(fftshift(X)));
ylabel('Magnitude');
xlabel('Frequency (rad)');
subplot(2,1,2);
stem(k-N/2,angle(fftshift(X)));
ylabel('Phase');
xlabel('Frequency (rad)');
(2)对x[k]补零至256点后计算FFT,绘制出频谱图如下:
对时域序列补零至256点后,增加了频谱图中更多的细节,但是没有提高频率分辨率,不能分辨出两个频率。
(3)若选用非矩形窗(主要有汉宁窗、哈明窗、布拉克曼窗和凯塞窗)计算FFT,可以分辨出其中两个频率。
(4)可以提高序列样点数,以下是对x[k]作300点FFT得到得频谱图:
可以分辨出两个频率。
k=-125:124;
y=(abs(2*k)<=50).*exp(-(0.1*2*k).^2/2);
Y=fft(y);
subplot(2,1,1);
plot(k,abs(fftshift(Y)));
ylabel('Magnitude');
xlabel('Frequency (rad)');
subplot(2,1,2);
plot(k,angle(fftshift(Y)));
ylabel('Phase');
xlabel('Frequency (rad)');
k=-62:62;
g=(abs(4*k)<=50).*exp(-(0.1*4*k).^2/2);
G=fft(g);
subplot(2,1,1);
plot(k,abs(fftshift(G)));
ylabel('Magnitude');
xlabel('Frequency (rad)');
subplot(2,1,2);
plot(k,angle(fftshift(G)));
ylabel('Phase');
xlabel('Frequency (rad)');
y=(abs(2*k)<=50).*exp(-(0.1*2*k).^2/2).*cos(pi*2*k/2)
g=(abs(4*k)<=50).*exp(-(0.1*4*k).^2/2).*cos(pi*4*k/2)