您的位置:首页 > 编程语言 > C语言/C++

铁路列车之间的通信协议(MVB协议)分析软件C/C++实现(三) 模式识别

2018-03-19 15:57 2016 查看
书接上文,在我们将电压值的模拟信号转为0 1 -1后,我们对大数据进行分析:

我们发现在6241组数据后数据基本处于一个比较稳定的状态,周期为333ns,我们可以发现在一个周期中高电压和低电压占了基本上的周期时间,而中间电压由于为跳变 所占时间是远小于高电压和低电压的时间,即一个周期中-1和1占了大多数 而0则作为跳变的信号占了少数,我们可以通过统计-1和1的数量来解析周期 通过解析0来确定跳变的发生。


从excel表格中的第6241组数据开始我们进行对连续的1计数发现其规律大概为37个1,7个0,37个-1左右的模式,我们大胆的假设在一个时钟周期中包含37个1,7个0,37个-1 即如下模式

即一个周期中含37+37+7=81采集周期为4ns 则我们判断出来的周期大概为81*4=324ns约等于333ns 由此我们可知我们的判断大致是对的 但是存在一定的误差 于是我把误差扩大到了±5ns 即37±5ns 我们都认定为是一个高(低)沿(ps:即图中37红色箭头所指的部分);
大概数值知道后,我们可以做如下判断 若一个周期里有37个1,7个0,37个-1,则判断为1,若有37*2个1则为H,若有37*2个-1则为L,若有37个-1,7个0,37个1,则为0,当然这样的情况考虑是不够的,我们还须对相邻的帧进行考虑,若H与1相邻则表现出的模式为37*3个1,7个0,37个-1等等等,方面太多 直接撸上代码 使用了编译原理词法分析中的 有限状态自动机的方法 状态为0 1 2 3 -1 -2 -3(状态转化条件如下图 其中状态1 2 3与状态-1 -2 -3是对称的)

代码大概如下 有什么问题可以评论区交流
//ps:cyc为周期37 dev为误差设为32
//略过前面为0的波形
if ((state == 0) && (num_main[i] == 0)) {
hNum = 0;
lNum = 0;
}
//遇到‘1’时转状态1并开始记录1的数量
if ((state == 0) && (num_main[i] ==
a7b2
1)) {
state = 1;
hNum = 1;
}
if ((state == 1) && (num_main[i] == 1)) {
hNum++;
}
//对称性同上
if ((state == 0) && (num_main[i] == -1)) {
state = -1;
lNum = 1;
}
//遇到0说明发生了跳变开始统计跳变发生前1的数量除37之后成为有几份
if ((state == 1) && (num_main[i] == 0)) {
num_zheng = hNum / cyc_test;
num_yu = hNum % cyc_test;
if (dev_test < num_yu) {
num_zheng++;
}
//1ns
if (num_zheng % 2 == 0)
l = 4 * i - num_zheng / 2 * 333;
else
l = 4 * i - num_zheng / 2 * 333 - 167;
while (1) {
if (num_zheng == 0) {
break;
}
//若只有1份说明为波形1
if (num_zheng == 1) {
//result[j] = 1;
//j++;
hNum = 0;
state = 2;
break;
}
//若有俩份说明为波形H
else if (num_zheng == 2) {
result[j] = 2;
time[j] = l;
j++;
if (hNum != 0)
state = 0;
else
state = 2;
hNum = 0;
break;
}
//若有多份说明有连续多个H将其解析出来
else if (num_zheng % 2 == 1) {
//result[j] = 1;
//j++;
hNum = 0;
state = 2;
num_zheng = num_zheng - 1;
//l = l - cyc_test * 4;
}
else {
result[j] = 2;
time[j] = l;
j++;
hNum = 0;
state = 0;
num_zheng = num_zheng - 2;
l = l + 333;
}
}

}
//零周期跳变
if ((state == 1) && (num_main[i] == -1)) {
}
//什么事都不做
if ((state == 2) && (num_main[i] == 0)) {
}
//Wrong
if ((state == 2) && (num_main[i] == 1)) {
}

if ((state == 2) && (num_main[i] == -1)) {
state = 3;
lNum = 1;
}
if ((state == 3) && (num_main[i] == -1)) {
lNum++;
}
if ((state == 3) && (num_main[i] == 0)) {
num_zheng = lNum / cyc_test;
num_yu = lNum % cyc_test;
if (dev_test < num_yu) {
num_zheng++;
}
//l
if (num_zheng % 2 == 0)
l = 4 * i - num_zheng / 2 * 333 - 167;
else
l = 4 * i - num_zheng / 2 * 333 - 167 - 167;
while (1) {
if (num_zheng == 0) {
break;
}
if (num_zheng == 1) {
result[j] = 1;
time[j] = l;
j++;
lNum = 0;
state = 0;
break;
}
else if (num_zheng == 2) {
//result[j] = 2;
//j++;
result[j] = 1;
time[j] = l;
j++;
lNum = 0;
state = -2;
break;
}
else if (num_zheng == 3) {
//result[j] = 2;
//j++;
if (lNum != 0) {
result[j] = 1;
time[j] = l;
j++;
l = l + 333;
}
result[j] = 3;
l = l + 333;
j++;
lNum = 0;
state = 0;
break;
}
else if (num_zheng == 4) {
//result[j] = 2;
//j++;
if (lNum != 0) {
result[j] = 1;
time[j] = l;
j++;
l = l + 333;
}
result[j] = 3;
time[j] = l;
j++;
l = l + 333;
lNum = 0;
state = -2;
break;
}
else if (num_zheng % 2 == 1) {
if (lNum != 0) {
result[j] = 1;
time[j] = l;
j++;
l = l + 333;
}
result[j] = 3;
time[j] = l;
j++;
l = l + 333;
lNum = 0;
state = 0;
num_zheng = num_zheng - 2;
}
else {
if (lNum != 0) {
result[j] = 1;
time[j] = l;
j++;
l = l + 333;
}
result[j] = 3;
time[j] = l;
j++;
l = l + 333;
lNum = 0;
state = -2;
num_zheng = num_zheng - 2;
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: