diff --git a/garage_ip.m b/garage_ip.m index fa58abc..50ba617 100755 --- a/garage_ip.m +++ b/garage_ip.m @@ -99,7 +99,10 @@ hyst_thr = 0.1; v_min = 0; % Threshold max v_max = 0; % Threshold min rho_thr = 0.999; % Threshold forgetting factor -alpha_thr = 0.002; % Min/Max update factor +alpha_thr = 0.01; % Min/Max update factor +alpha_dc = 0.002; % DC correction update factor +agc_mu = 0.01; % AGC update factor +agc_gain_max = 10; k_lead = 0.1; % Symbol syncronizer loop filter lead k_lag = 0.0001; % Symbol syncronizer loop filter lag lag_accu = 0; % Symbol syncronizer loop filter @@ -120,23 +123,31 @@ k_lead = k_lead * params.loopFilterGain; k_lag = k_lag * params.loopFilterGain; isSignal = 0; + +agc_target = 0.5; +agc_gain = 1.0; while ns < N % Get next interpolated sample is = fix(ns); mu = ns - is; - ys = (1-mu).*y(is) + mu.*y(is+1) - dc_corr; - + ys = agc_gain * ((1-mu).*y(is) + mu.*y(is+1) - dc_corr); + % Calculate Runing Min/Max v_min = v_min * rho_thr; v_max = v_max * rho_thr; + if ys < v_min - v_min = ys; + v_min = (1-alpha_thr)*v_min + alpha_thr*ys; elseif ys > v_max - v_max = ys; + v_max = (1-alpha_thr)*v_max + alpha_thr*ys; end + % AGC + agc_err = v_max - agc_target; + agc_gain = max(0.0, min(agc_gain_max, agc_gain - agc_mu*agc_err)); + % Calculate DC offset correction - dc_corr = dc_corr + alpha_thr*(v_max + v_min); + dc_corr = (1-alpha_dc)*dc_corr + alpha_dc*(v_max + v_min); % Signal detection yd = abs(ys)-v_max; @@ -214,21 +225,25 @@ while ns < N _id_accu(n) = id_accu; _id_bit(n) = id_bit; _cnt(n) = vcorr; - _v_tr(n) = v_sig; + _v_tr(n) = agc_gain; + _v_min(n) = v_min; + _v_max(n) = v_max; _ys(n) = ys; n = n + 1; - ns = ns + (1+vcorr); + ns = max(1, ns + (1+vcorr)); end bits = bits'; n = 1:length(_ys); % Plot -subplot(3, 1, 1) -plot(n, _ys, '-o', n, _v_tr, 'm', smp_n, smp, 'ro'); grid; -subplot(3, 1, 2) +subplot(4, 1, 1) +plot(n, _ys, '-o', smp_n, smp, 'ro'); grid; +subplot(4, 1, 2) plot(n, _err, n, _err_baud); grid; legend('err_{smp}', 'err_{baud}') -subplot(3, 1, 3) +subplot(4, 1, 3) plot(n, _id_accu, n, _id_bit); grid; legend('accu_{id}', 'bit_{id}') +subplot(4, 1, 4) +plot(n, _v_tr, 'm', n, _v_min, n, _v_max); grid; legend('V_{sig}', 'V_{min}', 'V_{max}') endfunction