[RX]
- STO: improved integer estimation git-svn-id: http://moon:8086/svn/matlab/trunk@88 801c6759-fa7c-4059-a304-17956f83a07c
This commit is contained in:
+13
-18
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user