1、matlab 周期方波信号(一) 周期离散方波信号频域分析与周期模拟信号一样,周期离散信号同样可以展开成傅里叶级数形式,并得到离散傅里叶级数(DFS)()=12=2() =0,1,2,1 上式可以看成周期离散信号 x(n)的离散傅里叶级数展开。()=1=0()上式是 DFS 的反变换,记作 IDFS 并且称 与 构成一对离散傅里叶级数()()变换对。 (以上两式中 )=2/在 MTALAB 中,DFS 通过建立周期延拓函数语句实现:function Xk=DFS(n,x,N)if Nlength(x)n=0:N-1;x=x zeros(1,N-length(x);endk=0:N-1;WN=e
2、xp(-j*2*pi/N);nk=n*k;WNnk=WN.nk;Xk=x*WNnk;end建立一个离散非周期方波信号 ()=()=1, 010, 其他 通过周期延拓后所得的周期序列利用 DFS 计算实现代码如下:4()clear all;close all;clc;n=0:3;x=ones(1,4);X=fft(x,1024);Xk1=DFS(n,x,4);Xk2=DFS(n,x,8);figure(1);plot(-1023:2048)/2048*8,abs(X) abs(X) abs(X),-);hold on;stem(-4:7,abs(Xk1) abs(Xk1) abs(Xk1),Li
3、neWidth,2);grid;figure(2);plot(-1023:2048)/2048*16,abs(X) abs(X) abs(X),-);hold on;stem(-8:15,abs(Xk2) abs(Xk2) abs(Xk2),LineWidth,2);grid;set(gcf,color,w);运行后得到的是分别以 4 和 8 为周期延拓后的 频谱:4()即第一幅图表示的是周期序列 的频谱, ()=1 length(x)n=0:N-1;x=x zeros(1,N-length(x);endk=0:N-1;WN=exp(-j*2*pi/N);nk=n*k;WNnk=WN.nk;X
4、k=x*WNnk;End建立一个离散非周期方波信号 ()=()=1, 010, 其他 的离散傅里叶变换 利用 DFT 计算实现代码如下:8() ()clear all;close all;clc;n=0:7;x=ones(1,8);X=fft(x,1024);Xk2=DFT(n,x,16);figure(1);plot(-1023:2048)/2048*32,abs(X) abs(X) abs(X),-);hold on;stem(-16:31,abs(Xk2) abs(Xk2) abs(Xk2),LineWidth,2);grid;figure(2);plot(-1023:2048)/204
5、8*32,angle(X) angle(X) angle(X),-);hold on;stem(-16:31,angle(Xk2) angle(Xk2) angle(Xk2),LineWidth,2);grid;set(gcf,color,w);运行后分别得到该离散非周期方波信号的幅频特性与相频特性:幅频特性相频特性两图中的包络线表示的是通过快速傅里叶变换(FFT)所得到的频谱线。离散傅里叶变换是傅里叶变换在时域、频域均离散化的形式,因而与其他傅里叶变换有着相似的性质。但是它又是从傅里叶级数派生而来的,所以又具有一些与其他傅里叶变换不同的特性,最主要的是圆周位移性质和圆周卷积性质。一、 快速傅
6、里叶变换(FFT)快速傅里叶变换,简称 FFT,是计算 DFT 的快速算法,习惯上是指以库利和图基算法为基础的一类高效算法。根据快速傅里叶变换基本思路以及基 2FFT 算法,在 MTALAB 中,FFT 通过建立函数实现:function y=fft(x)m=nextpow2(x); N=2m;if length(x)Nx=x,zeros(1,N-length(x); endnxd=bin2dec(fliplr(dec2bin(1:N-1,m)+1;y=x(nxd); for mm=1:mNmr=2mm;u=1;WN=exp(-i*2*pi/Nmr);for j=1:Nmr/2for k=j:
7、Nmr:Nkp=k+Nmr/2;t=y(kp)*u;y(kp)=y(k)-t; y(k)=y(k)+t;endu=u*WN;endend建立一个离散非周期方波信号 ()=()=1, 010, 其他 的快速傅里叶变换利用 FFT 计算实现代码如下:8()clear all;close all;clc;x=ones(1,8);fx=fft(x,512);z=abs(fx);k=0:length(z)-1;plot(k,z);运行后得到该离散非周期方波信号的幅频特性:分别利用 FFT 和 DFT 进行相同运算:clear all;close all;clc;K=input(K=);N=2K;n=0:
8、N-1;x=randn(1,2K);tic,X=fft(x,N),toctic,X=DFT(n,x,N),toc运行结果如下:Columns 1 through 4069Elapsed time is 0.218536 seconds.Columns 1 through 4069Elapsed time is 16.726921 seconds.由此可见,采用 DFT 计算时间为 16.726921 秒,而采用 FFT 计算只需要0.218536 秒;说明, FFT 在计算速度上,明显优于其他算法。三、采样定理(一)时域采样定理为了验证时域采样定理,可以把原始采样序列每隔 D-1 点取一个值,
9、形成一个新的序列。在 MATLAB 中,通过以下程序实现:clear all;close all;clc;x=ones(1,8);D=2;xd=x(1:D:length(x);fx=fft(x,512);fxd=fft(xd,512);z=abs(fx);s=abs(fxd);k=0:length(z)-1;plot(k,s,k,z);D=2 时得到的原始序列与采样序列的幅频特性(蓝色为原始序列,绿色为采样序列) 。D=3 时得到的原始序列与采样序列的幅频特性(蓝色为原始序列,绿色为采样序列) 。D=4 时得到的原始序列与采样序列的幅频特性(蓝色为原始序列,绿色为采样序列) 。D=0.5 时得
10、到的原始序列与采样序列的幅频特性(蓝色为原始序列,绿色为采样序列) 。由此可见,采样周期在 D 大于 2 的范围内,出现明显的混叠现象,有失真产生,而在小于 1 的范围内,采样过于密集,增加运算系统负担。因此,可验证时域采样定理。(二)频域采样定理为了验证频域采样定理,可以把原始采样序列每隔 D-1 点取一个值,形成一个新的序列。在 MATLAB 中,通过以下程序实现:clear all;close all;clc;x=-10:0.001:10;y=(sin(x)/x;X=fft(y,20);D=7;Xd=X(1:D:length(X);fxd=ifft(Xd,20);s=fxd;k=0:length(s)-1;plot(k,s); D=7 时根据频域样本集合恢复的原信号D=3 时根据频域样本集合恢复的原信号D=10 时根据频域样本集合恢复的原信号由此可见,采样周期在 D 小于 7 的范围内,根据频域样本恢复的原信号与实际原信号有很大差别。因此,可验证频域采样定理。