科学网

 找回密码
  注册

tag 标签: 瞬时频率估计

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

39、(八)圆满收官_基于IMF自身的瞬时频率估计
baishp 2012-12-2 15:16
39、(八)圆满收官_基于IMF自身的瞬时频率估计
在上篇博文的图38-14中,很容易看到,对应于原信号的每一个切点处,瞬时频率都有一个小小的突变。放大x轴,可以看到突变范围都在切点及切点左右各一点共3点内。从图38-11、图38-15中可以看得很清楚。这是由于反余弦函数在1、-1点处的高度非线性造成的,当然属于信号处理过程中所产生的“虚假信息”,而不是信号本身所含有的信息。本人既然号称要追求连续光滑的瞬时频率估计,那就要一不做二不休,精益更求精。线性插值后,图38-14、图38-15的变化见下面图39-1、图39-2。 图39-1 图39-2 在运行各列信号进行瞬时频率估计时,忽然发现有一列信号的瞬时频率右端部有很大的突变,见图39-3、图39-4。这显然是一种端点效应。 图39-3 图39-4 我已经做了信号延拓工作,为什么还有端点效应呢?我的信号延拓是在综合振幅(综合切包络线)函数comprehensive_amplitude( x )中进行的,输出时截断至原信号长度。在瞬时频率估计中就没再做信号延拓。估计就是这个原因造成的。于是取消函数comprehensive_amplitude( x )中的信号延拓,改在瞬时频率估计程序中进行。最终的结果见下图,端点效应没有了。 图39-5 但是在另一列信号中,信号延拓位置的改变,对瞬时频率的端点效应的影响却不是太大。见图39-6、图39-7、图39-8。 图39-6 图39-7 图39-8 这个我分析是信号延拓的“质量”不好,在原信号与延拓信号的连接处不够光滑造成的。在博文 《34、(四)信号延拓_基于IMF自身的瞬时频率估计》的 “2、调用上述函数,并将待分析的IMF原函数左、右两个端点分别“混入”上面左、右极值点中”中, 只采用了左、右两个端点作为样条插值函数中的已知数据点。现在将原信号左右端部各3点共6点作为样条插值函数中的已知数据点,进行信号延拓。使用此信号延拓函数进行的瞬时频率估计,结果见下图。可见端点效应已经最大程度地被抑制了。下药对症! 图39-9 至此,程序运行中所能碰到的所有问题都已解决。当然,无法百分百地保证将来不会碰到任何新问题,但至少目前已经顺利运行了几十列信号,都没有问题。将程序以文件名instantaneous_physical(瞬时物理量)保存为函数文件。调用格式 = instantaneous_physical( x ) 中,输入x是单分量IMF,输出tamp是瞬时振幅,tf是瞬时频率,phase是瞬时相位,y是复信号虚部。 需要说明的一点是,这里由x、y组成的复信号x+j*y是所谓基带信号,不再是解析信号了。只要有了一列IMF,等于同时拥有了与之对应的瞬时振幅、瞬时频率、瞬时相位与基带信号。这个方法,从技术层面上来讲,信号信息的损失几近于0。如果结果不够准确,其原因也大多产生在信号处理的其它阶段。 将此函数代替《32、(二)时频连续_基于IMF自身的瞬时频率估计》程序中的函数 = afyimf( x ),所得各IMF分量瞬时频率如下4图: 图39-10 imfMBrd各分量瞬时频率 图39-11 imfMBrd各分量瞬时频率 图39-12 imf_TW486012各分量瞬时频率 图39-13 imf_TW486012各分量瞬时频率 可见瞬时频率曲线较《32、(二)时频连续_基于IMF自身的瞬时频率估计》中曲线光滑得多。 基于IMF自身的瞬时频率估计现在完成了,心中有点感叹。这个方法,道理很简单,为什么没有人做?我觉得主要是人们思维习惯造成的。几十年来,Hilbert先生对人们的影响实在是太大了,一提到瞬时频率,几乎无人不立刻想到Hilbert变换、解析信号等。连思想极其活跃开放的黄院士,一发明EMD,便立刻将其与之挂上了钩,提出了HHT。虽然信号处理基本理论已经说明,解析信号的主要作用是用来作数学分析,实际得到它是很困难的。matlab中的hilbert()函数,我觉得主要是用来求高频窄带信号的解析信号,对低频信号,所求得的解析信号是很不准确的。而EMD,要将原信号分解到最低频的频率分量。因此,用解析信号法求各IMF的瞬时频率,先天理论上就有缺陷。 有了本人所编的instantaneous_physical程序,HHT这个名词可以送进历史博物馆了。要不就改成HBT吧,让俺“蚂蟥叮上鹭鸶腿”,也尝尝名扬天下的滋味,哈! (本文首发于: http://blog.sina.com.cn/s/blog_6ad0d3de01017b3r.html 首发时间:2012-07-11 23:22:57)
个人分类: 斤斤计较|3583 次阅读|0 个评论
38、(七)相应问题_基于IMF自身的瞬时频率估计
baishp 2012-12-2 13:57
38、(七)相应问题_基于IMF自身的瞬时频率估计
将综合切包络线代替《31、(一)根本思路_基于IMF自身的瞬时频率估计》的(分段)极点包络线,将遮掩码c12、c34原来由IMF差分函数求取,改为由络基信号(IMF减去包络线所得信号)差分函数求取。所有的信号都可以顺利运行。见图37-1、图37-2。后者第3个子图瞬时频率,已经没有因为IMF与极点包络线相割造成的突变了。分析信号为imfMBrd第11分量。 图38-1 图38-2 用切包络线代替极点包络线,产生的一个最大问题是:在两个相邻过零点之间,可能存在两个(或以上。理论如此,实际未见过)切点,而不像极点包络线那样只存在一个极值点。两个切点之间必定有一个络基极值点(络基信号除切点外的极值点)。以这3个点为界限,形成信号源在1、4或2、3两个象限交替出现的现象。见图37-3。我称之为“象限交访”现象吧。 图38-3 即使只有一个切点,但仍然可能存在络基极值点。见图37-4、图37-5。它对信号处理的影响,与两个切点是一样的。 图38-4 图38-5 上面3图中,络基极值点处瞬时频率的突变,见下图。 图38-6 处理方法:通过对遮掩码的特别赋值,将上述情况下,两个相邻过零点之间划分为仅仅两个象限。切点数为两个时,以络基极值点为界限;切点数为一个时,以切点为界限。见图37-7、图37-8、图37-9。 图38-7 图38-8 图38-9 经过上述处理后,包括上面3个络基极值点在内的各络基极值点处的瞬时频率突变基本上消失了。见图37-10。上面图37-7中的络基极值点处的瞬时频率见图37-11。 图38-10 图38-11 但是在某些特别情况下,络基极值点处的瞬时频率突变还是很大的。见图37-12、图37-13。不过经过许多信号的运行,发现只有一个切点时,络基极值点处瞬时频率突变都很小,基本可以忽略。 图38-12 图38-13 处理:强令信号与切包络线在两个切点之间的值相等,即令余弦值等于1(1、4象限)或-1(2、3象限)。此举是将信号源看成是在沿实轴运动,相位恒等于0(2*pi)或pi,瞬时频率恒等于0。见图37-14。 图38-14 图37-7中络基极值点处、两个切点之间的瞬时频率如下图: 图38-15 至此,因使用综合切包络线作振幅所产生的最大的“问题”处理完毕。不过我对这样的处理方式是存有疑虑的。从道理上来讲,信号处理,需要尽量保存信号本身所含有的信息,而尽量减少因信号处理方式不当所造成的虚假信息。但实际上这二者往往难以区分。在物理实际中,信号源的“象限交访”现象肯定是存在的。在本文中,即使它是“因信号处理方式不当所造成的虚假信息”,那也是上一阶段的信号处理方式(EMD)所遗留下来的。是不是应该在上一阶段的信号处理中采取某种统一的措施来消除它,而不应该在本阶段中采取“头痛医头脚痛医脚”的方式进行处理呢? 还有几个次要问题下篇再谈。 (本文首发于: http://blog.sina.com.cn/s/blog_6ad0d3de010178yi.html 首发时间:2012-07-09 20:33:18)
个人分类: 斤斤计较|3931 次阅读|0 个评论
36、(六)四种包络_基于IMF自身的瞬时频率估计
baishp 2012-11-30 16:37
36、(六)四种包络_基于IMF自身的瞬时频率估计
上篇博文谈“切包络线”,文末用此“切包络线”求了信号“切包络线综合振幅”。但那个方法是未经过深思熟虑的方法、经过几次实际运行,就知道是不行的。原因在于:当信号为低频IMF时,信号取绝对值后,原极大值仍是极大值,原极小值变成极大值;但当信号为高频IMF、特别是那种在两个极值点之间振荡的IMF时,情况就不一样了。信号取绝对值后,极大值不一定还是极大值,极小值也不一定变成极大值。见图36 -1。 图36 -1 既然极值点的极值属性都不能得到保障,那么以极点包络线为基础求切包络线,当然就行不通了。那个方法既然已经写成博文,就不删除了,作为研究历程保留放那吧。 下面是求“综合切包络线”(即“切包络线综合振幅”)可行的方法步骤: 1、将信号两端延拓; 2、求延拓后信号极大、极小值点; 3、将上述极小值点取绝对值,并与极大值“混编、排序”,得信号“综合极值点”。 4、对上述“综合极值点”作样条插值,得“综合极点包络线”,它也是信号“上综合极点包络线”。本博中二名词含义相同。 5、将上述“综合极点包络线”取负,得“下综合极点包络线”。 6、将信号分别减去“上、下综合极点包络线”,分别得上、下“络基信号”; 7、分别求上下“络基信号”的极大值与极小值; 8、分别去除上述极大值与极小值点中,小于、大于“上、下综合极点包络线”的极大值与极小值,剩下来的极大值与极小值,就是阶段性上下切点; 9、将上述阶段性下切点代替上面步骤“3”中的极小值点,上切点代替极大值点,重复至步骤“8”; 10、将“步骤8”所得阶段性上下切点,与上次所得阶段性上下切点进行比较。如果不完全相同,则重复步骤“9-3-4-5-6-7-8”;如果完全相同,则停止循环; 11、将步骤“8”最后所得上、下切点对应的“综合切点包络线”,截去两端延拓部分,就是最后得到的信号的“综合切包络线”。 12、去除最后步骤“8”所得上、下切点中,位于信号两端延拓部分中的上下切点,剩下来的就是原分析信号上下切包络线的上、下切点。 根据上面算法编制程序 = comprehensive_amplitude( x ) x是待分析输入IMF,输出tenvb,tenva,tpoib,tpoia分别为“下综合切包络线”、“上综合切包络线”、“下切点”、“上切点”。 作图看看: x=imfMBrd(1,:), = comprehensive_amplitude( x ); (为作图方便,上面输出全部临时改为截去信号延拓部分之前对应的变量。) %下面是为了绘图而重复运行上面函数内指令 = signal_extension(x); lxr= ; ltr= ; llxr = length(lxr); ttt=1:llxr; zs=zeros(1,llxr); = extr(lxr);% %上面是为了绘图而重复运行 fg1=figure(1); set(fg1,'position', ) set(gca,'position', ); plot(t,x) hold on% plot(tl,xl,'r-')% plot(tr,xr,'r-')% plot(ltr,tenva,'k--')% plot(ltr,tenvb,'k--')% plot(indmin+tl(1)-1,lxr(indmin),'ko')%% plot(indmax+tl(1)-1,lxr(indmax),'ko')%% plot(tpoib+tl(1)-1,lxr(tpoib),'.k')% plot(tpoia+tl(1)-1,lxr(tpoia),'.k')% plot(ltr,zs,'k-.') axis( )% title('imfMBrd之1分量延拓后综合切包络线及其切点、极值点') 运行,得: 图36 -2 x=imfMBrd(i,:),分别再令i=4、7、10、13,并改变坐标轴显示范围,重复运行上面的程序,作图如下。这次将功折罪,多运行几列信号,多截几张图吧。 图36 -3 图36 -4 图36 -5 图36 -6 可见包络线都没有问题,既与信号相切,又严格对称。 至此,我们已经知道了,对信号可以作出4种包络线。分别简述如下: 1、极点包络线,或称“极值点包络线”,简称“包络线”,就是传统的、EMD当中用来进行迭代运算求取IMF的包络线。适用于任意信号。 2、综合极点包络线,或称“综合极值点包络线”,就是在我的博文“33、(三)综合极点_基于IMF自身的瞬时频率估计”文末求取过的包络线。它将大小极值点统一取绝对值后,再作样条插值求包络线。当时把它叫“综合振幅”或“综合包络线”,现在看来这样叫不够准确。它只适用于IMF。 3、切包络线,或称“切点包络线”。就是上篇博文中所求包络线。适用于任意信号。 4、综合切包络线,或称“综合切点包络线”。由于它就是我所要求的IMF瞬时振幅,,所以我以后也可以把它叫做“切包络线综合振幅”,或简称“综合振幅”、“IMF瞬时振幅”。它只适用于IMF。 关于信号包络线问题就研究到这里。后面该用它来求信号瞬时频率了。 (本文首发于: http://blog.sina.com.cn/s/blog_6ad0d3de0101700a.html 首发时间:2012-06-30 13:47:40)
个人分类: 斤斤计较|4756 次阅读|0 个评论
35、(五)切包络线_基于IMF自身的瞬时频率估计
热度 1 baishp 2012-11-30 15:32
35、(五)切包络线_基于IMF自身的瞬时频率估计
各位博友:端午节快乐!粽子飘香,亲情满堂! 言归正传。求IMF“切包络线”方法步骤如下: 1、将信号两端延拓; 2、求延拓信号极大、极小值点; 3、根据上述极大、极小值点求信号上下极点包络线; 4、将信号分别减去上下极点包络线,分别得上下“络基信号(我创立的名词,表示以包络线为0基线的信号)”; 5、分别求上下“络基信号”的极大值与极小值; 6、分别去除上述极大值与极小值点中,小于、大于上下包络线的极大值与极小值,剩下来的极大值与极小值,就是阶段性上下切点; 7、分别对上述阶段性上下切点作样条插值,所得插值函数为阶段性上下切包络线; 8、将上述阶段性上下切包络线代替上面步骤“4”中的上下极点包络线,重复至步骤“6”; 9、将步骤“6”所得阶段性上下切点,与上次所得阶段性上下切点进行比较。如果不完全相同,则重复步骤“7-8-4-5-6”;如果完全相同,则停止循环; 10、将步骤“7”最后所得插值函数,截去两端延拓部分,就是最后得到的信号的上下切包络线。 11、去除步骤“6”最后所得上下切点中,位于信号两端延拓部分中的上下切点,剩下来的就是原分析信号上下切包络线的上下切点。 上面只是大概的步骤,有些细节问题就不列出了。如果分析信号不是IMF,而是任意信号,那就还有更多的细节问题需要处理。 由于IMF切包络线在接近“0”时,其对称性不总是太好(见图35-1、图35-2),当时我还没有想到信号取绝对值的方法,就总是想到用切包络线代替EMD中的极点包络线进行迭代运算,以期得到更加对称的切包络线(真是一念之差,绕城十匝)。而且感觉用切包络线代替极点包络线似乎更加合情合理:包络线嘛,就应该尽量将信号包络起来才对,否则包络一部分,留一部分在外面,那就不是完全的包络线了。用切包络线代替极点包络线,最终所得的IMF可能更加合符实际情况,产生虚假IMF的可能性也许会更小,IMF的正交指数也可能会更小。 所以我编了求任意信号上下切包络线的程序t angent_e nvelope(实际效果见图35-3),并且将它代替emd程序中的极点包络线进行了迭代运算。虽然现在好几列信号的运行都已经通过,但运行时间需增加几十倍,而且 这些信号序列数据都较短(10000点以下)。所以我现在还无法评价它的性能较既有EMD程序的优劣性。 绘图看看。所编tangent_envelope函数格式: =tangent_envelope(x) 输出tenvb,tenva,tpoib,tpoia分别是分析信号x的下、上切包络线;下、上切点。tangent_envelope内部未对x作延拓处理。 下面是IMF上下切包络线某局部接近0值时的情况: x=imfMBrd(4,:); =tangent_envelope(x); = extr(x);% lx=length(x); zs=zeros(1,lx); fg1=figure(1);% set(fg1,'position', ) set(gca,'position', ); plot(x,'r-') hold on% plot(tenvb,'b--')%下切包络线 plot(tenva,'b--')%上切包络线 plot(zs,'k-.')% plot(tpoib,x(tpoib),'k.')%下切点 plot(tpoia,x(tpoia),'k.')%上切点 plot(indmin,x(indmin),'ko')%极小值点 plot(indmax,x(indmax),'ko')%极大值点 xlim( ) title('imfMBrd的4分量上下切包络线及其切点、极值点') 运行,得: 图35-1 图35-2 可见IMF切包络线在接近“0”时,其对称性不总是太好。图中是选了比较极端的情况,一般情况下其对称性当然没有这么差。 将上面程序中的x=imfMBrd(4,:)换成任意信号x=MB2917_rd,修改一下绘图句柄、x轴显示范围,运行,得: 图35-3 从上图来看,在EMD中用“切包络线”代替“极点包络线”进行求取IMF的迭代运算,似乎更加“合情合理”。 上面两图只是看看数据中部局部情况,故分析信号未作延拓。下面看看求整个IMF“切包络线综合振幅”的情况: x=imfMBrd(13,:); = signal_extension(x); lxr= ; ltr= ; abslxr=abs(lxr); absxl=abs(xl); absx=abs(x); absxr=abs(xr); = extr(abslxr); =tangent_envelope(abslxr); tenval=tenva(1:length(tl)); tenvam=tenva(length(tl)+1:length(tl)+length(t)); tenvar=tenva(length(tl)+length(t)+1:length(tl)+length(t)+length(tr)); llxr = length(lxr); zs=zeros(1,llxr); fg3=figure(3); set(fg3,'position', ) set(gca,'position', ); plot(t,absx) hold on% plot(tl,absxl,'r-')% plot(tr,absxr,'r-')% plot(ltr,tenva,'k--') plot(indmax+tl(1),abslxr(indmax),'ko')%% plot(tpoia+tl(1),abslxr(tpoia),'.k') plot(ltr,zs,'k-.') axis( ) title('imfMBrd之13分量延拓并取绝对值后上切包络线及其切点、极值点') 运行,得: 图35-4 “切包络线综合振幅”情况良好。续谈。 (本文首发于: http://blog.sina.com.cn/s/blog_6ad0d3de01016two.html 首发时间:2012-06-22 22:49:20)
个人分类: 斤斤计较|4317 次阅读|2 个评论
34、(四)信号延拓_基于IMF自身的瞬时频率估计
baishp 2012-11-30 15:24
34、(四)信号延拓_基于IMF自身的瞬时频率估计
关于IMF原信号与其包络线相割的问题,解决之道当然就是求取与与原信号相切的包络线(以后可称之为“切包络线”),这是能够做到的。为了同时解决瞬时振幅在信号过零点处的阶梯突变,可以将原信号取绝对值之后,再求其切包络线(只求信号上部一条包络线)。 为了解决端点效应,求极点包络线时需要先将信号极值点向两端外面延拓。求切包络线时则需先将整个信号数据向两端外面延拓。这个工作比极点延拓稍微麻烦一点,因为延拓部分既要包含延拓极值点,又要与原信号的端点连接是连续、大致光滑的(至少不要变成新极值点了)。 步骤如下: 1、将极值点延拓函数 = boundary_conditions(indmin,indmax,t,x,z,nbsym) 的输出tmin,tmax,zmin,zmax改为: = boundary_conditions_lr(indmin,indmax,t,x,z,nbsym)。 上面输出tlmin,tlmax是左延极小值、极大值点时间序号,zlmin,zlmax是相应函数值;trmin,trmax是右延极小值、极大值点时间序号,zrmin,zrmax是相应函数值。将原函数名改一下(boundary_conditions_lr)保存。 2、调用上述函数,并将待分析的IMF原函数左、右两个端点分别“混入”上面左、右极值点中; 3、将包括上述“混入”点在内的左延极小值、极大值点时间序号,统一按从小到大顺序排序,并保持对应的函数值跟随排序。同样原则处理右延部分; 4、将上述左延点作样条插值,输出的插值函数时间区段,为左延点最小时间序号点更左一个采样点,至原信号左端点时间序号更左一个采样点(即“0”)。同样原则处理右延部分; 5、令上述所得左延插值函数最左边一点的函数值,等于左边第3点函数值。此举是为了保证左边第2点(原函数极值点延拓而来)仍为极值点。同样原则处理右延部分; 信号延拓完成。特别说明一下,本延拓方法适用于任意信号,不局限于IMF。 根据上述步骤所编程序,函数文件名存为signal_extension,调用格式为 = signal_extension(x)。其 tl,t,tr分别为左延信号、原信号、右延信号时间序号。 xl,x,xr分别为左延信号、原信号、右延信号函数值。 绘图: x=imfMBrd(11,:); = signal_extension(x); lxxx = length(xl)+length(x)+length(xr); zs=zeros(1,lxxx); %下面是为了绘图而重复运行 = extr(x); t=1:length(x); z=x; nbsym=2; = boundary_conditions_lr(indmin,indmax,t,x,z,nbsym); %上面是为了绘图而重复运行 fg1=figure(1); set(fg1,'position', ) set(gca,'position', ); plot(t,x) hold on% plot(tl,xl,'r-') plot(tr,xr,'r-') plot( ,zs,'k--') plot(indmin,x(indmin),'ko') plot(indmax,x(indmax),'ko') plot(tlmin,zlmin,'ko')% plot(tlmax,zlmax,'ko')% plot(trmin,zrmin,'ko')% plot(trmax,zrmax,'ko')% grid title('imfMBrd之11分量左右延拓及其极值点 ') 运行,得: 图34-1 将x换成一个IMF高频分量再看看: x=imfMBrd(3,:); = signal_extension(x); lxxx = length(xl)+length(x)+length(xr); zs=zeros(1,lxxx); %下面是为了绘图而重复运行 = extr(x); t=1:length(x); z=x; nbsym=2; = boundary_conditions_lr(indmin,indmax,t,x,z,nbsym); %上面是为了绘图而重复运行 fg2=figure(2); set(fg2,'position', ) li=1; lj=2; for i=1:li for j=1:lj n=(i-1)*lj+j; s(n)=subplot(li,lj,n); set(s(n),'position', ); plot(t,x) hold on% plot(tl,xl,'r-')% plot(tr,xr,'r-')% plot( ,zs,'k--')% plot(indmin,x(indmin),'ko')% plot(indmax,x(indmax),'ko')% plot(tlmin,zlmin,'ko')% plot(tlmax,zlmax,'ko')% plot(trmin,zrmin,'ko')% plot(trmax,zrmax,'ko')% grid if j==1 xlim( ) title( )% else j==2 xlim( ) title( )% end end end 运行,得: 图34-2 将x换成一个非IMF分量MB2917_rd看看。只将上图程序绘图句柄及时轴显示区限xlim改一下就可以了。 运行,得: 图34-3 信号边界延拓完成。后篇续谈。 (本文首发于: http://blog.sina.com.cn/s/blog_6ad0d3de01016qx7.html 首发时间:2012-06-19 22:35:46)
个人分类: 斤斤计较|2884 次阅读|0 个评论
33、(三)综合极点_基于IMF自身的瞬时频率估计
baishp 2012-11-30 14:59
33、(三)综合极点_基于IMF自身的瞬时频率估计
将脉搏序列基本模式函数imfMBrd第10分量的瞬时振幅、瞬时频率、复信号虚部再作几张放大、对比图: (1)IMF原信号及其复信号虚部: x=imfMBrd(10,:); = extr(x);%求极值点、 = cenvelope(x,1);%求包络线 envb=env(1,:);%将负包络线提取出来 enva=env(2,:);%将正包络线提取出来 lx=length(x); zs=zeros(1,lx); = afyimf( x ); fg1=figure(1); set(fg1,'position', ) set(gca,'position', ); plot(x,'r-') hold on plot(envb,'k--') plot(enva,'k--') plot(envmoy,'k:') plot(y,'b-') plot(zs,'k-') grid title('imfMBrd 10分量及其复信号之虚部 ') xlim( ) 运行,得: 图33-1 fg2=figure(2); set(fg2,'position', ) set(gca,'position', ); plot(x,'r-') hold on plot(envb,'k--') plot(enva,'k--') plot(f*150,'b-')%f*150是为了放大好对比观察 plot(zs,'k-') grid title('imfMBrd 10分量瞬时频率突变位置分析') xlim( ) 运行,得: 图33-2 fg3=figure(3); set(fg3,'position', ) set(gca,'position', ); tt=6500:7500; stem3(tt,f(tt),a(tt));%hold on view(-15,30) grid on title('imfMBrd 10分量局部三维时频图') 运行,得: 图33-3 从上面几张图,可以更加清楚地看到,虽然没有了以前所说的瞬时频率跳变,但所求得的瞬时振幅、瞬时频率、复信号虚部,都还存在着突变,没有完全达到我希望的结果。其中瞬时振幅的求取方式,是造成问题的根源。因此我打算针对其过零点与割点问题,采取两个改进措施。下面先看第一个措施。 此前的瞬时振幅,是由IMF上下包络线取绝对值后,在信号过零点处分段取值、连接而成。除了造成瞬时振幅自身在信号过零点处的突变,也造成瞬时频率与复信号虚部在过零点处突变。我已经想到了一个很好的方法解决这个问题,就是先将正负极值点统一取绝对值后,再作样条插值(只得到一个插值函数)。具体如下: lx=length(x); t=1:lx; z=x; nbsym=2; INTERP='spline'; = boundary_conditions_emd;(indmin,indmax,t,x,z,nbsym); zmin=abs(zmin); TZ= ; TZ=TZ'; TZTZ=sortrows(TZ,1); TZTZ=TZTZ'; tmm=TZTZ(1,:); zmm=TZTZ(2,:); amp = interp1(tmm,zmm,t,INTERP);%振幅 此振幅综合由上下极值点插值而成,因此可以叫它“综合振幅”。它也是原imf信号的上包络线,取负值后又是原信号的下包络线,可以统称为“综合包络线”。 将上述amp的计算方法与计算结果代替函数 = afyimf( x )中a的计算方法与计算结果,再重复本文前面的计算过程: x=imfMBrd(10,:); = extr(x);%求极值点、 = cenvelope(x,1);%求包络线 envb=env(1,:);%将负包络线提取出来 enva=env(2,:);%将正包络线提取出来 lx=length(x); zs=zeros(1,lx); = afyimf( x ); fg4=figure(4); set(fg4,'position', ) set(gca,'position', ); plot(x,'r-') hold on plot(envb,'k--') plot(-a,'k:')%综合包络线 plot(enva,'k--') plot(a,'k:')%综合包络线 plot(envmoy,'k--') plot(y,'b-') plot(zs,'k-') grid title('综合包络线 imfMBrd 10分量及其复信号之虚部') xlim( ) 运行,得: 图33-4 fg5=figure(5); set(fg5,'position', ) set(gca,'position', ); plot(x,'r-') hold on plot(envb,'k--') plot(-a,'k:')%综合包络线 plot(enva,'k--') plot(a,'k:')%综合包络线 plot(f*150,'b-') plot(zs,'k-') grid title('综合包络线 imfMBrd 10分量瞬时频率突变位置分析') xlim( ) 运行,得: 图33-5 fg6=figure(6); set(fg6,'position', ) set(gca,'position', ); tt=6500:7500; stem3(tt,f(tt),a(tt));%hold on view(-15,30) grid on title('综合包络线 imfMBrd 10分量局部三维时频图') 运行,得: 图33-6 综合振幅自身在过零点处、对瞬时频率、复信号虚部在过零点处的突变的消除作用,图中已经表达的很清楚了,不再赘述。 关于信号与包络线相割的问题,后面继续研究。 (本文首发于: http://blog.sina.com.cn/s/blog_6ad0d3de01016odk.html 首发时间:2012-06-17 12:08:03)
个人分类: 斤斤计较|3202 次阅读|0 个评论
32、(二)时频连续_基于IMF自身的瞬时频率估计
baishp 2012-11-30 14:44
32、(二)时频连续_基于IMF自身的瞬时频率估计
将上一篇中的程序改成函数文件: = afyimf( x ),其中x是IMF单分量信号输入,a、f、y分别是单分量瞬时振幅、瞬时频率、对应复信号虚部输出。现在看看imfMBrd各个分量的瞬时频率情况。 imf=imfMBrd; sr=size(imf,1)-1; sc=size(imf,2); %A=zeros(sr,sc); F=zeros(sr,sc); %Y=zeros(sr,sc); for k=1:sr x=imf(k,:); = afyimf( x ); %A(i,:)=a; F(k,:)=f; %Y(i,:)=y; end zs=zeros(1,sc); fg1=figure(1); set(fg1,'position', ) li=fix(sr/2); lj=1; for i=1:li for j=1:lj n=(i-1)*lj+j; s(n)=subplot(li,lj,n); set(s(n),'position', ); plot(F(n,:)) hold on plot(zs,'k--') xlim( ) title( ) end end 运行 得 图32-1 fg2=figure(2); set(fg2,'position', ) li=ceil(sr/2);% lj=1; for i=1:li for j=1:lj n=(i-1)*lj+j; s(n)=subplot(li,lj,n); set(s(n),'position', ); plot(F(n+fix(sr/2),:)) hold on plot(zs,'k--') xlim( ) title( ) end end 运行 得: 图32-2 从上二图可以看到,最大的频率取值范围是-0.5~0.5Hz,这也是我的程序算法所决定的频率取值域。上面13个IMF分量,只有前两个分量出现了负频,其余都是正频。 将前两个分量出现负频的时段放大看,如下: fg3=figure(3); set(fg3,'position', ) li=2;% lj=1; for i=1:li for j=1:lj n=(i-1)*lj+j; s(n)=subplot(li,lj,n); set(s(n),'position', ); plot(F(n,:)) hold on plot(zs,'k--') xlim( ) title( ) end end 运行 得 图32-3 可以看到,负频部分与正频部分的连接,是连续的,再没有以前我一直抱怨的“跳变”。可以认为,这种负频,是信号本身的属性,而不是人为地制造出来的。负频部分,其绝对值绝大部分小于0.25Hz,但有少量大于0.25Hz,这都取决于信号本身的情况。 换一组IMF看看。将上述最前面的imf=imfMBrd改成imf=imf_TW486012(体温序列IMF,具见博文《13、EMD分解--生理信号的Hilbert-Huang变换(一)》),修改下绘图句柄,即得: 图32-4 图32-5 图32-6 可以看到,情况与imf=imfMBrd是一样的。特别说明一点:上面两组IMF,在前两个分量的瞬时频率中,很容易看到,距数据右端点将近20000点的地方,频率变化范围有一个突变。经我查实,在那个时间点,我的数据测量工作中发生最重大的一件事,是采样频率,由一个时辰测量一次,改成了两个时辰测量一次,中间点数据由样条插值补上。这除了说明,高频信号必须用高频采样,也说明,实际信号当中的所谓“高频”,其实是“宽频”的代名词。IMF序号靠前的分量,与其说是“高频分量”,还不如说是“宽频分量”。 这一篇就到这里,下一篇续谈。 (本文首发于: http://blog.sina.com.cn/s/blog_6ad0d3de01016gw5.html 首发时间:2012-06-13 13:45:56)
个人分类: 斤斤计较|3327 次阅读|0 个评论
31、(一)根本思路_基于IMF自身的瞬时频率估计
baishp 2012-11-30 14:37
31、(一)根本思路_基于IMF自身的瞬时频率估计
前文说了我对学界既有的瞬时频率估计方法的失望,虽然我并没有将所有的那些方法都试遍,但我已经没有信心与耐心仔细去研究它们了,以后有时间、有心情时再去慢慢详细了解吧。现在我打算抛开一切“高深的”理论,从EMD当中所得到的基本物理量,根据瞬时频率最原始的含义,即各时间点上信号源转动的角度,来估计瞬时频率。 众所周知,EMD之所以叫EMD(经验模式分解),是因为它最初并不是基于一种理论推导,而是基于这种分解过程所具有的物理意义被世人所公认,而每一组分解结果都能够经受理论的检验(各IMF之间的正交性)。因此上面我打算采用的瞬时频率估计法,是EMD的一以贯之、很自然的延伸。姑且可称之为“基本模式估计法” 这种方法的关键,在于要明白、承认,IMF的包络线,其实就是信号的瞬时振幅(振幅函数);而IMF是瞬时振幅在实轴上的投影;某时刻IMF值与IMF包络线值之比,就是该时刻瞬时相位的余弦值。有了瞬时相位,通过相位差分即得到瞬时频率;通过振幅、相位,还可以求出振幅在虚轴上的投影,从而得到IMF对应的复数函数。 IMF的包络线有两条,哪一条是IMF的瞬时振幅呢?从理论上来说,IMF的两条包络线的均值为0,两条包络线是完全对称的,因此两条包络线的绝对值是相等的,都等于IMF的瞬时振幅。但在实际处理时,由于两条包络线不可能做到绝对对称,所以还是应该分别处理。在复平面上,当信号源运行在1、4象限时,IMF由上包络线在实轴上的投影形成;当信号源运行在2、3象限时,IMF由下包络线在实轴上的投影形成。因此,瞬时振幅应该根据IMF的情况由上下包络线分段组成。下面就根据这个原则来求IMF的瞬时振幅、瞬时频率等。 下面imfMBrd含义见前两篇博文。 x=imfMBrd(11,:);%先任取imfMBrd的一个分量 lx=length(x); zs=zeros(1,lx); = extr(x);%求极值点、 = cenvelope(x,1);%求包络线及其均值 envb=env(1,:);%将负包络线提取出来 enva=env(2,:);%将正包络线提取出来 fg1=figure(1); set(fg1,'position', ); w=0.04; W=0.94; h=0.04; d=0.003; h1=h+0.75-3*d; h2=h+0.50-2*d; h3=h+0.25-d; h4=h; H=0.18; sb1=subplot(4,1,1); set(sb1,'position', ); plot(x,'r-') hold on plot(envb,'g--') plot(enva,'b--') plot(envmoy,'m--') plot(zs,'k-') grid title('分析信号及其包络线') xlim( ) c41=(x0); c23=(x0); dx=diff(x); dx1= ; dx2= ; dx=(dx1+dx2)/2; c12=(dx0); c34=(dx0); c1=c41.*c12; c2=c23.*c12; c3=c23.*c34; c4=c41.*c34; sb2=subplot(4,1,2); set(sb2,'position', ); stem(c1,'.b-') hold on stem(c2,'.r-') stem(c3,'.g-') stem(c4,'.m-') grid title('四象限掩码') xlim( ) x1=x.*c1; x2=x.*c2; x3=x.*c3; x4=x.*c4; sb3=subplot(4,1,3); set(sb3,'position', ); stem(x1,'.b-') hold on stem(x2,'.r-') stem(x3,'.g-') stem(x4,'.m-') grid title('经掩码作用后的分析信号') xlim( ) aenvb=abs(envb); aenva=abs(enva); tampb=c23.*aenvb; tampa=c41.*aenva; tamp=tampa+tampb;%瞬时振幅 sb4=subplot(4,1,4); set(sb4,'position', ); stem(tampb,'.g-') hold on stem(tampa,'.b-') plot(tamp,'k-') grid title('经掩码作用后的瞬时振幅') xlim( ) 运行,得: 图31-1 下面求瞬时相位、瞬时频率与复信号虚部。 运行,得: 图31-2 从图31-2的第3个子图可以看到,所估计的“瞬时频率”没有前几篇博文中所提到的“跳变”。图中也有一些类似“线谱”一样,或者说象两根“门柱”一样高高耸立的频率成分,但它们是处在同一数量级下的变化,与以前所讲的由接近“0Hz”的负频变成接近“0.5Hz”的正频,性质截然不同的。为了与以前的“频率跳变”相区别,我就将此处的频率变化称之为“频率突变”吧。 此“频率突变”是由于分析信号与它的包络线相割造成的。包络线以外部分,由于信号、包络线之比值绝对值大于1,反余弦无意义,所以被强制等于1与-1,反余弦值(瞬时相位)为0与0.5*2*pi,两割点之间部分,瞬时频率等于0;两割点之外靠近割点处,瞬时频率即形成“突变”。 虽然“频率突变”是频率在同一数量级下的变化,但它毕竟还是人为造成的,不是信号本身的属性,因此也是不完全符合我预期的目标的。我希望的瞬时频率估计值,更加连续光滑。 这一篇就暂到这里,相关问题后面继续分析。 (本文首发于: http://blog.sina.com.cn/s/blog_6ad0d3de01016f0a.html 首发时间:2012-06-10 19:35:44)
个人分类: 斤斤计较|3703 次阅读|0 个评论
30、既有瞬时频率估计方法啧言
baishp 2012-11-30 14:33
30、既有瞬时频率估计方法啧言
关于瞬时频率估计,前面虽说暂时放一下,但心中始终还是念念不忘,因为这是一道绕不过去的坎。在网上多次搜索、了解其现状。感觉是关注这件事的人很多,方法很多,但问题也很多。在网上能找到的方法,简单归结如下: 相位差分法 相位建模法 Teager能量算子法 跨零点法 求根估计法 反余弦法 时频分布法(谱峰检测法?) Shekel方法 Teager-Kaiser方法 解析信号法(HHT法) 其中有些只适用于单分量信号估计,有些可适用于多分量信号估计。由于单分量信号是多分量信号的特例,所以后者包括前者。 这些方法,有些我目前只能找到其名字,找不到原理论述;有些可以找到原理论述,但绝大多数方法都找不到现成的程序(收费网站内情况未知)。可以说,这些方法大多都只是用来写写文章、做做脑保健操而已,实际使用的人很少。如网上找到的一则“反余弦法瞬时频率估计”程序(见“附一”),它把分析信号的幅值都“规一化”了,因此它只能处理理想中的“平稳信号”,不能处理现实中的“非平稳信号”。 比较起来,现在使用解析信号法(HHT)估计瞬时频率的人是最多的,大有“众望所归”的趋势。此方法就是本人在前几篇博文中使用的方法。可是,它存在的问题,我在博文《18、关于IMF分量瞬时频率跳变问题的研究》也说的很详细了。既然现在最流行、影响最大的瞬时频率估计法都是这样,因此我有理由对其它所有瞬时频率估计方法,都感到没有信心。 解析信号法(HHT)估计瞬时频率用的是hhspectrum函数,hhspectrum函数是通过调用时频工具箱中的instfreq函数来进行瞬时频率估计的。时频工具箱中还有一个使用AR(2)模型进行瞬时频率估计的函数ifestar2(因为除却注释部分,程序正文很短,所以我把它也附在后面,方便阅读。见“附二”)。 现在来看看用ifestar2函数估计脉搏序列各IMF的瞬时频率: imfMBrd=emd(MB2917_rd); imfMBrd=imfMBrd'; lx=size(imfMBrd,1); for i=1:size(imfMBrd,2)-1; x=imfMBrd(:,i); =ifestar2(x); M{i,1}=fnorm; M{i,2}=t; M{i,3}=rejratio; end fid1=figure(1); set(fid1,'position', ) li=6; lj=1; for i=1:li for j=1:lj n=(i-1)*lj+j; s(n)=subplot(li,lj,n); set(s(n),'position', ); plot(M{n,2},M{n,1}) xlim( ) title( ) end end 运行 得 图30-1 fid2=figure(2); set(fid2,'position', ) li=7;% lj=1; for i=1:li for j=1:lj n=(i-1)*lj+j; s(n)=subplot(li,lj,n); set(s(n),'position', ); plot(M{n+6,2},M{n+6,1}) xlim( ) title( ) end end 运行得 图30-2 可见,IMF除了第10、第13分量以外,瞬时频率都有很严重的“跳变”,比HHT法更严重。从接近“0Hz”频率的地方跳到“0.5Hz”附近,如果都是这样还比较好区分,但那些比“0.25Hz”稍高的频率,你怎么知道它是否经过跳变呢?如果不是,那多大的频率是由负频跳变而来?界限在哪里?从物理意义来讲,正频率与负频率是截然不同的频率,一个是正向旋转所形成,一个是负向旋转所形成。频率表示方法,这是人类创造的理论,不管现实如何,用“0.49Hz”来表示“-0.01Hz”,这就叫“削足适履”。 以前多次讲过,现实信号的频率,一般情况下应该是连续、光滑的,所以我们的频率表示方法好不好,也应该以此为最高准则,是正频率就表示为正频率,是负频率就表示为负频率。除非能证明现实信号频率的确发生了跳变,否则频率表示当中出现了“跳变”,都是不对的。 下面将前面两张图的时间轴放大看看: fid3=figure(3); set(fid3,'position', ) li=6; lj=1; for i=1:li for j=1:lj n=(i-1)*lj+j; s(n)=subplot(li,lj,n); set(s(n),'position', ); stem(M{n,2},M{n,1}) xlim( ) title( ) end end 运行 得 图30-3 fid4=figure(4); set(fid4,'position', ) li=7; lj=1; for i=1:li for j=1:lj n=(i-1)*lj+j; s(n)=subplot(li,lj,n); set(s(n),'position', ); stem(M{n+6,2},M{n+6,1}) xlim( ) title( ) end end 图30-4 可以看到,图30-3的第1、第2分量频率、图30-4的第1分量频率,都有采样点上没有频率值的情况发生(不是“0Hz”情况哦)。其实每一个分量中都有这样的“瞬时频率无定义点”,只是因为在同一个绘图窗口将它们都绘出来不方便,所以就免了。 for i=1:size(imfMBrd,2)-1; lf(i)=length(M{i,1}) lt(i)=length(M{i,2}) rj(i)=M{i,3} end lf lt rj lf = Columns 1 through 7 33143345893484334901349453496134980 Columns 8 through 13 349933499335001350003499935001 lt = Columns 1 through 7 33143345893484334901349453496134980 Columns 8 through 13 349933499335001350003499935001 rj = Columns 1 through 8 0.94690.9882 0.9955 0.9971 0.9984 0.9989 0.9994 0.9998 Columns 9 through 13 0.99981.0000 1.0000 0.9999 1.0000 lf、lt是各IMF分量作了频率估算的频率点、采样点长度,rj是作了频率估算的采样点长度占整个采样点长度的比例。 这是由ifestar2函数中的indices = find(den0)造成的。与“反余弦法瞬时频率估计”一样,它能作频率估算的地方,它就作了估算;它无法作估算的地方,它就搁那不管了。这是什么态度嘛! 附一:网上找到的“反余弦法瞬时频率估计”程序代码 function = faacos(data, dt) % The function FAACOS generates an arccosine frequency and amplitude % of previously normalized data(n,k), where n is the length of the % time series and k is the number of IMFs. % % FAACOS finds the frequency by applying % the arccosine function to the normalized data and % checking the points where slope of arccosine phase changes. % Nature of the procedure suggests not to use the function % to process the residue component. % % Calling sequence- % = faacos(data, dt) % % Input- % data - 2-D matrix of IMF components % dt - time increment per point % Output- % f - 2-D matrix f(n,k) that specifies frequency % a - 2-D matrix a(n,k) that specifies amplitude % % Used by- % FA % Kenneth Arnold (NASA GSFC) Summer 2003, Initial %----- Get dimensions = size(data); %----- Flip data if necessary flipped=0; if (npts nimf) flipped=1; data=data'; = size(data); end %----- Input is normalized, so assume that amplitude is always 1 a = ones(npts,nimf); %----- Mark points that are above 1 as invalid (Not a Number) data(find(abs(data)1)) = NaN; %----- Process each IMF for c=1:nimf %----- Compute "phase" by arccosine acphase = acos(data(:,c)); %----- Mark points where slope of arccosine phase changes as invalid for i=2:npts-1 prev = data(i-1,c); cur = data(i,c); next = data(i+1,c); if (prev cur cur next) | (prev cur cur next) acphase(i) = NaN; end end %----- Get phase differential frequency acfreq = abs(diff(acphase))/(2*pi*dt); %----- Mark points with negative frequency as invalid acfreq(find(acfreq0)) = NaN; %----- Fill in invalid points using a spline legit = find(~isnan(acfreq)); if (length(legit) npts) f(:,c) = spline(legit, acfreq(legit), 1:npts)'; else f(:,c) = acfreq; end end %----- Flip again if data was flipped at the beginning if (flipped) f=f'; a=a'; end end 附二 时频工具箱中瞬时频率估计函数ifestar2 function =ifestar2(x,t); %IFESTAR2 Instantaneous frequency estimation using AR2 modelisation. % =IFESTAR2(X,T) computes an estimate of the % instantaneous frequency of the real signal X at time %instant(s) T. The result FNORM lies between 0.0 and 0.5. This %estimate is based only on the 4 last signal points, and has %therefore an approximate delay of 2.5 points. % %X : real signal to be analyzed. %T : Time instants (must be greater than 4) %(default : 4:length(X)). %FNORM : Output (normalized) instantaneous frequency. %T2 : Time instants coresponding to FNORM. Since the %algorithm can not always give a value, T2 is %different of T. % RATIO : proportion of instants where the algorithm yields %an estimation % %Examples : % =fmlin(50,0.05,0.3,5); x=real(x); =ifestar2(x); % plot(t,if(t),t,if2); % % N=1100; =fmconst(N,0.05); deter=real(deter); % noise=randn(N,1); NbSNR=101; SNR=linspace(0,100,NbSNR); % for iSNR=1:NbSNR, % sig=sigmerge(deter,noise,SNR(iSNR)); % =ifestar2(sig); % EQM(iSNR)=norm(if(t)-if2)^2 / length(t) ; % end; % subplot(211); plot(SNR,-10.0 * log10(EQM)); grid; % xlabel('SNR'); ylabel('-10 log10(EQM)'); % subplot(212); plot(SNR,ratio); grid; % xlabel('SNR'); ylabel('ratio'); % % See also INSTFREQ, KAYTTH, SGRPDLAY. %F. Auger, April 1996. % This estimator is the causal version of the estimator called % "4 points Prony estimator" in the article "Instantaneous %frequency estimation using linear prediction with comparisons %to the dESAs", IEEE Signal Processing Letters, Vo 3, No 2, p %54-56, February 1996. %Copyright (c) 1996 by CNRS (France). % % This program is free software; you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 2 of the License, or % (at your option) any later version. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program; if not, write to the Free Software % Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA if (nargin == 0), error('At least one parameter required'); end; = size(x); if (xcol~=1), error('X must have only one column'); end x = real(x); if (nargin == 1), t=4:xrow; end; = size(t); if (trow~=1), error('T must have only one row'); elseif min(t)4, error('The smallest value of T must be greater than 4'); end; Kappa = x(t-1) .* x(t-2) - x(t ) .* x(t-3) ; psi1 = x(t-1) .* x(t-1) - x(t ) .* x(t-2) ; psi2 = x(t-2) .* x(t-2) - x(t-1) .* x(t-3) ; den = psi1 .* psi2 ; indices = find(den0); arg=0.5*Kappa(indices)./sqrt(den(indices)); indarg=find(abs(arg)1); arg(indarg)=sign(arg(indarg)); fnorm = acos(arg)/(2.0*pi); rejratio = length(indices)/length(t); t = t(indices); end (本文首发于: http://blog.sina.com.cn/s/blog_6ad0d3de01016a4n.html 首发时间:2012-06-07 20:40:45)
个人分类: 斤斤计较|4015 次阅读|0 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-26 10:38

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部