时间序列信号处理(三)——局部均值分解LMD的python实现

1、介绍

局部均值分解(LMD)作为近年来出现的一种新的自适应时频分析方法,能够依据信号的自身特点将复杂的多分量调幅调频信号分解为有限个的单分量调幅调频信号之和,进而求取瞬时频率和瞬时幅值并进行组合,从而得到原始信号的完整时频特征。

2、LMD的实现步骤:

  1. 首先求出局部均值函数m_{11}\left ( t \right ):设信号为x(t),找出其每一个局部极值点n_{i},求出所有的两个相邻局部极值点的均值,记为m_{i};将所有的m_{i}在对应极值点时刻进行直线延申,采用滑动平均法对延伸直线进行平滑处理,得到局部均值函数 。
  2. 计算局部幅值a_{i}a_{i}=\frac{\left | n_{i} -n_{i+1}\right |}{2},和第一步一样,得到局部包络函数a_{11}\left ( t \right )
  3. 从原始信号中分离出m_{11}\left ( t \right ),得到h_{11}\left ( t \right )
  4. 利用a_{11}\left ( t \right )h_{11}\left ( t \right )进行解调,得到调频函数s_{11}\left ( t \right ),判断s_{11}\left ( t \right )是不是纯调频函数(振幅恒为1),如果不是就重复上述步骤,直到s_{1n}\left ( t \right )为纯调频函数;反之直接输出。
  5. 将所有局部包络函数相乘,得到包络信号a_{1}\left ( t \right )
  6. 得到原始信号的第一个PF分量为包络信号和纯调频函数乘积。
  7. 用原始信号减去PF分量,再继续前面六步,直到不能再分解,得到多个PF分量和一个余量。 

 3.对比经验模态分解EMD优缺点:

优点:

  1. 拥有比EMD更少的迭代次数,一定程度上抑制了端点效应;
  2. 能更好的保留信号的完整性。

 缺点:

  1. 依然存在端点效应;
  2. 平滑次数较多时,信号会发生提前或滞后现象、在平滑时步长不能最优确定等。

 4.python实现

import numpy as np
import matplotlib.pyplot as plt
from PyLMD import LMD

data1 = np.loadtxt('E:/12k1/0HP/outer18.txt')
data = data1[2048*2:2048*3]
print(data)
index = list(range(len(data)))
N = len(data)
print(N)

Fs = 12000
Ts = 1.0/Fs
t = np.arange(2048)
k = np.arange(N)
T = N/Fs
frq = k/T
frq1 = frq[range(int(N/2))]


lmd = LMD()
PFs, res = lmd.lmd(data)
nPFs = PFs.shape[0]
print(nPFs)


plt.figure(figsize=(10, 8))
for i in range(0, 6):
    plt.subplot(8, 1, 1)
    plt.plot(data, 'blue')
    plt.title('outer')
    plt.subplot(8, 1, i + 2)
    plt.title('PF%d' % i)
    plt.plot(PFs[i - 1])

# plt.subplot(7, 1, 6)
# plt.title('residue')
# plt.plot(res)
# plt.subplots_adjust(hspace=0.5)
plt.tight_layout()
plt.show()

plt.figure(figsize=(10, 8))
for i in range(0, 6):
    plt.subplot(7, 1, 1)
    data_f = abs(np.fft.fft(data)) / N
    data_f1 = data_f[range(int(N/2))]
    plt.title('outer')
    plt.plot(frq1, data_f1, 'red')
    plt.subplot(7, 1, i + 2)
    data_f2 = abs(np.fft.fft(PFs[i])) / N
    data_f3 = data_f2[range(int(N / 2))]
    plt.title('PF%d' % i)
    plt.plot(frq1, data_f3, 'red')
# plt.subplot(6, 1, 5)
# plt.title('residue')
# res1 = abs(np.fft.fft(res)) / N
# res2 = res1[range(int(N / 2))]
# plt.plot(frq1, res2)
# plt.subplots_adjust(hspace=0.5)
plt.tight_layout()
plt.show()

 时间序列信号处理(三)——局部均值分解LMD的python实现_第1张图片

时间序列信号处理(三)——局部均值分解LMD的python实现_第2张图片

 经过上述学习发现,均值模态分解虽然优于经验模态分解,但其存在问题也很难解决,个人觉得经验模态分解实用性更高,特别是其改进后的EEMD。

最后希望大家多多支持,有用的话点赞关注哦!

你可能感兴趣的:(信号特征提取,信号特征,均值算法,算法,python)