精华内容
下载资源
问答
  • 小波分解与重构

    2017-10-30 17:40:42
    使用db4小波,对离散信号进行分解重构,代码数据都有。
  • Matlab中实现小波分解方式 在matlab中实现小波分解的方式比较简单,通过[C,L] = wavedec(X,N,‘wname’)得到C和L,如下图,C表示分解得到的各个层的小波系数,L表示各个层的长度,L的最后一个数表示原数据的长度。 ...

    小波分解的理解

    Matlab中实现小波分解方式

    在matlab中实现小波分解的方式比较简单,通过[C,L] = wavedec(X,N,‘wname’)得到C和L,如下图,C表示分解得到的各个层的小波系数,L表示各个层的长度,L的最后一个数表示原数据的长度。
    小波分解wavedec结果
    通过在Matlab中输入open wavedec打开分解的源文件可以发现,主要就是通过执行dwt函数进行多层分解的,分解的系数通过wfilters函数获得Lo_D,Hi_D,在分解中[x,d] = dwt(x,Lo_D,Hi_D);不断使用分解得到的x作为下一次分解的输入。进一步地,打开dwt文件,还能看到为了抑制边界效应的边界延拓通过wextend完成,卷积是通过wconv1实现的。分解工作的流程图为:

    结果返回
    输入数据
    wavedec函数
    dwt函数
    wextend端点延拓方法
    wconv1卷积
    间隔取值

    分解得到的每个层的长度可以表示为:
    L i = L i − 1 + 滤 波 器 长 度 − 1 2 L_{i}=\frac{\mathrm{L_{i-1}}+\mathrm{滤波器长度}-1}2 Li=2Li1+1
    滤波器长度可以查看Matlab,如sym7的长度为14,sym4的长度为8。
    分解之后,可以通过X = waverec(C,L,‘wname’)重构出来,当需要去除某个层的信息,达到移除噪声(低层分解的细节部分)或者移除基线漂移(高层分解的平均部分),可以通过X = wrcoef(‘type’,C,L,‘wname’,N)得到某个level的‘a’或者’d’(type = ‘a’或者‘d’),用原始信号减去该部分即可。

    小波分解实现原理

    但是在其他的编程环境中,往往只有基础的DWT和IDWT用于做单层的小波变换,多尺度分解的wrcoef函数是没有实现的,得到的C的长度不一,不能直接重构。
    实现的原理即为:不断对信号进行小波分解,
    信号s经过一次小波分解后得到平均cA1和细节cD1,然后将cA1作为输入进行下一次小波分解得到平均cA2和细节cD2,然后将cA2作为输入进行下一次小波分解得到平均cA3和细节cD3…。假如进行3个尺度的分解,得到的C即为:
    C = [ c A 3 , c D 3 , c D 2 , c D 1 ] C=\lbrack cA3,cD3,cD2,cD1\rbrack C=[cA3,cD3,cD2,cD1]
    令不要的层的系数变为0,向上重构,例如如果需要去除基线漂移的话,就是细节部分cA3令为0,然后用令为0的cA3和cD3重构一次得到重构的cA2,cA2和cD2重构得到cA1,cA1和cD1重构得到信号s。
    通过这种方式写的Matlab验证脚本为:

    x = [0:500];
    subplot(211)
    plot(x,'-');hold on;
    subplot(212)
    [C,L] = wavedec(x,6,'sym7');
    a = wrcoef('a',C,L,'sym7',6);
    r1 = x - a;
    plot(r1,'b');
    
    %% 第二种方式
    C(1:L(1)) = zeros(1,L(1));
    r2 = waverec(C,L,'sym7');
    plot(r2,'k');
    %% 第三种方式
    [C1,L1] = wavedec(x,1,'sym7');
    [C2,L2] = wavedec(C1(1:L1(1)),1,'sym7');
    [C3,L3] = wavedec(C2(1:L2(1)),1,'sym7');
    [C4,L4] = wavedec(C3(1:L3(1)),1,'sym7');
    [C5,L5] = wavedec(C4(1:L4(1)),1,'sym7');
    [C6,L6] = wavedec(C5(1:L5(1)),1,'sym7');
    
    C6(1:L6(1)) = zeros(1,L6(1));
    x5 = waverec(C6,L6,'sym7');
    C5(1:L5(1)) = x5;
    x4 = waverec(C5,L5,'sym7');
    C4(1:L4(1)) = x4;
    x3 = waverec(C4,L4,'sym7');
    C3(1:L3(1)) = x3;
    x2 = waverec(C3,L3,'sym7');
    C2(1:L2(1)) = x2;
    x1 = waverec(C2,L2,'sym7');
    C1(1:L1(1)) = x1;
    r3 = waverec(C1,L1,'sym7');
    plot(r3,'r');
    

    三种重构方式效果,上图源信号,下图移除cA6之后的效果,三个方法输出一致,绘图被完全覆盖
    可以看到三种重构的方式结果是一样的,subplot(212)的三种方式去除了cA6之后是完全一样的,当其他编程环境中需要使用到类似的处理效果可以参考这个逻辑。

    Python环境下的实现为:

        def waveletdec(self, s, coef_type='d', wname='sym7', level=6, mode='symmetric'):
            import pywt
            N = len(s)
            w = pywt.Wavelet(wname)
            a = s
            ca = []
            cd = []
            for i in range(level):
                (a, d) = pywt.dwt(a, w, mode)  # 将a作为输入进行dwt分解
                ca.append(a)
                cd.append(d)
            rec_a = []
            rec_d = []
            for i, coeff in enumerate(ca):
                coeff_list = [coeff, None] + [None] * i
                rec_a.append(pywt.waverec(coeff_list, w)[0:N])  # 进行重构
            for i, coeff in enumerate(cd):
                coeff_list = [None, coeff] + [None] * i
                rec_d.append(pywt.waverec(coeff_list, w)[0:N])  # 进行重构
            if coef_type == 'd':
                return rec_d
            return rec_a
    
    展开全文
  • 前言 本文集中前面主要介绍了离散数据的傅里叶变换,并且得到了较好的效果!那既然有了傅里叶变换这个工具,为什么还需要小波变换呢?...时不变与时变的区别,看下面的实现的代码就很轻易理解: x = 0:0.001:1

    前言
    本文集中前面主要介绍了离散数据的傅里叶变换,并且得到了较好的效果!那既然有了傅里叶变换这个工具,为什么还需要小波变换呢?因为:傅里叶变换只能告诉你原始信号中有哪些频率,但不能告诉你这些频率的信号出现在什么时间!也就说明:如果信号是"时变"的(频率随着时间是改变的),那么单纯用傅里叶变换所能反映的信息就十分有限了!因此,针对时变信号,我们使用小波变换。图1展示"时变信号"与"时不变信号"区别:
    在这里插入图片描述

    图1:时不变信号与时变信号
    时不变与时变的区别,看下面的实现的代码就很轻易理解:

    x = 0:0.001:1;

    % 4个频率:
    f1 = 50; f2 = 80; f3 = 110; f4 = 20;

    % 时不变信号: 多频
    y1 = sin(2pif1x) + sin(2pif2x) + sin(2pif3x) + sin(2pif4x);
    % 时变信号: 多频
    y2 = sin(2pif1x).(x<=0.3) + sin(2pif2x).(x>0.3 & x<=0.6)+…
    sin(2pif3x).(x>0.6 & x<=0.8) + sin(2pif4x).(x>0.8);

    figure(1);

    subplot(2,1,1);
    plot(y1);
    grid on;
    xlabel(‘采样点’); ylabel(‘振幅’);
    axis([0 1000 -inf inf]);
    title(‘时不变信号’);

    subplot(2,1,2);
    plot(y2);
    grid on;
    xlabel(‘采样点’); ylabel(‘振幅’);
    axis([0 1000 -inf inf]);
    title(‘时变信号’)

    本文同样考虑的是离散数据的小波变换使用。通过手动matlab编程实现小波变换"塔式分解"与"重构"来深刻了解小波变换实现的内在含义。之后,借助matlab自带的一系列相关小波变换程序来实现"时频分析"和"小波去噪"。

    说明:本文更加侧重详细介绍matlab自带各种小波功能函数的使用!除了小波分解与重构的程序我们手动实现外,其他的各种操作都建议用自带函数实现。

    小波分解:
    小波分解的流程总结为:先将信号对半分解成"低频近似"与"高频细节"2个部分;同样的操作每次将上一次的"低频近似"部分再分成低频近似和高频细节部分,逐次细分(最多分解到每个部分只有1个点)。每次分出的高频细节部分不做分解。因此:每次分出低频近似部分相当于对本次信号做"低通滤波",分出的高频细节部分相当于对本次信号做"高通滤波"。所以:每次小波分解就是用1个低通滤波器和1个高通滤波器对本次信号做1次低通滤波和1次高通滤波而已。

    由上述说明可得:小波分解的关键在于2个(一组)滤波器。对于现实的离散数据而言,滤波器看上去很高大上其实就是很简单的数字而已,滤波听起来很难,其实就是做"点乘相加"而已。离散小波分解中最简单的一组滤波器为:

    低通滤波器:[0.5, 0.5];高通滤波器:[0.5, -0.5]。

    下面举例说明如何用上面这一组最简单滤波器对离散数据进行小波分解:

    假设我们的离散数据为:[2,5,8, 9, 7, 4, -1, 1]

    (1) 第一级分解:

    低通滤波:
    20.5 + 50.5 = 1 + 2.5 = 3.5
    80.5 + 90.5 = 4 + 4.5 = 8.5
    70.5 + 40.5 = 3.5 + 2 = 5.5
    -10.5 + 10.5 = -0.5 + 0.5 = 0

    得到低频近似部分:[3.5,8.5,5.5,0]

    高通滤波:
    20.5 + 5(-0.5) = 1 - 2.5 = -1.5
    80.5 + 9(-0.5) = 4 - 4.5 = -0.5
    70.5 + 4(-0.5) = 3.5 - 2 = 1.5
    -10.5 + 1(-0.5) = -0.5 - 0.5 = -1

    得到高频细节部分:[-1.5,-0.5,1.5,-1]

    (2)第二级分解:

    分解上一次分解得到的低频近似部分,高频细节不动。即待分解信号为:
    [3.5,8.5,5.5,0]
    低通滤波:
    3.50.5 + 8.50.5 = 1.75 + 4.25 = 6
    5.50.5 + 00.5 = 2.25 + 0 = 2.25
    得到的低频近似部分为:[6,2.25]

    高通滤波:
    3.50.5 + 8.5(-0.5) = 1.75 - 4.25 = -2.5
    5.50.5 + 0(-0.5) = 2.25 + 0 = 2.25
    得到的高频细节部分为:[-2.5,2.25]

    (3)第3级分解:
    同理,待分解信号是上一次分解得到的低频近似部分:[6,2.25]
    低通滤波:
    60.5 + 2.250.5 = 3 + 1.125 = 4.125
    得到的低频近似部分为:[4.125]

    高通滤波:
    60.5 + 2.25(-0.5) = 3 - 1.125 = 1.875
    得到的高频细节部分为:[1.875]

    到此为止,例子中给出的原始离散信号就达到了其最大分解级数(分解到元素只有1个)。整个过程很简单,只需注意每次点乘求和元素是无重合的。整个的多级分解过程如图2所示:
    在这里插入图片描述图2:离散信号小波多级分解示意图

    注意:不同组的高通和低通滤波中都有这样的一个规律:两者的区别只是高通滤波器中第2个值是负数而已;数都是一样的。

    小波多级分解清楚了,那怎么"重构/恢复"回去呢?塔式分解的逆向合成而已。根据滤波器的规律,我们可以设:
    在这里插入图片描述

    以2级分解到3级为例,我们知道:
    6a + 2.25a = 3级低通近似
    6a + 2.25(-a) = 3级高通细节

    那么逆过程就是,我们知道了3级低通近似和高通细节的值,我们还知道滤波器的数值(a已知),然后反推2级低通近似和高通细节数值,即:
    2级低通近似a + 2级高通细节a = 4.125
    2级低通近似a + 2级高通细节(-a) = 1.875

    所以:
    在这里插入图片描述
    在这里插入图片描述

    这样我们就得到了2级低通近似和2解高通细节,然后逐级往上递推即可实现重构/恢复~ so easy.

    整个分解过程我们清楚了,现在我们引入一些专业的名词:在离散数据中,一组低通高通滤波器,其实就是"小波基函数"!取不同的小波基函数其实就是滤波器里面的数值不同而已。最常用的"haar小波基"。下面我们就利用haar小波基,在matlab里手动实现小波分解与重构:

    matlab手动实现小波分解程序:

    clc ; clear;

    % 每次修改这里的原始数据, 个数最好是2^n
    % x = [9 7 3 5];
    x = [2 5 8 9 7 4 -1 1];
    % x = [2 5 8 9 7 4 -1 1 2 1 8 3 8 0 3 1];

    order_max = log(length(x))/log(2);
    fprintf(‘当前数据最多分解%d阶\n’,order_max);
    order = double(input(‘自定义分解阶数( order<order_max ):’));

    % matlab默认的haar小波基函数:
    low = [1/sqrt(2) 1/sqrt(2)];
    high = [1/sqrt(2) -1/sqrt(2)];

    new = zeros(1,length(x)); % 最后结果 —— 均值 + 差值
    ave = zeros(1,length(x)/2); % 均值(低频)记录
    dec = zeros(1,length(x)/2); % 差值(高频)记录

    % 小波循环分解部分: 其实就是低通和高通2种情况的卷积计算
    m = 1;
    xtmp = x;
    for norder = 1:order
    for n = 1:2:length(xtmp)
    ave(m) = sum(xtmp(n:n+1).*low);
    dec(m) = sum(xtmp(n:n+1).*high);
    m = m + 1;
    end
    % 下面2句的赋值过程, 总体是从后往前赋值的~
    % 进入过的高频就不会动了; 进入的低频再下次就会被自己分解出的高频和低频取代——总体从后往前√
    new( length(xtmp)/2+1:length(xtmp) ) = dec( 1:2^(order_max-norder) ); % 记录每次更新的高频内容;
    new( 1:length(xtmp)/2 ) = ave( 1:2^(order_max-norder) ); % 记录每次更新的低频内容;
    xtmp = ave( 1:2^(order_max-norder) );
    m = 1;
    end

    fprintf(‘手写%d级分解结果为:\n’,order);
    new

    fprintf(‘matlab自带%d级分解结果为:\n’,order);
    wavedec(x,order,‘haar’)
    matlab手动实现小波重构/恢复程序:

    clc ; clear;

    % 每次修改这里的原始数据, 个数最好是2^n
    % x = [9 7 3 5];
    x = [2 5 8 9 7 4 -1 1];
    % x = [2 5 8 9 7 4 -1 1 2 1 8 3 8 0 3 1];

    order_max = log(length(x))/log(2);
    fprintf(‘当前数据最多分解%d阶\n’,order_max);
    order = double(input(‘自定义分解阶数( order<order_max ):’));

    % 直接用知自带的分解函数:
    new = wavedec(x,order,‘haar’);

    % 小波重构——任意haar基函数全能重构回去
    % 计算的系数: 与基函数有关
    tmp1 = 1/( low(1) + high(1) );

    % 迭代重构开始:
    xrec = zeros(1,length(new)); % 记录复原的数据
    new_rec = new;

    for norder = order_max+1-order : order_max % 这个规律让任意低阶都可以适用
    m = 1; % 专门用来记录"前半段"位置——给奇数位用的
    for n = 1:2^norder
    half = 2^norder/2; % 当前重构区间的一半——也是用来给奇数位计算用的
    if mod(n,2) ~= 0
    % 奇数时操作:
    xrec(n) = tmp1*( new_rec(m) + new_rec(m+half) );
    m = m + 1;
    else
    % 偶数时操作:
    xrec(n) = (new_rec(m-1) - low(1)*xrec(n-1))/low(2);
    end
    end
    new_rec(1:n) = xrec(1:n); % 每次要更新的(后一次重构基于前一次结果): 从前往后
    end

    fprintf(’%d级分解后重构:\n’,order);
    new_rec

    fprintf(‘自带的%d级重构结构:\n’,order);
    [C,S] = wavedec(x,order,‘haar’);
    waverec(C,S,‘haar’)

    链接:https://www.jianshu.com/p/8847e6eebe16

    展开全文
  • 小波分解与重构基本原理 两种结构 历史学家本尼迪克特·安德森 ( Benedict Anderson)曾写道: “所有大于原始村庄的社区都可以想象得到……”。 从某种意义上说,类依赖和包依赖也都可以想象到。 他们不是真的...

    小波分解与重构基本原理

    两种结构

    历史学家本尼迪克特·安德森Benedict Anderson)曾写道: “所有大于原始村庄的社区都可以想象得到……”。

    从某种意义上说,类依赖和包依赖也都可以想象到。 他们不是真的在那里。 但是,我们在管理它们上花费了巨大的精力。 是什么促使我们努力应对幻觉怪物?

    好吧,这个博客的主要假设是源代码结构是有钱的。 特别是,结构不良的软件会遭受涟漪效应的严重影响,从而在一处更改代码会触发许多其他地方的更改,所有这些都会增加令人讨厌的更新成本。 此外,结构不良的软件非常复杂,以至于很难预测更新成本,因为这些连锁React会四处飞溅。

    例如,图1在左侧显示了一个良好的程序包结构-清晰的依赖关系使更新成本分析变得毫无问题-在右侧显示了一个不正确的包装结构。

    图1:两个系统,两个包装结构。

    图1:两个系统,两个包装结构。

    如果要检查这些样本的潜在波纹效应,则必须了解波纹效应如何从一个地方闪到另一个地方。 考虑如下的Java方法链,其中a()调用b()b()调用c() ,等等:

    private int a(int value) {
    	return b(value) * 2;
        }
        private int b(int value) {
    	return c(value) * 3;
        }
        private int c(int value) {
    	return d(value) * 5;
        }
        private int d(int value) {
            int startValue = 7;
    	return value - startValue;
        }

    当有人决定将startValue更改为double的 13.5时,就会发生连锁React,并决定必须保留此精度,因此需要将a()b()c()int s更新为double s。

    private double d(double value) {
            double startValue = 13.5;
    	return value - startValue;
        }

    程序员避免使用长距离传递依赖项,因为他们有更多的方法可以将任何随机更改波动回去。

    旧消息。 不重要的。 这没东西看。

    但是,当我们检查类依赖时,这会改变吗? 让我们将a()b()依附在一个类中,将c()d()依附于另一个类中,同时仍然保留方法级的传递依赖项: a() -> b() -> c() -> d()

    class Here {
            There there = new There();
            private int a(int value) {
                return b(value) * 2;
            }
            private int b(int value) {
    	    return there.c(value) * 3;
            }
        }
        class There {
            int c(int value) {
    	    return d(value) * 5;
            }
            private int d(int value) {
                int startValue = 7;
    	    return value - startValue;
            }
        }

    同样,请考虑d()的更改,从而触发所有其他更新。 此示例与之前的示例有区别吗?

    我们知道传递依赖长度是最大的敌人,在第二个示例中,在类级别上,只有两个类的传递依赖较短。 那么,与第一个示例的四种方法相比,在这两种类型中纹波效应的可能性较小吗?

    不,他们不是。 因为这四种方法仍然存在。 沿这四种方法产生波纹效应的可能性保持不变。 ( McBain -voice)“课程什么都不做!”

    什么是包依赖关系? 让我们将这些幼犬包装在单独的包装中:这是否有助于减少纹波效应的潜在成本?

    package x;
        class Here {
            There there = new There();
            private int a(int value) {
                return b(value) * 2;
            }
            private int b(int value) {
    	    return there.c(value) * 3;
            }
        }
    
        package y;
        public class There {
            public int c(int value) {
    	    return d(value) * 5;
            }
            private int d(int value) {
                int startValue = 7;
    	    return value - startValue;
            }
        }

    您会看到前进的方向。 尽管将类封装在两个程序包中,但仍然有四个方法令人讨厌的传递依赖关系,并且涟漪效应从根本上遍历了方法依赖关系。

    是的,课程也会受到连锁React的影响。 上面,类There这里由于类There的变化而受到重创,但这是底层方法级依赖关系的结果。 没有底层方法级别的依赖关系(假设您不直接访问字段变量,而您不是直接访问字段变量,对吗?),就不能存在任何类级别的依赖关系(因此也就没有类级别的涟漪效应)。

    从涟漪效应的角度来看,类和包级别的依赖关系仅仅是底层方法级别的依赖关系的指示性汇总。 从这个意义上说,它们不存在,至少作为独立的结构不存在。

    因此,方法级别的源代码结构可以被视为基本结构 ,而类和包级别的结构可以被视为派生结构 ,因为它是从底层方法级别结构派生的。

    那么我们可以不理会这种派生的结构而去喝啤酒吗?

    不。它只是为基本结构提供了不同但同样重要的目的。

    再次考虑图1的好坏结构,在这里复制在图2中……因为滚动。

    图1:两个系统,两个包装结构。

    图2:再次是图1。

    如果我们的理论是正确的,那么这两个派生包结构都不会告诉我们任何一个系统要花费多少更新,这些信息被冻结到方法级结构中。

    但是,如果我们假设方法在包装上的典型分布(也就是说,没有一个包装包含所有方法的99%),那么图2告诉我们一些重要的事情:它告诉我们可以预测美容的相对更新成本在左边比在右边的野兽更好。

    我们可以预测,对左侧系统的最上层程序包进行更改的成本应比对底部系统上的程序包进行更改的成本低,因为对这些下层程序包的依赖性更大。 相对于蜡笔涂抹而言,这是一个巨大的好处,因为更改任何包装都可能会影响几乎所有其他包装。

    正是这种派生的结构(而不​​是基本结构)才能实现这种粗粒度的可预测性,这对于任何大型商业软件项目都是必不可少的。

    您可能会怀疑这种可预测性也源于基本的方法结构,左侧的系统必须源自比右侧的系统更好的方法结构。 但不是。 实际上,图2的两个包结构都源自相同的方法结构:它们实际上是同一系统。

    图3显示了邪恶的黑客如何通过182重构对左侧的系统造成了折磨(使用先前文章中的蛮力包耦合减少算法)。 细节并不重要,但是该算法仅在包之间移动类,翻译对t a() -> b() -> c() -> d()毫无影响; 无论所有四个方法都挤在一个类中,还是嬉戏在两个,三个或四个类或包中,此传递依赖关系都保持不变。

    图3:结构良好,被炸死。

    图3:结构良好,被炸死。

    两种类型的重构

    给定这两种不同的结构,并且鉴于重构只是保留行为的重构,因此必须有两种类型的重构。

    如果您更改程序的基本结构(例如,添加或合并方法,或者修剪长方法的可传递依赖项),那么您正在做第一种重构,那就叫它: 基本重构 。 基本重构的目的是使程序的更新便宜。

    如果更改程序的派生结构(例如,将一个类拆分为两个类,或将某些类移动到新包中),那么您正在执行第二种类型的重构,我们称之为: 精巧重构 。 精细重构的目的不是使程序的更新成本降低,而是使更新成本更可预测(通过“阐述”系统的粗粒度性质)。

    碰巧的是,改进这两种结构的方法是相同的: 最小化可传递依赖项的长度 ,无论它们是在方法级别,类级别还是程序包级别。

    因此从某种意义上讲,这全是哲学上的。

    所以……是的……对此感到抱歉。

    摘要

    博客一直在抱怨,良好的结构既可以帮助降低更新成本,又可以提高成本可预测性。

    现在您知道了。

    翻译自: https://www.javacodegeeks.com/2016/03/fundamental-refactoring-vs-elaborative-refactoring.html

    小波分解与重构基本原理

    展开全文
  • 小波分解和重构

    千次阅读 2020-12-06 06:43:12
    小波变换能够很好地表征一大类以低频信息为主要成分的信号,小波包变换可以对高频部分提供更精细的分解详见(http://www.cnblogs.com/welen/articles/5667217.html)小波分解函数和重构函数的应用和区别...

    小波变换能够很好地表征一大类以低频信息为主要成分的信号,

    小波包变换可以对高频部分提供更精细的分解

    详见(http://www.cnblogs.com/welen/articles/5667217.html)

    小波分解函数和重构函数的应用和区别

    (https://www.baidu.com/link?url=NsLWcGxYPabqB0JEFzkjHzeLmcvGkjDRccPoaD7K0gwo9mrHRDCUgTbV15zT8NKTm9PAuTJ2Hwb3n10PutFRpbOdQRac7XC48fI2uYmA2eC&wd=&eqid=bae463400004bb3f000000035c0cc2a9)

    小波分析基本函数可分为分解和重构两类.

    一维小波分解函数和系数提取函数:

    对常用的dwt、wavedec、appcoef函数的常用格式进行举例说明。

    格式:  [ca, cd]=dwt(X,’wname’)        %单尺度一维离散小波分解

    [C, L]=wavedec(X,N,’wname’)   %多尺度一维小波分解(多分辨分析函数)

    ca=appcoef(C,L,’wname’,N)      %提取一维小波变换低频系数

    说明:

    (1)小波分解函数和系数提取函数的结果都是分解系数;

    (2)如何理解小波系数:小波系数是信号在做小波分解时所选择的小波函数空间的投影。

    我们知道,一个信号可以分解为傅里叶级数,即一组三角函数之和,而傅里叶变换对应于傅里叶级数的系数;同样,一个信号可以表示为一组小波基函数之和,小波变换系数就对应于这组小波基函数的系数。

    (3)多尺度分解是按照多分辨分析理论,分解尺度越大,分解系数的长度越小(是上一个尺度的二分之一)。我们会发现分解得到的小波低频系数的变化规律和原始信号相似,但要注意低频系数的数值和长度与原始信号以及后面重构得到的各层信号是不一样的。

    一维小波重构函数:

    对常用的idwt、waverec、wrcoef函数进行举例说明。

    格式:

    X=idwt(ca,cd,’wmane’)           %单尺度一维小波逆变换

    X=waverec(C,L,’wname’)         %多尺度一维小波重构

    X=wrcoef(‘type’,C,L,’wname’,N)   %对一维小波系数进行单支重构

    说明:

    (1)小波重构函数的结果都是信号;

    (2)不管是用哪个重构函数对系数进行重构后,结果的长度和原始信号的长度是相同的;

    如果重构的是低频部分,那么观察得到的结果X,其数值大小和原始信号是差不多的。

    (其他参考:

    https://www.baidu.com/link?url=Op4W9vNERXYnf25eqkDqywDdzN_J_6jJrZPi1DgK_uFkD3Jzbcfv41bu6dPSnCgg0lMKnES9qsIppG7Q95_RVOyotqEU2cTnkj1FkH5-c1a&wd=&eqid=bae463400004bb3f000000035c0cc2a9

    https://blog.csdn.net/chenyusiyuan/article/details/2514119)

    小波去噪:

    一般来说,噪声信号多包含在具有较高频率细节中,在对信号进行了小波分解之后,再利用门限阈值等形式对所分解的小波系数进行权重处理,然后对小信号再进行重构即可达到信号去噪的目的。具体步骤为:

    a.一维信号的小波分解,选择一个小波并确定分解的层次,然后进行分解计算。

    b.小波分解高频系数的阈值量化,对各个分解尺度下的高频系数选择一个阈值进行软阈值量化处理。

    C.一维小波重构,根据小波分解的最底层低频系数和各层高频系数进行一维小波的重构

    一维小波变换的 Matlab 实现(https://blog.csdn.net/qq_29543611/article/details/80232662)

    (1) dwt 函数

    功能:一维离散小波变换

    格式:[cA,cD]=dwt(X,'wname')

    [cA,cD]=dwt(X,Lo_D,Hi_D)

    说明:[cA,cD]=dwt(X,'wname') 使用指定的小波基函数 'wname' 对信号 X 进行分解,cA、cD 分别为近似分量和细节分量;[cA,cD]=dwt(X,Lo_D,Hi_D) 使用指定的滤波器组 Lo_D、Hi_D 对信号进行分解。

    (2) idwt 函数

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

    格式:X=idwt(cA,cD,'wname')

    X=idwt(cA,cD,Lo_R,Hi_R)

    X=idwt(cA,cD,'wname',L)

    X=idwt(cA,cD,Lo_R,Hi_R,L)

    说明:X=idwt(cA,cD,'wname') 由近似分量 cA 和细节分量 cD 经小波反变换重构原始信号 X 。

    'wname' 为所选的小波函数

    X=idwt(cA,cD,Lo_R,Hi_R) 用指定的重构滤波器 Lo_R 和 Hi_R 经小波反变换重构原始信号 X 。

    X=idwt(cA,cD,'wname',L) 和 X=idwt(cA,cD,Lo_R,Hi_R,L) 指定返回信号 X 中心附近的 L 个点。

    其他资料:

    http://blog.sina.com.cn/s/blog_b526d0f10102xxh6.html

    https://blog.csdn.net/charlene_bo/article/details/71156390

    https://blog.csdn.net/ckzhb/article/details/78288847

    小波包分解和小波分解:(https://blog.csdn.net/ckzhb/article/details/78288847)

    能量谱:(https://blog.csdn.net/ckzhb/article/details/78288847 )

    基于小波包分解提取多尺度空间能量特征的原理是把不同分解尺度上的信号能量求解出来,将这些能量值按尺度顺序排列成特征向量供识别使用。

    20180510补充更新:具体计算公式如下所示,本文中未使用重构后的系数进行能量值计算,直接使用小波包分解后的系数,参考文献《基于小波包能量特征的滚动轴承故障监测方法 》。

    给出两部分代码,写成两个函数。一个是小波包分解与重构,另一个是能量谱函数。

    代码名称:wavelet_packetdecomposition_reconstruct

    https://blog.csdn.net/qq_23869697/article/details/79436808

    展开全文
  • 小波阈值去噪原理实现

    千次阅读 多人点赞 2021-03-24 22:21:56
    将信号通过小波变换(采用Mallat算法)后,信号产生的小波系数含有信号的重要信息,将信号经小波分解后小波系数较大,噪声的小波系数较小,并且噪声的小波系数要小于信号的小波系数,通过选取一个合适的阀值,大于阀...
  • 小波分解的出发点

    千次阅读 2018-12-12 21:50:42
    经过持续学习研究,终于理解了小波分解原理和目的 小波与傅里叶变换一样,都是基函数去拟合被测信号 与傅里叶变换不同的是,小波是采用非周期信号,通过这个基函数的不同尺度缩放去拟合被测信号的不同频率,再...
  • 在理解了离散小波变换的基本原理和算法的基础上,通过设计VC程序对简单的一维信号在加上了高斯白噪声之后进行Daubechies小波、Morlet小波和Haar小波变换,从而得到小波分解系数
  • Mallat算法及C语言实现(一维DB小波分解与重构)
  • 课堂作业,采用haar小波实现二维图像的分解与重构(mallat算法):
  • 利用小波分解后,频率计算问题

    千次阅读 2019-03-29 10:10:02
    matlab中使用小波工具箱对信号进行小波分解后,得到各频率分量的重构信号,分解后的这些信号的频段具体怎么计算??? 答: 小波变换并不是纯频域的变换,它无法完全脱离时空域,所以小波的应用的多数领域并不十分...
  • matlab m文件编写的DB小波分解与重构算法,直接可运行,思路清晰。
  • Farid等人通过对大量的载体图像分析发现,在小波状分解中存在强大的高阶统计规律【1】。...将图像进行三级小波分解,保留每次分解产生的三个方向的子带系数和低频分量的绝对值,一共有12个子带。特征的计...
  • 小波与小波包、小波包分解与信号重构、小波包能量特征提取 (Matlab 程序详解) ... 本人当前对小波理解不是很深入,通过翻阅网络他人博客,进行汇总总结,重新调试Matlab代码,实现小波与小波包、...
  • 小波db4分析

    2017-10-30 17:34:31
    使用小波DB4进行分解一维信号,进行三层分解,可以自行修改,实现多层分解
  • 二维haar小波分解与重构的matlab实现

    万次阅读 多人点赞 2016-09-03 10:26:02
    去年11月发布了一系列有关小波变换和图像处理的文章,把学习小波过程中的心得体会和编写的程序放在网上和大家共享交流...有关小波图像分解和重构的两篇文章中分享的程序,存在下列问题: (1)程序所用的小波函数只有
  • 哈尔小波原理实现

    2013-04-23 16:28:24
    Haar小波在图像处理和数字水印等方面应用较多,这里简单的介绍一下哈尔小波的基本原理以及其实现情况。 一、Haar小波的基本原理 数学理论方面的东西我也不是很熟悉,这边主要用简单的例子来介绍下Haar小波的使用...
  • 图像小波分解与重构

    万次阅读 2017-05-03 22:57:43
     所谓的小波的小是针对傅里叶波而言,傅里叶波指的是在时域空间无穷震荡的正弦(或余弦波)。  相对而言,小波指的是一种能量在时域非常集中的波,它的能量有限,都集中在某一点附近,而且积分的值为零,这说明它...
  • 最近整理了基于Harr小波分解的图像融合技术实现可见光图像和红外图像的简单融合,本文侧重于图像融合,并不注重于Harr小波变换,所以就只做了一层小波分解和重构(分解层数越多,噪声处理起来也越麻烦),下面简要给...
  • 关于小波分解的滤波器理解

    千次阅读 2019-03-29 20:55:37
    小波分解和重构在mallat算法中采用了使用了滤波器组这样一个方法,将信号分别于不同小波所得到的高通滤波器和低通滤波器系数相卷积,然后进行下采样,得到信号的细节系数和近似系数,关于这点我有一点不是特别理解:...
  • Python语音基础操作--5.4小波分解

    千次阅读 2020-05-30 14:06:14
    Python语音基础操作–5.1自适应滤波 Python语音基础操作–5.2谱减法 Python语音基础操作–5.4小波分解 Python语音基础操作–6.1PCM编码 Python语音基础操作–6.2LPC编码 Python语音基础操作–6.3ADPCM编码 Python...
  • 一、小波分析算法的计算1、Mallat算法[经典算法]在小波理论中,多分辨率分析是一个重要的组成部分。多分辨率分析是一种对信号的空间分解方法,分解的最终目的是力求构造一个在频率上高度逼近L2(R)空间的正交小波基...
  • 小波分解与重构1Mallat算法小波分解与重构1 Mallat 算法通过查阅文献了解到,目前利用小波函数进行分解与重构主流的方法是Mallat 算法,因此了解这个算法对于小波分解与重构的理解会有帮助。任何一种离散变换如果...
  • 注:本文是程序的说明和实现思路,代码见:...与MATLAB类似,小波分解后产生2个数组DWT_L和DWT_C,但定义与MATLAB不同。定义如下: DWT_L:[DWT_SIG_LEN,c...
  • 函数wdencmp功能:小波去噪,得到去噪后的图像[XC,CXC,LXC,PERF0,PERFL2] = WDENCMP('gbl',X,'wname',N,THR,SORH,KEEPAPP) 其中XC为去噪后的图像信号在wdencmp中通过xc = waverec2(cxc,lxc,w) ,重构函数得到信号...
  • 基于自适应滤波器和小波分析的奇异值分解图像压缩 摘要    根据奇异值分解的数学原理和矩阵特点,设计基于奇异值分解的图像压缩...自适应滤波、小波分解、奇异值分解的原理 自适应滤波器:   由于滤波器开发者的设
  • 小波阈值去噪的基本原理小波阈值去噪的基本思想是先设置一个临界...具体步骤如下:(1)对带噪信号f(t)进行小波变换,得到一组小波分解系数Wj,k;(2)通过对小波分解系数Wj,k进行阈值处理,得到估计小波系数Wj,k,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,733
精华内容 3,893
关键字:

小波分解的实现原理

友情链接: VirtualFunction.rar