Update Note
|
After Width: | Height: | Size: 52 KiB |
BIN
content/signal_processing/algorithm/EMD/attachments/Figure_1.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 39 KiB |
BIN
content/signal_processing/algorithm/EMD/attachments/Figure_2.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 95 KiB |
BIN
content/signal_processing/algorithm/EMD/attachments/Figure_3.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 190 KiB |
@ -7,7 +7,7 @@ tags:
|
|||||||
- signal
|
- signal
|
||||||
- algorithm
|
- algorithm
|
||||||
- math
|
- math
|
||||||
date: 2024-04-24
|
date: 2024-04-23
|
||||||
---
|
---
|
||||||
# Introduction
|
# Introduction
|
||||||
|
|
||||||
@ -104,7 +104,7 @@ $$
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
def EMD(signal, max_imf = 10, tolerance = 0.1):
|
def EMD(signal, max_imf = 10, tolerance = 0.01):
|
||||||
|
|
||||||
def __extrema(signal):
|
def __extrema(signal):
|
||||||
|
|
||||||
@ -131,12 +131,18 @@ def EMD(signal, max_imf = 10, tolerance = 0.1):
|
|||||||
|
|
||||||
def __IMF(signal):
|
def __IMF(signal):
|
||||||
|
|
||||||
imf = signal - __mean_env(signal)
|
resdiual = signal
|
||||||
resdiual = signal - imf
|
|
||||||
|
while True:
|
||||||
|
|
||||||
|
imf = signal - __mean_env(resdiual)
|
||||||
|
resdiual = signal - imf
|
||||||
|
|
||||||
|
if np.mean(imf) < tolerance:
|
||||||
|
break
|
||||||
|
|
||||||
return imf, resdiual
|
return imf, resdiual
|
||||||
|
|
||||||
|
|
||||||
# standardize the signal
|
# standardize the signal
|
||||||
mean = np.mean(signal)
|
mean = np.mean(signal)
|
||||||
std = np.std(signal)
|
std = np.std(signal)
|
||||||
@ -151,6 +157,11 @@ def EMD(signal, max_imf = 10, tolerance = 0.1):
|
|||||||
|
|
||||||
imfs.append(imf)
|
imfs.append(imf)
|
||||||
|
|
||||||
|
max_peaks, min_peaks = __extrema(residual)
|
||||||
|
|
||||||
|
if len(max_peaks) < 2 or len(min_peaks) < 2:
|
||||||
|
break
|
||||||
|
|
||||||
if np.abs(np.std(residual)) < tolerance or max_imf == 0:
|
if np.abs(np.std(residual)) < tolerance or max_imf == 0:
|
||||||
break
|
break
|
||||||
|
|
||||||
@ -161,7 +172,6 @@ def EMD(signal, max_imf = 10, tolerance = 0.1):
|
|||||||
residual = residual * std + mean
|
residual = residual * std + mean
|
||||||
|
|
||||||
return imfs, residual
|
return imfs, residual
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
# Reference
|
# Reference
|
||||||
|
|||||||
203
content/signal_processing/algorithm/EMD/eemd.md
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
---
|
||||||
|
title: Ensemble Empirical Mode Decomposition, EEMD
|
||||||
|
tags:
|
||||||
|
- advanced
|
||||||
|
- EMD
|
||||||
|
- HTT
|
||||||
|
- signal-processing
|
||||||
|
- signal
|
||||||
|
date: 2024-04-23
|
||||||
|
---
|
||||||
|
|
||||||
|
# Intro
|
||||||
|
|
||||||
|
集合经验模态分解(Ensemble Empirical Mode Decomposition, EEMD)是一种改进的[EMD](signal_processing/algorithm/EMD/basic.md)方法,它通过引入白噪声来解决EMD中的**模态混叠问题**。
|
||||||
|
|
||||||
|
|
||||||
|
模态混叠是指在分解过程中,不同时间尺度的信号成分错误地混合在一起,导致分解结果不准确。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
上述figure就是一个很好的例子,连续低频正弦信号上叠加了间歇性高频震动的调制信号,因为间歇性高频震动的调制信号干扰了Maximum点的选择,使得局部极值在很短的时间间隔发生多次跳变,进而使得我们的IMF并不准确,不同时间尺度的信号成分错误地混合在一起。
|
||||||
|
|
||||||
|
以下我们也通过我们写的EMD做了示范:
|
||||||
|
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
很明显,在IMF1,发生了混叠
|
||||||
|
|
||||||
|
# Step by Step
|
||||||
|
|
||||||
|
为了解决这种模态混叠的现象,EEMD方法应运而生。其步骤为,
|
||||||
|
|
||||||
|
* 设定总体平均次数$M$
|
||||||
|
* 将一个具有标准正态分布的白噪声$n_i(t)$加到原始信号$x(t)$上,产生一个新的信号,$x_i(t) = x(t) + n_i(t)$
|
||||||
|
* 对$x_i(t)$进行EMD
|
||||||
|
$$
|
||||||
|
x_i(t) = \sum_{j=1}^{J}c_{i,j}(t) + r_{i,j}(t)
|
||||||
|
$$
|
||||||
|
* 重复上述两步骤吗,得到IMF集合
|
||||||
|
$$
|
||||||
|
c_{1,j}(t), c_{2,j}(t), \cdots,c_{M,j}(t), j=1,2,\cdots,J
|
||||||
|
$$
|
||||||
|
* 对上述的IMF集合进行集合平局,得到最终的IMF,即:
|
||||||
|
$$
|
||||||
|
c_j(t) = \frac{1}{M}\sum_{i=1}^{M}c_{i,j}(t)
|
||||||
|
$$
|
||||||
|
|
||||||
|
## Algorithm Detail
|
||||||
|
|
||||||
|
* 添加噪声对于我们的信号有什么影响
|
||||||
|
* 每次添加的信号有什么要求,加多大的噪声;(提出EEMD的Wu文章中说,标准差为0.1的噪声)
|
||||||
|
|
||||||
|
|
||||||
|
# Demo Code
|
||||||
|
|
||||||
|
```python
|
||||||
|
def EEMD(signal, max_imf = 10, tolerance = 0.01, iterations = 10):
|
||||||
|
|
||||||
|
|
||||||
|
def __extrema(signal):
|
||||||
|
|
||||||
|
max_peaks = []
|
||||||
|
min_peaks = []
|
||||||
|
|
||||||
|
for i in range(1, len(signal) - 1):
|
||||||
|
if signal[i] > signal[i-1] and signal[i] > signal[i+1]:
|
||||||
|
max_peaks.append(i)
|
||||||
|
if signal[i] < signal[i-1] and signal[i] < signal[i+1]:
|
||||||
|
min_peaks.append(i)
|
||||||
|
|
||||||
|
return max_peaks, min_peaks
|
||||||
|
|
||||||
|
|
||||||
|
def __mean_env(signal):
|
||||||
|
|
||||||
|
max_peaks, min_peaks = __extrema(signal)
|
||||||
|
|
||||||
|
max_env = np.interp(range(len(signal)), max_peaks, [signal[i] for i in max_peaks])
|
||||||
|
min_env = np.interp(range(len(signal)), min_peaks, [signal[i] for i in min_peaks])
|
||||||
|
|
||||||
|
return (max_env + min_env) / 2
|
||||||
|
|
||||||
|
def __IMF(signal):
|
||||||
|
|
||||||
|
resdiual = signal
|
||||||
|
|
||||||
|
while True:
|
||||||
|
|
||||||
|
imf = signal - __mean_env(resdiual)
|
||||||
|
resdiual = signal - imf
|
||||||
|
|
||||||
|
if np.mean(imf) < tolerance:
|
||||||
|
break
|
||||||
|
|
||||||
|
return imf, resdiual
|
||||||
|
|
||||||
|
|
||||||
|
mean = np.mean(signal)
|
||||||
|
std = np.std(signal)
|
||||||
|
|
||||||
|
signal = (signal - mean) / std
|
||||||
|
|
||||||
|
imfss = []
|
||||||
|
signals = []
|
||||||
|
min_imf = max_imf
|
||||||
|
tmp_imf = max_imf
|
||||||
|
|
||||||
|
for index in range(iterations):
|
||||||
|
|
||||||
|
imfs = []
|
||||||
|
|
||||||
|
noise = np.random.randn(len(signal))
|
||||||
|
noise = noise * 0.1
|
||||||
|
|
||||||
|
new_signal = signal + noise
|
||||||
|
signals.append(new_signal)
|
||||||
|
|
||||||
|
tmp_imf = max_imf
|
||||||
|
|
||||||
|
while True:
|
||||||
|
|
||||||
|
imf, residual = __IMF(new_signal)
|
||||||
|
|
||||||
|
imfs.append(imf)
|
||||||
|
|
||||||
|
max_peaks, min_peaks = __extrema(residual)
|
||||||
|
|
||||||
|
if len(max_peaks) < 2 or len(min_peaks) < 2:
|
||||||
|
|
||||||
|
tmp_min = len(imfs)
|
||||||
|
if tmp_min < min_imf:
|
||||||
|
min_imf = tmp_min
|
||||||
|
|
||||||
|
break
|
||||||
|
|
||||||
|
if np.abs(np.std(residual)) < tolerance or tmp_imf == 0:
|
||||||
|
|
||||||
|
tmp_min = len(imfs)
|
||||||
|
if tmp_min < min_imf:
|
||||||
|
min_imf = tmp_min
|
||||||
|
|
||||||
|
break
|
||||||
|
|
||||||
|
new_signal = residual
|
||||||
|
tmp_imf -= 1
|
||||||
|
|
||||||
|
imfss.append(imfs)
|
||||||
|
|
||||||
|
imf_ans = []
|
||||||
|
|
||||||
|
for i in range(min_imf):
|
||||||
|
|
||||||
|
imf = 0
|
||||||
|
|
||||||
|
for j in range(iterations):
|
||||||
|
imf += imfss[j][i]
|
||||||
|
|
||||||
|
imf = imf / iterations
|
||||||
|
imf_ans.append(imf)
|
||||||
|
|
||||||
|
signal_ans = 0
|
||||||
|
|
||||||
|
for signal in signals:
|
||||||
|
signal_ans += signal
|
||||||
|
|
||||||
|
signal_ans = signal_ans / iterations
|
||||||
|
|
||||||
|
residual_ans = signal_ans
|
||||||
|
|
||||||
|
for imf in imf_ans:
|
||||||
|
|
||||||
|
residual_ans = residual_ans - imf
|
||||||
|
|
||||||
|
imf_ans = [imf * std + mean for imf in imf_ans]
|
||||||
|
residual_ans = residual_ans * std + mean
|
||||||
|
signal_ans = signal_ans * std + mean
|
||||||
|
|
||||||
|
return imf_ans, residual_ans, signal_ans
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Results
|
||||||
|
|
||||||
|
通过EEMD,结果如下:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
EEMD的前几个IMF将高频噪声和白噪声过滤,在IMF7显示了信号原有的模态
|
||||||
|
# Reference
|
||||||
|
|
||||||
|
* https://zhuanlan.zhihu.com/p/205345681
|
||||||
|
* https://blog.csdn.net/weixin_45317919/article/details/109850346
|
||||||
@ -53,6 +53,7 @@ date: 2024-03-18
|
|||||||
## Empirical Mode Decomposition
|
## Empirical Mode Decomposition
|
||||||
|
|
||||||
* [EMD Basic](signal_processing/algorithm/EMD/basic.md)
|
* [EMD Basic](signal_processing/algorithm/EMD/basic.md)
|
||||||
|
* [EEMD](signal_processing/algorithm/EMD/eemd.md)
|
||||||
|
|
||||||
# Software
|
# Software
|
||||||
|
|
||||||
|
|||||||