变分模态分解(VMD)学习

news2024/10/7 18:30:51

目录

  • 概述
  • 构造变分问题
  • 变分求解问题(引入拉格朗日)
  • 关于变分构造中的函数理解
    • 关于Uk(t)
    • 关于希尔伯特变换
    • 关于频谱调制
  • VMD算法(python)

概述

变分模态分解由Konstantin Dragomiretskiy于2014年提出,可以很好抑制EMD方法的模态混叠现象(通过控制带宽来避免混叠现象)。

与EMD原理不同,VMD分解方式是利用迭代搜索变分模型最优解来确定每个分解的分量中心频率及带宽,属于完全非递归模型,该模型寻找模态分量的集合及其各自的中心频率,而每个模态在解调成基带之后是平滑的。

Konstantin Dragomiretskiy通过实验结果证明:对于采样和噪声方面,该方法更具有鲁棒性。

模态变分分解是一种自适应、完全非递归的模态变分和信号处理的方法。该技术具有可以确定模态分解个数的优点,其自适应性表现在根据实际情况确定所给序列的模态分解个数.

随后的搜索和求解过程中可以自适应地匹配每种模态的最佳中心频率和有限带宽,并且可以实现固有模态分量(IMF)的有效分离、信号的频域划分、进而得到给定信号的有效分解成分,最终获得变分问题的最优解。

它克服了EMD方法存在端点效应和模态分量混叠的问题,并且具有更坚实的数学理论基础,可以降低复杂度高和非线性强的时间序列非平稳性,分解获得包含多个不同频率尺度且相对平稳的子序列,适用于非平稳性的序列,VMD的核心思想是构建和求解变分问题。

构造变分问题

假设原始信号f被分解为k个分量,保证分解序列为具有中心频率的有限带宽的模态分量,同时各模态的估计带宽之和最小,约束条件为所有模态之和与原始信号 相等,则VMD约束变分模型如下:
在这里插入图片描述
其中,在这里插入图片描述
为各模态函数,在这里插入图片描述
为各模态中心频率。

变分求解问题(引入拉格朗日)

解决上述的约束最优化问题,将约束变分问题转变为非约束变分问题,利用二次惩罚项和拉格朗日乘子法的优势,引入了增广拉格朗日(Lagrangian)函数,如式所示:
在这里插入图片描述
其中, α \alpha α是罚参数, λ \lambda λ是Lagrangian乘子。

对于所有 ω \omega ω>=0,更新泛函
在这里插入图片描述
更新泛函 ω \omega ωk:
在这里插入图片描述
所有 ω \omega ω>=0,进行双重提升:
在这里插入图片描述
γ \gamma γ表示噪声,当信号含有强噪声时,可以设定 γ \gamma γ=0达到更好的去噪效果。
不断重复更新泛函,知道满足下面的迭代约束条件:
在这里插入图片描述
对于所有的 ω \omega ω>=0 —>解析信号的单边谱只包含非负频率。

以上过程的程序框图如下:
在这里插入图片描述
文字解释:

1、初始化uk、ωk、λ和n=0,k=0

2、n=n+1(迭代次数)

3、k=k+1,根据VMD算法公式更新uk、ωk

4、又根据相关的算法更新拉格朗日乘数λ

5、知直到满足一定条件,停止迭代,不然转到2步骤

以上便是求解每一个模态的单步骤

关于变分构造中的函数理解

变分构造函数如下:
在这里插入图片描述

关于Uk(t)

有如下定义:
在这里插入图片描述

在这里插入图片描述

关于希尔伯特变换

在这里插入图片描述
希尔伯特变换:
在这里插入图片描述
上面的Hilbert变换的表达式实际上就是将原始信号和一个信号做卷积的结果。因此,Hilbert变换可以看成是将原始信号通过一个滤波器,或者一个系统,这个系统的冲击响应为h(t)。

希尔伯特变换的意义:
信号通过Hilbert变换后,正频率部分乘以-j,也就是说,保持幅度不变的条件下,将相位移动了-π/2,而对于负频率成分,移动了π/2,因此Hilbert变换又称为90°相移滤波器或者垂直滤波器。

希尔伯特变换下的解析信号意义:首先,将实数信号变换成解析信号的结果就是,把一个一维的信号变成了二维复平面上的信号,复数的模和幅角代表了信号的幅度和相位,如图所示:
在这里插入图片描述

关于频谱调制

在这里插入图片描述
此处采用了在这里插入图片描述
来调节每个模态的频谱,使之调制到相应的基频带。

调制定理:
调制信号在时域成以一个等幅高频振荡,相当于在频域把调制信号的各频率分量均搬至高频振荡的频率上,调制信号的各频率分量幅度减半。
所用到的基本式子如下:
在这里插入图片描述

