EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
%Matlab提供了计算线性卷积和两个多项式相乘的函数conv,语法格式w=conv(u,v),其中u和v分别是有限长度序列向量,w是u和v的卷积结果序列向量。
' T9 U& |, g5 ~- ]0 D- O%如果向量u和v的长度分别为N和M,则向量w的长度为N+M-1.如果向量u和v是两个多项式的系数,则w就是这两个多项式乘积的系数。 7 F8 \8 O" f1 }5 x3 S* @$ X
x=ones(1,4); %x(n)=R4(n)
4 t- n# J2 q! o* r& ^! nh=ones(1,4); %h(n)=R4(n)
1 O }- e: [, m. ty=conv(x,h); %y(n)=x(n) * h(n) conv是做卷积,就是按照书上的做法,先翻转,在一步步平移,得出结果。对于两个长度分别为n,m的序列,卷积结果长度为m+n-1! g( D; j2 N k
1.y1的确是严格按照卷积的数学表达式计算的,不解释。 filter([1,2],1,[1,2,3,4,5])实现 y[k]=x[k]+2*x[k-1] s2 N, z9 V1 ?( I/ h0 \4 H
咱们这里讨论的就是A=1的情况。有了基本说明,现在言归正传: 从 2 f7 F% \, h* X
- 1 1 1
- 5 4 3 2 1
- 输出1,到
- 1 1 1
- 5 4 3 2 1
- 输出12
& B# u- F% n0 b8 s ' {8 u# u5 u! t. |2 @& ?: n
5 U- D/ Y" r0 o( v) l
# B" V' ~& h8 e9 B* b从 4.依然是验证2的观点,从
& Q4 I. n" ]% u' D" x6 Y3 \- 1 2 3 4 5
- 0 0 0 0 1 1 1 1
- 输出1,到
- 1 2 3 4 5
- 0 0 0 0 1 1 1 1
- 输出5
: w8 |8 ]( G( r" d1 ~* s
" C& _0 X8 ^5 t7 C1 c2 o2 ]1 e5 n: T, _& ?! k* s! s
4 ?+ S! L+ T0 ]# `9 g
% U* h8 N( B$ u5 }; e' H: L到这里,我想大家就明白了二者的区别和关系。 ( ~% } J; M8 ?/ q+ h' Q" T0 _9 i
) g$ b% X1 M7 |% x$ X
在MATLAB中,可以用函数y=filter(p,d,x)实现差分方程的仿真,也可以用函数 y=conv(x,h)计算卷积。5 J1 J X! K8 j& q9 y
(1)即y=filter(p,d,x)用来实现差分方程,d表示差分方程输出y的系数,p表示输入x的系数,而x表示输入序列。输出结果长度数等于x的长度。
8 w7 e- y) S3 v1 K, ?实现差分方程,先从简单的说起: r7 c4 s6 m# t3 ]* l) b. K: \' y
filter([1,2],1,[1,2,3,4,5]),实现y[k]=x[k]+2*x[k-1]
2 v4 J' F! u% n5 t' z* x% t# ay[1]=x[1]+2*0=1 (x[1]之前状态都用0)+ z z2 v0 D& g+ K+ c! a
y[2]=x[2]+2*x[1]=2+2*1=4
' y" O Q7 `4 m/ g1 b, T4 v(2)y=conv(x,h)是用来实现卷级的,对x序列和h序列进行卷积,输出的结果个数等于x的长度与h的长度之和减去1。
! H5 p* ^5 e( p& o$ }; d; H! M卷积公式:z(n)=x(n)*y(n)= ∫x(m)y(n-m)dm.
8 y* x7 U6 Q6 M% l* `' u- L7 W3 E3 M+ w A
(1)h = [3 2 1 -2 1 0 -4 0 3]; % impulse response y = conv(h,x); subplot(2,1,1); xlabel('Time index n'); ylabel('Amplitude'); (2)x1 = [x zeros(1,8)]; subplot(2,1,2); xlabel('Time index n'); ylabel('Amplitude'); 程序二:filter和conv的不同 y1=conv(h,x)4 s& |( q& E7 Q W9 s$ P9 M/ W8 j
y2=filter(h,1,x)1 P3 A& U u# |& h' v
y3=filter(x,1,h) y2 = 1 3 6 9 12 可见:filter函数y(n)是从n=1开始,认为所有n<1都为0;而conv是从卷积公式计算,包括n<1部分。 程序三:滤波后信号幅度的变化 MATLAB中提供了卷积运算的函数命令conv2,其语法格式为: # C. ^; }! |. h: k& w' O) F6 R
C = conv2(A,B)
- G. q1 A0 {7 g9 o3 t( `* \C = conv2(A,B)返回矩阵A和B的二维卷积C。若A为ma×na的矩阵,B为mb×nb的矩阵,则C的大小为(ma+mb-1)×(na+nb-1)。 . d( N0 ?9 J- F* z& _
例:
/ A9 T* g5 k% C L8 @A=magic(5)
' W) j+ S0 O( tA =
; U: P D+ {" K1 @17 24 1 8 15 3 z# B) p6 {+ f2 G+ @
23 5 7 14 16
# d, j) X! K: w- E, u$ S4 6 13 20 22
+ M6 z3 o8 I$ ^! F4 F0 W+ e" I6 Z4 I, y10 12 19 21 3
/ s4 g0 a* z' {+ @11 18 25 2 9 . O+ b$ X5 Y9 |2 |3 e6 E
>> B=[1 2 1 ;0 2 0;3 1 3] ; d. H; b% Q" [/ q! V
B = + p5 u+ P& |. v
1 2 1 + f1 X" E+ Z9 Q
0 2 0
& q7 E% ^& Z0 }& W: Y( x5 O" \3 1 3
5 a" n2 Y, L' b5 s>> C=conv2(A,B)
' p/ P) y6 U/ V6 nC = 7 ]% Y) [) ]; ~1 B7 d
17 58 66 34 32 38 15
8 Y( T: R' |* z$ D1 g23 85 88 35 67 76 16
9 U6 c2 f5 {6 L4 `55 149 117 163 159 135 67
E8 W, z+ ]0 u2 ]79 78 160 161 187 129 51 3 y- S* b5 F9 \# N* t) c
23 82 153 199 205 108 75 ; Z' L2 z% V% V ?# K- d* n s
30 68 135 168 91 84 9
O3 _+ M1 {6 t33 65 126 85 104 15 27
; x0 i* y7 j# [) [; ?3 w% hMATLAB图像处理工具箱提供了基于卷积的图象滤波函数filter2,filter2的语法格式为:
+ p! l7 Z' m F8 [8 Z6 P, ]Y = filter2(h,X) 3 ?+ B& O5 N# f0 ]
其中Y = filter2(h,X)返回图像X经算子h滤波后的结果,默认返回图像Y与输入图像X大小相同。例如:
- C: Q; ]8 J {其实filter2和conv2是等价的。MATLAB在计算filter2时先将卷积核旋转180度,再调用conv2函数进行计算。
3 [, W) `* e5 \/ U% l' t$ oFspecial函数用于创建预定义的滤波算子,其语法格式为: [0 X7 o/ w& X4 _, @5 i' K
h = fspecial(type) * f1 E4 [# G! w0 K
h = fspecial(type,parameters) " \/ x" |9 ^+ }3 e8 N
参数type制定算子类型,parameters指定相应的参数,具体格式为: ) K. ~" N2 v$ b: b
type='average',为均值滤波,参数为n,代表模版尺寸,用向量表示,默认值为[3,3]。
% p( w6 u8 U% G7 C. Otype= 'gaussian',为高斯低通滤波器,参数有两个,n表示模版尺寸,默认值为[3,3],sigma表示滤波器的标准差,单位为像素,默认值为0.5
$ o( J4 U, T3 L" T4 i: ]/ D6 u! p5 Y3 s6 h
|