1

我在 Labview 中有大量以二进制形式保存的文件,其中每一列都是一个时间戳簇,后跟一个单曲向量。

我使用将每个数据文件读入 Matlab r2013a

fid = fopen(filename);
data = fread(fid,[N M],'*single',0,'b');
fclose(fid);

我预先计算了输入数组 N,M 的大小。因为我知道数据应该是什么样子,所以我发现这data(1:5,:)是隐藏时间戳数据的地方,但它看起来像这样M = 1

[0 -842938.0625 -1.19209289550781e-07 0 4.48415508583941e-42]

第一个元素始终为 0,第二个元素以恒定的步长单调递减,第三个元素似乎是双稳态的,在两个非常小的值之间来回翻转,第四个元素始终为 0,第五个也是恒定的。

我假设它与 Labview 如何编码日期有关,但我的 google-fu 并没有帮助我解决这个问题。

为了使这个问题更笼统,那么:

Labview 在保存到二进制文件时如何对时间戳簇进行编码,我如何将其读出并将其翻译成另一种编程语言(例如 Matlab)中的有意义的数字?

编辑: 对于后代,这是我的最终代码(附加到上面的代码):

datedata = data(5:-1:1,:);
data(1:5,:) = [];

dms   = typecast(reshape(datedata(2:3,:),[],1),'uint64');
dsecs = typecast(reshape(datedata(4:5,:),[],1), 'int64');

timestamp = datenum(1904,1,1) + (double(dsecs) + double(dms)*2^-64)/(3600*24);

在 Mathworks 发布的代码@Floris 中,他们直接将类型转换为 double,但是当我尝试这样做时,我得到了垃圾。为了获得正确的日期,我必须先转换为整数,然后再转换为两倍。由于我的瓶颈是fread在线(从外部磁盘读取 0.3 秒),额外的类型转换步骤在宏伟的计划中是微不足道的。

额外的列 4.5e-42 转换为整数值 3200,即后续单曲向量中的值的数量。

4

2 回答 2

2

这不是一个完整的答案,但它应该有所帮助(我家里没有 Labview 或 Matlab,所以我现在无法检查)。

http://www.mathworks.com/matlabcentral/newsreader/view_thread/292060上有一篇文章描述了一个类似的问题。我从中提取了一些有用的信息:

  1. 时间戳是双的(不是单的)
  2. 需要翻转字节顺序(小端与大端)以理解事物

有一个有用的评论:

请注意,自 1904 年 1 月 1 日以来,LabView 时间约定为毫秒。这是一种方法(可能包含错误,但会为您指明正确的方向),

还给出了以下代码片段:

%% Read in date information
[ fid, msg ] = fopen(FileName, 'r') ;
NColumns = 60 ; % Number of data columns - probably different for your
dataset!
[a, count] = fread(fid, [ NColumns Inf], '*single') ; % Force data to
be read into Matlab workspace as singles
a = a' ; % Convert to data in columns not rows
% The last two columns of a are the timestamp
b = fliplr(a(:, end-1:end)) ; % Must swap the order of the columns
d = typecast(reshape(b',[],1), 'double') ; % Now we can can convert to
double
time_local = datenum(1904, 1, 1) + d/(24*3600) ; % Convert from
seconds to matlab time format
fclose(fid) ;

在我看来这很可信。让我知道它是否有效 - 如果没有,我可以在早上帮助调试......

于 2013-07-03T02:40:42.230 回答
1

LabVIEW 时间戳是一个 128 位类型,由一个带符号的 64 位整数和一个无符号的 64 位整数组成,该整数测量自 LabVIEW 纪元(1904 年 1 月 1 日 00:00:00.00 UTC)以来的偏移量(以秒为单位),以及一个测量小数秒的无符号 64 位整数. 来源:ni.com

然而,文件的字节顺序可能取决于平台。例如,美国东部时间 2013 年 7 月 3 日上午 8:02:58.147 时间可以存储为:

0x 00000000CDF9C372 25AA100000000000(大/网络)

或作为

0x 000000000010AA25 72C3F9CD00000000(小)

于 2013-07-03T12:12:54.857 回答