diff --git a/ofdm/cfo_coarse_int.m b/ofdm/cfo_coarse_int.m index 5d68f96..98086ac 100644 --- a/ofdm/cfo_coarse_int.m +++ b/ofdm/cfo_coarse_int.m @@ -1,7 +1,7 @@ function [d_bin, valid, Zf] = cfo_coarse_int(x, N, carrier_pilot, bins_search, Zi) if (~isfield(Zi, 'valid')) - Zi = struct('valid', 1, 'Xm', zeros(N, 1), 'Xv', zeros(N, 1), 'Zk', [], 'd_bin', []); + Zi = struct('valid', 1, 'Xm', zeros(size(x)), 'Xv', zeros(size(x)), 'Zk', [], 'd_bin', []); end alpha = 0.01; diff --git a/ofdm/ofdm_rx.m b/ofdm/ofdm_rx.m index 6a5b65e..390717d 100644 --- a/ofdm/ofdm_rx.m +++ b/ofdm/ofdm_rx.m @@ -61,7 +61,7 @@ cfoCoarseFractional = struct('Z', 0, 'sync_counter', 200, 'sync', 0, 'err', 0, ' cfoFine = struct('Z', 0, 'sync_counter', 200, 'sync', 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_max', 0); +frameTiming = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'kc_max', -1000, 'n', 0, 'n_max', 0); % Equalization stuff MIN_ABS_H = 1e-10; @@ -109,7 +109,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); @@ -163,6 +163,8 @@ while(fileRemain > fileChunkSize) cfoCoarseInteger.sync_counter = cfoCoarseInteger.sync_counter - 1; else cfoCoarseInteger.sync = 1; + % Reset buffer to Cp offset + buf_recv.setReadIndex(timingCoarse.cp_off); end end end @@ -182,6 +184,8 @@ while(fileRemain > fileChunkSize) cfoCoarseFractional.df = cfoCoarseInteger.df + mean(cfoCoarseFractional.err_); cfoCoarseFractional.df_ = cfoCoarseInteger.df + cfoCoarseFractional.err_; cfoFine.df = cfoCoarseFractional.df; + % Reset buffer to Cp offset + buf_recv.setReadIndex(timingCoarse.cp_off); end end end @@ -203,36 +207,34 @@ while(fileRemain > fileChunkSize) cfoFine.err_ = [cfoFine.err_ cfoFine.err]; cfoFine.df = cfoFine.df + 0.1*mean(cfoFine.err(cfoFine.bin_track)); cfoFine.df_ = [cfoFine.df_ cfoFine.df]; - buf_Z.write(X); end + buf_Z.write(X); cfoFine.Xlast = X; end + % Frame timing acquisition bins = c2i(N, carrier_time); skip_syms = ofdm_drm_params.nspf*4; - % Frame timing acquisition - if (~frameTiming.sync) && (buf_Z.len() >= (N*(ofdm_drm_params.nspf+skip_syms))) - buf_Z.setReadIndex(N*skip_syms); - for n=0:ofdm_drm_params.nspf-1 + if (~frameTiming.sync) && (buf_Z.len() >= (N*(1+ofdm_drm_params.nspf+skip_syms))) + + if (frameTiming.n < ofdm_drm_params.nspf) frameTiming.Z = 0; - k = skip_syms+n; - Z = buf_Z.read(N); - if ~isempty(Z) - for m=1:2 - [kc valid frameTiming.Z] = timing_frame(Z(bins)', bins, ofdm_drm_params.nspf, frameTiming.Z); - k = k + ofdm_drm_params.nspf; - end - if valid - if kc > frameTiming.kc_max - frameTiming.n_max = n; - frameTiming.kc_max = kc; - end + Z1 = buf_Z.readAt(N, N*skip_syms); + Z2 = buf_Z.readAt(N, N*(ofdm_drm_params.nspf+skip_syms)); + kc = abs(Z1(bins)' * Z2(bins)); + if valid + if kc > frameTiming.kc_max + frameTiming.n_max = frameTiming.n; + frameTiming.kc_max = kc; end end - end - if ~isempty(Z) - buf_Z.setReadIndex(N*(frameTiming.n_max)); + frameTiming.n = frameTiming.n + 1; + buf_Z.read(N); + else frameTiming.sync = 1; + + % Reset Buffer to frame start + buf_Z.setReadIndex(N*(frameTiming.n_max)); frame_start = frameTiming.n_max end end diff --git a/ofdm/timing_frame.m b/ofdm/timing_frame.m index 09fdb4c..89c2380 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', []); @@ -11,12 +11,12 @@ if 1 kc = 0; if ~isempty(Zi.Zk) Xk = Z .* conj(Zi.Zk); - if 0 + if 1 plot(0:length(Xk)-1, abs(Xk), '-*'); grid; pause (0.01); end valid = 1; - kc = mean(abs(Xk)); + kc = mean(abs(Xk)) end Zi.Zk = Z; end