LEU信号的图像预处理 (二)信号幅度、上升沿与下降沿时间的计算
上篇文章表达和格式都比较乱,其实主要表达的是几种处理文章一中LEU混合信号波形的一些想法,并进行了尝试和对比。
如文章一:
https://blog.csdn.net/weixin_44012033/article/details/103587680
所讲,处理LEU混合信号的目的是为了求各波形的参数,并按照信号传递的规则,计算该波形传递的信息。
本文在文一对两种信号提取、分离的基础上计算完成如下目标任务:
1.连接170Ω阻性负载时,计算每个C6波形的峰值,验证其是否符合大于20V,小于23V的要求。
2、计算连接120Ω阻性负载时,C1的实际信号幅度,验证其是否满足每个信号的幅度在14V-18V之间
3.计算连接120Ω阻性负载时,每个C1信号的上升沿和下降沿(10%-90%)的时间,验证是否每个C1波形的该时间都大于100ns。
在文章一中给出了各电阻、各采样精度下的不同数据。针对任务1~3,设计计算每个C6信号的峰值、每个C1信号的幅度、每个C1信号的上升沿下降沿时间。
对于C6峰值,要计算每个C6信号的峰值,又由于C6信号为正弦信号,其峰值对于同一段信号来说是不变的。在文章一中计算出了C6波形的拟合方程,其峰值A可认为是C6信号的峰值。只需验证A是否满足相应的要求即可。
对于C1信号,将混合波形数据减去对应的C6正弦波得到C1信号的波形数据。从文章一的计算结果来看,C1信号并不整齐,如:
放大后的波形:
实际上C1信号的波形应为方波,标准方波图如下红色线条所示:
通过对图像与数据的观察发现,C1信号由两种不同的周期的信号组合而成,通过铁路局的需求说明书可以查到,它们分别代表单周期的方波和双周期的方波,其波形变化根据差分双相电平编码的规则代表不同的信息,该波形的信息解码方法,将在下一篇讨论。
C1峰值的数据特征为在峰值高度线附近,有整个曲线最多的数据点。同样使用如上文计算C6近似曲线的B值的方法,通过建立小矩形,纵向扫描整个图像,即计算不同y轴高度下,每个小矩形内数据点的个数,分别提取y>0与y<0部分包含最多数据点的小矩形的位置,作为C1信号的实际峰值。
如上图,通过绿色方框将混合波型数据扫描一遍,找出能框住最多数据点的矩形,其横向的中心线即为C1的峰值高度线。分别找出在X轴上方与下方的峰值高度线,两者的差即为C1信号的幅度。
接下来,计算C1波形的上升沿下降沿时间。首先,使用计算得出的峰值高度线将C1信号转化为规范的方波信号;然后使用规范后的方波来卡出我们想要的每个周期的具体范围,在每个范围内通过寻找最大最小值来找到上升沿和下降沿的起始点与结束点,然后按规则计算上升沿下降沿高度的10%-90%所用的时间。注:此方法找到的上升沿和下降沿的起始点与结束点并不准确,但后面将会讨论,在此规则下,此方法的适用性。
将在红线上方,即X轴上方的数据点,使其横坐标不变,纵坐标变为C1波形的正向的实际峰值,同样按此方法修改x轴下方的数据点,使其落在C1实际峰值线上,则得到如下图红色线所示方波:
如上图,将两个红色三角之间视为上升沿,两个绿色三角之间视为下降沿。对于中间出现较宽区间是,发生波折的图形进行忽略不计。对上述单周期区间的波形进行提取,提取依据为在此波形上画出规范后的C1波形,对于单周期区间,每个区间内有原C1波形的最高点或最低点,如果当前规范的波形所在的X区间与下一个规范波形所在的区间属于单周期区间的范围,则提取这两个区间对应的最大值与最小值,这两点即这两点之间的数据点就构成了该上升沿或下降沿,如上述成对三角之间的各数据点,进一步可得出每个符合要求的上升沿高度的10%–90%之间的数据点所在的时间范围,即每个上升沿所花费的时间。最后取最大值、最小值、平均值,当该结果通过绘图检验后,将最小值作为最终计算上升沿时间的结果。下降沿时间的计算方法与上升沿相同。
此方法的适用性讨论:对于不同类型的C1,或者说畸变程度不同的C1波形,通过上述方法寻找峰值点,然后两相邻的峰值点视为上升沿或下降沿是不一定成立的,如:
这样得出的并不是实际的上升沿与下降沿,但需要求的是上升沿高度的10%-90%,也就是说图中的非上升沿或非下降沿部分会不被记入,对结果没有产生影响。当然,此方法仍存在误差,只是在计算中已经尽可能
其实对于真实图像来说,哪个点可以作为上升沿的起始点和结束点是我们现在还没法判断的,在不同负载下,甚至在不同的C1的波形,它的图像特征都是不同的。所以本方法的设计思路为,尽可能将上升沿、下降沿时间往更小的方向去算,即该方法的计算结果偏小,但仍能满足要求,则说明实际上升沿下降沿时间的10%-90%所用的时间也一定会满足要求。如下图,本文计算时使用的是蓝色大括号所指的点在X轴上的范围(以数据点的位置为准,受不同采样率的影响较大),实际值应为黑色大括号所指区间所花费的时间。
Matlab代码实现:
脚本函数:
data=xlsread('C:\Users\Administrator\Desktop\工作\信号文件\可使用\scope_31_NO_LBL.xls’);
x1=data(1:end,1);
y1=data(1:end,2);
%%%%%%%%%%%%
kuadu=0.000005;%小矩形的宽(X坐标轴上的跨距),用于包裹并计算大图像的轮廓
Yzhou=0.0003;%参数三用于计算C6的拟合波形中的参数C
C1BO_zhouqi=0.0000011.2;
kuaduC1=0.000015;
%%%%%%%%%%%%
[A,XYjunzhi,XYup,XYdown] =fc6_A(x1,y1,kuadu);%求A并返回上下轮廓和中心描点数据,方便进行绘图数据
B=fc6_B2(x1,y1);
C=fc6_C2(XYjunzhi,A,B);
%%%%%%%%%%%%到此,将C6信号,计算完毕
[C1height,c1Hlinezheng,c1Hlinefu,XYC1up,XYC1down,HHx,HHy,zheng,fu]=fC1_fengzhi(x1,y1,kuaduC1,C,A,B);%计算C1实际峰值c1Hline,及C1最高值C1height,C1包络XYC1up,XYC1down
%%%%%%%%%%%%%
[guaispot,C1]=fC1_guaidian(x1,y1,A,B,C,c1Hlinezheng0.8,c1Hlinefu0.8,C1BO_zhouqi);%根据C1实际峰值提取拐点,并插值
%2019/12/13发现,拐点提取时,不能按照C1实际峰值,需要把峰值线拉低,再以此提取拐点
%%%%%%%%%%%%设置裁剪函数,把拐点数据裁剪规则之后再使用
[The_time_up,The_time_down,Time_up,Time_down] =fC1_upordown_time(x1,y1,guaispot,C1BO_zhouqi);%%上升沿下降沿时间计算
disp(['C6峰值 ',num2str(2A)])
C1fengzhi=c1Hlinezheng-c1Hlinefu;
disp(['C1预计幅度 ',num2str(C1fengzhi)])
Time_upmin=min(Time_up);
disp(['上升沿时间最小值 ',num2str(Time_upmin)])
Time_downmin=min(Time_down);
disp(['下降沿时间最小值 ',num2str(Time_downmin)])
调用函数:
function [C1height,c1Hlinezheng,c1Hlinefu,XYC1up,XYC1down,HHx,HHy,zheng,fu]=fC1_fengzhi(x1,y1,kuaduC1,C,A,B)
HHx=x1;
HHy=y1-Asin(B(HHx-C)+pi/2);
%计算C1最高峰值与实际
C1X=HHx;
C1Y=HHy;
C1XSTART=min(C1X);
C1XEND=max(C1X);
[LC1X,mC1X]=size(C1X);
C1qujian=C1XSTART:kuaduC1:C1XEND;
[LC1q,MC1q]=size(C1qujian);
XYC1up=[];%存储目标点的坐标(上)
XYC1down=[];%存储目标点的坐标(下)
XYC1junzhi=[];%存储目标点的坐标(中)
for xc=2:MC1q
Y=[];%存储当前X区域内的点的纵坐标
for t=1:LC1X
if C1X(t)>=C1qujian(xc-1)&&C1X(t)<C1qujian(xc)
Y=[Y;C1X(t),C1Y(t)];
end
end
[Ymax,wup]=max(Y(:,2));
[Ymin,wdown]=min(Y(:,2));
XYC1up=[XYC1up;Y(wup,:)];
XYC1down=[XYC1down;Y(wdown,:)];
end
C1height=abs(mean(XYC1up(:,2)))+abs(mean(XYC1down(:,2)));
SX=HHx’;
SY=HHy’;
%设y=HIGHT, 5<HIGHT<20,覆盖上下0.1的范围
HIGHT=5:0.05:30;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%参数,需提取
[LH,MH]=size(HIGHT);
[LS,MS]=size(SX);
zheng=zeros(1,2);
fu=zeros(1,2);
for HS=1:MS
if SY(HS)>0
zheng=[zheng;SX(HS),SY(HS)];
else
fu=[fu;SX(HS),SY(HS)];
end
end
[Lzheng,Mzheng]=size(zheng);%l*2
[Lfu,Mfu]=size(fu);
%HIGHT 上半轴高度
NIHE_H=zeros(1,MH);
for HI=1:MH
for HHL=1:Lzheng
if zheng(HHL,2)<HIGHT(HI)+0.1&&zheng(HHL,2)>HIGHT(HI)-0.1
NIHE_H(HI)=NIHE_H(HI)+1;%第HI个数+1
end
end
end
[MAXNIHE,LOCNIHE]=max(NIHE_H);%MAXNIHE为C1实际峰值
c1Hlinezheng=HIGHT(LOCNIHE);
%HIGHT 下半轴高度
HIGHT=HIGHT.*(-1);
NIHE_Hfu=zeros(1,MH);
for HI=1:MH
for HHL=1:Lfu
if fu(HHL,2)<HIGHT(HI)+0.1&&fu(HHL,2)>HIGHT(HI)-0.1
NIHE_Hfu(HI)=NIHE_Hfu(HI)+1;%第HI个数+1
end
end
end
[MAXNIHEfu,LOCNIHEfu]=max(NIHE_Hfu);%MAXNIHE为C1实际峰值
c1Hlinefu=HIGHT(LOCNIHEfu);
%计算上升沿与下降沿时间
%先提取出每个短周期的图像数据
end
function [guaispot,C1]=fC1_guaidian(x1,y1,A,B,C,c1Hlinezheng,c1Hlinefu,C1BO_zhouqi)
%根据C1实际峰值提取拐点,并插值
Huitu_X_F=x1;
Huitu_Y_F=y1-Asin(B(Huitu_X_F-C)+pi/2);
Huitu_X_F_F=Huitu_X_F;
Huitu_Y_F_F=Huitu_Y_F;
[Ly1,My1]=size(y1);
for iii=1:Ly1
if Huitu_Y_F(iii)>0
Huitu_Y_F_F(iii)=c1Hlinezheng;
end
if Huitu_Y_F(iii)<0
Huitu_Y_F_F(iii)=c1Hlinefu;
end
end
%提取方波拐点
guaispot=zeros(1,2);
for iii=2:Ly1-1
if (Huitu_Y_F_F(iii)==Huitu_Y_F_F(iii-1)&&Huitu_Y_F_F(iii)=Huitu_Y_F_F(iii+1))||(Huitu_Y_F_F(iii)=Huitu_Y_F_F(iii-1)&&Huitu_Y_F_F(iii)==Huitu_Y_F_F(iii+1))
guaispot=[guaispot;Huitu_X_F_F(iii),Huitu_Y_F_F(iii)];
end
end
guaispot=guaispot(2:end,:);
%下一步,提取方波各拐点坐标 Huitu_X_F_F,Huitu_Y_F_F
C1F=guaispot;
%对C1F(拐点进行插值)
[LC1G,MC1G]=size(C1F);
C1=[];
for k=2:LC1G
if C1F(k,1)-C1F(k-1,1)>C1BO_zhouqi
zmean=(C1F(k,1)+C1F(k-1,1))/2;
C1=[C1;C1F(k-1,:);
zmean,C1F(k-1,2);
zmean+0.00000005,C1F(k-1,2);];
else
C1=[C1;C1F(k-1,:)];
end
end
end
function [The_time_up,The_time_down,Time_up,Time_down] =fC1_upordown_time(x1,y1,guaispot,C1BO_zhouqi)
%%上升沿下降沿时间计算
[LX,MX]=size(x1);
[Lg,Mg]=size(guaispot);
%C1BO_zhouqi=0.000001;%大概%%%%%%%%%%%%%%%%%%%%%%%%%%参数,需要提取,
%C1波形的周期估计值,比实际大20%左右,目的是为了筛选当前周期是单周期还是双周期,C1BO_zhouqi为一个峰的两底端X坐标的差的1.2倍
Time_down=zeros(1,1);
Time_up=zeros(1,1);
for Cspot=2:Lg-4
up_spot=zeros(1,2);%上升沿区间,点的值
down_spot=zeros(1,2);%下降沿区间,点的值.
up_down_spot=zeros(1,2);%下降沿区间,点的值
DC=guaispot(Cspot+1,1)-guaispot(Cspot,1);
NEXTC=guaispot(Cspot+3,1)-guaispot(Cspot+2,1);%%%%限制拐点的正负
if (guaispot(Cspot,2)==guaispot(Cspot+1,2))&&(DC<C1BO_zhouqi)&&(NEXTC<=C1BO_zhouqi)%后一个=前一个,求该X范围内Y的最大值
for t=1:LX
if guaispot(Cspot,2)>0
if x1(t)>=guaispot(Cspot,1)&&x1(t)<=guaispot(Cspot+1,1)
up_spot=[up_spot;x1(t),y1(t)];
end
if x1(t)>=guaispot(Cspot+2,1)&&x1(t)<=guaispot(Cspot+3,1)
down_spot=[down_spot;x1(t),y1(t)];
end
end
if guaispot(Cspot,2)<0
if x1(t)>=guaispot(Cspot,1)&&x1(t)<=guaispot(Cspot+1,1)
down_spot=[down_spot;x1(t),y1(t)];
end
if x1(t)>=guaispot(Cspot+2,1)&&x1(t)<=guaispot(Cspot+3,1)
up_spot=[up_spot;x1(t),y1(t)];
end
end
end
up_spot=up_spot(2:end,:);
down_spot=down_spot(2:end,:);
[SSZup,SSLOCup]=max(up_spot(:,2));
[SSZdown,SSLOCdown]=min(down_spot(:,2));
H_up_spotx=up_spot(SSLOCup,:);%最大值的坐标,
H_down_spotx=down_spot(SSLOCdown,:);%最小值坐标
%下一步计算该下降沿的所用时间(10%-90%),并记录,最后求平均值
%下降沿范围:高度的10%-90%
cha=abs(H_up_spotx(2)-H_down_spotx(2));%该C1波的高度差
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if guaispot(Cspot,2)<0 %则该区间为由低到高,计算上升沿
Allspot=[down_spot;up_spot];
[LAllspot,MAllspot]=size(Allspot);
for tt=1:LAllspot %1提取最高点到最低点的x区间范围内的点
if (Allspot(tt,1)<=H_down_spotx(1)&&Allspot(tt)>=H_up_spotx(1))||(Allspot(tt,1)>=H_down_spotx(1)&&Allspot(tt)<=H_up_spotx(1))
if Allspot(tt,2)>=(H_down_spotx(2)+cha0.1)&&Allspot(tt,2)<=(H_up_spotx(2)-cha0.1)
up_down_spot=[up_down_spot;Allspot(tt,:)];
end
end
end
up_down_spot=up_down_spot(2:end,:);
Time_up=[Time_up;up_down_spot(end,1)-up_down_spot(1,1)];%%%%%%%%%%%%此为寻找到的上升、下降点
end
if guaispot(Cspot,2)>0 %则该区间为由高到低,计算下降沿
Allspot=[up_spot;down_spot];
[LAllspot,MAllspot]=size(Allspot);
for tt=1:LAllspot %1提取最高点到最低点的x区间范围内的点
if (Allspot(tt,1)<=H_down_spotx(1)&&Allspot(tt)>=H_up_spotx(1))||(Allspot(tt,1)>=H_down_spotx(1)&&Allspot(tt)<=H_up_spotx(1))
if Allspot(tt,2)>=(H_down_spotx(2)+cha0.1)&&Allspot(tt,2)<=(H_up_spotx(2)-cha0.1)
up_down_spot=[up_down_spot;Allspot(tt,:)];
end
end
end
up_down_spot=up_down_spot(2:end,:);
Time_down=[Time_down;up_down_spot(end,1)-up_down_spot(1,1)];
end
end
end
Time_down=Time_down(2:end);
Time_up=Time_down(2:end);
The_time_up=mean(Time_up);
The_time_down=mean(Time_down);
end