常州武进建设局网站,收录查询代码,长沙网站制作哪家专业,服务器维护网站建设教程IMF需要满足的俩个条件#xff1a; 1、极值点和过零点的数目应相等#xff0c;或最多差一个 2、局部最大值和局部最小值的上下包络线均值为0 EMD的步骤#xff1a; 1、包络线的获取#xff1a;确定原始信号的极大值和极小值序列#xff0c;采用三次样条曲线对极值点进行拟… IMF需要满足的俩个条件 1、极值点和过零点的数目应相等或最多差一个 2、局部最大值和局部最小值的上下包络线均值为0 EMD的步骤 1、包络线的获取确定原始信号的极大值和极小值序列采用三次样条曲线对极值点进行拟合形成上下包络线 注意用希尔伯特变换求取包络线的流程 2、残余信号获取原始信号xt平均信号et做差得到残余信号 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 ListDouble readFile(String path) {ListDouble llnew ArrayList();String line;try{BufferedReader innew BufferedReader(new FileReader(path));while ((linein.readLine()) ! null){//表示字符串长度不受限制
// String[] strline.split( ,-1);//先把外面的替换掉String c line.replaceAll(\r|\n, );String[] strc.split( );for(int i0;istr.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[] buknew double[dek.length];for(int i0;idek.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[] resultnew double[up.length];for(int j0;jup.length;j){double value(up[j]-dowm[j])/2;result[j]orangin[j]-value;}return result;}//结果获取public static double[] IMFR(double[] orginle){// 希尔伯特变换 获取上包络double[] uphartleyTransform(orginle);//对数据取反获取下包络double[] backORgetDownLineData(orginle);//获取下包络double[] dowmNhartleyTransform(backOR);//再取反获取原信号下包络double[] downgetDownLineData(dowmN);//原信号减去包络的均值获取IMF信号double[] imfdiffentenceData(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 pathC:\\Users\\seer\\Desktop\\测量无效\\sport\\6327894be0924b44ab82a45c737ee932_1713413035_1713413225963_160_1.txt;ListDouble fileDatareadFile(path);double[] baseSystemTools.getList(fileData);//传入原始信号double[] imfIMFR(base);for(int k0;k8;k){imfIMFR(imf);// 输出变换后的序列}StringBuilder sbnew StringBuilder();for(int i0;iimf.length-1;i){sb.append(imf[i] );}System.out.print(sb.toString());}}