[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:
@@ -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
|
|
||||||
@@ -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
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user