EQ adaptive DC removal
This commit is contained in:
@@ -18,7 +18,8 @@ classdef FFE_DCremoval < handle
|
|||||||
mu_dd
|
mu_dd
|
||||||
epochs_dd
|
epochs_dd
|
||||||
|
|
||||||
mu_dc
|
mu_dc
|
||||||
|
dc_buffer_len
|
||||||
|
|
||||||
constellation
|
constellation
|
||||||
|
|
||||||
@@ -40,11 +41,14 @@ classdef FFE_DCremoval < handle
|
|||||||
options.epochs_dd = 5;
|
options.epochs_dd = 5;
|
||||||
|
|
||||||
options.mu_dc = 0.05;
|
options.mu_dc = 0.05;
|
||||||
|
options.dc_buffer_len = 1;
|
||||||
|
|
||||||
options.decide = false;
|
options.decide = false;
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
assert(options.dc_buffer_len>0);
|
||||||
|
|
||||||
fn = fieldnames(options);
|
fn = fieldnames(options);
|
||||||
for n = 1:numel(fn)
|
for n = 1:numel(fn)
|
||||||
obj.(fn{n}) = options.(fn{n});
|
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)];
|
x = [zeros(floor(obj.order/2),1); x; zeros(obj.order,1)];
|
||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
% e_dc_buffer = NaN(100,1);
|
e_dc_buffer = NaN(obj.dc_buffer_len,1);
|
||||||
e_dc_buffer = NaN(1,1);
|
|
||||||
e_dc_est = 0;
|
e_dc_est = 0;
|
||||||
|
|
||||||
for epoch = 1 : epochs
|
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
|
obj.e = obj.e - err(symbol) * U / normalizationfactor; % Weight update rule of NLMS
|
||||||
end
|
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
|
if mod(symbol,length(e_dc_buffer)) == 0
|
||||||
e_dc_buffer(1) = e_dc_est - obj.mu_dc * err(symbol);
|
e_dc_buffer(1) = e_dc_est - obj.mu_dc * err(symbol);
|
||||||
e_dc_buffer = circshift(e_dc_buffer,1);
|
e_dc_buffer = circshift(e_dc_buffer,1);
|
||||||
|
|||||||
@@ -8,9 +8,10 @@ Bits = load("projects/MPI_August/bits.mat","Bits");
|
|||||||
Bits = Bits.Bits;
|
Bits = Bits.Bits;
|
||||||
|
|
||||||
mdc = [1e-3,1e-2,2e-2,3e-2,4e-2,5e-2,1e-1];
|
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)
|
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);
|
[EQ_sig] = Eq.process(Scope_sig,Symbols);
|
||||||
|
|
||||||
%%%%% DEMAP %%%%%%
|
%%%%% DEMAP %%%%%%
|
||||||
|
|||||||
Reference in New Issue
Block a user