- Class folder 'Timing Recovery' with different timing recoveries
- Minimal example for the timing recovery on the FSO data
- New evaluation scripts in the FSO project folder
This commit is contained in:
magf
2026-02-02 10:56:12 +01:00
parent 798a0ca3b3
commit 005e821131
28 changed files with 3685 additions and 0 deletions

View File

@@ -0,0 +1,111 @@
classdef MaxVar_Timing_Recovery < handle
properties(Access=public)
mode
sps
fsym
fadc
num_tau
comp_signal
comp_mode
end
methods(Access=public)
function obj = MaxVar_Timing_Recovery(options)
arguments(Input)
options.mode = 0;
options.sps = 2;
options.fsym = 32e9;
options.fadc = 80e9;
options.num_tau = 64;
options.comp_signal = 0;
options.comp_mode = 0;
end
fn = fieldnames(options);
for n = 1:numel(fn)
obj.(fn{n}) = options.(fn{n});
end
%obj-Initialization here%
end
function [data_out] = process(obj, data_in)
data_out = data_in;
x = data_in.signal;
if obj.comp_mode
our_signal = data_in;
their_signal = obj.comp_signal;
end
if obj.mode == 0
vars = zeros(obj.sps,1);
for phi = 1:obj.sps
% Test variance for different start samples
y_phi = x(phi:obj.sps:end);
vars(phi) = var(y_phi);
% Comparison to reference signal
if obj.comp_mode
our_signal.signal = x(phi:obj.sps:end);
our_signal.fs = 6e9;
our_signal.normalize("mode","rms").plot("displayname",['Our signal, ' num2str(vars(phi))],'fignum',1231+phi);
their_signal.normalize("mode","rms").plot("displayname",'Their signal','fignum',1231+phi);
end
end
% Choose signal configuration with the maximum variance
[~,phi_opt] = max(vars);
y = x(phi_opt:obj.sps:end).';
elseif obj.mode == 1
% Create a grid with different (sub)sample starting points
T = 1/obj.fsym;
t = (0:length(x)-1)/obj.fadc;
tauGrid = linspace(0, T, obj.num_tau);
% Interpolate the signal starting from every defined point
% and calculate the MMSE/variance
vars = zeros(size(tauGrid));
for i = 1:numel(tauGrid)
tau = tauGrid(i);
% tk = linspace(tau, t(end), length(x)/obj.sps);
tk = tau : T : t(end)+tau;
xk = interp1(t, x, tk, 'linear', 'extrap');
if obj.comp_mode % MMSE
e = xk.' - obj.comp_signal.signal;
vars(i) = mean(abs(e).^2);
else % Variance
vars(i) = var(xk, 1);
end
end
if obj.comp_mode % MMSE
[~,idx] = min(vars);
else % Variance
[~,idx] = max(vars);
end
tau_opt = tauGrid(idx);
% Choosing the signal at optimum
% tk = linspace(tau_opt, t(end), length(x)/obj.sps);
tk = tau_opt : T : t(end)+tau_opt;
y = interp1(t, x, tk, 'linear', 'extrap');
end
% if length(y) ~= length(x)/obj.sps
% y = [y 0];
% end
data_out.signal = y.';
end
end
end