/
raw_image.m
180 lines (159 loc) · 5.67 KB
/
raw_image.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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
% raw_image.m - plot raw data for a single echo from a Pfile
%
% Marquette University, Milwaukee, WI USA
% Copyright 2002, 2003, 2016, 2018 - All rights reserved.
% Author: Fred J. Frigo
%
% - updated for 11.0 Pfile format
% - updated for 12.0 Pfile format
% - updated for 25.0 & 26.0 Pfile format
%
function raw_image( pfile )
% Check to see if pfile name was passed in
if ( nargin == 0 )
% Enter name of Pfile
[fname, pname] = uigetfile('*.*', 'Select Pfile');
pfile = strcat(pname, fname);
end
i = sqrt(-1);
% Open Pfile to read reference scan data.
fid = fopen(pfile,'r', 'ieee-be');
if fid == -1
err_msg = sprintf('Unable to locate Pfile %s', pfile)
return;
end
% Determine size of Pfile header based on Rev number
status = fseek(fid, 0, 'bof');
[f_hdr_value, count] = fread(fid, 1, 'real*4');
rdbm_rev_num = f_hdr_value(1);
if( rdbm_rev_num == 7.0 )
pfile_header_size = 39984; % LX
elseif ( rdbm_rev_num == 8.0 )
pfile_header_size = 60464; % Cardiac / MGD
elseif (( rdbm_rev_num > 5.0 ) && (rdbm_rev_num < 6.0))
pfile_header_size = 39940; % Signa 5.5
else
% In 11.0 (ME2) the header and data are stored as little-endian
fclose(fid);
fid = fopen(pfile,'r', 'ieee-le');
status = fseek(fid, 0, 'bof');
[f_hdr_value, count] = fread(fid, 1, 'real*4');
rdbm_rev_num = f_hdr_value(1);
if (rdbm_rev_num == 9.0) % 11.0 product release
pfile_header_size= 61464;
elseif (rdbm_rev_num == 11.0) % 12.0 product release
pfile_header_size= 66072;
elseif (rdbm_rev_num > 11.0) & (rdbm_rev_num < 26.0)
% For 14.0 to 25.0 Pfile header size can be found here
status = fseek(fid, 1468, 'bof');
pfile_header_size = fread(fid,1,'integer*4');
status = fseek(fid, 1508, 'bof');
prescan_offset = fread(fid,1,'integer*4');
elseif ( rdbm_rev_num >= 26.0) & (rdbm_rev_num < 100.0) % 26.0 to ??
% For 26.0 Pfile header size moved to location just after rev num
status = fseek(fid, 4, 'bof');
pfile_header_size = fread(fid,1,'integer*4');
status = fseek(fid, 44, 'bof');
prescan_offset = fread(fid,1,'integer*4');
else
err_msg = sprintf('Invalid Pfile header revision: %f', rdbm_rev_num )
return;
end
end
% Read header information
if (rdbm_rev_num < 26.0 )
status = fseek(fid, 0, 'bof');
else
status = fseek(fid, 76, 'bof'); % skip 76 bytes of data added for 26.0
end
[hdr_value, count] = fread(fid, 102, 'integer*2');
npasses = hdr_value(33);
nslices = hdr_value(35);
nechoes = hdr_value(36);
nframes = hdr_value(38);
point_size = hdr_value(42);
da_xres = hdr_value(52);
da_yres = hdr_value(53);
rc_xres = hdr_value(54);
rc_yres = hdr_value(55);
start_recv = hdr_value(101); % not used for 25.0 & greater
stop_recv = hdr_value(102);
% Determine number of slices in this Pfile: this does not work for all cases.
slices_in_pass = nslices/npasses;
% Compute size (in bytes) of each frame, echo and slice
data_elements = da_xres*2*(da_yres-1);
frame_size = da_xres*2*point_size;
echo_size = frame_size*da_yres;
slice_size = echo_size*nechoes;
mslice_size = slice_size*slices_in_pass;
% For 24.0 and earlier - nreceivers is determined as follows
if (rdbm_rev_num < 25.0)
nreceivers = (stop_recv - start_recv) + 1;
else % For 25.0 and later - compute nreceivers from number of slices
status = fseek(fid, 0, 'eof');
pfile_size = ftell(fid);
pass_size = (pfile_size - pfile_header_size)/nslices;
nreceivers = pass_size/mslice_size;
end
for k = 1:1000 % give a large number 1000 to loop forever
% Enter slice number to plot
my_slice = 1;
if ( slices_in_pass > 1 )
slice_msg = sprintf('Enter the slice number: [1..%d]',slices_in_pass);
my_slice = input(slice_msg);
if (my_slice > slices_in_pass)
err_msg = sprintf('Invalid number of slices. Slice number set to 1.')
my_slice = 1;
end
end
% Enter echo number to plot
my_echo = 1;
if ( nechoes > 1 )
echo_msg = sprintf('Enter the echo number: [1..%d]',nechoes);
my_echo = input(echo_msg);
if (my_echo > nechoes )
err_msg = sprintf('Invalid echo number. Echo number set to 1.')
my_echo = 1;
end
end
% Enter receiver number to plot
my_receiver = 1;
if ( nreceivers > 1 )
recv_msg = sprintf('Enter the receiver number: [1..%d]',nreceivers);
my_receiver = input(recv_msg);
if (my_receiver > nreceivers)
err_msg = sprintf('Invalid receiver number. Receiver number set to 1.')
my_receiver = 1;
end
end
% Compute offset in bytes to start of frame. (skip baseline view)
file_offset = pfile_header_size + ((my_receiver - 1)*mslice_size) + ...
+ ((my_slice -1)*slice_size) + ...
+ ((my_echo-1)*echo_size) + ...
+ (frame_size);
status = fseek(fid, file_offset, 'bof');
% read data: point_size = 2 means 16 bit data, point_size = 4 means EDR )
if (point_size == 2 )
[raw_data, count] = fread(fid, data_elements, 'int16');
else
[raw_data, count] = fread(fid, data_elements, 'int32');
end
%frame_data = zeros(da_xres);
for j = 1:(da_yres -1)
row_offset = (j-1)*da_xres*2;
for m = 1:da_xres
frame_data(j,m) = raw_data( ((2*m)-1) + row_offset) + i*raw_data((2*m) + row_offset);
end
end
figure(k);
imagesc( abs(frame_data));
title(sprintf('Magnitude of Raw Data, slice %d, recv %d, echo %d', my_slice, my_receiver, my_echo));
% check to see if we should quit
quit_answer = input('Press Enter to continue, "q" to quit:', 's');
if ( size( quit_answer ) > 0 )
if (quit_answer == 'q')
break;
end
end
end
fclose(fid);