From d5d5df21f912da6a2d84f645f3db36b45550a268 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sat, 26 Jul 2014 07:54:29 +0000 Subject: [PATCH] Initial version git-svn-id: http://moon:8086/svn/matlab/trunk@2 801c6759-fa7c-4059-a304-17956f83a07c --- ofdm/ofdm_tx.m | 107 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 ofdm/ofdm_tx.m diff --git a/ofdm/ofdm_tx.m b/ofdm/ofdm_tx.m new file mode 100644 index 0000000..ceea0b5 --- /dev/null +++ b/ofdm/ofdm_tx.m @@ -0,0 +1,107 @@ +% function ofdm_tx(N_data) +function yv = ofdm_tx(N_data) + +j = sqrt(-1); +WORK_BANDPASS = 1; +do_evaluate = 0; + +% Params +fa = 48000; +fc = fa/4; +F1 = 750; +F2 = 2250; +F3 = 3000; + +N_Carrier = 226; +M_qam = 64; +N_lp = 301; +TSym = 21.3330E-3 +TGrd = 5.333E-3 +TFrm = TSym+TGrd +NGrd = round(TGrd*fa) +NSym = round(TSym*fa) +NFrm = round(TFrm*fa) +N_fft = NSym + +bin_c = fix(N_fft*fc/fa)+1; +bin_f1 = fix(N_fft*(fc+F1)/fa)+1; +bin_f2 = fix(N_fft*(fc+F2)/fa)+1; +bin_f3 = fix(N_fft*(fc+F3)/fa)+1; + +% Source +qlut = qamtable(M_qam); +s = round(M_qam*rand(N_data,1)+0.5); + +% 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)'; + +t = 1; +if (WORK_BANDPASS == 1) + bin_range = N_fft/4-N_Carrier/2:N_fft/4+N_Carrier/2; +else + bin_range = 1:N_Carrier; +end; + +N_bins = length(bin_range); +for k=1:N_data/N_bins, + + % DC + X = zeros(N_fft,1); + X(1) = 0; + + for m=1:N_bins, + % Data + X(bin_range(m)) = qlut(s(t)); + t = t + 1; + end; + + % Additional carrier + if (WORK_BANDPASS == 1) + X(bin_c) = 1.0; + X(bin_f1) = 1.0 + j*1.0; + X(bin_f2) = 1.0 - j*1.0; + X(bin_f3) = -1.0 + j*1.0; + end; + + % Make conj. symmetric in F => real in T + X(N_fft:-1:N_fft/2+1) = conj(X(2:N_fft/2+1)); + + % Modulate + x = ifft(X); + xgrd = x(NSym-NGrd+1:NSym); + xt = [xgrd' x']'; + xv((k-1)*(NFrm)+1:k*(NFrm)) = xt; + + if (do_evaluate == 1) + xf = fft(xt(NGrd+1:NSym+NGrd), N_fft); + plot(xf, '+'); grid; + pause; + end; + +end; + +k_fft = 0.3333*sqrt(N_fft); + +% Pulse shape +if (WORK_BANDPASS == 1) + yv = real(filter(hbp,1,k_fft*xv)); + % yv = k_fft*xv; +else + yc = cos(2*pi*(0:length(xv)-1)*fc/fa); + yF1 = 1.0/N_fft*cos(2*pi*(0:length(xv)-1)*F1/fa); + yF2 = 1.0/N_fft*cos(2*pi*(0:length(xv)-1)*F2/fa); + yF3 = 1.0/N_fft*cos(2*pi*(0:length(xv)-1)*F3/fa); + yv = yc.*(0.025 + filter(hlp,1,k_fft*xv) + yF1 + yF2 + yF3); +end; + +% Output +close all; + +figure; +freqz(hlp); + +wavwrite(yv,fa,16,'yv.wav') \ No newline at end of file