Java编程EMD

IMF需要满足的俩个条件:
1、极值点和过零点的数目应相等,或最多差一个
2、局部最大值和局部最小值的上下包络线均值为0

EMD的步骤:
1、包络线的获取:确定原始信号的极大值和极小值序列,采用三次样条曲线对极值点进行拟合,形成上下包络线;
注意用希尔伯特变换求取包络线的流程:

2、残余信号获取:原始信号x(t),平均信号e(t)做差,得到残余信号;

3、IMF条件检验,是否满足上面的2个条件

4、残差信号获取:原信号与平均信号作差,得到残余信号,将残差信号作为原始信号重复上面过程,不断得到各个固有模态函数:

5、分解中值:当残差信号为单调函数时,终止分解,此时原始信号可以用分解出来的iMF进行重构。

希尔伯特流程:

Hilbert 方法过程

一个带求包络的信号x(t),进行Hilbert变换的好 HHT(x(t)), 合成一个信号 x(t) + j*HHT( x(t) ), 然后对这个合成的信号取幅值部分 y(t)= Amp( [x(t) + j*HHT( x(t) )] ), 此时y(t)就是得到的上包络,下包络y'(t) = -y(t).

 针对上面的流程进行编程:

package model.EXETest;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class HBTTools {// 计算N点DFT的一半,用于递归实现完整DFTpublic static void dftRecursive(double[] real, double[] imag, int N, double[] omega) {if (N == 1) return;// 递归调用计算一半的DFTdftRecursive(real, imag, N / 2, omega);// 对称复制剩余的一半并递归调用for (int k = 0; k < N / 2; k++) {real[k + N / 2] = real[k];imag[k + N / 2] = -imag[k];}// 递归过程中进行按频率的循环位移double tmpReal, tmpImag;for (int k = 0; k < N / 2; k++) {double kth = omega[N / 2] * k;tmpReal = real[N / 2 + k];tmpImag = imag[N / 2 + k];real[N / 2 + k] = real[k] + tmpReal * Math.cos(kth) - tmpImag * Math.sin(kth);imag[N / 2 + k] = imag[k] + tmpReal * Math.sin(kth) + tmpImag * Math.cos(kth);real[k] = real[k] + tmpReal * Math.cos(kth) + tmpImag * Math.sin(kth);imag[k] = imag[k] - tmpReal * Math.sin(kth) + tmpImag * Math.cos(kth);}}public static double[] hartleyTransform(double[] x) {int N = x.length;double[] real = new double[N];double[] imag = new double[N];double[] omega = new double[N];// 初始化omega数组for (int n = 0; n < N; n++) {omega[n] = -2 * Math.PI * n / N;}// 复数部分初始化为0Arrays.fill(imag, 0.0);// 实部赋值为输入序列System.arraycopy(x, 0, real, 0, N);// 递归计算DFTdftRecursive(real, imag, N, omega);// 输出DFT结果for (int n = 0; n < N; n++) {x[n] = Math.sqrt(real[n] * real[n] + imag[n] * imag[n]); // 计算幅度}return x;}//去取文件获取数据返回集合Doubleprivate static List<Double> readFile(String path) {List<Double> ll=new ArrayList<>();String line="";try{BufferedReader in=new BufferedReader(new FileReader(path));while ((line=in.readLine()) != null){//表示字符串长度不受限制
//                String[] str=line.split(" ",-1);//先把外面的替换掉String c = line.replaceAll("\r|\n", "");String[] str=c.split(" ");for(int i=0;i<str.length;i++){if (i % 5 == 0 || i % 5 == 1 || i % 5 == 2) {double dat = Double.parseDouble(str[i]);ll.add(dat);}}}in.close();} catch (IOException e) {e.printStackTrace();}return ll;}//信号取反,获取下包络public static double[] getDownLineData(double[] dek){double[] buk=new double[dek.length];for(int i=0;i<dek.length;i++){buk[i] = dek[i]*(-1);}return dek;}//信号取平均 h(t)=x(t)-e(t);public static double[] diffentenceData(double[] orangin,double[] up,double[] dowm){double[] result=new double[up.length];for(int j=0;j<up.length;j++){double value=(up[j]-dowm[j])/2;result[j]=orangin[j]-value;}return result;}//结果获取public static double[] IMFR(double[] orginle){// 希尔伯特变换 获取上包络double[] up=hartleyTransform(orginle);//对数据取反,获取下包络double[] backOR=getDownLineData(orginle);//获取下包络double[] dowmN=hartleyTransform(backOR);//再取反,获取原信号下包络double[] down=getDownLineData(dowmN);//原信号减去包络的均值,获取IMF信号double[] imf=diffentenceData(orginle,up,down);return imf;}public static void main(String[] args) {// 示例序列double[] x = {1, 2, 3, 4, 5, 6, 7, 8,9,8,7,6,5,4,3,2,1};String path="C:\\Users\\seer\\Desktop\\测量无效\\sport\\6327894be0924b44ab82a45c737ee932_1713413035_1713413225963_160_1.txt";List<Double> fileData=readFile(path);double[] base=SystemTools.getList(fileData);//传入原始信号double[] imf=IMFR(base);for(int k=0;k<8;k++){imf=IMFR(imf);// 输出变换后的序列}StringBuilder sb=new StringBuilder();for(int i=0;i<imf.length-1;i++){sb.append(imf[i]+" ");}System.out.print(sb.toString());}}

 

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

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

相关文章

【Git】Git常用命令

1、配置命令 # 查看全局配置列表 git config --global -l # 查看局部配置列表 git config --local -l# 查看所有的配置以及它们所在的文件 git config --list --show-origin# 查看已设置的全局用户名/邮箱 git config --global --get user.name git config --global --get use…

智慧旅游引领旅游行业创新发展:借助智能科技的力量,推动旅游服务的个性化、精准化,提升游客的满意度和忠诚度

随着信息技术的迅猛发展和广泛应用&#xff0c;智慧旅游已成为旅游行业创新发展的重要引擎。智慧旅游借助智能科技的力量&#xff0c;推动旅游服务的个性化、精准化&#xff0c;不仅提升了游客的满意度和忠诚度&#xff0c;也为旅游行业的可持续发展注入了新的活力。本文将从智…

安全运营之通行字管理

一、什么是通行字 安全管理所指的通行字指的是对用于身份验证的账号密码或口令的管理。在计算机系统、网络服务、数据库管理等领域&#xff0c;通行字&#xff08;或称账号口令、密码&#xff09;是用于验证用户身份的重要机制。通行字管理的核心目标是确保只有授权用户才能访…

组合优于继承:什么情况下可以使用继承?

C设计模式专栏&#xff1a;http://t.csdnimg.cn/8Ulj3 目录 1.引言 2.为什么不推荐使用继承 3.相比继承&#xff0c;组合有哪些优势 4.如何决定是使用组合还是使用继承 1.引言 面向对象编程中有一条经典的设计原则:组合优于继承&#xff0c;也常被描述为多用组合&#xff0…

链游:未来游戏发展的新风向

链游&#xff0c;即区块链游戏的一种&#xff0c;是一种将区块链技术与游戏玩法相结合的创新型游戏。它利用区块链技术的特性&#xff0c;如去中心化、可追溯性和安全性&#xff0c;为玩家提供了一种全新的游戏体验。链游通常采用智能合约来实现游戏的规则和交易系统&#xff0…

计算机网络和因特网

Internet: 主机/端系统&#xff08;end System / host&#xff09;&#xff1a; 硬件 操作系统 网络应用程序 通信链路&#xff1a; 光纤、网络电缆、无线电、卫星 传输效率&#xff1a;带宽&#xff08;bps&#xff09; 分组交换设备&#xff1a;转达分组 包括&#…

导航系统架构及业务模块组合策略

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、嵌入式硬件系统架构【开发系统平台架构】通讯方式及组件选型方向导航机器人硬件配置及其常用功能 二、嵌入式软件系统组件…

【ensp实验】Telnet 协议

目录 Telnet 协议 telnet协议特点 Telnet实验 ​编辑 不使用console口 三种认证模式的区别 Telnet 协议 Telnet 协议是 TCP/IP 协议族中的一员&#xff0c;是 Internet 远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用…

智能合约——提案demo

目录 这是一个超超超级简单的智能合约提案项目&#xff0c;你确定不点进来看一下吗&#xff1f; 引言&#xff1a; 1、搭建开发环境&#xff1a; 2、编写智能合约&#xff1a; 3、部署智能合约&#xff1a; ​编辑​编辑4、编写前端交互代码&#xff08;使用web3.js&…

使用riscv-tests进行指令测试(二)

使用riscv-tests进行指令测试&#xff08;二&#xff09; 1 测试用例命名规则2 测试用例dump文件介绍 本文属于《 TinyEMU模拟器基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 测试用例命名规则 用例名称 TVM Name “-” Target Environment Name “-” “指令”…

uniapp判断是图片还是pdf,如果是pdf则进行下载预览

一、附件中有图片也有pdf&#xff0c;需要进行预览&#xff0c;图片可直接预览&#xff0c;而pdf是下载后再预览 二、主要代码 <view class"fj-row" v-for"(item,index) in formDetail.attachmentRespVOS" :key"index"><view class&qu…

springboot常用注释

SpringBootApplication 标明启动类的注释&#xff0c;也就是标明项目程序入口&#xff0c;实际上集成了非常多的注释 SpringBootApplication public class SpringbootApplication {public static void main(String[] args) {SpringApplication.run(SpringbootApplication.cla…

区块链基础——区块链应用架构概览

目录 区块链应用架构概览&#xff1a; 1、区块链技术回顾 1.1、以太坊结点结构 1.2、多种应用场景 2、区块链应用架构概览 2.1、传统的Web2 应用程序架构 2.2、Web3 应用程序架构——最简架构 2.3、Web3 应用程序架构——前端web3.js ether.js 2.4、Web3 应用程序架构—…

react 实现自动创建api 请求文件

需求&#xff1a; 前后端分离的情况下前端要调用后端的接口要写很多接口调用的定义文件很繁琐&#xff0c;切没有意义都是体力劳动 进程&#xff1a; 让后端使用swagger 或者其他的openpai 格式的组件将server 端的接口喷出如果是swagger 的话一般会有一个口子 /v2/api-docs…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别 一、简单介绍 二、简单进行人脸训练与识别 1、LBPH…

【MATLAB源码-第198期】基于simulink的三相光伏并网仿真模拟。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 三相光伏并网系统是一种将太阳能转换为电能并将其馈入电网的系统。这个系统通常包括光伏阵列、逆变器&#xff08;包括其控制算法&#xff09;、滤波器、电网连接和监控系统。从上载的框图中可以看出&#xff0c;该系统的设计…

【力扣】16. 最接近的三数之和

16. 最接近的三数之和 题目描述 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1…

Golang实现一个批量自动化执行树莓派指令的软件(6)简易批量指令处理

简介 基于上篇 Golang实现一个批量自动化执行树莓派指令的软件(5)模块整合&#xff0c; 这里我们实现简单的从配置文件设置指令集&#xff0c; 然后程序自动运行指令集的操作。 环境描述 运行环境: Windows&#xff0c; 基于Golang&#xff0c; 暂时没有使用什么不可跨平台接口…

找不到mfc140.dll如何解决?mfc140.dll丢失的几种解决方法分享

在我们启动并开始利用电脑进行日常工作的过程中&#xff0c;如果遭遇了操作系统提示“mfc140.dll文件丢失”的错误信息&#xff0c;导致某些应用程序无法正常运行&#xff0c;这究竟是何种情况呢&#xff1f;小编将介绍计算机缺失mfc140.dll文件的5种解决方法&#xff0c;帮助大…

java项目:微信小程序基于SSM框架实现的购物系统小程序【源码+数据库+毕业论文+PPT】

一、项目简介 本项目是一套基于SSM框架实现的购物系统小程序 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能齐…