VMD算法(python)

代码程序:

import numpy as np
import matplotlib.pyplot as plt
from vmdpy import VMD

# Time Domain 0 to T
T = 1000
fs = 1/T
t = np.arange(1,T+1)/T#通过指定起始值和终值来创建一维数组
freqs = 2*np.pi*(t-0.5-fs)/(fs)

# center frequencies of components
f_1 = 2
f_2 = 20
f_3 = 40

# modes
v_1 = (np.cos(2*np.pi*f_1*t))
v_2 = 1/4*(np.cos(2*np.pi*f_2*t))
v_3 = 1/16*(np.cos(2*np.pi*f_3*t))

#% for visualization purposes
fsub = {1:v_1,2:v_2,3:v_3}
wsub = {1:2*np.pi*f_1,2:2*np.pi*f_2,3:2*np.pi*f_3}
# composite signal, including noise
f1=v_1 + v_2 + v_3
f = v_1 + v_2 + v_3 + 0.1*np.random.randn(v_1.size)
f_hat = np.fft.fftshift((np.fft.fft(f)))

fig1 = plt.figure()
plt.xlim((0,1))
for key, value in fsub.items():
    plt.subplot(3,1,key)
    plt.plot(t,value)
fig1.suptitle('Original input signal and its components')


# some sample parameters for VMD
alpha = 2000       
tau = 0.           
K = 3             
DC = 0           
init = 1          
tol = 1e-7
# Run actual VMD code
u, u_hat, omega = VMD(f, alpha, tau, K, DC, init, tol)
# Simple Visualization of decomposed modes
plt.figure()
plt.plot(u.T)
plt.title('Decomposed modes')

