% function ofdm_tx(N_frames) function [yv xv] = ofdm_tx(N_frames) WITH_DATA = 0; WITH_FREQ_REF = 1; WITH_TIME_REF = 1; % Params fa = 48000; fc = fa/4; F1 = 750; F2 = 2250; F3 = 3000; SPEC_OCC_4k5 = 1; SPEC_OCC_5k0 = 2; SPEC_OCC_9k0 = 3; SPEC_OCC_10k = 4; SPEC_OCC_18k = 5; SPEC_OCC_20k = 6; DRM_MODE_A = 1; DRM_MODE_B = 2; DRM_MODE_C = 3; DRM_MODE_D = 4; DRM_MODE_E = 5; ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_4k5) = struct('kmin', 2, 'kmax', 102); ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_5k0) = struct('kmin', 2, 'kmax', 114); ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_9k0) = struct('kmin', -102, 'kmax', 102); ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_10k) = struct('kmin', -114, 'kmax', 114); ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_18k) = struct('kmin', - 98, 'kmax', 314); ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_20k) = struct('kmin', -110, 'kmax', 350); ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_4k5) = struct('kmin', 1, 'kmax', 91); ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_5k0) = struct('kmin', 1, 'kmax', 103); ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_9k0) = struct('kmin', - 91, 'kmax', 91); ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_10k) = struct('kmin', -103, 'kmax', 103); ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_18k) = struct('kmin', - 87, 'kmax', 279); ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_20k) = struct('kmin', - 99, 'kmax', 311); ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_4k5) = struct('kmin', 0, 'kmax', 0); ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_5k0) = struct('kmin', 0, 'kmax', 0); ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_9k0) = struct('kmin', 0, 'kmax', 0); ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_10k) = struct('kmin', - 69, 'kmax', 69); ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_18k) = struct('kmin', 0, 'kmax', 0); ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_20k) = struct('kmin', - 67, 'kmax', 213); ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_4k5) = struct('kmin', 0, 'kmax', 0); ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_5k0) = struct('kmin', 0, 'kmax', 0); ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_9k0) = struct('kmin', 0, 'kmax', 0); ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_10k) = struct('kmin', - 44, 'kmax', 44); ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_18k) = struct('kmin', 0, 'kmax', 0); ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_20k) = struct('kmin', - 43, 'kmax', 135); ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_4k5) = struct('kmin', -106, 'kmax', 106); ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_5k0) = struct('kmin', 0, 'kmax', 0); ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_9k0) = struct('kmin', 0, 'kmax', 0); ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_10k) = struct('kmin', 0, 'kmax', 0); ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_18k) = struct('kmin', 0, 'kmax', 0); ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_20k) = struct('kmin', 0, 'kmax', 0); ofdm_params_drm(DRM_MODE_A) = struct('nu', 288, 'ng', 32, 'nspf', 15); ofdm_params_drm(DRM_MODE_B) = struct('nu', 256, 'ng', 64, 'nspf', 15); ofdm_params_drm(DRM_MODE_C) = struct('nu', 176, 'ng', 64, 'nspf', 20); ofdm_params_drm(DRM_MODE_D) = struct('nu', 112, 'ng', 88, 'nspf', 24); 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 Ts = Tu+Tg Ng = round(Tg*fa) Nu = round(Tu*fa) Ns = round(Ts*fa) N_fft = Nu SubCarrierspacing_HZ = fa/N_fft % TX window [txwin Nt] = txwin_eval(Nu, Ng, 0.05); % 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)'; k_fft = 2*sqrt(N_fft); xv = []; xt = zeros(1, Nt); for k=1:N_frames for s=0:ofdm_params.nspf-1, X = zeros(N_fft,1); % 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)); end; % X(78) = 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); 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); end; % X(1) = 0.2; % Modulate xu = k_fft*ifft(X, N_fft)'; xs = [xu(Nu-Ng+1:Nu) xu xu(1:Nt)] .* txwin; xs(1:Nt) = xs(1:Nt) + xt(1:Nt); xt = xs(Ng+Nu+1:Ng+Nu+Nt); xv = [xv xs(1:Ng+Nu)]; end; end; % Modulate on carrier 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); wavwrite(0.9*yv,fa,16,'yv.wav') wavwrite(0.9*[real(xv) imag(xv)],fa,16,'xv.wav') function index = c2i(N_fft, carriers) ri = []; ri = [ri find(carriers == 0)]; carriers(ri) = []; index = mod(carriers, 1024) + 1; function [ref_i ref_p ref_a] = getRefFreq(N_fft, drmMode, s) ref_A_c = [18 54 72]; ref_A_p = [205 836 215]; ref_A_a = sqrt(2)*ones(1,3); ref_B_c = [16 48 64]; ref_B_p = [331 651 555]; ref_B_a = sqrt(2)*ones(1,3); ref_C_c = [11 33 44]; ref_C_p = [214 392 242]; ref_C_a = sqrt(2)*ones(1,3); ref_D_c = [ 7 21 28]; ref_D_p = [788 1014 332]; ref_D_a = sqrt(2)*ones(1,3); ref_E_c = []; ref_E_p = []; ref_E_a = []; switch drmMode case 1 ref_i = c2i(N_fft, ref_A_c); ref_p = ref_A_p; ref_a = ref_A_a; case 2 ref_i = c2i(N_fft, ref_B_c); ref_p = ref_B_p; ref_a = ref_B_a; case 3 ref_i = c2i(N_fft, ref_C_c); ref_p = ref_C_p; ref_a = ref_C_a; case 4 ref_i = c2i(N_fft, ref_D_c); ref_p = ref_D_p; ref_a = ref_D_a; case 5 ref_i = c2i(N_fft, 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) 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]; ref_B_a = sqrt(2)*ones(1,16); switch drmMode case 1 ref_i = []; ref_p = []; ref_a = []; case 2 ref_i = c2i(N_fft, ref_B_c); ref_p = ref_B_p; ref_a = ref_B_a; case 3 ref_i = []; ref_p = []; ref_a = []; case 4 ref_i = []; ref_p = []; ref_a = []; case 5 ref_i = []; ref_p = []; ref_a = []; end; function [ref_i ref_p ref_a] = getRefGain(N_fft, spec_occ, drmMode, s) switch drmMode case 1 ref_c = []; ref_p = []; ref_a = []; case 2 ref_c = 1 + 2*mod(s,3)+6*(spec_occ.kmin:1:spec_occ.kmax); ref_i = c2i(N_fft, ref_c); ref_p = ref_B_p; ref_a = sqrt(2)*ones(1,length(ref_i)); case 3 ref_c = []; ref_p = []; ref_a = []; case 4 ref_c = []; ref_p = []; ref_a = []; case 5 ref_c = []; ref_p = []; ref_a = []; end;