- fixed CFO tracking

git-svn-id: http://moon:8086/svn/matlab/trunk@68 801c6759-fa7c-4059-a304-17956f83a07c
This commit is contained in:
2015-05-03 13:57:39 +00:00
parent 8ec44f5543
commit b630a4d4b4
+15 -14
View File
@@ -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)']';