实验三 离散付里叶变换(DFT)
一、实验目的:
1. 掌握离散付里叶级数 2. 掌握DFT变换。 3. 掌握DFT特性。
4. 掌握利用DFT计算线性卷积。 5. 掌握快速付里叶变换(FFT)。
二、实验原理:
1.离散付里叶级数(DFS) ~x(n)为周期序列,其频率为基本频率(2~数(DFS)为:;X(k)N1/N)的倍数(或谐波)。其离散付叶级
n0j~x(n)e2Nkn,k0,1,,
IDFS为:~x(n)1NN1k0~X(k)ej2Nkn
2.离散付里叶变换(DFT)
x(n)为长度N的有限长序列,其DFT为:x(n)1NN1N1k0X(k)ej2Nkn
IDFT为:X(k)n0x(n)ej2Nkn,k0,1,
3.DFT的特性:
(1) 线性性:DFT[ax1(n)bx2(n)]aDFT[x1(n)]bDFT[x2(n)]
x(0)n01nN1(2) 循环折叠(圆周对称)性:x((n))N**(3) 共轭性: DFT[x(n)]X((k))N
x(Nn)
*(4) 实序列的对称性(圆周共轭对称性):X(k)X((k))N
x(nm)x((nm))N (5) 序列的圆周移位:~ 12
(6) 频域中的圆周移位:DFT[WNlnx(n)]X((kl))|NRN(k)
(7) 时域循环卷积:DFT[x1(n)x2(n)]X1(k)X2(k) (8) 频域循环卷积(乘法性):DFT[x1(n)x2(n)]N121NX1(k)X2(k)
(9) 帕塞瓦尔(Parseval)定理:Exn0x(n)1NN1k0X(k)2
4.用DFT计算线性卷积:
设x1(n)为N1点序列,x2(n)为N2点序列,x3(n)为x1(n)和x2(n)的线性卷积,其为N1N21点序列,x4(n)为x1(n)和x2(n)的圆卷积,其长度为
N,当NN1N21时,x3(n)x4(n)。实际中,采用分段卷积法,即重
叠保留法和重叠相加法。需要对数据流进行分块处理,这时直接采用DFT计算线性卷积会产生一些问题,而应该将x(n)通过重复前M-1个取样进行分块,这样可得到正确结果。
5.快速付里叶变换(FFT):
掌握基2-时域抽取FFT(DIT-FFT)和基2-频域抽取FFT(DIF-FFT)。MATLAB提供fft函数来计算x的DFT。fft函数是用机器语言写的,采用混合基法,其调用形式为:Xfft(x,N)。如N为2的幂,则得到高速的基2-FFT算法;若N不是2的乘方,则将N分解成质数,得到较慢的混合基FFT算法;最后,若N为质数,则fft函数采用的是原始的DFT算法。
三、实验步骤:
1.离散付里叶级数(DFS)
(1)自已动手:编写实现离散付里叶级数和逆离散付里叶级数的函数。
x(n){0,1,2,3,0,1,2,3,0,1,2,3}求其离散付里(2)已知周期性序列如下所示:~叶级数。
2.离散付里叶变换(DFT)
(1) 编写实现DFT和IDFT的函数。
(2) 已知x(n)是一个六点序列,如下所示:
1 x(n)00n5else
要求计算该序列的离散时间的付里叶变换和离散付里叶变换,并绘出它们的幅度和相
13
位。
(3) 序列后面增加零可以提高信号频谱的密度,比较高密度频谱与高分辨率频谱之间
的区别。考虑如下序列:x(n)cos(0.47ncos(0.53n 求其有限各样本的频谱,并要求:
(a) 当取 x(n)(0n10)时,确定出的离散付里叶变换。
(b) 将(a)的x(n)补零加长到0n100,确定出离散付里叶变换。 (c) 当取x(n)(0n500),确定出的离散付里叶变换。
3.DFT性质:
(1) 设x(n)10(0.8)n,0n10,求y(n)x((n6))15 (2) 设x1(n){1,2,2},x2(n){1,2,5,4}试分别计算下列圆卷积。 (a)y(n)x1(n)x2(n),N5 (b) y(n)x1(n)x2(n),N6
4.利用DFT计算线性卷积:
用重复法求解:x(n)n1,0n9,h(n)1,0,1,求其线卷积y(n)。
5.快速付里叶变换(FFT)
(1)用MATLAB的fft()来求信号的DFT的幅值谱。
已知模拟信号为x(t)2sin(4t)5cos(8t),以t=0.1n(n=0:N-1)进行取样,求N点DFT的幅值谱。
设N分别为(1)N=45;(2)N=50;(3)N=55;(4)N=60
(2在上题的基础上,N=64,并在信号中加入噪声(正态)w(t)(用函数randn(1,N)) x(t)2sin(4t)5cos(8t)0.8w(t)
试比较有无噪声时的信号谱。并分析在信号的检测的意义上,这种噪声会不会影响信号的检测?
四、思考题
1.通过分析计算机中的wav文件信号来进一步讨论数字信号处理中的信号分析方法。由于本题需要用户电脑具有麦克风和声卡,所以由同学们在课外完成。 (1) 先掌握几个要用到的函数:
[x,fs,bits]=waveread(‘filename’)
其功能是读取wav文件的函数;其中x表示一长串的数据,一般是两列(立体声);fs是该wav文件在采集时用的采样频率;bits是指在进行A/D转化时用的量化位长(一般是8bits或16bits). [d]=FFT(w,l)
是matlab中快速付里叶变换函数的一种输入输出形式。其中w是一列波形数据;
14
l是指示用多少点的FFT;d是频域输出. Sound(w,fs,bits)
与waveread的参数一样,它将数列的数据通过声卡转化为声音。
(2) 选择一个wav文件作为分析对象,可以用麦克风录一段用户自己的声音,也可
选择计算机中.wav的文件,在此选择Windows系统中都有的ding.wav(在
Windows\\media目录中).
(3) 编程求将此声音播放出并求出要处理的数据量的大小(答案为201911)。 (4) 分别画出单声道和双声道要处理的信号的波形图及信号频域的幅值(对信号求fft)。
(5) 求出此信号的主频率。
(6) 说明为何双声道能有一种从一侧耳朵穿过另一侧耳朵的感觉。
2.考虑一被噪声污染的信号,分析它所包含的频率分量,如一个由50Hz和120Hz正弦信号构成的信号,受零均值随机噪声的干扰,数据采样率为1000Hz.可通过fft函数来分析其信号频率成分。
3.混合信号成分分析。有一信号x由三种不同频率的正弦信号混合而成,通过得到信号的DFT,确定出信号的频率及其强度关系。
x(t)2sin(2*20*t)5cos(2*30*t)sin(2*pi*45*t)
4.信号在传输过程中,由于受信道或环境影响,在接收端得到的是噪声环境下的信号。我们利用FFT函数对这一信号进行傅里叶分析,从而确定信号的频率。 x(t)2sin(2*50*t)1.2randn(size(t));
5.天文学家记录了300年来太阳黑子的活动情况,我们对这组数据进行傅里叶分析,从而得出太阳黑子的活动周期。(其中记录的数据文件是sunspot.dat,在matlab中已有).
15
实验三实验结果
1.离散付里叶级数(DFS)
(1) 自已动手:编写实现离散付里叶级数和逆离散付里叶级数的函数。 解:% dfs.m
function[Xk]=dfs(xn,N) n=0:N-1; k=0:N-1;
WN=exp(-j*2*pi/N); nk=n'*k; WNnk=WN.^nk; Xk=xn*WNnk; % Idfs.m
function[Xk]=idfs(xn,N) n=0:N-1; k=0:N-1;
WN=exp(-j*2*pi/N); nk=n'*k;
WNnk=WN.^(-nk); xn=(Xk*WNnk)/N;
~x(n){0,1,2,3,0,1,2,3,0,1,2,3}求其离散付里(2) 已知周期性序列如下所示:
叶级数。 xn=[0 1 2 3];
N=4;
xk=dfs(xn,N)
xk = 6.0000 -2.0000 + 2.0000i -2.0000 - 0.0000i -2.0000 - 2.0000I
2.离散付里叶变换(DFT)
(4) 编写实现DFT和IDFT的函数。 解:%dft.m
function[Xk]=dft(xn,N) n=0:N-1;
k=0:N-1;
WN=exp(-j*2*pi/N);
16
nk=n'*k; WNnk=WN.^nk; Xk=xn*WNnk;
%idft.m
function[Xk]=idft(xn,N) n=0:N-1; k=0:N-1;
WN=exp(-j*2*pi/N); nk=n'*k;
WNnk=WN.^(-nk); xn=Xk*WNnk;
(5) 已知x(n)是一个六点序列,如下所示:
1 x(n)00n5else
要求计算该序列的离散时间的付里叶变换和离散付里叶变换,并绘出它们的幅度和相位。 %计算DTFT n=0:5; x=ones(1,6); k=-200:200; w=(pi/100)*k;
X=x*(exp(-j*pi/100)).^(n'*k); magX=abs(X);
angX=angle(X)*180/pi; subplot(2,2,1) plot(w/pi,magX); axis([0 2 0 6]); grid
title('DTFT幅度'); subplot(2,2,2); plot(w/pi,angX);
axis([0 2 -200 200]); grid
xlabel('以pi为单位的频率'); title('DTFT的相位'); %计算DFT N=6;
X=dft(x,N); magX=abs(X)
phaX=angle(X)*180/pi n1=1:1024;
x1=[x,zeros(1,1018)];
17
N1=1024; X1=dft(x1,N1); magX1=abs(X1);
phaX1=angle(X1)*180/pi; subplot(2,2,3) stem(n,magX); hold on
plot(6*n1/1024,magX1,'r--'); title('DFT幅度'); grid hold off
subplot(2,2,4); stem(n,phaX); hold on
plot(6*n1/1024,phaX1,'r--'); title('DTFT相位'); grid hold off magX =
6.0000 0.0000 0.0000 0.0000 0.0000 0.0000 phaX =
0 -165.9638 -126.8699 -90.0000 -68.7495 -43.0908
18
(6) 序列后面增加零可以提高信号频谱的密度,比较高密度频谱与高分辨率频谱之间
的区别。考虑如下序列:x(n)cos(0.47ncos(0.53n
求其有限各样本的频谱,并要求:
(a) 当0n10,确定出的离散付里叶变换。(给序列进行补零加长至n=99) (b) 当0n500,确定出的离散付里叶变换。 解:(a)确定10点的DFT n=0:499;
x=cos(0.47*pi*n)+cos(0.53*pi*n); n1=0:9; y1=x(1:10); subplot(2,2,1); stem(n1,y1);
title('信号x(n) 0<=n<=9'); axis([0 10 -2.5 2.5]); text(10.2,-2.3,'n'); hold on;
plot([0 10],[0 0]); hold off; %进行DFT
Y1=dft(y1,10); magY1=abs(Y1(1:6)); k1=0:5;
w1=2*pi/10*k1; subplot(2,2,2); stem(w1/pi,magY1);
title('DTFT幅度的样本'); xlabel('以pi为单位的频率');
%将10点的DFT补零加长,看谱线是否变细。 n2=0:99;
y2=[x(1:10), zeros(1,90)]; subplot(2,2,3); stem(n2,y2);
19
title('信号x(n),0<=n<9+90 zeros'); %进行DFT
Y2=dft(y2,100); magY2=abs(Y2(1:51)); k2=0:50;
w2=2*pi/100*k2; subplot(2,2,4); stem(w2/pi,magY2);
title('DTFT幅度');
xlabel('以pi为单位的频率'); axis([0 1 0 9]);
从图看出此序列在w0.5处有一主频率,原始序列则没有这一频率,它只有主频为
w0.47和w0.53的两个频率,由于其点数不够,所以出现频谱混叠失真。给
序列尾部补零,提供了更加细化的谱线。 (b)确定x(n)前500点的DFT n=0:500-1;
x=cos(0.47*pi*n)+cos(0.53*pi*n); subplot(2,1,1); stem(n,x);
title('信号x(n) 0<=n<500'); %进行DFT
X=dft(x,500); magX=abs(X(1:251)); k=0:250; w=2*pi/100*k; subplot(2,1,2); plot(w/pi,magX);
title('DFT幅度');
xlabel('以pi为单位的频率');
20
axis([0 5 0 180]);
结果表明两个靠得很近的频率,这是高分辨率的频谱。从上面实验看出:
a. 给序列尾部添零,只能是得到更加光滑的频谱,但不能提供更多的信息。即得到高密度的频谱。
b.增加样本点则可以使频谱的信息量更大,即可得到高分辨频谱。
3.DFT性质:
(1) 设x(n)10(0.8)n,0n10,求y(n)x((n6))15
解:首先编循环移位函数:
%cirshftt.m
function y=cirshftt (x,m,N) if length(x)>N
error('N must be >=the length of x') end
x=[x zeros(1,N-length(x))];%序列补零加长 n=[0:1:N-1]; n=mod(n-m,N); y=x(n+1);
其中m为序列x的长度,N为序列的循环移位的点数 主程序调用移位函数:
figure(1)
n=0:10;x=10*(0.8).^n;
y=cirshftt (x,6,15) %求循环移位 n=0:14;x=[x,zeros(1,4)];
subplot(2,1,1);stem(n,x);title( 'Original sequence' ) xlabel('n' );ylabel( 'x(n)');axis([-1,15,-1,11]) subplot(2,1,2);stem(n,y);
title('Circularly shifted sequence,N=15' ) xlabel('n' );ylabel( 'x((n-6) mod 15)' ); axis([-1,15,-1,11])
21
结果为:
y = 1.3422 1.0737 0 0 0 0 10.0000 8.0000 6.4000 5.1200 4.0960 3.2768 2.6214 2.0972 1.6777
(2) 设x1(n){1,2,2},x2(n){1,2,5,4}试分别计算下列圆卷积。 (a)y(n)x1(n)x2(n),N5 (b) y(n)x1(n)x2(n),N6 解:先编循环卷积函数: %circonvt.m
function y=circonvt(x1,x2,N) if length(x1)>N
error('N must be >=the length of x1') end
if length(x2)>N
error('must be >=the length of x2') end
x1=[x1 zeros(1,N-length(x1))]; x2=[x2 zeros(1,N-length(x2))]; m=[0:1:N-1];
x2=x2(mod(-m,N)+1); H=zeros(N,N); for n=1:1:N
H(n,:)=cirshftt(x2,n-1,N); end y=x1*H';
求x1(n)1,2,2,x1(n)1,2,5,4 (1)y1(n)x1(n)x2(n)
N=5 N=6
(2)y2(n)x1(n)程序:
x1=[1,2,2];
x2(n)
22
x2=[1,2,5,4];
y1=circonvt(x1,x2,5) y2=circonvt(x1,x2,6)
结果为:
y1=9 4 11 18 18
y2=1 4 11 18 18 8
4.利用DFT计算线性卷积:
用重复法求解:x(n)n1,0n9,h(n)1,0,1,求其线卷积y(n)。 解:先编一个重叠保留法作分段卷积函数; %ovrlpsav.m
function[y]=ovrlpsav(x,h,N) Lenx=length(x); M=length(h); M1=M-1; L=N-M1;
h=[h zeros(1,N-M)];
x=[zeros(1,M1),x,zeros(1,N-1)]; K=floor((Lenx+M1-1)/(L)); Y=zeros(K+1,N); for k=0:K
xk=x(k*L+1:k*L+N);
Y(k+1,:)=circonvt(xk,h,N); end
Y=Y(:,M:N)'; y=(Y(:))';
再编主程序进行计算; n=0:9; x=n+1;
h=[1,0,-1]; N=6;
y=ovrlpsav(x,h,N) 结果:
y = 1 2 2 2 2 2 2 2 2 2 -9 -10
5.快速付里叶变换(FFT)
(1)用MATLAB的fft()来求信号的DFT的幅值谱。
已知模拟信号为x(t)2sin(4t)5cos(8t),以t=0.01n(n=0:N-1)进行取样,求N点DFT的幅值谱。
设N分别为(1)N=45;(2)N=50;(3)N=55;(4)N=60
23
subplot(2,2,1) N=45; n=0:N-1; t=0.01*n; q=n*2*pi/N;
x=2*sin(4*pi*t)+5*cos(8*pi*t); y=fft(x,N); plot(q,abs(y)) title('FFT N=45') %
subplot(2,2,2); N=50; n=0:N-1; t=0.01*n; q=n*2*pi/N;
x=2*sin(4*pi*t)+5*cos(8*pi*t); y=fft(x,N); plot(q,abs(y)) title('FFT N=50') %
subplot(2,2,3); N=55; n=0:N-1; t=0.01*n; q=n*2*pi/N;
x=2*sin(4*pi*t)+5*cos(8*pi*t); y=fft(x,N); plot(q,abs(y)) title('FFT N=55') %
subplot(2,2,4); N=60; n=0:N-1; t=0.01*n; q=n*2*pi/N;
x=2*sin(4*pi*t)+5*cos(8*pi*t); y=fft(x,N); plot(q,abs(y)) title('FFT N=60')
(2在上题的基础上,N=64,并在信号中加入噪声(正态)w(t)(用函数randn(1,N)) x(t)2sin(4t)5cos(8t)0.8w(t)
试比较有无噪声时的信号谱。并分析在信号的检测的意义上,这种噪声会不会影响信号的检测?
24
subplot(2,1,1) N=64; n=0:N-1; t=0.01*n; q=n*2*pi/N;
x=2*sin(4*pi*t)+5*cos(8*pi*t); y=fft(x,N); plot(q,abs(y)) title('FFT N=64') %
subplot(2,1,2); N=64; n=0:N-1; t=0.01*n; q=n*2*pi/N;
x=2*sin(4*pi*t)+5*cos(8*pi*t)+0.8*randn(1,N); y=fft(x,N); plot(q,abs(y))
title('FFT N=64(with noise)')
从下图中可以看出,在信号检测的意义上,这种噪声不会影响信号的检测。
25
四、思考题
1.通过分析计算机中的wav文件信号来进一步讨论数字信号处理中的信号分析方法。由于本题需要用户电脑具有麦克风和声卡,所以由同学们在课外完成。 (1)先掌握几个要用到的函数:
[x,fs,bits]=waveread(‘filename’)
其功能是读取wav文件的函数;其中x表示一长串的数据,一般是两列(立体声);fs是该wav文件在采集时用的采样频率;bits是指在进行A/D转化时用的量化位长(一般是8bits或16bits). [d]=FFT(w,l)
是matlab中快速付里叶变换函数的一种输入输出形式。其中w是一列波形数据;l是指示用多少点的FFT;d是频域输出. Sound(w,fs,bits)
与waveread的参数一样,它将数列的数据通过声卡转化为声音。
(2)选择一个wav文件作为分析对象,可以用麦克风录一段用户自己的声音,也可选择计算机中.wav的文件,在此选择Windows系统中都有的ding.wav(在盘符:\\Windows\\media目录中).
(3) 编程求将此声音播放出并求出要处理的数据量的大小(答案为20191*2)。 (4) 分别画出单声道和双声道要处理的信号的波形图及信号频域的幅值(对信号求
fft)。
(5) 求出此信号的主频率。
(6) 说明为何双声道能有一种从一侧耳朵穿过另一侧耳朵的感觉。
2.考虑一被噪声污染的信号,分析它所包含的频率分量,如一个由50Hz和120Hz正弦信号构成的信号,受零均值随机噪声的干扰,数据采样率为1000Hz.可通过fft函数来分析其信号频率成分。
2.混合信号成分分析。有一信号x由三种不同频率的正弦信号混合而成,通过得到信号的DFT,确定出信号的频率及其强度关系。 3.
26
4.模拟信号的取样和重构
设xa(t)e1000t,求其付里叶变换Xz(jw)
解:Xz(jw)Xa(t)ejwtdt
01000te0ejwtdte01000tejwtdt
0.0021(w1000)2
27
严格就来,在MATLAB中不使用SYMBOLIC工具箱是不能分析模拟信号的,但当以充分小的时间间隔取样xa(t)时,可产生平滑的图形,当包含足够的时间时,可显示出所有的模式,这样就可以近似地进行分析。
在此中设在105精度下,xa(t)为F0取
t51052000的带限信号,因此若
12200025105
这样就可得到xa(t)的逼近序列xG(m) 程序:
%Analog Signal 模拟信号的重构
Dt=0.00005;t=-0.005:Dt:0.005; xa=exp(-1000*abs(t));
%continuous-time Fourier transform 连续时间的付里叶变换 Wmax=2*pi*2000; % 最大的角频率
K=500;k=0:1:K;W=k*Wmax/K; %某点的角频率
Xa=xa*exp(j*t'*W)*Dt;%某点的频率,其中t’为t的转置矩阵 Xa=real(Xa);%幅频特性
W=[-fliplr(W),W(2:501)];%其中flipri按左右方向翻转矩阵元素,使得W以0为中心对称
Xa=[fliplr(Xa),Xa(2:501)];%使得Xa以最大的Xa为中心对称 figure(1)
subplot(2,1,1);plot(t*1000,xa,'-'); xlabel('t in msec.');ylabel('xa(t)')
gtext('Analog Signal') %用鼠标放置文本文件
subplot(2,1,2);plot(W/(2*pi*1000),Xa*1000,'r'); xlabel('Frequency in KHz');ylabel('Xa(jW)*1000') gtext('Continuous-time Fourier Transform')
自已动手:
以本题中的xa(t)说明取样速率对频域特性的影响:
28
(1)取样频率Fs=5000Hz,绘出X1(jw)曲线 (2)取样频率Fs=1000Hz,绘出X2(jw)曲线
29
因篇幅问题不能全部显示,请点此查看更多更全内容