[RX]
- added status print outs - added CFO tracking mode git-svn-id: http://moon:8086/svn/matlab/trunk@65 801c6759-fa7c-4059-a304-17956f83a07c
This commit is contained in:
+61
-19
@@ -49,23 +49,23 @@ filter_z = [];
|
||||
fileRemain = wav_size;
|
||||
|
||||
% Timing coarse stuff
|
||||
timingCoarse = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'cp_off', 0, 'cp_off_', [], 'Nd', 0);
|
||||
timingCoarse = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 'cp_off', 0, 'cp_off_', [], 'Nd', 0);
|
||||
|
||||
% CFO coarse integer stuff
|
||||
cfoCoarseInteger = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'df', 0);
|
||||
cfoCoarseInteger = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 'err', 0);
|
||||
|
||||
% CFO coarse fractional stuff
|
||||
cfoCoarseFractional = struct('Z', 0, 'sync_counter', 200, 'sync', 0, 'err', 0, 'err_', [], 'df', 0, 'df_', []);
|
||||
cfoCoarseFractional = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 'err', 0, 'err_', [], 'df', 0, 'df_', []);
|
||||
|
||||
% CFO Fine stuff
|
||||
cfoFine = struct('Z', 0, 'sync_counter', 200, 'sync', 0, 'err', 0, 'err_', [], 'df', 0, 'df_', [], 'Xlast', [], 'phi', 0, 'bin_track', 1);
|
||||
cfoFine = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 'err', 0, 'err_', [], 'df', 0, 'df_', [], 'Xlast', [], 'phi', 0, 'bin_track', 1);
|
||||
|
||||
% Frame timing stuff
|
||||
frameTiming = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'kc_max', -1000, 'n', 0, 'n_max', 0);
|
||||
frameTiming = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 'kc_max', -1000, 'n', 0, 'n_max', 0);
|
||||
|
||||
% Equalization stuff
|
||||
MIN_ABS_H = 1e-10;
|
||||
equalizer = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 's', 0, 'm', 0, 'kk', 1, 'eps_abs_h', MIN_ABS_H);
|
||||
equalizer = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 's', 0, 'm', 0, 'kk', 1, 'eps_abs_h', MIN_ABS_H);
|
||||
|
||||
[W_syms, W_pilots] = calcWiener(drm_mode, drm_bw);
|
||||
|
||||
@@ -131,10 +131,15 @@ while(fileRemain > fileChunkSize)
|
||||
% --------------------------------------------------------------
|
||||
% Timing coarse
|
||||
if (~timingCoarse.sync)
|
||||
if (~timingCoarse.started)
|
||||
timingCoarse.started = 1;
|
||||
fprintf('Coarse timing acquisition');
|
||||
end
|
||||
|
||||
x = buf_recv.read(N+Ng);
|
||||
[cp_off, Nd, valid, timingCoarse.Z] = timing_coarse(x, N, Ng, Ng, timingCoarse.Z);
|
||||
[timingCoarse.cp_off, timingCoarse.Nd, valid, timingCoarse.Z] = timing_coarse(x, N, Ng, Ng, timingCoarse.Z);
|
||||
if (valid)
|
||||
timingCoarse.cp_off_ = [timingCoarse.cp_off_ cp_off];
|
||||
timingCoarse.cp_off_ = [timingCoarse.cp_off_ timingCoarse.cp_off];
|
||||
if (timingCoarse.sync_counter > 0)
|
||||
timingCoarse.sync_counter = timingCoarse.sync_counter - 1;
|
||||
else
|
||||
@@ -143,28 +148,33 @@ while(fileRemain > fileChunkSize)
|
||||
end;
|
||||
if (timingCoarse.sync)
|
||||
timingCoarse.cp_off = round(median(timingCoarse.cp_off_));
|
||||
timingCoarse.Nd = Nd;
|
||||
Nd = timingCoarse.Nd
|
||||
cp_off = timingCoarse.cp_off
|
||||
|
||||
% Reset buffer to Cp offset
|
||||
buf_recv.setReadIndex(timingCoarse.cp_off);
|
||||
|
||||
fprintf(' (cp_off=%d, Nd=%d)\n', timingCoarse.cp_off, timingCoarse.Nd);
|
||||
end
|
||||
end
|
||||
|
||||
% Integer CFO coarse
|
||||
if (timingCoarse.sync) && (~cfoCoarseInteger.sync)
|
||||
if (~cfoCoarseInteger.started)
|
||||
cfoCoarseInteger.started = 1;
|
||||
fprintf('Coarse integer CFO acquisition');
|
||||
end
|
||||
|
||||
x = buf_recv.read(N+Ng);
|
||||
if (~isempty(x))
|
||||
[d_bin, valid, cfoCoarseInteger.Z] = cfo_coarse_int(x(Ng+1:N+Ng), N, carrier_pilot, 11, cfoCoarseInteger.Z);
|
||||
if valid
|
||||
cfoCoarseInteger.df = -d_bin(1)/N*fs;
|
||||
cfoCoarseInteger.err = -d_bin(1)/N*fs;
|
||||
if (cfoCoarseInteger.sync_counter > 0)
|
||||
cfoCoarseInteger.sync_counter = cfoCoarseInteger.sync_counter - 1;
|
||||
else
|
||||
cfoCoarseInteger.sync = 1;
|
||||
% Reset buffer to Cp offset
|
||||
buf_recv.setReadIndex(timingCoarse.cp_off);
|
||||
fprintf(' (err_fi=%f)\n', cfoCoarseInteger.err);
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -172,26 +182,38 @@ while(fileRemain > fileChunkSize)
|
||||
|
||||
% Fractional CFO coarse
|
||||
if (cfoCoarseInteger.sync) && (~cfoCoarseFractional.sync)
|
||||
if (~cfoCoarseFractional.started)
|
||||
cfoCoarseFractional.started = 1;
|
||||
fprintf('Coarse fractional CFO acquisition');
|
||||
end
|
||||
x = buf_recv.read(N+Ng);
|
||||
if (~isempty(x))
|
||||
[err, cfoCoarseFractional.Z] = cfo_coarse_fract(x, N, Ng, Ng, Nd, cfoCoarseFractional.Z);
|
||||
[err, cfoCoarseFractional.Z] = cfo_coarse_fract(x, N, Ng, Ng, timingCoarse.Nd, cfoCoarseFractional.Z);
|
||||
cfoCoarseFractional.err_ = [cfoCoarseFractional.err_ err*fs];
|
||||
|
||||
if (cfoCoarseFractional.sync_counter > 0)
|
||||
cfoCoarseFractional.sync_counter = cfoCoarseFractional.sync_counter - 1;
|
||||
else
|
||||
cfoCoarseFractional.sync = 1;
|
||||
cfoCoarseFractional.df = cfoCoarseInteger.df + mean(cfoCoarseFractional.err_);
|
||||
cfoCoarseFractional.df_ = cfoCoarseInteger.df + cfoCoarseFractional.err_;
|
||||
cfoFine.df = cfoCoarseFractional.df;
|
||||
cfoCoarseFractional.err = mean(cfoCoarseFractional.err_);
|
||||
cfoCoarseFractional.df = cfoCoarseInteger.err + cfoCoarseFractional.err;
|
||||
cfoCoarseFractional.df_ = cfoCoarseInteger.err + cfoCoarseFractional.err_;
|
||||
|
||||
% Reset buffer to Cp offset
|
||||
buf_recv.setReadIndex(timingCoarse.cp_off);
|
||||
fprintf(' (err_ff=%f, df_est=%f)\n', cfoCoarseFractional.err, cfoCoarseFractional.df);
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
% CFO Fine
|
||||
if (cfoCoarseFractional.sync)
|
||||
if (~cfoFine.started)
|
||||
cfoFine.started = 1;
|
||||
cfoFine.df = cfoCoarseFractional.df;
|
||||
fprintf('Fine fractional CFO acquisition\n');
|
||||
end
|
||||
kn = fs/(2*pi*(1+Ng/N))/N;
|
||||
sym_pilot = exp(j*2*pi*phi_pilot'/1024);
|
||||
bin_pilot = c2i(N, carrier_pilot);
|
||||
@@ -205,7 +227,17 @@ while(fileRemain > fileChunkSize)
|
||||
Z = cfoFine.Xlast .* conj(X);
|
||||
cfoFine.err = kn*angle(Z(bin_pilot));
|
||||
cfoFine.err_ = [cfoFine.err_ cfoFine.err];
|
||||
cfoFine.df = cfoFine.df + 0.1*mean(cfoFine.err(cfoFine.bin_track));
|
||||
|
||||
if (abs(cfoFine.df) > 0.001)
|
||||
cfoFine.df = cfoFine.df + 0.1*mean(cfoFine.err(cfoFine.bin_track));
|
||||
elseif ~cfoFine.sync
|
||||
if cfoFine.sync_counter > 0
|
||||
cfoFine.sync_counter = cfoFine.sync_counter - 1;
|
||||
else
|
||||
cfoFine.sync = 1;
|
||||
fprintf('Enter fine tracking mode\n');
|
||||
end
|
||||
end
|
||||
cfoFine.df_ = [cfoFine.df_ cfoFine.df];
|
||||
end
|
||||
buf_Z.write(X);
|
||||
@@ -216,7 +248,11 @@ while(fileRemain > fileChunkSize)
|
||||
bins = c2i(N, carrier_time);
|
||||
skip_syms = ofdm_drm_params.nspf*4;
|
||||
if (~frameTiming.sync) && (buf_Z.len() >= (N*(1+ofdm_drm_params.nspf+skip_syms)))
|
||||
|
||||
if (~frameTiming.started)
|
||||
frameTiming.started = 1;
|
||||
fprintf('Frame timing acquisition');
|
||||
end
|
||||
|
||||
if (frameTiming.n < ofdm_drm_params.nspf)
|
||||
frameTiming.Z = 0;
|
||||
Z1 = buf_Z.readAt(N, N*skip_syms);
|
||||
@@ -235,12 +271,17 @@ while(fileRemain > fileChunkSize)
|
||||
|
||||
% Reset Buffer to frame start
|
||||
buf_Z.setReadIndex(N*(frameTiming.n_max));
|
||||
frame_start = frameTiming.n_max
|
||||
fprintf(' (frame_start=%d)\n', frameTiming.n_max);
|
||||
end
|
||||
end
|
||||
|
||||
if (frameTiming.sync)
|
||||
|
||||
if (~equalizer.started)
|
||||
equalizer.started = 1;
|
||||
fprintf('Channel estimation and symbol reception\n');
|
||||
end
|
||||
|
||||
Z = transpose(buf_Z.read(N));
|
||||
if ~isempty(Z)
|
||||
|
||||
@@ -273,6 +314,7 @@ while(fileRemain > fileChunkSize)
|
||||
% get frequency error
|
||||
% correlate wiener filtered channel with raw estimate
|
||||
df_track = fs/(2*pi*N)*angle(H_pilots * Hr' + equalizer.eps_abs_h);
|
||||
cfoFine.df = cfoFine.df + 0.01*df_track;
|
||||
df_track_ = [df_track_ df_track];
|
||||
|
||||
% check for too small values
|
||||
|
||||
Reference in New Issue
Block a user