diff --git a/ofdm/ofdm_rx.m b/ofdm/ofdm_rx.m index 79c35de..dd93da7 100644 --- a/ofdm/ofdm_rx.m +++ b/ofdm/ofdm_rx.m @@ -72,6 +72,7 @@ equalizer = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 's', 0, H_syms = []; H_pilots = []; H_ = []; +df_track = 1000; df_track_ = []; symbols_per_frame = ofdm_drm_params.nspf; @@ -109,7 +110,7 @@ while(fileRemain > fileChunkSize) if (~isModePassband) xwav = xwav(:, 1) + j*xwav(:, 2); end -% xwav = xwav - mean(xwav); + xwav = xwav - mean(xwav); x = xwav.*exp(-j*(2*pi*omega_xwav*(0:fileChunkSize-1)' + phi_xwav)); phi_xwav = mod(phi_xwav + 2*pi*omega_xwav*fileChunkSize, 2*pi); @@ -119,7 +120,7 @@ while(fileRemain > fileChunkSize) end % add noise - x = awgn(x, SNR, 'measured'); + x = awgn(x, SNR); if (isModePassband) [x, filter_z] = filter(filter_h, 1, x, filter_z); @@ -157,7 +158,7 @@ while(fileRemain > fileChunkSize) end % Integer CFO coarse - if (timingCoarse.sync) && (~cfoCoarseInteger.sync) + if (timingCoarse.sync) & (~cfoCoarseInteger.sync) if (~cfoCoarseInteger.started) cfoCoarseInteger.started = 1; fprintf('Coarse integer CFO acquisition'); @@ -181,7 +182,7 @@ while(fileRemain > fileChunkSize) end % Fractional CFO coarse - if (cfoCoarseInteger.sync) && (~cfoCoarseFractional.sync) + if (cfoCoarseInteger.sync) & (~cfoCoarseFractional.sync) if (~cfoCoarseFractional.started) cfoCoarseFractional.started = 1; fprintf('Coarse fractional CFO acquisition'); @@ -227,15 +228,19 @@ while(fileRemain > fileChunkSize) Z = cfoFine.Xlast .* conj(X); cfoFine.err = kn*angle(Z(bin_pilot)); cfoFine.err_ = [cfoFine.err_ cfoFine.err]; - - if (abs(cfoFine.df) > 0.001) + + if cfoFine.sync + cfoFine.df = cfoFine.df + 0.1*df_track; + else cfoFine.df = cfoFine.df + 0.1*mean(cfoFine.err(cfoFine.bin_track)); - elseif ~cfoFine.sync + 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\n'); + fprintf('Enter fine tracking mode at frame %d\n', equalizer.kk); end end cfoFine.df_ = [cfoFine.df_ cfoFine.df]; @@ -305,7 +310,7 @@ while(fileRemain > fileChunkSize) H_pilots = (H_gain)*W_pilots{equalizer.n+1}; % Get the correctly delayed symbols - Z = buf_Z.readAt(N, -N*symbols_to_delay); + Z = buf_Z.readAt(N, -N*(symbols_to_delay+1)); sym = Z(carrier_indexes).'; % Get the correctly delayed raw channel estimate @@ -314,7 +319,6 @@ 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 @@ -383,7 +387,7 @@ subplot(3, 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_); grid; title('df_{fine} (Acquisition)') +plot(0:length(cfoFine.df_)-1, cfoFine.df_, 0:length(df_track_)-1, df_track_); grid; title('df_{fine} (Acquisition), df_{track}') subplot(3, 1, 3) plot(0:length(cfoFine.err_.')-1, cfoFine.err_.'); grid; title('Error(df_{fine}) (Acquisition)') @@ -403,8 +407,5 @@ wavwrite(y,fs4,nbits,'rx_y.wav'); end -figure; -plot(df_track_); grid; title('df_{track}'); - function Y = spec_order(N, X) Y = [X(N/2+1:N)' X(1:N/2)']';