DC removal with buffer len

This commit is contained in:
Silas Oettinghaus
2024-08-16 10:07:29 +02:00
parent 23f386da77
commit 3f089dca9f

View File

@@ -65,14 +65,12 @@ classdef FFE_DCremoval < handle
% Training Mode
training = 1;
showviz = 0;
obj.equalize(X.signal, D.signal,obj.mu_tr,obj.epochs_tr,obj.len_tr,training,showviz);
obj.equalize(X.signal, D.signal,obj.mu_tr,obj.epochs_tr,obj.len_tr,training);
% Decision Directed Mode
N = X.length;
training = 0;
showviz = 0;
[signal,decision]=obj.equalize(X.signal, D.signal,obj.mu_dd,obj.epochs_dd,N,training,showviz);
[signal,decision]=obj.equalize(X.signal, D.signal,obj.mu_dd,obj.epochs_dd,N,training);
% Output Signal
if obj.decide
@@ -87,7 +85,7 @@ classdef FFE_DCremoval < handle
end
function [y,d_hat] = equalize(obj,x,d,mio,epochs,N,training,showviz)
function [y,d_hat] = equalize(obj,x,d,mio,epochs,N,training)
arguments
obj
@@ -97,36 +95,14 @@ classdef FFE_DCremoval < handle
epochs
N
training
showviz
end
x = [zeros(floor(obj.order/2),1); x; zeros(obj.order,1)];
if showviz
f = figure(111);
subplot(2,2,1:2);
hold on
a = scatter(1:numel(x),x,1,'.');
a2 = scatter(1,1,1,'.');
a3 = scatter(1,1,2,'.');
a4 = xline(1);
ylim([-3 3])
xlim([0 length(x)]);
% subplot(2,2,3)
% dplot = x(1:1+500);
% b = scatter(1:numel(dplot),dplot,5,'x');
% xline(1)
% xline(obj.order)
% ylim([-3 3])
% xlim([0 500]);
subplot(2,2,3:4)
c = stem(obj.e);
ylim([-1 1])
drawnow
end
err = 0;
e_dc = 0;
% e_dc_buffer = NaN(100,1);
e_dc_buffer = NaN(10,1);
e_dc_est = 0;
for epoch = 1 : epochs
symbol = 0;
@@ -136,7 +112,7 @@ classdef FFE_DCremoval < handle
U = x(obj.order+sample-1:-1:sample);
y(symbol,1) = e_dc + obj.e.' * U; % Calculating output of LMS __ * |
y(symbol,1) = e_dc_est + obj.e.' * U; % Calculating output of LMS __ * |
if training
d_hat(symbol,1) = d(symbol);
@@ -154,19 +130,15 @@ classdef FFE_DCremoval < handle
obj.e = obj.e - err(symbol) * U / normalizationfactor; % Weight update rule of NLMS
end
if mod(sample,100) == 1 && showviz
a2.XData = 1:2*numel(y);
a2.YData = repelem(y, 2);
a3.XData = 1:2*numel(d_hat);
a3.YData = repelem(d_hat, 2);
a4.Value = sample;
% b.YData = x(symbol:symbol+500);
c.YData = obj.e;
drawnow;
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);
e_dc_est = mean(e_dc_buffer,"omitnan");
else
e_dc_buffer(1) = e_dc_est - obj.mu_dc * err(symbol);
e_dc_buffer = circshift(e_dc_buffer,1);
end
e_dc = e_dc - obj.mu_dc * err(symbol);
obj.error(epoch,symbol) = err(symbol) * err(symbol)'; % Instantaneous square error
end