小波分析实验:二维离散小波变换(Mallat快速算法)

合集下载

小波分析实验:二维离散小波变换(Mallat快速算法)

小波分析实验:二维离散小波变换(Mallat快速算法)

小波分析实验:实验2二维离散小波变换(Mallat快速算法)实验目的:在理解离散小波变换原理和Mallat快速算法的基础上,通过编程对图像进行二维离散小波变换,从而加深对二维小波分解和重构的理性和感性认识,并能提高编程能力,为今后的学习和工作奠定基础。

实验工具:计算机,matlab6.5分解算法:重构算法: “"二工必(刃- 2上*[十三g (刃- 2k )d [ *分解算法写成矩阵的形式! (lb g 的长度为4)4[0]如]力⑵ h[3] 0 0 0 '[勺【0】• 记"h[0] h[\]h[2]山⑶ …• ••••・ • •C J=勺【1] • •申[2] h[3] 00 0-.^[0] ^[1]_.勺[乃-1】_>[0] g[l] g ⑵ g[3] 0 • • •e=• 0 •g[0] g[l]g ⑵ • • g[3]■ • •・■ 0• D J =<[i]■•目2] ■g[3]0 0…茎0] 畀]|g[0] g[l] g[2] g[3] 0 0 0 I0 0 g[0] g[l]g[2] S [3] - 0• ••••• • ••・•・・■ • • g[2] g[3] 0 00 ...g[0] g[l]J |_勺4-1[叨]I二・(2»于是Mallat分解公式为矩阵变换?丄Cj- = PC^................. ⑶卩D j = Q D J-L..... .......... ⑷重构算法写成矩阵变换:-C J_I =C$ + Dj------------------------------------ (5) 4M NPPq. 一片『峰值信噪比计算公式:P沁沁逻竺皿E卢H耿V 屈E M {皿,00分别表示原始图像和重建图像,且本实验采取的一些小技乐P (I)分SW法…编程时用如下思想:(h, g 的长度为4)“今[1]勺[刀-1]■ V■■丐⑼£[1] 4刀-1】将数据。

图形信息科学与技术专业2D图像离散小波变换算法研究

图形信息科学与技术专业2D图像离散小波变换算法研究

图形信息科学与技术专业2D图像离散小波变换算法研究进入21世纪以来,图形信息科学与技术领域取得了巨大的发展。

其中,2D图像处理技术在数字图像处理、计算机视觉、模式识别等领域中得到广泛的应用。

为了提高图像处理的效果和效率,离散小波变换(Discrete Wavelet Transform,DWT)成为了一种重要的图像处理方法。

本文将对2D图像离散小波变换算法进行研究,并探索其应用。

首先,我们需要了解小波变换的基本原理。

小波变换是一种基于函数的线性变换,它将原始信号分解为不同频率的子信号。

在图像处理中,小波变换可以将图像分解为低频部分和高频部分,分别对应图像的细节和纹理信息。

离散小波变换是对连续小波变换的离散化处理,通过采样获取离散信号的小波系数。

在2D图像离散小波变换算法的研究中,最常用的方法是基于Mallat算法的快速小波变换(Fast Wavelet Transform,FWT)。

FWT通过将图像分解为低频和高频部分,并进行多级分解,得到不同尺度和方向的小波系数。

另外,针对特定应用场景,研究者也提出了一些改进算法,如整数离散小波变换算法(Integer Wavelet Transform,IWT)和定向小波变换(Directional WaveletTransform,DWT),用于提高小波变换的计算效率和图像处理的准确性。

在实际应用中,2D图像离散小波变换算法具有广泛的应用前景。

首先,它可以用于图像压缩。

通过将图像分解为不同尺度和方向的小波系数,可以实现对图像的有损或无损压缩。

其次,离散小波变换可以用于图像增强。

通过对小波系数进行阈值处理,可以去除图像中的噪声和干扰,提高图像的质量和清晰度。

此外,离散小波变换还可以应用于图像融合、图像分割、目标识别等领域。

尽管2D图像离散小波变换算法在图像处理中具有广泛的应用,但仍存在一些待解决的问题。

首先,基于Mallat算法的FWT在多级分解时,需要大量的内存和计算资源。

二维离散小波变换

二维离散小波变换

小波变换实验一二维离散小波变换(Mallat 快速算法)一、实验目的本实验的目的在于利用matlab 程序实现二维离散小波变换,并对小波系数矩阵进行重构,进而在程序的编辑过程中理解二维离散小波变换和重构的原理和实现。

同时利用不同的小波和边缘沿途哦方法,对小波系数矩阵的能量、均值、方差、信噪比等统计量进行分析比较,更深入的了解小波变换。

二、实验原理、实验编程思路本实验基于matlab 平台,编程实现二维离散小波变换的分解和重构。

已经知道离散小波变换的 1、分解算法:~2、重构算法:基于这样的分解和重构算法公式,可以将二维离散小波变换的分解算法写成矩阵的形式,以h 、g 的长度为4为例:)∑∑---=-=nj n j k n j n jkd k n g d c k n h c 11)2()2(∑∑-+-=-kjk kj k k nd k n g c k n h c )2()2(1~所以此时,mallat 分解公式写成矩阵变换就应该为:同样,重构算法写成矩阵形式应该为:在进行分解计算的过程当中,将数据1 j C 进行几种不同方式的边缘扩展(周期、补零、连续等),再将低通(高通)滤波器进行填零到数据长度,然后进行卷积计算,再2抽样,组合即可得到)(j j D C 。

{对于重构算法,对小波系数矩阵的前一半系数和后一半系数分别进行插零后,利用高通和低通滤波器进行重构,得到的结果组合后就形成重构结果。

在程序中,进行原始数据的边缘拓展的时候,采用Y = WEXTEND(TYPE,MODE,X,L,LOC)函数进行不同类型的扩展。

对扩展的数据进行小波变换分解之后,再对小波系数进行截断处理,得到最终的小波系数矩阵。

;编写的程序架构主要分为一级小波分解和重构函数mdec1和mrec1,多级小波分解和重构函数mallatdec2和mallatrec2,主函数通过对上述几个函数的调用实现二维离散小波变换的分解和重构。

然后通过改变主函数的参数(小波类型),来实现对不同类型小波来计算得到结果的比较;在通过改变Wextend函数的参数实现对采取不同的边缘延拓的方法得到的峰值信噪比的比较。

二维离散小波变换实验报告 - 实验报告

二维离散小波变换实验报告 - 实验报告

二维离散小波变换实验报告 - 实验报告二维离散小波变换实验报告2008-11-021. 实验题目对图像进行二维离散小波变换, 变换级数大于等于3级,然后统计系数中0的个数(百分比表示) 并进行重构, 最后计算重构图像的峰值信噪比(PSNR).数据:灰度图像lena.bmp或其它图像, 滤波器系数可以调用matlab中的wfilters函数获得, wfilters函数的使用请在matlab中help wfilters.另外,峰值信噪比计算公式:MN'2()ff,,,ijij255255,ij,,11PSNRMSE,,10lg,MSEMN,'{},{}ff1,1,,,,iMjNijij其中,分别表示原始图像和重建图像, 且. 注:实验中,边缘延拓的方法和具体的小波滤波器可以自己根据实验结果进行选择。

2. 实验步骤1) 生成原始灰度图像作为标准以便对比。

在matlab中导入LENA.bmp, 使用下列命令生成,结果如图1所示。

imagesc(LENA.cdata, [0,255]); colormap(gray);图1 原始灰度图像2) 用matlab小波工具包作出分解合成图,如图2。