fig4 = plt.figure()
plt.loglog(freqs[T//2:], abs(f_hat[T//2:]), 'k:')
plt.xlim(np.array([1, T//2])*np.pi*2)
for k in range(K):
    plt.loglog(freqs[T//2:], abs(u_hat[T//2:,k]), linestyles[k])
    #plt.plot(freqs[T // 2:], abs(u_hat[T // 2:, k]), linestyles[k])
fig4.suptitle('Spectral decomposition')
plt.legend(['Original','1st component','2nd component','3rd component'])

fig5 = plt.figure()
for k in range(K):
    plt.subplot(3,1,k+1)
    plt.plot(t,u[k,:], linestyles[k])
    plt.plot(t, fsub[k+1], 'k:')
    plt.xlim((0,1))
    plt.title('Reconstructed mode %d'%(k+1))
    
plt.show()

程序显示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考:
https://blog.csdn.net/SparkQiang/article/details/103498160
https://blog.csdn.net/arm_qiao/article/details/108482727

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608555.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信息竞赛笔记(2)––快速幂

目录 快速幂 定义 分析 代码 递归实现 非递归实现(通用方法) 模意义下取幂 快速幂 定义 快速幂,二进制取幂(Binary Exponentiation,也称平方法),是一个在的时间内计算的小技巧,而暴力的计算需要的时间。 这个技巧也常常用在非计算的场景,因为它可…

【论文】通过基准分析优化联邦人员重新识别的性能

论文链接 目录 摘要1. 绪论2. 相关工作2.1 人员重新识别2.2 联邦学习 3. 联邦 个人REID基准3.1 数据集3.2 联合方案3.3 模型结构3.4 联邦学习算法3.5 性能指标3.6 参考实现4.1 通过相机联合方案4.2 按数据集联合方案 5. 性能优化5.1 知识蒸馏5.2 权重调整5.3 知识蒸馏和体重调…

提高代码质量的秘诀:类、方法、字段和包注释

🧑‍💻CSDN主页:夏志121的主页 📋专栏地址:Java基础进阶核心技术专栏 目录 🍢 一、注释的插入 🍣 二、类注释 🍤 三、方法注释 🍥 四、字段注释 🥮 五、…

GreenPlum集群部署之抽丝剥茧

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

【stable diffusion原理解读通俗易懂,史诗级万字爆肝长文,喂到你嘴里】

文章目录 一、前言(可跳过)二、stable diffusion1.clip2.diffusion modelforward diffusion (前向扩散)逆向扩散(reverse diffusion)采样图阶段小结 3.Unet modeltimestep_embedding采用正余弦编码 三、sta…

华为OD机试真题 Java 实现【求符合要求的结对方式】【2023Q1 100分】,附详细解题思路

一、题目描述 用一个数组A代表程序员的工作能力,公司想通过结对编程的方式提高员工的能力,假设结对后的能力为两个员工的能力之和,求一共有多少种结对方式使结对后能力为N。 二、输入描述 6 2 3 3 4 5 1 6 第一行为员工的总人数&#xff…

精简总结:一文说明软件测试基础概念

基础概念-1 基础概念-2 目录 一、什么是软件测试? 二、软件测试的特点 三、软件测试和开发的区别 1、内容: 2、技能区别 3、工作环境 4、薪水 5、发展前景 6、繁忙程度 7、技能要求 四、软件测试与调试的区别 1、角色 2、目的 3、执行的阶…

Lecture 7 Deep Learning for NLP: Feedforward Networks

目录 Deep LearningFeedforward Neural Network 前馈神经网络Neuron 神经元Output Layer 输出层OptimizationRegularization 正则化Topic Classification 主题分类Language Model as Classifiers 语言模型作为分类器Word Embeddings 词嵌入Training a Feed-Forward Neural Netw…

RVOS操作系统协作式多任务切换实现-03

RVOS操作系统协作式多任务切换实现-03 任务(task)多任务 (Multitask)任务上下文(Context)多任务系统的分类协作式多任务 创建和初始化第 1 号任务切换到第一号任务执行协作式多任务 - 调度初始化和任务创建…

虚拟机-安装与使用2023

虚拟机-安装与使用 前言 一、虚拟机 1.VMware 2.Virtualbox 二、VMware 的下载 三、VMware 的安装 四、验证是否安装成功 五、运行 VMware 六、VMware 上安装其它操作系统 安装 Windows 10安装 CentOS-Linux安装 Kali-Linux 七、VMware 常用功能同步时间系统备份克隆快照内存设…

黑马Redis视频教程高级篇(多级缓存案例导入说明)

目录 一、安装MYSQL 1.1、准备目录 1.2、运行命令 1.3、修改配置 1.4、重启 二、导入SQL 三、导入Demo工程 3.1、分页查询商品 3.2、新增商品 3.3、修改商品 3.4、修改库存 3.5、删除商品 3.6、根据id查询商品 3.7、根据id查询库存 3.8、启动 四、导入商品查询…

Maven高级——私服(完结撒花!)

作用与介绍 一个公司内有两个项目组,如果其中一个开发了一个依赖tlias-utils,另一个项目组要使用的话要么就是传过来直接install放到自己的本地仓库里面的。 但是也可以搭建一个公共仓库,专门供公司局域网内部使用,也就是所谓私服。 然后在…

chatgpt赋能python:Python反向函数:在编程中的威力

Python反向函数:在编程中的威力 在Python中,反向函数是一个强大且常用的工具,可以帮助程序员在编写代码时更加高效和精确地处理数据。在本文中,我们将讨论Python反向函数的用途和实现,并详细介绍如何在您的代码中使用…

Java007——Java注释介绍

围绕以下3点介绍: 1、什么是Java注释? 2、Java注释的作用? 3、Java注释长什么样,以及怎么使用Java注释? 一、什么是Java注释? Java注释是在Java程序中用来描述代码的特殊语句。 注释被忽略并且不被编译器…

MySQL表的增删改查

目录 一、Create 1.insert 2.更新 3.替换 二、Retrieve(查找) 1.select 2.where 3. 结果排序 4. 筛选分页结果 三、Update 四、Delete 1.删除数据 2.截断表 五、聚合函数 1.count: 2.avg 3.sum 4.max 5.min 六、Group …

微信小程序开发实战 ②④(自定义 TabBar练习)

作者 : SYFStrive 博客首页 : HomePage 📜: 微信小程序 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 &#x1f4…

十四、神经风格迁移

文章目录 1、神经风格迁移2、生成图片的代价函数THE END 1、神经风格迁移 \qquad 神经风格迁移就是将一幅原有的图片(content picture, C),对照着一幅风格图片(style picture, S),生成一幅新的图片(generated picture, G),如下图所示&#xf…

k8s istio 集成 多版本应用服务 和 网格监测

说明 博客文章地址:https://blog.taoluyuan.com/posts/istio-getting-started/ 本主要是内容: 使用 istioctl 安装 istio采用 istio 官方提供 的 应用bookinfo,实现多版本的服务应用部署istio 网关 gateway,vs,dr 的基本使用利用监测工具 prometheus,grafana,jaeger 查看 ist…

关于EMC Unity 存储系统DIMM内存的几个问题

下面是客户咨询最多的几个关于EMC Unity的DIMM内存的问题,供大家参考。 1. Unity存储能否自己扩容内存 有客户觉得Unity存储的内容太小,想自己扩容内存,很朴实的想法,原来是每个控制器3条16gb,能不能升级到3条32gb或…

基于Mybatis-Plus拦截器实现MySQL数据加解密

一、背景 用户的一些敏感数据,例如手机号、邮箱、身份证等信息,在数据库以明文存储时会存在数据泄露的风险,因此需要进行加密, 但存储数据再被取出时,需要进行解密,因此加密算法需要使用对称加密算法。 常…