实验一:用FFT对信号作频谱分析
1.实验目的
学习用FFT对连续信号和时域离散信号进行谱分析的方法,了解可能出现的分析
误差及其原因,以便正确应用FFT。
2. 实验原理
用FFT对信号作频谱分析是学习数字信号处理的重要内容。经常需要进行谱分析的信号是模拟信号和时域离散信号。对信号进行谱分析的重要问题是频谱分辨率D和分析误差。频谱分辨率直接和FFT的变换区间N有关,因为FFT能够实现的频率分辨率是,因此要求。可以根据此式选择FFT的变换区间N。误差主要来自于用FFT作频谱分析时,得到的是离散谱,而信号(周期信号除外)是连续谱,只有当N较大时离散谱的包络才能逼近于连续谱,因此N要适当选择大一些。
周期信号的频谱是离散谱,只有用整数倍周期的长度作FFT,得到的离散谱才能代表周期信号的频谱。如果不知道信号周期,可以尽量选择信号的观察时间长一些。
对模拟信号进行谱分析时,首先要按照采样定理将其变成时域离散信号。如果是模拟周期信号,也应该选取整数倍周期的长度,经过采样后形成周期序列,按照周期序列的谱分析进行。
3.实验步骤及内容
(1)对以下序列进行谱分析。
选择FFT的变换区间N为8和16 两种情况进行频谱分析。分别打印其幅频特性曲线。 并进行对比、分析和讨论。
(2)对以下周期序列进行谱分析。
选择FFT的变换区间N为8和16 两种情况分别对以上序列进行频谱分析。分别打印其幅频特性曲线。并进行对比、分析和讨论。
(3)对模拟周期信号进行谱分析
选择 采样频率,变换区间N=16,32,64 三种情况进行谱分析。分别打印其幅频特性,并进行分析和讨论。
4.思考题
(1)对于周期序列,如果周期不知道,如何用FFT进行谱分析?
答:周期信号的周期预先不知道时,可先截取M点进行DFT,再将截取长度扩大1倍截取,比较结果,如果二者的差别满足分析误差要求,则可以近似表示该信号的频谱,如果不满足误差要求就继续将截取长度加倍,重复比较,直到结果满足要求
(2)如何选择FFT的变换区间?(包括非周期信号和周期信号)
答:一、对于非周期信号:有频谱分辨率F,而频谱分辨率直接和FFT的变换区间有关,因为FFT能够实现的频率分辨率是2π/N...因此有最小的N>2π/F。就可以根据此式选择FFT的变换区间。二、对于周期信号,周期信号的频谱是离散谱,只有用整数倍周期的长度作FFT,得到的离散谱才能代表周期信号的频谱。
(3)当N=8时,和的幅频特性会相同吗?为什么?N=16 呢?
答:N=8时两个信号的幅频特性相同,而N=16时不相同。因为N=8时,采样点处两个样点的值刚好相等,而N=16时采样点的两个样点值不相等。
实验程序运行结果
实验程序运行结果如图1所示。
图 1
程序运行结果分析讨论:
用DFT(或FFT)分析频谱,绘制频谱图时,最好将X(k)的自变量k换算成对应的频率,作为横坐标便于观察频谱。
为了便于读取频率值,最好关于π归一化,即以作为横坐标。
1、实验内容(1)
图(1a)和(1b)说明的8点DFT和16点DFT分别是的频谱函数的8点和16点采样;
因为,所以,与的8点DFT的模相等,如图(2a)和(3a)。但是,当N=16时,与不满足循环移位关系,所以图(2b)和(3b)的模不同。
2、实验内容(2),对周期序列谱分析
的周期为8,所以N=8和N=16均是其周期的整数倍,得到正确的单一频率正弦波的频谱,仅在0.25π处有1根单一谱线。如图(4b)和(4b)所示。
的周期为16,所以N=8不是其周期的整数倍,得到的频谱不正确,如图(5a)所示。N=16是其一个周期,得到正确的频谱,仅在0.25π和0.125π处有2根单一谱线, 如图(5b)所示。
3、实验内容(3),对模拟周期信号谱分析
有3个频率成分,。所以的周期为0.5s。 采样频率。变换区间N=16时,观察时间Tp=16T=0.25s,不是的整数倍周期,所以所得频谱不正确,如图(6a)所示。变换区间N=32,64 时,观察时间Tp=0.5s,1s,是的整数周期,所以所得频谱正确,如图(6b)和(6c)所示。图中3根谱线正好位于处。变换区间N=64 时频谱幅度是变换区间N=32 时2倍,这种结果正好验证了用DFT对中期序列谱分析的理论。
注意:
(1)用DFT(或FFT)对模拟信号分析频谱时,最好将X(k)的自变量k换算成对应的模拟频率fk,作为横坐标绘图,便于观察频谱。这样,不管变换区间N取信号周期的几倍,画出的频谱图中有效离散谐波谱线所在的频率值不变,如图(6b)和(6c)所示。
(2)本程序直接画出采样序列N点DFT的模值,实际上分析频谱时最好画出归一化幅度谱,这样就避免了幅度值随变换区间N变化的缺点。本实验程序这样绘图只要是为了验证了用DFT对中期序列谱分析的理论。
实验程序
% 用FFT对信号作频谱分析
x1(n)的频谱分析程序:
x1n=[1 1 1 1]; %²úÉúÐòÁÐÏòÁ¿x1(n)=R4(n)
a=abs(fft(x1n,8));
b=abs(fft(x1n,16));
n=linspace(0,2,8);
figure(1);
subplot(2,1,1);
stem(n,a,'.');%8µãµÄfft±ä»»
title('x1(n)µÄ8µãµÄƵÆ×');
xlabel('¦Ø/¦Ð');ylabel('·ù¶È');
m=linspace(0,2,16);
subplot(2,1,2);
stem(m,b,'.');
title('x1(n)µÄ16µãµÄƵÆ×');
xlabel('¦Ø/¦Ð');ylabel('·ù¶È');
x2(n)的频谱分析程序:
x2n=[1 2 3 4 4 3 2 1];
a=abs(fft(x2n,8));
b=abs(fft(x2n,16));
n=linspace(0,2,8);
figure(2);
subplot(2,1,1);
stem(n,a,'.');%8µãµÄfft±ä»»
title('x2(n)µÄ8µãµÄfft±ä»»');
xlabel('¦Ø/¦Ð');ylabel('·ù¶È');
m=linspace(0,2,16);
subplot(2,1,2);
stem(m,b,'.');
title('x2(n)µÄ16µãµÄfft±ä»»');
xlabel('¦Ø/¦Ð');ylabel('·ù¶È');
x3(n)的频谱分析程序:
x3n=[4 3 2 1 1 2 3 4];
a=abs(fft(x3n,8));
b=abs(fft(x3n,16));
n=linspace(0,2,8);
figure(3);
subplot(2,1,1);
stem(n,a,'.');%8µãµÄfft±ä»»
title('x3(n)µÄ8µãµÄfft±ä»»');
xlabel('¦Ø/¦Ð');ylabel('·ù¶È');
m=linspace(0,2,16);
subplot(2,1,2);
stem(m,b,'.');
title('x3(n)µÄ16µãµÄfft±ä»»');
xlabel('¦Ø/¦Ð');ylabel('·ù¶È');
x4(n)的频谱分析程序:
N=8,n=0:N-1;
x4n=cos(pi*n/4);
a=abs(fft(x4n));
N=16,n=0:N-1;
x4n=cos(pi*n/4);
b=abs(fft(x4n));
n=linspace(0,2,8);
figure(4);
subplot(2,1,1);
stem(n,a,'.');%8µãµÄfft±ä»»
title('x4(n)µÄ8µãµÄfft±ä»»');
xlabel('¦Ø/¦Ð');ylabel('·ù¶È');
m=linspace(0,2,16);
subplot(2,1,2);
stem(m,b,'.');
title('x4(n)µÄ16µãµÄfft±ä»»');
xlabel('¦Ø/¦Ð');ylabel('·ù¶È');
x5(n)的频谱分析程序:
N=8,n=0:N-1;
x5n=cos(pi*n/4)+cos(pi*n/8);
a=abs(fft(x5n));
N=16,n=0:N-1;
x5n=cos(pi*n/4)+cos(pi*n/8);
b=abs(fft(x5n));
n=linspace(0,2,8);
figure(5);
subplot(2,1,1);
stem(n,a,'.');%8µãµÄfft±ä»»
title('x5(n)µÄ8µãµÄfft±ä»»');
xlabel('¦Ø/¦Ð');ylabel('·ù¶È');
m=linspace(0,2,16);
subplot(2,1,2);
stem(m,b,'.');
title('x5(n)µÄ16µãµÄfft±ä»»');
xlabel('¦Ø/¦Ð');ylabel('·ù¶È');
x8(t)的频谱分析程序:
figure(6)
Fs=64;T=1/Fs;
N=16;n=0:N-1; %FFTµÄ±ä»»Çø¼äN=16
x6nT=cos(8*pi*n*T)+cos(16*pi*n*T)+cos(20*pi*n*T);
X6k16=fft(x6nT); %¼ÆËãx6nTµÄ16µãDFT
X6k16=fftshift(X6k16); %½«ÁãƵÂÊÒƵ½ÆµÆ×ÖÐÐÄ
Tp=N*T;F=1/Tp; %ƵÂÊ·Ö±æÂÊF
k=-N/2:N/2-1;fk=k*F;
subplot(3,1,1);stem(fk,abs(X6k16),'.');box on
title('x8(t)µÄ16µãfft±ä»»');xlabel('f(Hz)');ylabel('·ù¶È');
axis([-N*F/2-1,N*F/2-1,0,1.2*max(abs(X6k16))])
N=32;n=0:N-1; %FFTµÄ±ä»»Çø¼äN=32
x6nT=cos(8*pi*n*T)+cos(16*pi*n*T)+cos(20*pi*n*T);
X6k32=fft(x6nT); %¼ÆËãx6nTµÄ32µãDFT
X6k32=fftshift(X6k32); %½«ÁãƵÂÊÒƵ½ÆµÆ×ÖÐÐÄ
Tp=N*T;F=1/Tp; %ƵÂÊ·Ö±æÂÊF
k=-N/2:N/2-1;fk=k*F;
subplot(3,1,2);stem(fk,abs(X6k32),'.');box on
title('x8(t)µÄ32µãµÄfft±ä»»');xlabel('f(Hz)');ylabel('·ù¶È');
axis([-N*F/2-1,N*F/2-1,0,1.2*max(abs(X6k32))])
N=64;n=0:N-1; %FFTµÄ±ä»»Çø¼äN=64
x6nT=cos(8*pi*n*T)+cos(16*pi*n*T)+cos(20*pi*n*T);
X6k64=fft(x6nT); %¼ÆËãx6nTµÄ64µãDFT
X6k64=fftshift(X6k64); %½«ÁãƵÂÊÒƵ½ÆµÆ×ÖÐÐÄ
Tp=N*T;F=1/Tp; %ƵÂÊ·Ö±æÂÊF
k=-N/2:N/2-1;fk=k*F;
subplot(3,1,3);stem(fk,abs(X6k64),'.'); box on
title('x8(t)µÄ64µãµÄfft±ä»»');xlabel('f(Hz)');ylabel('·ù¶È');
axis([-N*F/2-1,N*F/2-1,0,1.2*max(abs(X6k64))])