历史上的今天
返回首页

历史上的今天

今天是:2025年02月19日(星期三)

正在发生

2019年02月19日 | 基于STM32F4的小波分解(Mallat算法)程序说明

2019-02-19 来源:eefocus

一、主要思路 


原始信号:OrgSig 


信号长度:DWT_SIG_LEN 


小波分解层数:N 


与MATLAB类似,小波分解后产生2个数组DWT_L和DWT_C,但定义与MATLAB不同。定义如下: 

DWT_L:[DWT_SIG_LEN,cD1_LEN,cD2_LEN…,cDN_LEN],其中xxx_LEN代表该数组的长度 

DWT_C:[cD1 | cD2 | … cDN | cAN],其中cDx代表第x层的细节系数,cAN代表第N层的近似系数 


二、函数原型 


1、 小波变换函数DWT_Dwt 

函数原型:


/****************************************

**小波变换,即1层小波分解

//V1.00   实现基本功能 2016-9-18 21:41:50


* @原理:

            DWT_FILTER_LEN-1

1、cA(n) =      ∑        DWT_Lo_D[k]*Sig[2*n-k+1]

                k=0

2、上述公式实现了卷积后再降采样,并且降采样时采的是第偶数个点

3、Sig的下标加1就是为了保证采样的是偶数点(C中下标从0开始,偶数点是第1,3,5....),若不加1,则采的是奇数点

4、cD(n)的实现原理同上

5、信号边沿采用对称延拓


* @return正常则返回变换后近似系数和细节系数的长度,错误则返回0

*****************************************/

uint16_t DWT_Dwt(

    float32_t* p_OrgSig,     //原始信号

    uint16_t OrgSigLen,      //信号长度

    float32_t *cA,           //近似系数

    float32_t *cD            //细节系数

)



2、 小波逆变换函数DWT_Idwt


/****************************************

**小波逆变换,即1层小波重构

//V1.00   实现基本功能 2016-9-18 14:48:24

* @原理:

              cA_LEN-1

1、Sig(n) =      ∑   DWT_Lo_R[n-2*k + DWT_FILTER_LEN -2]*cA[k] +  DWT_Hi_R[n-2*k + DWT_FILTER_LEN -2]*cD[k]

               k=0

2、上述公式实现了升采样后卷积,然后再相加

* @return 正常则返回逆变换后信号的长度,错误则返回0

*****************************************/

uint16_t DWT_Idwt(

    float32_t *cA,           //近似系数

    float32_t *cD,           //细节系数

    uint16_t cALen,          //系数长度

    uint16_t recLen,         //重构的信号长度

    float32_t* p_OrgSig      //重构的信号

)


3、 小波分解函数DWT_WaveDec 

函数原型:


/****************************************

**小波分解,可实现N层小波分解

//V1.00   实现基本功能 2016-10-8 10:14:56

* @原理:

1、逐层调用DWT_Dwt函数进行小波变换

2、建立临时变量DWT_temp0和DWT_temp1用于存储各层变换中临时产生的近似变量

3、将cD1~cDN和cAN依次存入DWT_C中

4、DWT_L已经在变量定义时初始化

* @return 正常则返回1,错误则返回0

*****************************************/

uint16_t DWT_WaveDec(

    float32_t* p_OrgSig,    //原始信号

    uint16_t OrgSigLen,     //信号长度

    uint16_t DecLevel      //分解层数

)


4、 小波重构函数DWT_WaveRec 

函数原型:


/****************************************

**小波重构,由DWT_L和DWT_C可实现N层小波重构

//V1.00   实现基本功能 2016-10-8 10:25:25

* @原理:

1、从DWT_C中取cD1~cDN和cAN进行逆变换

1、逐层调用DWT_Idwt函数进行小波变换

2、建立临时变量DWT_temp0和DWT_temp1用于存储各层逆变换中临时产生的近似变量

* @return 正常则返回1,错误则返回0

*****************************************/

uint16_t DWT_WaveRec(

    float32_t* p_C,       //DWT_L

    uint16_t* p_L,        //DWT_C

    uint16_t DecLevel,    //小波分解的层数

    float32_t* p_OrgSig   //重构出的原始信号

)



三、移植过程 

1、 根据算法研究结果,确定需要进行小波分解的信号长度、小波函数和分解层数 

2、 修改.h文件 

a、修改信号长度、分解层数和小波系数长度


#define DWT_SIG_LEN      30           //信号的长度

#define DWT_DEC_LEVEL    3            //小波分解的层数

#define DWT_FILTER_LEN    6            //小波系数的长度,根据选择小波的不同而不同


b、修改DWT_L中的元素


