科学网

 找回密码
  注册

tag 标签: 人体节律

相关帖子

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

没有相关内容

相关日志

71、体温信号总体经验模式分解(eemd)研究(二)
baishp 2020-3-31 16:02
71、体温信号总体经验模式分解(eemd)研究(二) 上篇博文写了“体温信号总体经验模式分解”中,同时分解出组数最多的17Gimf。这篇看看其它情况。在分解出10000组17Gimf的同时时,分解组数第二的是16Gimf,大约为6000多组。由于不明原因,也许是误操作,丢失了大部分数据。剩下的数据稍加补充,凑成了一个整数2100组。看看它的总体合成imf各分量周期-能量情况: figure(2); W=1080; H=720; fg=figure(2); set(fg,'position', ); set(gca,'position', ); hold on aaimf=zeros(16,95196); for i=1:210 aimf=zeros(16,95196); for j=1:10 k=(i-1)*10+j; imf=ST16(k).imf;%ST16为存有2100组16Gimf的结构变量 aimf=aimf+imf; end aimf=aimf/10; AL(i).imf=aimf; %下面计算该组aimf的正交指数 s = 0; for j = 1:17 for k =1:17 if j~=k fj=aimf(j,:); fk=aimf(k,:); fc=(fj*conj(fk)')/(x*x'); s = s + abs(fc); end end end AL(i).ort=s/2; aort(i)=s/2; aaimf=aaimf+aimf; end aaimf=aaimf/210; AAL16.imf=aaimf; for i=1:210 for j=1:15 imff=AL16(i).imf(j,:); =extr(imff); z9=ze(end); z1=ze(1); zl=length(ze); zq=2*( z9-z1)/(zl-1); AL16(i).zq(j)=zq; nl=imff*imff'; AL16(i).nl(j)=nl; plot(log(zq),log(nl),'.g') end end title('十合2100合16Gimf各分量周期-能量图') for j=1:15 imff=AAL16.imf(j,:); =extr(imff); z9=ze(end); z1=ze(1); zl=length(ze); zqj=2*( z9-z1)/(zl-1); zq(j)=zqj; nlj=imff*imff'; nl(j)=nlj; plot(log(zq),log(nl),'or') plot(log(zq),log(nl),'hr') end AAL16.zq=zq; AAL16.nl=nl; %下面计算该组aaimf的正交指数 s = 0; for j = 1:16 for k =1:16 if j~=k fj=aaimf(j,:); fk=aimf(k,:); fc=(fj*conj(fk)')/(x*x'); s = s + abs(fc); end end end AAL16.ort=s/2; aaort=s/2; 另外,原始(未加噪)的体温信号 x=TW793312的emd分解: =emd(x); 得到的是1组16Gimf。 for j=1:15 imff=imf0(j,:); =extr(imff); z9=ze(end); z1=ze(1); zl=length(ze); zq=2*(z9-z1)/(zl-1); zq0(j)=zq; nl=imff*imff'; nl0(j)=nl; figure(2) hold on plot(log(zq),log(nl),'xb') end 如下图: 图71-1 十合2100合及原分析信号16Gimf各分量周期-能量图 首先可以看到,虽然同为16Gimf,但原始未加噪信号之imf各分量周期-能量点,与总体合成后的imf各分量周期-能量点的分布,有很大差距。说明emd的总体合成计算是及其必要的。 另外,十合、2100合16Gimf各分量的周期-能量点的聚散性,与17Gimf基本上是一样的。不多说。 其余剩下的14Gimf、15Gimf、18Gimf、19Gimf组数分别为10、781、1486、21组。统一将其叠加取均合成,各得1组imf。求各组及原始分析信号imf0、原万合17Gimf、2100合16Gimf各分量之周期、能量,得各组的周期向量zq0、zq14、zq15、zq16、zq17、zq18、zq19.,能量向量nl0、nl14、nl15、nl16、nl17、nl18、nl19。 绘zq-nl图: figure(5); W=1080; H=720; fg=figure(5); set(fg,'position', ); set(gca,'position', ); hold on zq=zq0;%zq14、zq15、zq16、zq17、zq18、zq19 nl=nl0;%nl14、nl15、nl16、nl17、nl18、nl19。 plot(log(zq),log(nl),'o--b') title('不同分量个数的各合成imf组的周期-能量图') 得: 图71-2 原始信号imf0及各Gimf最大合imf各分量之周期-能量图 14Gimf周期-能量图与原分析信号imf0周期能量图极接近,可能跟14Gimf合成的组数10组太少有关。 此图仅作为资料保存。 各Gimf各分量周期: zq1412=zq14/12; zq14365=zq1412/365.2422; zq1512=zq15/12; zq15365=zq1512/365.2422; zq1612=zq16/12; zq16365=zq1612/365.2422; zq012=zq0/12; zq0365=zq012/365.2422; zq1712=zq17/12; zq17365=zq1712/365.2422; zq1812=zq18/12; zq18365=zq1812/365.2422; zq1912=zq19/12; zq19365=zq1912/365.2422; zq14= ; zq15= ; zq16= ; zq0= ; zq17= ; zq18= ; zq19= ; 图71-3 14Gimf、15Gimf、16Gimf各分量平均周期 图71-4 原体温分析信号之imf各分量平均周期 图71-5 17Gimf、18Gimf、19Gimf各分量平均周期 上面7栏中,第1列为“时辰”,第2列为“天”,第3列为“年”。 可以看出,14Gimf、15Gimf的数据是不能用的,因为连18年(多)这个大能量长周期都没有。而这个长周期,无论在图形中还是在上上篇博文自相关函数分析中都是已经确定无疑的。 其余各周期数据,目前暂且只能放在这里,在日后其它方法分析周期时作为佐证资料。 各合16Gimf各正交指数(向量)之均值、标准差 mort=mean(ort); sort=std(ort); maort=mean(aort); saort=std(aort); maaort=aaort; saaort=0; 图71-6 原体温信号imf0及各合16Gimf正交指数 ort0是原体温信号imf0的正交指数,ort是初次分解的16Gimf长度为2100的正交指数向量, aort为十合16Gimf长度为210的正交指数向量,aaort为2100合16Gimf之正交指数。 mort0、mort、maort、maaort;sort0、sort、saort、saaort分别是上述4个正交指数(向量) 的均值与标准差。 与上篇博文数据比较,可以看出16Gimf正交指数较17Gimf正交指数略小, 意即前者分解质量较后者略优。 上面是16Gimf正交指数 下面把初次分解的14Gimf、15Gimf、16Gimf、17Gimf、18Gimf、19Gimf之正交指数都调出来放在一起,加以比较: for i=1:10 ort14(i)=ST14_10(i).ort; end for i=1:781 ort15(i)=ST15_781(i).ort; end for i=1:1486 ort18(i)=ST18_1486(i).ort; end for i=1:21 ort19(i)=ST19_21(i).ort; end 图71-7 各Gimf正交指数 上表中,ort0是原体温分析信号imf0之正交指数,ort14、ort15、ort16、ort17、ort18、ort19分别是 14Gimf、15Gimf、16Gimf、17Gimf、18Gimf、19Gimf之正交指数(向量)。 向量名前加“m”的是其均值,加“s”的是其标准差。 可以很容易看出,分解出组数最多的17Gimf,其正交指数最大,意即分解质量最差。
个人分类: 斤斤计较|1910 次阅读|0 个评论
70、体温信号总体经验模式分解(eemd)研究(一)
baishp 2020-3-31 15:33
70、体温信号总体经验模式分解(eemd)研究(一) 我在博文《51、根据imf分量个数分组_我的eemd方法(一)》谈了eemd分组分解方法。现在继续研究eemd。 令输入 x=TW793312(:)';%体温分析信号,行向量。 nstd=0.1; n=10000; 进行分解。 原分析信号x:imf0=emd(x),得到的imf0是一组16个分量(含残余项。下同)的imf, 但经过加噪处理的信号xr: lx=length(x); sd=std(x); r=randn(1,lx); ran=r*sd*nstd; xr=x+ran; 经过试运行后,确认得到分量个数最多的分解,是17个分量的分解。 因此分解次数n=10000次是针对17个分量的分解而言。 由于n=10000太大,分做了10次运行,每次运行n=1000次,10次运行花了4天3夜。另外由于系统不稳、不熟、失误而丢失数据,总共花了将近10天(夜)才完成这项任务。 程序: function =imfstr(x,nstd,n); lx=length(x); sd=std(x); dv=17;% dv=size(imf,1);分解所得imf个数 i=1; ST= ; ST2= ; ST_1= ; ST_3= =emd(xr); %分解所得imf个数等于原分析信号分解所得imf个数时 if size(imf,1)==dv; ST(i).imf=imf; ST(i).ort=o; ST(i).ran=ran; i=i+1; %分解所得imf个数比原分析信号分解所得imf个数多出3个时 elseif size(imf,1)=dv+3; ST3(m3).imf=imf; ST3(m3).ort=o; ST3(m3).ran=ran; m3=m3+1; %分解所得imf个数比原分析信号分解所得imf个数多出2个时 elseif size(imf,1)==dv+2; ST2(m2).imf=imf; ST2(m2).ort=o; ST2(m2).ran=ran; m2=m2+1; %分解所得imf个数比原分析信号分解所得imf个数多出1个时 elseif size(imf,1)==dv+1; ST1(m1).imf=imf; ST1(m1).ort=o; ST1(m1).ran=ran; m1=m1+1; %分解所得imf个数比原分析信号分解所得imf个数少出1个时 elseif size(imf,1)==dv-1; ST_1(m_1).imf=imf; ST_1(m_1).ort=o; ST_1(m_1).ran=ran; m_1=m_1+1; %分解所得imf个数比原分析信号分解所得imf个数少出2个时 elseif size(imf,1)==dv-2; ST_2(m_2).imf=imf; ST_2(m_2).ort=o; ST_2(m_2).ran=ran; m_2=m_2+1; %分解所得imf个数比原分析信号分解所得imf个数少出3个时 elseif size(imf,1)=dv-3; ST_3(m_3).imf=imf; ST_3(m_3).ort=o; ST_3(m_3).ran=ran; m_3=m_3+1; end end end 为了叙述方便,以后我把16个分量的imf称作“16Gimf”,17个分量的imf称作“17Gimf”。。。余类推。 将16Gimf的数量记做“n16Gimf”,17Gimf的数量记做“n17Gimf”。。。余类推。 在n=10000次的目标下,最后得到的结果是: n19Gimf=9; n18Gimf=702; n17Gimf=10000; n16Gimf=6386; n15Gimf=354; n14Gimf=3; 下面只看10000组17Gimf。我把10组,100组、1000组、10000组 17Gimf 加和取均得到的17Gimf分别称为十合17Gimf、百合17Gimf、千合17Gimf、万合17Gimf。研究的目的有三个个:1,看imf各分量的“周期-能量”点在加和取均过程中的聚散性;2,看imf各分量的“异常极值点(大于0的极小值与小于0的极大值)”在加和取均过程中的位置聚散性与数量变化趋势。3,看各合之imf组的正交指数变化情况。 下面函数ALf=ALST(ST)中,输入 ST 是存有1000组17Gimf的结构变量,输出 ALf 是存有100组的十合17Gimf的结构变量: function ALf=ALST(ST); Lx=size(ST(1).imf,2); for h=1:10 STh=ST((h-1)*100+1:(h-1)*100+100); for i=1:10 BL(i).imf=zeros(17,Lx); for j=1:10 k=(i-1)*10+j; BL(i).imf=BL(i).imf+STh(k).imf; end AL(i).imf=BL(i).imf/10; end ALf((h-1)*10+1:(h-1)*10+10)=AL; end 下面函数中,输入x是原体温分析信号,ALf是存有100组十合17Gimf的结构变量, 输出AL是存有100组十合17Gimf及其异常极值点、各分量周期-能量信息及各组正交指数的结构变量; AAL 是存有10组百合17Gimf及其异常极值点、各分量周期-能量信息及各组正交指数的结构变量; AAAL 是存有1组千合17Gimf及其异常极值点、各分量周期-能量信息及各组正交指数的结构变量; ALp、AALp、AAALp分别是100组十合17Gimf、10组百合17Gimf、1组千合17Gimf的第JJ分量中异常极值点平均数 function =A123L(x,ALf); x=x(:)';%行向量 Lx=length(x);% 95196; zs=zeros(1,Lx); figure(20); W=1080; H=720; fg=figure(20); set(fg,'position', ); set(gca,'position', ); figure(25); W=1080; H=720; fg=figure(25); set(fg,'position', ); set(gca,'position', ); figure(30); W=1080; H=720; fg=figure(30); set(fg,'position', ); set(gca,'position', ); %以下提取ALf各种参数,并作图 JJ=12;%选定十合17Gimf的第JJ个分量。 ALp=0;%十合17Gimf第JJ分量的异常极值点数。 for i=1:100 aimf=ALf(i).imf; for j=1:16 imff=aimf(j,:); =extr(imff);%输出分别为极小值、极大值、过零点 mnd=length(mn);%极小值个数 mxd=length(mx);%极大值个数 mnxd=mnd+mxd;%极值个数 AL(i).mnxd(j)=mnxd;%极值个数存档 mnz=find(imff(mn)0);%大于零的极小值 mnzd=length(mnz);%大于零的极小值个数 mxf=find(imff(mx)0);%小于零的极大值 mxfd=length(mxf);%小于零的极大值个数 AL(i).mnzc{j}=mn(mnz);%大于零的极小值位置存档 AL(i).mxfc{j}=mx(mxf);%小于零的极大值位置存档 mzfd=mnzd+mxfd;%异常极值总数 AL(i).mzfd(j)=mzfd;%异常极值总数存档 mdt=mzfd/mnxd;%异常极值占极值总数比例 AL(i).mdt(j)=mdt;%存档 z9=zr(end);%最后一个过零点位置 z1=zr(1);%第一个过零点位置 zl=length(zr);%过零点数量 zq=2*( z9-z1)/(zl-1);%imff周期 AL(i).zq(j)=zq;%周期存档 nl=imff*imff';%imff的能量。 AL(i).nl(j)=nl;%能量存档。 figure(20) hold on plot(log(zq),log(nl),'.g')%此imff的周期-能量点 figure(25) hold on plot(j,AL(i).mdt(j),'.g')%此imff的异、常极值点数比 end ALp=ALp+AL(i).mzfd(JJ);%各组17Gimf的第JJ分量异常极值个数累计 mnz=AL(i).mnzc(JJ);%各组imf的第JJ分量大于零极小值调出 mnz=cell2mat(mnz);%转换 mxf=AL(i).mxfc(JJ);%各组imf的第JJ分量小于零极大值调出 mxf=cell2mat(mxf);%转换 AL(i).imf=ALf(i).imf; imff=AL(i).imf(JJ,:);%imfJJ分量调出 figure(30) hold on plot(mnz,imff(mnz),'.g')%打印出100组十合17Gimf的第JJ分量大于零的极小值 hold on plot(mxf,imff(mxf),'.g')%打印出100组十合17Gimf的第JJ分量小于零的极大值 hold on plot(zs) %下面计算该组aimf的正交指数 s = 0; for j = 1:17 for k =1:17 if j~=k fj=aimf(j,:); fk=aimf(k,:); fc=(fj*conj(fk)')/(x*x'); s = s + abs(fc); end end end AL(i).ort=s/2; end ALp=ALp/100;0组十合17Gimf第JJ分量的异常极值点数平均。 %以下将AL中的100组十合17Gimf累加平均,得到10组百合17Gimf,存于AAL for i=1:10 AAL(i).imf=zeros(17,Lx); for j=1:10 k=(i-1)*10+j; AAL(i).imf=AAL(i).imf+AL(k).imf;组十合17Gimf累加 end AAL(i).imf=AAL(i).imf/10;%平均,得到1组百合17Gimf,存于AAL。 end % AAL存了10组百合17Gimf。 %以下提取AAL各种参数,并作图 AALp=0; for i=1:10 aaimf=AAL(i).imf; for j=1:16 imff=aaimf(j,:); =extr(imff); mnd=length(mn);%极小值个数 mxd=length(mx);%极大值个数 mnxd=mnd+mxd; AAL(i).mnxd(j)=mnxd;%极值个数之和 mnz=find(imff(mn)0);%大于零的极小值 mnzd=length(mnz);%大于零的极小值个数 mxf=find(imff(mx)0);%小于零的极大值 mxfd=length(mxf);%小于零的极大值个数 AAL(i).mnzc{j}=mn(mnz);%大于零的极小值位置 AAL(i).mxfc{j}=mx(mxf);%小于零的极大值位置 mzfd=mnzd+mxfd;%异常极值总数 AAL(i).mzfd(j)=mzfd;%异常极值总数存档 mdt=mzfd/mnxd;%异常极值占极值总数比例 AAL(i).mdt(j)=mdt; z9=zr(end); z1=zr(1); zl=length(zr); zq=2*( z9-z1)/(zl-1); AAL(i).zq(j)=zq; nl=imff*imff'; AAL(i).nl(j)=nl; figure(20) hold on plot(log(zq),log(nl),'*b') figure(25) hold on plot(j,mdt,'*b') end AALp=AALp+AAL(i).mzfd(JJ);% 10组百合17Gimf的第12分量异常极值个数累加。 mnz=AAL(i).mnzc(JJ);%各组imf的第12分量大于零极小值调出 mnz=cell2mat(mnz);%转换 mxf=AAL(i).mxfc(JJ);%各组imf的第12分量小于零极大值调出 mxf=cell2mat(mxf);%转换 imff=AAL(i).imf(JJ,:); % 17Gimf第12分量调出 figure(30) hold on plot(mnz,imff(mnz),'*b')%打出10组百合17Gimf的第12分量大于零的极小值 hold on plot(mxf,imff(mxf),'*b')%打出10组百合17Gimf的第12分量小于零的极大值 plot(zs) %下面计算该组aaimf的正交指数 s = 0; for j = 1:17 for k =1:17 if j~=k fj=aaimf(j,:); fk=aaimf(k,:); fc=(fj*conj(fk)')/(x*x'); s = s + abs(fc); end end end AAL(i).ort=s/2; end AALp=AALp/10;%得到10组百合17Gimf的第12分量的异常极值点数平均值 %以下将AAL中的10组百合17Gimf累加平均,得到1组千合17Gimf,存于AAAL AAAL.imf=zeros(17,Lx); for i=1:10 AAAL.imf=AAAL.imf+AAL(i).imf; end AAAL.imf=AAAL.imf/10; %以下提取AAAL各种参数,并作图 aaaimf=AAAL.imf; for j=1:16 imff=aaaimf(j,:); =extr(imff); mnd=length(mn);%极小值个数 mxd=length(mx);%极大值个数 mnxd=mnd+mxd; AAAL.mnxd(j)=mnxd;%极值个数之和 mnz=find(imff(mn)0);%大于零的极小值 mnzd=length(mnz);%大于零的极小值个数 mxf=find(imff(mx)0);%小于零的极大值 mxfd=length(mxf);%小于零的极大值个数 AAAL.mnzc{j}=mn(mnz);%大于零的极小值位置 AAAL.mxfc{j}=mx(mxf);%小于零的极大值位置 mzfd=mnzd+mxfd;%异常极值总数 AAAL.mzfd(j)=mzfd;%异常极值总数存档 mdt=mzfd/mnxd;%异常极值占极值总数比例 AAAL.mdt(j)=mdt; z9=zr(end); z1=zr(1); zl=length(zr); zq=2*( z9-z1)/(zl-1);%imff周期 AAAL.zq(j)=zq;%周期存档 nl=imff*imff';%imff的能量。 AAAL.nl(j)=nl;%能量存档。 figure(20) hold on plot(log(zq),log(nl),'^k') figure(25) hold on plot(j,mdt,'^k') end imff=aaaimf(JJ,:); =extr(imff); mnz=find(imff(mn)0); mxf=find(imff(mx)0); AAALp=length(mnz)+length(mxf); figure(30) hold on plot(mn(mnz),imff(mn(mnz)),'^k') plot(mx(mxf),imff(mx(mxf)),'^k') plot(zs) %下面计算该组aaaimf的正交指数 s = 0; for j = 1:17 for k =1:17 if j~=k fj=aaaimf(j,:); fk=aaaimf(k,:); fc=(fj*conj(fk)')/(x*x'); s = s + abs(fc); end end end AAAL.ort=s/2; end 上面所得到的AAAL是存有1组千合17Gimf的结构变量。它由存有1000组原初17Gimf的结构变量ST所得。 最初分解了10000组17Gimf,因此有10个这样的ST变量,记为ST01、ST02、ST03、ST04、ST05、ST06、ST07、ST08、ST09、ST10。分别作同样运算,得到10个这样的AAAL结构变量,分别记为AAAL01、AAAL02、 AAAL03、AAAL04、AAAL05、AAAL06、AAAL07、AAAL08、AAAL09、AAAL10。 令AAAL= ; 以下函数输入此AAAL,输出AAAAL含1组万合17Gimf,及其各分量之异常极值点信息。 AAAALp是其指定的第JJ分量的异常极值点个数。x是原体温分析信号。 function =A34L(x,AAAL); x=x(:)'; Lx=length(x); z=zeros(1,Lx); %以下将10组AAAL的千合17Gimf累加平均,得到1组万合17Gimf, %存于AAAAL中。 AAAAL.imf=zeros(17,Lx); for i=1:10 AAAAL.imf=AAAAL.imf+AAAL(i).imf; end AAAAL.imf=AAAAL.imf/10; %以下提取AAAAL各种参数,并作图 aaaaimf=AAAAL.imf; for j=1:16 imff=aaaaimf(j,:); =extr(imff); mnd=length(mn);%极小值个数 mxd=length(mx);%极大值个数 mnxd=mnd+mxd; AAAAL.mnxd(j)=mnxd;%极值个数之和 mnz=find(imff(mn)0);%大于零的极小值 mnzd=length(mnz);%大于零的极小值个数 mxf=find(imff(mx)0);%小于零的极大值 mxfd=length(mxf);%小于零的极大值个数 AAAAL.mnzc{j}=mn(mnz);%大于零的极小值位置 AAAAL.mxfc{j}=mx(mxf);%小于零的极大值位置 mzfd=mnzd+mxfd;%异常极值总数 AAAAL.mzfd(j)=mzfd;%异常极值总数存档 mdt=mzfd/mnxd;%异常极值占极值总数比例 AAAAL.mdt(j)=mdt; z9=zr(end); z1=zr(1); zl=length(zr); zq=2*( z9-z1)/(zl-1);%imff周期 AAAAL.zq(j)=zq;%周期存档 nl=imff*imff';%imff的能量。 AAAAL.nl(j)=nl;%能量存档。 figure(20) hold on plot(log(zq),log(nl),'or')%^b plot(log(zq),log(nl),'pr') figure(25) hold on plot(j,mdt,'or')% log()*b plot(j,mdt,'pr') end imff=AAAAL.imf(12,:); =extr(imff); mnz=find(imff(mn)0); mxf=find(imff(mx)0); AAAALp=length(mnz)+length(mxf); figure(30) hold on plot(mn(mnz),imff(mn(mnz)),'or')%^b plot(mn(mnz),imff(mn(mnz)),'pr') plot(mx(mxf),imff(mx(mxf)),'or')%^b plot(mx(mxf),imff(mx(mxf)),'pr') plot(z) %下面计算该组aaaaimf的正交指数 s = 0; for j = 1:17 for k =1:17 if j~=k fj=aaaaimf(j,:); fk=aaaaimf(k,:); fc=(fj*conj(fk)')/(x*x'); s = s + abs(fc); end end end AAAAL.ort=s/2; end 如前所述,我一共分解了10000组17Gimf,分成了10部分,每部分1000组17Gimf,分别存在结构变量ST01、ST02......ST10中。对每个ST施行上述运算,每起运算可以得到一组长度分别为100、10、1的十、百、千合的AL、AAL、AAAL17Gimf,每组17Gimf对应1个正交指数。 提取每部分ST中的ort数据: ST=ST01;%ST02、ST03。。。 for i=1:1000 ort(i)=ST(i).ort; end 得到10段长度各为1000的ort(ort01、ort02。。。) 提取AL17Gimf中的ort: AL=AL01;%AL02、AL03。。。 for i=1:100 aort(i)=AL(i).ort; end 得到10段长度各为100的aort。 提取AAL17Gimf中的ort: AAL=AAL01; % AAL02、AAL03。。。 for i=1:10 aaort(i)=AAL(i).ort; end 得到10段长度各为10的aaort。 提取AAAL17Gimf中的ort: aaaort=AAAL17.ort; 得到10个aaaort。 将上面10段(个)ort、aort、aaort、aaaort合并,得到长度分别为10000、1000、100、10的ort、 aort、aaort、aaaort. 再将AAAAL17Gimf中的ort提取: aaaaort=AAAAL.ort; 计算各正交指数向量的方差、标准差: mort=mean(ort); sort=std(ort); maort=mean(aort); saort=std(aort); maaort=mean(aaort); saaort=std(aort); maaaort=mean(aaaort); saaaort=std(aaaort); maaaaort=aaaaort; saaaaort=0; 现在可以贴图了: 图70-1 十百千万合17Gimf各分量的周期-能量图 可以看出:1、随着合成组数的增加,各分量的周期-能量点逐步向1点聚集。 2,有3个(组)分量的能量特别大:第2(3)分量、第12(13)分量与第16分量。 它们与我上一篇博文中的“图69-4 自相关函数emd分解各分量周期-能量关系图” 的特征是一致的,只是imf分量的个数、序数不一样而已。 具体的周期数据,待下一篇与14、15、16、18、19Gimf一起分析。 图70-2 上图局部放大图 可以看出,周期-能量点主要在纵轴能量方向聚集,而在横轴周期方向是向右 侧某一极限值收敛,而且是“有级、跳跃性”的。 图70-3 十百千万合17Gimf各分量异常极值点占总极值点数比例 变化比较复杂。1,在短周高频分量中,占比受合成次数影响较小,而在长周低频分量中, 受合成次数影响很大。合成次数越少占比越大,合成次数越多占比越小。 图70-4 十百千万合17Gimf第12分量的异常极值点数量与位置 特点分析:1、随着合成次数的增加,异常极值点会向某一些位置聚集 2、在幅值方向上的收敛是连续的,在时间上的收敛是分级(离散)的。 3、在时间点上,聚集的位置最后会固定在几处,而最初的一些位置会被完全“抛弃”。 图70-5 上图放大 图70-6 十百千万合17Gimf第12分量的异常极值点平均数 从此表可以确定,增加imf的总体合成组数,其各分量中异常极值点数量不但不会减少,而且还会增加。因此通过增加合成组数的方法,是不可能得到严格的imf(无异常极值点)的。 图70-7 各合17Gimf之正交指数向量及其均值、标准差。 ort、aort、aaort、aaaort、aaaaort、分别是初次分解、十、百、千、万合17Gimf正交指数向量。 mort、maort、maaort、maaaort、maaaaort、分别是上述正交指数的均值; sort、saort、saaort、saaaort、saaaaort、分别是上述正交指数的标准差。 m5s是将上面10个变量合在一起,以方便截图查看更精确的数据。下图即该截图。 图70-8 各合17Gimf正交指数的均值、标准差(长数据) 第1、2、3、4、5行分别为万组初次分解、千组十合、百组百合、十组千合、一组万合17Gim正交指数的 均值与标准差。 第1列为均值,第2列为标准差 可以看出从第1~第4行的正交指数均值都是递减的。第5行略有增加,但由于数据太少,从第4行右侧的标准差来看,完全可以断定属于随机误差。因此可以得出结论:随着参加叠加合成的imf组数的增加,合成所得imf组的正交指数是递减的,且远小于0. 最后,来看看得到的唯一的一组万合17Gimf各分量图形 imf=AAAAL.imf; lx=95196;%size(imf,2); zs=zeros(1,lx); W=1080; H=720; m=6; n=3; k=17; fg=figure(1); set(fg,'position', ); for i=1:m for j=1:n p=j+(i-1)*n; if p=k s(p)=subplot(m,n,p);% set(s(p),'position', ); x=imf(p,:); plot(x) hold on plot(zs,'k--') mx=max(x); mn=min(x); xn=mx-mn; axis( ) end end end title('万合17Gimf各分量图') 图70-9 万合17Gimf各分量 看看各分量周期: zq=AAL.zq'; zq12=zq/12; zq365=zq12/365.2422; ZQ= ; 图70-10 万合17Gimf各分量周期 图中红圈标示的是图70-1中3组5个高能量分量的周期。 可以看出,第1组两个周期,正好位于“时干周期10时辰”与“时支周期12时辰”两侧, 第2组两个周期,正好位于“月干周期10个月约300天”与“月支周期1年约365天”两侧, 虽然具体数字还有差距,但我相信这绝不是偶然的。内在原因需要进一步探索。 此数据经过这样大规模imf总体合成,结果的随机性已经极低了,它更多反映的是信号系统(人体) 内在的固有结构特征。 最后看看第12分量及其异常极值点大图 imf=AAAAL.imf; lx=95196;%size(imf,2); zs=zeros(1,lx); W=1080; H=720; imf12=imf(12,:); fg=figure(2); set(fg,'position', ); set(gca,'position', ); plot(imf12) hold on plot(zeros(1,95196)) mnzc12=cell2mat(AAAAL.mnzc(12)); mxfc12=cell2mat(AAAAL.mxfc(12)); plot(mnzc12,imf12(mnzc12),'or') plot(mxfc12,imf12(mxfc12),'or') title('万合17Gimf第12分量及其异常极值点图') 图70-11 万合17Gimf第12分量及其异常极值点图 经过10000次的总体合成,这些异常极值点的位置都已经具有很大的必然性了。它反映的是人体的一些固有特征。在物理系统中,异常极值点是表示系统输出在复平面上的反转。对人体来说,这种“反转”也是有生理学意义的。中医中本来就有呃逆、气逆、逆动、逆乱、逆症。。。等概念。此“异常极值点”说不定就与此有关。总之这些信息可以处理到此为止,只需留待以后作“模式识别”。
个人分类: 斤斤计较|1971 次阅读|0 个评论
健康学49: 较长时期内出现的生理现象的波动
laofan68 2019-4-27 15:26
健康学的核心是利用身体自身的功能让身体更健康。所以各种生理规律对健康学就异常重要。本文对较长时期内出现的生理现象波动,谈点自己的想法。 前面讨论了人的昼夜节律和周期分别为 23 、 28 、 33 天的生物节律。我们能否再往前推一步,认为几个月、几年、或一生中出现的一些有特点的生理现象,也看作是正常的生理波动。这里随便说一些自己的想法。 人在一年中会有些规律性的变化。比如中医认为,五脏六腑的功能随四季变化而盛衰。人的血压冬季会多少高一点,夏季多少低一点。人们常说:春困秋乏夏打盹,睡不醒的冬三月。 凝肩,好发于年龄在 50 岁左右, 所以也叫 五十肩。以肩部逐渐产生疼痛,夜间为甚。达到某种程度后逐渐缓解,绝大多数人最后会完全缓解。对于多数人,这种五十肩一生中只出现一次。 我 40 多岁出现眼花,到医院眼科看是否需要配花镜。医生说出现花眼后,每年会增加多少度 ( 好像是说 50 度 ) 。我想若照此发展下去,到七、八十岁,会达上千度,一方面我认为这种可能性不大。另一方面,我想既然会继续发展,那我现在 ( 即当时 ) 对工作影响还不是很大,我就先不配花镜,所以没有配。没想到过了一年又一年,眼花的程度并不像医生说的那样的速度发展,对工作的影响一直没有到非常严重的程度,所以一直也没有特意去配花镜。到 60 多岁以后,看近处的东西反而比原来更清楚了。自己找原因,一种说法是白内障引起的。 2011 年春,我到天津最好的眼科医院之一去看眼,给我看病的主任医师 ( 好像是该院院长 ) 说,我的白内障已经相当重了,问我是马上做手术还是过几天?我说过几天吧。过了几天又几天,过了一年又一年,到现在已经过了 8 年多了也没有做。 3 天前 (4 月 24 日 ) 体检,大夫说我有白内障,但不太严重。晶状体通性不错,能看清楚眼底,暂时不必去做手术。实际上我的白内障问题与很多人不一样,主要不是晶状体透光不好,而是相当于变成了好几个晶体,晚上看远处的灯泡,本来是一个灯,我看见的是大致为矩形的 6 个灯。 但不管怎么说,我认为这些都是生理现象的波动。 甚至有一些病痛也可以看作是在某种条件下生理现象的波动,如普通感冒一周左右会自愈。哮喘一般冬季比较重,夏天比较轻。若是骨骼或肌腱受损,即使及时治疗,一般也需要兩三个月以上才能痊愈,所以常说“伤筋动骨 100 天”。因此可以把一些病痛看作是在特定条件、环境和自身状况下的生理波动现象。 我说这些不是让大家有病不去看医生,而是想到生理现象的波动。 因此在身体出现一些异常状况时,想到生理现象会有波动。不一定今天是小异常,若不去看医生,明天就必然成为大异常,后天就一定会去见阎王。现实中确实些人只要有一点点小异常,不仅要到医院看医生,而且这也不敢动,那也不敢做。 当然,若经过分析,认为需要借助医药的异常现象,或者不能肯定此异常是不需要治疗,还是要抓紧时间,尽早去看医生,不要耽误病情。 更为重要的是,要知道人体是活的,有很强的回复、修复、再生、免疫功能。身体出现异常,不管是否去看医生,都要想方设法充分利用身体自身的规律和这些功能,促进回复正常。
个人分类: 健康 健康学|1990 次阅读|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)
个人分类: 斤斤计较|4023 次阅读|0 个评论
25、GUI界面一维小波消噪
baishp 2012-11-30 00:01
25、GUI界面一维小波消噪
前面使用的信号序列都是原观测序列,没有经过任何预处理的。这一篇来做一下这件工作。应用小波消噪之前,先用EMD方法消除一下趋势项。用EMD方法消除趋势项可以说是迄今为止最好的消除趋势项的方法。 TW4860_r=TW486012-imf_TW486012(end,:); MB2917_r=MB291712-imf_MB291712(end,:); GY2917_r=GY291712-imf_GY291712(end,:); DY2917_r=DY291712-imf_DY291712(end,:); JY2917_r=JY291712-imf_JY291712(end,:); CY2917_r=CY291712-imf_CY291712(end,:); TW4860_r的下标“_r”表示原观测序列TW486012去除了emd分解中的残余项。余类推。不过,所得新序列的均值可能并不严格等于0,而是有一点点偏差,这是由emd分解的特点决定的。暂不管这个。 M_r=cell(6,3); M_r{1,1}=TW4860_r; M_r{1,2}='TW4860_ r'; M_r{1,3}= ; M_r{2,1}=MB2917_r; M_r{2,2}='MB2917_ r'; M_r{2,3}= ; M_r{3,1}=GY2917_r; M_r{3,2}='GY2917_ r'; M_r{3,3}= ; M_r{4,1}=DY2917_r; M_r{4,2}='DY2917_ r'; M_r{4,3}= ; M_r{5,1}=JY2917_r; M_r{5,2}='JY2917_ r'; M_r{5,3}= ; M_r{6,1}=CY2917_r; M_r{6,2}='CY2917_ r'; M_r{6,3}= ; for i=1:6 subplot(3,2,i); plot(M_r{i,1});title(M_r{i,2}); axis(M_r{i,3}); end 运行,得: 图25-1 用emd方法消除趋势项之后的各生理信号序列 下面用小波工具箱图形用户界面GUI对上述信号进行消噪。点击GUI界面左上的Wavelet 1-D调出一维小波分析界面,导入体温序列TW4860_r。先随意选一个小波db4,分解层次选最多层12层。点Analyze按钮开始分析。显示模式Display mode选Separate Mode(分开形式)。见下图。 图25-2 上图中,点More Display Options可以选择左右两边的显示内容。我调节的,左边第一列是原始信号TW4860_r,下面12列是各层近似信号;右边第一列是各层细节系数,第二列是重构信号,再以下是各层细节信号。点View Axes可以将上面各图放大看。各层细节系数放大图如下。 图25-3 各层细节系数 颜色越浅的系数越大。大约可见第三层细节系数较邻近层系数要大。 点图25-2中的De-noiss,打开一个消噪界面,见图25-4。 图25-4 fixed form阈值消噪 界面上有三类参数需要选择:软阈值soft硬阈值hard选择,既然大多数人都认为软阈值作用方式比较好,那我就先选定软阈值;噪声结构选择Select noise structure,选Scaled white noise(这个到底是指“强度非归一化白噪声”,还是指“有色高斯噪声”?我一直没找到确定的答案。)吧;阈值选取方式Select thresholding method有7种。下面分别选前4种来进行消噪,看看消噪的效果如何。 先选固定形式阈值Fixed form threshold。选定后,点消噪De-noiss,界面即进行消噪处理。界面左侧给出各层细节系数与阈值线,(中)右上面是原始信号(红色)与消噪后的信号(紫色),中间是原始信号分解后各层细节系数,下面是经阈值作用后各层细节系数。 点De-noiss右边的残差Residuals,打开残差显示界面,见下图。 图25-5 fixed form阈值消噪之残差 上图上方是残差(原信号与消噪信号之差,即被“消除”的噪声)。中左是残差的直方图,就是我以前说的“频数函数”图,是数据总体的概率密度函数估计。中右是频数函数的积分函数,即概率分布函数(估计)。下左图是残差自相关,下右图是残差功率谱。最下面是残差各项统计数据。 继续选择阈值方式分别为Rigorous SURE(基于Stein无偏似然估计SURE阈值)、Heuristic SURE(启发式SURE阈值)、Minimaxi(最小极大方差阈值)。分别得到消噪界面及残差图,见下图25-6~图25-11。 图25-6 rigorous sure阈值消噪 图25-7 rigorous sure阈值消噪之残差 图25-8 heuristic sure阈值消噪 图25-9 heuristic sure阈值消噪之残差 图25-10 minimax阈值消噪 图25-11 minimax阈值消噪之残差 可以看出图25-8、图25-9与图25-6、图25-7完全是一样的。因为启发式SURE阈值Heuristic SURE,就是在固定形式阈值Fixed form threshold与无偏似然估计SURE阈值Rigorous SURE之间作一个选择。本例中选择的是无偏似然估计SURE阈值,所以两个SURE阈值消噪结果是一样的。接下来Heuristic SURE阈值方式就不再单独分析了。 图25-5与图25-11中残差的直方图,看起来符合白噪声的概率密度函数即正态分布。而图25-7(图25-9)的直方图不符合正态分布。从下方的自相关函数与功率谱图中知道它们都含有至少一个周期成分。这个后面再谈。 衡量消噪效果有两个原则:消噪信号与原信号的相似性、消噪信号的光滑性。但这两个原则是一对矛盾的统一体:太相似就不会太光滑,太光滑就不会太相似。最终的取舍只能看具体情况,折中选择了。 衡量消噪信号与原信号的相似性,有几个衡量指标,如残差的标准差(standard.dev)、残差的绝对偏差(mean abs. dev.)、残差模数(L2 norm)或消噪信号与原信号的模数比。从图25-5、图25-7、图25-9、图25-11下方的统计数据中可以知道,前3项指标分别为: 阈值: Fixed SURE Minimaxi 标准差: 15.23、 2.673、 11.97 平均绝对差:12.31、 2.267、9.662 模数: 3679、 645.5、 2890 指数越小表示相似程度越高,否则越低。因此Rigorous SURE(Heuristic SURE)阈值消噪的相似性最好,Minimaxi阈值其次,Fixed form阈值最差。 再看看消噪信号与原信号的模数比,其含义类似于信号能量比。将上面第1、第2、第4种阈值消噪所得的消噪信号导出,分别记为TWden_fix、TWden_rig、TWden_mnmx。残差也导出,分别记为TWres_fix、TWres_rig、TWres_mnmx。 %模数比: normr1=norm(TWden_fix)/norm(TW4860_r) %MATLAB打印 normr1 = 0.7205 normr2=norm(TWden_rig)/norm(TW4860_r) %MATLAB打印 normr2 = 0.9846 normr4=norm(TWden_mnmx)/norm(TW4860_r) %MATLAB打印 normr4 = 0.7891 总的感觉,第1、4种方法,消噪“太厉害”,消噪信号与原信号相似性差,但光滑度肯定很好;第2(3)种方法,消噪“太弱”,消噪信号与原信号相似性肯定很好,但光滑度会差。 虽然说“太相似就不会太光滑,太光滑就不会太相似”,但不能说“太不相似就会太光滑,太不光滑就会太相似”,因此信号光滑度应该另有一衡量指标才好。目前我还没有看到光滑度计算公式,不过从功率谱的本义,光滑信号低频端功率谱值高,高频端功率谱值低;不光滑信号则与此相反。现在把消噪信号TWden_fix、TWden_rig、TWden_mnmx、残差TWres_fix、TWres_rig、TWres_mnmx都导入信号观测器sptool,并加载于其信号功率谱处理器Spectrum Viewer,从直观上来看看各信号的光滑度。 下面图25-12~图25-22是各信号、残差的功率谱图,蓝线原信号,紫线消噪信号,黄线残差。 图25-12 固定形式阈值Fixed form threshold的消噪信号功率谱 图25-13 固定形式阈值Fixed form threshold的消噪残差(噪声)功率谱 从上面两图中看到一个有趣的现象:原信号看不出的一个周期成分,在它的消噪信号与残差中却同时出现了,见上面两图中标尺线左边一点点的谱线。经查,知其基波周期为24个时辰。消噪信号其3倍频、9倍频谱线也很明显,残差功率谱中则只看到3倍频。 这个该如何解释呢?我目前也没有一下子想清楚。 图25-14 原信号与固定形式阈值Fixed form threshold消噪信号、残差(噪声)三合一功率谱 图25-15 图25-14低频端放大 图25-16 图25-14高频端放大 图25-17 无偏似然估计Rigorous SURE阈值的消噪信号功率谱 此图中未见24时辰周期成分基、倍频谱线。 图25-18 无偏似然估计Rigorous SURE阈值的消噪残差功率谱 此图中只见24时辰周期成分基频谱线。 图25-19 原信号与无偏似然估计Rigorous SURE阈值的消噪信号、残差(噪声)三合一功率谱 图25-20 最小极大方差阈值Minimaxi的消噪信号功率谱 此图又见周期为24个时辰周期成分之基频、3倍频、9倍频谱线。 图25-21 最小极大方差阈值Minimaxi的消噪残差功率谱 此图可见周期为24个时辰周期成分之基频、3倍频谱线。 图25-22 原信号与最小极大方差阈值Minimaxi的消噪信号、残差(噪声)三合一功率谱 看看各信号在时域的波形: plot(TW4860_r) hold on plot(TWden_fix,'g-') plot(TWden_rig,'r-') plot(TWden_fix,'k-') xlim( ) 运行,得: 图25-23 原信号及3种消噪信号时域波形比较 从上面的功率谱图及时域波形光滑性可以看出,各阈值消噪的效果,与消噪相似性指标反映的消噪效果是一致的。 感觉,消噪信号的应用,应该灵活掌握。有些信号处理方式中应该用消噪信号,另一些信号处理方式中就不一定要使用消噪信号。因为这些处理方式本身可能就含有消噪功能,用已经消噪的信号,也许会丢失一部分信息。 (本文首发于: http://blog.sina.com.cn/s/blog_6ad0d3de010138ox.html 首发时间:2012-02-24 19:37:48)
个人分类: 斤斤计较|4380 次阅读|0 个评论
24、基于各生理信号之间相干函数的频率选择
baishp 2012-11-29 23:52
24、基于各生理信号之间相干函数的频率选择
这一篇来看看各生理信号之间的相干函数。相干函数值大的频率,属人体固有的节律频率的可能性大,反之则小。但是,即使相干函数值很小,也不能完全排除该频率仍然是人体固有的节律频率的可能性。 %下面将脉搏、收缩压、舒张压、均压、差压信号序列0均值化,并在序列 %前面补“0”至与TWXM4860120同样长度 MB4860120= ; GY4860120= ; DY4860120= ; JY4860120= ; CY4860120= ; TWXM4860120= ;%组成矩阵 Nfft=2^16;%快速傅立叶长度 Fs=Nfft;%采样频率 window=hanning(2^9*48);% noverlap=2^9*36; 相干函数估计中的功率谱估计采用的是Welch法,其加窗原则见第6篇博文《功率谱密度函数估计》中的Welch法。 C=cell(6,6);%1~6行及列分别代表体温、脉搏、收缩压、舒张压、均压、差压。 for i=1:5 for j=i+1:6 C{i,j}=cohere(TWXM4860120(i,:),TWXM4860120(j,:),Nfft,Fs,window,noverlap);%相干函数估计 end end figure(1) subplot(2,3,1) plot(C{1,2})% title('体温脉搏相干函数Ctm') xlim( ) subplot(2,3,2) plot(C{1,3})% title('体温收缩压相干函数Ctg') xlim( ) subplot(2,3,3) plot(C{1,4})% title('体温舒张压相干函数Ctd') xlim( ) subplot(2,3,4) plot(C{2,3})% title('脉搏收缩压相干函数Cmg') xlim( ) subplot(2,3,5) plot(C{2,4})% title('脉搏舒张压相干函数Cmd') xlim( ) subplot(2,3,6) plot(C{3,4})% title('收缩压舒张压相干函数Cgd') xlim( ) 运行,得: 图24-1 figure(2) subplot(2,3,1) plot(C{1,2})% title('体温脉搏相干函数Ctm') xlim( ) subplot(2,3,2) plot(C{1,5})% title('体温均压相干函数Ctj') xlim( ) subplot(2,3,3) plot(C{1,6})% title('体温差压相干函数Ctc') xlim( ) subplot(2,3,4) plot(C{2,5})% title('脉搏均压相干函数Cmj') xlim( ) subplot(2,3,5) plot(C{2,6})% title('脉搏差压相干函数Cmc') xlim( ) subplot(2,3,6) plot(C{5,6})% title('均压差压相干函数Cjc') xlim( ) 运行,得: 图24-2 可以看出各相干函数大小是不一样的。看看它们的均值与方差: m=zeros(6,6); v2=zeros(6,6); v=zeros(6,6); for i=1:5 for j=i+1:6 m(i,j)=mean(C{i,j});%相干函数均值 v2(i,j)=var(C{i,j});%相干函数方差 v(i,j)=v2(i,j)^0.5;%相干函数标准差 end end mv= ; mv截图,得: 图24-3 上图第1~6行、7~12行分别是均值、标准差。 如果将各相干函数相加,再将其某阈值以上的函数值对应的自变量频率点选为人体节律频率,那么原各相干函数对入选的频率的影响是不一样的。这样显然不合理。应该让各相干函数以同样程度影响力来影响节律频率的选取。将各相干函数乘以某个系数后再相加也不行,不是太大,就是太小,很难确定加权系数大小的。 可以先求相干函数的频数,从它的频数函数自变量中确定一个阈值,使得在阈值以上的频率数量相等。将这些频率选为人体节律频率,那么各相干函数对入选的频率的影响程度就是一样的了。 N=cell(6,6); for i=1:5 for j=i+1:6 =hist(C{i,j}, );%各相干函数的频数函数 end end figure(4) subplot(2,3,1) barh(xout,N{1,2})% title('体温脉搏相干函数之频数ntm') axis( ) subplot(2,3,2) barh(xout,N{1,3})% title('体温收缩压相干函数之频数ntg') axis( ) subplot(2,3,3) barh(xout,N{1,4})% title('体温舒张压相干函数之频数ntd') axis( ) subplot(2,3,4) barh(xout,N{2,3})% title('脉搏收缩压相干函数之频数nmg') axis( ) subplot(2,3,5) barh(xout,N{2,4})% title('脉搏舒张压相干函数之频数nmd') axis( ) subplot(2,3,6) barh(xout,N{3,4})% title('收缩压舒张压相干函数之频数ngd') axis( ) 运行,得: 图24-4 各相干函数的频数函数 figure(5) subplot(2,3,1) barh(xout,N{1,2})% title('体温脉搏相干函数之频数ntm') axis( ) subplot(2,3,2) barh(xout,N{1,5})% title('体温均压相干函数之频数ntj') axis( ) subplot(2,3,3) barh(xout,N{1,6})% title('体温舒张压相干函数之频数ntc') axis( ) subplot(2,3,4) barh(xout,N{2,5})% title('脉搏均压相干函数之频数nmj') axis( ) subplot(2,3,5) barh(xout,N{2,6})% title('脉搏差压相干函数之频数nmc') axis( ) subplot(2,3,6) barh(xout,N{5,6})% title('均压差压相干函数之频数njc') axis( ) 运行,得: 图24-5 各相干函数的频数函数 图24-4与图24-5右下角的子图分别是收缩压与舒张压相干函数的频数统计图、均压与差压相干函数的频数统计图。可见二图有很大的差别。它说明了收缩压与舒张压的相干函数,平均比均压与差压的相干函数大很多。相干函数就是信号序列在频域的相关性。在时域的相关性强,则在频域相关性也强,反之亦然。这与我在第4篇博文《谈谈我对人体血压的看法》中对它们的互相关系数的计算结果是一致的。 下面对各相干函数,自最大值“1”向下,选取数量相等的频率点: CS=cell(6,6);%各频数函数的累加函数 h=zeros(6,6);%各累加函数自变量的某阈值 F=cell(6,6);%原各相干函数在阈值h以上部分的函数点位置索引 K=Nfft/2^9;%频数函数在阈值h以上部分的频率数量(累加值)。此数视情况可以随时任意改变 for i=1:5 for j=i+1:6 CS{i,j}=cumsum(N{i,j}); =min(abs(CS{i,j}-(Nfft/2-fix(K)))); F{i,j}=find(C{i,j}h(i,j)*0.001); end end figure(6) subplot(2,3,1) stem(F{1,2})% title('体温脉搏相干函数Ctm入选频率') axis( ) subplot(2,3,2) stem(F{1,3})% title('体温收缩压相干函数Ctg入选频率') axis( ) subplot(2,3,3) stem(F{1,4})% title('体温舒张压相干函数Ctd入选频率') axis( ) subplot(2,3,4) stem(F{2,3})% title('脉搏收缩压相干函数Cmg入选频率') axis( ) subplot(2,3,5) stem(F{2,4})% title('脉搏舒张压相干函数Cmd入选频率') axis( ) subplot(2,3,6) stem(F{3,4})% title('收缩压舒张压相干函数Cgd入选频率') axis( ) 运行,得: 图24-6 figure(7) subplot(2,3,1) stem(F{1,2})% title('体温脉搏相干函数Ctm入选频率') axis( ) subplot(2,3,2) stem(F{1,5})% title('体温均压相干函数Ctj入选频率') axis( ) subplot(2,3,3) stem(F{1,6})% title('体温差压相干函数Ctc入选频率') axis( ) subplot(2,3,4) stem(F{2,5})% title('脉搏均压相干函数Cmj入选频率') axis( ) subplot(2,3,5) stem(F{2,6})% title('脉搏差压相干函数Cmc入选频率') axis( ) subplot(2,3,6) stem(F{5,6})% title('均压差压相干函数Cjc入选频率') axis( ) 运行,得: 图24-7 下面将上述各频率向量串合在一起。此串合向量Vf取倒数就得到周期数据,以后可以将其并入《21、人体节律周期初步统计排查》的周期数据向量中一起作统计。 Vf= ; figure(8) stem(Vf) title('各相干函数入选频率串合') 运行,得: 图24-8 为了保持信息来源的均衡性,收缩压、舒张压对均压、差压的相干函数分析我都没有再作,而加入统计的体温对脉搏的频率向量F{1,2}数加倍。 频率数据串合向量Vf现在就可以作一下频数统计: =sort(Vf); figure(9) = hist(Bf, ); subplot(1,2,1) barh(xoutf,nf) title('所有入选频率的频数统计') ylim( ) subplot(1,2,2) bar(Bf) title('所有入选频率的排序图') axis( ) 运行,得: 图24-9 这个方法可以最大限度消除传感器噪声谱,但是不能消除谐波频率。 (本文首发于: http://blog.sina.com.cn/s/blog_6ad0d3de01012lby.html 首发时间:2012-02-04 11:45:16)
个人分类: 斤斤计较|2835 次阅读|0 个评论
21、人体节律周期初步统计排查
baishp 2012-11-29 23:08
21、人体节律周期初步统计排查
上一篇博文求出了各生理信号序列imf分量的平均周期,但是靠单一的周期数据是难以确定它就是人体节律周期的。对已经求出的那些周期数据,单凭眼睛也很难判断2个及以上的数据是否为同一周期数据。这就需要将那些数据统一放在一起并按大小次序排列起来进行观察。 VT= ;%将上篇博文中各分量周期时辰数连接为一个向量。 由于人体节律周期在各通道信号中只表现为有无、强弱,而其数值是不变的,也不随信号处理方式的不同而改变,所以可以将更多不同处理方式中所获得的周期信息放在一起进行比较。 这一篇博文中对信号序列再作两种处理,并将所得到的周期数据与上一篇博文中的周期数据合并观察。 (一)先看看信号序列自相关函数的imf分量平均周期(自相关函数图形参见第三篇博文)。 m函数文件: function = TydhV_imfxcv( TW486012 ) %向量求自相关、作emd分解,再求各分量平均周期 x_TWTW=xcov(TW486012,'unbiased'); x_TW=x_TWTW(length(TW486012):end);%只取时延不小于0部分 a=ones(1,length(TW486012)); a(end-299:end)=linspace(1,0.2,300);%构造一窗函数以消除自相关函数 %末端数据发散严重问题 x_TW=x_TW.*a; imf_xTW=emd(x_TW); %for k=1:size(imf_xTW,1) % subplot(ceil(size(imf_xTW,1)/3),3,k) % plot(imf_xTW(k,:)) %end%图就不作了 TydhV_xTW=TydhV_imf(imf_xTW);%上篇博文中自写程序 end 以文件名“TydhV_imfxcv”保存。 %体温 TydhV_xTW = TydhV_imfxcv( TW486012 ) VT= ; %脉搏 TydhV_xMB = TydhV_imfxcv( MB486012 ) VT= ; %收缩压 TydhV_xGY = TydhV_imfxcv( GY486012 ) VT= ; %舒张压 TydhV_xDY = TydhV_imfxcv( DY486012 ) VT= ; %均压 TydhV_xJY = TydhV_imfxcv( JY486012 ) VT= ; %差压 TydhV_xCY = TydhV_imfxcv( CY486012 ) VT= ; (二)再看看信号序列平方函数的imf分量平均周期 function = TydhV_imfx2(TW486012 ) TW2=TW486012.^2; TW2=TW2-mean(TW2);%0均值一下以减少emd运算量 imf_TW2=emd(TW2); TydhV_TW2=TydhV_imf(imf_TW2); end 以文件名“TydhV_imfx2”保存。 %体温 TydhV_TW2 = TydhV_imfx2( TW486012 ) VT= ; %脉搏 TydhV_MB2 = TydhV_imfx2( MB486012 ) VT= ; %收缩压 TydhV_GY2 = TydhV_imfx2( GY486012 ) VT= ; %舒张压 TydhV_DY2 = TydhV_imfx2( DY486012 ) VT= ; %均压 TydhV_JY2 = TydhV_imfx2( JY486012 ) VT= ; %差压 TydhV_CY2 = TydhV_imfx2( CY486012 ) VT= ; stem(VT) 运行,得: 图21-1.各信号序列及其自相关函数、平方函数的imf分量的平均周期串联图 %将周期数据向量VT按从小到大的次序排列: =sort(VT);%index是各数据在原向量VT中的序号 logb=log10(b);%取对数 stem(logb) 运行,得: 图21-2.各信号序列及其自相关函数、平方函数的imf分量的平均周期排序图。 上图纵坐标是周期数据的10的幂指数。从这张图中就可以看出人体生理信号很明显的节律性了。图中的台阶,表示从不同的方法处理不同通道信号所得周期数据的聚集性。在低周期端尤其明显。这是因为,对于一定长度的实验数据来说,周期越短,参见统计的波形数量就越多,统计就越精确。随着实验数据的进一步增加与信号处理方式的增加,我相信长周期端的曲线台阶也会变得越来越明显。如果人体生理没有节律性,得到的周期数据就只是些随机数,没有聚集性。其周期排序图将是一条很光滑的曲线(直线)。 stem(index) 运行,得: 图21-3.各周期数据原序号 通过周期数据原序号索引可以回查排序后每一个周期数据的来源(何种处理方式处理何种信号所得数据)。这个不多说了。 %周期数据频数统计 = hist(logb, ); subplot(1,2,1) barh(xout,n) subplot(1,2,2) bar(logb) 运行,得: 图21-4 各周期数据排序及频数统计图 x=zeros(34,6); x(1:34,1)=n(1:34); x(1:34,2)=xout(1:34); x(1:34,3)=n(35:68); x(1:34,4)=xout(35:68); x(1:33,5)=n(69:101); x(1:33,6)=xout(69:101); x截图: 图21-5 频数及周期幂指数变量截图 统计频数在5个及以上的周期有12个,其周期幂指数分别为0.7000、0.9400、1.1400、1.1800、1.3800、1.4200、1.6600、1.7400、2.0200、3.3800、3.6200、3.7800。将上面12个幂指数换算成周期: z= ; y=10.^z; 运行,得y值: 5.01187233627272 8.70963589956081 13.8038426460288 15.1356124843621 23.9883291901949 26.3026799189538 45.7088189614875 54.9540873857625 104.712854805090 2398.83291901949 4168.69383470336 6025.59586074358 以上为时辰数。2398.83291901949/12 = 199.9027天。 这样统计出来的结果,其可靠性就比较高了。当然,这次参加频数统计的周期数据样本还不够多。我以后会将各种信号处理方式所得到的周期数据,添加到其向量VT中,继续这项统计。 (本文首发于: http://blog.sina.com.cn/s/blog_6ad0d3de010128ok.html 首发时间:2012-01-10 11:49:45)
个人分类: 斤斤计较|2773 次阅读|0 个评论
17、非议PSI周期说
baishp 2012-11-29 00:14
前几篇博文的计算本以为很顺利,后来发现工具箱瞬时频率函数有问题,就暂停一下。现将我前一段时间写的有关“PSI周期说”的一篇草稿整理贴出。 关于人体节律方面,有一个极其有名、流传极其广泛的说法,那就是“人体生物钟(PSI)周期说”。这里,“PSI”是英文Physical(体力),Sensitive(情绪),Intellectual(智力)的缩写。这个说法认为:人的体力存在着一个从出生日算起以23天为一周期的“体力盛衰周期”;人的感情和精神状况则存在着一个从出生日算起以28天为一周期的“情绪波动周期;而人的智力状况存在着一个从出生日算起以33天为一周期的“智力强弱周期”。据说,这些规律,是20世纪初德国柏林的内科医生威廉·弗里斯、奥地利维也纳的心理学家赫尔曼·斯沃博达和奥地利的机械工程学教授阿尔弗雷德·特尔茨谢尔,各自通过长期的观察,用统计学的方法对观察到的大量事实进行分析后,分别独自发现的。 对这个说法,人们要么盲目地相信,要么简单地怀疑,但总未见有人拿出铁的科学证据来加以证实或推翻。在测试技术与信号、信息处理技术日新月异地发展的今天,这实在是一件让人感到很遗憾、也让人感到很纳闷的事儿。下面谈谈我对这个问题总的看法。 我认为“PSI周期说”,把人的体力、情绪与智力当作三个不同周期的分量,是一个根本性的错误。人的体力、情绪与智力,它不是三个不同周期的分量,而是同一个周期的分量在不同时期的不同表现。换言之,决定人的体力、情绪与智力盛衰强弱的,不是周期,而是相位。人体会有许多不同周期的“生理周期波”(每一个“生理周期波”也可称为一个“生理周期分量”或简称“分量”)。任何一个周期的“生理周期分量”,都会包含人的体力、情绪与智力的盛衰强弱的相位。而人体最终表现出来的体力、情绪与智力的状况,是这所有的“生理周期分量”合成后的结果。而且由于每一个“生理周期分量”的时变性与各“生理周期分量”合成时的非线性,最终合成的“生理周期波”将呈现非常复杂的形式。 这种复杂现象,只有通过精密的测试与严格的数学计算,并配合丰富的经验案例,才可能了解其规律的。传述中“PSI周期”的发现者们,是“各自通过长期的观察,用统计学的方法对观察到的大量事实进行分析后……发现的”,只有“观察”,没有“测试”,而能够得出这样的结论,超出我的想象,匪夷所思。 人体是一个精神与肉体、心理与生理一分为二、合二为一的对立统一体,二者相互影响是一个毋庸置疑的事实。无论是从中医经典、佛道教义的阐述,还是从现实的体验与观察中,都可以确认这一点。任何精神与心理的现象,在其生理信号统计中都必定会有与之相应的反映。当然,生理信号的测试需要有足够的精度与通道数。 关于“PSI周期说”的错误之处,以后必定会被我的各项研究、计算逐步证实。此言。 (本文首发于: http://blog.sina.com.cn/s/blog_6ad0d3de0100zql1.html 首发时间:2011-09-24 10:51:37)
个人分类: 指手划脚|4024 次阅读|0 个评论
5、互相关函数估计
baishp 2012-11-27 18:33
5、互相关函数估计
这一篇来看看各信号序列体温TW267212_0,高压GY267212_0,低压DY267212_0,(均压JY267212_0,差压CY267212_0),脉搏MB267212_0的互相关函数图。 %体温与高压的互相关函数图 RR_TWGY2672=xcorr(TW267212_0,GY267212_0,'unbiased'); plot(RR_TWGY2672) title('TW267212_0,GY267212_0的互相关函数RR_TWGY2672图') 运行,得: 图5-1 TW267212_0,GY267212_0的互相关函数RR_TWGY2672 将RR_TWGY2672导入信号处理工具sptool,打开信号观察器窗口Signal Browser,并放大横轴128倍,纵轴3.56倍,得图5-2。 图5-2 RR_TWGY2672横轴放大128倍,纵轴放大3.56倍 可以看到其波峰位置大致可以分为两类,一类位于图形上包络线上,一类位于上下包络线之间且靠近下包络线。RR_TWGY2672的长度是32064×2-1=64127,但信号观察器窗口Signal Browser信号第一个数据横坐标为“0”,因此图中左标尺的位置32063,实际上就是时延为0时的互相关函数值。互相关函数为什么在时延为0处也有一个特别大的峰值呢?很奇怪。 图中波峰位于上包络线上的波形周期为dx/35=418/35=~11.9429。可见此波形周期并不必然等于12即1天。这是为什么呢? 波峰位置位于上下包络线之间,我大致看了一下,这种现象主要位于曲线中部。在曲线两边,我看到的波峰位置都在上包络线上。见图5-3。 图5-3 RR_TWGY2672标尺换位 图中波形周期为dx/32=385/32=12.03125。 再看体温与低压的互相关函数图: RR_TWDY2672=xcorr(TW267212_0,DY267212_0,'unbiased'); plot(RR_TWDY2672) 运行,得: 图5-4 TW267212_0,DY267212_0的互相关函数RR_TWDY2672 图5-5 RR_TWDY2672在中心线附近的波形放大图 在信号观察器Signal Browser中放大RR_TWDY2672,可以看出一个波形的周期为dx/40=480/40=12。此图中左边的标尺位于一个明显较大的波峰上,其横坐标32064,比图5-2右移一个采样单位。 图5-6 RR_TWDY2672在中心线左侧某处的波形放大图 可以看出每一个波形有两个并列的波峰。这样的波形周期为dx/22=276/22=12.5455。在整个横轴上,波形由等距单个波峰变为近距并列双峰,这种变化不止一次。由于数据太长,手工查起来比较费事,就不仔细清查了。反正已经知道,在体温-高压互相关函数RR_TWGY2672与体温-低压互相关函数RR_TWDY2672中,周期在T=12左右摆动的波形,是由(至少)两个周期有微小差异(或相位摆动)的波形叠加而形成的。 下面看体温与均压、差压的互相关函数图: RR_TWJY2672=xcorr(TW267212_0,JY267212_0,'unbiased'); plot(RR_TWJY2672) 运行,得: 图5-7 TW267212_0与JY267212_0的互相关函数RR_TWJY2672 图5-8 RR_TWJY2672放大图 其左标尺位置32063是时延等于0处,此处波峰明显较附近其它处大。此处波形周期为dx/20=241/20=12.05。 RR_TWCY2672=xcorr(TW267212_0,CY267212_0,'unbiased'); plot(RR_TWCY2672) 运行,得: 图5-9 TW267212_0与CY267212_0的互相关函数RR_TWCY2672 图5-10 RR_TWCY2672放大图 其左标尺位置32065是时延等于0处右移两个采样单位,此处波谷(绝对值)明显较附近其它处小。此处波形周期为dx/20=239/20=11.95。 体温与血压的互相关函数图就贴到这里。下面看看高压与低压、均压与差压的互相关函数图。它们的互相关系数在上一篇中已经给出过了。 RR_GYDY2672=xcorr(GY267212_0,DY267212_0,'unbiased'); plot(RR_GYDY2672) 运行,得: 图5-11 GY267212_0与DY267212_0的互相关函数RR_GYDY2672 图5-12 RR_GYDY2672放大图 此图中,左标尺位置32063为时延等于0处,且此处的波峰值既较附近波峰值大很多。波峰位于上包络线上的波形周期为dx/30=360/30=12。 RR_JYCY2672=xcorr(JY267212_0,CY267212_0,'unbiased'); plot(RR_JYCY2672) 运行,得: 图5-13 JY267212_0与CY267212_0的互相关函数RR_JYCY2672 图5-14 RR_JYCY2672放大图 此图中,左标尺位置32063为时延等于0处,且此处的波峰值较附近波峰值大很多。此图看不出明显的周期性波形了。 下面贴出均压、差压与脉搏的互相关函数图: RR_JYMB2672=xcorr(JY267212_0,MB267212_0,'unbiased'); plot(RR_JYMB2672) 运行,得: 图5-15 JY267212_0,MB267212_0的互相关函数RR_JYMB2672 图5-16 RR_JYMB2672放大图 RR_CYMB2672=xcorr(CY267212_0,MB267212_0,'unbiased'); plot(RR_CYMB2672) 运行,得: 图5-17 CY267212_0,MB267212_0的互相关函数RR_CYMB2672 图5-18 RR_CYMB2672放大图 下面贴出体温与脉搏的互相关函数图: RR_TWMB2672=xcorr(TW267212_0,MB267212_0,'unbiased'); plot(RR_TWMB2672) 运行,得: 图5-19 TW267212_0,MB267212_0的互相关函数RR_TWMB2672 图5-20 RR_TWMB2672放大图 图5-21RR_TWMB2672干涉条纹图 最后再看看体温、均压、差压与脉搏的互相关系数: c=corrcoef( ) 运行,得: c = 1.0000 0.0181 -0.0721 0.6069 0.0181 1.0000 0.5091 0.1765 -0.0721 0.5091 1.0000 -0.0227 0.6069 0.1765 -0.0227 1.0000 说明 : TW267212_0,JY267212_0的互相关系数c_TJ=0.0181; TW267212_0,CY267212_0的互相关系数c_TC=-0.0721; TW267212_0,MB267212_0的互相关系数c_TM=0.6069; JY267212_0,CY267212_0的互相关系数c_JC=0.5091; JY267212_0,MB267212_0的互相关系数c_JM=0.1765; C Y267212_0,MB267212_0 的互相关系数c_CM=-0.0227; 基本上可以认为:体温与均压、差压都没有相关性;差压与脉搏也没有相关性。 我为什么不厌其烦地在这里贴这些图、记这些数?因为某些现象我现在还不能很清楚地解释其原因,需要将来进一步的研究,如功率谱分析、时频分析……之后,再回过头来看。我把它记下来,既可提醒自己以后继续思考,也可以作为资料提供给将来其他的同道爱好者研究。我希望人们将来研究生理学、生命科学的热情,就象迄今为止人们研究物理学一样,有一事不知即为耻。 作为“开放巨系统”中的一个“子系统”,这些资料是不可能再生的。时间不会倒流,空间不可重叠,其中每一张图片、每一个数据都是不可复制的。俗话又说,生死无常,生命脆弱。如果哪一天呼啦啦我的房子倒了,那么这些资料就等于是从废墟中抢救出来的“珍稀贵重物品”了。嘻! (本文首发于: http://blog.sina.com.cn/s/blog_6ad0d3de0100os3d.html 首发时间:2011-01-10 15:53:09)
个人分类: 斤斤计较|4658 次阅读|0 个评论
3、自相关函数估计
baishp 2012-11-27 12:35
3、自相关函数估计
对于做科研工作或工程应用的人来说,拿到一列或数列随机信号观测序列,首先想到的就是看看它们的自相关、互相关函数,自功率谱、互功率谱密度函数估计吧。 这一篇对上一篇中各数据矩阵TW4615_12、TW2672_12、GY2672_12、DY2672_12、MB2672_12数据作一下相关函数估计,并给出其图形。 MATLAB程序如下(注:为了以示区别,本博客各博文中运行的程序(包括源代码及注释)全部采用斜体)。 %先将各矩阵转换为零均值(时间平均)的一维时间序列 TW461512_0=TW4615_12';4615天体温 TW461512_0=TW461512_0(:); TW461512_0=TW461512_0-mean(TW461512_0); subplot(2,2,1)%绘制子图 plot(TW461512_0) TW267212_0=TW2672_12';%TW4615_12后半部分2672天体温 TW267212_0=TW267212_0(:); TW267212_0=TW267212_0-mean(TW267212_0); GY267212_0=GY2672_12';%高压 GY267212_0=GY267212_0(:); GY267212_0=GY267212_0-mean(GY267212_0); subplot(2,2,2) plot(GY267212_0) DY267212_0=DY2672_12';%低压 DY267212_0=DY267212_0(:); DY267212_0=DY267212_0-mean(DY267212_0); subplot(2,2,3) plot(DY267212_0) MB267212_0=MB2672_12';%脉搏 MB267212_0=MB267212_0(:); MB267212_0=MB267212_0-mean(MB267212_0); subplot(2,2,4) plot(MB267212_0) 运行,得: 图3-1 各信号数据时间序列 %计算各信号序列自(互)相关函数并画图.由于序列都已经0均值化,故相关函数等价于协方差函数. R_TW4615=xcorr(TW461512_0,'unbiased') plot(R_TW4615) 运行,得: 图3-2 TW461512_0的自相关函数R_TW4615图形 R_TW4615的长度为55380*2-1=110759(采样点单位为两个小时即一个时辰)。数一数图形包络线上面的“锯齿”,中心线左右大略各为12个多,因此一个“锯齿”代表一年应该没什么问题。 由于函数序列比较长,所以看起来黑乎乎的一大块。将函数R_TW4615导入信号处理工具sptool,打开信号观察器窗口Signal Browser,并放大横轴,得图3-2。 图3-3 R_TW4615横轴放大 可以看出,位于两个波峰处的两根标尺,当中的波形数量为10个,两根标尺之间的距离是dx=120。因此此图中一个波形的周期是12,即1天,是没有什么问题的。当然,图3-2、图3-3的波形周期都只是凭肉眼观测。严格地说,要确定一函数序列中的各频率周期,还要依靠一套算法才行。这个以后再讨论。 由于周期函数的相关函数也必定是周期函数,因此R_TW4615的周期成分也应该是TW461512_0的周期成分(不过从逻辑上好像不能这么推论。希望内行的朋友赐教:“反之亦真”的必然性在哪?)。 从TW461512_0的自相关函数图中很容易就看得出的频率成分就这两个。将信号观察器窗口Signal Browser的横轴随意缩放,可以看到R_TW4615的图形常常会出现一些类似“干涉条纹”的现象,如图3-4就是其中的一个。 图3-4 R-TW4615图形中出现的“干涉条纹”现象 很容易看出来,图3-4中两根标尺之间有3个波形,两根标尺之间的距离大约为dx=2712,因此一个波形的周期大约是2712/3=904。这个到底是不是TW461512_0中的一个周期成分呢?我不知道。留待以后慢慢思考。验证。也请内行朋友赐教。这一类的“干涉条纹”图还有很多,无法尽举。我大致数了的,周期成分还有: 516372.89354.32327.6323.5319.2279262.15262258188.11186.44163.71138.92131.14131.0881.85777.45474.18267.6665.07734.60433.84…… 上面的数据只是我随意缩放横轴后,用鼠标拖动标尺所测量到的各“干涉条纹”图中波形的周期,虽然其小数点后面保留了几位数字,但这并不代表精度。 下面贴出血压部分的相关函数图。 R_GY2672=xcorr(GY267212_0,'unbiased'); plot(R_GY2672) 运行,得: 图3-5 GY267212_0的自相关函数R_GY2672图形 仍旧将R_GY2672导入信号处理工具sptool,打开信号观察器窗口Signal Browser,并放大横轴与纵轴,得图3-6 图3-6 R_GY2672横轴纵轴放大 从图中可以看出,两根标尺之间有20个波形,标尺之间的距离是dx=240,因此一个波形的周期是240/20=12,即一天。 R_DY2672=xcorr(DY267212_0,'unbiased'); plot(R_DY2672) 运行,得: 图3-7 DY267212_0的自相关函数R_DY2672图形 上图的放大图就不贴了。R_GY2672与R_DY2672在信号观察器窗口Signal Browser中,缩放横轴,也都可以看到“干涉条纹”图,只是测起波形周期来没有X_TW4615那么简明,就略去了。 下面贴出脉搏的自相关函数图。 R_MB2672=xcorr(MB267212_0,'unbiased'); plot(R_MB2672) 运行,得: 图3-8 MB267212_0的自相关函数R_MB2672图形 下面是信号观察器窗口Signal Browser中R_MB2672横轴放大后得到的“干涉条纹”图。 图3-9 R_MB2672的干涉条纹图 可以看出其一个波形的周期为dx/18=1848/18=102.6667。其余波形周期暂就不数了。 本来想把自相关、互相关函数图在这一篇中全部贴出的,发现至此内容已经不少了,互相关部分就放到下一篇再贴吧。 (本文首发于: http://blog.sina.com.cn/s/blog_6ad0d3de0100op1f.html 首发时间:2011-01-06 15:04:03)
个人分类: 斤斤计较|5815 次阅读|0 个评论
1、研究缘起_从人体生理信号开始研究,直趋宇宙天地人生大奥秘
baishp 2012-11-27 00:40
寒来暑往,斗转星移,宇宙天地的运动就是律动。人生于天地之间,无时无刻不在与天地进行着节律互动。其实说“互动”只是一种方便的说法,严格地说,人体与宇宙天地都受着同样的一种力量支配,呈现着相关性很强的节律。人们最了解、最不容置疑的一个事实,就是女人们每月一次的例事。如果我们眼睛看到了,身体感觉到了,我们就承认,否则就不承认,那真是愚蠢之极。因为我们眼力有限,感觉也迟钝。我们平时看不到、感觉不到的现象,到了某个时候却会变成撕心裂肺、天崩地裂的大事。所以我们应该尽量全面地了解人体节律。节律是我们生老病死的主宰,也是我们研究生老病死的枢纽。 根据我们传统文化里的“干支”理论,人体有一部分的节律周期,与我们肉眼看得到的宇宙天体运行周期相同,如地支中的“月支”与“时支”;有一部分的节律周期,却无法从宇宙天体运行周期中得出,如天干、“年支”与“日支”。人体到底有哪些节律周期呢?这仍是一个谜。即便现有的干支理论,其实也是尚未得到现代科学意义上证实的事情。只是老祖宗留给我们这么个东西,我们就用了。中医医理。命理八字,学得好的人,用起来十中八九也不是极罕见的事。但另一方面,我们却从来没有看到过一个百发百中的活神仙。这说明我们身体的节律,始终有一部分还未被人了解、认识。 在现代,涉及到中医、人体生命科学、人体节律研究的,可以大致分为两大阵营。一是在现代医学、系统科学知识环境下成长起来的人,可称之为“科班”出身的人,包括一些很有名的大科学家(如钱学森先生)。这一部分人又始终停留在两个极端:要么就是宇宙开放巨系统、复杂性科学、混沌理论……这些乍听起来玄乎得很的理论。也不知他们到底要拿什么来做研究的“原材料”。你总得要有观测数据吧?没有数据的研究,只能永远停留在哲学思辩上。这些“科班”人士要么就是停留在另一个极端,眼睛看着具体一时的个体,几秒钟、几分钟的心电图、脑电图……而至今看不到这两个极端互相靠拢的一丝丝 迹 象。 这些“科班”人士还有一个共同的特点,就是对传统文化总是无法做到完全的开放,完全的兼容并蓄。说先入为主也好,思想桎梏也罢,都可以。记得有位学者,对传统文化与中医都很推崇,但他在一次演讲中却说“八字是迷信”,令人唏嘘不已(因为最近没有搜到这段话了,故略去其名)。岂不知现在的子平八字,它最初的理论根据正是源于中医始祖典籍《黄帝内经》。 另 一 阵营的人,就是民间研究命理八字、易经易学、医理医易的这些人,也可称为草根人士。这些人思想开放、活跃,可惜大多没受过现代科学知识的熏陶,无法用现代科学的手段来深入研究他们极其感兴趣的这门学问。不过也正是这些人,延续、保存了我们传统文化最宝贵的这一部分内容,功为至巨。 这两个阵营,如果能够互相接头、融合,对中医与生命科学的研究,必将产生本质性的、飞跃性的推动作用。 南怀瑾先生在讲解《黄帝内经》时指出:《黄帝内经》的宗旨,最重要者是“举痛论篇”中所说的三要义:“(一)善言天者,必有验於人。(二)善言古者,必有合於今。(三)善言人者,必有厌於己。如此则道不惑而要数极,所谓明也。”意思凡是谈到天地之道,都必定会在人类身上反映出来;凡是古时的天地规律,亦必适用于现代;凡是在别人身上存在的规律,也必定会存在于在自己身上。所谓“道不远人”吧。因此要研究宇宙天地之道,并不需要用高倍天文望远镜观测十万亿光年之外的宇宙深处。只要把自己研究透了,也等于把宇宙研究透了。老子“道可道,非常道”,“惚兮恍兮,其中有象;恍兮惚兮,其中有物”……他从哪里去弄高倍天文望远镜啊?也无法想象他能够用复杂巨系统理论来研究宇宙。 博主由于个人命运的关系,在十多年前对宇宙天地、生命、生死之道产生了很大兴趣,阅读了一些传统文化典籍,也领悟到探求这个“道”,重点在对自身的研究;另一方面,由于博主工科出身,对传统文化(中医医理、八字命理)中既有的研究方式,也就是只有定性的论述,没有定量的研究手段,极不适应。因此打算另辟蹊径,将现代科技手段与传统文化结合起来研究。 要对自身作定量的研究,除了不断测量自身的生理信号,研究这些生理信号外,还有什么途径?没有。人体生理信号有无数,但要长期、大量测量,必须是很容易获得的信号数据,必须是非侵入式测量。结合博主所能获得的测量工具,即定在体温、血压(包括收缩压与舒张压)与脉搏这三类四种信号。 关于“道”,真是一个说不完的话题。这个“开篇词”就写到这里吧,以后慢慢道来。也希望以后与博友们有很好的互动,彼此帮助,共同进步。 (本文首发网址: http://blog.sina.com.cn/s/blog_6ad0d3de0100oofe.html 首发时间:2011-01-04 19:49:21)
个人分类: 夸夸其谈|1112 次阅读|0 个评论

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

GMT+8, 2024-6-2 15:22

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部