diff --git a/ofdm/calcWiener.m b/ofdm/calcWiener.m index ece0805..49d711d 100644 --- a/ofdm/calcWiener.m +++ b/ofdm/calcWiener.m @@ -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 \ No newline at end of file diff --git a/ofdm/cfo_coarse_int.m b/ofdm/cfo_coarse_int.m index bf029d0..4a64849 100644 --- a/ofdm/cfo_coarse_int.m +++ b/ofdm/cfo_coarse_int.m @@ -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)) diff --git a/ofdm/ofdm_rx.m b/ofdm/ofdm_rx.m index a1541c8..f3e1024 100644 --- a/ofdm/ofdm_rx.m +++ b/ofdm/ofdm_rx.m @@ -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