Haar小波

最近正在学习小波变换分析脑电信号,简单总结一下Haar小波。
一个信号的小波变换,可以分解为这个信号的最粗糙逼近加上各个细节,即AN=A0+W0+W1+…+WN-1;式中,AN为原始信号,A0为AN在最低分辨率下的逼近,W为各个分辨率下的细节部分。
例如,有a=[8,7,6,9]四个数,并使用b[4]数组来保存变换后的结果.
则一级Haar小波变换的结果为:
b[0]=(a[0]+a[1])/2,b[2]=(a[0]-a[1])/2
b[1]=(a[2]+a[3])/2,b[3]=(a[2]-a[3])/2
即依次从数组中取两个数字,计算它们的和以及差,并将和一半和差的一半依次保存在数组的前半部分和后半部分。
例如:有a[8],要进行一维Haar小波变换,结果保存在b[8]中
则一级Haar小波变换的结果为:
b[0]=(a[0]+a[1])/2,b[4]=(a[0]-a[1])/2
b[1]=(a[2]+a[3])/2,b[5]=(a[2]-a[3])/2
b[2]=(a[4]+a[5])/2,b[6]=(a[4-a[5]])/2
b[3]=(a[6]+a[7])/2,b[7]=(a[6]-a[7])/2

Haar小波在MATLAB中的实现(以图像作为输入信号,效果更明显):

%M.m文件
%二维HAAR变换函数
%img:数据
%x:需要进行Haar变换的图像为原图像的几倍,主要用于多级变换
%LL:变换后的最低频
%LH:变换后的中低频
%HH:变换后的高频
%作者:狒狒
%日期:2017.3.5
function im=M(img,x)
[q,w]=size(img);%选取二维信号的长度和宽度
m=q/x;%实际进行变换的图像的长度
n=w/x;%实际进行变换的图像的宽度
for i=1:n/2%构造简单的行Haar小波函数
    for j=1:n
        if(j==(2*i-1) | j==(2*i))
            b(j,i) = 0.5;
        else
            b(j,i) = 0;
        end
    end
end
for i=1:n/2
    for j=1:n
        if(j==(2*i-1))
            b(j,i+n/2)=0.5;
        end
        if(j==(2*i))
            b(j,i+n/2)=-0.5;
        end
    end
end
%对图像进行行变换
L=img(1:m,1:n)*b(:,1:n/2);
H=img(1:m,1:n)*b(:,n/2+1:n);
for i=1:m%构造简单的列Haar小波函数
    for j=1:m/2
        if(i==(2*j-1) | i==(2*j))
           c(j,i) = 0.5;
        else
            c(j,i) = 0;
        end 
    end
end
for i=1:m
    for j=1:m/2
        if(i==(2*j-1))
            c(j+m/2,i)=0.5;
        end
        if(i==(2*j))
            c(j+m/2,i)=-0.5;
        end
    end
end
%对图像进行列变换
    LL=c(1:m/2,:)*L;
    LH=c(m/2+1:m,:)*L;
    im=[LL;LH];
    im=[im,H];
%若为多级变换,合成最终图像
if(x>1)
    im=[im,img(1:m,w-n+1:w)];
    e=img((q-m):q,1:w);
    im=[im;e];
end
end
h=double(imread('Fig5.07(a).jpg'));%读入图片数据
h1=M(h,1);%Haar二维一阶变换
h2=M(h1,2);%Haar二维二阶变换
subplot(1,2,1);
imshow(uint8(h1));
subplot(1,2,2);
imshow(uint8(h2))

这里写图片描述
最终效果如图

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Haar小波是一种常用的小波变换基函数,它具有简单的数学表示和结构。在Matlab中,可以通过几个不同尺度的Haar小波进行分解和重构。 在Matlab中,可以使用函数"wavedec"实现Haar小波的分解。该函数可以将输入信号进行多层小波分解,并返回分解系数和近似系数。分解系数表示信号在不同尺度上的细节信息,而近似系数则表示信号的总体趋势。 以下是一个示例代码,展示如何使用不同尺度的Haar小波进行信号分解和重构: ```matlab % 输入信号 x = [1, 2, 3, 4, 5, 6, 7, 8]; % 分解层数 n = 3; % Haar小波分解 [c, l] = wavedec(x, n, 'haar'); % 分解系数和近似系数 c l % 重构信号 x_reconstructed = waverec(c, l, 'haar'); ``` 在上述代码中,输入信号x是一个长度为8的向量。利用函数"wavedec"将其分解为3层Haar小波,得到分解系数c和长度信息l。然后,可以通过函数"waverec"进行信号重构,得到x_reconstructed。 通过调整分解层数n,可以得到不同尺度的Haar小波分解结果。随着分解层数的增加,分解系数中的细节信息也会增加,用于表示信号在更高频率范围上的变化。 总之,利用Matlab中的函数可以方便地进行不同尺度的Haar小波分解和重构,以实现信号的多分辨率分析和压缩编码等应用。 ### 回答2: 在MATLAB中,我们可以使用不同尺度的Haar小波进行信号分解和重构。Haar小波是一种最简单且最基本的小波函数,它具有有限的支持和高频部分为零的特点。 在MATLAB中,我们可以使用`haarwavelet`函数生成Haar小波的基函数。这个函数可以接受一个参数N,表示Haar小波的尺度。较大的N值意味着更多的小波系数,从而可以提供更详细的信号分解和重构。 首先,我们需要加载信号并将其转换为Haar小波域。可以使用`wavedec`函数对信号进行多层小波分解。此函数的输入参数包括信号、小波函数以及要进行的分解层数。分解会生成一系列小波系数,其中包括近似系数和细节系数。 接下来,我们可以根据需要选择不同的尺度。较小的尺度会产生更概略的信号分解,而较大的尺度会提供更详细的信号信息。 最后,使用`waverec`函数将选定尺度的小波系数重构成信号。这个函数接受小波系数以及小波函数作为输入参数,并返回重构的信号。 需要注意的是,不同尺度的Haar小波在信号分解和重构过程中会提供不同程度的详细信息。较大的尺度可能会导致信号细节丢失,并且重构的信号可能有所偏差。因此,在选择不同尺度的Haar小波时需要根据具体任务的要求进行权衡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值