From 3f089dca9fc531f8651276a97331192f11976ad0 Mon Sep 17 00:00:00 2001 From: Silas Oettinghaus Date: Fri, 16 Aug 2024 10:07:29 +0200 Subject: [PATCH] DC removal with buffer len --- Classes/04_DSP/FFE_DCremoval.m | 72 +++++++++++----------------------- 1 file changed, 22 insertions(+), 50 deletions(-) diff --git a/Classes/04_DSP/FFE_DCremoval.m b/Classes/04_DSP/FFE_DCremoval.m index 7478bff..2fd9055 100644 --- a/Classes/04_DSP/FFE_DCremoval.m +++ b/Classes/04_DSP/FFE_DCremoval.m @@ -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; @@ -135,18 +111,18 @@ classdef FFE_DCremoval < handle symbol = symbol+1; 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); else [~,symbol_idx] = min(abs(y(symbol) - obj.constellation)); % decision for closest constellation point d_hat(symbol,1) = obj.constellation(symbol_idx); end - + err(symbol) = y(symbol) - d_hat(symbol); % Instantaneous error - + if mio ~= 0 obj.e = obj.e - (mio * err(symbol) * U) ; % Weight update rule of LMS else @@ -154,26 +130,22 @@ 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 end - + end - + end end