x_rand=rand(1,N); x_randn=randn(1,N); xn=0:N-1; figure(1);
stem(xn,x_rand) figure(2);
stem(xn,x_randn)
(三)、离散信号的基本运算 1、 信号的延迟
给定离散信号x(n),若信号y(n)定义为:y(n)=x(n-k),那么y(n)是信号x(n)在时间轴上右移k个抽样周期得到的新序列。
例3.1:正弦序列y(n)=sin(100n)右移3个抽样周期后所得的序列,MATLAB程序如下: clear all; N=32; w=100; k=3;
x1=zeros(1,k); xn=0:N-1;
x2=sin(100*xn); figure(1) stem(xn,x2) x=[x1 x2];
axis([-1 N -1.1 1.1]) N=N+k; xn=0:N-1; figure(2) stem(xn,x)
axis([-1 N -1.1 1.1])
2、 信号相加
若信号x(n)?x1(n)?x2(n),值得注意的是当序列x1(n)和x2(n)的长度不相等或者位置不对应时,首先应该使两者的位置对齐,然后通过zeros函数左右补零使其长度相等后再相加 例3.2:用MATLAB实现两序列相加 clear all; n1=0:3
x1=[2 0.5 0.9 1]; figure(1) stem(n1,x1)
axis([-1 8 0 2.1] ) n2=0:7
x2=[ 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7]; figure(2)
stem(n2,x2)
axis([-1 8 0 0.8] ) n=0:7;
x1=[x1 zeros(1,8-length(n1))]; x2=[ zeros(1,8-length(n2)),x2]; x=x1+x2; figure(3) stem(n,x)
axis([-1 8 0 2.1])
3、 信号相乘
信号序列x1(n)和x2(n)相乘所得信号x(n)的表达式为:x(n)?x1(n)x2(n)
这是样本与样本之间的点乘运算,在MATLAB中可采用“.*”来实现,但是在信号序列相乘之前,应对其做与相加运算一样的操作。 例3.3:用MATLAB实现上例中两序列相乘 clear all; n1=0:3
x1=[2 0.5 0.9 1]; figure(1) stem(n1,x1)
axis([-1 8 0 2.1] ) n2=0:7
x2=[ 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7]; figure(2) stem(n2,x2)
axis([-1 8 0 0.8] ) n=0:7;
x1=[x1 zeros(1,8-length(n1))]; x2=[ zeros(1,8-length(n2)),x2]; x=x1.*x2; figure(3) stem(n,x)
axis([-1 8 0 0.35])
4、 信号翻转
信号翻转的表达式为:y(n)=x(-n),在MATLAB中可以用fliplr函数实现此操作 例3.4:用MATLAB实现“信号相加”中的x1(n)序列翻转 clear all; n=0:3
x1=[2 0.5 0.9 1]; x=fliplr(x1); stem(n,x)
axis([-1 4 0 2.1] )
5、 信号和
对于N点信号x(n),其和的定义为:y??x(n)
n?1N例3.5:用MATLAB实现“信号相加”中的x1(n)序列和 clear all; n=0:3
x1=[2 0.5 0.9 1]; x=sum(x1)
6、 信号积
对于N点信号x(n),其积的定义为:y??x(n)
n?1N例3.5:用MATLAB实现“信号相加”中的x1(n)序列积 clear all; n=0:3
x1=[2 0.5 0.9 1]; x=prod(x1)
(四)、离散傅里叶变换的MATLAB实现 例4:若x(n)?sin(n?)是一个N=32的有限序列,利用MATLAB计算它的DFT并画出图4形。 N=32; n=0:N-1;
xn=cos(pi*n/6); k=0:N-1;
WN=exp(-j*2*pi/N); nk=n’*k;
WNnk=WN.^nk; Xk=xn*WNnk; figure(1) stem(n,xn) figure(2)
stem(k,abs(Xk))
在MATLAB中,可以直接利用内部函数fft来实现FFT算法,该函数是机器语言,而不是MATLAB指令写成的,执行速度很快。常用格式为: y=fft(x)
y=fft(x,N)
(五)、IIR数字滤波器设计
1、 基于巴特沃斯法直接设计IIR数字滤波器
例5.1:设计一个10阶的带通巴特沃斯数字滤波器,带通频率为100Hz到200Hz,采样频率为1000Hz,绘出该滤波器的幅频于相频特性,以及其冲击响应图 clear all; N=10;
Wn=[100 200]/500;
[b,a]=butter(N,Wn,’bandpass’); freqz(b,a,128,1000) figure(2)
[y,t]=impz(b,a,101); stem(t,y)
2、 基于切比雪夫法直接设计IIR数字滤波器
例5.2:设计一个切比雪夫Ⅰ型数字低通滤波器,要求: Ws=200Hz,Wp=100Hz,Rp=3dB,Rs=30dB,Fs=1000Hz
clear all; Wp=100; Rp=3; Ws=200; Rs=30; Fs=1000;
[N,Wn]=cheb1ord(Wp/(Fs/2),Ws/(Fs/2),Rp,Rs); [b,a]=cheby1(N,Rp,Wn); freqz(b,a,512,1000);
例5.3:设计一个切比雪夫Ⅱ型数字带通滤波器,要求带通范围100-250Hz,带阻上限为300Hz,下限为50Hz,通带内纹波小于3dB,阻带纹波为30 dB,抽样频率为1000 Hz,并利用最小的阶次实现。
clear all; Wpl=100; Wph=250;
Wp=[Wpl,Wph]; Rp=3; Wsl=50; Wsh=300;
Ws=[Wsl,Wsh]; Rs=30; Fs=1000;
[N,Wn]=cheb2ord(Wp/(Fs/2),Ws/(Fs/2),Rp,Rs); [b,a]=cheby2(N,Rp,Wn); freqz(b,a,512,1000);
(六)、FIR数字滤波器设计
1、、在MATLAB 中产生窗函数十分简单: (1)矩形窗(Rectangle Window)
调用格式:w=boxcar(n),根据长度n 产生一个矩形窗w。 (2)三角窗(Triangular Window)
调用格式:w=triang(n) ,根据长度n 产生一个三角窗w。 (3)汉宁窗(Hanning Window)
调用格式:w=hanning(n) ,根据长度n 产生一个汉宁窗w。 (4)海明窗(Hamming Window)
调用格式:w=hamming(n) ,根据长度n 产生一个海明窗w。 (5)布拉克曼窗(Blackman Window)
调用格式:w=blackman(n) ,根据长度n 产生一个布拉克曼窗w。 (6)恺撒窗(Kaiser Window)
调用格式:w=kaiser(n,beta) ,根据长度n 和影响窗函数旁瓣的β参数产生一个恺撒窗w。
2、基于窗函数的FIR 滤波器设计 利用MATLAB 提供的函数firl 来实现 调用格式:firl (n,Wn,’ftype’,Window),n 为阶数、Wn 是截止频率(如果输入是形如[W1 W2] 的矢量时,本函数将设计带通滤波器,其通带为W1<ω ?1,0???0.4?Hd(e)?? 0,else?j?Window=boxcar(8); b=fir1(7,0.4,Window); freqz(b,1) 例6.2:设计线性相位带通滤波器,其长度N=15,上下边带截止频率分别为W1= 0.3π,w2=0.5 π Window=blackman(16); b=fir1(15,[0.3 0.5],Window); freqz(b,1) 例6.3:MATLAB中的chirp.mat文件中存储信号y的数据,该信号的大部分号能量集中在Fs/4(或二分之一奈奎斯特)以上,试设计一个34阶的FIR高通滤波器,滤除频率低于Fs/4的信号成分,其中滤波器的截止频率为0.48,阻带衰减为30dB,滤波器窗采用切比雪夫窗 clear all; load chirp window=chebwin(35,30);