function [data_f, data, noise_f, noise_data, Zo] = SXPParse(DataFileName, fid_log); % [data_f, data, noise_f, noise, Zo] = SXPParse(DataFileName, fid_log); % % reads .sxp file data in MDIF format (a.k.a. HPEEsof format) % % data is a PxPxF matrix of complex, data_f an F-size vector % % description of .sxp files : % '!' is a comment line % the specifier line is preceded by '#' : (and anything before it is ignored) % # R % % permitted values : % GHz, Mhz, kHz, Hz % S, Z, Y, G, H (same as output data !) % RI, MA, DB % alphanumeric % % examples of specifier line % # GHz S RI R 50 !(S in real and imaginary, 50ohm system) % # MHz S MA R 75 !(S in lin mag and angle , 75ohm system) % # kHz S DB R 50 !(S in log mag (dB) and angle , 50ohm system) % % (defaults : # MHz MA R 50) % % ------------------------------------------------- % format of data in file (*.s2p) is : % f s11.1 s11.2 s21.1 s21.2 s12.1 s12.2 s22.1 s22.2 % ------------------------------------------------- % % format of data in file (*.sxp) with x>2 is : % ------------------------------------------------- % f s11.1 s11.2 s12.1 s12.2 ... s1x.1 s1x.2 % s21.1 s21.2 s22.2 s22.2 ... s2x.1 s2x.2 % ... % sx1.1 sx1.2 sx2.1 sx2.2 ... sxx.1 sxx.2 % ------------------------------------------------- % % ver 1.1 : data in format complex (26feb99) % ver 1.2 : zgomot adaugat (4martie99) % ver 1.21: max. nr of ports increased from 9 to 99 (24.04.2002) % % written by tudor dima, tudima@zahoo.com, change the z into y %------- read from file DataFileName ------- %format compact; if nargin<2 fid_log = 1; % daca nu vrei log se duce la screen (verifica fid_log inainte sa-l pasezi) end; raw_data = []; % FileReadOK = 0; fid = fopen(DataFileName, 'rt'); if fid < 1 fprintf(fid_log, '%s \n %s', ' ... exiting...', ['Error : requested parameter file ' DataFileName ' not found ! ']); end; if fid > 0 fprintf(fid_log, '\n %s', ['reading parameter data from file ' DataFileName ' ...']); % --- find out matrix order --- NoOfPorts = str2num(DataFileName(size(DataFileName,2)-1) ); candidate_zeci = str2num(DataFileName(size(DataFileName,2)-2) ); if ~isempty(candidate_zeci) NoOfPorts = NoOfPorts + 10*candidate_zeci; end; % ugly, works only up to 99, but still... buff = 'some dummy text'; StartOptions = 0; StartData = 0; % --- read specifier line --- while ~isempty(buff) & ~StartData buff = fscanf(fid, '%s', 1 ); if StartOptions & StartOptions <= 5 l = size(buff,2); Specifier(StartOptions,(1:l)) = buff; StartOptions = StartOptions + 1; end; if strcmp(buff, '#') StartOptions = StartOptions + 1; end; if StartOptions == 6 StartData = 1; end; end % {while} % --- read data one frequency at a time --- if StartData last_frequency = 0; noise_started = 0; freq_index = 0; noise_f_index = 0; NewFrequency = 1; while ~isempty(buff) if NewFrequency buff = fscanf(fid, '%s', 1 ); if ~isempty(buff) if str2num(buff) < last_frequency; noise_started = 1; end; if noise_started noise_f_index = noise_f_index +1; noise_f(noise_f_index) = str2num(buff); NewFrequency = 0; else freq_index = freq_index + 1; data_f(freq_index) = str2num(buff); last_frequency = data_f(freq_index); NewFrequency = 0; end; end; else if noise_started buff = fscanf(fid, '%s', 1 ); NFmin(noise_f_index) = str2num(buff); buff = fscanf(fid, '%s', 1 ); gamma1(noise_f_index) = str2num(buff); buff = fscanf(fid, '%s', 1 ); gamma2(noise_f_index) = str2num(buff); buff = fscanf(fid, '%s', 1 ); Rn(noise_f_index) = str2num(buff); NewFrequency = 1; else for i=1:NoOfPorts for j=1:2*NoOfPorts buff = fscanf(fid, '%s', 1 ); raw_data(i,j, freq_index) = str2num(buff); end; end; NewFrequency = 1; end; end; % {if NewFrequency) end % {while} end; %{if StartData) % --- process specifiers --- multiplier = 1; format = 2; % defaults : , MA freq_units = Specifier(1,:); switch freq_units case 'GHz'; multiplier = 1e9; case 'MHz'; multiplier = 1e6; case 'kHz'; multiplier = 1e3; case {'Hz', 'HZ'}; multiplier = 1; end; data_f = data_f * multiplier; type = Specifier(3,1); % not used yet; assumed to be S for now; Zo = str2num(Specifier(5,:)); if (strcmp(Specifier(3,1),'R') | strcmp(Specifier(3,1),'r')) & (strcmp(Specifier(3,2),'I') | strcmp(Specifier(3,2),'i')) format = 1; elseif (strcmp(Specifier(3,1),'M') | strcmp(Specifier(3,1),'m')) & (strcmp(Specifier(3,2),'A') | strcmp(Specifier(3,2),'a')) format = 2; elseif (strcmp(Specifier(3,1),'D') | strcmp(Specifier(3,1),'d')) & (strcmp(Specifier(3,2),'B') | strcmp(Specifier(3,2),'b')) format = 3; end; % --- swap data for stupi 2nd order exception --- if NoOfPorts == 2 buff_r(1:freq_index) = raw_data(1, 3, 1:freq_index); buff_i(1:freq_index) = raw_data(1, 4, 1:freq_index); raw_data(1, 3, 1:freq_index) = raw_data(2, 1, 1:freq_index); raw_data(1, 4, 1:freq_index) = raw_data(2, 2, 1:freq_index); raw_data(2, 1, 1:freq_index) = buff_r(1:freq_index); raw_data(2, 2, 1:freq_index) = buff_i(1:freq_index); end; switch format case 1 for i =1:NoOfPorts for j=1:NoOfPorts Re = raw_data(i, 2*j-1, 1:freq_index) ; Im = raw_data(i, 2*j, 1:freq_index) ; data(i,j, 1:freq_index) = Re + sqrt(-1)*Im; end; end; case 2 for i =1:NoOfPorts for j=1:NoOfPorts Re = raw_data(i, 2*j-1, 1:freq_index) .* cos(raw_data(i, 2*j, 1:freq_index)*pi/180); Im = raw_data(i, 2*j-1, 1:freq_index) .* sin(raw_data(i, 2*j, 1:freq_index)*pi/180); data(i,j, 1:freq_index) = Re + sqrt(-1)*Im; end; end; case 3 for i =1:NoOfPorts for j=1:NoOfPorts Re = 10.^(raw_data(i, 2*j-1, 1:freq_index)/20) .* cos(raw_data(i, 2*j, 1:freq_index)*pi/180); Im = 10.^(raw_data(i, 2*j-1, 1:freq_index)/20) .* sin(raw_data(i, 2*j, 1:freq_index)*pi/180); data(i,j, 1:freq_index) = Re + sqrt(-1)*Im; end; end; end; if noise_started noise_f = noise_f * multiplier; switch format case 1 gamma = gamma1 + sqrt(-1)*gamma2; case 2 gamma = gamma1.*(cos(gamma2*pi/180) + sqrt(-1)*sin(gamma2*pi/180)); case 3 gamma = 10.^(gamma1/20)*(cos(gamma2*pi/180) + sqrt(-1)*sin(gamma2*pi/180)); end; for i=1:noise_f_index noise_data(i,1) = NFmin(i); noise_data(i,2) = gamma(i); noise_data(i,3) = Rn(i); end; else noise_data = []; noise_f = []; end; fclose(fid); FileReadOK = 1; fprintf(fid_log, '\n %s\n', '...done'); else data_f = [0]; data = zeros(2); Zo = 0; end;