EQ adaptive DC removal

This commit is contained in:
Silas Oettinghaus
2024-08-16 10:21:01 +02:00
parent 793a5b7efd
commit 17a1dfbbd5
2 changed files with 12 additions and 4 deletions

View File

@@ -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);