用vc++ mfc实现一维小波硬阈值函数或软阈值函数去噪
发布网友
发布时间:2022-07-30 08:32
我来回答
共1个回答
热心网友
时间:2024-11-13 11:00
一般情况下,这个阈值函数的选取与噪声的方差是紧密相关的。
通常情况下,现在论文中的噪声都是选用高斯白噪声。
被噪声污染的信号=干净的信号+噪声,
由于信号在空间上(或者时间域)是有一定连续性的,因此在小波域,有效信号所产生的小波系数其模值往往较大;而高斯白噪声在空间上(或者时间域)是没有连续性的,因此噪声经过小波变换,在小波阈仍然表现为很强的随机性,通常仍认为是高斯白噪的。
那么就得到这样一个结论:在小波域,有效信号对应的系数很大,而噪声对应的系数很小。
刚刚已经说了,噪声在小波域对应的系数仍满足高斯白噪分布。如果在小波域,噪声的小波系数对应的方差为sigma,那么根据高斯分布的特性,绝大部分(99.99%)噪声系数都位于[-3*sigma,3*sigma]区间内。因此,只要将区间[-3*sigma,3*sigma]内的系数置零(这就是常用的硬阈值函数的作用),就能最大程度抑制噪声的,同时只是稍微损伤有效信号。将经过阈值处理后的小波系数重构,就可以得到去噪后的信号。
常用的软阈值函数,是为了解决硬阈值函数“一刀切”导致的影响(模小于3*sigma的小波系数全部切除,大于3*sigma全部保留,势必会在小波域产生突变,导致去噪后结果产生局部的抖动,类似于傅立叶变换中频域的阶跃会在时域产生拖尾)。软阈值函数将模小于3*sigma的小波系数全部置零,而将模大于3*sigma的做一个比较特殊的处理,大于3*sigma的小波系数统一减去3*sigma,小于-3*sigma的小波系数统一加3*sigma。经过软阈值函数的作用,小波系数在小波域就比较光滑了,因此用软阈值去噪得到的图象看起来很平滑,类似于冬天通过窗户看外面一样,像有层雾罩在图像上似的。
比较硬阈值函数去噪和软阈值函数去噪:硬阈值函数去噪所得到的峰值信噪比(PSNR)较高,但是有局部抖动的现象;软阈值函数去噪所得到的PSNR不如硬阈值函数去噪,但是结果看起来很平滑,原因就是软阈值函数对小波系数进行了较大的 “社会主义改造”,小波系数改变很大。因此各种各样的阈值函数就出现了,其目的我认为就是要使大的系数保留,小的系数被剔出,而且在小波域系数过渡要平滑。
还有的什么基于隐马尔科夫模型去噪,高斯混合尺度去噪(英文缩写好像是GSR,不好意思,记不大清楚了)和自适应阈值去噪等,也就是利用有效信号的小波系数和噪声的小波系数在小波域的分布特征不同等特征来进行有效信号的小波系数和噪声的小波系数在小波域的分离,然后重构得到去噪后的信号。
说了这么多,忘了关键的一点,如何估计小波域噪声方差sigma的估计,这个很简单:把信号做小波变换,在每一个子带利用robust estimator估计就可以(可能高频带和低频带的方差不同)。
robust estimator就是将子带内的小波系数模按大小排列,然后取最中间那个,然后把最中间这个除以0.6745就得到噪声在某个子带内的方差sigma。利用这个sigma,然后选种阈值函数,就可以去去噪了~~
追问我想要的是用vc++编写的程序,实现以下功能:给出一个含噪序列(例如matlab 里的noisbloc noisdopp等),用vc++ 做一个界面,直接点击界面上的不同按钮,能显示含噪序列图和采用硬、软阈值去噪后的效果图。