From 2b7abc99027945ff9ab88b07d381117eafac85fd Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Tue, 5 May 2015 05:07:32 +0000 Subject: [PATCH] [RX] - fixed chunksize dependent performance - removed plot time marker git-svn-id: http://moon:8086/svn/matlab/trunk@81 801c6759-fa7c-4059-a304-17956f83a07c --- ofdm/ofdm_rx.m | 49 ++++++++++++++++++------------------------------- 1 file changed, 18 insertions(+), 31 deletions(-) diff --git a/ofdm/ofdm_rx.m b/ofdm/ofdm_rx.m index e6d90ba..5703c7a 100644 --- a/ofdm/ofdm_rx.m +++ b/ofdm/ofdm_rx.m @@ -90,22 +90,22 @@ cfoCoarseInteger = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, ' 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, 'started', 0, 'sync_counter', 20, 'sync', 0, 'f_err', 0, 'f_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', [], 'bin_track', 1); % Frame timing stuff -frameTiming = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 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, 'symbol_start', 0, 'sample_start', 0); % Equalization stuff -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); +equalizer = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, 'sync_symbol_num', 0, 'f_err', 1000, 'f_err_', [], 's', 0, 'm', 0, 'symbol_count', 1, 'eps_abs_h', MIN_ABS_H); -fileChunkSize = N; +fileChunkSize = 16*N; fileCunkCounter = 0; phi_mix = 0; phi_foff = 0; +phi_track = 0; df_track = 0; df_track_ = []; max_H_plot = 0; -symbol_count = -1; fileRemain = wav_size; @@ -115,7 +115,7 @@ buf_Z = buffer(); % -------------------------------------------------------------- % Main loop % -------------------------------------------------------------- -while((fileRemain > fileChunkSize) | (buf_Z.len() > N)) % ToDo: don't leave loop, if file has been consumed. There may be samples left in buf_recv to process +while((fileRemain > fileChunkSize) | (buf_recv.len() > N)) % ToDo: don't leave loop, until file has been consumed. if (fileRemain > fileChunkSize) n0 = fileCunkCounter*fileChunkSize+1; @@ -251,12 +251,10 @@ while((fileRemain > fileChunkSize) | (buf_Z.len() > N)) % ToDo: don't leave loop end df_track_ = [df_track_ df_track]; - x = x.*exp(j*(2*pi*df_track/fs*(0:N+Ng-1)' + cfoFine.phi)); - cfoFine.phi = mod(cfoFine.phi + 2*pi*df_track/fs*(N+Ng), 2*pi); + x = x.*exp(j*(2*pi*df_track/fs*(0:N+Ng-1)' + phi_track)); + phi_track = mod(phi_track + 2*pi*df_track/fs*(N+Ng), 2*pi); X = fft(x(Ng+1:N+Ng)); buf_Z.write(X); - symbol_count = symbol_count + 1; - % CFO Fine acquisition if ~equalizer.sync if (~isempty(cfoFine.Xlast)) @@ -285,7 +283,7 @@ while((fileRemain > fileChunkSize) | (buf_Z.len() > N)) % ToDo: don't leave loop kc = abs(Z1(bins)' * Z2(bins)); if valid if kc > frameTiming.kc_max - frameTiming.n_max = frameTiming.n; + frameTiming.symbol_start = frameTiming.n; frameTiming.kc_max = kc; end end @@ -293,10 +291,11 @@ while((fileRemain > fileChunkSize) | (buf_Z.len() > N)) % ToDo: don't leave loop buf_Z.read(N); else frameTiming.sync = 1; - + frameTiming.sample_start = timingCoarse.cp_off + (N+Ng)*frameTiming.symbol_start; % Reset Buffer to frame start - buf_Z.setReadIndex(N*(frameTiming.n_max)); - fprintf(' (frame_start=%d)\n', frameTiming.n_max); + buf_Z = buffer(); + buf_recv.setReadIndex(frameTiming.sample_start); + fprintf(' (symbol_start=%d, sample_start=%d)\n', frameTiming.symbol_start, frameTiming.sample_start); end end @@ -313,7 +312,6 @@ while((fileRemain > fileChunkSize) | (buf_Z.len() > N)) % ToDo: don't leave loop Z = transpose(buf_Z.read(N)); if ~isempty(Z) - equalizer.n = rem(equalizer.m + symbols_to_delay-1, ofdm_drm_params.y); [carrier_gain, phi_gain, mag_gain] = getRefGain(ofdm_drm_params, ofdm_spec_occ, equalizer.s); @@ -323,9 +321,9 @@ while((fileRemain > fileChunkSize) | (buf_Z.len() > N)) % ToDo: don't leave loop H_raw(carrier_gain_bins) = (H_); H_gain_cell{equalizer.m+1} = (H_); - str = sprintf('Symbol %d, s=%d, m=%d, n=%d', symbol_count, equalizer.s, equalizer.m, equalizer.n); + str = sprintf('Symbol %d, s=%d, m=%d, n=%d', equalizer.symbol_count, equalizer.s, equalizer.m, equalizer.n); - if equalizer.kk > frames_per_window + if equalizer.symbol_count >= frames_per_window ii = 1+mod(equalizer.m+symbols_to_delay-1+(0:frames_per_window-1), frames_per_window); @@ -351,8 +349,8 @@ while((fileRemain > fileChunkSize) | (buf_Z.len() > N)) % ToDo: don't leave loop 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); + equalizer.sync_symbol_num = equalizer.symbol_count; + fprintf('Enter fine tracking mode at symbol %d\n', equalizer.sync_symbol_num); end end @@ -403,7 +401,7 @@ while((fileRemain > fileChunkSize) | (buf_Z.len() > N)) % ToDo: don't leave loop end end end - equalizer.kk = equalizer.kk + 1; + equalizer.symbol_count = equalizer.symbol_count + 1; equalizer.m = mod(equalizer.m + 1, frames_per_window); equalizer.s = mod(equalizer.s + 1, symbols_per_frame); end @@ -428,21 +426,10 @@ plot(0:length(cfoFine.f_err_.')-1, cfoFine.f_err_.'); grid; title('Error(df_{fin 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; % -------------------------------------------------------------- % Write wave files