哈工大 数字信号处理实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一: 用FFT 作谱分析
实验目的:
(1) 进一步加深DFT 算法原理和基本性质的理解(因为FFT 只是DFT 的一种快速算法, 所以FFT 的运算结果必然满足DFT 的基本性质)。
(2) 熟悉FFT 算法原理和FFT 子程序的应用。
(3) 学习用FFT 对连续信号和时域离散信号进行谱分析的方法,了解可能出现的分析误差及其原因,以便在实际中正确应用FFT 。
实验原理: DFT 的运算量:
一次完整的DFT 运算总共需要2N 次复数乘法和(1)N N -复数加法运算,因而
直接计算DFT 时,乘法次数和加法次数都和2N 成正比,当N 很大时,运算量很客观的。例如,当N=8时,DFT 运算需64位复数乘法,当N=1024时,DFT 运算需1048576次复数乘法。而N 的取值可能会很大,因而寻找运算量的途径是很必要的。
FFT 算法原理:
大多数减少离散傅里叶变换运算次数的方法都是基于nk N W 的对称性和周期
性。
(1)对称性
()
*()k N n kn kn
N
N N
W W W --==
(2)周期性
kn N
kn n N k
n k N
N
N N
N
W W W W ++===
由此可得
()()/2
(/2)1
n N k N n k nk N N N N N k N k N N W W W W W W ---+⎧==⎪=-⎨⎪=-⎩
这样:
1.利用第三个方程的这些特性,DFT 运算中有些项可以合并;
2.利用nk N W 的对称性和周期性,可以将长序列的DFT 分解为短序列的DFT 。
前面已经说过,DFT 的运算量是与2N 成正比的,所以N 越小对计算越有利,
因而小点数序列的DFT 比大点数序列的DFT 运算量要小。
快速傅里叶变换算法正是基于这样的基本思路而发展起来的,她的算法基本
上可分成两大类,即按时间抽取法和按频率抽取法。
我们最常用的是2M N =的情况,该情况下的变换成为基2快速傅里叶变换。
完成一次完整的FFT 计算总共需要
2log 2
N N
次复数乘法运算和2log N N 次复
数加法运算。很明显,N 越大,FFT 的优点就越突出。
实验步骤 (1) 复习DFT 的定义、 性质和用DFT 作谱分析的有关内容。
(2) 复习FFT 算法原理与编程思想, 并对照DIT-FFT 运算流图和程序框图, 读懂本实验提供的FFT 子程序。
(3) 编制信号产生子程序, 产生以下典型信号供谱分析用:
1423()()1,03()8470403()3
47
x n R n n n x n n
n n n x n n n =⎧+≤≤⎪
=-≤≤⎨⎪⎩-≤≤⎧⎪
=-≤≤⎨⎪⎩
456()cos 4
()sin
8
()cos 8cos16cos 20x n n x n n
x t t t t
π
π
πππ===++
(4) 编写主程序。
(5) 按实验内容要求, 上机实验, 并写出实验报告。
实验程序与结果:
(1)对x 1(n)进行FFT 变换(N=8和N=16)
clear all;
N=4;%读入长度
x=[1,1,1,1];%调用信号产生子程序产生实验信号
n=0:N-1;subplot(3,1,1);stem(n,abs(x));%调用绘图子程序(函数)绘制时间序列波形图
title('原时间序列');
N=8;%读入长度
y1=fft(x,N);%调用FFT 子程序(函数)计算信号的DFT n=0:N-1;subplot(3,1,2);stem(n,fftshift(abs(y1)));hold
on;plot(n,fftshift(abs(y1)),'r--');%调用绘图子程序(函数)绘制|X(k)|曲线 title('N=8');
N=16;%读入长度
y2=fft(x,N);%调用FFT 子程序(函数)计算信号的DFT n=0:N-1;subplot(3,1,3);stem(n,fftshift(abs(y2)));hold
on;plot(n,fftshift(abs(y2)),'r--');%调用绘图子程序(函数)绘制|X(k)|曲线 title('N=16'); 结果图形
实验误差分析:
理论FFT频谱为一个抽样信号,由图形看出,随着采样率的提高,得到的FFT 频谱分辨率就越高,当N趋于无限时频谱包络接近理论的抽样函数。
(2)对x2(n)进行FFT变换(N=8和N=16)
clear all;
x=[1,2,3,4,4,3,2,1];%调用信号产生子程序产生实验信号
N=8;%读入长度
n=0:N-1;subplot(3,1,1);stem(n,abs(x));%调用绘图子程序(函数)绘制时间序列波形图
title('原时间序列');
N=8;%读入长度
y1=fft(x,N);%调用FFT子程序(函数)计算信号的DFT
n=0:N-1;subplot(3,1,2);stem(n,fftshift(abs(y1)));hold
on;plot(n,fftshift(abs(y1)),'r--');%调用绘图子程序(函数)绘制|X(k)|曲线
title('N=8');
N=16;%读入长度
y2=fft(x,N);%调用FFT子程序(函数)计算信号的DFT
n=0:N-1;subplot(3,1,3);stem(n,fftshift(abs(y2)));hold
on;plot(n,fftshift(abs(y2)),'r--');%调用绘图子程序(函数)绘制|X(k)|曲线
title('N=16');