From 42cf28baf6d435d361421d123f618d45084e3b43 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sat, 2 May 2015 08:55:06 +0000 Subject: [PATCH] [calcWiener] - calc W_pilots [RX] - added delta_freq for tracking (Zwischenstand) git-svn-id: http://moon:8086/svn/matlab/trunk@52 801c6759-fa7c-4059-a304-17956f83a07c --- ofdm/calcWiener.m | 34 ++++++++++++++++++++++++++-------- ofdm/ofdm_rx.m | 32 ++++++++++++++++++++------------ 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/ofdm/calcWiener.m b/ofdm/calcWiener.m index ff5e49c..ece0805 100644 --- a/ofdm/calcWiener.m +++ b/ofdm/calcWiener.m @@ -1,4 +1,4 @@ -function W_syms = calcWiener(drm_mode, drm_bw) +function [W_syms, W_pilots] = calcWiener(drm_mode, drm_bw) % calcWiener('B', '10k'); [params, spec_occ] = drm_params(drm_mode, drm_bw); @@ -23,6 +23,7 @@ f_D_max = f_cut_t*12000/Ns/2 tau_max = f_cut_k*Nu/12000/2 W_syms = cell( params.y, 1 ); +W_pilots = cell( params.y, 1 ); for d=0:window_delay-1 k2_pos = []; @@ -33,12 +34,14 @@ for d=0:window_delay-1 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 + end + num_gain_ref_per_window = length(k2_pos); + carriers = spec_occ.kmin:spec_occ.kmax; - PHI = zeros(length(k2_pos)); + PHI = zeros(num_gain_ref_per_window); % PHI - for k1=1:length(k2_pos) - k2 = [1:length(k2_pos)]; + for k1=1:num_gain_ref_per_window + k2 = [1:num_gain_ref_per_window]; k1_pos = k2_pos(k1); t1_pos = t2_pos(k1); PHI(k1,k2) = sinc(f_cut_k*(k1_pos-k2_pos)) .* sinc(f_cut_t*(t1_pos-t2_pos)); @@ -47,14 +50,29 @@ for d=0:window_delay-1 PHI_inv = inv(PHI); - THETA = zeros(1, length(k2_pos)); + % W_Syms + THETA = zeros(1, num_gain_ref_per_window); % THETA - carriers = spec_occ.kmin:spec_occ.kmax; for k1=1:length(carriers) - k2 = [1:length(k2_pos)]; + k2 = [1:num_gain_ref_per_window]; k1_pos = carriers(k1); t1_pos = window_delay; THETA(k2) = sinc(f_cut_k*(k1_pos-k2_pos)) .* sinc(f_cut_t*(t1_pos-t2_pos)); W_syms{d+1}(:, k1) = transpose( THETA*PHI_inv ); + end + + % W_Pilots + [c, p, a] = getRefGain(params, spec_occ, d); + + THETA = zeros(1, num_gain_ref_per_window); + % THETA + for k1=1:length(c) + k2 = [1:length(k2_pos)]; + k1_pos = c(k1); + t1_pos = frames_per_window-1; + THETA(k2) = sinc(f_cut_k*(k1_pos-k2_pos)) .* sinc(f_cut_t*(t1_pos-t2_pos)); + 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/ofdm_rx.m b/ofdm/ofdm_rx.m index 7c9f21f..b97e7b0 100644 --- a/ofdm/ofdm_rx.m +++ b/ofdm/ofdm_rx.m @@ -207,7 +207,7 @@ else axis([-maxZ maxZ -maxZ maxZ]); end -W = calcWiener(drm_mode, drm_bw); +[W_syms, W_pilots] = calcWiener(drm_mode, drm_bw); figure; % Detect scattered gain pilots @@ -239,37 +239,45 @@ fac_cell_list = ... }; symbol_counter = 0; win_count = 0; -H = []; -sym_H = []; +H_syms = []; +H_pilots = []; sym_out = []; kk = 1; +H_ = []; for k=start:length(Z_) %shifted symbol index - nn = rem(k-1-symbols_to_delay + symbols_per_frame, symbols_per_frame); - n = rem(nn, ofdm_drm_params.y); + nn = rem(k-start-1-symbols_to_delay + symbols_per_frame, symbols_per_frame); m = floor(nn/ofdm_drm_params.y); + n = rem(nn, ofdm_drm_params.y); - [carrier_gain, phi_gain, mag_gain] = getRefGain(ofdm_drm_params, ofdm_spec_occ, symbol_counter); + [carrier_gain, phi_gain, mag_gain] = getRefGain(ofdm_drm_params, ofdm_spec_occ, symbol_counter); carrier_gain_bins = c2i(N, carrier_gain); - H_raw(carrier_gain_bins) = Z_(carrier_gain_bins, k)./(mag_gain.*exp(j*2*pi*phi_gain/1024)).'; - H_gain_cell{win_count+1} = transpose(Z_(carrier_gain_bins, k)./(mag_gain.*exp(j*2*pi*phi_gain/1024)).'); + + if ~isempty(H_pilots) + delta_freq_offset = fs/(2*pi*N)*angle( H_pilots * conj(H2_)) + end + H2_ = H_; + H_= Z_(carrier_gain_bins, k)./(mag_gain.*exp(j*2*pi*phi_gain/1024)).'; + H_raw(carrier_gain_bins) = H_; + H_gain_cell{win_count+1} = transpose(H_); ii = 1+mod(n+(0:frames_per_window-1), frames_per_window); H_gain = [H_gain_cell{ii}]; H_gain_carriers_cell{win_count+1} = carrier_gain; 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}; + H_syms = H_gain*W_syms{n+1}; + H_pilots = H_gain*W_pilots{n+1}; ZZ = Z_(carrier_indexes, k-symbols_to_delay).'; - sym_eq = ZZ ./ H; + sym_eq = ZZ ./ H_syms; sym_out(:, kk) = sym_eq; if show_H H_raw(1:2:N) = H_raw(2:2:N); subplot(3, 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); + plot(carriers, abs(H_raw(carrier_indexes)), 'b-', carriers, abs(H_syms), 'r-'); grid; title('abs(H_{syms})'); axis([ofdm_spec_occ.kmin ofdm_spec_occ.kmax 0 15+0*max(abs(H_syms))]); title(str); subplot(3, 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); + plot(carriers, angle(H_raw(carrier_indexes)), 'b-', carriers, angle(H_syms), 'r-'); grid; title('phi(H_{syms})'); axis([ofdm_spec_occ.kmin ofdm_spec_occ.kmax -4 4]); title(str); subplot(3, 1, 3) plot(carriers, abs(sym_eq), 'b-'); grid; title('abs(Sym_{Eq})'); axis([ofdm_spec_occ.kmin ofdm_spec_occ.kmax 0 2]); title(str); hold on;