[cfo_coarse_int]

- fixed for small signals
- fixed dimension problem

[Misc]
- cleaned up

git-svn-id: http://moon:8086/svn/matlab/trunk@70 801c6759-fa7c-4059-a304-17956f83a07c
This commit is contained in:
2015-05-03 15:26:05 +00:00
parent 7b52e9d66d
commit 6ddf56bdb4
3 changed files with 38 additions and 38 deletions
-2
View File
@@ -74,5 +74,3 @@ for d=0:window_delay-1
W_pilots{d+1}(:, k1) = transpose( THETA*PHI_inv );
end
end
W_syms
W_pilots
+8 -7
View File
@@ -14,7 +14,7 @@ if 1
bin_min = max(0, min(bin_pilots)-bins_search);
bin_max = min(N-1, max(bin_pilots)+bins_search);
Xk = zeros(N, 1);
Xk = zeros(size(x));
valid = 0;
d_bin = Zi.d_bin;
Zk = fft(x, N);
@@ -25,7 +25,7 @@ if 1
Zi.Xv = max(Zi.Xm, Zi.Xv);
Xt = abs(Zi.Xv(bin_min+1:bin_max+1));
xnoise = noiseFloor(Xt, 4)+noise_eps;
xnoise = noiseFloor(Xt, k_boost/2)+noise_eps;
bins = bin_min+find_bins(Xt, xnoise, k_boost, bins_search);
if (~isempty(bins))
@@ -75,22 +75,23 @@ Zf = Zi;
function bins = find_bins(x, xnoise, kboost, bins_search)
bins = [];
xn = x - xnoise;
for n=1:length(x)
if (x(n) > kboost*xnoise(n))
if (xn(n) > (kboost*xnoise(n)))
smin = max(1, n-bins_search);
smax = min(length(x), n+bins_search);
[v, nn] = max(x(smin:smax));
smax = min(length(xn), n+bins_search);
[v, nn] = max(xn(smin:smax));
winner = nn + smin-2;
if isempty(find(bins == winner))
bins = [bins winner];
end
n = min(length(x), n + bins_search);
n = min(length(xn), n + bins_search);
end
end
bins = bins';
function y = noiseFloor(x, kn)
y = zeros(size(x));
y(1) = x(1);
for n=2:length(x)
if (x(n) < kn*y(n-1))
+30 -29
View File
@@ -7,24 +7,34 @@ function ofdm_rx(filename, foff, flip_spec, SNR, show_H)
close all;
MIN_ABS_H = 1e-10;
drm_mode = 'B';
drm_bw = '10k';
[ofdm_drm_params, ofdm_spec_occ] = drm_params(drm_mode, drm_bw);
fs = 12000;
N = 256;
Ng = 64;
[carrier_pilot, phi_pilot, mag_pilot] = getRefFreq(drm_mode);
[carrier_time, phi_time, mag_time] = getRefTime(drm_mode);
[W_syms, W_pilots] = calcWiener(drm_mode, drm_bw);
filter_h = FIRCalcLowpass(0.25, 15);
N = ofdm_drm_params.nu;
Ng = ofdm_drm_params.ng;
symbols_per_frame = ofdm_drm_params.nspf;
symbols_to_delay = ofdm_drm_params.y;
frames_per_window = 2*ofdm_drm_params.y;
carriers = ofdm_spec_occ.kmin:ofdm_spec_occ.kmax;
carrier_indexes = c2i(N, carriers);
% Read wav file
[fsize fs4] = wavread(filename, 'size')
[fsize fs4] = wavread(filename, 'size');
[xwav, fs4, nbits] = wavread(filename, 0);
wav_numCh = fsize(2);
wav_size = fsize(1);
fs = fix(fs4/4);
isModePassband = 0;
if (wav_numCh == 1)
fprintf('Mode: Passband\n');
@@ -40,13 +50,6 @@ end
buf_recv = buffer();
buf_Z = buffer();
fileChunkSize = N;
fileCunkCounter = 0;
phi_xwav = 0;
filter_h = FIRCalcLowpass(0.25, 15);
filter_z = [];
fileRemain = wav_size;
% Timing coarse stuff
timingCoarse = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, 'cp_off', 0, 'cp_off_', [], 'Nd', 0);
@@ -64,24 +67,8 @@ cfoFine = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, 'f_err', 0
frameTiming = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, 'kc_max', -1000, 'n', 0, 'n_max', 0);
% Equalization stuff
MIN_ABS_H = 1e-10;
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);
H_syms = [];
H_pilots = [];
H_ = [];
df_track = 0;
df_track_ = [];
symbol_count = -1;
symbols_per_frame = ofdm_drm_params.nspf;
symbols_to_delay = ofdm_drm_params.y;
frames_per_window = 2*ofdm_drm_params.y;
H_gain_cell = cell (frames_per_window, 1);
H_raw = zeros(length(ofdm_spec_occ.kmin:ofdm_spec_occ.kmax),1);
carriers = ofdm_spec_occ.kmin:ofdm_spec_occ.kmax;
carrier_indexes = c2i(N, carriers);
fac_cell_list = ...
{
[],
@@ -101,6 +88,16 @@ fac_cell_list = ...
[]
};
filter_z = [];
fileChunkSize = N;
fileCunkCounter = 0;
phi_xwav = 0;
df_track = 0;
df_track_ = [];
symbol_count = -1;
fileRemain = wav_size;
while(fileRemain > fileChunkSize)
n0 = fileCunkCounter*fileChunkSize+1;
@@ -283,7 +280,12 @@ while(fileRemain > fileChunkSize)
if (~equalizer.started)
equalizer.started = 1;
H_gain_cell = cell (frames_per_window, 1);
H_raw = zeros(length(carriers),1);
fprintf('Channel estimation and symbol reception\n');
figure(100);
end
Z = transpose(buf_Z.read(N));
@@ -327,7 +329,6 @@ while(fileRemain > fileChunkSize)
equalizer.sync = 1;
equalizer.sync_frame_num = symbol_count;
fprintf('Enter fine tracking mode at frame %d\n', equalizer.sync_frame_num);
end
end