EMD之包络线总结
首先我要说这个论坛真的很不错,高手云集,让我这个菜鸟也对EMD有了一定的认识。
我从众多的帖子里搜集到很多关于EMD包络线的资料,在这里想与大家分享一下,可能有的地方不是很准确,请各位版主多多批评指正。
大概有三种方法
1、在 emddec.m 里(具体在哪个帖子忘记了),求包络线(具体见关于某版本的EMD分解的疑问里的附件);
2、利用函数envelope_s(见下面附件),方法和1类似,但在有些信号中有区别(见附件),至于这些区别,我还没有
参透;
3、利用emd.m里自带的函数extr(关于emd.m请到http://free.ys168.com/?zhlong下载)
三种方法的比较
通过图形可知,extr函数形成的包络谱效果最好。
----------------------------
==============================
如何绘出多条抛射曲线以及它们的包络线?
抛射物体的运动可描述为平面上一个动点的轨迹,即抛射曲线,其参数方程为
其中g是重力加速度,动点初始速度为v0,发射角度为 。
当发射角度在区间 内变化时,不同发射角便形成不同曲线。由
解之,得弹落点所对应的参数值
所以,对发射角 ,参数 t的变化范围为[0,t0]。为了简化问题,取v0 = 1。下面程序段可绘制曲线簇中的n-2条曲线
n=input(’input n:’); 输入数据n,确定所绘曲线簇曲线数
alpha=(2:n-1)*pi/(2*n); 确定不同曲线所对应的发射角
for k=1:n-2 开始计算n-2条曲线上的离散点数据
a=alpha(k); 选取 的值
v1=cos(a);v2=sin(a); 计算初始速度分量
t0=v2/4.9;
t=(0:16)*t0/16; 确定参数值
x(k,:)=v1*t;y(k,:)=v2*t-4.9*t.^2; 确定曲线上离散点坐标数据
end
plot(x',y') 同时绘出曲线簇中n-2条曲线
运行上面程序,输入 n = 20 则可以绘出图3-3中的18条曲线。
图 3-3 不同发射角形成的抛射线簇
不同发射角所形成的抛射线构成一曲线簇,如果存在一条曲线L,曲线簇中每一曲线都与L相切,则称L为该曲线簇的包络。对于参数方程,曲线族的包络曲线由
消去参变量 而得到。在上面抛射线族的包络曲线中
由
即 。求解得
代入曲线族的参数方程,便得包络曲线的参数方程为
下面程序段将绘制出曲线簇的包络曲线(又称为安全抛物线)。
g=9.8;
t=1/g:.001:sqrt(2)/g;
x=sqrt(t.^2-1/g^2);
y=1/g-.5*g*t.^2;
plot(x,y)
图3-4 曲线簇及其包络
===================================
===================================
一种有效的包络线算法
http://www.chinavib.com/forum/thread-32967-1-1.html
代码:
function [up,down] = envelope(x,y,interpMethod)
%ENVELOPE gets the data of upper and down envelope of the known input (x,y).
%
% Input parameters:
% x the abscissa of the given data
% y the ordinate of the given data
% interpMethod the interpolation method
%
% Output parameters:
% up the upper envelope, which has the same length as x.
% down the down envelope, which has the same length as x.
%
% See also DIFF INTERP1
% Designed by: Lei Wang, <WangLeiBox@hotmail.com>, 11-Mar-2003.
% Last Revision: 21-Mar-2003.
% Dept. Mechanical & Aerospace Engineering, NC State University.
% $Revision: 1.1 $ $Date: 3/21/2003 10:33 AM $
if length(x) ~= length(y)
error('Two input data should have the same length.');
end
if (nargin < 2)|(nargin > 3),
error('Please see help for INPUT DATA.');
elseif (nargin == 2)
interpMethod = 'linear';
end
% Find the extreme maxim values
% and the corresponding indexes
%----------------------------------------------------
extrMaxValue = y(find(diff(sign(diff(y)))==-2)+1);
extrMaxIndex = find(diff(sign(diff(y)))==-2)+1;
% Find the extreme minim values
% and the corresponding indexes
%----------------------------------------------------
extrMinValue = y(find(diff(sign(diff(y)))==+2)+1);
extrMinIndex = find(diff(sign(diff(y)))==+2)+1;
up = extrMaxValue;
up_x = x(extrMaxIndex);
down = extrMinValue;
down_x = x(extrMinIndex);
% Interpolation of the upper/down envelope data
%----------------------------------------------------
up = interp1(up_x,up,x,interpMethod);
down = interp1(down_x,down,x,interpMethod);
使用例子:
代码:%DEMOENVELOPE shows how to use function envelope to obtain the
% upper/down envelope of a given data and plot the envelope.
%
% See also EVELOPE
% Designed by: Lei Wang, <WangLeiBox@hotmail.com>, 11-Mar-2003.
% Last Revision: 21-Mar-2003.
% Dept. Mechanical & Aerospace Engineering, NC State University.
% $Revision: 1.1 $ $Date: 3/21/2003 10:38 AM $
clc;
% Load a signal waveform
%--------------------------------------------
load data.txt data;
t = data(:,1); % time series
y = data(:,2); % signal data
figure(1);
plot(t,y,'b-');
title('The original signal waveform','FontSize',18);
% Call function envelope to
% obtain the envelope data
%--------------------------------------------
[up,down] = envelope(t,y,'linear');
% Show the envelope alone
%--------------------------------------------
figure(2)
plot(t,up); hold on;
plot(t,down);
title('The envelope of the given signal data','FontSize',18);
hold off;
% Show the original signal and its envelope
%--------------------------------------------
figure(3)
plot(t,y,'g-'); hold on;
plot(t,up,'r-.');
plot(t,down,'r-.');
title('The envelope vs the given signal data','FontSize',18);
hold off;
附件
例子所需的数据.txt (22.59 KB)
-------------------------------
这个方法事实上和EMD算法中的迭代求出各IMF时所用的包络是一致的,不过我对包络的理解是先把复杂信号通过EMD分解得到单分量信号,然后再把其频率部分(无论用解析信号的方法还是别的什么方法)分离出来,剩下的就是包络。happy你提供的程序是对任意信号(无论是复杂信号还是单分量信号)直接通过极值点求出它的样条包络,事实上,包络这个词用在此是不准确的,数学上的包络前提条件是要有一个给定的函数集,然后在里面求出满足某个条件的一个函数,这才是包络
----eghit
===============================
================================
关于包络概念的理解
http://www.chinavib.com/forum/thread-33208-1-1.html
看到大家经常提到"包络:这个概念, 好象SKF 有"加速度包络" 更让人摸不着头脑,希望有高人指点!谢谢!
------------------------
加速度包络是SKF的专利技术,
------------------------
加速度包络是一种信号处理技术,这种技术能够检测到很弱的冲击故障信号,比如轴承的早期损伤。它可以将非常弱的冲击信号经过一系列的放大、滤波等处理转变成高频的振动信号。
------------------------
包络解调原理:故障所引起的低频(通常是数百HZ以内)冲击脉冲激起了高频(数十倍于冲击频率)共振波形,对它进行包络、检波、低通滤波(即解调),会获得一个对应于低频冲击的而又放大并展宽的共振解调波形。
-------------------
包络解调的优点:
1)剔除了低频振动干扰
2)含有未知的故障信息(即S/N↑)
对于共振解调波后续处理方法不同,可分为SPM及IFD法
1)SPM法:
它是应用共振解调波的幅值来进行诊断。共振解调波通过峰值检波、平均、保持、测得冲击量值SV。
再用一经验公式获得均一化冲击量值
DBN=20log*2000*SV/n*Do.6
2) IFD法
该法既应用共振解调波的幅值又利用它的频率信息,即对共振解调波进行FFT后做频谱分析,寻找上节中提到的轴承各元件故障对应的频率。
包络都是针对加速度说的,加速度才存在高频。
我不知道SKF有没有专利,只知道现在不止一家有高频包络,只是各家的包络值没有统一的标准、定义,测出来的数据也不一样。
加速度高频包络值对轴承齿轮的早期磨损等故障敏感,判断准确。
------------------------
包络分析的关键词:高频、共振、解调。
---------------------
共振解调法,也称包络检波频谱分析法,包络检波实现的方法有检波滤波,Hilbert变换法。前者没有接触过,但后者我了解一点,据我所知,基于 Hilbert 变换的包络谱分析,好像对滚动轴承的裂纹故障并不敏感,很难从其图谱中找到与裂纹故障相对应的特征频率。而且共振区的中心频率很难找到,选取合适的带通滤波器,是应用共振解调法成功的关键
-----------------------
我想请教大家,现在处理齿轮或者轴承故障 一些最新的处理方法是什么?我看了很多文献,都是和包络谱相关,除了解调 就没有更新的吗?
-----------------
加速度包络 SPM
-----------------
----------------
==================
==================
如何在matlab中实现包络分析
如何在matlab中实现包络分析!大虾们尽量说的具体点!
------------------
普通情况下(针对不对称函数),可使用hilbert方法,如包络谱=abs(hilbert(x));求的是上包络,针对不对称函数可用,针对对称函数频率翻倍
-------------------
====================
====================
小波与hilbert变换进行信号包络谱分析
这是我自己搞的一个仿真信号用小波与hilbert变换进行信号包络谱分析的程序
大家看一下,给点意见啊。我是结合书上的编的,有几个地方一直不懂,
1,许多论文上说hilbert变换是这样进行的:原始信号X(t)带通滤波,进行hilbert变换得到x^(t),作为虚部, 然后用w(t)=x(t)+jx^(t)作为解析信号。包络谱的求法是:a(t)=X(t)和x^(t)的平方和再开放.但是这个程序里面怎么没有这个功能??
2,plot((0:nfft/2-1)/nfft*fs,p(1:nfft/2));这句程序有点难懂,麻烦哪位编程高手解释一下
t=0:0.005:1*pi;
fs=10000;
s=4*sin(2*200*pi*t).*(sin(2*4500*pi*t))+25*(sin(2*4500*pi*t));
subplot(411);plot(t,s)
[c,l]=wavedec(s,1,'db10');
d1=wrcoef('d',c,l,'db10');
a1=0;
subplot(412);plot(d1);title('重构高频信号');
y=hilbert(d1);
y1=abs(y);
ydata=y-mean(y);
nfft=1024;
p=abs(fft(y1,nfft));
figure(2);
plot((0:nfft/2-1)/nfft*fs,p(1:nfft/2));
xlabel('频率');
ylabel('功率谱');
--------------------------
1、你的程序中小波分解实现了上面说的滤波功能,而hilbert这个函数就是求上面说的w(t).
2、这个可以看一下有关“如何正确得到Fourier分析幅值”的帖子。
--------------------------
我觉得程序应该是这样的
s=data;
plot(s);
hold on
[c,l]=wavedec(s,2,'db10');
d1=wrcoef('d',c,l,'db10');
y=hilbert(d1);
y1=imag(y).^2;
w=sqrt(d1.^2+y1)
y2=abs(w);
plot(w,'r-')
figure(2);
plot(y2);
p=abs(fft(y2,10000));
figure(3);
plot(p);
xlabel('频率');
ylabel('功率谱');
不知大家有何看法??
是对还是错??
--------------------------
引用:
原帖由 wxk8000 于 2008-1-9 16:05 发表
原始信号X(t)带通滤波,进行hilbert变换得到x^(t),作为虚部,
然后用w(t)=x(t)+jx^(t)作为解析信号。包络谱的求法是:a(t)=X(t)和x^(t)的平方和再开方。
楼主程序中的这两语句
y=hilbert(d1);
y1=abs(y);
便是完成把滤波后的信号进行hilbert变换得到x^(t),作为虚部,然后用w(t)=x(t)+jx^(t)作为解析信号。包络谱的求法是:a(t)=X(t)和x^(t)的平方和再开方。
引用:
原帖由 wxk8000 于 2008-1-9 16:05 发表
plot((0:nfft/2-1)/nfft*fs,p(1:nfft/2));
((0:nfft/2-1)/nfft*fs是计算FFT后频谱各谱线对应的(正)频率值,而p(1:nfft/2)是包络谱的谱线值。
----------------------------
刚才看了下matlab的帮助文件,谈谈我的看法:
1、matlab中的y=hilbert(x)命令虽然字面上是hilbert变换,实际上得到的复数序列y的虚部才是真正的原信号x的hilbert变换,实部就是原信号x,所以经y=hilbert(x)得到的就是原序列的解析信号,没必要再求其虚部等等。帮助文件原文:
Description:x=hilbert(xr) returns a complex helical sequence, sometimes called the analytic signal, from a real data sequence. The analytic signal x = xr + i*xi has a real part, xr, which is the original data, and an imaginary part, xi, which contains the Hilbert transform.
2、本人对于包络谱的算法也一直弄不明白,但看到楼上几位的说法:“用w(t)=x(t)+jx^(t)作为解析信号。包络谱的求法是:a(t)=X(t)和x^(t)的平方和再开方。”,感觉还是有问题。如果只是求解析信号的实部和虚部平方和,得到的仍然只是时域的变换信号,又谈的上什么“谱”的概念呢?我的理解是:对解析信号再做FFT得到的也许才是包络谱(实际上wxk8000兄的程序里已经这样做了)。不过这样做和直接对原信号做FFT有何区别,本人也不清楚,期待高人指点。
---------------------------
我是初学者,看大家都很牛的样子,有点基本的问题想讨教,边际谱和功率谱是一回事吗?还有能量谱这些都有什么区别,有点晕了?
--------------------
边际谱和功率谱是不一样的,边际谱是Hilbert变换以后再求得的,功率谱一般是FFT求得
--------------------
文章评论(0条评论)
登录后参与讨论