声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 7197|回复: 5

[小波] 如何用MATLAB画出HAAR和DB小波的小波函数和尺度函数

[复制链接]
发表于 2007-6-1 10:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
想请教下如何用MATLAB画出HAAR和DB小波的小波函数和尺度函数:handshake
回复
分享到:

使用道具 举报

 楼主| 发表于 2007-6-1 11:29 | 显示全部楼层
在网上找到了这个程序,但是怎么用它来画DB小波的小波函数和尺度函数呢?

Daubechies小波基的构造
%  此程序实现构造小波基
%  periodic_wavelet.m
function ss=periodic_wavelet;
clear;clc;
% global MOMENT;  %  消失矩阶数
% global LEFT_SCALET;  %  尺度函数左支撑区间
% global RIGHT_SCALET;  %  尺度函数右支撑区间
% global LEFT_BASIS;  %  小波基函数左支撑区间
% global RIGHT_BASIS;  %  小波基函数右支撑区间
% global MIN_STEP;  %  最小离散步长
% global LEVEL;  %  计算需要的层数(离散精度)
% global MAX_LEVEL;  %  周期小波最大计算层数
[s2,h]=scale_integer;
[test,h]=scalet_stretch(s2,h);
wave_base=wavelet(test,h);
ss=periodic_waveletbasis(wave_base);

function [s2,h]=scale_integer;
%  本函数实现求解小波尺度函数离散整数点的值
%  sacle_integer.m
MOMENT=10;  %  消失矩阶数
LEFT_SCALET=0;  %  尺度函数左支撑区间
RIGHT_SCALET=2*MOMENT-1;  %  尺度函数右支撑区间
LEFT_BASIS=1-MOMENT;    %  小波基函数左支撑区间
RIGHT_BASIS=MOMENT;     %  小波基函数右支撑区间
MIN_STEP=1/512;          %  最小离散步长
LEVEL=-log2(MIN_STEP);  %  计算需要的层数(离散精度)
MAX_LEVEL=8;  %  周期小波最大计算层数
h=wfilters('db10','r');  %  滤波器系数
h=h*sqrt(2); % FI(T)=SQRT(2)*SUM(H(N)*FI(2T-N)) N=0:2*MOMENT-1;
for i=LEFT_SCALET+1:RIGHT_SCALET-1
    for j=LEFT_SCALET+1:RIGHT_SCALET-1
       k=2*i-j+1;
       if (k>=1&k<=RIGHT_SCALET+1)
       a(i,j)=h(k);  %  矩阵系数矩阵
       else
       a(i,j)=0;
       end
    end
end
[s,w]=eig(a);  %  求特征向量,解的基
s1=s(:,1);
s2=[0;s1/sum(s1);0]; %  根据条件SUM(FI(T))=1,求解;

%  本函数实现尺度函数经伸缩后的离散值
%  scalet_stretch.m
function [s2,h]=scalet_stretch(s2,h);
MOMENT=10;  %  消失矩阶数
LEFT_SCALET=0;  %  尺度函数左支撑区间
RIGHT_SCALET=2*MOMENT-1;  %  尺度函数右支撑区间
LEFT_BASIS=1-MOMENT;  %  小波基函数左支撑区间
RIGHT_BASIS=MOMENT;  %  小波基函数右支撑区间
MIN_STEP=1/512;  %  最小离散步长
LEVEL=-log2(MIN_STEP);  %  计算需要的层数(离散精度)
MAX_LEVEL=8;  %  周期小波最大计算层数
for j=1:LEVEL  %  需要计算到尺度函数的层数
   t=0;
   for i=1:2:2*length(s2)-3  %  需要计算的离散点取值(0,1,2,3 -> 1/2, 3/2, 5/2)
      t=t+1;
      fi(t)=0;
      for n=LEFT_SCALET:RIGHT_SCALET;  % 低通滤波器冲击响应紧支撑判断
          if ((i/2^(j-1)-n)>=LEFT_SCALET&(i/2^(j-1)-n)<=RIGHT_SCALET) %  小波尺度函数紧支撑判断
            fi(t)=fi(t)+h(n+1)*s2(i-n*2^(j-1)+1);  %  反复应用双尺度方程求解
          end
      end
   end
   clear s
   n1=length(s2);
   n2=length(fi);
   for i=1:length(s2)+length(fi)  %  变换后的矩阵长度
      if (mod(i,2)==1)
      s(i)=s2((i+1)/2);  %  矩阵奇数下标为小波上一层(0,1,2,3)离散值
      else
      s(i)=fi(i/2);  %  矩阵偶数下标为小波下一层(1/2,3/2,5/2)(经过伸缩变换后)的离散值
      end
   end
   s2=s;
end

%  采用双尺度方程求解小波基函数 PSI(T)
%  wavelet.m
function wave_base=wavelet(test,h);
MOMENT=10;  %  消失矩阶数
LEFT_SCALET=0;  %  尺度函数左支撑区间
RIGHT_SCALET=2*MOMENT-1;  %  尺度函数右支撑区间
LEFT_BASIS=1-MOMENT;  %  小波基函数左支撑区间
RIGHT_BASIS=MOMENT;  %  小波基函数右支撑区间
MIN_STEP=1/512;  %  最小离散步长
LEVEL=-log2(MIN_STEP);  %  计算需要的层数(离散精度)
MAX_LEVEL=8;  %  周期小波最大计算层数
i=0;
for t=LEFT_BASIS:MIN_STEP:RIGHT_BASIS;  %  小波基支撑长度
    s=0;
    for n=1-RIGHT_SCALET:1-LEFT_SCALET  %  g(n)取值范围
        if((2*t-n)>=LEFT_SCALET&(2*t-n)<=RIGHT_SCALET)  %  尺度函数判断
          s=s+h(1-n+1)*(-1)^(n)*test((2*t-n)/MIN_STEP+1);  %  计算任意精度的小波基函数值  
        end
    end
    i=i+1;
    wave_base(i)=s;
end
 楼主| 发表于 2007-6-1 21:13 | 显示全部楼层
今天看了一下,发现小波工具箱里有关DB的文件都是.mat的,要怎么调用这些文件来画出DB的小波函数和尺度函数呢?
发表于 2007-6-3 14:27 | 显示全部楼层
没有明白你的意思,什么叫画出呀,是不是做出小波分解的近似和细节分量的图?
发表于 2007-6-3 15:24 | 显示全部楼层

回复 #4 qinle 的帖子

楼主的意思是把小波基函数的图形画出来,不是分解后的分量图。
 楼主| 发表于 2007-6-5 15:42 | 显示全部楼层
呵呵,已经解决了

用了WAVEFUN函数

还是想请问一下,用intwave画出的小波积分有什么意义?

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-12 14:07 , Processed in 0.078867 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表