From 7dd8034c77ed41fc3cd8d8b68c31205de660a256 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sun, 3 May 2015 13:07:21 +0000 Subject: [PATCH] [RX] - added status print outs - added CFO tracking mode git-svn-id: http://moon:8086/svn/matlab/trunk@65 801c6759-fa7c-4059-a304-17956f83a07c --- ofdm/ofdm_rx.m | 80 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 61 insertions(+), 19 deletions(-) diff --git a/ofdm/ofdm_rx.m b/ofdm/ofdm_rx.m index 390717d..79c35de 100644 --- a/ofdm/ofdm_rx.m +++ b/ofdm/ofdm_rx.m @@ -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