mirror of
https://github.com/jackyzha0/quartz.git
synced 2025-12-28 07:14:05 -06:00
203 lines
5.4 KiB
Markdown
203 lines
5.4 KiB
Markdown
---
|
||
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 |