两步搞定经验模态分解与离散小波变换

参考文章:

原文链接:https://zhuanlan.zhihu.com/p/19763358

1 前言——傅里叶变换和短时傅里叶变换

  • 经验模态分析和离散小波变换都是针对于傅里叶变换和短时傅里叶变换的缺点提出来的!

1.1 频域

上图是时域,下图是频域。
在这里插入图片描述

  • 贯穿时域与频域的方法之一,就是傅里叶分析。
  • 傅里叶分许可以分为:傅里叶级数和傅里叶变换。

1.2 傅里叶级数的频谱

在这里插入图片描述
在这里插入图片描述

  • 不仅仅是矩形,其实任意波形都是可以用这种方式,用正弦波叠加起来的。

在这里插入图片描述

1.3 举个例子

所以很多在时域看似不可能做到的数学操作,在频域相反很容易。这就是需要傅里叶变换的地方。尤其是从某条曲线中去除一些特定的频率成分,这在工程上称为滤波,是信号处理最重要的概念之一,只有在频域才能轻松的做到。
在这里插入图片描述

1.4 傅里叶的缺点

(1)傅里叶分析不能刻画时间域上信号的局部特性
(2)傅里叶分析对突变和非平稳信号的效果不好,没有时频分析

1.5 短时傅里叶变换的缺点

  • 短时傅里叶变换又称,加窗傅里叶变换

缺点是,短时傅里叶的窗口大小难以定义。不能窗口太窄,否则窗内的信号太短,会导致频率分析不够精准,频率分辨率差。
不能窗口太宽,否则时域上不够精细,时间分辨率低。

2 正文

  • 傅里叶变换对时间不是很敏感
  • 短时傅里叶变换,使用了窗口,假定窗口内的是稳定信号;缺点:窗口的宽度是无法改变的
  • 小波变换:很好的应对时变的、非稳态的数字信号

在这里插入图片描述

2.1 小波和短时傅里叶

短时傅里叶最头疼的是窗口大小问题,如果能够让窗口的大小可以改变,那就非常奈斯了!

短时傅里叶(STFT)是给信号加窗,分段做傅里叶分析(FFT);
而小波变换,直接把傅里叶的基换了,将无限长的三角函数基换成了有限长的会衰减的小波基。
这样不仅能够获取频率,还可以定位到时间了!!

2.2 变换效果如图

  1. 公式上的变换
    在这里插入图片描述

  2. 图像上的变换,基函数的改变
    在这里插入图片描述

我大概就学到这里了,我就直接去看代码了。。。

3 代码

import numpy as np
import pandas as pd
import pywt
from skimage.restoration import denoise_wavelet  # 小波去噪的一个包
import matplotlib.pyplot as plt


# x 是序列数据,是numpy类型的

x = x.astype(float)/np.max(x) # 除以最大值是为了均值化
x = x[1000:1200]

sigma = 0.05
x_noisy = x + sigma * np.random.randn(x.size)

x_denoise = denoise_wavelet(x_noisy, method='BayesShrink', mode='soft', wavelet_levels=3, wavelet='sym8', rescale_sigma='True')

plt.figure(figsize=(20, 10), dpi=100)
plt.plot(x_noisy)
plt.plot(x_denoise)
plt.show()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码实现: 1. 二维经验分解: ```matlab function [im_enhanced] = EMD_2D(im) % 二维经验分解(EMD)图像增强 % 输入参数: im-原始图像 % 输出参数: im_enhanced-增强后的图像 % 将原始图像转换为灰度图像 if size(im,3)==3 im = rgb2gray(im); end % 构造高斯滤器 g = fspecial('gaussian',[5,5],1); % 对原始图像进行滤,减少噪声的影响 im = imfilter(im,g); % 预义IMFs的数量 nIMFs = 5; % 二维EMD分解 [IMFs,residual] = emd2(im,'maxmin',nIMFs); % 对每个IMF进行小变换 for i = 1:nIMFs % 小变换 [cA,cH,cV,cD] = dwt2(IMFs(:,:,i),'haar'); % 对每个分量进行直方图均衡化 cA = histeq(cA); cH = histeq(cH); cV = histeq(cV); cD = histeq(cD); % 将每个分量进行小变换 IMFs(:,:,i) = idwt2(cA,cH,cV,cD,'haar'); end % 将增强后的图像重构 im_enhanced = sum(IMFs,3) + residual; % 对图像进行归一化 im_enhanced = im_enhanced - min(im_enhanced(:)); im_enhanced = im_enhanced / max(im_enhanced(:)); % 显示原始图像和增强后的图像 figure; subplot(1,2,1);imshow(im);title('原始图像'); subplot(1,2,2);imshow(im_enhanced);title('增强后的图像'); end ``` 2. 小变换: ```matlab function [im_enhanced] = wavelet_enhance(im) % 小变换图像增强 % 输入参数: im-原始图像 % 输出参数: im_enhanced-增强后的图像 % 将原始图像转换为灰度图像 if size(im,3)==3 im = rgb2gray(im); end % 构造高斯滤器 g = fspecial('gaussian',[5,5],1); % 对原始图像进行滤,减少噪声的影响 im = imfilter(im,g); % 对原始图像进行小变换 [cA,cH,cV,cD] = dwt2(im,'haar'); % 对每个分量进行直方图均衡化 cA = histeq(cA); cH = histeq(cH); cV = histeq(cV); cD = histeq(cD); % 将每个分量进行小变换 im_enhanced = idwt2(cA,cH,cV,cD,'haar'); % 对图像进行归一化 im_enhanced = im_enhanced - min(im_enhanced(:)); im_enhanced = im_enhanced / max(im_enhanced(:)); % 显示原始图像和增强后的图像 figure; subplot(1,2,1);imshow(im);title('原始图像'); subplot(1,2,2);imshow(im_enhanced);title('增强后的图像'); end ``` 使用方法: ```matlab im = imread('lena.jpg'); % 调用二维经验分解进行图像增强 im_enhanced1 = EMD_2D(im); % 调用小变换进行图像增强 im_enhanced2 = wavelet_enhance(im); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值