diff --git a/ofdm/calcWiener.m b/ofdm/calcWiener.m index a20c9ed..d6a0d79 100644 --- a/ofdm/calcWiener.m +++ b/ofdm/calcWiener.m @@ -1,18 +1,14 @@ function W_syms = calcWiener(drm_mode, drm_bw) % calcWiener('B', '10k'); -fs = 12000; -fd_max = 0.1; -tau_max = 0.0001; [params, spec_occ] = drm_params(drm_mode, drm_bw); N = params.nu -Ts = params.nu/fs -dF = 1/Ts +sigm = 10^(-14/10); frames_per_window = 2*params.y window_delay = params.y num_symbols_per_frame = params.nspf -num_carrier_per_symbol = spec_occ.kmax - spec_occ.kmin - 1 +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 @@ -38,7 +34,7 @@ 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))*0.0001); + PHI_inv = inv(PHI + eye(length(PHI))*sigm); THETA = zeros(1, length(k2_pos)); % THETA @@ -47,7 +43,8 @@ for d=0:window_delay-1 k2 = [1:length(k2_pos)]; k1_pos = carriers(k1); t1_pos = window_delay; - THETA(k2) = sinc( (k1_pos-k2_pos)*f_cut_k ).*sinc( (t1_pos-t2_pos)*f_cut_t ); + 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 end +W_syms \ No newline at end of file diff --git a/ofdm/drm/drm_params.m b/ofdm/drm/drm_params.m index deb69ad..647ed9a 100644 --- a/ofdm/drm/drm_params.m +++ b/ofdm/drm/drm_params.m @@ -14,40 +14,40 @@ DRM_MODE_C = 3; DRM_MODE_D = 4; DRM_MODE_E = 5; -ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', 2, 'kmax', 102); -ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 2, 'kmax', 114); -ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', -102, 'kmax', 102); -ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', -114, 'kmax', 114); -ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', - 98, 'kmax', 314); -ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', -110, 'kmax', 350); +ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', 2, 'kmax', 102, 'boost', [2,6,98,102]); +ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 2, 'kmax', 114, 'boost', [2,6,110,114]); +ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', -102, 'kmax', 102, 'boost', [-102,-98,98,102]); +ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', -114, 'kmax', 114, 'boost', [-114,-110,110,114]); +ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', - 98, 'kmax', 314, 'boost', [-98,-94,310,314]); +ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', -110, 'kmax', 350, 'boost', [-110,-106,346,350]); -ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', 1, 'kmax', 91); -ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 1, 'kmax', 103); -ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', - 91, 'kmax', 91); -ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', -103, 'kmax', 103); -ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', - 87, 'kmax', 279); -ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', - 99, 'kmax', 311); +ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', 1, 'kmax', 91, 'boost', [1,3,89,91]); +ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 1, 'kmax', 103, 'boost', [1,3,101,103]); +ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', - 91, 'kmax', 91, 'boost', [-91,-89,89,91]); +ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', -103, 'kmax', 103, 'boost', [-103,-101,101,103]); +ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', - 87, 'kmax', 279, 'boost', [-87,-85,277,279]); +ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', - 99, 'kmax', 311, 'boost', [-99,-97,309,311]); -ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', - 69, 'kmax', 69); -ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', - 67, 'kmax', 213); +ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', 0, 'kmax', 0, 'boost', []); +ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 0, 'kmax', 0, 'boost', []); +ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', 0, 'kmax', 0, 'boost', []); +ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', - 69, 'kmax', 69, 'boost', [-69,-67,67,69]); +ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', 0, 'kmax', 0, 'boost', []); +ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', - 67, 'kmax', 213, 'boost', [-67,-65,211,213]); -ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', - 44, 'kmax', 44); -ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', - 43, 'kmax', 135); +ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', 0, 'kmax', 0, 'boost', []); +ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 0, 'kmax', 0, 'boost', []); +ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', 0, 'kmax', 0, 'boost', []); +ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', - 44, 'kmax', 44, 'boost', [-44,-43,43,44]); +ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', 0, 'kmax', 0, 'boost', []); +ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', - 43, 'kmax', 135, 'boost', [-43,-42,134,135]); -ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', -106, 'kmax', 106); -ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', 0, 'kmax', 0); +ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', -106, 'kmax', 106, 'boost', [-106,-102,102,106]); +ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 0, 'kmax', 0, 'boost', []); +ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', 0, 'kmax', 0, 'boost', []); +ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', 0, 'kmax', 0, 'boost', []); +ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', 0, 'kmax', 0, 'boost', []); +ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', 0, 'kmax', 0, 'boost', []); W1024{DRM_MODE_A,:,:} = [228 341 455; 455 569 683; 683 796 910; 910 0 114; 114 228 341]; W1024{DRM_MODE_B,:,:} = [512 0 512 0 512; 0 512 0 512 0; 512 0 512 0 512]; diff --git a/ofdm/drm/getRefGain.m b/ofdm/drm/getRefGain.m index 4ae7724..5b627c1 100644 --- a/ofdm/drm/getRefGain.m +++ b/ofdm/drm/getRefGain.m @@ -14,9 +14,14 @@ n = mod(s, y); m = floor(s/y); p = (k - k0 - n*x)/(x*y); -ref_a = sqrt(2)*ones(1,length(k)); +mag = sqrt(2); +ref_a = mag*ones(1,length(k)); ref_c = k; +for b=spec_occ.boost + ref_a(find(ref_c == b)) = 2*mag; +end + switch ofdm_params.mode case 'A' diff --git a/ofdm/ofdm_rx.m b/ofdm/ofdm_rx.m index e3300ae..88471b2 100644 --- a/ofdm/ofdm_rx.m +++ b/ofdm/ofdm_rx.m @@ -148,15 +148,6 @@ for k=1:K, Xlast = X; end -df_track = mean(df_track_(10:200)) -mean_df_fine = mean(df_fine_, 2) -mu_Hp = mean(abs(Hp_'))' -sigma_Hp = var(abs(Hp_'))' -SNR_Hp = -10*log10(sigma_Hp)' - -G = (conj(Hp)*1)./(abs(Hp).^2 * 1 + sigma_Hp) -Hp_1 = 1./Hp - if ~isempty(cp_off_) figure; plot(0:length(cp_off_)-1, cp_off_, 0:length(cp_off_)-1, cp_off*ones(size(cp_off_)), 'r-'); grid; title('cp_{off}') @@ -220,20 +211,16 @@ W = calcWiener(drm_mode, drm_bw); figure; % Detect scattered gain pilots -sym_count = 0; +start = skip_syms+frame_start +symbol_counter = 0; win_count = 0; -start = skip_syms+frame_start; -H = zeros(N, 1); +H = []; sym_H = []; sym_out = []; kk = 1; -G = []; -bin = c2i(N, 13); -Hraw = []; -symbols_per_frame = 15; +symbols_per_frame = ofdm_drm_params.nspf; symbols_to_delay = ofdm_drm_params.y; -symbol_counter = 0; 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); @@ -244,14 +231,16 @@ for k=start:length(Z_) n = rem(nn, ofdm_drm_params.y); m = floor(nn/ofdm_drm_params.y); - [carrier_gain, phi_gain, mag_gain] = getRefGain(ofdm_drm_params, ofdm_spec_occ, symbol_counter); symbol_counter = symbol_counter + 1; + [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_gain_cell{win_count+1} = transpose(Z_(carrier_gain_bins, k)./(mag_gain.*exp(j*2*pi*phi_gain/1024)).'); - ii = 1+mod(0+win_count+(0:frames_per_window-1), frames_per_window); + 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 if 1 H = H_gain*W{n+1}; @@ -259,16 +248,16 @@ for k=start:length(Z_) sym_out(:, kk) = ZZ ./ H; if 1 subplot(2, 1, 1) - plot(0:length(H)-1, abs(H)); grid; title('abs(H)'); axis([0 length(H)-1 0 15+0*max(abs(H))]); + plot(0:length(H)-1, abs(H)); grid; title('abs(H)'); axis([0 length(H)-1 0 15+0*max(abs(H))]); title(str); subplot(2, 1, 2) - plot(0:length(H)-1, angle(H)); grid; title('phi(H)'); axis([0 length(H)-1 -4 4]); + plot(0:length(H)-1, angle(H)); grid; title('phi(H)'); axis([0 length(H)-1 -4 4]); title(str); else hold on; plot(sym_out(:, kk), '+'); hold off; grid; title('Sym'); end - pause(0.01); + pause(0.025); else ii = [H_gain_carriers_cell{1:6}] H = H_gain; @@ -282,6 +271,7 @@ for k=start:length(Z_) end kk = kk + 1; win_count = mod(win_count+1, frames_per_window); + symbol_counter = symbol_counter + 1; end diff --git a/ofdm/ofdm_tx.m b/ofdm/ofdm_tx.m index 15ec870..ef3f7c4 100644 --- a/ofdm/ofdm_tx.m +++ b/ofdm/ofdm_tx.m @@ -47,64 +47,64 @@ x_suffix = zeros(2, Ng); ofdm_spec_occ.kmin ofdm_spec_occ.kmax +sym_count = 0; for k=1:N_frames - for sym_count=0:ofdm_params.nspf-1, - X = zeros(N,1); - - % Data - if WITH_DATA == 1 - data_i = c2i(N, ofdm_spec_occ.kmin:1:ofdm_spec_occ.kmax); - sym = round(M_QAM*rand(1, length(data_i))+0.5); - X(data_i) = qlut(sym); - end; + X = zeros(N,1); - if (sym_count==0) & (WITH_TIME_REF == 1) - [ref_c ref_p ref_a] = getRefTime(ofdm_params.mode); - bins = c2i(N, ref_c); - X(bins) = ref_a.*(exp(j*2*pi*ref_p/1024)); - end; + % Data + if WITH_DATA == 1 + data_i = c2i(N, ofdm_spec_occ.kmin:1:ofdm_spec_occ.kmax); + sym = round(M_QAM*rand(1, length(data_i))+0.5); + X(data_i) = qlut(sym); + end; - if WITH_GAIN_REF == 1 - [ref_c ref_p ref_a] = getRefGain(ofdm_params, ofdm_spec_occ, sym_count); - bins = c2i(N, ref_c); - X(bins) = ref_a.*(exp(j*2*pi*ref_p/1024)); - end; + if WITH_GAIN_REF == 1 + [ref_c ref_p ref_a] = getRefGain(ofdm_params, ofdm_spec_occ, sym_count); + bins = c2i(N, ref_c); + X(bins) = ref_a.*(exp(j*2*pi*ref_p/1024)); + end; - if WITH_FREQ_REF == 1 - [ref_c ref_p ref_a] = getRefFreq(ofdm_params.mode); - bins = c2i(N, ref_c); - X(bins) = ref_a.*(exp(j*2*pi*ref_p/1024)); - end; + if (sym_count==0) & (WITH_TIME_REF == 1) + [ref_c ref_p ref_a] = getRefTime(ofdm_params.mode); + bins = c2i(N, ref_c); + X(bins) = ref_a.*(exp(j*2*pi*ref_p/1024)); + end; - X(c2i(N, 0)) = 0; - - % Modulate - xu = k_fft*ifft(X, N).'; - if WITH_RCWIN == 1 - x_prefix(1,:) = xu(N-Ng+1:N); - x_suffix(1,:) = xu(1:Ng); - - x_pw = x_suffix(2,:) .* (1-wng) + x_prefix(1,:) .* wng; - - xs = [x_pw xu]; - - x_prefix(2,:) = x_prefix(1,:); - x_suffix(2,:) = x_suffix(1,:); - else - xs = [xu(N-Ng+1:N) xu]; - end; - xv = [xv xs(1:Ng+N)]; - - if (DO_PLOT == 1) + if WITH_FREQ_REF == 1 + [ref_c ref_p ref_a] = getRefFreq(ofdm_params.mode); + bins = c2i(N, ref_c); + X(bins) = ref_a.*(exp(j*2*pi*ref_p/1024)); + end; + + X(c2i(N, 0)) = 0; + + % Modulate + xu = k_fft*ifft(X, N).'; + if WITH_RCWIN == 1 + x_prefix(1,:) = xu(N-Ng+1:N); + x_suffix(1,:) = xu(1:Ng); + + x_pw = x_suffix(2,:) .* (1-wng) + x_prefix(1,:) .* wng; + + xs = [x_pw xu]; + + x_prefix(2,:) = x_prefix(1,:); + x_suffix(2,:) = x_suffix(1,:); + else + xs = [xu(N-Ng+1:N) xu]; + end; + xv = [xv xs(1:Ng+N)]; + + if (DO_PLOT == 1) % Xs = fftshift(fft(xs(Ng+1:Ng+N), N)/k_fft); - Xs = fftshift(X); - subplot(2, 1, 1) - plot(0:N-1, abs(Xs(1:N)), '-*'); grid; axis([0 N-1 0 2]); - subplot(2, 1, 2) - plot(0:N-1, angle(Xs(1:N)), '-*'); grid; axis([0 N-1 -2*pi 2*pi]); - pause(plot_speed); - end - end; + Xs = fftshift(X); + subplot(2, 1, 1) + plot(0:N-1, abs(Xs(1:N)), '-*'); grid; axis([0 N-1 0 3.0]); + subplot(2, 1, 2) + plot(0:N-1, angle(Xs(1:N)), '-*'); grid; axis([0 N-1 -2*pi 2*pi]); + pause(plot_speed); + end + sym_count = mod(sym_count+1, ofdm_params.nspf); end; hold off; grid; @@ -119,7 +119,7 @@ xup = filter(hlp, 1, xup); yc = exp(j*2*pi.*(0:length(xup)-1)*0.25) .* xup; yv = real(yc) + imag(yc); -xv = conj(xv')./abs(max(xv)); +xv = xv.' ./abs(max(xv)); yv = yv'./max(yv); wavwrite(0.9*yv,4*fa,16,'yv.wav')