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 Mode
training = 1; training = 1;
showviz = 0; obj.equalize(X.signal, D.signal,obj.mu_tr,obj.epochs_tr,obj.len_tr,training);
obj.equalize(X.signal, D.signal,obj.mu_tr,obj.epochs_tr,obj.len_tr,training,showviz);
% Decision Directed Mode % Decision Directed Mode
N = X.length; N = X.length;
training = 0; training = 0;
showviz = 0; [signal,decision]=obj.equalize(X.signal, D.signal,obj.mu_dd,obj.epochs_dd,N,training);
[signal,decision]=obj.equalize(X.signal, D.signal,obj.mu_dd,obj.epochs_dd,N,training,showviz);
% Output Signal % Output Signal
if obj.decide if obj.decide
@@ -87,7 +85,7 @@ classdef FFE_DCremoval < handle
end 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 arguments
obj obj
@@ -97,36 +95,14 @@ classdef FFE_DCremoval < handle
epochs epochs
N N
training training
showviz
end end
x = [zeros(floor(obj.order/2),1); x; zeros(obj.order,1)]; 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; 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 for epoch = 1 : epochs
symbol = 0; symbol = 0;
@@ -135,18 +111,18 @@ classdef FFE_DCremoval < handle
symbol = symbol+1; symbol = symbol+1;
U = x(obj.order+sample-1:-1:sample); 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 if training
d_hat(symbol,1) = d(symbol); d_hat(symbol,1) = d(symbol);
else else
[~,symbol_idx] = min(abs(y(symbol) - obj.constellation)); % decision for closest constellation point [~,symbol_idx] = min(abs(y(symbol) - obj.constellation)); % decision for closest constellation point
d_hat(symbol,1) = obj.constellation(symbol_idx); d_hat(symbol,1) = obj.constellation(symbol_idx);
end end
err(symbol) = y(symbol) - d_hat(symbol); % Instantaneous error err(symbol) = y(symbol) - d_hat(symbol); % Instantaneous error
if mio ~= 0 if mio ~= 0
obj.e = obj.e - (mio * err(symbol) * U) ; % Weight update rule of LMS obj.e = obj.e - (mio * err(symbol) * U) ; % Weight update rule of LMS
else else
@@ -154,26 +130,22 @@ 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
if mod(sample,100) == 1 && showviz if mod(symbol,length(e_dc_buffer)) == 0
a2.XData = 1:2*numel(y); e_dc_buffer(1) = e_dc_est - obj.mu_dc * err(symbol);
a2.YData = repelem(y, 2); e_dc_buffer = circshift(e_dc_buffer,1);
a3.XData = 1:2*numel(d_hat); e_dc_est = mean(e_dc_buffer,"omitnan");
a3.YData = repelem(d_hat, 2); else
a4.Value = sample; e_dc_buffer(1) = e_dc_est - obj.mu_dc * err(symbol);
% b.YData = x(symbol:symbol+500); e_dc_buffer = circshift(e_dc_buffer,1);
c.YData = obj.e;
drawnow;
end end
e_dc = e_dc - obj.mu_dc * err(symbol);
obj.error(epoch,symbol) = err(symbol) * err(symbol)'; % Instantaneous square error obj.error(epoch,symbol) = err(symbol) * err(symbol)'; % Instantaneous square error
end end
end end
end end
end end
end end