-
Notifications
You must be signed in to change notification settings - Fork 0
/
SEV2mat_singleCh.m
152 lines (129 loc) · 4.89 KB
/
SEV2mat_singleCh.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
function [rawdata, fs] = SEV2mat_singleCh(SEV_FILE)
%SEV2MAT TDT SEV file format extraction.
% data = SEV2mat_singleCh(SEV_FILE), where SEV_FILE is a string,
% retrieves a sev data from specified file. SEV files
% are generated by an RS4 Data Streamer, or by setting the Unique
% Channel Files option in Stream_Store_MC or Stream_Store_MC2 macro
% to Yes.
%
% data contains all continuous data (sampling rate and raw data)
%
% modified from SEV2mat from TDT, by Kenji Koyano
% last modified: 150803
data = [];
ALLOWED_FORMATS = {'single','int32','int16','int8','double','int64'};
% open file
fid = fopen(SEV_FILE, 'rb');
if fid < 0
warning([SEV_FILE ' not opened'])
return
end
% create and fill streamHeader struct
streamHeader = [];
streamHeader.fileSizeBytes = fread(fid,1,'uint64');
streamHeader.fileType = char(fread(fid,3,'char')');
streamHeader.fileVersion = fread(fid,1,'char');
if streamHeader.fileVersion < 3
% event name of stream
if streamHeader.fileVersion == 2
streamHeader.eventName = char(fread(fid,4,'char')');
else
streamHeader.eventName = fliplr(char(fread(fid,4,'char')'));
end
% current channel of stream
streamHeader.channelNum = fread(fid, 1, 'uint16');
% total number of channels in the stream
streamHeader.totalNumChannels = fread(fid, 1, 'uint16');
% number of bytes per sample
streamHeader.sampleWidthBytes = fread(fid, 1, 'uint16');
reserved = fread(fid, 1, 'uint16');
% data format of stream in lower four bits
streamHeader.dForm = ALLOWED_FORMATS{bitand(fread(fid, 1, 'uint8'),7)+1};
% used to compute actual sampling rate
streamHeader.decimate = fread(fid, 1, 'uint8');
streamHeader.rate = fread(fid, 1, 'uint16');
% reserved tags
reserved = fread(fid, 1, 'uint64');
reserved = fread(fid, 2, 'uint16');
else
error(['unknown version ' num2str(streamHeader.fileVersion)]);
end
%varname = matlab.lang.makeValidName(streamHeader.eventName);
varname = streamHeader.eventName;
for ii = 1:numel(varname)
if ii == 1
if isnumeric(varname(ii))
varname(ii) = 'x';
end
end
if ~isletter(varname(ii)) && ~isnumeric(varname(ii))
varname(ii) = '_';
end
end
% if ~isvarname(streamHeader.eventName)
% warning('%s is not a valid Matlab variable name, changing to %s', streamHeader.eventName, varname);
% end
if streamHeader.fileVersion > 0
% determine data sampling rate
streamHeader.fs = 2^(streamHeader.rate)*25000000/2^12/streamHeader.decimate;
% handle multiple data streams in one folder
exists = isfield(data, varname);
else
streamHeader.dForm = 'single';
streamHeader.fs = 0;
s = regexp(file_list(i).name, '_', 'split');
streamHeader.eventName = s{end-1};
%varname = matlab.lang.makeValidName(streamHeader.eventName);
varname = streamHeader.eventName;
for ii = 1:numel(varname)
if ii == 1
if isnumeric(varname(ii))
varname(ii) = 'x';
end
end
if ~isletter(varname(ii)) && ~isnumeric(varname(ii))
varname(ii) = '_';
end
end
% if ~isvarname(streamHeader.eventName)
% warning('%s is not a valid Matlab variable name, changing to %s', streamHeader.eventName, varname);
% end
streamHeader.channelNum = str2double(regexp(s{end}, '\d+', 'match'));
warning('%s has empty header; assuming %s ch %d format %s and fs = %.2f\nupgrade to OpenEx v2.18 or above\n', ...
file_list(i).name, streamHeader.eventName, ...
streamHeader.channelNum, streamHeader.dForm, 24414.0625);
exists = 1;
data.(varname).fs = 24414.0625;
end
% read rest of file into data array as correct format
varname = streamHeader.eventName;
for ii = 1:numel(varname)
if ii == 1
if isnumeric(varname(ii))
varname(ii) = 'x';
end
end
if ~isletter(varname(ii)) && ~isnumeric(varname(ii))
varname(ii) = '_';
end
end
varname = matlab.lang.makeValidName(streamHeader.eventName);
% if ~isvarname(streamHeader.eventName)
% warning('%s is not a valid Matlab variable name, changing to %s', streamHeader.eventName, varname);
% end
data.(varname).name = streamHeader.eventName;
if exists ~= 1
%preallocate data array
temp_data = fread(fid, inf, ['*' streamHeader.dForm])';
total_samples = length(temp_data);
func = str2func(streamHeader.dForm);
data.(varname).data = func(zeros(1,total_samples));
data.(varname).data(1,:) = temp_data;
data.(varname).fs = streamHeader.fs;
else
data.(varname).data(1,:) = fread(fid, inf, ['*' streamHeader.dForm])';
end
rawdata = data.(varname).data;
fs = data.(varname).fs;
% close file
fclose(fid);