diff --git a/garage_ip.m b/garage_ip.m index 47cbdab..fa58abc 100755 --- a/garage_ip.m +++ b/garage_ip.m @@ -24,8 +24,8 @@ function [bits] = garage_ip (varargin) -params = struct ('x', [], 'sampleRate', 48000, 'numSamplesPerSym', 16, 'loopFilterGain', 1.0, 'with_filter', 0, 'k_noise', 0.0); -units = struct ('x', '', 'sampleRate', '1/s', 'numSamplesPerSym', 'sps', 'loopFilterGain', '', 'with_filter', '', 'k_noise', ''); +params = struct ('x', [], 'sampleRate', 48000, 'numSamplesPerSym', 16, 'loopFilterGain', 1.0, 'with_filter', 0, 'k_noise', 0.0, 'loopThreshold', 0.1); +units = struct ('x', '', 'sampleRate', '1/s', 'numSamplesPerSym', 'sps', 'loopFilterGain', '', 'with_filter', '', 'k_noise', '', 'loopThreshold', ''); % Parse parameters names = fieldnames(params); @@ -100,12 +100,10 @@ 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 -k_leadLag = params.loopFilterGain; % Overall loopfilter gain (scales k_lead and k_lag) 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 -k_leak = 0.0; % Lag forgetting factor -loopThreshold = 0.02; % Processing threshold +rho_leak = 0.9999; % Lag forgetting factor ns = 1; % Start sample source n = 1; % Start sample sink err = 0; % Error @@ -117,6 +115,11 @@ k_id = 1/numSamplesPerSym; id_accu = 0; dc_corr = 0; zbit = -1; + +k_lead = k_lead * params.loopFilterGain; +k_lag = k_lag * params.loopFilterGain; + +isSignal = 0; while ns < N % Get next interpolated sample is = fix(ns); @@ -136,8 +139,18 @@ while ns < N dc_corr = dc_corr + alpha_thr*(v_max + v_min); % Signal detection - v_sig = (1-alpha_sig)*v_sig + alpha_sig*ys*ys; - isSignal = v_sig >= loopThreshold; + yd = abs(ys)-v_max; + v_sig = (1-alpha_sig)*v_sig + alpha_sig*yd*yd; + + if isSignal == 0 + if v_sig < params.loopThreshold + isSignal = 1; + end + else + if v_sig > 1.2*params.loopThreshold + isSignal = 0; + end + end % Integrate and dump id_accu = id_accu + k_id*ys; @@ -184,9 +197,16 @@ while ns < N else count = countReload; end - vcorr = k_leadLag*k_lead*err + lag_accu; - lag_accu = lag_accu + k_leadLag*k_lag*err; - lag_accu = lag_accu * (1-k_leak); + + vcorr = k_lead*err + lag_accu; + lag_accu = lag_accu * rho_leak; + if isSignal + if lag_accu > -0.2 && lag_accu < 0.2 + lag_accu = lag_accu + k_lag*err; + end + else + lag_accu = 0; + end baud = fs/((1+lag_accu)*numSamplesPerSym); k_id = 1/((1+lag_accu)*numSamplesPerSym); _err(n) = err;