MATLAB常用函数.docx
《MATLAB常用函数.docx》由会员分享,可在线阅读,更多相关《MATLAB常用函数.docx(17页珍藏版)》请在冰豆网上搜索。
MATLAB常用函数
数字信号处理与MATLAB实现
1.n1=[ns:
nf];
x1=[zeros(1,n0-ns),1,zeros(1,nf-n0)];%单位抽样序列的产生
2.subplot(2,2,4)画2行2列的第4个图
3.stem(n,x)%输出离散序列,(plot连续)
4.编写子程序可调用
4.1单位抽样序列
生成函数impseq.m
[x,m]=impseq(n0,ns,nf);%序列的起点为ns,终点为nf,在n=n0点处生成一个单位脉冲
n=[-5:
5];x1=3*impseq(2,-5,5)-impseq(-4,-5,5)
x1=
0-1000003000
n=[-5:
5];x1=3*impseq(2,-4,5)-impseq(-4,-5,4)%起点到终点长度要一致
x1=
0-100003000
4.2单位阶跃序列
生成函数stepseq.m
[x,n]=stepseq(no,ns,nf)%序列的起点为ns,终点为nf,在n=n0点处生成一个单位阶跃
4.3两个信号相加的生成函数sigadd.m
[y,n]=sigadd(x1,n1,x2,n2)
4.4两个信号相乘的生成函数sigmult.m
[y,n]=sigmult(x1,n1,x2,n2)
4.5序列移位y(n)=x(n-n0)的生成函数sigshift.m
[y,n]=sigshift(x,m,n0)
4.6序列翻褶y(n)=x(-n)的生成函数sigfold.m
[y,n]=sigfold(x,n)
4.7evenodd.m函数可以将任一给定的序列x(n)分解为xe(n)和xo(n)两部分
[xe,xo,m]=evenodd(x,n)
4.8序列从负值开始的卷积conv_m,conv默认从0开始
function[y,ny]=conv_m(x,nx,h,nh)
有{x(n):
nx1
n
nx2},{h(n):
nh1
n
nh2},卷积结果序列为{y(n):
nx1+nh1
n
nx2+nh2}
例.设
求
程序:
x1=[1,2,3];n1=-1:
1;
x2=[2,4,3,5];n2=-2:
1;
[y,n]=conv_m(x1,n1,x2,n2)
结果:
y=
2817231915
n=
-3-2-1012
因此
计算
,
得Z反变换
b=1;a=poly([0.90.9-0.9]);
[r,p,k]=residuez(b,a)
结果:
r=
0.2500
0.5000
0.2500
p=
0.9000
0.9000
-0.9000
k=
[]
因此得到
相应的
5.[H,w]=freqz[B,A,M]
计算出M个频率点上的频率响应,存放于H向量中,M个频率存放在w向量中,freqz函数自动将这M个频率点均匀设置在频率范围[0,
]之间。
若缺省w和M时,函数自动选取512个频率点计算。
不带输出向量的freqz函数将自动绘制幅频和相频曲线。
也可[H,w]=freqz(B,A);
plot(w/pi,abs(H));绘出幅频特性
6.zplane(z,p)
绘制出列向量z中的零点(以符号o表示)和列向量p中的极点(以符号x表示)以及参考单位圆。
7.傅里叶变换信号时域和频域变换
连续对应着非周期,离散对应着周期。
一个域的离散必然导致另一个域的周期延拓
8.fft和ifft:
一维快速傅里叶变换和逆傅里叶变换
X=fft(x,N)
采用FFT算法计算序列向量X的N点DFT,缺省N时,fft函数自动按X的长度计算DFT。
当N为2的整数次幂时,fft按基2算法计算,否则用混合基算法。
ifft的调用格式类似。
9.fft2和ifft2:
二维快速正傅里叶变换和逆傅里叶变换
(1)Y=fft2(x)
数据二维傅里叶变换参数X是向量fft2(x)相当于fft(fft(x)’)’,即先对X的列做一维傅里叶变换,然后再对变换结果的行作一维傅里叶变换;若X是向量,则此傅里叶变换即变成一维傅里叶变换fft;若X是矩阵,则是计算该矩阵的二位傅里叶变换。
(2)Y=fft2(X,M,N)
通过对X进行补零或截断,使得X成为(M*N)的矩阵。
函数iff2的参数应用与函数fft2完全相同。
10.czt:
线形调频Z变换
Y=czt(x,m,w,a)
此函数计算由z=a*w.^(-(0:
m-1))定义的z平面螺旋线上各点的z变换,a规定了起点,w规定了相邻点的比例,m规定了变换的长度,后三个变量默认值为a=1,w=exp(j*2*pi/m)及m=length(x)因此y=czt(x)就等于y=fft(x).
11.dct和idct:
离散余弦正变换和离散余弦逆变换
Y=dct(x,N)
完成如下变换,N的默认值为length(x).
k=0,1,…,N-1
12.fftshift
Y=fftshift(x)
用来重新排列X=fft(x)的输出,当X为向量时,把X的左右两半进行交换,从而将零频分量移至频谱的中心;如果X为二维傅里叶变换的结果,它同时将X的左右和上下部分进行交换。
13.fftfilt
Y=fftfilt(b,x)
采用重叠相加法FFT对信号向量x快速滤波,得到输出序列向量y,向量b为FIR滤波的单位脉冲相应,h(n)=b(n+1),n=0,1,…,length(b)-1.
Y=fftfilt(b,x,N)
自动选取FFT长度NF=2^nextpow2(N),输入数据x分段长度M=NF-length(b)+1,其中nextpow2(N)函数求的一个整数,满足2^(nextpow2(N)-1)<=N<=2^nextpow2(N)
N缺省时,fftfilt自动选择合适的FFT长度NF和对x的分段长度M。
p=nextpow2(A),p满足2^p>=abs(A)
L=pow2(nextpow2(M+N-1))M,N分别为序列延拓周期
14.用DFT进行谱分析时,必须将序列阶段为长度为N的有限长序列。
造成频谱泄露和谱间干扰。
泄露使频谱变得模糊,分辨率降低;旁瓣引起不同分量间的干扰。
截断效应无法完全消除,可以加宽窗和缓慢截断。
矩形窗比海明窗的频率分辨率高(泄漏小),但谱间干扰大,因此海明窗是以牺牲分辨率来换取谱间干扰的降低。
栅栏效应是只能在离散点的地方看到真实的像,其余频谱被遮挡。
为减少栅栏效应,可以在时域数据末端增加一些零点,使周期内点数增加,但不改变原有数据,即增加频域抽样点数N,频域抽样为
,这样必然使谱线更密,这样原来看不到的谱分量就可能看到了。
15.x=[one(1,5),zero(1,N-5)];%单位阶跃信号
y=filter(b,a,x)%直接型输出信号
16.N=25;
h=impz(b,a,N)%N次采样,b,a为零极点多项式系数,a不算1
如:
%直接型
b=[1,-3,11,27,18];a=[16,12,2,-4,-1]
%级联型
b0=4;B=[1,1,0;1,-1.4142136,1];A=[1.-0.5.0;1.0.9.0.81]
%并联型
C=0;B=[-14,-12;24,26];A=[1,-2,3;1,-1,1]
delta=impseq(0,0,N);
x=[one(1,5),zero(1,N-5)];
h=filter(b,a,delta);%直接型单位脉冲响应
y=filter(b,a,x);%直接型输出信号
h=casfilter(b0,B,A,delta);%级联型单位脉冲响应
h=casfilter(b0,B,A,x);%级联型输出响应
h=parfiltr(C,B,A,delta);%并联型单位脉冲响应
h=parfiltr(C,B,A,x);%并联型输出响应
[b0,B,A]=dir2cas(b,a);%直接型转换成级联型
[b,a]=cas2dir(b0,B,A);%级联型转换成直接型
[C,B,A]=dir2par(b,a);%直接型转换成并联型
[b,a]=par2dir(C,B,A);%并联型转换成直接型
17.buttord.m
用来确定数字低通或模拟低通滤波器的阶次,其调用格式分别是
(1)[N,Wn]=buttord(Wp,Ws,Rp,Rs)
(2)[N,Wn]=buttord(Wp,Ws,Rp,Rs,’s’)
格式
(1)对应数字滤波器,式中Wp,Ws分别是通带和阻带的截止频率,实际上它们是归一化频率,其值在0~1之间,1对应抽样频率的一半。
对低通和高通滤波器,Wp,Ws都是标量,对带通和带阻滤波器,Wp,Ws都是1
2的向量。
Rp,Rs分别是通带和阻带的衰减,单位为dB。
N是求出的相应低通滤波器的阶次,Wn是求出的3dB频率,它和Wp稍有不同。
格式
(2)对应模拟滤波器,式中各个变量的含义和格式
(1)相同,但Wp,Ws及Wn的单位为rad/s,因此,他们实际上是频率。
18.buttap.m
用来设计模拟低通原型滤波器G(p),其调用格式是[z,p,k]=buttap(N)
N是与设计的低通原型滤波器的阶次,z,p和k分别是设计出的G(p)的极点、零点及增益。
19.lp2lp.m,lp2hp.m,lp2bp.m,lp2bs.m
以上4个文件的功能是将模拟低通原型滤波器G(p)分别转换为实际的低通、高通、带通及带阻滤波器。
其调用格式分别为
(1)[B,A]=lp2lp(b,a,Wo)或[B,A]=lp2hp(b,a,Wo)
(2)[B,A]=lp2bp(b,a,Wo,Bw)或[B,A]=lp2bs(b,a,Wo,Bw)
式中b,a分别是模拟低通原型滤波器G(p)的分子、分母多项式的系数向量,B,A分别是转换后的H(s)的分子、分母多项式的系数向量;在格式
(1)中,Wo是低通或高通滤波器的截止频率;在格式
(2)中Wo是带通或带阻滤波器的中心频率,Bw是其带宽。
20.bilinear.m
实现双线性变换,即由模拟滤波器H(s)得到数字滤波器H(z)。
其调用格式是
[Bz,Az]=bilinear(B,A,Fs)式中B,A分别是H(s)的分子、分母多项式的系数向量,Bz,Az分别是H(z)的分子、分母多项式的系数向量,Fs是抽样频率。
21.butter.m
用来直接设计巴特沃兹数字滤波器,实际上它把buttord.m,buttap.m,lp2lp.m及bilinear.m等文件都包含进去,从而使设计过程更简捷。
其调用格式是
(1)[B,A]=butter(N,Wn)
(2)[B,A]=butter(N,Wn,’high’)
(3)[B,A]=butter(N,Wn,’stop’)
(4)[B,A]=butter(N,Wn,’s’)
格式
(1)~(3)用来设计数字滤波器,B、A分别是H(z)的分子、分母多项式的系数向量,Wn是通带截止频率,范围在0~1之间,1对应抽样频率的一半。
若Wn是标量,则格式
(1)用来设计低通数字滤波器,若Wn是1
2的向量,则格式
(1)用来设计数字带通滤波器;格式
(2)用来设计数字高通滤波器;格式(3)用来设计数字带阻滤波器,显然,这时的Wn是1
2的向量:
格式(4)用来设计模拟滤波器。
22.cheb1ord.m
求切比雪夫1型滤波器的阶次。
23.cheb1ap.m
用来设计原型切比雪夫1型模拟滤波器。
24.cheby1.m
直接设计切比雪夫1型滤波器。
以上3个文件的调用格式和对应的巴特沃兹滤波器的文件类似。
25.impinvar.m
用冲激响应不变法实现
到
及s到z的转换。
26.maxflat.m
设计广义巴特沃兹低通滤波器。
27.zp2tf.m
把零极点加增益的形式,改写成零极点多项式[b,a]=zp2tf(z,p,k)
28.低通数字滤波器设计例子lpexample.m
模拟巴特沃兹滤波器低通滤波器设计实例monibashi.m
其中,巴特沃兹模拟滤波器的设计子程序设计和非归一化巴特沃兹模拟低通滤波器原型子程序afd_butt.m
计算系统函数的幅度响应和相位响应子程序freqs_m.m
直接形式转换成级联形式子程序sdir2cas.m
模拟切比雪夫1型低通滤波器设计实例moniqieshi.m(2型.m文件中改为2)
其中,切比雪夫1型模拟滤波器的设计子程序设计和非归一化切比雪夫1型模拟低通滤波器原型子程序afd_chb1.m
计算系统函数的幅度响应和相位响应子程序freqs_m.m
直接形式转换成级联形式子程序sdir2cas.m
29.用脉冲响应不变法设计低通数字滤波器,模拟滤波器采用切比雪夫1型滤波器原型
模拟滤波器采用切比雪夫1型滤波器原型程序shuziqieshi.m
脉冲响应不变法子程序imp_invr
数字滤波器响应子程序freqz_m
直接型转换成并联型子程序dir2par.m
比较两个含同样标量元素,但(可能)有不同下标的复数对及其相应留数向量子程序cplxcomp.m
用脉冲响应不变法设计数字滤波器,模拟滤波器采用巴特沃兹滤波器原型shuzibashi.m
30.模拟低通滤波器变换为数字高通滤波器Alp2Dhp.m
模拟低通滤波器变换为数字带通滤波器Alp2Dbp.m
模拟低通滤波器变换为数字带阻滤波器Alp2Dbs.m
31.数字低通到数字滤波器的设计
为了从低通数字滤波原型得到新数字滤波器的有理函数,必须实现有理代换,通常采用zmapping.m函数实现。
32.用zmapping函数实现高通滤波器实例zmappinghp.m
33.一个含有高频噪声的信号保存在数据文件noisbloc中,试用脉冲响应不变法设计低通滤波器对其进行除噪。
lpchuzao.m
34.无限长单位冲击响应(IIR)数字滤波器的优点是可以利用模拟滤波器设计的结果,而模拟滤波器的设计有大量图表可查,方便简单。
但是它也有明显的缺点,就是相位的非线性,在图像处理以及数据传输等要求信道具有线性相位特性的场合,IIR滤波器就不太适用了。
有限单位冲击响应(FIR)数字滤波器则可以做成具有严格的线性相位,同时又可以具有任意的幅度特性。
此外,FIR滤波器的单位抽样相应是有限长的,因而FIR滤波器一定是稳定的。
再有,只要经过一定的延时,任何非因果有限长序列都能变成因果的有限长序列,因而总能用因果系统来实现。
最后,FIR滤波器由于单位冲击响应是有限长的,因而可以用快速傅里叶变换(FFT)算法来过滤信号,从而可大大提高运算效率。
但是,要取得很好的衰减特性,FIR滤波器H(z)的阶次比IIR滤波器的要高。
IIR滤波器设计中的各种变换法对FIR滤波器设计是不适用的,这是因为那里是利用有理分式的系统函数,而FIR滤波器的系统函数只是
的多项式。
因为最感兴趣的是具有线性相位的FIR滤波器,对非线性相位的FIR滤波器,一般可以用IIR滤波器来代替。
所以只讨论线性相位滤波器。
FIR数字滤波器的文件
35.fir1.m
本文件采用窗函数法设计FIR数字滤波器,其调用格式是
b=fir1(N,Wn)
b=fir1(N,Wn,’high’)
b=fir1(N,Wn,’stop’)
式中N为滤波器的阶次,因此滤波器的长度为N+1;Wn是通带截止频率,其值在0~1之间,1对应抽样频率的一半;b是设计好的滤波器系数h(n).
对于第一种格式,若Wn是一标量,则可用来设计低通滤波器;若Wn是1
2的向量,则用来设计带通滤波器;若Wn是1
L的向量,则可用来设计L带滤波器,此时,格式将变为b=fir1(N,Wn,’DC-1’)或b=fir1(N,Wn,’DC-0’)
其中,前者保证第一个带为通带,后者保证打一个带为阻带。
第二种格式用来设计高通滤波器,第三种格式用来设计带阻滤波器。
值得注意的是,在上述所有格式中,若不指定窗函数的类型,则fir1自动选择汉明窗。
36.fir2.m
本文件采用窗函数法设计具有任意幅频特性的FIR滤波器。
其调用格式是
b=fir1(N,F,M)
其中F是频率向量,其值在0~1之间,M是与F相对应的所希望的幅频响应。
不指定窗函数的类型时,将自动选择汉明窗。
37.remez.m
本文件用来设计采用切比雪夫最佳一致逼近FIR数字滤波器。
同时,还可以用来设计希尔伯特变换器和差分器。
其调用格式是
b=remez(N,F,A)
b=remez(N,F,A,W)
b=remez(N,F,A,W,’hilbert’)
b=remez(N,F,A,’differentiator’)
其中,N是给定的滤波器的阶次;b是设计的滤波器的系数,其长度为N+1;F是频率向量,其值在0~1之间;A是对应F的各频段上的理想幅频响应;W是各频段上的加权向量。
值得注意的是,若b的长度为偶数,涉及高通和带阻滤波器时有可能出现错误,因此最好保证b的长度为奇数,即N应为偶数。
38.remexord.m
本文件采用切比雪夫一致逼近设计FIR数字滤波器时所需要的滤波器阶次。
其调用格式是
[N,Fo,Ao,W]=remexord(F,A,DEV,Fs)
式中,F、A的含义同文件remez.m,是通带和阻带上的偏差;该文件输出的是符合要求的滤波器阶次N、频率向量Fo、幅度向量Ao和加权向量W。
若设计者事先不能确定自己要设计的滤波器阶次,那么调用remexord后,就可利用这一族参数再调用remez,即[N,Fo,Ao,W]=remexord(F,A,DEV,Fs),从而设计出所需要的滤波器。
因此,通常remez和remexord结合使用。
值得说明是,remeord给出的阶次N有可能偏低,这是适当增加N即可;另外,若N为奇数,就可令其加1,使其变为偶数,这样b的长度为奇数。
39.sgolay.m
本文件用来设计Savitzky-Golay平滑滤波器。
其调用格式是b=sgolay(k,f)
式中,k是多项式的阶次,f是拟合的双边点数。
要求k40.firls.m
本文件用最小平方法设计线性相位FIR数字滤波器。
可设计任意给定的理想幅频特性。
41.fircls.m
本文件用带约束的最小平方法设计线性相位FIR数字滤波器。
可设计任意给定的理想幅频特性。
42.fircls1.m
本文件用带约束的最小平方法设计线性相位FIR低通和高通滤波器。
可设计任意给定的理想幅频特性。
43.firrcos.m
本文件用来设计低通线性相位FIR数字滤波器,其过渡带为余弦函数形式。
44.低通滤波器用矩形窗和汉明窗观察其频谱响应lpchuang.m
45.设计多带滤波器duodaifilter.m
46.利用切比雪夫最佳一致逼近法设计一低通滤波器qiebijinlp.m
47.利用切比雪夫最佳一致逼近法设计一多阻带陷波器qiebijinduobs
在MATLAB中,可以用函数y=filter(p,d,x)实现差分方程的仿真,也可以用函数y=conv(x,h)计算卷积。
(1)即y=filter(p,d,x)用来实现差分方程,d表示差分方程输出y的系数,p表示输入x的系数,而x表示输入序列。
输出结果长度数等于x的长度。
实现差分方程,先从简单的说起:
filter([1,2],1,[1,2,3,4,5]),实现y[k]=x[k]+2*x[k-1]
y[1]=x[1]+2*0=1 (x[1]之前状态都用0)
y[2]=x[2]+2*x[1]=2+2*1=4
(2)y=conv(x,h)是用来实现卷级的,对x序列和h序列进行卷积,输出的结果个数等于x的长度与h的长度之和减去1。
卷积公式:
z(n)=x(n)*y(n)=∫x(m)y(n-m)dm.
程序一:
以下两个程序的结果一样
(1)h=[321-210-403];%impulseresponse
x=[1-23-4321];%inputsequence
y=conv(h,x);
n=0:
14;
subplot(2,1,1);
stem(n,y);
xlabel('Timeindexn');ylabel('Amplitude');
title('OutputObtainedbyConvolution');grid;
(2)x1=[xzeros(1,8)];
y1=filter(h,1,x1);
subplot(2,1,2);
stem(n,y1);
xlabel('Timeindexn');ylabel('Amplitude');
title('OutputGeneratedbyFiltering');grid;
程序二:
filter和conv的不同
x=[1,2,3,4,5];
h=[1,1,1];
y1=conv(h,x)
y2=filter(h,1,x)
y3=filter(x,1,h)
结果:
y1=1 3 6 9 12 9 5
y2= 1 3 6 9 12
y3=1 3 6
可见:
filter函数y(n)是从n=0开始,认为所有n<0都为0;而conv是从卷积公式计算,包括n<0部分。
因此filter和conv 的结果长短不同
程序三:
滤波后信号幅度的变化
num=100;%总共1000个数
x=rand(1,num);%生成0~1随机数序列
x(x>0.5)=1;
x(x<=0.5)=-1;
h1=[0.2,0.5,1,0.5,0.2];
h2=[0,0,1,0,0];
y1=filter(h1,1,x);
y2=filter(h2,1,x);
n=0:
99;
subplot(2,1,1);
stem(n,y1);
subplot(2,1,2);
stem(n,y2);
可见:
滤波后信号的幅度是发生变化的,最大幅度值也会变化。