From 355b3cdde1c920cd306b26fabff88f094bd657e2 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sun, 10 May 2015 07:24:34 +0000 Subject: [PATCH] [RX] - STO: improved integer estimation git-svn-id: http://moon:8086/svn/matlab/trunk@88 801c6759-fa7c-4059-a304-17956f83a07c --- ofdm/ofdm_rx.m | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/ofdm/ofdm_rx.m b/ofdm/ofdm_rx.m index c363c27..3485fcc 100644 --- a/ofdm/ofdm_rx.m +++ b/ofdm/ofdm_rx.m @@ -259,8 +259,9 @@ while((fileRemain > fileChunkSize) | (buf_recv.len() > 2*N)) % ToDo: don't leave x = x.*exp(j*(2*pi*df_track/fs*(0:N+Ng-1)' + phi_track)); phi_track = mod(phi_track + 2*pi*df_track/fs*(N+Ng), 2*pi); - Fc = exp(j*2*pi*(0:N-1)/(N)*sample_offset_fractional); + Fc = exp(j*(2*pi*(0:N-1)/(N)*(sample_offset_fractional))); X = fft(x(Ng+1:N+Ng)) .* [Fc(N/2:-1:1) Fc(N:-1:N/2+1)].'; + X = X .* exp(j*2*pi*(0:N-1)/(N)*(sample_offset_integer)).'; buf_Z.write(X); % CFO Fine acquisition if ~equalizer.sync @@ -312,12 +313,11 @@ while((fileRemain > fileChunkSize) | (buf_recv.len() > 2*N)) % ToDo: don't leave equalizer.started = 1; H_gain_cell = cell (frames_per_window, 1); H_raw = zeros(length(carriers),1); + sample_offset_fractional_ = []; + sample_offset_integer_ = []; fprintf('Channel estimation and symbol reception\n'); [W_syms, W_pilots] = calcWiener(drm_mode, drm_bw); - sample_offset_fractional_ = []; - sample_offset_integer_ = []; - sample_offset_ = []; end Z = transpose(buf_Z.read(N)); @@ -326,11 +326,10 @@ while((fileRemain > fileChunkSize) | (buf_recv.len() > 2*N)) % ToDo: don't leave [carrier_gain, phi_gain, mag_gain] = getRefGain(ofdm_drm_params, ofdm_spec_occ, equalizer.s); carrier_gain_bins = c2i(N, carrier_gain); + H_ = Z(carrier_gain_bins)./(mag_gain.*exp(j*2*pi*phi_gain/1024)); - Hc_ = (H_) .* exp(j*2*pi*carrier_gain_bins/(N)*(sample_offset_integer)); - H_raw(carrier_gain_bins) = Hc_;%.*Fc; - H_gain_cell{equalizer.m+1} = Hc_;%.*Fc; - + H_raw(carrier_gain_bins) = H_; + H_gain_cell{equalizer.m+1} = H_; str = sprintf('Symbol %d, s=%d, m=%d, n=%d', equalizer.symbol_count, equalizer.s, equalizer.m, equalizer.n); if equalizer.symbol_count >= frames_per_window @@ -392,20 +391,16 @@ while((fileRemain > fileChunkSize) | (buf_recv.len() > 2*N)) % ToDo: don't leave delta_theta = ( rem( N + Tgh + 1 - delta_theta + N*1.5, N ) - N/2 )*Tu/N; % delta_theta = sign(delta_theta); -% delta_theta = max(-1, min(1, delta_theta)); - [sample_offset_fractional, leadLag_f_z] = leadLag(delta_theta, 0.004, 0.000, leadLag_f_z); - [sample_offset_integer, leadLag_i_z] = leadLag(delta_theta, 0.01, 0.000, leadLag_i_z); - %delta_theta = max(min(delta_theta,max_delta_theta),-max_delta_theta)+0; - %sample_offset = sample_offset - 0.1*delta_theta; -% sample_offset_integer = floor(sample_offset); + [sample_offset_fractional, leadLag_f_z] = leadLag(delta_theta, 0.01, 0.000, leadLag_f_z); + [sample_offset_integer, leadLag_i_z] = leadLag(delta_theta-sample_offset_integer, 0.01, 0.00, leadLag_i_z); + sw_f = 0; sw_i = 1; - sw_f = 1; sample_offset_fractional = sw_f *(sample_offset_fractional - sw_i*floor(sample_offset_fractional)); sample_offset_fractional_ = [sample_offset_fractional_ sample_offset_fractional]; sample_offset_integer = sw_i*floor(sample_offset_integer); sample_offset_integer_ = [sample_offset_integer_ sample_offset_integer]; - + % equalize symbol sym_eq = sym ./ H_syms; if strcmp(plot_mode, 'h_pilots') @@ -544,8 +539,8 @@ function [y, zf] = leadLag(x, kI, kP, zi) zi = struct('state', 0); end - zi.state = kI*zi.state + x; - y = zi.state + x*kP; + zi.state = zi.state + x; + y = kI*zi.state + x*kP; zf = zi;