内容发布更新时间 : 2024/11/19 4:25:47星期一 下面是文章的全部内容请认真阅读。
实验一 离散傅立叶变换
一、 实验目的
1. 在理论学习的基础上,通过本实验,加深对离散傅立叶变换(DFT)的理解。
2. 以正弦信号为例,学习和掌握利用离散傅立叶变换(DFT)分析信号频谱的方法。
3. 了解应用DFT进行信号频谱分析过程中可能出现的问题,以便在实际中正确应用DFT。
4. 学习和熟悉在计算机上作图显示和研究信号的离散频谱
二、实验原理与方法
在各种信号序列中,有限长序列的数字信号处理占有很重要地位,对有限长序列,我们可以使用离散傅立叶变换(DFT), 这一变换不但可以很好地反映序列的频谱特性,而且易于用快速算法在计算机上实现,当序列x(n)的长度为N时,它的DFT定义为: 反变换为:
X (k)=
?x(n)Wn?0N?1knN,WN?e?j2?N
1x(n)=
NN?1k?0?kn ?X(k)WN有限长序列的DFT是其Z变换在单位圆上的等距采样,或者说是序列傅立叶变换的等距采样,因此可以用于序列的谱分析。
DFT要求被分析序列的长度为有限长,对无限长和很长的序列则需要截取。截取的结果使得信号的频谱分析出现频率泄漏。本实验分析的周期性信号,对周期信号,当截取的序列长度是信号周期的整数倍的时候,DFT分析的频率离散点恰好采在周期信号的谐波分量和其它零值频率点上,能正确反映信号的频谱。当截取的序列长度不为信号周期的整数倍时,DFT分析的结果就会有频率泄漏的反映。
1
三、实验内容
1. 设计说明
编制程序用DFT分析正弦信号的频谱。具体包括以下几部分 (1)编程产生正弦抽样输入信号
x(t) = sin(Ωt) = sin(2πf t) x(n) = x(nT) = sin(2πf n T)
正弦信号的频率f、取样点数N和取样间隔T通过人机对话的方式由键盘输入,以便调整。 (2)编程实现DFT的运算
DFT的计算公式为
X(k)??x(n)en?0N?1??j2NnkN?12?2???x(n)cos(nk)?j?x(n)sin(nk)
NNn?0n?0N?1?Xr(k)?jXi(k)
(3)计算DFT的幅度
|X(k)|?Xr(k)2?Xi(k)2
(4)作图画出DFT的幅度谱线。
2.实验步骤
将编制的程序输入计算机,调试运行正确后,进行以下实验。
(1)分别在下列几种情况下,输入正弦信号的频率f、采样点数N和采样周期T,观察和研究DFT的结果,并记录谱线的大体形状。 (a) f = 50 Hz,N = 32,T = 0.000625 s (b) f = 50 Hz,N = 32,T = 0.005 s (c) f = 50 Hz,N = 32,T = 0.004 s (d) f = 150 Hz,N = 32,T = 0.000625 s
(2)修改程序,将输入信号改变成50 Hz和150 Hz两个正弦信号分量的迭加,并令50 Hz分量的幅度为2,150 Hz分量的幅度为1。即
x(n) = 2 sin(2π50 n T) + sin(2π150 n T)
取N = 32,分别在T = 0.000625 s、T = 0.0025 s和T = 0.002 s情况下进行
2
DFT分析,观察和记录结果。
(3)有余力的同学还可以将输入信号改成50Hz的周期性方波,再对其进行DFT分析。
四、C语言参考程序
/* 用DFT分析正弦信号频谱的C语言程序 */ #include
float x[1024],y[1024], w[1024]; void draw(int);
void axis(int,int);
main() {
int N,f,n,k; float T,r,i,c; /* 键盘输入f、N、T */
printf(\ scanf(\
printf(\ scanf(\
printf(\ scanf(\ c=2*PI/N;
/* 产生正弦抽样信号 */ for(n=0;n x[n]=sin(2*PI*f*n*T); } /* 计算DFT */ for(k=0;k for(n=0;n r=r+x[n]*cos(c*n*k); i=i+x[n]*sin(c*n*k); } y[k]=r; w[k]=i; } 3