matlab小波分析源代码分析

HDL语言及源代码

6人已加入

描述

  MATLAB由一系列工具组成。这些工具方便用户使用MATLAB的函数和文件,其中许多工具采用的是图形用户界面。包括MATLAB桌面和命令窗口、历史命令窗口、编辑器和调试器、路径搜索和用于用户浏览帮助、工作空间、文件的浏览器。

  随着MATLAB的商业化以及软件本身的不断升级,MATLAB的用户界面也越来越精致,更加接近Windows的标准界面,人机交互性更强,操作更简单。而且新版本的MATLAB提供了完整的联机查询、帮助系统,极大的方便了用户的使用。简单的编程环境提供了比较完备的调试系统,程序不必经过编译就可以直接运行,而且能够及时地报告出现的错误及进行出错原因分析。

  新版本的MATLAB可以利用MATLAB编译器和C/C++数学库和图形库,将自己的MATLAB程序自动转换为独立于MATLAB运行的C和C++代码。允许用户编写可以和MATLAB进行交互的C或C++语言程序。另外,MATLAB网页服务程序还容许在Web应用中使用自己的MATLAB数学和图形程序。

  源代码

  MATLAB的一个重要特色就是具有一套程序扩展系统和一组称之为工具箱的特殊应用子程序。工具箱是MATLAB函数的子程序库,每一个工具箱都是为某一类学科专业和应用而定制的,主要包括信号处理、控制系统、神经网络、模糊逻辑、小波分析和系统仿真等方面的应用。

  matlab小波分析源代码

  [x,map]=imread(‘MUCS_新建文件夹_32603.ptl_208.bmp’);

  subplot(1,2,1);

  imshow(x);

  [c,s]=wavedec2(x,3,‘sym4’);

  Csize=size(c);

  for i=1:Csize(2)

  if(c(i)》100) %低频分量----s中第一维的长度

  c(i)=1*c(i);

  else

  c(i)=0.9*c(i); %高频分量

  end

  end

  x1=waverec2(c,s,‘sym4’);

  im=uint8(x1);

  subplot(1,2,2);

  imshow(im);

  [c,s]=wavedec2(X,2,‘bior3.7’);%对图像用小波进行层分解

  cal=appcoef2(c,s,‘bior3.7’,1);%提取小波分解结构中的一层的低频系数和高频系数

  ch1=detcoef2(‘h’,c,s,1);%水平方向

  cv1=detcoef2(‘v’,c,s,1);%垂直方向

  cd1=detcoef2(‘d’,c,s,1);%斜线方向

  a1=wrcoef2(‘a’,c,s,‘bior3.7’,1);%各频率成份重构

  [c,s]=wavedec2(X,1,‘sym4’);

  a1=appcoef2(c,s,‘sym4’,1);%小波分解结构中的一层的低频系数,下面是3个高频系数

  a1=2*a1;

  h1=detcoef2(‘h’,c,s,1);

  v1=detcoef2(‘v’,c,s,1);

  d1=detcoef2(‘d’,c,s,1);

  h1=0.5*h1;

  v1=0.5*v1;

  d1=0.5*d1;

  y=idwt2(a1,h1,v1,d1,‘sym4’);

  load wbarb;

  X1=X;map1=map;

  subplot(2,2,1);

  image(X1);colormap(map1);

  title(‘图像wbarb’);

  load woman;

  X2=X;map2=map;

  subplot(2,2,2);

  image(X2);colormap(map2);

  title(‘图像woman’);

  %=====================================

  %对上述二图像进行分解

  [c1,l1]=wavedec2(X1,2,‘sym4’);

  [c2,l2]=wavedec2(X2,2,‘sym4’);

  %对分解系数进行融合

  c=c1+c2;

  %=====================================

  %应用融合系数进行图像重构并显示

  XX=waverec2(c,l1,‘sym4’);

  subplot(2,2,3);

  image(XX);

  title(‘融合图像1’);

  Csize1=size(c1);

  %=====================================

  %对图像进行增强处理

  for i=1:Csize1(2)

  c1(i)=1.2*c1(i);

  end

  Csize2=size(c2);

  for j=1:Csize2(2)

  c2(j)=0.8*c2(j);

  end

  %=====================================

  %通过减小融合系数以减小图像的亮度

  c=0.5*(c1+c2);

  %=====================================

  %对融合系数进行图像重构

  XXX=waverec2(c,l2,‘sym4’);

  %=====================================

  %显示重构结果

  subplot(2,2,4);

  image(XXX);

  title(‘融合图像2’);

  %本程序实现下述功能:首先读入原始图像,并对它使用db3小波进行2层分解,

  %然后对分解系数进行处理突出所需,弱化不需要的部分

  %装载并显示原始图像

  clear all;

  clc;

  load flujet;

  subplot(1,2,1);

  image(X);colormap(map);

  title(‘原始图像’);

  %=====================================

  %对图像X用小波db3进行2层分解

  [c,l]=wavedec2(X,2,‘db3’);

  Csize=size(c);

  %=====================================

  %对分解系数作处理以突出所需部分并弱化不需要部分

  for i=1:Csize(2)

  if(c(i)》300) %低频分量

  c(i)=2*c(i);

  else

  c(i)=0.5*c(i); %高频分量

  end

  end

  %=====================================

  %重构图像并显示

  X1=waverec2(c,l,‘db3’);

  subplot(1,2,2);

  image(X1);colormap(map);

  title(‘增强图像’);

  [c,s]=wavedec2(x,2,‘sym4’);

  Csize=size(c);

  for i=1:Csize(2)

  if(c(i)》169) %低频分量----s中第一维的长

  度

  c(i)=2*c(i);

  else

  c(i)=0.3*c(i); %高频分量

  end

  end

  x1=waverec2(c,s,‘sym4’);

  im=uint8(x1);

  imshow(im);

  二维小波变换的 Matlab 实现

  %o u n\ { K*Y

  二维小波变换的函数

  -------------------------------------------------

  函数名 函数功能

  ---------------------------------------------------‘d3d t B e’x6g

  dwt2 二维离散小波变换

  wavedec2 二维信号的多层小波分解

  idwt2 二维离散小波反变换

  waverec2 二维信号的多层小波重构 z H!f6~)}-P _

  wrcoef2 由多层小波分解重构某一层的分解信号0E,\ |.o | D T2@2b2K$U

  upcoef2 由多层小波分解重构近似分量或细节分量

  detcoef2 提取二维信号小波分解的细节分量

  appcoef2 提取二维信号小波分解的近似分量

  upwlev2 二维小波分解的单层重构

  dwtpet2 二维周期小波变换4Y/a N&G q ] E B“H)W

  idwtper2 二维周期小波反变换

  -------------------------------------------------------------9O d7D ` b y

  &lX { I g u s I `

  (1) wcodemat 函数

  功能:对数据矩阵进行伪彩色编码

  格式:Y=wcodemat(X,NB,OPT,ABSOL)‘k#e C a I%H

  Y=wcodemat(X,NB,OPT) i)E)p _!O-k j J ^

  Y=wcodemat(X,NB)

  Y=wcodemat(X)

  说明:Y=wcodemat(X,NB,OPT,ABSOL) 返回数据矩阵 X 的编码矩阵 Y ;NB

  伪编码的最大值,即编码范围为 0~NB,缺省值 NB=16;

  OPT 指定了编码的方式(缺省值为 ’mat‘),即: r(o ? L j(y e f N

  OPT=’row‘ ,按行编码

  OPT=’col‘ ,按列编码

  OPT=’mat‘ ,按整个矩阵编码

  ABSOL 是函数的控制参数(缺省值为 ’1‘),即: i x”^:| ~5{

  ABSOL=0 时,返回编码矩阵

  ABSOL=1 时,返回数据矩阵的绝对值 ABS(X)

  (2) dwt2 函数 D J ~0D/m S:O S“I

  功能:二维离散小波变换 B c t _)h O X I

  格式:[cA,cH,cV,cD]=dwt2(X,’wname‘)3A N _ W F

  [cA,cH,cV,cD]=dwt2(X,Lo_D,Hi_D)

  说明:[cA,cH,cV,cD]=dwt2(X,’wname‘)使用指定的小波基函数 ’wname‘ 对二维信号 X 进行二维离散小波变幻;cA,cH,cV,cD 分别为近似分量、水平细节分量、垂直细节分量和对角细节分量;[cA,cH,cV,cD]=dwt2(X,Lo_D,Hi_D) 使用指定的分解低通和高通滤波器 Lo_D 和 Hi_D 分解信号 X 。$K v*S X2^8G Q7? M _ d B(g”d

  (3) wavedec2 函数

  功能:二维信号的多层小波分解 H F S)b p$G:i

  格式:[C,S]=wavedec2(X,N,’wname‘)

  [C,S]=wavedec2(X,N,Lo_D,Hi_D)

  说明:[C,S]=wavedec2(X,N,’wname‘) 使用小波基函数 ’wname‘ 对二维信号X 进行 N 层分解;[C,S]=wavedec2(X,N,Lo_D,Hi_D) 使用指定的分解低通和高通滤波器 Lo_D 和 Hi_D 分解信号 X 。7Y j ~ q5a H S4e1r

  (4) idwt2 函数

  功能:二维离散小波反变换

  格式:X=idwt2(cA,cH,cV,cD,’wname‘)

  X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R)

  X=idwt2(cA,c

  H,cV,cD,’wname‘,S)

  X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R,S)

  说明:X=idwt2(cA,cH,cV,cD,’wname‘) 由信号小波分解的近似信号 cA 和细节

  信号 cH、cH、cV、cD 经小波反变换重构原信号 X

  ;X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R) 使用指定的重构低通和高通滤波器 Lo_R

  和 Hi_R 重构原信号 X ;X=idwt2(cA,cH,cV,cD,’wname‘,S)’z6Z e x;o

  和 X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R,S) 返回中心附近的 S 个数据点。

  (5) waverec2 函数

  说明:二维信号的多层小波重构

  格式:X=waverec2(C,S,‘wname’)

  X=waverec2(C,S,Lo_R,Hi_R)

  说明:X=waverec2(C,S,‘wname’) 由多层二维小波分解的结果 C、S 重构原始信号 X ,‘wname’

  为使用的小波基函数;X=waverec2(C,S,Lo_R,Hi_R) 使用重构低通和高通滤波器 Lo_R 和 Hi_R 重构原信号。 s)A ?*n i ?+G

  matlab小波分析源代码分析

  1. 奇偶分开。

  非常简单,就是[2,4,6,8]组成一列向量,[1,3,5,7]组成一列向量。

  2. 预测。

  用[2,4,6,8]来预测[1,3,5,7]。比如说1,3估计2; 3,5估计4; 5,7估计6; 7,1估计8。(边缘处理,我采用循环方法)。估计公式可以用别人的,也可以自己做。举一个线性的例子:2=1*a+3*b,4=3*a+ 5*b,。。.,其他的都一样。这样我们就可找到最优的a,b,使得(2-(1*a+3*b)).^2+(4-(3*a+5*b)).^2+.。。最小化。就是最小均方准则。若正好为零,说明偶可以完全预测奇,也就是我们只要存储偶数列向量,和a,b就可以了,压缩也就是实现了。对于信号很长序列,就等于压缩了一半。当然,我们可以采用更复杂的立方差值预测,多项式预测,或其它的准则,来使其最小,这样我们的压缩也就得到了最优。

  源代码

  3. 提升。

  我们总希望,均方为零,但可望不可及。于是,提升就需要了。我们经过预测后,要存储的是偶数序列[2,4,6,8],新的奇数序列[n1,n3,n5, n7]=[2-(1*a+3*b),4-(3*a+5*b),。。.]和线性变换系数(a,b)。这里新的奇数序列就是高频分量。但偶数序列是不能完全代表信号的性质的,有所差距。所以我们要对偶数序列进行修正。即所谓的提升。我们这次用个简单的提升吧。[n2,n4,n6,n8]=[2,4,6,8]+ k*[n1,n3,n5,n7]。[n2,n4,n6,n8],就是要分解的低频分量。那k怎么求呢?因为要保持n2,n4,n6,n8和原始信号 [1,2,3,4,5,6,7,8]一样的性质。一般就是均值和高阶矩。这里就一个未知数k,所以用均值相等,就行了。1/8*(1+2+3+..8)= 1/4*(n2+n4+n6+n8)。k很容易就求出来了。我们最终存储的就是[n1,n3,n5,n7]和[n2,n4,n6,n8]以及a,b,k。

  现在,所谓的第二代就完了。再说几句。

  1.反变换,就是3-》2-》1。

  2.二维。先行提升,再列提升。(我置顶的贴子里有harr二维提升的源代码)。

  3.整数阶。就是加一个取整。

  4.多层或小波包提升,就是在对序列[n1,n3,n5,n7]或[n2,n4,n6,n8],再做1-》2-》3。

  5.灵活。不一定是a,b,也可能就一个a,或a,b,c;不一定是一个k,也可能是k1,k2。但越多计算量太大。最好是用大师们做好的CDF,5/3,7/9等。

  6.最重要的,任何一代小波,总可以通过一次或多次提升实现。它和一代小波没有本质区别。

  7.优势。文献都有,我随便谈谈。时域实现,最优压缩,无边缘效应,灵活多变,无损压缩,编程方便,速度快。

  文章写完了,希望对大家有帮助。最主要的,动手编,不要依赖MATLABM,这样才有所体会。希望和大家多交流。

  给 simon21 加一点人气

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分