Changes from mwork PC.

PDP 2025

MPI analysis

new focus on database and SQL
This commit is contained in:
Silas Oettinghaus
2025-03-21 08:11:40 +01:00
parent 402e491506
commit 74066d0669
36 changed files with 2234 additions and 620 deletions

View File

@@ -4,12 +4,14 @@ function [results] = dsp_ief_file(varargin)
mu_ffe1 = 0.0001;
mu_ffe2 = 0.0008;
mu_ffe3 = 0.001;
mu_dc = 0.00;
mu_dc = 0.0003; %0.0003;
mu_dfe = 0.0004;
vnle_order1 = 100;
mu_dfe_training = 0.0004;
vnle_order1 = 50;
vnle_order2 = 3;
vnle_order3 = 3;
dfe_mu = 0.0005;
tcorrect = 0;
@@ -33,10 +35,11 @@ function [results] = dsp_ief_file(varargin)
end
end
ssdPath = "D:\36_IMDD_Kiel\Data";
% code = "20250221T004802";
% code = "20250221T032043";
filename = findFileByCode(ssdPath, filecode{1});
pathToMeasurement = "C:\Users\Silas\Documents\MATLAB\Datensätze\IEF_Polariton_2025\36_IMDD_Kiel\Data\20250221";
filename = findFileByCode(pathToMeasurement, filecode{1});
pathToTimingRecov = "C:\Users\Silas\Documents\MATLAB\Datensätze\IEF_Polariton_2025\36_IMDD_Kiel\Data\TR_ZIP";
filename_2 = findFileByCode(pathToTimingRecov, filecode{1});
% Extract parameters from the filename using an updated regex
tokens = regexp(filename, 'Pmod_([-0-9p]+)dBm_P_PD_([-0-9p]+)dBm_.*?_(\d+)GBd_(\d+)PAM__\d+T\d+', 'tokens');
@@ -75,20 +78,45 @@ function [results] = dsp_ief_file(varargin)
dataRx = double(h5read(filepath, '/Waveforms/Channel 2/Channel 2Data')); % rohdaten des CH4
bitsTx = h5read(filepath, '/Settings/dataTx'); %Binär
bitsTx = reshape(bitsTx,log2(config.M),[])';
if config.M ~= 6
bitsTx = reshape(bitsTx,log2(config.M),[])';
else
%bitsTx = reshape(bitsTx,5,[])';
end
%%% Build Tx Signal (Bits, Pam Map, Symbols)
Tx_bits = Informationsignal(bitsTx);
Tx_symbols = PAMmapper(config.M,0,"eth_style",1).map(Tx_bits);
Tx_symbols.fs = config.fsym;
if 0
Rx_bits = PAMmapper(config.M,0,"eth_style",1).demap(Tx_symbols);
[~,~,ber_bw,~] = calc_ber(Rx_bits.signal,Tx_bits.signal(1:length(Rx_bits.signal)),"skip_front",100,"skip_end",150,"returnErrorLocation",1);
end
%%% Build Rx Signal (Rx, normalize,remove mean)
loadAfterTR = 0;
loadAfterTR = 1;
if loadAfterTR
rx_sig = load("testSilas.mat","signal_TR3");
rx_sig=rx_sig.signal_TR3;
Rx_Sig_resamp = Informationsignal(rx_sig,"fs",config.fsym*2);
if 1
rx_sig = load(filename_2);
rx_sig=rx_sig.signal_TR;
if config.M == 6
rx_sig_pam6 = zeros(length(rx_sig)*2,1);
rx_sig_pam6(1:2:end) = real(rx_sig);
rx_sig_pam6(2:2:end) = imag(rx_sig);
rx_sig = rx_sig_pam6;
Rx_Sig_resamp = Informationsignal(rx_sig,"fs",config.fsym);
% Tx_symbols.signal = Tx_symbols.signal(1:end/2);
else
Rx_Sig_resamp = Informationsignal(rx_sig,"fs",config.fsym*2);
end
else
rx_sig = load(string(['testSilas_',char(filecode{1}),'.mat']),"signal_TR3");
rx_sig=rx_sig.signal_TR3;
Rx_Sig_resamp = Informationsignal(rx_sig,"fs",config.fsym*2);
end
else
@@ -98,39 +126,17 @@ function [results] = dsp_ief_file(varargin)
Rx_Sig.signal = Rx_Sig.signal - mean(Rx_Sig.signal);
Rx_Sig = Rx_Sig.normalize("mode","rms");
Rx_Sig.spectrum("fignum",2,"displayname",'Rx Signal','normalizeTo0dB',1);
Rx_Sig = Filter('filtdegree',4,"f_cutoff",Tx_symbols.fs.*0.9,"fs",Rx_Sig.fs,"filterType",filtertypes.gaussian,"active",true).process(Rx_Sig);
Rx_Sig.spectrum("fignum",2,"displayname",'Rx Signal filt','normalizeTo0dB',1);
mf = Pulseformer("alpha",config.ROF,"fsym",config.fsym,"fdac",Rx_Sig.fs,"matched",1,"pulse","rrc","pulselength",32);
Rx_matched = mf.process(Rx_Sig);
Rx_matched.spectrum("fignum",2,"displayname",'Rx Signal m','normalizeTo0dB',1);
%%%%%% Sample to 2x fsym %%%%%%
Rx_Sig_resamp = Rx_Sig.resample("fs_out",2*config.fsym);
Rx_Sig_resamp = Rx_Sig.resample("fs_out",config.fsym);
end
%%%%%% Sync Rx signal with reference (S is a cell array with all occurences) %%%%%%
[Rx_Sig_sync,S,isFlipped] = Rx_Sig_resamp.tsynch("reference",Tx_symbols,"fs_ref",config.fsym,"debug_plots",1);
% Rx_Sig_sync.eye(fsym,M,"fignum",4,"displayname",'eye diagram');
% timing syncroization ??
[~,S,isFlipped] = Rx_Sig_resamp.tsynch("reference",Tx_symbols,"fs_ref",config.fsym,"debug_plots",1);
% SYMSYNC = comm.SymbolSynchronizer("Modulation","PAM/PSK/QAM","SamplesPerSymbol",2);
%
% synd = SYMSYNC(Rx_Sig_sync.signal);
% Rx_Sig_sync.signal = synd;
%
% [Rx_Sig_sync,S,isFlipped] = Rx_Sig_sync.tsynch("reference",Tx_symbols,"fs_ref",config.fsym,"debug_plots",1);
%
% filter Bw
output = struct();
vnle_package = {};
vnle_pf_package = {};
@@ -139,78 +145,44 @@ function [results] = dsp_ief_file(varargin)
for s = 1%:length(S)
Rx_Sig_sync = S{s};
Rx_Sig_sync = Rx_Sig_sync.normalize("mode","rms");
if 1
Tx_symbols.spectrum("fignum",3,"displayname",'Tx Symbols','normalizeTo0dB',1);
Rx_Sig_sync.spectrum("fignum",3,"displayname",'No Matched Filter','normalizeTo0dB',1);
Nsym = 64;
sampsPerSym = 2;
rcrFilt = comm.RaisedCosineReceiveFilter(...
'Shape', 'Square root', ...
'RolloffFactor', config.ROF, ...
'FilterSpanInSymbols', Nsym, ...
'InputSamplesPerSymbol', sampsPerSym, ...
'DecimationFactor', 1);
yr = rcrFilt([Rx_Sig_sync.signal;zeros(Nsym*sampsPerSym/2, 1)]);
fltDelay = Nsym / (2*config.fsym);
yr = yr(fltDelay*Rx_Sig_sync.fs+1:end);
Rx_matched = Rx_Sig_sync;
Rx_matched.signal = yr;
% Rx_matched = Rx_matched.resample("fs_out",2*config.fsym);
% length(Rx_matched);
% symbolSync = comm.SymbolSynchronizer("Modulation","PAM/PSK/QAM","SamplesPerSymbol",2,"TimingErrorDetector","Mueller-Muller (decision-directed)");
% Rx_syncd = Rx_matched;
% [Rx_syncd.signal,tError] = symbolSync(Rx_syncd.signal);
% Rx_syncd.fs = config.fsym;
% length(Rx_syncd);
% figure();hold on;
% stem(Tx_symbols.normalize("mode","oneone").signal);
% stem(Rx_syncd.normalize("mode","oneone").signal);
%
% figure();hold on;
% plot(Rx_Sig_sync.normalize("mode","oneone").signal);
% plot(Rx_matched.normalize("mode","oneone").signal);
Rx_syncd = Rx_syncd.resample("fs_out",2*config.fsym);
Rx_matched.spectrum("fignum",3,"displayname",'After Matched Filter','normalizeTo0dB',1);
Rx_syncd.spectrum("fignum",3,"displayname",'Zero Crossing TR','normalizeTo0dB',1);
end
Rx_Sig_sync = Rx_Sig_sync.resample("fs_out",2*config.fsym);
mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3];
vnle_order=[vnle_order1,vnle_order2,vnle_order3];
eq_ = EQ("Ne",vnle_order,"Nb",[0,0,0],"training_length",4096*2,"training_loops",5,"dd_loops",5,"K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",1,"ideal_dfe",1);
eq_ = EQ("Ne",vnle_order,"Nb",[0,0,0],"training_length",4096*4,"training_loops",4,"dd_loops",3,"K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe_training],"DFEmu",dfe_mu,"FFEmu",0,"plotfinal",0,"ideal_dfe",0,"plottrain",0);
%%%%% VNLE only (or DFE) %%%%
if 1
if 0
[result] = vnle(eq_,config.M,Rx_syncd,Tx_symbols,Tx_bits,"precode_mode",db_mode.no_db,"showAnalysis",1,'eth_style',1);
eq_post = FFE("epochs_tr",5,"epochs_dd",5,"len_tr",4096*2,"mu_dd",1e-4,"mu_tr",0,"order",1001,"sps",1,"decide",0);
[result] = vnle(eq_,config.M,Rx_Sig_sync,Tx_symbols,Tx_bits,"precode_mode",db_mode.no_db,"showAnalysis",1,'eth_style',1,'postFFE',eq_post);
netRate = TransmissionPerformance().calculateNetRate(log2(config.M)*config.fsym,'NGMI',result.inf_rate_vnle, 'BER',result.ber_vnle);
vnle_package{s} = result;
end
%%%%% VNLE + PF + MLSE %%%%
if 0
if 1
eq_post = FFE("epochs_tr",5,"epochs_dd",5,"len_tr",4096*2,"mu_dd",1e-4,"mu_tr",0,"order",1001,"sps",1,"decide",0);
pf_ = Postfilter("ncoeff",1,"useBurg",1);
mlse_ = MLSE("duobinary_output",0,'M',config.M,'trellis_states',PAMmapper(config.M,0).levels);
mlse_ = MLSE_viterbi("duobinary_output",0,'M',config.M,'trellis_states',PAMmapper(config.M,0).levels);
doub_mode = db_mode.no_db;
doub_mode = db_mode.no_db;
[result] = vnle_postfilter_mlse(eq_,pf_,mlse_,config.M,Rx_Sig_sync,Tx_symbols,Tx_bits,"precode_mode",doub_mode,'showAnalysis',1,'eth_style_symbol_mapping',1);
[result] = vnle_postfilter_mlse(eq_,pf_,mlse_,config.M,Rx_Sig_sync,Tx_symbols,Tx_bits,"precode_mode",doub_mode,'showAnalysis',1,'eth_style_symbol_mapping',1,'postFFE',eq_post);
netRate = TransmissionPerformance().calculateNetRate(log2(config.M)*config.fsym,'NGMI',result.gmi./log2(config.M), 'BER',result.ber_mlse);
fprintf('VNLE SD: %.1f GBd \n',netRate.SDHD.NetRate.*1e-9);
fprintf('MLSE HD: %.1f GBd \n',netRate.HD.NetRate.*1e-9);
vnle_pf_package{s} = result;
end
%%%%% Duobinary Targeting %%%%
if 0
if 1
mlse_db = MLSE_viterbi("DIR",[1,1],"duobinary_output",0,"M",config.M,"trellis_states",PAMmapper(config.M,0).levels);
doub_mode = db_mode.db_emulate;
@@ -225,6 +197,7 @@ function [results] = dsp_ief_file(varargin)
results.vnle_package = vnle_package;
results.vnle_pf_package = vnle_pf_package;
results.dbtgt_package = dbtgt_package;
results.config = config;
end