[Rx]
- fixed frame time estimation git-svn-id: http://moon:8086/svn/matlab/trunk@64 801c6759-fa7c-4059-a304-17956f83a07c
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
function [d_bin, valid, Zf] = cfo_coarse_int(x, N, carrier_pilot, bins_search, Zi)
|
function [d_bin, valid, Zf] = cfo_coarse_int(x, N, carrier_pilot, bins_search, Zi)
|
||||||
|
|
||||||
if (~isfield(Zi, 'valid'))
|
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
|
end
|
||||||
|
|
||||||
alpha = 0.01;
|
alpha = 0.01;
|
||||||
|
|||||||
+24
-22
@@ -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);
|
cfoFine = struct('Z', 0, 'sync_counter', 200, 'sync', 0, 'err', 0, 'err_', [], 'df', 0, 'df_', [], 'Xlast', [], 'phi', 0, 'bin_track', 1);
|
||||||
|
|
||||||
% Frame timing stuff
|
% 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
|
% Equalization stuff
|
||||||
MIN_ABS_H = 1e-10;
|
MIN_ABS_H = 1e-10;
|
||||||
@@ -109,7 +109,7 @@ while(fileRemain > fileChunkSize)
|
|||||||
if (~isModePassband)
|
if (~isModePassband)
|
||||||
xwav = xwav(:, 1) + j*xwav(:, 2);
|
xwav = xwav(:, 1) + j*xwav(:, 2);
|
||||||
end
|
end
|
||||||
xwav = xwav - mean(xwav);
|
% xwav = xwav - mean(xwav);
|
||||||
|
|
||||||
x = xwav.*exp(-j*(2*pi*omega_xwav*(0:fileChunkSize-1)' + phi_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);
|
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;
|
cfoCoarseInteger.sync_counter = cfoCoarseInteger.sync_counter - 1;
|
||||||
else
|
else
|
||||||
cfoCoarseInteger.sync = 1;
|
cfoCoarseInteger.sync = 1;
|
||||||
|
% Reset buffer to Cp offset
|
||||||
|
buf_recv.setReadIndex(timingCoarse.cp_off);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -182,6 +184,8 @@ while(fileRemain > fileChunkSize)
|
|||||||
cfoCoarseFractional.df = cfoCoarseInteger.df + mean(cfoCoarseFractional.err_);
|
cfoCoarseFractional.df = cfoCoarseInteger.df + mean(cfoCoarseFractional.err_);
|
||||||
cfoCoarseFractional.df_ = cfoCoarseInteger.df + cfoCoarseFractional.err_;
|
cfoCoarseFractional.df_ = cfoCoarseInteger.df + cfoCoarseFractional.err_;
|
||||||
cfoFine.df = cfoCoarseFractional.df;
|
cfoFine.df = cfoCoarseFractional.df;
|
||||||
|
% Reset buffer to Cp offset
|
||||||
|
buf_recv.setReadIndex(timingCoarse.cp_off);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -203,36 +207,34 @@ while(fileRemain > fileChunkSize)
|
|||||||
cfoFine.err_ = [cfoFine.err_ cfoFine.err];
|
cfoFine.err_ = [cfoFine.err_ cfoFine.err];
|
||||||
cfoFine.df = cfoFine.df + 0.1*mean(cfoFine.err(cfoFine.bin_track));
|
cfoFine.df = cfoFine.df + 0.1*mean(cfoFine.err(cfoFine.bin_track));
|
||||||
cfoFine.df_ = [cfoFine.df_ cfoFine.df];
|
cfoFine.df_ = [cfoFine.df_ cfoFine.df];
|
||||||
buf_Z.write(X);
|
|
||||||
end
|
end
|
||||||
|
buf_Z.write(X);
|
||||||
cfoFine.Xlast = X;
|
cfoFine.Xlast = X;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
% Frame timing acquisition
|
||||||
bins = c2i(N, carrier_time);
|
bins = c2i(N, carrier_time);
|
||||||
skip_syms = ofdm_drm_params.nspf*4;
|
skip_syms = ofdm_drm_params.nspf*4;
|
||||||
% Frame timing acquisition
|
if (~frameTiming.sync) && (buf_Z.len() >= (N*(1+ofdm_drm_params.nspf+skip_syms)))
|
||||||
if (~frameTiming.sync) && (buf_Z.len() >= (N*(ofdm_drm_params.nspf+skip_syms)))
|
|
||||||
buf_Z.setReadIndex(N*skip_syms);
|
if (frameTiming.n < ofdm_drm_params.nspf)
|
||||||
for n=0:ofdm_drm_params.nspf-1
|
|
||||||
frameTiming.Z = 0;
|
frameTiming.Z = 0;
|
||||||
k = skip_syms+n;
|
Z1 = buf_Z.readAt(N, N*skip_syms);
|
||||||
Z = buf_Z.read(N);
|
Z2 = buf_Z.readAt(N, N*(ofdm_drm_params.nspf+skip_syms));
|
||||||
if ~isempty(Z)
|
kc = abs(Z1(bins)' * Z2(bins));
|
||||||
for m=1:2
|
if valid
|
||||||
[kc valid frameTiming.Z] = timing_frame(Z(bins)', bins, ofdm_drm_params.nspf, frameTiming.Z);
|
if kc > frameTiming.kc_max
|
||||||
k = k + ofdm_drm_params.nspf;
|
frameTiming.n_max = frameTiming.n;
|
||||||
end
|
frameTiming.kc_max = kc;
|
||||||
if valid
|
|
||||||
if kc > frameTiming.kc_max
|
|
||||||
frameTiming.n_max = n;
|
|
||||||
frameTiming.kc_max = kc;
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
frameTiming.n = frameTiming.n + 1;
|
||||||
if ~isempty(Z)
|
buf_Z.read(N);
|
||||||
buf_Z.setReadIndex(N*(frameTiming.n_max));
|
else
|
||||||
frameTiming.sync = 1;
|
frameTiming.sync = 1;
|
||||||
|
|
||||||
|
% Reset Buffer to frame start
|
||||||
|
buf_Z.setReadIndex(N*(frameTiming.n_max));
|
||||||
frame_start = frameTiming.n_max
|
frame_start = frameTiming.n_max
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+3
-3
@@ -1,6 +1,6 @@
|
|||||||
function [kc, valid, Zf] = frame_timing(Z, bins_timing_pilots, sym_per_frame, Zi)
|
function [kc, valid, Zf] = frame_timing(Z, bins_timing_pilots, sym_per_frame, Zi)
|
||||||
|
|
||||||
N = length(Z);
|
N = length(Z)
|
||||||
|
|
||||||
if (~isfield(Zi, 'valid'))
|
if (~isfield(Zi, 'valid'))
|
||||||
Zi = struct('valid', 1, 'Zk', []);
|
Zi = struct('valid', 1, 'Zk', []);
|
||||||
@@ -11,12 +11,12 @@ if 1
|
|||||||
kc = 0;
|
kc = 0;
|
||||||
if ~isempty(Zi.Zk)
|
if ~isempty(Zi.Zk)
|
||||||
Xk = Z .* conj(Zi.Zk);
|
Xk = Z .* conj(Zi.Zk);
|
||||||
if 0
|
if 1
|
||||||
plot(0:length(Xk)-1, abs(Xk), '-*'); grid;
|
plot(0:length(Xk)-1, abs(Xk), '-*'); grid;
|
||||||
pause (0.01);
|
pause (0.01);
|
||||||
end
|
end
|
||||||
valid = 1;
|
valid = 1;
|
||||||
kc = mean(abs(Xk));
|
kc = mean(abs(Xk))
|
||||||
end
|
end
|
||||||
Zi.Zk = Z;
|
Zi.Zk = Z;
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user