diff --git a/ofdm/calcWiener.m b/ofdm/calcWiener.m index d6a0d79..0067c3f 100644 --- a/ofdm/calcWiener.m +++ b/ofdm/calcWiener.m @@ -5,6 +5,11 @@ function W_syms = calcWiener(drm_mode, drm_bw) N = params.nu sigm = 10^(-14/10); + +Ns = (params.nu+params.ng); +Nu = (params.nu); +Ng = (params.ng); + frames_per_window = 2*params.y window_delay = params.y num_symbols_per_frame = params.nspf @@ -12,18 +17,23 @@ num_carrier_per_symbol = spec_occ.kmax - spec_occ.kmin num_symbols_per_frame = num_symbols_per_frame * num_carrier_per_symbol % PHI = auto-covariance-matrix -f_cut_t = 0.0675*1/window_delay; % two-sided maximum doppler frequency (normalized w.r.t symbol duration Ts) -f_cut_k = 1.75*params.ng/params.nu; % two-sided maximum echo delay (normalized w.r.t useful symbol duration Tu) +f_cut_t = 0.0675*1/params.y % two-sided maximum doppler frequency (normalized w.r.t symbol duration Ts) +f_cut_k = 1.75*Ng/Nu % two-sided maximum echo delay (normalized w.r.t useful symbol duration Tu) + +f_D_max = f_cut_t*12000/Ns/2 +tau_max = f_cut_k*Nu/12000/2 W_syms = cell( params.y, 1 ); for d=0:window_delay-1 k2_pos = []; t2_pos = []; + ref_gain_a = []; for s=0:frames_per_window-1 [c, p, a] = getRefGain(params, spec_occ, s+d); k2_pos = [k2_pos c]; % length = window_delay*frames_per_window t2_pos = [t2_pos ones(1, length(c))*(s)]; % length = window_delay*frames_per_window + ref_gain_a = [ref_gain_a a]; end PHI = zeros(length(k2_pos)); @@ -34,7 +44,9 @@ for d=0:window_delay-1 t1_pos = t2_pos(k1); PHI(k1,k2) = sinc(f_cut_k*(k1_pos-k2_pos)) .* sinc(f_cut_t*(t1_pos-t2_pos)); end - PHI_inv = inv(PHI + eye(length(PHI))*sigm); + PHI = PHI + sigm*diag(2./(ref_gain_a.^2)); + + PHI_inv = inv(PHI); THETA = zeros(1, length(k2_pos)); % THETA diff --git a/ofdm/ofdm_rx.m b/ofdm/ofdm_rx.m index 4239f01..0214264 100644 --- a/ofdm/ofdm_rx.m +++ b/ofdm/ofdm_rx.m @@ -224,6 +224,27 @@ symbols_to_delay = ofdm_drm_params.y; frames_per_window = 2*ofdm_drm_params.y H_gain_cell = cell (frames_per_window, 1); H_gain_carriers_cell = cell (frames_per_window, 1); +H_raw = zeros(length(ofdm_spec_occ.kmin:ofdm_spec_occ.kmax),1); +fac_cell_list = ... +{ + [], + [], + [13, 25, 43, 55, 67], + [15, 27, 45, 57, 69], + [17, 29, 47, 59, 71], + [19, 31, 49, 61, 73], + [9, 21, 33, 51, 63, 75], + [11, 23, 35, 53, 65, 77], + [13, 25, 37, 55, 67, 79], + [15, 27, 39, 57, 69, 81], + [17, 29, 41, 59, 71, 83], + [19, 31, 43, 61, 73], + [21, 33, 45, 63, 75], + [23, 35, 47, 65, 77], + [] +}; +carriers = ofdm_spec_occ.kmin:ofdm_spec_occ.kmax; +carrier_indexes = c2i(N, carriers); for k=start:length(Z_) %shifted symbol index @@ -234,7 +255,7 @@ for k=start:length(Z_) [carrier_gain, phi_gain, mag_gain] = getRefGain(ofdm_drm_params, ofdm_spec_occ, symbol_counter); carrier_gain_bins = c2i(N, carrier_gain); Hp = Z_(carrier_gain_bins, k)./(mag_gain.*exp(j*2*pi*phi_gain/1024)).'; - + H_raw(carrier_gain_bins) = Hp; H_gain_cell{win_count+1} = transpose(Z_(carrier_gain_bins, k)./(mag_gain.*exp(j*2*pi*phi_gain/1024)).'); ii = 1+mod(n+(0:frames_per_window-1), frames_per_window); H_gain = [H_gain_cell{ii}]; @@ -242,41 +263,34 @@ for k=start:length(Z_) str = sprintf('Frame %d, SymCount %d, winCount %d, n=%d', k, symbol_counter, win_count, n); if length(H_gain) == 208 + H = H_gain*W{n+1}; + ZZ = Z_(carrier_indexes, k).'; + sym_eq = ZZ ./ H; + sym_out(:, kk) = sym_eq; if 1 - H = H_gain*W{n+1}; - ZZ = Z_(c2i(N, ofdm_spec_occ.kmin:ofdm_spec_occ.kmax), k).'; - sym_out(:, kk) = ZZ ./ H; - if 1 - subplot(2, 1, 1) - plot(ofdm_spec_occ.kmin:ofdm_spec_occ.kmax, abs(H)); grid; title('abs(H)'); axis([ofdm_spec_occ.kmin ofdm_spec_occ.kmax 0 15+0*max(abs(H))]); title(str); - subplot(2, 1, 2) - plot(ofdm_spec_occ.kmin:ofdm_spec_occ.kmax, angle(H)); grid; title('phi(H)'); axis([ofdm_spec_occ.kmin ofdm_spec_occ.kmax -4 4]); title(str); - else - hold on; - plot(sym_out(:, kk), '+'); - hold off; - grid; title('Sym'); - end - pause(0.01); - else - ii = [H_gain_carriers_cell{1:6}] - H = H_gain; - sym_out(:, kk) = 0; - subplot(2, 1, 1) - plot(abs(H)); grid; title('abs(H)'); - subplot(2, 1, 2) - plot(angle(H)); grid; title('phi(H)'); + H_raw(1:2:N) = H_raw(2:2:N); + subplot(2, 1, 1) + plot(carriers, abs(H_raw(carrier_indexes)), 'b-', carriers, abs(H), 'r-'); grid; title('abs(H)'); axis([ofdm_spec_occ.kmin ofdm_spec_occ.kmax 0 15+0*max(abs(H))]); title(str); + subplot(2, 1, 2) + plot(carriers, angle(H_raw(carrier_indexes)), 'b-', carriers, angle(H), 'r-'); grid; title('phi(H)'); axis([ofdm_spec_occ.kmin ofdm_spec_occ.kmax -4 4]); title(str); pause(0.01); + else + fac_c = fac_cell_list{symbol_counter+1}; + if (~isempty(fac_c)) + fac_i = fac_c - ofdm_spec_occ.kmin + 1; + hold on; + plot(sym_eq(fac_i), '.', 'MarkerSize', 4); + pause(0.01); + hold off; + grid; title('FAC'); axis([-1.5 1.5 -1.5 1.5]); + end end end kk = kk + 1; win_count = mod(win_count+1, frames_per_window); - symbol_counter = symbol_counter + 1; + symbol_counter = mod(symbol_counter + 1, symbols_per_frame); end -figure; -plot(real(sym_H'), imag(sym_H'), '+'); grid; title('Sym_{H}'); axis([-1.5 1.5 -1.5 1.5]); - function Y = spec_order(N, X) Y = [X(N/2+1:N)' X(1:N/2)']';