第 - 1 - 页图2 直接使用matlab小波工具箱进行分析3) 写代码实现DWT正反变换,见附件MyDwt2D.dsw。

我在代码中构建了一个CDwt类,输入为:@ const char* lpInputImage : 输入图像文件名@ int nAnalysisLevel : 分析级数,本题要求大于等于3@ int nThreshold = 0 : 阈值,默认值为0(即不进行阈值化)公用方法有四个为:void ForwadDwt(); /* 实现DWT变换 */void InverseDwt(); /* 实现DWT逆变换 */void StatisticThenOutput(const char* lpStatisticFile); /* 先统计,然后输出统计信息 */void OutputInversedImage(const char* lpInversedImageName); /* 输出重构图像数据 */方法调用顺序为首先调用ForwadDwt,然后调用InverseDwt,最后是类的两个输出。

二维离散小波变换.

二维离散小波变换.
实验二
二维离散小波变换
实验题目
题目: 对图像进行二维离散小波变换, 变换 级数大于等于3级,然后统计系数中0的个数 (百分比表示) 并进行重构, 最后计算重构 图像的峰值信噪比(PSNR).
数据: 灰度图像lena.bmp或其它图像, 滤 波器系数可以调用matlab中的wfilters函数 获得, wfilters函数的使用请在matlab中 help wfilters.
自己根据实验结果进行选择。
实验原理
一维 matllat 算法的分解算法是将采样信号分别通过高 通滤波器(Hi_D)和低通滤波器(Lo_D),并经过下采样, 得到信号的差值(高通)分量和平滑(低通)分量,具体实 现框图如图
实验原理
二维情况与一维情况类似,在可分离的情况下,mallat 算法 分两步进行。首先沿 x 方向对二维矩阵用 Lo_D 和 Hi_D 做分 解,得到平滑分量和差值分量这两部分,然后对这两部分沿 y 方向再分别用 Lo_D 和 Hi_D 分解,这样得到四路输出。
实验原理
一幅图像进行一级分解后变成四小幅,LL 为平滑分 量,其余三幅为细节分量,LH 为垂直分量,HL 为水平分 量,HH 为对角分量。
实验原理
重建过程是分解过程的逆过程。12表示沿 x 方向做二 插值,21表示沿 y 方向做插值。
注意事项
边缘效应的解决方法: 周期延拓 补零延拓
PSNR的计算: 阈值化后 重建后
实验题目
MN
另外,峰值信噪比计算公式:
PSNR

