Python实现特征模态分解(FMD)

news2024/11/20 4:49:30

      大家好,我是带我去滑雪!

      特征模态分解(Feature Mode Decomposition,FMD)是一种信号处理技术,用于从数据中提取特征,并将其表示为一组特定的模态成分。与其他分解方法类似,如小波变换或奇异值分解,FMD 旨在将信号分解为具有不同频率和振幅的模态成分,每个模态成分代表信号中的一个特定特征或组件。FMD 可以应用于多个领域,包括信号处理、图像处理、振动分析和数据压缩等。它通常用于处理非线性和非平稳信号,并且在提取信号中的重要特征方面具有一定的优势。 FMD 的目标是将原始信号分解为一组具有良好时频局部性质的基本模态成分,从而更好地理解和分析信号的结构和特征。

       特征模态分解流程如下:

  • (1)加载原始信号并输入参数,即模式数n和滤波器长度L;
  • (2)通过汉宁窗口初始化FIR滤波器组,使用K个滤波器,建议设置为5-10,并开始选代i=1;
  • (3)获得浦波信号(即分解模态);
  • (4)使用原始信号x,估计模态周期作为自相关谱在过零点后达到局部最大值的点来更新滤波器系数。完成一次迭代并设置i=i+1;
  • (5)判断选代次数是否达到预选代次数。如果不是,返回步骤(3),否则输入;
  • (6)计算每两个模态的构造一个KxK矩阵CC(KxK)。锁定CC值最大的两个模式CCmax,并使用估计的周期计算 它们的CK。然后,从两种模式中抛弃CK较小的模式,设K=K-1;
  • (7)判断模式K是否达到指定的n,如果不达到则返回步骡3,否则进入步骤8;
  • (8)获得保留模式作为最终分解模式。

      特征模态分解的优点:

  1. 同时考虑信号的冲动性和周期性,FMD分解目标更具有针对性,对其他干扰和噪声具有鲁棒性。
  2. 采用自适应FIR滤波器提取分解模式。不受滤波器形状、带宽、中心频率的限制,分解更加彻底。

下面开始代码实战。

目录

(1)导入相关模块和数据

(2)汉宁窗口初始化FIR滤波器组

(3)自相关普

(4)FMD函数

(5)调用函数与绘图


(1)导入相关模块和数据

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import firwin, lfilter, correlate, find_peaks
import pandas as pd


rows = 167
time = np.linspace(0, 1, rows)
signal_data =pd.read_csv('E:\工作\硕士\科研\任务8\代码\data.csv')
signal_df = pd.DataFrame(signal_data, columns=['Signal'])

(2)汉宁窗口初始化FIR滤波器组

def initialize_filters(L, K):
    filters = []
    for k in range(1, K+1):
        cutoff = 0.5 / k
        filter = firwin(L, cutoff, window='hann')
        filters.append(filter)
    return filters

(3)自相关普

