手搓C++离散小波变换DWT程序

描述

关于小波变换,我们当然可以选择速度更快地方式来使用它。和python相比,C++编译后的代码在对同一组参数配置并且处理同一组数据,在没有优化的情况下,处理速度可以快达10倍上,均不包括把结果写入csv文件步骤的时间。下图中的19.9s是指被处理的数据时长。

python

C++离散小波变换对模拟信号的分解和重建,以及与原信号的比较

重建信号和原信号完全一致.

python

功能:该程序支持以下小波变换

'db2',   'db4', 'db8', 'db10', 'db12', 'db14', 'db16', 'db18', 'db20',
'sym2',   'sym4', 'sym6', 'sym8', 'sym10', 'sym12', 'sym14', 'sym16', 'sym18', 'sym20',
'coif1',   'coif2', 'coif3', 'coif4', 'coif5',
'bior1.1',   'bior1.3', 'bior1.5',
'bior2.2',   'bior2.4', 'bior2.6', 'bior2.8',
'bior3.1',   'bior3.3', 'bior3.5', 'bior3.7', 'bior3.9',
'bior4.4',   'bior5.5', 'bior6.8',
'rbio1.1',   'rbio1.3', 'rbio1.5',
'rbio2.2',   'rbio2.4', 'rbio2.6', 'rbio2.8',
'rbio3.1',   'rbio3.3', 'rbio3.5', 'rbio3.7', 'rbio3.9',
'rbio4.4',   'rbio5.5', 'rbio6.8',
'haar', 'db1',

之前基于Pywt实现的心率检测plt输出:

python

基于C++版本的DWT小波变换检测心率的excel处理结果:

python

C++的DWT和Python的三种小波变换检测心率检测比较

结果是一致的,只是在保存时有效位数选择不同。

C++ Python
DWT(bpm) CWT(bpm) SWT(bpm) DWT(bpm)
92.7039 92.7 92.7 92.7
92.1109 92.1 92.1 92.1
91.7847 91.8 91.8 91.8
93.6416 93.6 93.6 93.6
93.6416 93.6 93.6 93.6
94.0493 94 94 94
91.0112 91 91 91
90.8836 90.9 90.9 90.9
89.8752 89.9 89.9 89.9
90.2507 90.3 90.3 90.3
89.3793 89.4 89.4 89.4
89.1334 89.1 89.1 89.1
87.924 87.9 87.9 87.9
87.0968 87.1 87.1 87.1
86.4 86.4 86.4 86.4
86.285 86.3 86.3 86.3
86.747 86.7 86.7 86.7
87.3315 87.3 87.3 87.3
86.8633 86.9 86.9 86.9
86.285 86.3 86.3 86.3

耐心的你看到这里了,是不是以为碰到广告了?非也。 小编觉得不能每次都毫不顾忌各位的看法就发代码。是否需要在某个时候发布这个C++的DWT源码,还是看各位看官的想法。小编打算在集齐300个要求公布的需求后再正式发布,没有设置投票截止时间。什么时候够数,什么时候发布源码。

 

std::string wavelet_name = "db4";
WaveletDecomposer myWavelet(wavelet_name);
auto mres = myWavelet.multilevel_dwt(x, levels);
std::vector x_rec_custom = myWavelet.multilevel_idwt(mres.last_approx, mres.details, mres.lengths);

源码的功能可能还不够完善,但是已经可以根据选择的小波名称对信号数据进行正常的分解和重建了,所以小编还用它来测试验证了一下心率的检测(参考上面图表及说明)。

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分