一维小波变换的C++实现

  将小波展开系数当成离散信号,尺度函数和小波函数的MRA方程系数看成数字滤波器组,根据Mallat快速算法的原理,小波变换对数据的处理方法可简化成对信号逐级采样和滤波的过程。

图1 小波变换的滤波器实现

(a)分解算法 (b)重构算法

  一层小波分解算法流程如图2所示,信号将先经过小波分解低通滤波器和高通滤波器,随后被降采样,实现数据重构。而滤波算法可简化为待处理信号与滤波器数组卷积的过程,为了保证卷积前和卷积后数组的长度相同,结合小波变换中数组延拓的思想,在实际编程过程中,可以将超过信号长度的那段数据以前端对齐的方式与前面一段数据相加。将卷积后的数组每2个点采样一次,即可获得小波分解后的尺度系数和小波系数。

图2 一层小波分解算法

(X:待分解数组;H,G:小波分解滤波器;C,D:小波重构后数组)

  小波重构算法是小波分解算法的逆运算,其流程为升采样和滤波,最后数据相加实现重构。小波重构算法中滤波可视为系数与小波重构滤波器的卷积,与小波正变换类似,在重构算法中,需要将卷积后的数组末位对齐相加,获得与原数组长度相同的卷积结果。将小波系数和尺度系数以2为步长进行升采样,将获得的新数组分别经过小波重构低通滤波器和高通滤波器,再将滤波后的两组数据相加,即实现了一层小波重构。

  1 #define LENGTH 512
  2 #define LEVEL 4
  3 #define L_core 6
  4 
  5 static void Covlution(double data[], double core[], double cov[], int LEN)
  6 {
  7         double temp[LENGTH + L_core - 1] = {
   0};
  8         int i = 0;
  9         int j = 0;
 10 
 11     for(i = 0; i < LEN; i++)
 12         {
 13                 for(j = 0; j  < L_core; j++)
 14                 {
 15             temp[i + j] += data[i] * core[j];
 16         }
 17     }
 18 
 19         for(i = 0; i < LEN; i++)
 20      
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值