学习用 FFT 对连续信号和时域离散信号进行频谱分析(也称谱分析)的方法, 了解可能出现的分析误差及其原因,以便正确应用FFT。
选择 FFT 的变换区间 N 为 8 和 16 的两种情况进行频谱分析。分别打印其幅频特性曲线, 并进行对比、 分析和讨论。
%R4(n)的谱分析 有限长序列
%做N点DFT 不够的话 时域补零到N点
%8点->16点 相邻谱线间隔变密 离散谱的包络更接近于连续谱
clear;
x1=[1 1 1 1];
%8点DFT
N1=8;
xk=fft(x1,N1); %计算x1(n)的8点DFT
subplot(221);
stem(0:N1-1,[x1 zeros(1,N1-4)],'.','g'); %时域补零到 8个点 绘图
xlabel('n');
ylabel('x(n)');
title('R4(n)');
axis([0 8 0 1.2]);
subplot(222);
stem(0:0.25:1.75,abs(xk),'.','g');
xlabel('\omega/\pi');
ylabel('幅度');
title('8点DFT的结果');
axis([0 2 0 4.5]);
%16点DTF
N2=16;
xk=fft(x1,N2);
subplot(223);
stem(0:N2-1,[x1 zeros(1,N2-4)],'.','r'); %时域补零到16个点 绘图
xlabel('n');
ylabel('x(n)');
title('R4(n)');
axis([0 16 0 1.2]);
subplot(224);
stem(0:0.125:1.875,abs(xk),'.','r');
xlabel('\omega/\pi');
ylabel('幅度');
title('16点DFT的结果');
axis([0 2 0 4.5]);
运行效果如下:
%x2(n)的谱分析
%做N点DFT 不够的话 时域补零到N点
clear;
x2=[1 2 3 4 4 3 2 1];
%8点DFT
N1=8;
subplot(221);
stem(0:N1-1,x2,'.','g');
xlabel('n');
ylabel('x(n)');
title('x2(n)');
axis([0 8 0 4.5]);
xk=fft(x2,N1);
subplot(222);
stem(0:0.25:1.75,abs(xk),'.','g'); %归一化
xlabel('\omega/\pi');
ylabel('幅度');
title('8点DFT的结果');
axis([0 2 0 24]);
%16点DFT
N2=16;
subplot(223);
stem(0:N2-1,[x2 zeros(1,N2-8)],'.','r'); %时域补零到16点
xlabel('n');
ylabel('x(n)');
title('x2(n)');
axis([0 16 0 4.5]);
xk=fft(x2,N2);
subplot(224);
stem(0:0.125:1.875,abs(xk),'.','r');
xlabel('\omega/\pi');
ylabel('幅度');
title('16点DFT的结果');
axis([0 2 0 24]);
运行效果如下:
%x3(n)的频谱分析
%做N点DFT 不够的话 时域补零到N点
clear;
x3=[4 3 2 1 1 2 3 4];
%8点DFT
N1=8;
subplot(221);
stem(0:N1-1,x3,'.','g');
xlabel('n');
ylabel('x(n)');
title('x3(n)');
axis([0 8 0 4.5]);
xk=fft(x3,N1);
subplot(222);
stem(0:0.25:1.75,abs(xk),'.','g');
xlabel('\omega/\pi');
ylabel('幅度');
title('8点DFT的结果');
axis([0 2 0 24]);
%16点DFT
N2=16;
subplot(223);
stem(0:N2-1,[x3 zeros(1,N2-8)],'.','r'); %时域补零到16点
xlabel('n');
ylabel('x(n)');
title('x3(n)');
axis([0 16 0 4.5]);
xk=fft(x3,N2);
subplot(224);
stem(0:0.125:1.875,abs(xk),'.','r');
xlabel('\omega/\pi');
ylabel('幅度');
title('16点DFT的结果');
axis([0 2 0 24]);
运行效果如下:
观察可以发现:
选择 FFT 的变换区间 N 为 8 和 16 的两种情况分别对以上序列进行频谱分析,分别打印其幅频特性曲线。 并进行对比、分析和讨论。
%x4(n)=cos(pi/4*n)的频谱分析 周期序列
%周期序列x(n)周期如果事先不知道 截取M点进行DFT 再将截取长度扩大一倍
%比较二者主谱差别 若满足分析误差要求 这两个都可以近似表示x(n)的频谱
%否则 继续将截取长度加倍 直到前后两次主谱差别满足误差要求
%幅度跟N有关 主瓣会变窄 旁瓣会增加 更接近于真实的频谱 幅度是冲激那样的 又窄又高
clear;
n=0:31;
x4=cos(pi/4*n);
%8点DFT
N1=8;
subplot(221);
stem(0:1:31,x4,'.','g');
xlabel('n');
ylabel('x(n)');
title('x4(n)');
axis([0 31 -1.2 1.2]);
xk=fft(x4,N1);
subplot(222);
stem(0:0.25:1.75,abs(xk),'.','g');
xlabel('\omega/\pi');
ylabel('幅度');
title('8点DFT的结果');
axis([0 2 0 5]);
%16点DFT
N2=16;
subplot(223);
stem(0:1:31,x4,'.','r');
xlabel('n');
ylabel('x(n)');
title('x4(n)');
axis([0 31 -1.2 1.2]);
xk=fft(x4,N2);
subplot(224);
stem(0:0.125:1.875,abs(xk),'.','r');
xlabel('\omega/\pi');
ylabel('幅度');
title('16点DFT的结果');
axis([0 2 0 9]);
运行效果如下:
%x5(n)=cos(pi/4*n)+cos(pi/8*n)的频谱分析
%周期序列x(n)周期如果事先不知道 截取M点进行DFT 再将截取长度扩大一倍
%比较二者主谱差别满足分析误差要求 这两个都可以近似表示x(n)的频谱
%否则 继续将截取长度加倍 直到前后两次主谱差别满足误差要求
clear;
n=0:31;
x5=cos(pi/4*n)+cos(pi/8*n);
%8点DFT
N1=8;
subplot(321);
stem(0:1:31,x5,'.','m');
xlabel('n');
ylabel('x(n)');
title('x5(n)');
axis([0 31 -2.2 2.5]);
xk=fft(x5,N1);
subplot(322);
stem(0:0.25:1.75,abs(xk),'.','m');
xlabel('\omega/\pi');
ylabel('幅度');
title('8点DFT的结果');
axis([0 2 0 7]);
%16点DFT
N2=16;
subplot(323);
stem(0:1:31,x5,'.','r');
xlabel('n');
ylabel('x(n)');
title('x5(n)');
axis([0 31 -2.2 2.5]);
xk=fft(x5,N2);
subplot(324);
stem(0:0.125:1.875,abs(xk),'.','r');
xlabel('\omega/\pi');
ylabel('幅度');
title('16点DFT的结果');
axis([0 2 0 10]);
%32点DFT
N2=32;
subplot(325);
stem(0:1:31,x5,'.','g');
xlabel('n');
ylabel('x(n)');
title('x5(n)');
axis([0 31 -2.2 2.5]);
xk=fft(x5,N2);
subplot(326);
stem(0:0.0625:1.9375,abs(xk),'.','g');
xlabel('\omega/\pi');
ylabel('幅度');
title('32点DFT的结果');
axis([0 2 0 20]);
运行效果如下:
%对模拟周期信号作谱分析
%首先要按照采样定理将其变成时域离散信号
%如果是模拟周期信号, 也应该选取整数倍周期的长度, 经过采样后形成周期序列
%再按照周期序列的谱分析进行
clear;
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); %对x6(t) 16点采样
%fftshift移动零频点到频谱中间 为了把结果和fft运算的结果一致
X6k16=fftshift(fft(x6nT,16)); %计算 x6nT 的16点 DFT
Tp=N*T;F=1/Tp; %频率分辨率 F
k=0:N-1;fk1=-32:4:28; %产生16点 DFT 对应的采样点频率(以零频率为中心)
subplot(3,1,1);stem(fk1,abs(X6k16),'.','g'); %绘制16点DFT的幅频特性图
title('16点 DFT[x_6(nT)]|');xlabel('\omega/\pi');ylabel('幅度');
axis([-32 28 0 12]);
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); %对 x6(t) 32点采样
X6k32=fftshift(fft(x6nT,32)); %计算x6(nT)的 32 点 DFT
Tp=N*T;F=1/Tp; %频率分辨率 F
k=0:N-1;fk2=-32:2:30; %产生 32 点 DFT 对应的采样点频率(以零频率为中心)
subplot(3,1,2);stem(fk2,abs(X6k32),'.','r'); %绘制 32 点 DFT 的幅频特性图
title('32点 DFT[x_6(nT)]|');xlabel('\omega/\pi');ylabel('幅度');
axis([-32 31 0 20]);
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); %对x6(t) 64点采样
X6k64=fftshift(fft(x6nT,64)); %计算 x6(nT) 的64点DFT
Tp=N*T;F=1/Tp; %频率分辨率 F
k=0:N-1;fk3=-32:1:31; %产生64点 DFT对应的采样点频率(以零频率为中心)
subplot(3,1,3);stem(fk3,abs(X6k64),'.','m'); %绘制64点DFT的幅频特性图
title('64点 DFT[x_6(nT)]|');xlabel('\omega/\pi');ylabel('幅度');
axis([-32 31 0 40]);
运行效果如下:
(1) 对于周期序列, 如果周期不知道, 如何用 FFT 进行谱分析?
答:周期信号的周期预先不知道时,可先截取 M 点进行DFT,再将截取长度扩大一倍截取,比较结果,如果二者的差别满足分析误差要求,则可以近似表示该信号的频谱,如果不满足误差要求就继续将截取长度加倍,重复比较,直到结果满足要求。
(2) 如何选择FFT的变换区间(包括非周期信号和周期信号)?
答:对于非周期信号:有频谱分辨率F,而频谱分辨率直接和 FFT 的变换区间有关,因为 FFT 能够实现的频率分辨率是2π/N…因此有最小的N>2π/F。就可以根据此式选择 FFT 的变换区间。对于周期信号,周期信号的频谱是离散谱,只有用整数倍周期的长度作FFT,得到的离散谱才能代表周期信号的频谱。
(3)当 N=8 时, x2 (n) 和 x3 (n)的幅频特性会相同吗?为什么?N=16时呢?
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有