From 7b52e9d66db79893f729d4ba8ac9a6c63bb9a6e0 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sun, 3 May 2015 14:47:43 +0000 Subject: [PATCH] - refactored CFO fine and symbol generation git-svn-id: http://moon:8086/svn/matlab/trunk@69 801c6759-fa7c-4059-a304-17956f83a07c --- ofdm/ofdm_rx.m | 123 ++++++++++++++++++++++++++------------------ ofdm/timing_frame.m | 2 +- 2 files changed, 75 insertions(+), 50 deletions(-) diff --git a/ofdm/ofdm_rx.m b/ofdm/ofdm_rx.m index dd93da7..a1541c8 100644 --- a/ofdm/ofdm_rx.m +++ b/ofdm/ofdm_rx.m @@ -49,32 +49,32 @@ filter_z = []; fileRemain = wav_size; % Timing coarse stuff -timingCoarse = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 'cp_off', 0, 'cp_off_', [], 'Nd', 0); +timingCoarse = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, 'cp_off', 0, 'cp_off_', [], 'Nd', 0); % CFO coarse integer stuff -cfoCoarseInteger = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 'err', 0); +cfoCoarseInteger = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, 'f_err', 0); % CFO coarse fractional stuff -cfoCoarseFractional = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 'err', 0, 'err_', [], 'df', 0, 'df_', []); +cfoCoarseFractional = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, 'f_err', 0, 'f_err_', [], 'df', 0, 'df_', []); % CFO Fine stuff -cfoFine = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 'err', 0, 'err_', [], 'df', 0, 'df_', [], 'Xlast', [], 'phi', 0, 'bin_track', 1); +cfoFine = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, 'f_err', 0, 'f_err_', [], 'df', 0, 'df_', [], 'Xlast', [], 'phi', 0, 'bin_track', 1); % Frame timing stuff -frameTiming = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 'kc_max', -1000, 'n', 0, 'n_max', 0); +frameTiming = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 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, 'started', 0, 's', 0, 'm', 0, 'kk', 1, 'eps_abs_h', MIN_ABS_H); +equalizer = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, 'sync_frame_num', 0, 'f_err', 1000, 'f_err_', [], 's', 0, 'm', 0, 'kk', 1, 'eps_abs_h', MIN_ABS_H); [W_syms, W_pilots] = calcWiener(drm_mode, drm_bw); H_syms = []; H_pilots = []; H_ = []; -df_track = 1000; +df_track = 0; df_track_ = []; - +symbol_count = -1; symbols_per_frame = ofdm_drm_params.nspf; symbols_to_delay = ofdm_drm_params.y; frames_per_window = 2*ofdm_drm_params.y; @@ -168,14 +168,14 @@ while(fileRemain > fileChunkSize) 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.err = -d_bin(1)/N*fs; + cfoCoarseInteger.f_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); + fprintf(' (f_err_i=%f)\n', cfoCoarseInteger.f_err); end end end @@ -189,30 +189,31 @@ while(fileRemain > fileChunkSize) end x = buf_recv.read(N+Ng); if (~isempty(x)) - [err, cfoCoarseFractional.Z] = cfo_coarse_fract(x, N, Ng, Ng, timingCoarse.Nd, cfoCoarseFractional.Z); - cfoCoarseFractional.err_ = [cfoCoarseFractional.err_ err*fs]; + [f_err, cfoCoarseFractional.Z] = cfo_coarse_fract(x, N, Ng, Ng, timingCoarse.Nd, cfoCoarseFractional.Z); + cfoCoarseFractional.f_err_ = [cfoCoarseFractional.f_err_ f_err*fs]; if (cfoCoarseFractional.sync_counter > 0) cfoCoarseFractional.sync_counter = cfoCoarseFractional.sync_counter - 1; else cfoCoarseFractional.sync = 1; - cfoCoarseFractional.err = mean(cfoCoarseFractional.err_); - cfoCoarseFractional.df = cfoCoarseInteger.err + cfoCoarseFractional.err; - cfoCoarseFractional.df_ = cfoCoarseInteger.err + cfoCoarseFractional.err_; + cfoCoarseFractional.f_err = mean(cfoCoarseFractional.f_err_); + cfoCoarseFractional.df = cfoCoarseInteger.f_err + cfoCoarseFractional.f_err; + cfoCoarseFractional.df_ = cfoCoarseInteger.f_err + cfoCoarseFractional.f_err_; % Reset buffer to Cp offset buf_recv.setReadIndex(timingCoarse.cp_off); - fprintf(' (err_ff=%f, df_est=%f)\n', cfoCoarseFractional.err, cfoCoarseFractional.df); + fprintf(' (f_err_f=%f, df_est=%f)\n', cfoCoarseFractional.f_err, cfoCoarseFractional.df); end end end - % CFO Fine + % Create symbols if (cfoCoarseFractional.sync) if (~cfoFine.started) cfoFine.started = 1; - cfoFine.df = cfoCoarseFractional.df; + df_track = cfoCoarseFractional.df; + fprintf('Creating Symbols\n'); fprintf('Fine fractional CFO acquisition\n'); end kn = fs/(2*pi*(1+Ng/N))/N; @@ -221,32 +222,30 @@ while(fileRemain > fileChunkSize) x = buf_recv.read(N+Ng); if (~isempty(x)) - x = x.*exp(j*(2*pi*cfoFine.df/fs*(0:N+Ng-1)' + cfoFine.phi)); - cfoFine.phi = cfoFine.phi + 2*pi*cfoFine.df/fs*(N+Ng); - X = fft(x(Ng+1:N+Ng)); - if (~isempty(cfoFine.Xlast)) - Z = cfoFine.Xlast .* conj(X); - cfoFine.err = kn*angle(Z(bin_pilot)); - cfoFine.err_ = [cfoFine.err_ cfoFine.err]; - if cfoFine.sync - cfoFine.df = cfoFine.df + 0.1*df_track; - else - cfoFine.df = cfoFine.df + 0.1*mean(cfoFine.err(cfoFine.bin_track)); - end - - if (abs(df_track) < 0.1) & (cfoFine.sync == 0) - if cfoFine.sync_counter > 0 - cfoFine.sync_counter = cfoFine.sync_counter - 1; - else - cfoFine.sync = 1; - fprintf('Enter fine tracking mode at frame %d\n', equalizer.kk); - end - end - cfoFine.df_ = [cfoFine.df_ cfoFine.df]; + if equalizer.sync + df_track = df_track + 0.1*equalizer.f_err; + else + df_track = df_track + 0.1*cfoFine.f_err; end + df_track_ = [df_track_ df_track]; + + x = x.*exp(j*(2*pi*df_track/fs*(0:N+Ng-1)' + cfoFine.phi)); + cfoFine.phi = cfoFine.phi + 2*pi*df_track/fs*(N+Ng); + X = fft(x(Ng+1:N+Ng)); buf_Z.write(X); - cfoFine.Xlast = X; + symbol_count = symbol_count + 1; + + % CFO Fine acquisition + if ~equalizer.sync + if (~isempty(cfoFine.Xlast)) + Z = cfoFine.Xlast .* conj(X); + f_err = kn*angle(Z(bin_pilot)); + cfoFine.f_err = mean(f_err(cfoFine.bin_track)); + cfoFine.f_err_ = [cfoFine.f_err_ cfoFine.f_err]; + end + cfoFine.Xlast = X; + end end % Frame timing acquisition @@ -299,7 +298,7 @@ while(fileRemain > fileChunkSize) H_raw(carrier_gain_bins) = (H_); H_gain_cell{equalizer.m+1} = (H_); - str = sprintf('Frame %d, s=%d, m=%d, n=%d', equalizer.kk, equalizer.s, equalizer.m, equalizer.n); + str = sprintf('Symbol %d, s=%d, m=%d, n=%d', symbol_count, equalizer.s, equalizer.m, equalizer.n); if equalizer.kk > frames_per_window @@ -318,9 +317,20 @@ 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); - df_track_ = [df_track_ df_track]; + equalizer.f_err = fs/(2*pi*N)*angle(H_pilots * Hr' + equalizer.eps_abs_h); + equalizer.f_err_ = [equalizer.f_err_ equalizer.f_err]; + if (abs(equalizer.f_err) < 0.1) & (equalizer.sync == 0) + if equalizer.sync_counter > 0 + equalizer.sync_counter = equalizer.sync_counter - 1; + else + equalizer.sync = 1; + equalizer.sync_frame_num = symbol_count; + fprintf('Enter fine tracking mode at frame %d\n', equalizer.sync_frame_num); + + end + end + % check for too small values rms_H = sqrt( abs( H_syms*H_syms' )/length(H_syms) ); equalizer.eps_abs_h = max( rms_H/20, MIN_ABS_H ); %quick and dirty fixed settings @@ -383,14 +393,29 @@ figure; plot(0:length(timingCoarse.cp_off_)-1, timingCoarse.cp_off_, 0:length(timingCoarse.cp_off_)-1, timingCoarse.cp_off*ones(size(timingCoarse.cp_off_)), 'r-'); grid; title('cp_{off}') figure; -subplot(3, 1, 1) +subplot(4, 1, 1) plot(0:length(cfoCoarseFractional.df_)-1, cfoCoarseFractional.df_); grid; title('df_{coarse} (Acquisition)') -subplot(3, 1, 2) -plot(0:length(cfoFine.df_)-1, cfoFine.df_, 0:length(df_track_)-1, df_track_); grid; title('df_{fine} (Acquisition), df_{track}') +subplot(4, 1, 2) +plot(0:length(cfoFine.f_err_.')-1, cfoFine.f_err_.'); grid; title('Error(df_{fine}) (Acquisition)') -subplot(3, 1, 3) -plot(0:length(cfoFine.err_.')-1, cfoFine.err_.'); grid; title('Error(df_{fine}) (Acquisition)') +subplot(4, 1, 3) +plot(0:length(equalizer.f_err_)-1, equalizer.f_err_); grid; title('Error(df_{Eq}) (Track)') +hold on; +x = [equalizer.sync_frame_num equalizer.sync_frame_num]; +a = axis(); +y = [a(3) a(4)]; +plot(x-1,y, 'r-'); +hold off; + +subplot(4, 1, 4) +plot(0:length(df_track_)-1, df_track_); grid; title('df_{track}') +hold on; +x = [equalizer.sync_frame_num equalizer.sync_frame_num]; +a = axis(); +y = [a(3) a(4)]; +plot(x-1,y, 'r-'); +hold off; if 0 xout = [real(x) imag(x)]; diff --git a/ofdm/timing_frame.m b/ofdm/timing_frame.m index 9ba58ae..087146b 100644 --- a/ofdm/timing_frame.m +++ b/ofdm/timing_frame.m @@ -1,6 +1,6 @@ function [kc, valid, Zf] = frame_timing(Z, bins_timing_pilots, sym_per_frame, Zi) -N = length(Z) +N = length(Z); if (~isfield(Zi, 'valid')) Zi = struct('valid', 1, 'Zk', []);