% function ofdm_tx(N_frames) function [yv xv] = ofdm_tx(mode, bandwidth, N_frames, withData, plot_speed) close all; DO_PLOT = (plot_speed > 0); WITH_RCWIN = 1; WITH_FREQ_REF = 1; WITH_TIME_REF = 1; WITH_GAIN_REF = 1; WITH_DATA = withData; DELAY = 100; M_QAM = 64; RCWIN_ROLLOFF = 0.125; % Params fa = 12000; T = 1/fa; [ofdm_params, ofdm_spec_occ] = drm_params(mode, bandwidth); ofdm_params_mode = ofdm_params.mode ofdm_spec_occ_kmin = ofdm_spec_occ.kmin ofdm_spec_occ_kmax = ofdm_spec_occ.kmax Tu = ofdm_params.nu * T Tg = ofdm_params.ng * T Ts = Tu+Tg Ng = round(Tg*fa) N = round(Tu*fa) Ns = round(Ts*fa) SubCarrierspacing_HZ = fa/N % TX window [rcwin Nt wng] = txwin_eval(N, Ng, RCWIN_ROLLOFF); Nt = Nt % Source qlut = qamtable(M_QAM); k_fft = sqrt(N); xv = zeros(1, DELAY); xt = zeros(1, Nt); x_prefix = zeros(2, Ng); x_suffix = zeros(2, Ng); ofdm_spec_occ.kmin ofdm_spec_occ.kmax sym_count = 0; for k=1:N_frames 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; 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 (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; 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 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; plot(wng); grid; % Modulate on carrier xup = upsample(xv, 4); hlp = FIRCalcLowpass(0.25, 129); xup = filter(hlp, 1, xup); yc = exp(j*2*pi.*(0:length(xup)-1)*0.25) .* xup; yv = real(yc) + imag(yc); xv = xv.' ./abs(max(xv)); yv = yv'./max(yv); wavwrite(0.8*yv,4*fa,16,'yv.wav') wavwrite(0.8*[real(xv) imag(xv)],fa,16,'xv.wav')