From 2e49c862b81f8ff53e7b83eb99f26534efd058b8 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sun, 27 Jul 2014 08:19:29 +0000 Subject: [PATCH] - fixed zero pilot after FFT - added FFT evaluation - cleaned up git-svn-id: http://moon:8086/svn/matlab/trunk@4 801c6759-fa7c-4059-a304-17956f83a07c --- ofdm/ofdm_tx.m | 68 ++++++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/ofdm/ofdm_tx.m b/ofdm/ofdm_tx.m index 7486929..73e5186 100644 --- a/ofdm/ofdm_tx.m +++ b/ofdm/ofdm_tx.m @@ -1,9 +1,13 @@ % function ofdm_tx(N_frames) function [yv xv] = ofdm_tx(N_frames) -WITH_DATA = 0; +close all; +M_QAM = 4; +RC_ROLLOFF = 0.1; + +WITH_DATA = 1; WITH_FREQ_REF = 1; -WITH_TIME_REF = 1; +WITH_TIME_REF = 0; % Params fa = 48000; @@ -69,9 +73,6 @@ ofdm_params_drm(DRM_MODE_E) = struct('nu', 27, 'ng', 3, 'nspf', 40); ofdm_params = ofdm_params_drm(DRM_MODE_B) ofdm_spec_occ = ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_10k) -N_Carrier = 226; -M_qam = 4; -N_lp = 301; T = 4/fa; Tu = ofdm_params.nu * T Tg = ofdm_params.ng * T @@ -83,22 +84,16 @@ N_fft = Nu SubCarrierspacing_HZ = fa/N_fft % TX window -[txwin Nt] = txwin_eval(Nu, Ng, 0.05); +[txwin Nt] = txwin_eval(Nu, Ng, RC_ROLLOFF); % Source -qlut = qamtable(M_qam); - -% Band pass for transmission -f_lp = N_Carrier*fa/N_fft -hbp = cos(2*pi*(0:N_lp-1)*fc/fa).*sinc((-(N_lp-1)/2:(N_lp-1)/2)*f_lp/fa); -hbp = hbp/sum(hbp.^2).*Hanning(N_lp)'; -hlp = sinc((-(N_lp-1)/2:(N_lp-1)/2)*f_lp/fa); -hlp = hlp/sum(hlp.^2).*Hanning(N_lp)'; +qlut = qamtable(M_QAM); k_fft = 2*sqrt(N_fft); xv = []; xt = zeros(1, Nt); +figure; for k=1:N_frames for s=0:ofdm_params.nspf-1, @@ -107,19 +102,19 @@ for k=1:N_frames % Data if WITH_DATA == 1 data_i = c2i(N_fft, ofdm_spec_occ.kmin:1:ofdm_spec_occ.kmax); - X(data_i) = 0.20*qlut(round(M_qam*rand(1, length(data_i))+0.5)); + X(data_i) = 0.20*qlut(round(M_QAM*rand(1, length(data_i))+0.5)); end; -% X(78) = 0.20*qlut(round(M_qam*rand(1, 1)+0.5)); +% X(c2i(N_fft,65)) = 0.20*qlut(round(M_qam*rand(1, 1)+0.5)); if WITH_FREQ_REF == 1 - [ref_i ref_p ref_a] = getRefFreq(N_fft, DRM_MODE_B, s); - X(ref_i) = 0.20*ref_a.*exp(-2*pi*i*ref_p/1024); + [ref_c ref_p ref_a] = getRefFreq(DRM_MODE_B, s); + X(c2i(N_fft, ref_c)) = 0.20*ref_a.*(exp(2*pi*i*ref_p/1024)); end; if (s==0) & (WITH_TIME_REF == 1) - [ref_i ref_p ref_a] = getRefTime(N_fft, DRM_MODE_B); - X(ref_i) = 0.20*ref_a.*exp(-2*pi*i*ref_p/1024); + [ref_c ref_p ref_a] = getRefTime(DRM_MODE_B); + X(c2i(N_fft, ref_c)) = 0.20*ref_a.*(exp(2*pi*i*ref_p/1024)); end; % X(1) = 0.2; @@ -130,19 +125,20 @@ for k=1:N_frames xs(1:Nt) = xs(1:Nt) + xt(1:Nt); xt = xs(Ng+Nu+1:Ng+Nu+Nt); xv = [xv xs(1:Ng+Nu)]; + Xs = fft(xs(Ng+1:Ng+Nu), N_fft)/k_fft; + plot(fa*(0:N_fft/8-1)/N_fft, abs(Xs(1:N_fft/8)), '-*'); grid; + pause (0.001); end; end; % Modulate on carrier -yc = 0.5*exp(-i*2*pi.*(0:length(xv)-1)*fc/fa) .* filter(hlp,1,xv); +yc = 0.5*exp(i*2*pi.*(0:length(xv)-1)*fc/fa) .* filter(hlp,1,xv); yv = real(yc) + imag(yc); xv = xv'; yv = yv'; % Output -close all; - figure; freqz(hlp); @@ -153,9 +149,9 @@ function index = c2i(N_fft, carriers) ri = []; ri = [ri find(carriers == 0)]; carriers(ri) = []; - index = mod(carriers, 1024) + 1; + index = mod(-carriers, 1024) + 1; -function [ref_i ref_p ref_a] = getRefFreq(N_fft, drmMode, s) +function [ref_c ref_p ref_a] = getRefFreq(drmMode, s) ref_A_c = [18 54 72]; ref_A_p = [205 836 215]; @@ -180,32 +176,32 @@ ref_E_a = []; switch drmMode case 1 - ref_i = c2i(N_fft, ref_A_c); + ref_c = ref_A_c; ref_p = ref_A_p; ref_a = ref_A_a; case 2 - ref_i = c2i(N_fft, ref_B_c); + ref_c = ref_B_c; ref_p = ref_B_p; ref_a = ref_B_a; case 3 - ref_i = c2i(N_fft, ref_C_c); + ref_c = ref_C_c; ref_p = ref_C_p; ref_a = ref_C_a; case 4 - ref_i = c2i(N_fft, ref_D_c); + ref_c = ref_D_c; ref_p = ref_D_p; ref_a = ref_D_a; case 5 - ref_i = c2i(N_fft, ref_E_c); + ref_c = ref_E_c; ref_p = ref_E_p; ref_a = ref_E_a; end; -function [ref_i ref_p ref_a] = getRefTime(N_fft, drmMode) +function [ref_c ref_p ref_a] = getRefTime(drmMode) ref_B_c = [14 18 20 24 26 32 36 42 44 49 50 54 56 62 66 68]; ref_B_p = [304 108 620 192 704 44 432 588 844 651 651 460 460 944 940 428]; @@ -213,27 +209,27 @@ ref_B_a = sqrt(2)*ones(1,16); switch drmMode case 1 - ref_i = []; + ref_c = []; ref_p = []; ref_a = []; case 2 - ref_i = c2i(N_fft, ref_B_c); + ref_c = ref_B_c; ref_p = ref_B_p; ref_a = ref_B_a; case 3 - ref_i = []; + ref_c = []; ref_p = []; ref_a = []; case 4 - ref_i = []; + ref_c = []; ref_p = []; ref_a = []; case 5 - ref_i = []; + ref_c = []; ref_p = []; ref_a = []; end;