- improved signal detection and thresholding
- no lag accu update if no signal git-svn-id: http://moon:8086/svn/matlab/trunk@114 801c6759-fa7c-4059-a304-17956f83a07c
This commit is contained in:
+30
-10
@@ -24,8 +24,8 @@
|
|||||||
|
|
||||||
function [bits] = garage_ip (varargin)
|
function [bits] = garage_ip (varargin)
|
||||||
|
|
||||||
params = struct ('x', [], 'sampleRate', 48000, 'numSamplesPerSym', 16, 'loopFilterGain', 1.0, 'with_filter', 0, 'k_noise', 0.0);
|
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', '');
|
units = struct ('x', '', 'sampleRate', '1/s', 'numSamplesPerSym', 'sps', 'loopFilterGain', '', 'with_filter', '', 'k_noise', '', 'loopThreshold', '');
|
||||||
|
|
||||||
% Parse parameters
|
% Parse parameters
|
||||||
names = fieldnames(params);
|
names = fieldnames(params);
|
||||||
@@ -100,12 +100,10 @@ v_min = 0; % Threshold max
|
|||||||
v_max = 0; % Threshold min
|
v_max = 0; % Threshold min
|
||||||
rho_thr = 0.999; % Threshold forgetting factor
|
rho_thr = 0.999; % Threshold forgetting factor
|
||||||
alpha_thr = 0.002; % Min/Max update 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_lead = 0.1; % Symbol syncronizer loop filter lead
|
||||||
k_lag = 0.0001; % Symbol syncronizer loop filter lag
|
k_lag = 0.0001; % Symbol syncronizer loop filter lag
|
||||||
lag_accu = 0; % Symbol syncronizer loop filter
|
lag_accu = 0; % Symbol syncronizer loop filter
|
||||||
k_leak = 0.0; % Lag forgetting factor
|
rho_leak = 0.9999; % Lag forgetting factor
|
||||||
loopThreshold = 0.02; % Processing threshold
|
|
||||||
ns = 1; % Start sample source
|
ns = 1; % Start sample source
|
||||||
n = 1; % Start sample sink
|
n = 1; % Start sample sink
|
||||||
err = 0; % Error
|
err = 0; % Error
|
||||||
@@ -117,6 +115,11 @@ k_id = 1/numSamplesPerSym;
|
|||||||
id_accu = 0;
|
id_accu = 0;
|
||||||
dc_corr = 0;
|
dc_corr = 0;
|
||||||
zbit = -1;
|
zbit = -1;
|
||||||
|
|
||||||
|
k_lead = k_lead * params.loopFilterGain;
|
||||||
|
k_lag = k_lag * params.loopFilterGain;
|
||||||
|
|
||||||
|
isSignal = 0;
|
||||||
while ns < N
|
while ns < N
|
||||||
% Get next interpolated sample
|
% Get next interpolated sample
|
||||||
is = fix(ns);
|
is = fix(ns);
|
||||||
@@ -136,8 +139,18 @@ while ns < N
|
|||||||
dc_corr = dc_corr + alpha_thr*(v_max + v_min);
|
dc_corr = dc_corr + alpha_thr*(v_max + v_min);
|
||||||
|
|
||||||
% Signal detection
|
% Signal detection
|
||||||
v_sig = (1-alpha_sig)*v_sig + alpha_sig*ys*ys;
|
yd = abs(ys)-v_max;
|
||||||
isSignal = v_sig >= loopThreshold;
|
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
|
% Integrate and dump
|
||||||
id_accu = id_accu + k_id*ys;
|
id_accu = id_accu + k_id*ys;
|
||||||
@@ -184,9 +197,16 @@ while ns < N
|
|||||||
else
|
else
|
||||||
count = countReload;
|
count = countReload;
|
||||||
end
|
end
|
||||||
vcorr = k_leadLag*k_lead*err + lag_accu;
|
|
||||||
lag_accu = lag_accu + k_leadLag*k_lag*err;
|
vcorr = k_lead*err + lag_accu;
|
||||||
lag_accu = lag_accu * (1-k_leak);
|
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);
|
baud = fs/((1+lag_accu)*numSamplesPerSym);
|
||||||
k_id = 1/((1+lag_accu)*numSamplesPerSym);
|
k_id = 1/((1+lag_accu)*numSamplesPerSym);
|
||||||
_err(n) = err;
|
_err(n) = err;
|
||||||
|
|||||||
Reference in New Issue
Block a user