2013-07-02 1 views
1

매우 개의 파일이 Labview에서 바이너리로 저장되었습니다. 각 열은 타임 스탬프 클러스터 다음에 단일 벡터가옵니다.Labview는 클러스터 데이터를 바이너리 파일로 어떻게 저장합니까? MATLAB에서 어떻게 읽을 수 있습니까?

은 내가 입력 배열 N, M의 크기를 계산하는 사전 - 여기서

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

를 사용 매트랩 r2013a에 각 데이터 파일을 읽는다. 나는 데이터가, 내가 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); 

는 매스 웍스에서 게시 @Floris, 그들은 두 배로 직선 캐스트,하지만 때 나는 그걸 시도해 봤는데 쓰레기가 났어. 올바른 날짜를 얻으려면 먼저 integer로 변환 한 다음 double으로 변환해야했습니다. 병목이 fread 행 (외부 디스크를 읽는 데 0.3 초)이므로, 여분의 타입 변환 단계는 사물의 웅장한 구성표에서 매우 작습니다.

여분의 열 4.5e-42는 다음 단일성 벡터의 값 수인 3200의 정수 값으로 변환됩니다.

+0

LabVIEW 코드에 접근 할 수 있다면 이러한 클러스터를 문자열이나 XML 파일로 저장해보십시오. 파일의 크기가 얼마나되는지 모르지만이 형식은 MATLAB이 읽는 것이 훨씬 쉬울 것입니다. –

+1

개별 파일은 그다지 크지 않습니다 (각각 ~ 14MB). 그러나 그 중 많은 파일이 있습니다. 나는 완전히 1 개의 Tb 드라이브를 가지고 있고, 두번째 드라이브를 가지고있다. 코드를 변경하기로 결정했다하더라도 그 고양이는 가방에서 잘 나온다. – craigim

+0

오른쪽. 네가 가진 것에 붙어있는 것처럼 보인다. 나중에 참조 할 수 있도록 가능한 한 많이 데이터 마이그레이션을 리허설하는 것이 좋습니다. 오류가 발생하기 쉽고 어려운 작업이므로 가능하면 리허설을하는 것이 좋습니다. –

답변

2

이것은 완전한 대답은 아니지만 도움이 될 것입니다 (Labview 또는 Matlab을 집에서 사용할 수 없으므로 지금은 확인할 수 없습니다).

비슷한 질문을 나타내는 http://www.mathworks.com/matlabcentral/newsreader/view_thread/292060에 기사가 있습니다. 유용한 정보 비트의 커플은 그에서 추출 :

  1. 타임 스탬프
  2. 사물의 의미를 만들기 위해 (빅 엔디안 대 작은) 바이트의 순서를 뒤집어 필요 (단일되지 않음) 더블
는 LabVIEW 시간 규칙이 1904년 1월 1일 이후 밀리 초입니다

참고 :

유용한 의견이 있습니다. 여기

다음 코드도 제공됩니다 (오류가있을 수 있지만, 올바른 방향을 가리 킵니다) 하나의 방법입니다 :

%% 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) ; 

그것은 나에게 믿을 보인다. 그것이 작동하는지 알려주세요. 그렇지 않으면 아침에 디버그하는 데 도움이 될 것입니다 ...

+0

오늘 아침에 이걸 드리겠습니다. – craigim

+0

싱글에서 더블로 똑바로 typecasting하면 작동하지 않습니다. 싱글 → int64/uint64-> double을 수행해야했습니다. 그렇지 않으면 효과가있었습니다. – craigim

+0

알아두면 좋을 것 같습니다. 도움이 되었기 때문에 기쁩니다! – Floris

1

LabVIEW 타임 스탬프는 초 단위 오프셋을 측정하는 부호있는 64 비트 정수로 구성된 128 비트 유형입니다 LabVIEW 신기원 (1904 년 1 월 1 일 00:00:00:00 UTC) 및 소수 부분을 측정하는 부호없는 64 비트 정수입니다. 출처 : ni.com.

그러나 파일의 바이트 순서는 플랫폼에 따라 다를 수 있습니다. 예를 들어 시간 8 : 02 : 58.147 오전 2013년 7월 3일 EDT는 저장 될 수 등 :

0X 00000000CDF9C372 25AA100000000000 (대/네트워크)

또는이

0X 000000000010AA25 72C3F9CD00000000 (작은)

+0

Labview는 모든 플랫폼에서 큰 엔디안입니다. 그러나 이것은 @ Floris의 솔루션에 소수 초와 함께 두 번째 필드가 포함되지 않았기 때문에 유용했습니다. – craigim

관련 문제