线谱法 时钟分量的提取 matlab,LMD局域均值分解的matlab程序及示例

说明:研究LMD局域均值分解有3个月左右,能找到的相关文章也基本上看了一遍,觉得是个很好的方法,号称是EMD经验模态分解的改进版。但是网络上一直没有找到该算法的matlab程序,只见文章说的天花乱坠。后来自己写了一个,但是使用有一个问题没有解决,就是分解的时候怎么去除骑行波的问题。先把自己写的程序贡献出来,让大家分析下,一起讨论下,到底LMD的程序怎样写才能如文献中说的那样达到目的。欢迎大家热烈讨论!

程序仍存在不收敛的问题,拿出来分享只是希望高手指点一二,写的不好欢迎拍砖!

文件夹包含,找出纯调频函数,计算瞬时幅值,瞬时频率的函数等

%%%%%%%%%%%主程序%%%%%%%%%%

%lmd1原始版

%通过emd.m的三次样条+镜像延拓求出上下包络及均值

%局域均值函数=(上包络+下包络)/2

%局域包络函数=|上包络-下包络|/2

%相关文章见《一种基于EMD的振动信号时频分析新方法研究》-胡劲松,杨世锡

function[PF,A,SI]=lmd1(m)

%最后一个PF是残余分量

%A是瞬时赋值

%SI是纯调频函数,求它的瞬时频率就是需要的频率

c=m;

k=0;

wucha1=0.001;

n_l=nengliang(m);

while 1

k=k+1;

a=1;

h=c;

[pf,a,si]=zhaochun1(a,h,wucha1);

c=c-pf;

PF(k,:)=pf;

A(k,:)=a;

SI(k,:)=si;

c_pos=pos(c);

n_c=nengliang(c);

n_pf=nengliang(pf);

%停止调节

%1.emd用的是三次样条求包络,要求至少3个极值点,所以这里c的极值点个数也应该至少为3

%2.如果上一个PF的极值点数比下一个PF的极值点数少,说明结果也不正确(这个也可以作为停止条件考虑进去)

%上面一句是否可以等价于当前PF的极值点个数一定要大于等于残量(c)的极值点个数(目前是用这个作为停止条件的一个参考写入程序)

%3.当前PF分量的能量应该大于残量c的能量(这个有待商榷)

%4.残余能量不能大于信号能量

if

n_pf

if

length(c_pos)<3 ||

n_c

n_pfn_l

PF(k+1,:)=c;

break

end

end

end

%%%%%%%%%%%%%%%%%%nengliang函数%%%%%%%%%%

function p=nengliang(y)

% my=mean(y);

% p=(y-my).*(y-my);

% p=sum(p);

p=sum(abs(y).^2);

end

%%%%%%%%%%%%%找纯函数%%%%%%%%%%%%%%%%%

function [pf,a,si]=zhaochun1(a,h,wucha1)

chun_num=0;

while 1

chun_num=chun_num+1;

t=1:length(h);

[envmin,envmax,envmoy,indmin,indmax,indzer] =

envelope(t,h,'spline');

mi=(envmax+envmin)./2;

ai=abs(envmax-envmin)./2;

a=a.*ai;

si=(h-mi)./ai;

h=si;

ai_funmax=max(ai);

ai_funmin=min(ai);

if

(ai_funmax<=1+wucha1&&ai_funmin>=1-wucha1)

break

end

end

pf=a.*si;

chun_num

function [envmin, envmax,envmoy,indmin,indmax,indzer] =

envelope(t,x,INTERP)

%computes envelopes and mean with various interpolations

NBSYM = 2; % 边界延拓点数

DEF_INTERP = 'spline';

if nargin < 2

x = t;

t = 1:length(x);

INTERP = DEF_INTERP;

end

if nargin == 2

if ischar(x)

INTERP = x;

x = t;

t = 1:length(x);

end

end

if ~ischar(INTERP)

error('interp parameter must be ''linear'''',

''cubic'' or ''spline''')

end

if ~any(strcmpi(INTERP,{'linear','cubic','spline'}))

error('interp parameter must be ''linear'''',

''cubic'' or ''spline''')

end

if min([size(x),size(t)]) > 1

error('x and t must be vectors')

end

s = size(x);

if s(1) > 1

x = x';

end

s = size(t);

if s(1) > 1

t = t';

end

if length(t) ~= length(x)

error('x and t must have the same length')

end

lx = length(x);

[indmin,indmax,indzer] = extr(x,t);

%boundary conditions for interpolation

