zoukankan      html  css  js  c++  java
  • 小波变换工程实现原理总结

    1,关于小波变换的原理不再总结,以前转载过别人的文章,这篇是工程实现的原理总结。

    2,关于小波变换的实现有mallat滤波器组的方法和提升小波的方法。

    3,mallat滤波器组的方法大致框架如下

    其中G和H的关系式为

    而H可以由matlab中wfilters命令得到。

    下图是基于查找表的mallat算法框架

    用matlab卷积的方法实现的小波分解与合成,弄了一个正弦序列,长度1000,有噪声,通过wavedec得到分解后的序列然后通过wfilter生成的滤波器系数与正弦序列卷积然后抽取得到新的序列。

    [c,l]=wavedec(ns,4,'db1');
    [l_d,h_d,l_r,h_r]=wfilters('db1');
    tempm=conv(ns,l_d);
    tempn=conv(ns,h_d);
    m=tempm(2:2:1000);
    n=tempn(2:2:1000);

    如果想要合成的话就先插值然后经过重构滤波器之后相加。

    m_up=zeros(1,1000);
    n_up=zeros(1,1000);
    m_up(2:2:1000)=m;
    n_up(2:2:1000)=n;
    m_back=conv(m_up,l_r);
    n_back=conv(n_up,h_r);
    ns_back=m_back+n_back;

    去掉第一个元素就得到之前的序列。

    当然,可以用循环卷积代替卷积得到卷积结果,参考例子(转载)

    小波谱分析mallat算法经典程序

    clc;clear;
    %% 1.正弦波定义
    f1=50; % 频率1
    f2=100; % 频率2
    fs=2*(f1+f2); % 采样频率
    Ts=1/fs; % 采样间隔
    N=120; % 采样点数
    n=1:N;
    y=sin(2*pi*f1*n*Ts)+sin(2*pi*f2*n*Ts); % 正弦波混合
    figure(1)
    plot(y);
    title('两个正弦信号')
    figure(2)
    stem(abs(fft(y)));
    title('两信号频谱')
    %% 2.小波滤波器谱分析
    h=wfilters('db30','l'); % 低通
    g=wfilters('db30','h'); % 高通
    h=[h,zeros(1,N-length(h))]; % 补零(圆周卷积,且增大分辨率变于观察)
    g=[g,zeros(1,N-length(g))]; % 补零(圆周卷积,且增大分辨率变于观察)
    figure(3);
    stem(abs(fft(h)));
    title('低通滤波器图')
    figure(4);
    stem(abs(fft(g)));
    title('高通滤波器图')
    %% 3.MALLET分解算法(圆周卷积的快速傅里叶变换实现)
    sig1=ifft(fft(y).*fft(h)); % 低通(低频分量)
    sig2=ifft(fft(y).*fft(g)); % 高通(高频分量)
    figure(5); % 信号图
    subplot(2,1,1)
    plot(real(sig1));
    title('分解信号1')
    subplot(2,1,2)
    plot(real(sig2));
    title('分解信号2')
    figure(6); % 频谱图
    subplot(2,1,1)
    stem(abs(fft(sig1)));
    title('分解信号1频谱')
    subplot(2,1,2)
    stem(abs(fft(sig2)));
    title('分解信号2频谱')
    %% 4.MALLET重构算法
    sig1=dyaddown(sig1); % 2抽取
    sig2=dyaddown(sig2); % 2抽取
    sig1=dyadup(sig1); % 2插值
    sig2=dyadup(sig2); % 2插值
    sig1=sig1(1,[1:N]); % 去掉最后一个零
    sig2=sig2(1,[1:N]); % 去掉最后一个零
    hr=h(end:-1:1); % 重构低通
    gr=g(end:-1:1); % 重构高通
    hr=circshift(hr',1)'; % 位置调整圆周右移一位
    gr=circshift(gr',1)'; % 位置调整圆周右移一位
    sig1=ifft(fft(hr).*fft(sig1)); % 低频
    sig2=ifft(fft(gr).*fft(sig2)); % 高频
    sig=sig1+sig2; % 源信号
    %% 5.比较
    figure(7);
    subplot(2,1,1)
    plot(real(sig1));
    title('重构低频信号');
    subplot(2,1,2)
    plot(real(sig2));
    title('重构高频信号');
    figure(8);
    subplot(2,1,1)
    stem(abs(fft(sig1)));
    title('重构低频信号频谱');
    subplot(2,1,2)
    stem(abs(fft(sig2)));
    title('重构高频信号频谱');
    figure(9)
    plot(real(sig),'r','linewidth',2);
    hold on;
    plot(y);
    legend('重构信号','原始信号')
    title('重构信号与原始信号比较')

    4,小波提升算法实现小波变换基本原理

    5,5-3变换fpga实现框图

    6,关于数据的周期对称延拓

  • 相关阅读:
    Ubuntu-18.04 设置开机启动脚本
    香橙派PC Plus开发镜像制作
    Flurl使用Polly添加重试机制
    在Windows上远程调试Ubuntu-Arm上的.Netcore
    NAT
    关于visual studio 2019的参数信息快捷键无效
    spring cloud ip地址注册问题
    spring cloud sleuth集成问题
    spring boot admin 安装问题
    pm2+nuxt 自动重启问题
  • 原文地址:https://www.cnblogs.com/lianjiehere/p/4239342.html
Copyright © 2011-2022 走看看