MPI FFE with A1 and A2 algorithms

This commit is contained in:
Silas Oettinghaus
2026-07-10 09:14:34 +02:00
parent aa210e5352
commit a6cf742121
11 changed files with 863 additions and 229 deletions

View File

@@ -74,17 +74,22 @@ end
% Create FFE results structure
ffe_results = struct();
try
eq_.e = [];
eq_.e2 = [];
eq_.e3 = [];
eq_.b = [];
eq_.b2 = [];
eq_.b3 = [];
end
try
eq_.mu_optimization = [];
eq_.dc_optimization = [];
config_clear_props = { ...
"e", ...
"e2", ...
"e3", ...
"b", ...
"b2", ...
"b3", ...
"mu_optimization", ...
"dc_optimization", ...
"dc_tracking_optimization", ...
"a2_level_weight_optimization"};
for config_clear_idx = 1:numel(config_clear_props)
prop_name = config_clear_props{config_clear_idx};
if isprop(eq_,prop_name)
eq_.(prop_name) = [];
end
end
ffe_results.config = Equalizerstruct();

View File

@@ -21,7 +21,7 @@ function output = dsp_recipe_minimal(Scpe_sig_raw, Symbols, Tx_bits, options)
"debug_plots", options.debug_plots);
eq_ffe = FFE("epochs_tr",5,"epochs_dd",5,"len_tr",4096*2,"mu_dd",1e-1,"mu_tr",0.4,"order",25,...
"sps",2,"decide",0,"optmize_mus",0,"dd_mode",options.userParameters.dd_mode,"adaption_technique","nlms","mu_dc",1.021e-05);
"sps",2,"decide",0,"optmize_mus",0,"dd_mode",options.userParameters.dd_mode,"adaption_technique","nlms","dc_tracking_mu",1.021e-05);
ffe_results = ffe(eq_ffe, options.M, Scpe_sig, Symbols, Tx_bits, ...
"precode_mode", options.duob_mode, ...

View File

@@ -70,8 +70,8 @@ function output = dsp_scope_signal(Scpe_sig_raw, Symbols, Tx_bits, options)
pf_ = Postfilter("ncoeff", pf_ncoeffs, "useBurg", 1); %#ok<NASGU>
mlse_ = MLSE("duobinary_output", 0, 'M', M, 'trellis_states', PAMmapper(M,0).levels); %#ok<NASGU>
eq_post = FFE("epochs_tr",5,"epochs_dd",5,"len_tr",4096*2,"mu_dd",1e-4,"mu_tr",0,"order",2001,"sps",1,"decide",0,"adaption_technique","lms","mu_dc",mu_dc); %#ok<NASGU>
eq_post = FFE("epochs_tr",5,"epochs_dd",2,"len_tr",2^13,"mu_dd",mu_dd,"mu_tr",mu_tr,"order",25,"sps",2,"decide",0, "adaption_technique",adaption_method(adaption),"dd_mode",use_dd_mode,"mu_dc",mu_dc); %#ok<NASGU>
eq_post = FFE("epochs_tr",5,"epochs_dd",5,"len_tr",4096*2,"mu_dd",1e-4,"mu_tr",0,"order",2001,"sps",1,"decide",0,"adaption_technique","lms","dc_tracking_mu",mu_dc); %#ok<NASGU>
eq_post = FFE("epochs_tr",5,"epochs_dd",2,"len_tr",2^13,"mu_dd",mu_dd,"mu_tr",mu_tr,"order",25,"sps",2,"decide",0, "adaption_technique",adaption_method(adaption),"dd_mode",use_dd_mode,"dc_tracking_mu",mu_dc); %#ok<NASGU>
mlse_db_enc = MLSE("DIR", [1,1], "duobinary_output", 0, "M", M, "trellis_states", PAMmapper(M,0).levels); %#ok<NASGU>
eq_db_enc = EQ("Ne", ffe_order_dbtgt, "Nb", dfe_order_dbtgt, "training_length", len_tr, ...
@@ -94,7 +94,7 @@ function output = dsp_scope_signal(Scpe_sig_raw, Symbols, Tx_bits, options)
if use_ffe
eq_ffe = EQ("Ne",ffe_order_ffe,"Nb",[0,0,0],"training_length",len_tr,"training_loops",5,"dd_loops",5,"K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",0);
eq_ffe = FFE("epochs_tr",5,"epochs_dd",5,"len_tr",4096*2,"mu_dd",1e-1,"mu_tr",0.4,"order",ffe_order_ffe(1),...
"sps",2,"decide",0,"optmize_mus",0,"dd_mode",1,"adaption_technique","nlms","mu_dc",1.021e-05);
"sps",2,"decide",0,"optmize_mus",0,"dd_mode",1,"adaption_technique","nlms","dc_tracking_mu",1.021e-05);
ffe_results = ffe(eq_ffe, M, Scpe_sig, Symbols, Tx_bits, ...
"precode_mode", duob_mode, ...

View File

@@ -21,23 +21,61 @@ function output = mpi_recipe_dev(Scpe_sig_raw, Symbols, Tx_bits, options)
"debug_plots", options.debug_plots);
output = struct();
eq_settings = { ...
"epochs_tr", 5, ...
"epochs_dd", 5, ...
"len_tr", 4096, ...
"mu_tr",0.04, ...
"mu_dd",0.012, ...
"mu_dc", 0, ...
"adaptive_dc_enabled", 0, ...
"order", 25, ...
eq_core_settings = { ...
"sps", 2, ...
"order", 25, ...
"decide", 0, ...
"optmize_mus", 0, ...
"adaption_technique", "nlms"};
eq_training_settings = { ...
"len_tr", 4096, ...
"epochs_tr", 5, ...
"mu_tr", 0.04};
eq_dd_settings = { ...
"dd_mode", 1, ...
"adaption_technique", "nlms", ...
"plot_mu_optimization", options.debug_plots,...
"optimize_dc_params", false, ...
"save_debug",true};
"epochs_dd", 5, ...
"mu_dd", 0.012};
eq_a1_settings = { ...
"dc_smoothing_a1", 0, ...
"dc_avg_bufferlength_a1", 0};
eq_a2_settings = { ...
"dc_smoothing_a2", 0, ...
"dc_level_avg_bufferlength_a2", 0, ...
"dc_level_weights_a2", [0.692 0.979 0.98 0.138]};
eq_dc_tracking_settings = { ...
"dc_tracking_mu", 0.05, ...
"dc_tracking_adaptive_enabled", 0, ...
"dc_tracking_buffer_len", 1024};
eq_ffe_update_settings = { ...
"ffe_update_buffer_len", 1};
eq_optimizer_settings = { ...
"optmize_mus", 0, ...
"plot_mu_optimization", options.debug_plots, ...
"optimize_dc_tracking_params", 1, ...
"optimize_a2_level_weights", 0, ...
"a2_level_weight_optimization_len", 2^15, ...
"a2_level_weight_optimization_max_evals", 30, ...
"a2_level_weight_max", 1};
eq_debug_settings = { ...
"save_debug", true};
eq_settings = [ ...
eq_core_settings, ...
eq_training_settings, ...
eq_dd_settings, ...
eq_a1_settings, ...
eq_a2_settings, ...
eq_dc_tracking_settings, ...
eq_ffe_update_settings, ...
eq_optimizer_settings, ...
eq_debug_settings];
eq_ffe = FFE(eq_settings{:});
@@ -73,8 +111,8 @@ function output = mpi_recipe_dev(Scpe_sig_raw, Symbols, Tx_bits, options)
output.ffe_debug.smoothing_window = smooth_len;
error_first_s = movmean(dbg.error_first_epoch(:),smooth_len,"omitnan");
error_last_s = movmean(dbg.error(:),smooth_len,"omitnan");
mu_dc_eff_s = movmean(dbg.mu_dc_eff(:),smooth_len,"omitnan");
e_dc_eff_s = movmean(dbg.e_dc_eff(:),smooth_len,"omitnan");
dc_tracking_mu_eff_s = movmean(dbg.dc_tracking_mu_eff(:),smooth_len,"omitnan");
dc_tracking_est_s = movmean(dbg.dc_tracking_est(:),smooth_len,"omitnan");
figure(460); clf;
tiledlayout(2,1,"TileSpacing","compact","Padding","compact");
@@ -90,9 +128,9 @@ function output = mpi_recipe_dev(Scpe_sig_raw, Symbols, Tx_bits, options)
nexttile;hold on
% plot(eq_sig_mov,"DisplayName","err dc eff");
plot(mu_dc_eff_s,"DisplayName","mu DC - either fixed or adaptive");
e_dc_scale = max(abs(e_dc_eff_s),[],"omitnan") + eps;
plot(-1.*e_dc_eff_s./e_dc_scale,"DisplayName","Inverted DC-tracking; Value that is subtracted during EQ");
plot(dc_tracking_mu_eff_s,"DisplayName","mu DC - either fixed or adaptive");
e_dc_scale = max(abs(dc_tracking_est_s),[],"omitnan") + eps;
plot(-1.*dc_tracking_est_s./e_dc_scale,"DisplayName","Inverted DC-tracking; Value that is subtracted during EQ");
avg_lvl_dc=mean(avg_for_lvl,1,"omitnan");
plot(avg_lvl_dc./0.01,"DisplayName","Smoothed EQ output signal; calc'd by showLevelScatter");
grid on;
@@ -101,7 +139,7 @@ function output = mpi_recipe_dev(Scpe_sig_raw, Symbols, Tx_bits, options)
title("Effective adaptive DC step");
legend
inv_dc_track = -e_dc_eff_s(:);
inv_dc_track = -dc_tracking_est_s(:);
avg_lvl_dc = avg_lvl_dc(:);
xcorr_len = min(numel(inv_dc_track),numel(avg_lvl_dc));
inv_dc_xcorr = inv_dc_track(1:xcorr_len);
@@ -135,33 +173,33 @@ function output = mpi_recipe_dev(Scpe_sig_raw, Symbols, Tx_bits, options)
%% MPI Reduction
if 1
% dc_buffer_len = 0;
% ffe_buffer_len = 0;
% smoothing_buffer_length = options.userParameters.smoothing_length;
% smoothing_buffer_update = 1;
% eq_ffe_dcr = FFE_DCremoval_adaptive_mu(eq_settings{:}, ...
% "dc_buffer_len",dc_buffer_len, ...
% "ffe_buffer_len",ffe_buffer_len,...
% "smoothing_buffer_length",smoothing_buffer_length,...
% "smoothing_buffer_update",smoothing_buffer_update);
eq_ = FFE_DCremoval("epochs_tr",5,"epochs_dd",3,"len_tr",4096*2,"mu_dd",...
0.0002,"mu_tr",0,"order",25,"sps",2,"decide",0,...
"mu_dc",0.005,"dc_buffer_len",1);
ffe_results_dcr = ffe(eq_, options.M, Scpe_sig, Symbols, Tx_bits, ...
"precode_mode", options.duob_mode, ...
'showAnalysis', options.debug_plots, ...
"postFFE", [], ...
"eth_style_symbol_mapping", 0);
ffe_results_dcr.metrics.print("description",'FFE DCR');
output.ffe_dcr_package = ffe_results_dcr;
end
%
%
% %% MPI Reduction
% if 1
%
% % dc_buffer_len = 0;
% % ffe_buffer_len = 0;
% % smoothing_buffer_length = options.userParameters.smoothing_length;
% % smoothing_buffer_update = 1;
%
% % eq_ffe_dcr = FFE_DCremoval_adaptive_mu(eq_settings{:}, ...
% % "dc_buffer_len",dc_buffer_len, ...
% % "ffe_buffer_len",ffe_buffer_len,...
% % "smoothing_buffer_length",smoothing_buffer_length,...
% % "smoothing_buffer_update",smoothing_buffer_update);
%
% eq_ = FFE_DCremoval("epochs_tr",5,"epochs_dd",3,"len_tr",4096*2,"mu_dd",...
% 0.0002,"mu_tr",0,"order",25,"sps",2,"decide",0,...
% "mu_dc",0.005,"dc_buffer_len",1);
%
% ffe_results_dcr = ffe(eq_, options.M, Scpe_sig, Symbols, Tx_bits, ...
% "precode_mode", options.duob_mode, ...
% 'showAnalysis', options.debug_plots, ...
% "postFFE", [], ...
% "eth_style_symbol_mapping", 0);
%
% ffe_results_dcr.metrics.print("description",'FFE DCR');
% output.ffe_dcr_package = ffe_results_dcr;
% end
end