快速傅里叶变换与信号频谱分析实验报告[数字信号处理实验一][2014年10月25日]班级:信息24班姓名:赵恒伟学号:21205020991实验一快速傅里叶变换与信号频谱分析实验报告一.实验目的1.在理论学习的基础上,通过本实验加深对离散傅里叶变换的理解。2.熟悉并掌握按时间抽取编写快速傅里叶变换(FFT)算法的程序。3.了解应用FFT进行信号频谱分析过程中可能出现的问题,例如频谱混淆、泄漏、栅栏效应等,以便在实际中正确使用FFT算法进行信号处理。二.实验内容1.仔细分析教材第六章“时间抽取法FFT的FORTRAN程序”,编写出相应的使用FFT进行信号频谱分析的Matlab程序。2.用FFT程序分析正弦信号,分别在以下情况进行分析,并讨论所得的结果三.实验过程记录a)信号频率F=50Hz,采样点数N=32,采样间隔T=0.000625s;HzNfHzTss50,16001f,满足:)为整数(,kNkffs,这里k=1。看出FFT采样采到频域谱峰上,出线单线谱,单线谱恰好位于频谱1Hz的位置。FFT之后的频域是正弦函数的频谱。2b)信号频率F=50Hz,采样点数N=32,采样间隔T=0.005s;HzNfHzTss25.6,2001f,满足:)为整数(,kNkffs,这里k=8。看出FFT采样采到频域谱峰上,出线单线谱,单线谱恰好位于频谱8Hz的位置.FFT之后的频域是正弦函数的频谱。c)信号频率F=50Hz,采样点数N=32,采样间隔T=0.0046875s;3HzNfHzTss66.6,33.2131f,不满足:)为整数(,kNkffs,这里k=7.5。看出FFT采样没有采到频域谱峰上,存在一定相位差,致使FFT频域频谱混叠。d)信号频率F=50Hz,采样点数N=32,采样间隔T=0.004s;HzNfHzTss8125.7,2501f,不满足:)为整数(,kNkffs,这里k=6.4。看出FFT采样没有采到频域谱峰上,存在一定相位差,致使FFT频域频谱混叠。e)信号频率F=50Hz,采样点数N=64,采样间隔T=0.000625s;4HzNfHzTss25,16001f,满足:)为整数(,kNkffs,这里k=2。看出FFT采样采到频域谱峰上,出线单线谱,单线谱恰好位于频谱2Hz的位置.FFT之后的频域是正弦函数的频谱。f)信号频率F=250Hz,采样点数N=32,采样间隔T=0.005s;5HzNfHzTss25.6,2001f,满足:)为整数(,kNkffs,这里k=40。看出FFT采样采到频域谱峰上,出线单线谱,而单线谱位于频谱8Hz的位置.FFT之后的频域反应正弦函数的频谱。这是因为频率不满足内奎斯特采样定理,发生欠采样,单峰不会在频域幅度上重叠,相互间隔的重叠。所以图显示的是FFT显示的频域是重叠频率为-200+250=50Hz,和400-250=150Hz的频谱图(50/6.25=8,150/6.25=24,表示单峰的位置与图相符)。g)将c)中信号后补32个0,做64点FFT将c)直接采样64个点做FFT6HzNfHzTss33.3,33.2131f,满足:)为整数(,kNkffs,这里k=15。看出FFT采样采到频域谱峰上,出线单线谱。补零之后做FFT,与补零之前的有较大不同,补零之后原信号周期延拓,频谱虽然不一样,但是包络一致。直接做64点FFT和补零FFT分辨率一样,但是32位FFT补零之后在循环移位中与64位FFT有差别,频谱不同。四.实验总结:【一】a)、b)与c),d),FFT得到的频谱有明显不同,a)、b)出现单峰,主要是因为采到峰值,而c),d)受栅栏效应影响,在其他频率也有非零值。可以总结出是否出现单峰决定于是否满足)为整数(,FkNkfs。【二】分析信号与采样及FFT变换参数,可以发现信号频率F决定信号本身周期,采样间隔决定采样频率,采样频率需满足内奎斯特采样定律。Nsf表示采样点之间的频谱宽度,)为整数(,FkNkfs。k决定频谱单峰的位置。1)在实验a)、b)、c)和d)中,正弦信号的初始相位对频谱图中的幅度特性是否有影响?为什么?答:不影响,因为频率是相位的变化率,与初始值无关。2)信号补零后做FFT是否可以提高信号频谱的分辨率?为什么?7答:不能提高分辨率,通过补零可以观察到更多频点,但是不意味着补零能真正提高分辨率,因为x[n]只是x(t)的主值序列,而将x[n]末尾补零得到x’[n],周期延拓之后与原来序列并不相同,更不是x(t)的采样。所以有意义的数据并未增加。频谱分辨率的真正提高只能在时域采样时增加采样长度和数量来实现。五.实验代码Matlab实现clc;clear;f=input('正弦频率')N=input('采样点数')T=input('采样间隔')choise=input('是否补0yes=1/no=0')n=0:T:(N-1)*T;%采样点k=0:N-1;x=sin(2*pi*f*n);%抽样后的离散信号ifchoise==1e=input('请输入要补入0的个数')x=[xzeros(1,e)]%将所加0存入x矩阵N=N+e;elseend%加零k=0:N-1;%给k重新赋值,因为有可能出现加零状况bianzhi=bi2de(fliplr(de2bi(k,length(de2bi(N-1)))))+1;%利用库函数进行变址运算,fliplr函数实现矩阵的左右翻转forl=1:NX(l)=x(bianzhi(l));%将采样后的值按照变址运算后的顺序放入X矩阵中endd1=1;form=1:log2(N)d2=d1;%做蝶形运算的两个数之间的距离d1=d1*2;%同一级之下蝶形结之间的距离W=1;%蝶形运算系数的初始值dw=exp(-j*pi/d2);%蝶形运算系数的增加量fort=1:d2%fori=t:d1:Ni1=i+d2;if(i1N)break;%判断是否超出范围8elsep=X(i1)*W;X(i1)=X(i)-p;X(i)=X(i)+p;%蝶形运算endendW=W*dw;%蝶形运算系数的变化endendsubplot(3,1,1);t=0:0.0000001:N*T;plot(t,sin(2*pi*f*t));xlabel('时间/s');ylabel('时域幅度');%画原曲线subplot(3,1,2);stem(k,x,'k*');xlabel('抽样后N');ylabel('时域幅度');%画采样后的离散信号subplot(3,1,3);stem(k,abs(X)/max(abs(X)));xlabel('频率/Hz');ylabel('频域幅度');%画自己的fft的运算结果