- refactored CFO fine and symbol generation
git-svn-id: http://moon:8086/svn/matlab/trunk@69 801c6759-fa7c-4059-a304-17956f83a07c
This commit is contained in:
+74
-49
@@ -49,32 +49,32 @@ filter_z = [];
|
|||||||
fileRemain = wav_size;
|
fileRemain = wav_size;
|
||||||
|
|
||||||
% Timing coarse stuff
|
% Timing coarse stuff
|
||||||
timingCoarse = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 'cp_off', 0, 'cp_off_', [], 'Nd', 0);
|
timingCoarse = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, 'cp_off', 0, 'cp_off_', [], 'Nd', 0);
|
||||||
|
|
||||||
% CFO coarse integer stuff
|
% CFO coarse integer stuff
|
||||||
cfoCoarseInteger = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 'err', 0);
|
cfoCoarseInteger = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, 'f_err', 0);
|
||||||
|
|
||||||
% CFO coarse fractional stuff
|
% CFO coarse fractional stuff
|
||||||
cfoCoarseFractional = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 'err', 0, 'err_', [], 'df', 0, 'df_', []);
|
cfoCoarseFractional = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, 'f_err', 0, 'f_err_', [], 'df', 0, 'df_', []);
|
||||||
|
|
||||||
% CFO Fine stuff
|
% CFO Fine stuff
|
||||||
cfoFine = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 'err', 0, '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', [], 'phi', 0, 'bin_track', 1);
|
||||||
|
|
||||||
% Frame timing stuff
|
% Frame timing stuff
|
||||||
frameTiming = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 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, 'n_max', 0);
|
||||||
|
|
||||||
% Equalization stuff
|
% Equalization stuff
|
||||||
MIN_ABS_H = 1e-10;
|
MIN_ABS_H = 1e-10;
|
||||||
equalizer = struct('Z', 0, 'sync_counter', 20, 'sync', 0, 'started', 0, 's', 0, 'm', 0, 'kk', 1, 'eps_abs_h', MIN_ABS_H);
|
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);
|
||||||
|
|
||||||
[W_syms, W_pilots] = calcWiener(drm_mode, drm_bw);
|
[W_syms, W_pilots] = calcWiener(drm_mode, drm_bw);
|
||||||
|
|
||||||
H_syms = [];
|
H_syms = [];
|
||||||
H_pilots = [];
|
H_pilots = [];
|
||||||
H_ = [];
|
H_ = [];
|
||||||
df_track = 1000;
|
df_track = 0;
|
||||||
df_track_ = [];
|
df_track_ = [];
|
||||||
|
symbol_count = -1;
|
||||||
symbols_per_frame = ofdm_drm_params.nspf;
|
symbols_per_frame = ofdm_drm_params.nspf;
|
||||||
symbols_to_delay = ofdm_drm_params.y;
|
symbols_to_delay = ofdm_drm_params.y;
|
||||||
frames_per_window = 2*ofdm_drm_params.y;
|
frames_per_window = 2*ofdm_drm_params.y;
|
||||||
@@ -168,14 +168,14 @@ while(fileRemain > fileChunkSize)
|
|||||||
if (~isempty(x))
|
if (~isempty(x))
|
||||||
[d_bin, valid, cfoCoarseInteger.Z] = cfo_coarse_int(x(Ng+1:N+Ng), N, carrier_pilot, 11, cfoCoarseInteger.Z);
|
[d_bin, valid, cfoCoarseInteger.Z] = cfo_coarse_int(x(Ng+1:N+Ng), N, carrier_pilot, 11, cfoCoarseInteger.Z);
|
||||||
if valid
|
if valid
|
||||||
cfoCoarseInteger.err = -d_bin(1)/N*fs;
|
cfoCoarseInteger.f_err = -d_bin(1)/N*fs;
|
||||||
if (cfoCoarseInteger.sync_counter > 0)
|
if (cfoCoarseInteger.sync_counter > 0)
|
||||||
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
|
% Reset buffer to Cp offset
|
||||||
buf_recv.setReadIndex(timingCoarse.cp_off);
|
buf_recv.setReadIndex(timingCoarse.cp_off);
|
||||||
fprintf(' (err_fi=%f)\n', cfoCoarseInteger.err);
|
fprintf(' (f_err_i=%f)\n', cfoCoarseInteger.f_err);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -189,30 +189,31 @@ while(fileRemain > fileChunkSize)
|
|||||||
end
|
end
|
||||||
x = buf_recv.read(N+Ng);
|
x = buf_recv.read(N+Ng);
|
||||||
if (~isempty(x))
|
if (~isempty(x))
|
||||||
[err, cfoCoarseFractional.Z] = cfo_coarse_fract(x, N, Ng, Ng, timingCoarse.Nd, cfoCoarseFractional.Z);
|
[f_err, cfoCoarseFractional.Z] = cfo_coarse_fract(x, N, Ng, Ng, timingCoarse.Nd, cfoCoarseFractional.Z);
|
||||||
cfoCoarseFractional.err_ = [cfoCoarseFractional.err_ err*fs];
|
cfoCoarseFractional.f_err_ = [cfoCoarseFractional.f_err_ f_err*fs];
|
||||||
|
|
||||||
if (cfoCoarseFractional.sync_counter > 0)
|
if (cfoCoarseFractional.sync_counter > 0)
|
||||||
cfoCoarseFractional.sync_counter = cfoCoarseFractional.sync_counter - 1;
|
cfoCoarseFractional.sync_counter = cfoCoarseFractional.sync_counter - 1;
|
||||||
else
|
else
|
||||||
cfoCoarseFractional.sync = 1;
|
cfoCoarseFractional.sync = 1;
|
||||||
cfoCoarseFractional.err = mean(cfoCoarseFractional.err_);
|
cfoCoarseFractional.f_err = mean(cfoCoarseFractional.f_err_);
|
||||||
cfoCoarseFractional.df = cfoCoarseInteger.err + cfoCoarseFractional.err;
|
cfoCoarseFractional.df = cfoCoarseInteger.f_err + cfoCoarseFractional.f_err;
|
||||||
cfoCoarseFractional.df_ = cfoCoarseInteger.err + cfoCoarseFractional.err_;
|
cfoCoarseFractional.df_ = cfoCoarseInteger.f_err + cfoCoarseFractional.f_err_;
|
||||||
|
|
||||||
% Reset buffer to Cp offset
|
% Reset buffer to Cp offset
|
||||||
buf_recv.setReadIndex(timingCoarse.cp_off);
|
buf_recv.setReadIndex(timingCoarse.cp_off);
|
||||||
fprintf(' (err_ff=%f, df_est=%f)\n', cfoCoarseFractional.err, cfoCoarseFractional.df);
|
fprintf(' (f_err_f=%f, df_est=%f)\n', cfoCoarseFractional.f_err, cfoCoarseFractional.df);
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
% CFO Fine
|
% Create symbols
|
||||||
if (cfoCoarseFractional.sync)
|
if (cfoCoarseFractional.sync)
|
||||||
if (~cfoFine.started)
|
if (~cfoFine.started)
|
||||||
cfoFine.started = 1;
|
cfoFine.started = 1;
|
||||||
cfoFine.df = cfoCoarseFractional.df;
|
df_track = cfoCoarseFractional.df;
|
||||||
|
fprintf('Creating Symbols\n');
|
||||||
fprintf('Fine fractional CFO acquisition\n');
|
fprintf('Fine fractional CFO acquisition\n');
|
||||||
end
|
end
|
||||||
kn = fs/(2*pi*(1+Ng/N))/N;
|
kn = fs/(2*pi*(1+Ng/N))/N;
|
||||||
@@ -221,32 +222,30 @@ while(fileRemain > fileChunkSize)
|
|||||||
|
|
||||||
x = buf_recv.read(N+Ng);
|
x = buf_recv.read(N+Ng);
|
||||||
if (~isempty(x))
|
if (~isempty(x))
|
||||||
x = x.*exp(j*(2*pi*cfoFine.df/fs*(0:N+Ng-1)' + cfoFine.phi));
|
|
||||||
cfoFine.phi = cfoFine.phi + 2*pi*cfoFine.df/fs*(N+Ng);
|
|
||||||
X = fft(x(Ng+1:N+Ng));
|
|
||||||
if (~isempty(cfoFine.Xlast))
|
|
||||||
Z = cfoFine.Xlast .* conj(X);
|
|
||||||
cfoFine.err = kn*angle(Z(bin_pilot));
|
|
||||||
cfoFine.err_ = [cfoFine.err_ cfoFine.err];
|
|
||||||
|
|
||||||
if cfoFine.sync
|
if equalizer.sync
|
||||||
cfoFine.df = cfoFine.df + 0.1*df_track;
|
df_track = df_track + 0.1*equalizer.f_err;
|
||||||
else
|
else
|
||||||
cfoFine.df = cfoFine.df + 0.1*mean(cfoFine.err(cfoFine.bin_track));
|
df_track = df_track + 0.1*cfoFine.f_err;
|
||||||
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 at frame %d\n', equalizer.kk);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
cfoFine.df_ = [cfoFine.df_ cfoFine.df];
|
|
||||||
end
|
end
|
||||||
|
df_track_ = [df_track_ df_track];
|
||||||
|
|
||||||
|
x = x.*exp(j*(2*pi*df_track/fs*(0:N+Ng-1)' + cfoFine.phi));
|
||||||
|
cfoFine.phi = cfoFine.phi + 2*pi*df_track/fs*(N+Ng);
|
||||||
|
X = fft(x(Ng+1:N+Ng));
|
||||||
buf_Z.write(X);
|
buf_Z.write(X);
|
||||||
cfoFine.Xlast = X;
|
symbol_count = symbol_count + 1;
|
||||||
|
|
||||||
|
% CFO Fine acquisition
|
||||||
|
if ~equalizer.sync
|
||||||
|
if (~isempty(cfoFine.Xlast))
|
||||||
|
Z = cfoFine.Xlast .* conj(X);
|
||||||
|
f_err = kn*angle(Z(bin_pilot));
|
||||||
|
cfoFine.f_err = mean(f_err(cfoFine.bin_track));
|
||||||
|
cfoFine.f_err_ = [cfoFine.f_err_ cfoFine.f_err];
|
||||||
|
end
|
||||||
|
cfoFine.Xlast = X;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
% Frame timing acquisition
|
% Frame timing acquisition
|
||||||
@@ -299,7 +298,7 @@ while(fileRemain > fileChunkSize)
|
|||||||
H_raw(carrier_gain_bins) = (H_);
|
H_raw(carrier_gain_bins) = (H_);
|
||||||
H_gain_cell{equalizer.m+1} = (H_);
|
H_gain_cell{equalizer.m+1} = (H_);
|
||||||
|
|
||||||
str = sprintf('Frame %d, s=%d, m=%d, n=%d', equalizer.kk, equalizer.s, equalizer.m, equalizer.n);
|
str = sprintf('Symbol %d, s=%d, m=%d, n=%d', symbol_count, equalizer.s, equalizer.m, equalizer.n);
|
||||||
|
|
||||||
if equalizer.kk > frames_per_window
|
if equalizer.kk > frames_per_window
|
||||||
|
|
||||||
@@ -318,8 +317,19 @@ while(fileRemain > fileChunkSize)
|
|||||||
|
|
||||||
% get frequency error
|
% get frequency error
|
||||||
% correlate wiener filtered channel with raw estimate
|
% correlate wiener filtered channel with raw estimate
|
||||||
df_track = fs/(2*pi*N)*angle(H_pilots * Hr' + equalizer.eps_abs_h);
|
equalizer.f_err = fs/(2*pi*N)*angle(H_pilots * Hr' + equalizer.eps_abs_h);
|
||||||
df_track_ = [df_track_ df_track];
|
equalizer.f_err_ = [equalizer.f_err_ equalizer.f_err];
|
||||||
|
|
||||||
|
if (abs(equalizer.f_err) < 0.1) & (equalizer.sync == 0)
|
||||||
|
if equalizer.sync_counter > 0
|
||||||
|
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);
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
% check for too small values
|
% check for too small values
|
||||||
rms_H = sqrt( abs( H_syms*H_syms' )/length(H_syms) );
|
rms_H = sqrt( abs( H_syms*H_syms' )/length(H_syms) );
|
||||||
@@ -383,14 +393,29 @@ figure;
|
|||||||
plot(0:length(timingCoarse.cp_off_)-1, timingCoarse.cp_off_, 0:length(timingCoarse.cp_off_)-1, timingCoarse.cp_off*ones(size(timingCoarse.cp_off_)), 'r-'); grid; title('cp_{off}')
|
plot(0:length(timingCoarse.cp_off_)-1, timingCoarse.cp_off_, 0:length(timingCoarse.cp_off_)-1, timingCoarse.cp_off*ones(size(timingCoarse.cp_off_)), 'r-'); grid; title('cp_{off}')
|
||||||
|
|
||||||
figure;
|
figure;
|
||||||
subplot(3, 1, 1)
|
subplot(4, 1, 1)
|
||||||
plot(0:length(cfoCoarseFractional.df_)-1, cfoCoarseFractional.df_); grid; title('df_{coarse} (Acquisition)')
|
plot(0:length(cfoCoarseFractional.df_)-1, cfoCoarseFractional.df_); grid; title('df_{coarse} (Acquisition)')
|
||||||
|
|
||||||
subplot(3, 1, 2)
|
subplot(4, 1, 2)
|
||||||
plot(0:length(cfoFine.df_)-1, cfoFine.df_, 0:length(df_track_)-1, df_track_); grid; title('df_{fine} (Acquisition), df_{track}')
|
plot(0:length(cfoFine.f_err_.')-1, cfoFine.f_err_.'); grid; title('Error(df_{fine}) (Acquisition)')
|
||||||
|
|
||||||
subplot(3, 1, 3)
|
subplot(4, 1, 3)
|
||||||
plot(0:length(cfoFine.err_.')-1, cfoFine.err_.'); grid; title('Error(df_{fine}) (Acquisition)')
|
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;
|
||||||
|
|
||||||
if 0
|
if 0
|
||||||
xout = [real(x) imag(x)];
|
xout = [real(x) imag(x)];
|
||||||
|
|||||||
+1
-1
@@ -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', []);
|
||||||
|
|||||||
Reference in New Issue
Block a user