Files
matlab/ofdm/cfo_coarse_int.m
T
jens 8ec44f5543 - reduced noise_eps
git-svn-id: http://moon:8086/svn/matlab/trunk@67 801c6759-fa7c-4059-a304-17956f83a07c
2015-05-03 13:57:12 +00:00

103 lines
2.7 KiB
Matlab

function [d_bin, valid, Zf] = cfo_coarse_int(x, N, carrier_pilot, bins_search, Zi)
if (~isfield(Zi, 'valid'))
Zi = struct('valid', 1, 'Xm', zeros(size(x)), 'Xv', zeros(size(x)), 'Zk', [], 'd_bin', []);
end
alpha = 0.01;
rho = 0.999;
k_boost = 4;
noise_eps = 1e-3;
if 1
bin_pilots = c2i(N, carrier_pilot)-1;
bin_min = max(0, min(bin_pilots)-bins_search);
bin_max = min(N-1, max(bin_pilots)+bins_search);
Xk = zeros(N, 1);
valid = 0;
d_bin = Zi.d_bin;
Zk = fft(x, N);
if ~isempty(Zi.Zk)
Xk = Zk .* conj(Zi.Zk);
Zi.Xm = (1-alpha)*Zi.Xm + alpha*Xk;
Zi.Xv = Zi.Xv*rho;
Zi.Xv = max(Zi.Xm, Zi.Xv);
Xt = abs(Zi.Xv(bin_min+1:bin_max+1));
xnoise = noiseFloor(Xt, 4)+noise_eps;
bins = bin_min+find_bins(Xt, xnoise, k_boost, bins_search);
if (~isempty(bins))
k = 1;
for b=1:length(bins)
bin_c = bins(b);
for n=1:length(bin_pilots)
bin_p = bin_pilots(n);
if (abs(bin_c - bin_p) < bins_search)
d_bin = [d_bin (bin_c - bin_p)];
end
end
end
h = zeros(length(bin_pilots), 1);
if length(d_bin) == length(bin_pilots)
valid = 1;
for k=1:length(d_bin)
for b=1:length(d_bin)
if d_bin(b) == d_bin(k)
h(k) = h(k) + 1;
end
end
end
end
end
if 1
plot(bin_min+(0:length(Xt)-1), abs(Xt), '-*', bin_min+(0:length(Xt)-1), xnoise, 'g-'); grid;
a = axis;
hold on;
if ~isempty(bins)
for b=1:length(bins)
x = [bins(b) bins(b)];
y = [a(3) a(4)];
plot(x,y, 'r-');
end
end
hold off;
pause (0.01);
end
end
Zi.Zk = Zk;
end
Zf = Zi;
function bins = find_bins(x, xnoise, kboost, bins_search)
bins = [];
for n=1:length(x)
if (x(n) > kboost*xnoise(n))
smin = max(1, n-bins_search);
smax = min(length(x), n+bins_search);
[v, nn] = max(x(smin:smax));
winner = nn + smin-2;
if isempty(find(bins == winner))
bins = [bins winner];
end
n = min(length(x), n + bins_search);
end
end
bins = bins';
function y = noiseFloor(x, kn)
y(1) = x(1);
for n=2:length(x)
if (x(n) < kn*y(n-1))
y(n) = 0.5*y(n-1) + 0.5*x(n);
else
y(n) = y(n-1);
end
end