[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 ); W_pilots{d+1}(:, k1) = transpose( THETA*PHI_inv );
end end
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_min = max(0, min(bin_pilots)-bins_search);
bin_max = min(N-1, max(bin_pilots)+bins_search); bin_max = min(N-1, max(bin_pilots)+bins_search);
Xk = zeros(N, 1); Xk = zeros(size(x));
valid = 0; valid = 0;
d_bin = Zi.d_bin; d_bin = Zi.d_bin;
Zk = fft(x, N); Zk = fft(x, N);
@@ -25,7 +25,7 @@ if 1
Zi.Xv = max(Zi.Xm, Zi.Xv); Zi.Xv = max(Zi.Xm, Zi.Xv);
Xt = abs(Zi.Xv(bin_min+1:bin_max+1)); 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); bins = bin_min+find_bins(Xt, xnoise, k_boost, bins_search);
if (~isempty(bins)) if (~isempty(bins))
@@ -75,22 +75,23 @@ Zf = Zi;
function bins = find_bins(x, xnoise, kboost, bins_search) function bins = find_bins(x, xnoise, kboost, bins_search)
bins = []; bins = [];
xn = x - xnoise;
for n=1:length(x) for n=1:length(x)
if (x(n) > kboost*xnoise(n)) if (xn(n) > (kboost*xnoise(n)))
smin = max(1, n-bins_search); smin = max(1, n-bins_search);
smax = min(length(x), n+bins_search); smax = min(length(xn), n+bins_search);
[v, nn] = max(x(smin:smax)); [v, nn] = max(xn(smin:smax));
winner = nn + smin-2; winner = nn + smin-2;
if isempty(find(bins == winner)) if isempty(find(bins == winner))
bins = [bins winner]; bins = [bins winner];
end end
n = min(length(x), n + bins_search); n = min(length(xn), n + bins_search);
end end
end end
bins = bins'; bins = bins';
function y = noiseFloor(x, kn) function y = noiseFloor(x, kn)
y = zeros(size(x));
y(1) = x(1); y(1) = x(1);
for n=2:length(x) for n=2:length(x)
if (x(n) < kn*y(n-1)) 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; close all;
MIN_ABS_H = 1e-10;
drm_mode = 'B'; drm_mode = 'B';
drm_bw = '10k'; drm_bw = '10k';
[ofdm_drm_params, ofdm_spec_occ] = drm_params(drm_mode, drm_bw); [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_pilot, phi_pilot, mag_pilot] = getRefFreq(drm_mode);
[carrier_time, phi_time, mag_time] = getRefTime(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 % Read wav file
[fsize fs4] = wavread(filename, 'size') [fsize fs4] = wavread(filename, 'size');
[xwav, fs4, nbits] = wavread(filename, 0); [xwav, fs4, nbits] = wavread(filename, 0);
wav_numCh = fsize(2); wav_numCh = fsize(2);
wav_size = fsize(1); wav_size = fsize(1);
fs = fix(fs4/4);
isModePassband = 0; isModePassband = 0;
if (wav_numCh == 1) if (wav_numCh == 1)
fprintf('Mode: Passband\n'); fprintf('Mode: Passband\n');
@@ -40,13 +50,6 @@ end
buf_recv = buffer(); buf_recv = buffer();
buf_Z = 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 % Timing coarse stuff
timingCoarse = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, 'cp_off', 0, 'cp_off_', [], 'Nd', 0); 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); frameTiming = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, 'kc_max', -1000, 'n', 0, 'n_max', 0);
% Equalization stuff % 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); 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 = ... 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) while(fileRemain > fileChunkSize)
n0 = fileCunkCounter*fileChunkSize+1; n0 = fileCunkCounter*fileChunkSize+1;
@@ -283,7 +280,12 @@ while(fileRemain > fileChunkSize)
if (~equalizer.started) if (~equalizer.started)
equalizer.started = 1; equalizer.started = 1;
H_gain_cell = cell (frames_per_window, 1);
H_raw = zeros(length(carriers),1);
fprintf('Channel estimation and symbol reception\n'); fprintf('Channel estimation and symbol reception\n');
figure(100);
end end
Z = transpose(buf_Z.read(N)); Z = transpose(buf_Z.read(N));
@@ -327,7 +329,6 @@ while(fileRemain > fileChunkSize)
equalizer.sync = 1; equalizer.sync = 1;
equalizer.sync_frame_num = symbol_count; equalizer.sync_frame_num = symbol_count;
fprintf('Enter fine tracking mode at frame %d\n', equalizer.sync_frame_num); fprintf('Enter fine tracking mode at frame %d\n', equalizer.sync_frame_num);
end end
end end