“前一篇文章介绍了NVH数采系统记录的原始文件常见的几种数据格式。本篇将介绍怎样找到具体的数据位置并还原它,从而实现编程直接读取原始文件的目的。”
01
—
画出整体数据
前一篇文章提到:数采系统记录的原始数据包含两部分:ASCII码明文和某类型的二进制数据。如图1。
图1
本文中,我们以24位数据格式来举例。要画出整体数据,可以对图1的原始文件进行如下3次尝试,如图2:
1)从文件开头,读取24位整型数据;
2)跳开8位,读取24位整型数据;
3)跳开16位,读取24位整型数据。
跳开24位,再读取24位数据的话,会和情况1)类似。
图2
第 1)次:没发现信号,如图3;
第 2)次:没发现信号,如图4;
第 3)次:发现测试信号,如图5。
图3
图4
图5
需要注意的是:图5中最前面的大数,是说明文字,而非数据。
同样的,如果数据格式是32位,则进行4次尝试,即可画出整体数据。
02
—
原始文件的数据排序
由于NVH数采系统的采样频率较高,每个通道记录的数据一般不会连续存储。常采用数据块(数据长度固定)的形式,按通道依次存储。
以3个通道记录的数据为例:要得到各通道数据,需要对整体数据进行重新排序,如图6。
图6
而解析原始数据格式,则是个逆向工程。需要先准备好各通道的数据(用NVH自身软件导出),然后从整体数据中找到其相应位置,如图7。
图7
虽说,图7过程和图8有些类似。但是,依然可以用一些数学方法让整个过程变得容易和充满乐趣。
图8
03
—
查找数据位置
我们拿NVH自身软件导出的某通道一小段数据(暂称为:目标数据)为例。目的是:找到这段目标数据在原始整体数据中的位置,如图9。
其实,刚开始,我是用肉眼对的~
。
但是,由于图9上图和下图数据完全不是一个数量级(上图是24位整形数据,需要乘以修正系数后,才能得到下图),所以给肉眼寻找增加了很多难度。
图9
后来,我用了一种更简单高效的方法:互相关。如图10。
图10
因为目标数据是整体数据中某段乘以修正系数的结果,所以它们严格线性相关。通过互相关计算,找到互相关最大值的位置,也就是目标信号的位置,如图11。
将目标信号放在互相关最大的位置,进一步验证:目标信号乘以一个系数后,和整体信号的一段完全吻合,如图11下图。说明我们找到了正确的位置。
图11
以上,即寻找某个通道数据在原始整体数据位置的方法。确认完所有通道数据在整体数据的各个位置后,该原始文件的解析工作也就基本完成。
04
—
总结
总结一下针对NVH原始数据文件的解析过程:
1)用NVH自身软件导出各通道数据备用。
2)读取NVH原始数据文件的ASCII明文内容,内含采样频率、通道数、各通道修正系数等。
3)已知数据格式(24位或32位等),进行多次数据读取尝试,找到合适的数据读取起始位置。
4)用之前备用的各通道数据作为目标数据,多次查找目标数据在原始文件整体数据中的位置。
5)知道原始文件整体数据的排列规律后,结合各通道修正系数,还原各通道数据。
以上是解析NVH原始数据文件的大致过程,具体过程及细节不再详述。在逆向解析的过程中难免会遇到各种问题,当然,乐趣,也尽在其中
。