def estimate_period(signal):
    correlation = correlate(signal, signal, mode='full')
    correlation = correlation[len(correlation) // 2:]
    peaks, _ = find_peaks(correlation)
    if len(peaks) > 1:
        period = peaks[1]
    else:
        period = len(signal)
    return period

(4)FMD函数


def fmd(signal, n, L=100, max_iters=10):
    K = min(10, max(5, n))
    filters = initialize_filters(L, K)
    modes = []
    signal = signal.values.flatten() if isinstance(signal, pd.DataFrame) else signal.flatten()

    for i in range(max_iters):
        for filter in filters:
            filtered_signal = lfilter(filter, 1.0, signal)
            period = estimate_period(filtered_signal)
            modes.append(filtered_signal)

        if len(modes) >= n:
            break

    return modes[:n]

(5)调用函数与绘图

n = 5
modes = fmd(signal_df, n)

# 检查模态数据
for i, mode in enumerate(modes):
    print(f'Mode {i+1}: Max={np.max(mode)}, Min={np.min(mode)}')

# 绘制结果
plt.figure(figsize=(10, 8))
plt.subplot(len(modes) + 1, 1, 1)
plt.plot(time, signal_df['Signal'].values)
plt.title('Original Signal')

for i, mode in enumerate(modes, start=1):
    plt.subplot(len(modes) + 1, 1, i+1)
    plt.plot(time, mode)
    plt.title(f'Mode {i}')

plt.tight_layout()
plt.show()

输出结果:

需要数据集的家人们可以去百度网盘(永久有效)获取:

链接:https://pan.baidu.com/s/173deLlgLYUz789M3KHYw-Q?pwd=0ly6
提取码:2138 


更多优质内容持续发布中,请移步主页查看。

博主的WeChat:TCB1736732074

   点赞+关注,下次不迷路!

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

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

相关文章

RUST语言值所有权之内存复制与移动

1.RUST中每个值都有一个所有者,每次只能有一个所有者 String::from函数会为字符串hello分配一块内存 内存示例如下: 在内存分配前调用s1正常输出 在分配s1给s2后调用报错 因为s1分配给s2后,s1的指向自动失效 s1被move到s2 s1自动释放 字符串克隆使用

Oracle 中 where 和 on 的区别

1.Oracle 中 where 和 on 的区别 on:会先根据on后面的条件进行筛选,条件为真时返回该行,由于on的优先级高于left join,所以left join关键字会把左表中没有匹配的所有行也都返回,然后生成临时表返回,执行优先级高于…

Python 基于列表实现的通讯录管理系统(有完整源码)

目录 通讯录管理系统 PersonInformation类 ContactList类 menu函数 main函数 程序的运行流程 完整代码 运行示例 通讯录管理系统 这是一个基于文本的界面程序,用户可以通过命令行与之交互,它使用了CSV文件来存储和读取联系人信息,这…

C++进阶--C++11(2)

C11第一篇 C11是C编程语言的一个版本,于2011年发布。C11引入了许多新特性,为C语言提供了更强大和更现代化的编程能力。 可变参数模板 在C11中,可变参数模板可以定义接受任意数量和类型参数的函数模板或类模板。它可以表示0到任意个数&…

数据库基础:概念、分类、作用和特点

文章目录 概要DB-Engines 排名数据库的分类数据库的作用数据库的特点数据库的应用小结 概要 数据库是按照数据结构来组织、存储和管理数据的仓库。它是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库可以被视为电子化的文件柜,用…

40.基于SpringBoot + Vue实现的前后端分离-摄影分享网站(项目 + 论文)

项目介绍 随着互联网时代的发展,传统的线下管理技术已无法高效、便捷的管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,国家在环境要求不断提高的前提下,摄影分享网站管理系统建设也逐渐进入了信…

Lanelets_ 高效的自动驾驶地图表达方式

Lanelets: 高效的自动驾驶地图表达方式 附赠自动驾驶学习资料和量产经验:链接 LaneLets是自动驾驶领域高精度地图的一种高效表达方式,它以彼此相互连接的LaneLets来描述自动驾驶可行驶区域,不仅可以表达车道几何,也可以完整表述车…

考研高数(平面图形的面积,旋转体的体积)

1.平面图形的面积 纠正:参数方程求面积 2.旋转体的体积(做题时,若以x为自变量不好计算,可以求反函数,y为自变量进行计算)

正排索引 vs 倒排索引 - 搜索引擎具体原理

阅读导航 一、正排索引1. 概念2. 实例 二、倒排索引1. 概念2. 实例 三、正排 VS 倒排1. 正排索引优缺点2. 倒排索引优缺点3. 应用场景 三、搜索引擎原理1. 宏观原理2. 具体原理 一、正排索引 1. 概念 正排索引是一种索引机制,它将文档或数据记录按照某种特定的顺序…

【cpp】快速排序优化

标题:【cpp】快速排序 水墨不写bug 正文开始: 快速排序的局限性: 虽然快速排序是一种高效的排序算法,但也存在一些局限性: 最坏情况下的时间复杂度:如果选择的基准元素不合适,或者数组中存在大…

“张衡一号”卫星成功监测太阳活动引起的空间天气事件

太阳出现耀斑和日冕物质抛射等短时间尺度的剧烈活动,造成地球磁层、电离层和中高层大气的强烈扰动,这类活动通常称之为空间天气事件。空间天气事件会对现代高技术系统,如航空、航天、导航通信、电力油气管网等,造成严重影响&#…

Rust---复合数据类型之元组

目录 元组的使用输出结果 元组的使用 fn main() {// 创建一个元组let my_tuple : (i32, &str, f64) (10, "hello", 3.14);// 打印元组中的元素println!("{:?}", my_tuple);// 访问元组中的元素let first_element my_tuple.0; // 访问第一个元素let…

阿里云最新活动及优惠券领取指南

随着云计算技术的快速发展,越来越多的企业选择将业务部署在云平台上。阿里云作为国内领先的云服务提供商,不断推出各种优惠活动及优惠券,旨在帮助用户降低成本,提升运营效率。本文将为大家详细介绍阿里云的最新活动及优惠券领取指…

Web3 游戏周报(3.24-3.30)

【3.24-3.30】Web3 游戏行业动态: Web3 开发平台 Mirror World 在 Solana 上推出首个游戏 rollup 链 NFT 卡牌游戏 Parallel 完成 3,500 万美元融资,Solana Ventures 等参投 加密游戏开发公司 Gunzilla Games 完成 3,000 万美元融资 Telegram 游戏 No…

第四百四十四回

文章目录 1. 问题描述2. 优化方法2.1 缩小范围2.2 替代方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取AppBar的高度"相关的内容,本章回中将介绍关于MediaQuery的优化.闲话休提,让我们一起Talk Flutter吧。 1. 问题描述 我们在…

(二)小案例银行家应用程序-创建DOM元素

● 上图的数据很明显是从我们账户数组中拿到了,我们刚刚学习了forEach,所以我们使用forEach来创建我们的DOM元素; const displayMovements function (movements) {movements.forEach((mov, i) > {const type mov > 0 ? deposit : w…

161 Linux C++ 通讯架构实战15,线程池代码分析

线程池应该使用的地方 和 epoll 技术结合 线程池代码处理数据的地方。 线程池分析: 线程池代码1 threadpool_create //Tencent8888 start threadpool_create函数的目的初始化线程池,对应的struct是 threadpool_t /* 1.先malloc整个线程池的大小 2.这里…

常见的加密方式总结(哈希算法、对称、非对称)

哈希算法是一种用数学方法对数据生成一个固定长度的唯一标识的技术,可以用来验证数据的完整性和一致性,常见的哈希算法有 MD、SHA、MAC 等。 对称加密算法是一种加密和解密使用同一个密钥的算法,可以用来保护数据的安全性和保密性&#xff0…

顺序表相关习题

🌈 个人主页:白子寰 🔥 分类专栏:python从入门到精通,魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ 💡 坚持创作博文…

GIT版本管理使用示例

一、创建好远程代码仓库后,复制远程仓库的地址 二、新建一个文件夹,在文件夹里打开Git Bash Here 三、输入git clone 远程仓库地址,仓库就初始化完成了 四、新建一个文本文件,假设这是我们开发的代码 五、打开文本,假设…