[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));
|
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);
|
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 = 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);
|
buf_Z.write(X);
|
||||||
% CFO Fine acquisition
|
% CFO Fine acquisition
|
||||||
if ~equalizer.sync
|
if ~equalizer.sync
|
||||||
@@ -312,12 +313,11 @@ while((fileRemain > fileChunkSize) | (buf_recv.len() > 2*N)) % ToDo: don't leave
|
|||||||
equalizer.started = 1;
|
equalizer.started = 1;
|
||||||
H_gain_cell = cell (frames_per_window, 1);
|
H_gain_cell = cell (frames_per_window, 1);
|
||||||
H_raw = zeros(length(carriers),1);
|
H_raw = zeros(length(carriers),1);
|
||||||
|
sample_offset_fractional_ = [];
|
||||||
|
sample_offset_integer_ = [];
|
||||||
|
|
||||||
fprintf('Channel estimation and symbol reception\n');
|
fprintf('Channel estimation and symbol reception\n');
|
||||||
[W_syms, W_pilots] = calcWiener(drm_mode, drm_bw);
|
[W_syms, W_pilots] = calcWiener(drm_mode, drm_bw);
|
||||||
sample_offset_fractional_ = [];
|
|
||||||
sample_offset_integer_ = [];
|
|
||||||
sample_offset_ = [];
|
|
||||||
end
|
end
|
||||||
|
|
||||||
Z = transpose(buf_Z.read(N));
|
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, phi_gain, mag_gain] = getRefGain(ofdm_drm_params, ofdm_spec_occ, equalizer.s);
|
||||||
carrier_gain_bins = c2i(N, carrier_gain);
|
carrier_gain_bins = c2i(N, carrier_gain);
|
||||||
|
|
||||||
H_ = Z(carrier_gain_bins)./(mag_gain.*exp(j*2*pi*phi_gain/1024));
|
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) = H_;
|
||||||
H_raw(carrier_gain_bins) = Hc_;%.*Fc;
|
H_gain_cell{equalizer.m+1} = H_;
|
||||||
H_gain_cell{equalizer.m+1} = Hc_;%.*Fc;
|
|
||||||
|
|
||||||
str = sprintf('Symbol %d, s=%d, m=%d, n=%d', equalizer.symbol_count, equalizer.s, equalizer.m, equalizer.n);
|
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
|
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 = ( rem( N + Tgh + 1 - delta_theta + N*1.5, N ) - N/2 )*Tu/N;
|
||||||
% delta_theta = sign(delta_theta);
|
% delta_theta = sign(delta_theta);
|
||||||
|
|
||||||
% delta_theta = max(-1, min(1, delta_theta));
|
[sample_offset_fractional, leadLag_f_z] = leadLag(delta_theta, 0.01, 0.000, leadLag_f_z);
|
||||||
[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-sample_offset_integer, 0.01, 0.00, leadLag_i_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);
|
|
||||||
|
|
||||||
|
sw_f = 0;
|
||||||
sw_i = 1;
|
sw_i = 1;
|
||||||
sw_f = 1;
|
|
||||||
sample_offset_fractional = sw_f *(sample_offset_fractional - sw_i*floor(sample_offset_fractional));
|
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_fractional_ = [sample_offset_fractional_ sample_offset_fractional];
|
||||||
sample_offset_integer = sw_i*floor(sample_offset_integer);
|
sample_offset_integer = sw_i*floor(sample_offset_integer);
|
||||||
sample_offset_integer_ = [sample_offset_integer_ sample_offset_integer];
|
sample_offset_integer_ = [sample_offset_integer_ sample_offset_integer];
|
||||||
|
|
||||||
% equalize symbol
|
% equalize symbol
|
||||||
sym_eq = sym ./ H_syms;
|
sym_eq = sym ./ H_syms;
|
||||||
if strcmp(plot_mode, 'h_pilots')
|
if strcmp(plot_mode, 'h_pilots')
|
||||||
@@ -544,8 +539,8 @@ function [y, zf] = leadLag(x, kI, kP, zi)
|
|||||||
zi = struct('state', 0);
|
zi = struct('state', 0);
|
||||||
end
|
end
|
||||||
|
|
||||||
zi.state = kI*zi.state + x;
|
zi.state = zi.state + x;
|
||||||
y = zi.state + x*kP;
|
y = kI*zi.state + x*kP;
|
||||||
|
|
||||||
zf = zi;
|
zf = zi;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user