分享

小波分析实验

 唐伯龙 2011-11-05

实验1 连续小波变换


实验目的:

在理解连续小波变换原理的基础上,通过编程实现对一维信号进行连续小波变换,(实验中采用的是墨西哥帽小波),从而对连续小波变换增加了理性和感性的认识,并能提高编程能力,为今后的学习和工作奠定基础。

实验工具:

计算机,matlab6.5 

 

程序附录:

(1) 墨西哥帽小波函数,按照(***)式编程

% mexh.m

function Y=mexh(x)

if abs(x)<=8

Y=exp(-x*x/2)*(1-x^2);

else

    Y=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:len

        mexhab(k)=mexh(k/s);

    end  

    for t=1:len    % t 表示位移

      wfab(s,t)=(sum(mexhab.*dat))/sqrt(s);   %将积分用求和代替

      mexhab=[mexh(-1*t/s),mexhab(1:len-1)];  %mexhab修改第一项并右移

    end

end

 

figure(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:200

    dat(i)=sin(2*pi*i*0.05);     %正弦波函数

end

len=length(dat);

lna=40;

wfab=zeros(lna,len);

mexhab=zeros(1,len);

for s=1:lna           %s 表示尺度 

    for k=1:len

        mexhab(k)=mexh(k/s);

    end  

    for t=1:len               % t 表示位移

      wfab(s,t)=(sum(mexhab.*dat))/sqrt(s);   %将积分用求和代替

      mexhab=[mexh(-1*t/s),mexhab(1:len-1)];  %mexhab修改第一项并右移

    end

end

figure(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:lna         

    for k=1:2*len-1

       mexhab(k)=mexh((k-len)/s);   

    end 

 

   temp=ifft( Ydata.*fft( mexhab,4*len ) ,4*len);

   wfab(s,:)=real(temp(2*len-1:3*len-2))/sqrt(s); %为什么要取实部而不是取模,我也不是很清楚,可是有种感觉

end

figure(1);

plot(dat);

title('原始数据图');

figure(2);  %小波系数谱

image(wfab);

colormap(pink(128));

title('小波系数谱 ');

cputime-t1

 

 

 

4fft快速计算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:lna         

 mexhab=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); %要取实部而不是取模,呵呵

end

figure(1);

plot(dat);

title('原始数据图');

figure(2);  %小波系数谱

image(wfab);

colormap(pink(128));

title('小波系数谱 ');

cputime-t1

 

5)保存为mexh2.m

 

function Y=mexh2(x)

Y=exp(-x.*x/2).*(1-x.^2);

 

Torstan

2005.09.16


 实验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);

t=1;

hh=size(X,2);

 

while t<=level 

    %先进行行小波变换

    for  row=1:hh

        Y(row,1:hh)=mdec1(X(row,1:hh),h,g) ;

    end

    %再进行列小波变换

    for col=1:hh

        temp=mdec1( Y(1:hh,col)',h,g);

        Y(1:hh,col)=temp';

    end

t=t+1;

hh=hh/2;

X=Y;

end

 

%内部子函数,对一行(row)矢量进行一次小波变换,利用fft实现

function y=mdec1(x,h,g)

%输入:行数组

%     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 1

r2=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:h1

        temp=mrec1(X(1:h1,col)',h,g)';

        X(1:h1,col)=temp;

    end

    %再对行变换

    for row=1:h1

        temp=mrec1(X(row,1:h1),h,g);

         X(row,1:h1)=temp;

     end

     h1=h1*2;

    

end

Y=X;

 

 

 

%内部子函数,对一行小波系数进行重构

function y=mrec1(x,h,g)

%输入:行数组

%     h为低通滤波器

%     g为高通滤波器

%输出: y 进行一级小波重构后值

lenx=size(x,2);

 

 

r3=dyadup(x(1,1:lenx*0.5),0);   %内插零use para 0

r4=dyadup(x(1,(lenx*0.5+1):lenx),0);   %use para 0

y=ifft(fft(r3,lenx).*fft(h,lenx))+ ifft(fft(r4,lenx).*fft(g,lenx));  

 


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多