我有一个非常大量的文件,这些文件在Labview中以二进制形式保存,其中每列都是一个时间戳群集,后跟单个矢量。
我使用
将每个数据文件读入Matlab r2013afid = 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代码中,他们直接翻了一倍,但是当我尝试这个时,我得到了垃圾。为了获得正确的日期,我必须首先转换为整数然后再加倍。由于我的瓶颈在fread
行(读取外部磁盘0.3秒),因此在宏观方案中额外的类型转换步骤是微不足道的。
额外列4.5e-42将转换为3200的整数值,即后续单个矢量中的值的数量。
答案 0 :(得分:2)
这不是一个完整的答案,但它应该有所帮助(我家里没有Labview或Matlab,所以我现在无法检查)。
http://www.mathworks.com/matlabcentral/newsreader/view_thread/292060上有一篇文章描述了一个类似的问题。我从中提取了几个有用的信息:
有一个有用的评论:
请注意,自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) ;
对我来说这看起来很可信。让我知道它是否有效 - 如果没有,我可以在早上帮助调试......
答案 1 :(得分:1)
LabVIEW时间戳是128位类型,由一个带符号的64位整数组成,测量自LabVIEW纪元(1904年1月1日00:00:00.00 UTC)以来的秒数偏移量,以及无符号64位整数测量值小数秒。来源:ni.com。
然而,文件的字节顺序可能取决于平台。例如,2013年7月3日上午8:02:58.147,EDT可以存储为:
0x 00000000CDF9C372 25AA100000000000(大/网络)
或
0x 000000000010AA25 72C3F9CD00000000(小)