1、实验报告课程名称: 信号分析与处理 指导老师: 成绩:_实验名称:离散傅里叶变换和快速傅里叶变换 实验类型: 基础实验 同组学生姓名: 第二次实验 离散傅里叶变换和快速傅里叶变换装 订 线一、实验目的1.1掌握离散傅里叶变换(DFT)的原理和实现;1.2掌握快速傅里叶变换(FFT)的原理和实现,掌握用FFT对连续信号和离散信号进行谱分析的方法。1.3 会用Matlab软件进行以上练习。二、实验原理2.1关于DFT的相关知识序列x(n)的离散事件傅里叶变换(DTFT)表示为,如果x(n)为因果有限长序列,n=0,1,.,N-1,则x(n)的DTFT表示为,x(n)的离散傅里叶变换(DFT)表达式
2、为,序列的N点DFT是序列DTFT在频率区间0,2上的N点灯间隔采样,采样间隔为2/N。通过DFT,可以完成由一组有限个信号采样值x(n)直接计算得到一组有限个频谱采样值X(k)。X(k)的幅度谱为,其中下标R和I分别表示取实部、虚部的运算。X(k)的相位谱为。离散傅里叶反变换(IDFT)定义为。 2.2关于FFT的相关知识快速傅里叶变换(FFT)是DFT的快速算法,并不是一个新的映射。FFT利用了函数的周期性和对称性以及一些特殊值来减少DFT的运算量,可使DFT的运算量下降几个数量级,从而使数字信号处理的速度大大提高。若信号是连续信号,用FFT进行谱分析时,首先必须对信号进行采样,使之变成离
3、散信号,然后就可以用FFT来对连续信号进行谱分析。为了满足采样定理,一般在采样之前要设置一个抗混叠低通滤波器,且抗混叠滤波器的截止频率不得高于与采样频率的一半。 比较DFT和IDFT的定义,两者的区别仅在于指数因子的指数部分的符号差异和幅度尺度变换,因此可用FFT算法来计算IDFT。三、 实验内容与相关分析(共6道)说明:为了便于老师查看,现将各题的内容写在这里题目按照3.1、3.2、.、3.6排列。每道题包含如下内容:题干、解答(思路、M文件源代码、命令窗口中的运行及其结果)、分析。其中“命令窗口中的运行及其结果”按照小题顺序排列,各小题包含命令与结果(图形或者序列)。3.1 求有限长离散时
4、间信号x(n)的离散时间傅里叶变换(DTFT)X(ej)并绘图。(1) 已知;(2)已知。【解答】思路:这是DTFT的变换,按照定义编写DTFT的M文件即可。考虑到自变量是连续的,为了方便计算机计算,计算时只取三个周期-2,4中均匀的1000个点用于绘图。理论计算的各序列DTFT表达式,请见本题的分析。M文件源代码(我的Matlab源文件不支持中文注释,抱歉):function DTFT(n1,n2,x)%This is a DTFT function for my experiment of Signal Processing & Analysis.w=0:2*pi/1000:2*pi;%D
5、efine the bracket of omega for plotting.X=zeros(size(w);%Define the initial values of X.for i=n1:n2 X=X+x(i-n1+1)*exp(-1)*j*w*i);%It is the definition of DTFT.endAmp=abs(X);%Acquire the amplification.Phs=angle(X);%Acquire the phase angle (radian).subplot(1,2,1);plot(w,Amp,r); xlabel(Omega);ylabel(Am
6、plification);hold on;%Plot amplification on the left.subplot(1,2,2);plot(w,Phs,b);xlabel(Omega);ylabel(Phase Angle (radian);hold off;%Plot phase angle on the right.end命令窗口中的运行及其结果(理论计算的各序列DTFT表达式,请见本题的分析):第(1)小题 n=(-2:2); x=1.n;DTFT(-2,2,x);图3.1.1在-2,4范围内3个周期的幅度谱和相位谱(弧度制)第(2)小题 n=(0:10); x=2.n; DTFT
7、(0,10,x);图3.1.2在-2,4范围内3个周期的幅度谱和相位谱(弧度制)【分析】对于第(1)小题,由于序列x(n)只在有限区间(-2,-1,-,1,2)上为1,所以是离散非周期的信号。它的幅度频谱相应地应该是周期连续信号。事实上,我们可计算出它的表达式:,可见幅度频谱拥有主极大和次极大,两个主极大间有|5-1|=4个极小,即有3个次级大。而对于它的相位频谱,则是周期性地在-、0、之间震荡。对于第(2)小题,由于是离散非周期的信号。它的幅度频谱相应地应该是周期连续信号。而它的表达式:,因此主极大之间只有|0-1|=1个极小,不存在次级大。而对于它的相位频谱,则是在一个长为2的周期内有|1
8、1-1|=10次振荡。而由DTFT的定义可知,频谱都是以2为周期向两边无限延伸的。由于DTFT是连续谱,对于计算机处理来说特别困难,因此我们才需要离散信号的频谱也离散,由此构造出DFT(以及为加速计算DFT的FFT)。3.2已知有限长序列x(n)=8,7,9,5,1,7,9,5,试分别采用DFT和FFT求其离散傅里叶变换X(k)的幅度、相位图。【解答】思路:按照定义编写M文件即可。M文件源代码:i) DFT函数:function DFT(N,x)%This is a DFT function for my experiment of Signal Processing & Analysis.k
9、=(0:N-1);%Define variable k for DFT.X=zeros(size(k);%Define the initial valves of X.for i=0:N-1 X=X+x(i+1)*exp(-1)*j*2*k*pi/N*i);%It is the definition of DFT.endAmp=abs(X);%Acquire the amplification.Phs=angle(X);%Acquire the phase angle (radian).subplot(1,2,1);stem(k,Amp,.,MarkerSize,18); xlabel(k);
10、ylabel(Amplification);hold on;%Plot amplification on the left.subplot(1,2,2);stem(k,Phs,*);xlabel(k);ylabel(Phase Angle (radian);hold off;%Plot phase angle on the right.endii) 基2-FFT函数function myFFT(N,x)%This is a base-2 FFT function.lov=(0:N-1);j1=0;for i=1:N %indexed addressing if ij1+1 temp=x(j1+
11、1); x(j1+1)=x(i); x(i)=temp; end k=N/2; while k1 digit=digit+1; k=k/2;endn=N/2;% Now we start the butterfly-shaped process.for mu=1:digit dif=2(mu-1);%Differnce between the indexes of the target variables. idx=1; for i=1:n idx1=idx; idx2=1; for j1=1:N/(2*n) r=(idx2-1)*2(digit-mu); wn=exp(j*(-2)*pi*r
12、/N);%It is the circulating coefficients. temp=x(idx); x(idx)=temp+x(idx+dif)*wn; x(idx+dif)=temp-x(idx+dif)*wn; idx=idx+1; idx2=idx2+1; end idx=idx1+2*dif; end n=n/2;endAmp=abs(x);%Acquire the amplification.Phs=angle(x);%Acquire the phase angle (radian).subplot(1,2,1);stem(lov,Amp,.,MarkerSize,18);x
13、label(FFT k);ylabel(FFT Amplification);hold on;%Plot the amplification.subplot(1,2,2);stem(lov,Phs,*);xlabel(FFT k);ylabel(FFT Phase Angle (radian);hold off;end命令窗口中的运行及其结果:DFT: x=8,7,9,5,1,7,9,5; DFT(8,x);图3.2.1 DFT的幅度谱和相位谱(弧度制)FFT: x=8,7,9,5,1,7,9,5; myFFT(8,x);图3.2.2 FFT算法的幅度谱和相位谱(弧度制)图3.2.1 DFT的
14、幅度谱和相位谱(相位是弧度制的)【分析】DFT是离散信号、离散频谱之间的映射。在这里我们可以看到序列的频谱也被离散化。事实上,我们可以循着DFT构造的方法验证这个频谱:首先,将序列做N=8周期延拓,成为离散周期信号。然后利用DFS计算得到延拓后的频谱:,从而取DFS的主值区间得到DFT,与图一致。因此计算正确。而对于FFT,我们可以看到它给出和DFT一样的结果,说明了FFT算法就是DFT的一个等价形式。不过,由于序列不够长,FFT在计算速度上的优越性尚未凸显。3.3已知连续时间信号x(t)=3cos8t, X()=,该信号从t=0开始以采样周期Ts=0.1 s进行采样得到序列x(n),试选择合
15、适的采样点数,分别采用DFT和 FFT求其离散傅里叶变换X(k)的幅度、相位图,并将结果与X(k)的幅度、相位图,并将结果与X()相比较。【解答】思路:此题与下一题都是一样的操作,可以在编程时统一用变量g(0或1)来控制是否有白噪声。这里取g=0(无白噪声)。 另外,分别取12点、20点、28点采样,以考察采样长度的选择与频谱是否泄漏的关系。M文件源代码:i)采样函数:function xs=sampJune3(N,Ts,g)%This is a function applied to Problem 3 & 4.%N: number of sampling points; Ts: sampl
16、ing period; g=0: No gaussian noise; g=1: gussian noise exists.n=1:N;for i=1:N%Note that i must start at 0 in analysis. Thus I made a adaptation.sample(i)=3*cos(8*pi*Ts*(i-1)+g*randn;%In Matlab, index starts at 1, which is not consistent with our habit. Thus I made a adaptation in codes. %It is a sam
17、pling process with(g=1)/without(g=0) noise.endxs=sample;plot(n-1,sample,.,MarkerSize,18);xlabel(n);ylabel(value);hold off;% Must use (n-1), because in Matlab, index starts at 1.endii)DFT和基2-FFT函数的代码,请见第3.2节。不需再新编一个。命令窗口中的运行及其结果:12点采样: xs=sampJune3(12,0.1,0);%末尾的0表示无噪声。 DFT(12,xs); myFFT(12,xs);图3.3.
18、1 进行12点采样得到的序列图3.3.2 DFT的幅度谱和相位谱(弧度制),出现了泄漏图3.3.3 FFT的幅度谱和相位谱(弧度制)。出现了频谱泄漏。20点采样: xs=sampJune3(20,0.1,0);%末尾的0表示无噪声。 DFT(20,xs); myFFT(20,xs);图3.3.4 进行20点采样得到的序列图3.3.5 DFT的幅度谱和相位谱(弧度制)。频谱无泄漏。图3.3.6 FFT的幅度谱和相位谱(弧度制)。频谱无泄漏。 28点采样: xs=sampJune3(28,0.1,0);%末尾的0表示无噪声。 DFT(28,xs); myFFT(28,xs);图3.3.7 进行28
19、点采样得到的序列图3.3.8 DFT的幅度谱和相位谱(弧度制)。再次出现频谱泄漏。图3.3.9 FFT的幅度谱和相位谱(弧度制)。再次出现频谱泄漏。【分析】 分别取12点、20点、28点采样,以考察采样长度的选择与频谱是否泄漏之间的关系。现在与原信号频谱比较后可以得出如下结论:图3.3.10 原信号的频谱(由两个冲激函数组成)原信号的频谱是,在8上各有一强度为3的谱线,在其余频率上为0。可见原信号被0.1 s采样周期的采样信号离散化之后,谱线以20为周期重复,并且只在(20k8) (k为整数)处非0。那么,在20点DFT(采样时间原信号周期的整数倍)中,只有第8根、第12根谱线非0。而在12点
20、、28点DFT中,由于采样时间不是原信号周期的整数倍,谱线将向两边泄漏。 不过,对比12点采样和28点采样,我们还可以发现,28点采样频谱的主谱线高度是次谱线高度的4倍,儿12点采样频谱的主谱线高度是次谱线高度的3倍。可见,在无法保证采样时间是信号周期整数倍的情况下,增加采样时间有助于减轻频谱泄漏的程度。3.4对第3步中所述连续时间信号叠加高斯白噪声信号,重复第3步过程。【解答】思路:此题与上一题都是一样的操作,可以在编程时统一用变量g(0或1)来控制是否有白噪声。这里取g=1(有白噪声)。 另外,仍然分别取12点、20点、28点采样,以考察采样长度的选择与频谱是否泄漏的关系。M文件源代码:不
21、需要再新编程序。可以直接引用上面的函数:sampJune3(N,Ts,g),取g=1,以体现存在白噪声DFT(N,x)myFFT(N,x)命令窗口中的运行及其结果:12点采样: xs=sampJune3(12,0.1,1);%末尾的1表示有噪声。 DFT(12,xs); myFFT(12,xs);图3.4.1 进行12点采样得到的含噪声的序列图3.4.2 含噪声序列DFT的幅度谱和相位谱(弧度制)。图3.4.3 含噪声FFT的幅度谱和相位谱(弧度制)。20点采样: xs=sampJune3(20,0.1,1);%末尾的1表示有噪声。 DFT(20,xs); myFFT(20,xs);图3.4.
22、4 进行20点采样得到的含噪声序列图3.4.5 含噪声DFT的幅度谱和相位谱(弧度制)。 图3.4.6 含噪声FFT的幅度谱和相位谱(弧度制)。28点采样: xs=sampJune3(28,0.1,0);%末尾的1表示有噪声。 DFT(28,xs); myFFT(28,xs);图3.4.7 进行28点采样得到的含噪声序列图3.4.8 含噪声DFT的幅度谱和相位谱(弧度制)。图3.4.9 含噪声FFT的幅度谱和相位谱(弧度制)。【分析】依然分别取12点、20点、28点采样。仍然与原信号的频谱(图3.3.10)比较,可以得到结论:由于叠加了噪声,所以频谱都受到了一定的干扰。由于白噪声在各个频率的功
23、率相等,因此频谱上各处的干扰也是均匀随机的。不过,通过对比我们可以发现,20点采样(无噪声时不发生泄漏的采样方法)在存在噪声时,仍然可以明显区分出原信号的谱线。第二好的是28点采样,因为采样时间较长,即使存在频谱泄漏也能较好地区分原信号的谱线。而最差的是12点采样,由于噪声的存在和严重的频谱泄漏,它的次谱线与主谱线的高度相差不大,使原信号不明显。3.5已知序列,X(k)是x(n)的6点DFT,设。(1) 若有限长序列y(n)的6点DFT是,求y(n)。(2) 若有限长序列w(n)的6点DFT W(k)是的实部,求w(n)。(3) 若有限长序列q(n)的3点DFT是,k=0,1,2,求q(n)。
24、【解答】思路:这是对DFT进行变换后求IDFT。考虑到IDFT和DFT定义的对称性,可以在DFT的基础上略加调整既可用于计算。首先,它的6点采样是序列是。值得指出的是,在Matlab中,数组的序号是从1开始的(而在信号分析中习惯从0开始),不过我在上面编程时已考虑到这一情况,具体可见实验报告最后的“附录”。 首先生成x(n)的6点DFT,再按照各小题分别转换,最后求相应的IDFT。M文件源代码:i) 输出x(n)的6点DFT的函数:function X = ExportDFT(N,x)%This is a DFT function that exports the solution to ve
25、ctor X.k=(0:N-1); %Define variable k for DFT.X=zeros(size(k); %Define the initial valves of X.for i=0:N-1 X=X+x(i+1)*exp(-1)*j*2*k*pi/N*i); %It is the definition of DFT.endendii)算第(1)小题的Y(k)的函数:function Y = Convertor1(X)%This is a mathematical convertor for the subproblem (1).for k=1:6 Y(k)=exp(-j)*
26、2*pi*(-4*(k-1)/6)*X(k);%Here we must use (k-1),because in Matlab index starts at 1.endendiii)算第(2)小题的W(k)的函数:function W = Convertor2(X)%This is a mathematical convertor for the subproblem (2).W=real(X);%Acquire the real part of X.endiv)算第(3)小题的Q(k)的函数:function Q = Convertor3(X)%This is a mathematica
27、l convertor for the subproblem (3).Q=zeros(3);% Detailed explanation goes herefor tmp=1:3 Q(tmp)=X(2*tmp);endendv)输出IDFT的函数:function x = ExportIDFT(N,X)%This is the IDFT function for my experiment.n=(0:N-1);%Define variable n for IDFT.x=zeros(size(n);%Define the initial valves of x.for k=0:N-1 x=x+X
28、(k+1)*exp(j*2*k*pi/N*n);endx=x/N;a=real(x);%We MUST use real(x), though we may ALREADY know x is real. %Its caused by numeric calculation (not analytic calculation) in Matlab.stem(n,a,.,MarkerSize,18);xlabel(n);ylabel(Solution);end命令窗口中的运行及其结果: x=4,3,2,1,0,0; X=ExportDFT(6,x);第(1)小题 Y=Convertor1(X);
29、 y=ExportIDFT(6,Y)y = Columns 1 through 4 0.0000 + 0.0000i 0.0000 + 0.0000i 4.0000 + 0.0000i 3.0000 + 0.0000i%虚部都是0,说明是实数 Columns 5 through 6 2.0000 + 0.0000i 1.0000 - 0.0000i %虚部都是0,说明是实数%事实上,在Matlab中,由于数值计算的截断误差,对原复数做乘法后,答案的虚部可能有一极小的量。答案:y(n)=0,0,4,3,2,1图3.5.1 输出的y(n),这是对x(n)的圆周移位。第(2)小题 W=Convert
30、or2(X); w=ExportIDFT(6,W)w = Columns 1 through 4 4.0000 + 0.0000i 1.5000 + 0.0000i 1.0000 + 0.0000i 1.0000 + 0.0000i%虚部都是0,说明是实数 Columns 5 through 6 1.0000 + 0.0000i 1.5000 + 0.0000i %虚部都是0,说明是实数;%事实上,在Matlab中,由于数值计算的截断误差,对原复数做乘法后,答案的虚部可能有一极小的量。答案:w(n)=0,0,4,3,2,1图3.5.2 输出的w(n)。第(3)小题 Q=Convertor3(X
31、); q=ExportIDFT(6,Q)q = Columns 1 through 4 1.5000 - 0.0000i -0.1667 - 0.2887i 0.7500 - 1.2990i 0.8333 - 0.0000i Columns 5 through 6 -0.5000 - 0.8660i 1.0833 - 1.8764i 这里的答案都是幅值、相位均非0的复数,而教材(实验指导第109页)并未要求作图,这里略去。 答案:q(n)=1.5,-0.1667-0.2887i,0.7500-1.2990i,0.8333,-0.5000-0.8660i,1.0833-1.8764i【分析】对原
32、序列进行DFT运算后,可以得到X(k)=10,3.5-4.33i,2.5-0.866i,2,2.5+0.866i,3.5+4.330i。第(1)小题,根据DFT的性质可以判断,对原频谱乘上旋转因子之后进行IDFT得到的y(n),就是对原序列做圆周移位:。第(2)小题,由于对原频谱取了实部,那么根据DFT的奇偶虚实性知,得到的w(n)也是实数的。第(3)小题,对原信号进行了尺度变换(“抽取”),导致丢失了一些谱线,使得无法通过IDFT得到原来的序列x(n)。说明频谱记录了原有信号的信息,若频谱发生变化,则对应的时域信号也随之改变。3.6已知信号,其中f1=4 Hz、f2=4.02 Hz、f3=5
33、 Hz,采用采样频率为20 Hz进行采样,求(1) 当采样长度N分别为512和2048情况下x(t)的幅度频谱;(2) 当采样长度N为32,且增补N个零点、4N个零点、8N个零点、16N个零点情况下x(t)的幅度频谱。【解答】思路:采样是有限且离散的,用DFT(FFT算法)计算频谱,以便得到离散的频谱,并且具有较高速度。20 Hz对应的采样周期Ts=0.05s。M文件源代码:i)采样函数(其中Plus表示采样后补零的个数)function xs=sampJune6(N,Plus)%This is a function applied to Problem 6%N:samling points;
34、Plus:quantity of additinal zero points.Ts=1/20;w1=2*pi*4;w2=2*pi*4.02;w3=2*pi*5;sample=zeros(1,N+Plus);n=(1:N);sample=sin(w1*Ts*(n-1)+sin(w2*Ts*(n-1)+sin(w3*Ts*(n-1);for p=(N+1):(N+Plus) sample(p)=0;%Add zero points.endxs=sample;%Returnendii)由于只要求显示幅度频谱,所以删去myFFT函数中绘制相位频谱的命令,使它的最后部分修改如下:原来的:function
35、 myFFT(N,x)%This is a base-2 FFT function wrote by myself.Amp=abs(x);%Acquire the amplification.Phs=angle(x);%Acquire the phase angle (radian).subplot(1,2,1);stem(lov,Amp,.);xlabel(FFT k);ylabel(FFT Amplification);hold on;%Plot the amplification.subplot(1,2,2);stem(lov,Phs,*);xlabel(FFT k);ylabel(FF
36、T Phase Angle (radian);hold off;end修改后的:function myFFT(N,x)%This is a base-2 FFT function wrote by myself.Amp=abs(x);%Acquire the amplification.stem(lov,Amp,.);xlabel(FFT k);ylabel(FFT Amplification);%Plot the amplification.end命令窗口中的运行及其结果:第(1)小题 x512=sampJune6(512,0); x2048=sampJune6(2048,0); myFFT
37、(512,x512); myFFT(2048,x2048);图3.6.1 进行512点采样得到的频谱图3.6.2 进行2048点采样得到的频谱第(2)小题 x32p1N=sampJune6(32,32*1);%32点采样,补零N=32个,共64个数据点 x32p4N=sampJune6(32,32*4);%32点采样,补零4N=128个,共160个数据点 x32p8N=sampJune6(32,32*8);%32点采样,补零8N=256个,共288个数据点 x32p16N=sampJune6(32,32*16);%32点采样,补零16N=128个,共544个数据点 myFFT(32+32*1,
38、x32p1N); myFFT(32+32*4,x32p4N); myFFT(32+32*8,x32p8N); myFFT(32+32*16,x32p16N);图3.6.3 采样N=32点,补零N=32点,共64点的频谱图3.6.4 采样N=32点,补零4N=128点,共160点的频谱图3.6.5 采样N=32点,补零8N=32点,共288点的频谱图3.6.6 采样N=32点,补零16N=32点,共544点的频谱【分析】请注意,题目只要求绘制幅度频谱。第(1)小题:首先,由于采样时间都不是原有信号周期的整数倍,两个采样方式对应的频谱均发生了泄漏。不过由于2048点采样对应的采样时间较长,它频谱泄
39、漏的程度比512点采样轻。其次,由于20 Hz的2048点采样的频率分辨率为20/2048=0.0098 Hz 0.2 Hz,因此4 Hz和4.02 Hz对应的谱线无法区分。第(2)小题:首先,由于采样时间都不是原有信号周期的整数倍,频谱均发生了泄漏。而且由于采样时间较短,频谱泄漏比第(1)小题的两个频谱更加严重。其次,由于都是32点采样,因此实际的频率分辨率较低,无法区分4 Hz和4.02 Hz对应的谱线。最后,虽然都是32点采样,但由于补0个数的不同,各频谱谱线间距各不相同。例如,补零最多的序列一共有544个数据点,因此谱线间距小。由此还可以得出结论:数据点个数越多,则频谱越倾向于连续。可
40、见,当采样时间不是原信号周期整数倍而且采样时间较短时,频谱泄漏相当严重的,所有的频率上都有了幅值即能量,可见当取样信号的样点数取得不够时,原信号所携带的信息就不能被完全取得。而若将取样信号补零,由图可见信号的能量相应的泄漏到了几乎所有频率上了,这样所得的信号仍然严重失真,因此不能靠将信号补零这样的方法来取得更精确的采样信号。要想获得不泄漏的频谱,在采样频率不变的前提下,必须使采样时间等于原信号周期的整数倍,或者尽量延长采样时间以减少泄漏。四、实验体会4.1关于各个实验的分析,请见第3部分每道题的末尾。4.2在Matlab中,数组的序号是从1开始的,这与信号处理时通常的序号起点(0)不一致。我在
41、编程充分注意到了这个问题。4.3由于Matlab进行数值计算的过程中存在截断误差,所以最后算得的值并不是准确值。例如,对一个复数z,即使f(z)的虚部为零,但由于截断误差的存在(特别是z的虚部为无穷小数时),最终f(z)值的虚部可能是一个极小的非零值,从而在显示时出现“零虚部”(例如,2+0.0000i )。4.4通过利用软件对离散信号的各种变换DTFT、DFT以及其快速算法FFT进行计算,使得在实验中比较难以实现的信号分析过程(离散信号的采集和显示都是比较困难的)在计算机计算中实现,证明了理论的正确性,说明仿真计算是一种十分有效的辅助手段。4.5通过这次实验和上次实验信号的采集与恢复我知道了
42、,要想尽量不失真地取得一个信号的频谱(低混叠、低泄漏),应该尽量满足以下条件:(1) 使用的开关函数要尽量接近理想冲激串;(2) 采样频率要高于原始信号的奈奎斯特频率。对于频谱不受限的信号,为了避免频谱混叠,应该使用低通滤波器进行滤波;(3) 对于频带不受限的信号,抗混叠滤波器要尽量接近理想滤波器。(4) 采样的持续时间最好能够是原信号周期的整数倍,一避免频谱泄漏。而当不知道原信号的周期(或者周期不稳定)时,就要通过延长采样时间来尽量减少泄漏,从而突出原信号的谱线。(5) 当信号混有白噪声时,就更应注意减少频谱的泄漏和混叠,否则信号分析更加困难,甚至可能会使原信号被误差“淹没”。(6) 若原信
43、号有多个频率成分,应该尽量提高采样的频率分辨率,以区分出更细微的频率差异。4.6在实验中,在计算2048点采样时,初步体会到了FFT算法的优越性。在我的计算机上,FFT算法的确比原始的DFT更快。不过由于采样点数较少,这一差别仅限于几秒钟。在采样点更多时,FFT在速度上的优越性应该能进一步突出。4.7实验中遇到的问题及其解决:实验中有些M文件代码总是出错。解决方法:重新检查,在稿纸上演算,体会运算过程。例如,Matlab数组序号起始位置(为1,而非C语言的0)的问题,就是这样发现的。编程时对代码不熟悉,使得思路比较混乱。解决方法:画流程图,理清思路。对比较复杂的程序尤其如此。感到大一时C语言教学并未强调流程图,这是一个教学中值得改进的地方。C语言中,比起掌握运算符优先级,对流程图思想的培养显得更为重要。附录:附录A值得指出的是,在Matlab中,数组的序号是从1开始的(而在信号分析中习惯从0开始),我在上面编程时已考虑到这一情况。例如,下面可以验证DFT函数的正确性(顺便也可以验证FFT函数)。 n=1:8; xn=6*cos(pi*(n-1)/4); DFT(8,xn);图附1 验证DFT函数教材112页给出了这一序列的DFS幅度谱。根据DFS和DFT之间的关系,将上面的DFS幅度谱的幅值