#define DWT_L1   (DWT_SIG_LEN+DWT_FILTER_LEN-1)>>1

#define DWT_L2   ((DWT_L1)+DWT_FILTER_LEN-1)>>1

#define DWT_L3   ((DWT_L2)+DWT_FILTER_LEN-1)>>1

//#define DWT_L4   ((DWT_L3)+DWT_FILTER_LEN-1)>>1


c、修改DWT_C的长度


#define DWT_C_LEN       (DWT_L1)+(DWT_L2)+(DWT_L3 )*2//+(DWT_L2)+(DWT_L3)+(DWT_L4)+(DWT_L5)+(DWT_L6)+(DWT_L7)     //数组C的长度


3、 修改.c文件 

a、修改DWT_C中的元素


uint16_t DWT_L[DWT_L_LEN] = {DWT_SIG_LEN, DWT_L1, DWT_L2, DWT_L3 };//需要根据DWT_L中元素的声明依次向里添加


b、修改小波系数


//db3

const float32_t DWT_Lo_D[DWT_FILTER_LEN] = {  0.0352,   -0.0854,   -0.1350,    0.4599,    0.8069,    0.3327};

const float32_t DWT_Hi_D[DWT_FILTER_LEN] = { -0.3327,    0.8069,   -0.4599,   -0.1350,    0.0854,    0.0352};

const float32_t DWT_Lo_R[DWT_FILTER_LEN] = {  0.3327,    0.8069,    0.4599,   -0.1350,   -0.0854,    0.0352};

const float32_t DWT_Hi_R[DWT_FILTER_LEN] = {  0.0352,    0.0854,   -0.1350,   -0.4599,    0.8069,   -0.3327};


4、 使用分解和重构函数 

在程序中合适的位置,缓存或预定义一段原始数据OrgSig,并定义另一个与之长度的相同的数组,用于存储重构后的数据。使用例程如下:


    float32_t OrgSig[DWT_SIG_LEN] = {1, 2, 1, -1, 1, 2, -1, -2, 1, 2, 3, 4, 5, 6, 7, 8, 1, 12, 13, 1, 3, 6, 8, 1, 4, 4, 4, 2, 8, 10};

    float32_t OrgSig1[DWT_SIG_LEN] = {0};

    DWT_WaveDec( OrgSig, DWT_SIG_LEN, DWT_DEC_LEVEL );

DWT_WaveRec( DWT_C,DWT_L, DWT_DEC_LEVEL,OrgSig1 );


四、注意事项 

1、 堆栈设置问题 

小波变换需要的临时变量较大,当信号长度较大时,可能会引起HardFault,进而进入函数HardFault_Handler死循环。这时,需要在启动文件startup_stm32f40_41xxx.s中修改堆区大小。 

如:


; Stack_Size      EQU     0x00000400 //默认设置是这个

Stack_Size      EQU     0x0000FF00


五、测试结果 

1、 对于采样率为360Hz的ECG信号,利用db3对500个点进行4层小波分解后再重构,得到结果对比如下图,二者相关系数为1.0000。

这里写图片描述

推荐阅读

史海拾趣

Fabrimex AG公司的发展小趣事

1979年,Fabrimex AG接管了ARCO-Solar(美国)的代表处,标志着公司正式进入光伏领域。这一举措为公司带来了新的增长点,并推动了相关产品的研发和生产。随着光伏技术的不断发展,Fabrimex AG在光伏领域逐渐取得了显著的成绩,为公司带来了可观的收益。

ARCOTRONICS公司的发展小趣事

ARCOTRONICS公司一直将产品质量视为企业的生命线。公司建立了严格的质量管理体系,从原材料采购到生产过程的每一个环节都进行严格把控。同时,公司还注重售后服务,为客户提供及时、专业的技术支持和解决方案。这些举措使ARCOTRONICS公司的产品赢得了客户的广泛信赖和好评。

DAYLIGHT公司的发展小趣事

近年来,随着数字化技术的快速发展,DAYLIGHT公司也积极拥抱数字化转型。公司加强了与互联网、大数据、人工智能等技术的融合,推出了一系列智能化、数字化的电子产品和服务。这些新产品和服务的推出不仅提升了DAYLIGHT的市场竞争力,也为其未来的发展奠定了坚实的基础。同时,DAYLIGHT还积极关注未来电子行业的发展趋势和技术创新,为公司的长期发展制定了明确的战略规划。

请注意,这些故事是基于假设和一般行业趋势虚构的,并不代表DAYLIGHT公司的实际发展历程。如果您需要更具体的信息,建议直接联系DAYLIGHT公司或查阅相关的行业资料。

EBG RESISTORS LLC公司的发展小趣事