[tmin,tmax,xmin,xmax] =

boundary_conditions(indmin,indmax,t,x,NBSYM);

% definition of envelopes from interpolation

envmax = interp1(tmax,xmax,t,INTERP); envmin = interp1(tmin,xmin,t,INTERP);

if nargout > 2

envmoy =

(envmax + envmin)/2;

end

end

function [tmin,tmax,xmin,xmax] =

boundary_conditions(indmin,indmax,t,x,nbsym)

% computes the boundary conditions for interpolation (mainly mirror

symmetry)

lx = length(x);

% 判断极值点个数

if (length(indmin) + length(indmax)

< 3)

error('not enough

extrema')

end

% 插值的边界条件

if indmax(1) < indmin(1)%

第一个极值点是极大值

if x(1) > x(indmin(1))%

以第一个极大值为对称中心

lmax =

fliplr(indmax(2:min(end,nbsym+1)));

lmin =

fliplr(indmin(1:min(end,nbsym)));

lsym =

indmax(1);

else%

如果第一个采样值小于第一个极小值,则将认为该值是一个极小值,以该点为对称中心

lmax =

fliplr(indmax(1:min(end,nbsym)));

lmin =

[fliplr(indmin(1:min(end,nbsym-1))),1];

lsym =

1;

end

else

if x(1) <

x(indmax(1))% 以第一个极小值为对称中心

lmax =

fliplr(indmax(1:min(end,nbsym)));

lmin =

fliplr(indmin(2:min(end,nbsym+1)));

lsym =

indmin(1);

else%

如果第一个采样值大于第一个极大值,则将认为该值是一个极大值,以该点为对称中心

lmax =

[fliplr(indmax(1:min(end,nbsym-1))),1];

lmin =

fliplr(indmin(1:min(end,nbsym)));

lsym =

1;

end

end

%

序列末尾情况与序列开头类似

if indmax(end) < indmin(end)

if x(end) <

x(indmax(end))

rmax =

fliplr(indmax(max(end-nbsym+1,1):end));

rmin =

fliplr(indmin(max(end-nbsym,1):end-1));

rsym =

indmin(end);

else

rmax =

[lx,fliplr(indmax(max(end-nbsym+2,1):end))];

rmin =

fliplr(indmin(max(end-nbsym+1,1):end));

rsym =

lx;

end

else

if x(end) >

x(indmin(end))

rmax =

fliplr(indmax(max(end-nbsym,1):end-1));

rmin =

fliplr(indmin(max(end-nbsym+1,1):end));

rsym =

indmax(end);

else

rmax =

fliplr(indmax(max(end-nbsym+1,1):end));

rmin =

[lx,fliplr(indmin(max(end-nbsym+2,1):end))];

rsym =

lx;

end

end

%

将序列根据对称中心,镜像到两边

tlmin = 2*t(lsym)-t(lmin);

tlmax = 2*t(lsym)-t(lmax);

trmin = 2*t(rsym)-t(rmin);

trmax = 2*t(rsym)-t(rmax);

% in case symmetrized parts do not extend enough%

如果对称的部分没有足够的极值点

if tlmin(1) > t(1) | tlmax(1)

> t(1)% 对折后的序列没有超出原序列的范围

if lsym == indmax(1)

lmax =

fliplr(indmax(1:min(end,nbsym)));

else

lmin =

fliplr(indmin(1:min(end,nbsym)));

end

if lsym == 1%

这种情况不应该出现,程序直接中止

error('bug')

end

lsym = 1; %

直接关于第一采样点取镜像

tlmin =

2*t(lsym)-t(lmin);

tlmax =

2*t(lsym)-t(lmax);

end %

序列末尾情况与序列开头类似

if trmin(end) < t(lx) | trmax(end)

< t(lx)

if rsym == indmax(end)

rmax =

fliplr(indmax(max(end-nbsym+1,1):end));

else

rmin =

fliplr(indmin(max(end-nbsym+1,1):end));

end

if rsym == lx

error('bug')

end

rsym = lx;

trmin =

2*t(rsym)-t(rmin);

trmax =

2*t(rsym)-t(rmax);

end

% 延拓点上的取值

xlmax =x(lmax);

xlmin =x(lmin);

xrmax =x(rmax);

xrmin =x(rmin);

% 完成延拓

tmin = [tlmin t(indmin) trmin];

tmax = [tlmax t(indmax) trmax];

xmin = [xlmin x(indmin) xrmin];

xmax = [xlmax x(indmax) xrmax];

end

%---------------------------------------------------------------------------------------------------

% 极值点和过零点位置提取

function [indmin, indmax, indzer] = extr(x,t);

%extracts the indices corresponding to extrema

if(nargin==1)

t=1:length(x);

end

m = length(x);

if nargout > 2

x1=x(1:m-1);

x2=x(2:m);

indzer = find(x1.*x2<0);

if any(x == 0)

iz = find( x==0 );

indz = [];

if any(diff(iz)==1)

zer = x == 0;

dz = diff([0 zer 0]);

debz = find(dz == 1);

finz = find(dz == -1)-1;

indz = round((debz+finz)/2);

else

indz = iz;

end

indzer = sort([indzer

indz]);

end

end

d = diff(x);

n = length(d);

d1 = d(1:n-1);

d2 = d(2:n);

indmin = find(d1.*d2<0 &

d1<0)+1;

indmax = find(d1.*d2<0 &

d1>0)+1;

% when two or more consecutive points have the same value we

consider only one extremum in the middle of the constant area

% 当连续多个采样值相同时,把最中间的一个值作为极值点,处理方式与连0类似

if any(d==0)

imax = [];

imin = [];

bad = (d==0);

dd = diff([0 bad 0]);

debs = find(dd == 1);

fins = find(dd == -1);

if debs(1) == 1

if

length(debs) > 1

debs = debs(2:end);

fins = fins(2:end);

else

debs = [];

fins = [];

end

end

if length(debs) > 0

if fins(end)

== m

if length(debs) > 1

debs = debs(1:(end-1));

fins = fins(1:(end-1));

else

debs = [];

fins = [];

end end

end

lc = length(debs);

if lc > 0

for k =

1:lc

if d(debs(k)-1) > 0

if d(fins(k)) < 0

imax = [imax round((fins(k)+debs(k))/2)];

end

else

if d(fins(k)) > 0

imin = [imin round((fins(k)+debs(k))/2)];

end

end

end

end

if length(imax) > 0

indmax =

sort([indmax imax]);

end

if length(imin) > 0

indmin =

sort([indmin imin]);

end

end end

end

%%%%%%%%%%%%%%%%%%pos%%%%%%%%%%%%

function poss=pos(y)

%一个输出

%功能:找序列极值点位置坐标

%y:输入序列

%pos:极值点的序列位置坐标

[indmin,indmax]=position(y);

minmax=cat(2,indmin,indmax);

poss=sort(minmax);

end

%%%%%%%%%%%%%%position%%%%%%%

%返还极大值和极小值位置下标

%两个输出

function [indmin,indmax]=position(y)

m = length(y);

d = diff(y);

n = length(d);

d1 = d(1:n-1);

d2 = d(2:n);

indmin = find(d1.*d2<0 &

d1<0)+1;

indmax = find(d1.*d2<0 &

d1>0)+1;

if any(d==0)

imax = [];

imin = [];

bad = (d==0);

dd = diff([0 bad 0]);

debs = find(dd == 1);

fins = find(dd == -1);

if debs(1) == 1

if

length(debs) > 1

debs = debs(2:end);

fins = fins(2:end);

else

debs = [];

fins = [];

end

end

if length(debs) > 0

if fins(end)

== m

if length(debs) > 1

debs = debs(1:(end-1));

fins = fins(1:(end-1));

else

debs = [];

fins = [];

end end

end

lc = length(debs);

if lc > 0

for k =

1:lc

if d(debs(k)-1) > 0

if d(fins(k)) < 0

imax = [imax round((fins(k)+debs(k))/2)];

end

else

if d(fins(k)) > 0

imin = [imin round((fins(k)+debs(k))/2)];

end

end

end

end

if length(imax) > 0

indmax =

sort([indmax imax]);

end

if length(imin) > 0

indmin =

sort([indmin imin]);

end

end

end

%说明每个程序要单独保存成m文件,放在同一个文件夹下调用

使用实例:

x=@(t)

(2+cos(90*t).*cos(500*t+1800.*t.*t));

fs=5000;

t=0:1/fs:0.341;

y=x(t);

subplot(5,1,1);plot(t,y);xlabel('原始信号');

[pf,a,si]=lmd1(y);

subplot(5,1,2);plot(t,pf(1,:));xlabel('PF1');

subplot(5,1,3);plot(t,pf(2,:));xlabel('PF2');

subplot(5,1,4);plot(t,pf(3,:));xlabel('PF3');

subplot(5,1,5);plot(t,pf(4,:));xlabel('残量信号');

a4c26d1e5885305701be709a3d33442f.png

从上图可以看出,成功将第一个分量和第二个分量分离出来,但是残余分量存在很大的问题,这是因为分解过程中的骑行波没有去处导致的,至于怎样完善LMD局域均值分解算法,目前个人没有时间研究了,希望得到指点。

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

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

相关文章

php csrf攻击 xss区别,XSS与CSRF攻击及防御方法

前言web安全这词可能对于服务端工程师来说更加“眼熟”&#xff0c;部分前端工程师并不是十分了解&#xff0c;今天就来讲讲XSS攻击与CSRF攻击及防御方法XSSXSS (Cross Site Scripting)&#xff0c;即跨站脚本攻击&#xff0c;是一种常见于 Web 应用中的计算机安全漏洞。大部分…

matlab各个指令的含义,[MATLAB基础] 求解这段指令的意思,越详细越好,谢谢啦

求解这段指令的意思&#xff0c;越详细越好&#xff0c;谢谢啦 function [Kp,T2]KPCA(ax,ay)[Nx]size(ax);mean_X mean(ax);axbax;std_Xstd(ax);axax-mean_X(ones(Nx,1),:);std_X(find(std_X0))1;%数据预处理axax./std_X(ones(Nx,1),:);c10000;% gama0.05;% ni1;% F1ax(1,:);% …

php+js实现弹幕,jquery.barrager.js-专业的网页弹幕插件

jquery.barrager.js是一款专业的网页弹幕插件。它支持显示图片,文字以及超链接。支持自定义弹幕的速度、高度、颜色、数量等。能轻松集成到论坛,博客等网站中。由于IE9以下的IE浏览器不兼容CSS圆角,采用兼容样式,可单独设置弹幕的颜色,属性为old_ie_color,建议不要与网页主背景…

zend studio php 5.5,Zend Studio使用教程:在Zend Studio中调试PHP(5/5)

本教程将教会您如何调试文件和应用程序以便从您的PHP代码中获取最大的效率和准确性。Zend Studio的调试功能可以检查并诊断PHP代码在本地或远程服务器上的错误。调试器允许您通过设置断点、暂停启动的程序、单步调试代码和检查变量的内容来控制程序的执行。调试应该在您的脚本和…

oracle 安装乱码,linux安装Oracle中文乱码问题汇总

解决oracle中文显示乱码有三层地方需要调整或者修改第一层&#xff1a;操作系统层1.首先查看linux是否有安装中文字符集&#xff0c;locale -a2.设置用户的中文字符集查看到linux安装了中文字符集&#xff0c;那么oracle用户下面要设置中文字符集vi /etc/locale.conf # centos7…

php 路径有汉字,路径文字工具

大家可能会在视频上面看到一些不规则的字幕吧&#xff0c;比如&#xff1a;圆形、椭圆、波浪形等等&#xff0c;这些也叫做路径文字&#xff0c;就是在给视频添加字幕的时候&#xff0c;让文字按着自己描绘的路径来排列&#xff0c;这样就得到了路径文字。原理很简单&#xff0…

qq linux版本下载官网下载,腾讯QQ For Linux

安装帮助如何选择安装包&#xff1f;Linux QQ 目前支持x64(x86_64、amd64)、arm64(aarch64)、mips64(mips64el)三种架构&#xff0c;每种架构支持Debian系、红帽系、Arch Linux系、其它发行版中的一种或几种(未来可能继续扩充)。每一次发布均会提供架构和发行版的若干种组合支持…

linux ip隧道技术,linux之IP隧道配置

本文系统Centos6.0在这里我就不讲什么隧道、IP隧道技术了&#xff1b;lvs的三种模式也不说了我这里隧道说白了就是不同机房&#xff0c;不同公网IP&#xff0c;怎么让他们实现局域网的效果&#xff0c;配置同一网段的私网IP&#xff1b;可以实现互联互通&#xff1b;写这篇文章…

kali linux conky配置文件,7个美丽的Conky配置为您的Linux桌面 | MOS86

现在&#xff0c;大多数Linux用户非常熟悉Conky包括多少人都没有今天我们Note:其中一些不仅仅是一个习惯。conkyrc文件。许多都配有专门的字体或附加软件&#xff0c;有些则作为更大的桌面主题的一部分打包。此处列出的所有配置都提供了到原始下载位置以及每个包的链接此外&…

sd卡linux错误检测,android系统正在准备SD卡正在检测是否有错误且SD卡无法读取解决办法...

手机android系统&#xff0c;也许您会碰到这样的情况。错误提示&#xff1a;正在准备SD卡 正在检测是否有错误。这时sd卡(即内存卡)不能正常使用&#xff0c;不管手机自带的程序&#xff0c;还是通过usb口连接到电脑都无法识别sd卡。这可能是由于没有正常卸载sd卡导致的原因。比…

C语言顺序结构程序设计PPT,C语言习题集与实验指导 教学课件 伍鹏、杜红、王圆妹、邓绍金 第3章 顺序结构程序设计.pdf...

[摘要]第3章 顺序结构程序设计 第3章 顺序结构程序设计 当你对C语言程序设计有了一定了解和掌握后&#xff0c; 在处理一些简单的任务时&#xff0c;若想根据程序书写的过程 顺序执行程序&#xff0c;这时应该如何处理呢&#xff1f; •顺序结构 •顺序结构 程序的三种结构 程序…

three.js使用精灵模型Sprite渲染森林

效果&#xff1a; 源码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right&quo…

鸿蒙系统操作界面布局,华为鸿蒙操作系统大曝光

描述华为鸿蒙操作系统大曝光5月21日&#xff0c;华为消费者业务CEO余承东透露&#xff0c;面向下一代技术而设计的华为操作系统“鸿蒙”&#xff0c;最早将于今秋面市。而就在前天&#xff0c;环球时报(Global Times)发出推文表示&#xff1a;有消息人士称&#xff0c;华为正在…

android 高德获取省市,高德地图定位获取当前地址城市街道等详细信息(全部代码)...

自动定位后弹窗信息&#xff0c;包含省市县镇区路门牌号(效果图如下)代码↓↓↓获取地理位置var mapObj new AMap.Map(iCenter);mapObj.plugin(AMap.Geolocation, function () {geolocation new AMap.Geolocation({enableHighAccuracy: true, // 是否使用高精度定位&#xff…

鸿蒙系统新手教程,鸿蒙灭神决新手入门全流程图文攻略

鸿蒙灭神决新手入门全流程图文攻略2019-03-21 15:04:13来源&#xff1a;天天RPG编辑&#xff1a;野狐禅评论(0)中后期回归主题&#xff0c;如果还是打不过神器2&#xff0c;可以先到“中级挑战”这里完成第一排的四项挑战&#xff0c;可以获得四件道具。从这里开始由于我们刷木…

html添加工具栏,添加带有命令的工具栏 (HTML)

添加带有命令的工具栏 (HTML)03/04/2016本文内容[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发&#xff0c;请参阅 最新文档 ]ToolBar 是一个简单的控件&#xff0c;用于解决命令扩展问题。它具有一个 …

用计算机解决问题 评课稿,总结反思:二年级数学lbrack;解决问题rsqb;评课稿

二年级数学《解决问题》评课稿二年级数学《解决问题》评课稿今天上午听了一节二年级数学上册用加减混合的常识《解决问题》的课&#xff0c;受益匪浅。我觉得这节课是顺利的&#xff0c;有待我们学习跟借鉴。雷老师虽未年过五旬&#xff0c;但他不服老的敬业精神&#xff0c;以…

计算机信息科学蔺泽浩,上海交通大学计算机科学与工程系(CSE)

脑机交互的多模态疲劳驾驶检测系统本系统通过获取驾驶员的脑电信号(EEG)、眼电信号(EOG)、握力信号和Kinect图像&#xff0c;从生理信号和行为特征中提取与疲劳相关的特征&#xff0c;利用机器学习方法建立疲劳检测模型&#xff0c;实现驾驶员疲劳状态的度量与预测。与传统的基…

分布式认知在计算机应用系统,人机交互作业

1. 人机交互过程中人们经常利用的感知有哪几种&#xff1f;每种感知有什么特点&#xff1f;视觉感知、听觉感知、触觉感知三种。1)视觉感知特点&#xff1a;一方面&#xff0c;眼睛和视觉系统的物理特性决定了人类无法看到某些事物&#xff1b;另一方面&#xff0c;视觉系统进行…

word计算机桌面加密,如何给电脑的Word文件加密

如何给电脑的Word文件加密Word文件是我们在工作和生活中会频繁使用到的&#xff0c;采用适当的方法给需要保护的Word文件加密&#xff0c;可以确保信息安全。这里所讲的加密&#xff0c;是指以某种特殊的方法改变原有的信息数据&#xff0c;使得未经授权的用户即使获得了已加密…