系列文章目录
数字信号处理(DSP:Digital Signal Process)是电子通信领域非常重要的研究方向,博主汇总了数字信号处理(DSP)中常用的经典案例分析,主要基于算法分析、MATLAB程序实现、信号图像显示,对数字信号处理的实际应用进行详细分析。第一篇 常见离散信号的MATLAB产生和图形显示
常见离散信号的MATLAB产生和图形显示
第二篇 零极点分布对系统频率响应的影响
零极点分布对系统频率响应的影响
第三篇 基于matlab实现信号的线性卷积与循环卷积
基于matlab实现信号的线性卷积与循环卷积
第四篇 基于matlab和FFT算法实现信号频谱分析
基于matlab和FFT算法实现信号频谱分析
一、实验目的
-
进一步加深DFT算法原理和基本性质的理解(因为FFT只是DFT的一种快速算法,所以FFT的运算结果必然满足DFT的性质)
-
熟悉FFT算法原理及子程序的应用。
-
掌握用FFT对连续信号和时域离散信号进行频谱分析的基本方法。了解可能出现的分析误差和原因,以便在实际中正确应用FFT。
二、实验原理
- 如果用FFT对模拟信号进行谱分析,首先要把模拟信号转换成数字信号,转换时要求知道模拟信号的最高截止频率,以便选择满足采样定理的采样频率。一般选择采样频率是模拟信号中最高频率的3~4倍。另外要选择对模拟信号的观测时间,如果采样频率和观测时间确定,则采样点数也确定了。这里观测时间和对模拟信号进行谱分析的分辨率有关,最小的观测时间和分辨率成倒数关系。要求选择的采样点数和观测时间大于它的最小值。
- 用FFT作谱分析时,要求做FFT的点数服从2的整数幂,这一点在上面选择采样点数时可以考虑满足,即使满足不了,可以通过在序列尾部加0完成。
- 如果要进行谱分析的模拟信号是周期信号,最好选择观测时间是信号周期的整数倍。如果不知道信号的周期,要尽量选择观测时间长一些,以减少截断效应的影响。
- 用FFT对模拟信号作谱分析是一种近似的谱分析。首先一般模拟信号(除周期信号外)的频谱是连续频谱,而用FFT作谱分析得到的是数字谱,因此应该取FFT的点数多一些,用它的包络作为模拟信号的近似谱。另外,如果模拟信号不是严格的带限信号,会因为频谱混叠现象引起谱分析的误差,这种情况下可以预先将模拟信号进行预滤,或者尽量将采样频率取高一些。
- 一般频率混叠发生在折叠频率附近,分析时要注意因频率混叠引起的误差。最后要注意一般模拟信号是无限长的,分析时要截断,截断的长度和分辨率有关,但也要尽量取长一些,取得太短因截断引起的误差会很大。举一个极端的例子,一个周期性正弦波,如果所取观察时间太短,例如取小于一个周期,它的波形和正弦波相差太大,肯定误差很大,但如果取得长一些,即使不是周期的整倍数,这种截断效应也会小一些。
三、实验步骤及内容
-
复习DFT的定义、性质和用DFT作谱分析的有关内容。
-
复习FFT算法原理与编程思想。
-
编制信号产生程序,产生以下典型信号供谱分析用:
-
分别以变换区间N = 8 ,16 ,32 ,对x1(n)进行FFT,画出相应的幅频特性曲线。
-
分别以变换区间N = 8 ,16,对x2(n)、x3(n)进行FFT,画出相应的幅频特性曲线。
-
分别以变换区间 N = 4 ,8 ,16 ,对x4(n)进行FFT,画出相应的幅频特性曲线。
-
分别对模拟信号x5(t)、x6(t)选择采样频率和采样点数。
-
分别将模拟信号x5(t)、x6(t)转换成序列,用 x5(t)、x6(t) 表示,再分别对它们进行FFT,并画出相应的幅频特性曲线。
四、实验代码及图像结果
- 分别以变换区间N = 8 ,16 ,32 ,对x1(n)进行FFT
matlab程序:
x1=[1,1,1,1];
x2=[1,2,3,4,4,3,2,1];
x3=[4,3,2,1,1,2,3,4];
figure;
subplot(3,1,1); stem(abs(fft(x1,8))); title('x1, N=8');
subplot(3,1,2); stem(abs(fft(x1,16))); title('X1, N=16');
subplot(3,1,3); stem(abs(fft(x1,32))); title('X1, N=32');
figure;
subplot(2,2,1); stem(abs(fft(x2,8))); title('X2(k), N=8');
subplot(2,2,3); stem(abs(fft(x3,8))); title('X3(k), N=8');
subplot(2,2,2); stem(abs(fft(x2,16))); title('X2(k), N=16');
subplot(2,2,4); stem(abs(fft(x3,16))); title('X3(k), N=16');
相应的幅频特性曲线:
- 分别以变换区间 N = 4 ,8 ,16 ,对x4(n)进行FFT
matlab程序:
n4=0:3;
x4=cos(n4*pi/4);
figure;
subplot(3,1,1); stem(abs(fft(x4,4))); title('X4(k),N=4');
n4=0:7;
x4=cos(n4*pi/4);
subplot(3,1,2); stem(abs(fft(x4,8))); title('X4(k), N=8');
n4=0:15;
x4=cos(n4*pi/4);
subplot(3,1,3); stem(abs(fft(x4,16))); title('X4(k), N=16');
相应的幅频特性曲线:
- 分别对模拟信号x5(t)、x6(t)选择采样频率和采样点数
matlab程序:
f=100; fs=400;
tp=0.5/f; N1=tp*fs; t=(0:N1-1)/fs; x51=sin(2*pi*f*t+pi/8);
tp=1/f; N2=tp*fs; t=(0:N2-1)/fs; x52=sin(2*pi*f*t+pi/8);
tp=2/f; N3=tp*fs; t=(0:N3-1)/fs; x53=sin(2*pi*f*t+pi/8);
figure;
subplot(2,3,1); stem(x51); title('x5, Tp=0.5T');
n=0:N1-1;
subplot(2,3,4);stem(fs*n/N1,abs(fft(x51,N1))); title('x5 FFT, Tp=0.5T');
subplot(2,3,2); stem(x52); title('x5, Tp=T');
n=0:N2-1;
subplot(2,3,5); stem(fs*n/N2,abs(fft(x52,N2))); title('x5 FFT, Tp=T');
subplot(2,3,3); stem(x53); title('x5, Tp=2T');
n=0:N3-1;
subplot(236); stem(fs*n/N3,abs(fft(x53,N3))); title('x5 FFT, Tp=2T');
相应的幅频特性曲线:
- 分别将模拟信号x5(t)、x6(t)转换成序列,用 x5(t)、x6(t) 表示,再分别对它们进行FFT
matlab程序:
fs=64;
t=(0:15)/fs; x61=cos(8*pi*t)+ cos(16*pi*t)+ cos(20*pi*t);
t=(0:31)/fs; x62=cos(8*pi*t)+ cos(16*pi*t)+ cos(20*pi*t);
t=(0:63)/fs; x63=cos(8*pi*t)+ cos(16*pi*t)+ cos(20*pi*t);
figure;
subplot(2,3,1); stem(x61); title('x6, N=16');
N1=16; n=0:N1-1;
subplot(2,3,4);stem(fs*n/N1,abs(fft(x61,N1))); title('x6 FFT, N=16');
subplot(2,3,2); stem(x62); title('x6, N=32');
N2=32; n=0:N2-1;
subplot(2,3,5); stem(fs*n/N2,abs(fft(x62,N2))); title('x6 FFT, N=32');
subplot(2,3,3); stem(x63); title('x6, N=64');
N3=64; n=0:N3-1;
subplot(2,3,6); stem(fs*n/N3,abs(fft(x63,N3))); title('x6 FFT, N=64');
相应的幅频特性曲线: