铁路列车之间的通信协议(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是对称的)
代码大概如下 有什么问题可以评论区交流
我们发现在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; } } }
相关文章推荐
- 铁路列车之间的通信协议(MVB协议)分析软件C/C++实现(四) 数据解析
- 铁路列车之间的通信协议(MVB协议)分析软件C/C++实现(五)确定每帧发生的时间
- 铁路列车之间的通信协议(MVB协议)分析软件C/C++实现(一) 文件预处理
- 铁路列车之间的通信协议(MVB协议)分析软件C/C++实现(二) 模拟信号转化为数字信号
- 服务端使用c++实现websocket协议解析及通信
- 在linux上使用c++实现http/2协议进行通信
- 实现客户端和服务器之间的通信(TCP协议、多线程)
- 【c/c++】完成端口服务器中转实现两个客户端之间通信
- 一个App架构例子分析--UI层使用MVP模式;各层之间使用Otto实现通信
- 利用桥接模式实现手机品牌和手机软件之间的解耦 C++
- Webservice 是通过什么协议实现的进程之间通信是怎么搞的
- [转] websocket新版协议分析+python实现 & websocket 通信协议
- C++实现及时通信软件
- 电子书下载:Delphi 网络通信协议分析与应用实现
- 利用C++ 虚函数实现类之间的通信
- adb 通信协议分析以及实现 (四) ADB shell 命令分析
- 服务端使用c++实现websocket协议解析及通信
- adb 通信协议分析以及实现 (三) (Adb 网络通信部分解析)
- Java语言实现简单FTP软件------>FTP协议分析(一)
- 基于REST协议实现iPhone和Google App Engine之间的通信