Add new minimal example (+ a ton of other, not so important, changes)

This commit is contained in:
Silas Oettinghaus
2025-12-15 15:04:15 +01:00
parent 75dddca1f2
commit 569e72a1fe
43 changed files with 3594 additions and 674 deletions

View File

@@ -18,14 +18,14 @@ u_pi = 2.9;
vbias = -vbias_rel*u_pi;
laser_wavelength = 1310;
laser_linewidth = 0;
tx_bw_nyquist = 0.7;
tx_bw_nyquist = 1;
% Channel
link_length = 1;
% RX
rop = -8;
rx_bw_nyquist = 0.7;
rop = 0;
rx_bw_nyquist = 0.99;
vnle_order1 = 50;
vnle_order2 = 3;
@@ -59,7 +59,7 @@ Pform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rc","pulselength",1
db_precode = 0;
db_encode = 0;
duob_mode = db_mode.no_db;
duob_mode = db_mode.db_precoded;
apply_pulsef = 1;
[Digi_sig,Symbols,Tx_bits] = PAMsource(...
"fsym",fsym,"M",M,"order",18,"useprbs",0,...
@@ -67,12 +67,21 @@ apply_pulsef = 1;
"applyclipping",0,"clipfactor",1.5,...
"applypulseform",apply_pulsef,"pulseformer",Pform,...
"randkey",random_key,...
"db_precode",db_precode,"db_encode",db_encode,...
"mrds_code",0,"mrds_blocklength",512,"duobinary_mode",duob_mode).process();
Digi_sig.spectrum("displayname",'Digi Spectrum','fignum',10,'normalizeTo0dB',1);
%% proof of concept
Symbols_db = Duobinary().encode(Symbols);
mim_decoded = Duobinary().decode(Symbols_db,"M",M);
rx_bits_mim_decoded = PAMmapper(M,0,"eth_style",0).demap(mim_decoded);
rx_bits_mim_decoded_.signal = circshift(rx_bits_mim_decoded.signal,0);
[~,~,ber_mim_decode,~] = calc_ber(rx_bits_mim_decoded_.signal,Tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1);
fprintf('BER mim: %.2e \n',ber_mim_decode);
%%
%%%%% AWG
% El_sig = M8199A("kover",kover).process(Digi_sig);
@@ -127,14 +136,57 @@ pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);
% mlse_ = MLSE_viterbi("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0).levels);
mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0).levels);
% FFE or VNLE
[eq_signal_sd, eq_noise] = eq_.process(Scpe_cell{1}, Symbols);
if duob_mode == db_mode.no_db
% Hard decision on VNLE output
eq_signal_hd = PAMmapper(M, 0).quantize(eq_signal_sd);
% FFE or VNLE
[eq_signal_sd, eq_noise] = eq_.process(Scpe_cell{1}, Symbols);
% Hard decision on VNLE output
eq_signal_hd = PAMmapper(M, 0).quantize(eq_signal_sd);
% Process through postfilter and MLSE
[mlse_sig_sd,whitened_noise] = pf_.process(eq_signal_sd, eq_noise);
mlse_.DIR = pf_.coefficients;
mlse_sig_sd = mlse_.process(mlse_sig_sd,Symbols);
% BER
rx_bits = PAMmapper(M,0,"eth_style",0).demap(eq_signal_hd);
[~,tot_err,ber_vnle,a] = calc_ber(rx_bits.signal,Tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1);
rx_bits = PAMmapper(M,0,"eth_style",0).demap(mlse_sig_sd);
[~,tot_err,ber_mlse,a] = calc_ber(rx_bits.signal,Tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1);
% Process through postfilter and MLSE
[mlse_sig_sd,whitened_noise] = pf_.process(eq_signal_sd, eq_noise);
mlse_.DIR = pf_.coefficients;
mlse_sig_sd = mlse_.process(mlse_sig_sd,Symbols);
mlse_sig_hd = PAMmapper(M, 0, "eth_style", 0).quantize(mlse_sig_sd);
elseif duob_mode == db_mode.db_precoded
%%
[EQ_sig, Noi] = eq_.process(Scpe_cell{1},Duobinary().encode(Symbols));
showLevelHistogram(EQ_sig,Duobinary().encode(Symbols),"displayname",101);
mim_decoded = Duobinary().decode(EQ_sig,"M",M);
showLevelHistogram(mim_decoded,Symbols,"displayname",101);
rx_bits_mim_decoded = PAMmapper(M,0,"eth_style",0).demap(mim_decoded);
rx_bits_mim_decoded_.signal = circshift(rx_bits_mim_decoded.signal,0);
[~,~,ber_mim_decode,~] = calc_ber(rx_bits_mim_decoded_.signal,Tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1);
fprintf('BER mim: %.2e \n',ber_mim_decode);
%%
mlse_sig_hd = MLSE("DIR",[1,1],"duobinary_output",1,"M",M,"trellis_states",PAMmapper(M,0).levels).process(EQ_sig,Symbols);
mlse_sig_hd_decoded = Duobinary().encode(mlse_sig_hd,"M",M);
mlse_sig_hd_decoded = Duobinary().decode(mlse_sig_hd_decoded,"M",M);
rx_bits_mlse_decoded = PAMmapper(M,0,"eth_style",0).demap(mlse_sig_hd_decoded);
[~,errors_db_diff_precoded,ber_db_diff_precoded,a] = calc_ber(rx_bits_mlse_decoded.signal,Tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1);
%%
end