10 lg
255 255 , MSE MSE

( fij
i1 j1
M N
fij'
)2ห้องสมุดไป่ตู้

Mallat小波的s手工编程算法说明(原创)

Mallat小波的s手工编程算法说明(原创)

Mallat 算法及问题Mallat 算法在小波多分辨率分析中具有极其重要的地位。

Mallat 算法中,与尺度函数)(t φ相联系的是低通滤波器)(n h ,与小波函数)(t ψ相联系的是高通滤波器)(n g 。

分解后得到离散逼近信号)(n a j [又称:尺度系数],和离散细节信号)(n d j [又称:离散小波系数]。

本文以《小波分析及其应用》为主要参考书。

未指明情况下,均指该书。

1. 由滤波器系数h 计算滤波器系数g尺度滤波器(低通滤波器))(n h 是核心,小波滤波器)(n g 可由)(n h 计算得到。

计算公式为)1()1()(1n h n g n --=-。

该公式的含义为:将)(n h 以0=n 翻转,得到)(n h -,再将序列右移1位,即得到)1(n h -。

再乘上符号n --1)1(,即得到)(n g 。

如图所示:可见,实现方法为:对)(n h 倒序,然后在对该序列的适当位置添加负号。

如最后(从左到右)1位乘以1-(因为其0=n ,1)1(1-=--n ),倒数第2位保持原数(因为其1-=n ,1)1(1+=--n ),以此类推。

特别注意,以上序列索引从1=n 开始(Matlab 中就是如此),而以0=n 点为中心翻转。

如果序列从0=n 开始索引,则需要作调整,原乘以1-改为乘以1+,原乘以1+的改为乘以1-。

在Matlab 中,用Orthfilt( )函数可得到各种正交小波的滤波器系数Lo_D (低频分解滤波器)和Hi_D (高频分解滤波器),另外,Lo_R 和Hi_R 分别为低频重构滤波器和高频重构滤波器。

特别注意的是,Lo_R 为Lo_D 的倒序:Lo_D = wrev(Lo_R);Hi_R 为Hi_D 的倒序:Hi_D = wrev(Hi_R)。

wrev 即矢量倒序。

另,Wfilters( )函数可得到各种小波的滤波器系数,不限于正交小波。

Matlab 中,分解是按照公式 3.2.6(即 3.4.9)和 3.2.18(即 3.4.10),即:∑∑-=-=++k j j kj j k a n k g n d k a n k h n a )()2()()()2()(11进行的,其对应的抽取图为图3.1,即滤波器为分解滤波器h 和g 。

小波变换课件ch4 Mallat算法及二维小波47页PPT

小波变换课件ch4 Mallat算法及二维小波47页PPT
5、教导儿童服从真理、服从集体,养 成儿童 自觉的 纪律性 ,这是 儿童道 德教育 最重要 的部分 。—— 陈鹤琴
Hale Waihona Puke 46、我们若已接受最坏的,就再没有什么损失。——卡耐基 47、书到用时方恨少、事非经过不知难。——陆游 48、书籍把我们引入最美好的社会,使我们认识各个时代的伟大智者。——史美尔斯 49、熟读唐诗三百首,不会作诗也会吟。——孙洙 50、谁和我一样用功,谁就会和我一样成功。——莫扎特
小波变换课件ch4 Mallat算法及二维 小波
1、纪律是管理关系的形式。——阿法 纳西耶 夫 2、改革如果不讲纪律,就难以成功。
3、道德行为训练,不是通过语言影响 ,而是 让儿童 练习良 好道德 行为, 克服懒 惰、轻 率、不 守纪律 、颓废 等不良 行为。 4、学校没有纪律便如磨房里没有水。 ——夸 美纽斯

小波mallat算法

小波mallat算法

⼩波mallat算法算法要求:输⼊序列是⼤于滤波器长度的偶数列确实可以通过编程的⼿段使算法适合所有的情况,但本⽂章的⽬的是展⽰mallat算法的过程,所以就⼀切从简了// Mallat.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "stdio.h"/*mallat算法分解* dSIn 输⼊的序列s,dH0尺度函数展开系数,dH1⼩波函数展开系数,dSOut输出低频部分,dDOut输出⾼频部分,* nSIn_Len 输⼊序列的长度,nH_Len 滤波器的长度。

*/int DwtFun(double *pdSIn,double *pdH0,double *pdH1,double *pdSOut,double *pdDOut,int nSIn_Len,int nH_Len) {int i,j,k;//延拓后的Len是⼀个本体长度加⼀个滤波器长度int nLen=nSIn_Len+2*nH_Len;//建⽴滤波前的序列pdSArray,滤波后的序列pdSAOut低频部分,pdDAOut⾼频部分double *pdSArray=new double[nLen];double *pdSAOut=new double[nLen];double *pdDAOut=new double[nLen];//对称延拓for(i=0;i<nLen;i++){if(i<nH_Len){pdSArray[i]=pdSIn[nH_Len-i-1];}else if(i>=nH_Len+nSIn_Len){pdSArray[i]=pdSIn[nH_Len+2*nSIn_Len-1-i];}else{pdSArray[i]=pdSIn[i-nH_Len];}}//求输出序列低频部分dSOut,⾼频部分dDOut.i->nLen,k->nH_Lendouble dSTemp,dDTemp;for(i=0;i<nLen;i++){dSTemp=0.0;dDTemp=0.0;for(k=0;k<nH_Len;k++){if((i-k)<0)continue;else{//低频部分dSTemp+=pdH0[nH_Len-k-1]*pdSArray[i-k];//⾼频部分dDTemp+=pdH1[nH_Len-k-1]*pdSArray[i-k];}}pdSAOut[i]=dSTemp;pdDAOut[i]=dDTemp;}//⼆抽取.先将pdSAOut前nH_Len长的⼀段舍弃,抽取偶数列for(i=nH_Len,j=0;i<nLen;i+=2,j++){pdSOut[j]=pdSAOut[i+1];pdDOut[j]=pdDAOut[i+1];}//返回输出序列的长度return j;delete pdSArray;pdSArray=NULL;delete pdSAOut;pdSAOut=NULL;delete pdDAOut;pdDAOut=NULL;}/*mallat 算法重构* psSIn 输⼊的低频序列,pdDIn输⼊的⾼频序列,g0,g1重构滤波器,pdOut输出序列,nSInLen输⼊序列的长度* nG_Len 滤波器长度*/int IDwtFun(double *pdSIn,double *pdDIn,double *pdG0,double *pdG1,double *pdOut,int nSInLen,int nG_Len) {int i,j,k;//建⽴⼀个数列存放插⼊后的数列int nTemp=2*nSInLen;double *pdInSertS=new double[nTemp];double *pdInSertD=new double[nTemp];//⼆插⼊j=0;for(i=0;i<nTemp;i++){if(i%2==0){pdInSertS[i]=0;pdInSertD[i]=0;}else{pdInSertS[i]=pdSIn[j];pdInSertD[i]=pdDIn[j];j++;}}//对称拓延//创建⼀个nTemp+nG_Len长的数列int nLen=nTemp+2*nG_Len;double *pdSAIn=new double[nLen];double *pdDAIn=new double[nLen];for(i=0;i<nLen;i++){if(i<nG_Len){pdSAIn[i]=pdInSertS[nG_Len-i-1];pdDAIn[i]=pdInSertD[nG_Len-i-1];}else if(i==nTemp+nG_Len){pdSAIn[i]=0.0;pdDAIn[i]=0.0;}else if(i>nTemp+nG_Len){pdSAIn[i]=pdInSertS[nG_Len+2*nTemp-i-1];pdDAIn[i]=pdInSertD[nG_Len+2*nTemp-i-1];}else{pdSAIn[i]=pdInSertS[i-nG_Len];pdDAIn[i]=pdInSertD[i-nG_Len];}}//⽤滤波器G0和G1对数列进⾏滤波double *pdSAOut=new double[nLen];double *pdDAOut=new double[nLen];double dSTemp,dDTemp;for(i=0;i<nLen;i++){dSTemp=0.0;dDTemp=0.0;for(k=0;k<nG_Len;k++){if((i-k)<0)continue;else{//低频部分dSTemp+=pdG0[nG_Len-k-1]*pdSAIn[i-k];//⾼频部分dDTemp+=pdG1[nG_Len-k-1]*pdDAIn[i-k];}}pdSAOut[i]=dSTemp;pdDAOut[i]=dDTemp;}//合并低频,⾼频for(i=2*nG_Len-1,j=0;i<nLen;i++,j++){pdOut[j]=pdSAOut[i]+pdDAOut[i];}return j;delete pdInSertS;pdInSertS=NULL;delete pdInSertD;pdInSertD=NULL;delete pdSAIn;pdSAIn=NULL;delete pdDAIn;pdDAIn=NULL;delete pdSAOut;pdSAOut=NULL;delete pdDAOut;pdDAOut=NULL;}int main(int argc, char* argv[]){int i;//db4⼩波,已经取反 h0,h1是分解滤波器,g0,g1是重构滤波器double dDb4h0[] = { 0.2303778133088964, 0.7148465705529154,0.6308807679398587, -0.0279837694168599,-0.1870348117190931, 0.0308413818355607,0.0328830116668852, -0.0105974017850690 };double dDb4h1[] = { -0.0105974017850690 , -0.0328830116668852, 0.0308413818355607 , 0.1870348117190931,-0.0279837694168599 , -0.6308807679398587,0.7148465705529154 , -0.2303778133088964};double dDb4g0[] = { -0.0105974017850690 , 0.0328830116668852,0.0308413818355607 , -0.1870348117190931,-0.0279837694168599 , 0.6308807679398587,0.7148465705529154 , 0.2303778133088964};double dDb4g1[] = { -0.2303778133088964 , 0.7148465705529154,-0.6308807679398587 , -0.0279837694168599,0.1870348117190931 , 0.0308413818355607,-0.0328830116668852 , -0.0105974017850690};//⽣成⼀个数列,本算法要求输⼊的数列是⽐滤波器长的偶数列double a[]={1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0}; //double a[]={1.0,4.0,5.5,8.2,2.7,5.2,2.0,2.0,2.0,3.0,3.0,4.0,4.0,14.0,17.0,11.0};//输出double *pdS=new double[100];double *pdD=new double[100];double *pdOut=new double[100];int l=DwtFun(a,dDb4h0,dDb4h1,pdS,pdD,16,8);for(i=0;i<l-1;i++){printf("%f\t",pdS[i]);printf("\n");}printf("*********************\n");for(i=0;i<l-1;i++){printf("%f\t",pdD[i]);printf("\n");}printf("*********************\n");int v=IDwtFun(pdS,pdD,dDb4g0,dDb4g1,pdOut,11,8);//i<v-nG_Len+1for(i=0;i<v-7;i++){printf("%f\t",pdOut[i]);printf("\n");}delete []pdS;pdS=NULL;delete []pdD;pdD=NULL;delete []pdOut;pdOut=NULL;return 0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

小波分析实验:实验2 二维离散小波变换(Mallat快速算法)实验目的:在理解离散小波变换原理和Mallat快速算法的基础上,通过编程对图像进行二维离散小波变换,从而加深对二维小波分解和重构的理性和感性认识,并能提高编程能力,为今后的学习和工作奠定基础。

实验工具:计算机,matlab6.5附录:(1)二维小波分解函数%二维小波分解函数function Y=mallatdec2(X,wname,level)%输入:X 载入的二维图像像数值;% level 小波分解次(级)数设定值(如果设定值超过最高可分解次数,按最高分解次数分解)% wname 小波名字wavelet name%输出:Y 多极小波分解后的小波系数矩阵[h,g]=wfilters(wname,'d'); %h,g分别为低通和高通滤波器X=double(X);hh=size(X,2);while t<=level%先进行行小波变换for row=1:hhY(row,1:hh)=mdec1(X(row,1:hh),h,g) ;end%再进行列小波变换for col=1:hhtemp=mdec1( Y(1:hh,col)',h,g);Y(1:hh,col)=temp';endt=t+1;hh=hh/2;X=Y;end%内部子函数,对一行(row)矢量进行一次小波变换,利用fft实现function y=mdec1(x,h,g)%输入:x 行数组% h为低通滤波器% g为高通滤波器%输出: y 进行一级小波分解后的系数lenx=size(x,2);lenh=size(h,2);rh=h(end:-1:1);rrh=[zeros(1,(lenx-lenh)),rh];rrh=circshift(rrh',1)';rg=g(end:-1:1);rrg=[zeros(1,(lenx-lenh)),rg];rrg=circshift(rrg',1)';r1=dyaddown(ifft(fft(x).*fft(rrh,lenx)),1); %use para 1r2=dyaddown(ifft(fft(x).*fft(rrg,lenx)),1);y=[r1,r2];(2)二维小波重构函数%二维小波重构函数function Y=mallatrec2(X,wname,level)%输入:X 载入的小波系数矩阵;% level 小波分解次(级)数设定值(如果设定值超过最高可分解次数,按最高分解次数分解)% wname 小波名字wavelet name%输出:Y 重构图像矩阵[h,g]=wfilters(wname,'d'); %h,g分别为重构低通滤波器和重构高通滤波器hz=size(X,2);h1=hz/(2^(level-1));while h1<=hz% 对列变换for col=1:h1temp=mrec1(X(1:h1,col)',h,g)';X(1:h1,col)=temp;end%再对行变换for row=1:h1temp=mrec1(X(row,1:h1),h,g);X(row,1:h1)=temp;endh1=h1*2;endY=X;%内部子函数,对一行小波系数进行重构function y=mrec1(x,h,g)%输入:x 行数组% h为低通滤波器% g为高通滤波器%输出: y 进行一级小波重构后值lenx=size(x,2);r3=dyadup(x(1,1:lenx*0.5),0); %内插零use para 0r4=dyadup(x(1,(lenx*0.5+1):lenx),0); %use para 0y=ifft(fft(r3,lenx).*fft(h,lenx))+ ifft(fft(r4,lenx).*fft(g,lenx));(3)测试函数(主函数)%测试函数(主函数)clc;clear;X=imread('E:\Libin的文档\Course\Course_wavelet\实验2要求\exp2\LENA.bmp');%路径X=double(X);A = mallatdec2(X,'sym2',3);image(abs(A));colormap(gray(255));title('多尺度分解图像');Y= mallatrec2(A,'sym2',3);Y=real(Y);figure(2);subplot(1,2,1);image(X);colormap(gray(255));title('原始图像');subplot(1,2,2);image(Y);colormap(gray(255));title('重构图像');csize=size(X);sr=csize(1);sc=csize(2);mse=sum(sum( (Y-X).^2,1))/(sr*sc);psnr=10*log(255*255/mse)/log(10)小波分析实验:实验1 连续小波变换实验目的:在理解连续小波变换原理的基础上,通过编程实现对一维信号进行连续小波变换,(实验中采用的是墨西哥帽小波),从而对连续小波变换增加了理性和感性的认识,并能提高编程能力,为今后的学习和工作奠定基础。

实验工具:计算机,matlab6.5程序附录:(1) 墨西哥帽小波函数,按照(***)式编程% mexh.mfunction Y=mexh(x)if abs(x)<=8Y=exp(-x*x/2)*(1-x^2);elseY=0;End(2) 实验程序,按照(**)式编程,详细过程请参考“本实验采取的一些小技巧”%clc;clear;load('data.mat');len=length(dat);lna=70; % (尺度a)的长度a=zeros(1,lna);wfab=zeros(lna,len); %小波系数矩阵mexhab=zeros(1,len); % 离散化小波系数矩阵for s=1:lna %s 表示尺度for k=1:lenmexhab(k)=mexh(k/s);endfor t=1:len % t 表示位移wfab(s,t)=(sum(mexhab.*dat))/sqrt(s); %将积分用求和代替mexhab=[mexh(-1*t/s),mexhab(1:len-1)]; %mexhab修改第一项并右移endendfigure(1);plot(dat);title('原始数据图');figure(2); %小波系数谱image(wfab);colormap(pink(128));title('小波系数图');%surf(wfab);%title('小波系数谱网格图');%pwfab=wfab.*wfab; %%瞬态功率谱%figure(3);%subplot(1,2,1);%surf(pwfab);%title('瞬态功率谱网格图');%subplot(1,2,2);%contour(pwfab);%title('瞬态功率谱等值线');(3)test函数。

%test 函数clc;clear;for i=1:200dat(i)=sin(2*pi*i*0.05); %正弦波函数endlen=length(dat);lna=40;wfab=zeros(lna,len);mexhab=zeros(1,len);for s=1:lna %s 表示尺度for k=1:lenmexhab(k)=mexh(k/s);endfor t=1:len % t 表示位移wfab(s,t)=(sum(mexhab.*dat))/sqrt(s); %将积分用求和代替mexhab=[mexh(-1*t/s),mexhab(1:len-1)]; %mexhab修改第一项并右移endendfigure(1);plot(dat);title('orignal dat');figure(2); %小波系数谱image(wfab);colormap(pink(128));title('正弦波的小波系数图');(4)用fft实现cwt%按照圆周卷积定理,原周卷积和线性卷积的关系L>=M+N-1%按照圆周卷积的定义,相关和线性卷积的关系(原始算法和线性卷积的关系)%注意画图理解clc;clear;t1=cputime;load('data.mat');len=length(dat);lna=70; % a(尺度)的长度a=zeros(1,lna); % a 表示尺度b=zeros(1,len); % b 表示位移wfab=zeros(lna,len); %小波系数矩阵mexhab=zeros(1,2*len-1);data=[zeros(1,len-1),dat];Ydata=fft( data ,4*len);for s=1:lnafor k=1:2*len-1mexhab(k)=mexh((k-len)/s);endtemp=ifft( Ydata.*fft( mexhab,4*len ) ,4*len);wfab(s,:)=real(temp(2*len-1:3*len-2))/sqrt(s); %为什么要取实部而不是取模,我也不是很清楚,可是有种感觉endfigure(1);plot(dat);title('原始数据图');figure(2); %小波系数谱image(wfab);colormap(pink(128));title('小波系数谱 ');cputime-t14)fft快速计算cwt%按照圆周卷积的定义,%注意画图理解clc;clear;t1=cputime;load('data.mat');len=length(dat);lna=70; % a(尺度)的长度a=5;data=[dat,zeros(1,len)];Ydata=fft(dat,2*len);for s=1:lnamexhab=zeros(1,2*len);k=[-a*s:1:a*s];mexhab(k+len)=mexh2(k./s);temp=ifft( Ydata.*fft( mexhab,2*len ) ,2*len);wfab(s,:)=real(temp(len+1:2*len))/sqrt(s); %要取实部而不是取模,呵呵endfigure(1);plot(dat);title('原始数据图');figure(2); %小波系数谱image(wfab);colormap(pink(128));title('小波系数谱 '); cputime-t15)保存为mexh2.mfunction Y=mexh2(x)Y=exp(-x.*x/2).*(1-x.^2);。

相关文档
最新文档