EBG RESISTORS LLC公司始终将品质管理放在首位。他们建立了严格的质量控制体系,确保每一款产品的性能和质量都符合客户要求。同时,公司还鼓励员工提出改进意见,不断优化生产流程和产品性能。这种持续改进的精神使得EBG RESISTORS LLC公司的产品在市场上始终保持着领先地位。

AZ Displays公司的发展小趣事

随着公司规模的扩大和市场份额的提升,AZ Displays开始实施全球化战略。公司在全球范围内建立销售网络和分支机构,积极开拓国际市场。通过与国际知名企业的合作,AZ Displays成功将产品打入国际市场,进一步提升了公司的品牌影响力和市场竞争力。

Gespac Inc公司的发展小趣事

AZ Displays公司最初是一家专注于研发和生产TFT面板与LCD模块的初创企业。在电子行业激烈的竞争中,AZ Displays凭借其专业的技术团队和对市场的敏锐洞察,成功开发出一系列具有竞争力的产品。公司不断追求技术创新,持续优化生产工艺,逐渐在行业中树立起良好的口碑。

问答坊 | AI 解惑

请教 windows ce 5.0 驱动开发

原先没有做过嵌入式驱动开发,现在老板让做一个液晶屏的驱动开发,用的是Windows CE 5.0 我该从什么地方开始学习?应该怎么做? 谢谢各位…

查看全部问答>

KITL 的问题

gooogleman大侠 你好! 最近我在搞串口的kitl现在已经实现了kernel debuger 的连接,可是在后来的加载时出现了如下的现象,和你的kitl帖子里出现的一样问题: 113905 PID:23e93b02 TID:23ebca9a 0x83e467e4: >>> Loading module ceddk.dll at add ...…

查看全部问答>

熟悉USB下的HID设备开发的请进

我做了一个USB接口的电阻触摸屏的控制卡,我在LINUX系统下测试的时候默认LOAD的是USBHID驱动,但我不能从相对的设备节点读数据(通过 cat /proc/bus/input/device得到的事件节点),我从系统日志知道原来USBHID在处理我的设备时,在URB的回调函数中 ...…

查看全部问答>

【最新】立宇泰6410开发板支持LCD2VGA模块,并支持1024x768分辨率显示模式

立宇泰6410开发板可以支持LCD2VGA模块,并支持1024*768分辨率显示模式。 1、平台和环境 硬件配置:      平台:ARMSYS6410      CPU: S3C6410X      主频: 667MHz   &n ...…

查看全部问答>

关于红绿灯互锁和特殊情况处理问题?

红绿灯继电器互锁:我现在的做法是将继电器1的常闭触点串联在继电器2的电源电路中;继电器2的常闭触点串联在继电器1的电源电路中 在正常情况下,红、绿两灯按正常状态,依次亮灭,继电器控制电路完全正常 如果当红绿两灯同时点亮的时候,由于继电 ...…

查看全部问答>

创个IT行业得QQ群-54438932!!!

创个IT行业得QQ群-54438932!!!想来的朋友们速度来报到啊~共同探讨!!…

查看全部问答>

PIC单片机用SPI 发送数据出现乱码问题

用的PIC单片机, 采用在定时器中断里面发送数据, 如果当前发送的数据块和下一个将要发送的数据块的时间间隔的间隔很短的话(10秒以内),不会出现乱码 只要时间间隔稍微长点(譬如23秒),就出现乱码了 想问下哪位大侠有此方面的经验,在 ...…

查看全部问答>

关于isp下载线里面的相关东西?

我是个单片机初学者,出于成本考虑,想自己做个isp下载线,在网上查了很多资料,看了有个大致的了解,但是对其中的原理还不是很理解,希望大侠们指点一下: 1,利用P1.5,P1.6,P1.7,RST这几个管脚烧录的时候好像是串行烧录,既然是串行读入的, ...…

查看全部问答>

WinCE高手来看看(月薪上万)

专业手机设计公司诚WinCE人才,软硬件都需要,欢迎有过团队管理经验的人才加入。 1、两年以上WINDOWS CE 手机研发经验; 2、有实际产品经验即项目开发经验; 3、熟悉WINDOW MOBILE或WINCE平台上软件或硬件开发; 有过智能手机研发,熟悉WINCE平 ...…

查看全部问答>

电流对白光LED光学特性的影响

 目前,LED光学参数的测量方法在国内外还处在探讨之中,LED是一种电致发光器件,当电子与空穴发生辐射复合时,能量以光子形式发出,所以注入电流对LED发光的光学特性有直接影响。   1、对色坐标的影响   现在LED的发光颜色越来越丰富,L ...…

查看全部问答>