add extension to convert and temporal unify multiple raw files with different measruemtn frequencies. to BE DEBUGGED
This commit is contained in:
222
doc/matlab/import_famos.m
Normal file
222
doc/matlab/import_famos.m
Normal file
@@ -0,0 +1,222 @@
|
||||
function Channel=importfamos(FullRawData)
|
||||
%__________________________________________________________________________
|
||||
% The sequnce importfamos.m was produced to convert imc raw data(*.raw;
|
||||
% *.dat) to matlab data. Here, struct is used to manage the channel
|
||||
% information.
|
||||
%
|
||||
% For more information of FAMOS file format, please see the
|
||||
% manufacturer's website: http://www.imc-berlin.de
|
||||
%
|
||||
% Corresponding to Data Structure in Matlab, the channels are stored
|
||||
% as struct struct: Channel + name (channel name)
|
||||
% + comment
|
||||
% + data (channel Value)
|
||||
% + length
|
||||
% + yUnit
|
||||
% + t0
|
||||
% + dt(sampling period)
|
||||
% + xUnit
|
||||
% Version history:
|
||||
% Version 1.0 (2011.1.19); Current version only can deal with analog rawdata
|
||||
% from imc devices. The digital and group function is ongoning and will be
|
||||
% released in version 2.
|
||||
% Version 1.1 (2013.12.31): In order to solve non-manually save data,
|
||||
% regular pattern is introduced into sloving data structure without CR and
|
||||
% LF.
|
||||
% (only support data(Channel) from imc devices)
|
||||
%
|
||||
%%-------------------------------------------------------------------------
|
||||
% Author: Liang
|
||||
% Danke.Liang@gmail.com
|
||||
% Started on Dec.14, 2010
|
||||
%__________________________________________________________________________
|
||||
if nargin == 0;
|
||||
[RawData,FamosPath] = uigetfile({'*.raw';'*.dat'},'Select Famos Raw data');
|
||||
FullRawData=strcat(FamosPath,RawData);
|
||||
end
|
||||
fid = fopen(FullRawData,'r');
|
||||
if fid==-1,
|
||||
disp('failed to read rawdata')
|
||||
return
|
||||
end
|
||||
disp(['Info: Read data @' datestr(now) ' from' ])
|
||||
disp([ ' ' FullRawData '...'])
|
||||
Textall=fscanf(fid,'%c');
|
||||
CSstring='\|CS,\d,\D*\d+,\D*\d+,';
|
||||
CSend=regexp(Textall,CSstring,'end');
|
||||
InfoSegment=Textall(1,1:CSend);
|
||||
Cbstr='\|Cb.*?;';
|
||||
CGstr='\|CG,.*?;';
|
||||
CDstr='\|CD,.*?;';
|
||||
NTstr='\|NT,.*?;';
|
||||
CPstr='\|CP,.*?;';
|
||||
CRstr='\|CR,.*?;';
|
||||
CNstr='\|CN,.*?;';
|
||||
ArrCG=char(regexp(InfoSegment,CGstr,'match'));
|
||||
ChannelNum=size(ArrCG,1);
|
||||
ArrCN=char(regexp(InfoSegment,CNstr,'match'));
|
||||
ArrCD=char(regexp(InfoSegment,CDstr,'match'));
|
||||
ArrNT=char(regexp(InfoSegment,NTstr,'match'));
|
||||
ArrCP=char(regexp(InfoSegment,CPstr,'match'));
|
||||
ArrCb=char(regexp(InfoSegment,Cbstr,'match'));
|
||||
ArrCR=char(regexp(InfoSegment,CRstr,'match'));
|
||||
%% CN
|
||||
ChannelName=cell(ChannelNum,1);
|
||||
ChannelComment=cell(ChannelNum,1);
|
||||
%% CD,NT
|
||||
CDsample=zeros(ChannelNum,1);
|
||||
CDUnit=cell(ChannelNum,1);
|
||||
TriggerTime=cell(ChannelNum,1);
|
||||
%% CP
|
||||
KeyBufferRef=zeros(ChannelNum,1);
|
||||
KeyBytes=zeros(ChannelNum,1);
|
||||
KeyNumberFormat=cell(ChannelNum,1);
|
||||
KeySignBits=zeros(ChannelNum,1);
|
||||
%% Cb
|
||||
KeyBufferRefIndex=zeros(ChannelNum,1);
|
||||
KeyBufferRefCb=zeros(ChannelNum,1);
|
||||
KeyOffsetBufferInSamplesKey=zeros(ChannelNum,1);
|
||||
KeyBufferFilledBytes=zeros(ChannelNum,1);
|
||||
%% CR
|
||||
KeyTransformation=zeros(ChannelNum,1);
|
||||
KeyCRfactor=zeros(ChannelNum,1);
|
||||
KeyCRoffset=zeros(ChannelNum,1);
|
||||
KeyUnit=cell(ChannelNum,1);
|
||||
%% Define Return object
|
||||
Channel=struct('name','','comment','','data',[],'length',0,'yUnit','','t0','','dt','','xUnit','');
|
||||
BinaryStart=CSend;
|
||||
ChannelID=1;
|
||||
while ChannelID <= ChannelNum
|
||||
temptext=char(ArrCD(ChannelID,:));
|
||||
[CDsample(ChannelID,1), CDUnit{ChannelID,1}]=ProcessCD(temptext);
|
||||
[ChannelName{ChannelID,1},ChannelComment{ChannelID,1}]=ProcessCN(ArrCN(ChannelID,:));
|
||||
Channel(ChannelID).name=ChannelName{ChannelID,1};
|
||||
disp(strcat('Channel_',num2str(ChannelID),':',Channel(ChannelID).name))
|
||||
Channel(ChannelID).comment=ChannelComment{ChannelID,1};
|
||||
Channel(ChannelID).dt=strcat(num2str(CDsample(ChannelID,1)),CDUnit{ChannelID,1});
|
||||
Channel(ChannelID).xUnit=CDUnit{ChannelID,1};
|
||||
TriggerTime{ChannelID,1}=ProcessNT(ArrNT(ChannelID,:));
|
||||
Channel(ChannelID).t0=TriggerTime{ChannelID,1};
|
||||
[KeyBufferRef(ChannelID,1),KeyBytes(ChannelID,1),KeyNumberFormat{ChannelID,1},KeySignBits(ChannelID,1)]=ProcessCP(ArrCP(ChannelID,:));
|
||||
[KeyBufferRefIndex(ChannelID,1),KeyBufferRefCb(ChannelID,1),KeyOffsetBufferInSamplesKey(ChannelID,1),KeyBufferFilledBytes(ChannelID,1)]=ProcessCblittle(ArrCb(ChannelID,:));
|
||||
[KeyTransformation(ChannelID,1),KeyCRfactor(ChannelID,1),KeyCRoffset(ChannelID,1),KeyUnit{ChannelID,1}]=ProcessCR(ArrCR(ChannelID,:));
|
||||
Channel(ChannelID).yUnit=KeyUnit{ChannelID,1};
|
||||
BinaryRead= BinaryStart+KeyOffsetBufferInSamplesKey(ChannelID,1);
|
||||
ChannelLength=KeyBufferFilledBytes(ChannelID,1)*8/KeySignBits(ChannelID,1);
|
||||
Channel(ChannelID).data=ReadChannel(fid,BinaryRead,ChannelLength,KeyNumberFormat{ChannelID,1},KeyCRfactor(ChannelID,1),KeyCRoffset(ChannelID,1));
|
||||
Channel(ChannelID).length=ChannelLength;
|
||||
ChannelID=ChannelID+1;
|
||||
end
|
||||
fclose(fid);
|
||||
end
|
||||
%%
|
||||
function [KeyDx, KeyUnit]= ProcessCD(TxtString)
|
||||
% disp('Info: Processing key CD...');
|
||||
CommaLocation=find(TxtString==',');
|
||||
Txtemp=TxtString(CommaLocation(3)+1:CommaLocation(4)-1);
|
||||
KeyDx=str2double(Txtemp);
|
||||
KeyUnit=TxtString(CommaLocation(6)+1:CommaLocation(7)-1);
|
||||
% disp('Info: Finished Process key CD!');
|
||||
end
|
||||
function TimeStart = ProcessNT(TxtString)
|
||||
|
||||
CommaLocation=find(TxtString==',');
|
||||
Txtemp=TxtString(CommaLocation(3)+1:CommaLocation(4)-1);
|
||||
KeyDay=str2num(Txtemp);
|
||||
Txtemp=TxtString(CommaLocation(4)+1:CommaLocation(5)-1);
|
||||
KeyMonth=str2num(Txtemp);
|
||||
Txtemp=TxtString(CommaLocation(5)+1:CommaLocation(6)-1);
|
||||
KeyYear=str2num(Txtemp);
|
||||
|
||||
Txtemp=TxtString(CommaLocation(6)+1:CommaLocation(7)-1);
|
||||
KeyHours=str2num(Txtemp);
|
||||
Txtemp=TxtString(CommaLocation(7)+1:CommaLocation(8)-1);
|
||||
KeyMinutes=str2num(Txtemp);
|
||||
Txtemp=TxtString(CommaLocation(8)+1:length(TxtString));
|
||||
KeySeconds=str2num(Txtemp);
|
||||
|
||||
TimeStart=datestr(datenum([KeyYear, KeyMonth,KeyDay,KeyHours,KeyMinutes,KeySeconds]),'yyyy-mm-dd HH:MM:SS');
|
||||
% disp('Info: Finished Processing key NT!');
|
||||
end
|
||||
function [KeyBufferRef,KeyBytes,KeyNumerFormat,KeySignBits]= ProcessCP(TxtString)
|
||||
% disp('Info: Processing key CP...');
|
||||
CommaLocation=find(TxtString==',');
|
||||
Txtemp=TxtString(CommaLocation(3)+1:CommaLocation(4)-1);
|
||||
KeyBufferRef=str2num(Txtemp);
|
||||
Txtemp=TxtString(CommaLocation(4)+1:CommaLocation(5)-1);
|
||||
KeyBytes=str2num(Txtemp);
|
||||
Txtemp=TxtString(CommaLocation(5)+1:CommaLocation(6)-1);
|
||||
NumberFormat=str2num(Txtemp);
|
||||
switch (NumberFormat)
|
||||
case 1
|
||||
KeyNumerFormat='*uint';
|
||||
case 2
|
||||
KeyNumerFormat='*int';
|
||||
case 3
|
||||
KeyNumerFormat='*ushort';
|
||||
case 4
|
||||
KeyNumerFormat='*short';
|
||||
case 5
|
||||
KeyNumerFormat='*ulong';
|
||||
case 6
|
||||
KeyNumerFormat='*long';
|
||||
case 7
|
||||
KeyNumerFormat='*float';
|
||||
case 8
|
||||
KeyNumerFormat='*float32';
|
||||
case 9
|
||||
KeyNumerFormat='*'; % imc Device Transitional Recording
|
||||
case 10
|
||||
KeyNumerFormat='*TimeStampASII' ;% TimeStamp is famos type
|
||||
case 11
|
||||
KeyNumberFormat='*bit16'; %2-byte-word digital
|
||||
case 13
|
||||
KeyNumberFormat='*bit48';
|
||||
end
|
||||
Txtemp=TxtString(CommaLocation(6)+1:CommaLocation(7)-1);
|
||||
KeySignBits=str2num(Txtemp);
|
||||
end
|
||||
function [KeyBufferRefIndex,KeyBufferRefCb,KeyOffsetBufferInSamplesKey,KeyBufferFilledBytes] = ProcessCblittle(TxtString)
|
||||
% disp('Info: Processing key Cb...');
|
||||
CommaLocation=find(TxtString==',');
|
||||
Txtemp=TxtString(CommaLocation(3)+1:CommaLocation(4)-1);
|
||||
KeyBufferRefIndex=str2num(Txtemp);
|
||||
Txtemp=TxtString(CommaLocation(5)+1:CommaLocation(6)-1);
|
||||
KeyBufferRefCb=str2double(Txtemp);
|
||||
Txtemp=TxtString(CommaLocation(7)+1:CommaLocation(8)-1);
|
||||
KeyOffsetBufferInSamplesKey=str2double(Txtemp);
|
||||
Txtemp=TxtString(CommaLocation(10)+1:CommaLocation(11)-1);
|
||||
KeyBufferFilledBytes=str2double(Txtemp);
|
||||
%disp('Info: Finished Processing key Cb!');
|
||||
end
|
||||
function [KeyTransformation,KeyCRfactor,KeyCRoffset,KeyUnit]= ProcessCR(TxtString)
|
||||
% disp('Info: Processing key CR...')
|
||||
%
|
||||
CommaLocation=find(TxtString==',');
|
||||
Txtemp=TxtString(CommaLocation(3)+1:CommaLocation(4)-1);
|
||||
KeyTransformation=str2num(Txtemp);
|
||||
Txtemp=TxtString(CommaLocation(4)+1:CommaLocation(5)-1);
|
||||
KeyCRfactor=str2double(Txtemp);
|
||||
Txtemp=TxtString(CommaLocation(5)+1:CommaLocation(6)-1);
|
||||
KeyCRoffset=str2double(Txtemp);
|
||||
Txtemp=TxtString(CommaLocation(7)+1:CommaLocation(8)-1);
|
||||
KeyUnitLength=str2double(Txtemp);
|
||||
KeyUnit=TxtString(CommaLocation(8)+1:CommaLocation(8)+KeyUnitLength);
|
||||
% disp('Info: Finished Processing key CR!');
|
||||
end
|
||||
function [ChannelName,ChannelComment]= ProcessCN(TxtString)
|
||||
CommaLocation=find(TxtString==',');
|
||||
ChannelName=TxtString(CommaLocation(7)+1:CommaLocation(8)-1);
|
||||
ChannelCommLength=TxtString(CommaLocation(8)+1:CommaLocation(9)-1);
|
||||
if ChannelCommLength=='0';
|
||||
ChannelComment='';
|
||||
else
|
||||
temp=str2double(ChannelCommLength);
|
||||
ChannelComment=TxtString(CommaLocation(9)+1:CommaLocation(9)+temp);
|
||||
end
|
||||
end
|
||||
function tempChannel=ReadChannel(FileID, ReadStart,ChannelLength, Datatype,factor,offset)
|
||||
fseek(FileID,ReadStart,'bof');
|
||||
tempChannel=double(fread(FileID,ChannelLength,Datatype))*factor+offset;
|
||||
%disp('Info: a Channle was imported.... ');
|
||||
end
|
Reference in New Issue
Block a user