1、介绍
局部均值分解(LMD)作为近年来出现的一种新的自适应时频分析方法,能够依据信号的自身特点将复杂的多分量调幅调频信号分解为有限个的单分量调幅调频信号之和,进而求取瞬时频率和瞬时幅值并进行组合,从而得到原始信号的完整时频特征。
2、LMD的实现步骤:
- 首先求出局部均值函数
:设信号为x(t),找出其每一个局部极值点
,求出所有的两个相邻局部极值点的均值,记为
;将所有的
在对应极值点时刻进行直线延申,采用滑动平均法对延伸直线进行平滑处理,得到局部均值函数 。
- 计算局部幅值
:
,和第一步一样,得到局部包络函数
。
- 从原始信号中分离出
,得到
。
- 利用
对
进行解调,得到调频函数
,判断
是不是纯调频函数(振幅恒为1),如果不是就重复上述步骤,直到
为纯调频函数;反之直接输出。
- 将所有局部包络函数相乘,得到包络信号
。
- 得到原始信号的第一个PF分量为包络信号和纯调频函数乘积。
- 用原始信号减去PF分量,再继续前面六步,直到不能再分解,得到多个PF分量和一个余量。
3.对比经验模态分解EMD优缺点:
优点:
- 拥有比EMD更少的迭代次数,一定程度上抑制了端点效应;
- 能更好的保留信号的完整性。
缺点:
- 依然存在端点效应;
- 平滑次数较多时,信号会发生提前或滞后现象、在平滑时步长不能最优确定等。
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()