小波变换
-小波,一个神奇的波,可长可短可胖可瘦(伸缩平移),当去学习小波的时候,第一个首先要做的就是回顾傅立叶变换(又回来了,唉),因为他们都是频率变换的方法,而傅立叶变换是最入门的,也是最先了解的,通过傅立叶变换,了解缺点,改进,慢慢的就成了小波变换。主要的关键的方向是傅立叶变换、短时傅立叶变换,小波变换等。小波变换不仅可以获取信号的频率成分,还能得到每个频率成分出现的时间。这就是其优于傅里叶和短时傅里叶变换之处。
小波多分辨率分析
-小波多分辨率分析也叫多尺度分析,是小波分解与重构(Mallat算法)的理论基础。
小波分解(DWT)
-对原始信号进行分解,通过小波分解高通滤波器G和低通滤波器H来完成,过程如图:
-对原始信号通过滤波器,再经过下采样得到分解的高频系数D(细节部分)和低频系数A(近似部分),多层分解只需要对上一层分解出来的低频分量继续分解即可,理解不难,代码编程时只需要关注三点:与Matlab一样的数据对称拓延、卷积计算以及下采样,多层分解通过调用单层分解即可。
小波重构(IDWT)
-对小波分解的系数重构,即是分解过程的逆变换,保证重构后的信号与原始信号一致,不丢失任何信息。重构的过程如下:
-从分解的最底层往上重构出信号,首先是上采样,一般采用隔值插零的方法,即增加数据量来达到与原始信号长度相同的数据,然后分别通过重构的高通滤波器g和低通滤波器h,最终重构出原始信号,如果代码编写的没问题,那么重构出的信号与原始信号完全一致。而小波变换去噪的过程就是在分解后的各层系数中找出噪声所在的层,对该层的低频系数或者高频系数进行处理,比如软硬阈值处理,处理后再经过重构,即可重构出去除噪声的信号。
-所以小波变换在信号去噪中应用非常广泛。
小波去脉搏波基线漂移
-以我以前做过的血氧检测仪来说,血氧饱和度的计算需要通过采集人体的脉搏波来处理,采集脉搏波自然会引入一定的噪声,如高频噪声、基线漂移和运动伪差等,对于基线漂移,硬件电路上已经没法去除了,所以只能通过软件来处理,即通过小波变换来处理脉搏波的基线漂移。下面是我采集的两段带有明显基线漂移的自身的脉搏波
-第二段的基线漂移很明显,这影响到脉搏波的形态和幅值,导致血氧饱和度计算出现误差,对第二段波形利用db4小波对其进行5层分解,然后将每层分解的系数再重构,得出每层重构出的细节分量和进近似分量
-可以看到第5层的近似分量与基线漂移的形态完全一致,将其从原始脉搏波波形中去除即可,去除后的波形如下:
基本消除了原始波形的基线漂移。
基于STM32F4的小波变换
-由于需要将小波变换的代码移植到控制器上运行,所以需要编写相应的小波分解与重构的算法,所以需要编写出一维单层小波分解,单层重构以及多层分解与多层重构四个函数即可完成。下面是四个函数的头文件,欢迎一起交流,第一次写博客,不太会,哈哈
//函数声明//
//小波变换
uint16_t DWT_Dwt(
float32_t* p_OrgSig, //原始信号
uint16_t OrgSigLen, //信号长度
float32_t *cA, //近似系数
float32_t *cD //细节系数
);
//小波反变换
uint16_t DWT_Idwt(
float32_t *cA, //近似系数
float32_t *cD, //细节系数
uint16_t cALen, //系数长度
float32_t* p_OrgSig //重构的信号
);
//小波分解
uint16_t DWT_WaveDec(
float32_t* p_OrgSig, //原始信号
uint16_t OrgSigLen, //信号长度
uint16_t DecLevel//, //分解层数
);
//小波重构
uint16_t DWT_WaveRec(
float32_t* p_C, //DWT_C
uint16_t* p_L, //DWT_L
uint16_t DecLevel, //小波分解的层数
float32_t* p_OrgSig //重构出的原始信号
);`