时间序列信号处理(三)——局部均值分解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()

 

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

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

  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 26
    评论
LMD(Local Mean Decomposition,局部均值分解)是一种信号分解方法,用于将信号分解为多个局部均值局部振幅成分。下面是一个基本的LMD自适应分解Python代码示例: ```python import numpy as np import matplotlib.pyplot as plt def lmd_decomposition(signal, num_iterations=10, stopping_criteria=0.01): components = [] residue = signal.copy() for iteration in range(num_iterations): local_mean = np.mean(residue) detail = residue - local_mean components.append(local_mean) if np.max(np.abs(detail)) < stopping_criteria: break residue = detail.copy() components.append(residue) return components # 示例使用 # 生成一个示例信号 t = np.arange(0, 1, 0.01) signal = np.sin(2 * np.pi * 5 * t) + np.sin(2 * np.pi * 10 * t) + np.sin(2 * np.pi * 15 * t) # 进行LMD分解 components = lmd_decomposition(signal) # 绘制分解结果 plt.figure(figsize=(10, 6)) plt.subplot(len(components), 1, 1) plt.plot(signal) plt.title("Original Signal") for i in range(len(components)): plt.subplot(len(components), 1, i+2) plt.plot(components[i]) plt.title("Component {}".format(i+1)) plt.tight_layout() plt.show() ``` 这段代码中的`lmd_decomposition`函数接受一个信号作为输入,并使用LMD算法将信号分解为多个局部均值成分和一个残差成分。在每个迭代步骤中,计算信号的局部均值,并将其与原始信号相减得到细节成分。重复这个过程直到细节成分的振幅低于指定的停止条件。最后,返回所有的局部均值成分和残差成分。 在示例中,我们生成一个包含个正弦波的示例信号,并使用LMD分解将其分解局部均值成分和一个残差成分。然后,我们绘制原始信号和分解后的各个成分。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

似水不惧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值