matlab中,对矩阵每一行做ilwt变换,位置 1 处的索引超出数组边界(不能超出 1)是什么问题?

与基于MALLAT算法的小波变换不同,提升小波变换不产生数组L,只产生C数组。定义如下:

但是,信号长度必须是2的整数次幂。

由于算法可实现原位计算,因此,每层变换后,系数仍存在原始信号的数组中,格式为:[CD,CA]。下一层再变换时,将CA作为原始信号即可,直到分解结束。

每层变换的步骤:分裂->提升(多层预测/更新)->合并

各层提升的系数由MATLAB中的liftwave函数计算得到。基于MATLAB中此系数的性质,在此算法中,无论预测还是更新,都采用同一个函数;无论变换还是逆变换都采用加法运算。但是,逆变换中滤波器的符号取反。

与Mallat算法相比,不需要过多临时变量,不需要过多大的临时数组。需要的程序堆栈比较少。

**将数据进行提升格式更新/预测

* @功能:分裂后,data的前半部分为奇数序号的点(1,3,5...),后半部分为偶数序号的点(0,2,4...)

* @功能:分裂函数的反函数,data的前半部分为奇数序号的点(1,3,5...),后半部分为偶数序号的点(0,2,4...),

此函数将数据按正常顺序排列

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

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

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

* @return 正常则返回重构后的信号长度,错误则返回0

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

* @return 正常则返回重构后的信号长度,错误则返回0

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

1、原位分解,分解后原始数据即变为C数组

**提升小波重构,可实现N层提升小波重构

1、原位分解,分解后C数组即变为原始数据

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

因为是原位运算,不需要根据信号长度和小波分解层数去预定义数组L和C,因此不需要define信号长度和小波分解层数,直接在信号缓存和小波分解时指定即可。

a、根据所选定小波的提升格式,修改提升次数和每次提升时滤波器的最大长度

a、修改提升格式中滤波器的系数

//以db4为例,在MATLAB中计算出db4的提升格式如下:

b、修改提升格式中各层滤波器系数的长度、滤波延迟,以及最终的归一化系数

4、 使用分解和重构函数

在程序中合适的位置,缓存或预定义一段原始数据OrgSig,分解后的系数即保存在OrgSig中,再将OrgSig作为重构系数,重构之后的信号仍然保存在OrgSig中。使用例程如下:

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

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

与基于MALLAT算法的小波变换不同,提升小波变换不产生数组L,只产生C数组。定义如下: 

但是,信号长度必须是2的整数次幂。 

由于算法可实现原位计算,因此,每层变换后,系数仍存在原始信号的数组中,格式为:[CD,CA]。下一层再变换时,将CA作为原始信号即可,直到分解结束。 

每层变换的步骤:分裂->提升(多层预测/更新)->合并 

各层提升的系数由MATLAB中的liftwave函数计算得到。基于MATLAB中此系数的性质,在此算法中,无论预测还是更新,都采用同一个函数;无论变换还是逆变换都采用加法运算。但是,逆变换中滤波器的符号取反。 

与Mallat算法相比,不需要过多临时变量,不需要过多大的临时数组。需要的程序堆栈比较少。 

**将数据进行提升格式更新/预测

* @功能:分裂后,data的前半部分为奇数序号的点(1,3,5...),后半部分为偶数序号的点(0,2,4...)

* @功能:分裂函数的反函数,data的前半部分为奇数序号的点(1,3,5...),后半部分为偶数序号的点(0,2,4...),

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

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

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

* @return 正常则返回重构后的信号长度,错误则返回0

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

* @return 正常则返回重构后的信号长度,错误则返回0

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

**提升小波重构,可实现N层提升小波重构

   1、原位分解,分解后C数组即变为原始数据

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

因为是原位运算,不需要根据信号长度和小波分解层数去预定义数组L和C,因此不需要define信号长度和小波分解层数,直接在信号缓存和小波分解时指定即可。 

a、根据所选定小波的提升格式,修改提升次数和每次提升时滤波器的最大长度

a、修改提升格式中滤波器的系数

//以db4为例,在MATLAB中计算出db4的提升格式如下:

b、修改提升格式中各层滤波器系数的长度、滤波延迟,以及最终的归一化系数

4、 使用分解和重构函数 

在程序中合适的位置,缓存或预定义一段原始数据OrgSig,分解后的系数即保存在OrgSig中,再将OrgSig作为重构系数,重构之后的信号仍然保存在OrgSig中。使用例程如下:

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

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


我要回帖

更多关于 matlab中索引超出矩阵维度怎样解决 的文章

 

随机推荐