diff --git a/Classes/04_DSP/FFE_DCremoval.m b/Classes/04_DSP/FFE_DCremoval.m index 46680fa..8ea8f6a 100644 --- a/Classes/04_DSP/FFE_DCremoval.m +++ b/Classes/04_DSP/FFE_DCremoval.m @@ -18,7 +18,8 @@ classdef FFE_DCremoval < handle mu_dd epochs_dd - mu_dc + mu_dc + dc_buffer_len constellation @@ -40,11 +41,14 @@ classdef FFE_DCremoval < handle options.epochs_dd = 5; options.mu_dc = 0.05; + options.dc_buffer_len = 1; options.decide = false; end + assert(options.dc_buffer_len>0); + fn = fieldnames(options); for n = 1:numel(fn) obj.(fn{n}) = options.(fn{n}); @@ -100,8 +104,7 @@ classdef FFE_DCremoval < handle x = [zeros(floor(obj.order/2),1); x; zeros(obj.order,1)]; err = 0; - % e_dc_buffer = NaN(100,1); - e_dc_buffer = NaN(1,1); + e_dc_buffer = NaN(obj.dc_buffer_len,1); e_dc_est = 0; for epoch = 1 : epochs @@ -130,6 +133,10 @@ classdef FFE_DCremoval < handle obj.e = obj.e - err(symbol) * U / normalizationfactor; % Weight update rule of NLMS end + %Update the dc estimation every n-th symbol. This is a + %trivial implementation of parallel EQ´s where the + %errors are not apparent in every step. See Silas OFC + %2023 "MPI mitigation adaptive DC removal" if mod(symbol,length(e_dc_buffer)) == 0 e_dc_buffer(1) = e_dc_est - obj.mu_dc * err(symbol); e_dc_buffer = circshift(e_dc_buffer,1); diff --git a/projects/MPI_August/EQ_development.m b/projects/MPI_August/EQ_development.m index 3cf1c3d..90ce016 100644 --- a/projects/MPI_August/EQ_development.m +++ b/projects/MPI_August/EQ_development.m @@ -8,9 +8,10 @@ Bits = load("projects/MPI_August/bits.mat","Bits"); Bits = Bits.Bits; mdc = [1e-3,1e-2,2e-2,3e-2,4e-2,5e-2,1e-1]; +mdc = [0.6, 0.7, 0.8, 1, 1.2]; for m = 1:numel(mdc) - Eq = FFE_DCremoval("epochs_tr",5,"epochs_dd",5,"len_tr",4096*2,"mu_dd",1e-4,"mu_tr",0,"order",25,"sps",2,"decide",0,"mu_dc",mdc(m)); + Eq = FFE_DCremoval("epochs_tr",5,"epochs_dd",5,"len_tr",4096*2,"mu_dd",1e-4,"mu_tr",0,"order",25,"sps",2,"decide",0,"mu_dc",mdc(m),"dc_buffer_len",112); [EQ_sig] = Eq.process(Scope_sig,Symbols); %%%%% DEMAP %%%%%%