一维小波变换的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 { 21 if(i < L_core - 1) 22 cov[i] = temp[i] + temp[LEN + i]; 23 else 24 cov[i] = temp[i]; 25 } 26 27 } 28 29 static void Covlution2(double data[], double core[], double cov[], int LEN) 30 { 31 double temp[LENGTH + L_core - 1] = {0}; 32 int i = 0; 33 int j = 0; 34 35 for(i = 0; i < LEN; i++) 36 { 37 for(j = 0; j < L_core; j++) 38 { 39 temp[i + j] += data[i] * core[j]; 40 } 41 } 42 43 for(i = 0; i < LEN; i++) 44 { 45 if(i < L_core - 1) 46 cov[i + LEN - L_core + 1] = temp[i] + temp[LEN + i]; 47 else 48 cov[i - L_core + 1] = temp[i]; 49 } 50 51 } 52 53 static void DWT1D(double input[], double output[], double LF[], double HF[], int l) 54 { 55 int i = 0; 56 double temp[LENGTH] = {0}; 57 int LEN = LENGTH / pow(2, l - 1); 58 59 Covlution(input, LF, temp, LEN); 60 for(i = 1; i < LEN; i += 2) 61 { 62 output[i/2] = temp[i]; 63 } 64 65 Covlution(input, HF, temp, LEN); 66 for(i = 1; i < LEN; i += 2) 67 { 68 output[LEN/2 + i/2] = temp[i]; 69 } 70 } 71 72 static void DWT(double input[], double output[], double LF[], double HF[], int len[]) 73 { 74 int i; 75 int j; 76 77 len[0] = len[1] = LENGTH / pow(2, LEVEL); 78 for(i = 2; i <= LEVEL; i++) len[i] = len[i - 1] * 2; 79 80 DWT1D(input, output, LF, HF, 1); 81 for(i = 2; i <= LEVEL; i++) 82 { 83 for(j = 0; j < len[LEVEL + 2 - i]; j++) input[j] = output[j]; 84 DWT1D(input, output, LF, HF, i); 85 } 86 } 87 88 static void IDWT1D(double input[], double output[], double LF[], double HF[], int l, int flag) 89 { 90 int i = 0; 91 double temp[LENGTH] = {0}; 92 int LEN = l * 2; 93 94 if(flag) Covlution2(input, HF, temp, LEN); 95 else Covlution2(input, LF, temp, LEN); 96 97 for(i = 0; i < LEN; i++) 98 { 99 output[i] = temp[i]; 100 } 101 } 102 103 static void IDWT(double input[], double output[], double LF[], double HF[], int len[], int level) 104 { 105 int i; 106 int j; 107 for(j = 0; j < len[LEVEL + 1 - level]; j++) 108 { 109 output[2 * j] = 0; 110 output[2 * j + 1] = input[j]; 111 } 112 for(j = 0; j < 2 * len[LEVEL + 1 - level]; j++) 113 { 114 input[j] = output[j]; 115 } 116 IDWT1D(input, output, LF, HF, len[LEVEL + 1 - level], 1); 117 118 for(i = level - 1; i > 0; i--) 119 { 120 for(j = 0; j < len[LEVEL + 1 - i]; j++) 121 { 122 input[2 * j] = 0; 123 input[2 * j + 1] = output[j]; 124 } 125 IDWT1D(input, output, LF, HF, len[LEVEL + 1 - i], 0); 126 } 127 }
用C++算法实现的小波变换结果与MATLAB实现的小波变换结果对比(心电信号,db5小波,5层分解)。计算的结果几乎相差无异,大多数位于中间的数据计算结果完全相同,两端的数据则存在一定误差,这可能与对信号采取的延拓方式不同有关。
(a)小波变换结果(红线:MATLAB计算结果;蓝线:C++算法计算结果)
(b)小波变换误差(两个计算结果相减)
参考文献:网上各类资料,时间有点久,当时忘记记下了。
转载于:https://www.cnblogs.com/Zzz-y/p/7881715.html
一维小波变换的C++实现相关推荐
- matlab对非平稳一维信号的小波变换
matlab实验代码如下 clc cleart=linspace(0,2*pi,1024);%信号采样时间点 signal=sin(10*t).*stepfun(t,pi);%实验信号%进行一维离散小 ...
- 一维离散小波变换过程
小波变换的本质不过是一种数学变换 在这里仅仅讨论小波的小波变换过程中对输入的信号进行了怎样的操作,尽量不涉及内部细节和数学原理 1.一维小波变换的输入变量是一个[1×n]的矩阵,你也可以把它理解为信号 ...
- 其他算法-浅谈小波变换
傅里叶变换,拉普拉斯变换,凡是变换,本质都是为了用一种基准化的方式描述信号:比如对一个信号进行傅里叶变换,结果为不同频率正弦波的叠加,这些不同频率的正弦波就是描述信号的基,即傅里叶空间下的坐标系: 现 ...
- linux小波识别算法,人脸识别相关技术之小波变换
一.图像/矩阵进行Haar小波的基本原理 小波分析的基本思想是用一族函数表示或逼近信号或函数.这一函数族称为小波函数系(小波基),它是通过一个基本小波函数的不同尺度伸缩和平移而形成的.小波变换的实质是 ...
- RSE2021/云检测:基于小波变换和连续多尺度空间注意的上下块深度网络云检测
RSE2021/云检测Deep network based on up and down blocks using wavelet transform and successive multi-sca ...
- C语言实现一维信号小波阙值去噪
实现小波阙值去噪分三个步骤: 1.将源信号分解成系数: 2.根据分解的系数获取阙值: 3.根据阙值对系数进行过滤: 4.将过滤的系数还原成信号,最终的结果就是将源信号过滤后的结果. 我实现的代码主要是 ...
- 冈萨雷斯《数字图像处理》学习笔记(七)小波变换和多分辨率处理
序言 什么是小波 "小波"(wavelet)就是一种"尺度"很小的波动,并具有时间和频率特性 小波函数必须满足以下两个条件: (1)小波必须是振荡的: (2)小 ...
- 数字图像处理——第七章(小波变换和多分辨率处理)
小波变换和小波包变换 一.基础 1.1 图像金字塔 1.2 子带编码 1.3 哈尔变换(Haar) 二.多分辨率展开 2.1 级数展开 2.2 尺度函数 2.3 小波函数 三.小波变换 3.1 一维小 ...
- 【图像隐藏】基于小波变换+SURF、RANSAC、LT码、CRC(循环冗余检验)码多种算法实现图像隐藏(抗多种攻击)matlab源码
1 算法介绍 1.1 小波变换 一维离散小波变换 从滤波器的观点来看,对于一维小波变换就是把信号分别通过低通滤波器和高通滤波器把原始信号分解为原信号的近似系数和原信号的细节系数两个部分,其物理思想就是 ...
最新文章
- RabbitMQ安装与初始配置【转载】
- 前嗅ForeSpider教程:如何创建新任务
- Java 中的位运算
- 刚刚,改造了下BaseDao……
- delphi开发日志——注入“思想”,让程序操纵数据
- 离线安装PostgreSQL
- 揭开BootStrap的神秘面纱
- java 反编译工具=_java反编译工具(XJad)v2.2
- 通过PyMuPDF编写增值税发票多PDF文件合并工具
- 安装 Eyoucms
- 1097: 计算平均成绩(函数专题)
- 2020.04.08【NOIP普及组】模拟赛C组24 总结
- thinkadmin V6 Experiences
- 1.2.1 python中的函数
- uni-app自定义页面导航内容
- 尚硅谷电商管理平台笔记2
- mysql字段值是什么_什么是数据库字段值
- 计算机网络学习笔记(一)——什么是Internet
- 【翻页电子书制作软件】名编辑电子杂志大师教程 | 添加flash动画
- 全球与中国IHE XDS.B(跨企业文档共享)市场现状及未来发展趋势