diff --git a/ofdm/ofdm_rx.m b/ofdm/ofdm_rx.m index 12b4ceb..e41e91b 100644 --- a/ofdm/ofdm_rx.m +++ b/ofdm/ofdm_rx.m @@ -1,126 +1,23 @@ -% function ofdm_sync(x, nsym, ngrd) -% Example: ofdm_sync(x, 1152, 128) -function ofdm_rx(x, offset, nsym_soll, ngrd) +function ofdm_rx(x) -% Init -fa = 48000; -fc = fa/4; -F1 = 750; -F2 = 2250; -F3 = 3000; close all; -do_evaluate = 1; -alpha = 0.05; -x = real(x); -% Detection -display('Sync detection'); -nsym_ist = nsym_soll; -xi = zeros(ngrd, 1); -range_max = 24; -range_min = 4; -range_forget = 0.5; -range = range_max; -err = 0; -k = 0; -kk = 1; -remain = length(x); -progress_ival = 1; -progress_last = -1; -nfft = nsym_soll-ngrd +CP_SIZE = 254; +FFT_SIZE = 1024; +fa = 48000; -bin_c = fix(nfft*fc/fa)+1 -bin_f1 = fix(nfft*(fc+F1)/fa)+1 -bin_f2 = fix(nfft*(fc+F2)/fa)+1 -bin_f3 = fix(nfft*(fc+F3)/fa)+1 -k_fft = 3/sqrt(nfft); - -phi_c_last = 0; -phi_f1_last = 0; -phi_f2_last = 0; -phi_f3_last = 0; - -while remain > 2*nsym_ist, - xsym = x(offset+k*nsym_ist+1:offset+k*nsym_ist+nsym_ist+range); - [xcor, imax, jmax, xi] = xcc(xsym, nsym_ist, ngrd, -range, range, -range, range, xi); - remain = remain - (length(offset+k*nsym_ist+1:offset+k*nsym_ist+nsym_ist+range)); - err = -imax + jmax; - offset = offset + imax; - nsym_ist = max(round(nsym_ist + err), ngrd) - sl_offset(kk) = offset; - sl_err(kk) = err; - sl_nsym_ist(kk) = nsym_ist; - range = min(max(fix(range + abs(err) - range_forget), range_min), range_max); - progress = round(100*(length(x)-remain)/length(x)); - if (progress ~= progress_last) - progress_last = progress_last + progress_ival; - progress = progress - end; - if (do_evaluate == 1) - X0 = k_fft*fft(xsym(1:nsym_ist-ngrd), nfft); - phi_c(kk) = (1-alpha)*phi_c_last + alpha*angle(X0(bin_c)); - phi_f1(kk) = (1-alpha)*phi_f1_last + alpha*angle(X0(bin_f1)); - phi_f2(kk) = (1-alpha)*phi_f2_last + alpha*angle(X0(bin_f2)); - phi_f3(kk) = (1-alpha)*phi_f3_last + alpha*angle(X0(bin_f3)); - phi_c_last = phi_c(kk); - phi_f1_last = phi_f1(kk); - phi_f2_last = phi_f2(kk); - phi_f3_last = phi_f3(kk); - %pause; - end; - k = k + 1; - kk = kk + 1; -end; - -% Result -display('Results:'); - -offset_stddev = sqrt(var(sl_offset)) -err_mean = mean(sl_err) -nsym_ist_mean = mean(nsym_ist) - -% Diagrams -figure; -plot(1:length(sl_offset), sl_offset); title('offset'); legend('offset'); grid; +k_fft = 2*sqrt(FFT_SIZE); figure; -subplot(2,1,1) -plot(1:length(sl_err), sl_err); title('error'); legend('error'); grid; -subplot(2,1,2) -plot(1:length(sl_nsym_ist), sl_nsym_ist, 1:length(sl_nsym_ist), nsym_soll*ones(size(sl_nsym_ist))); title('Tracking'); legend('nsym_{ist}', 'nsym_{soll}'); grid; - -figure -plot(1:length(phi_c), phi_c, 1:length(phi_f1), phi_f1, 1:length(phi_f2), phi_f2, 1:length(phi_f3), phi_f3); grid; legend('phi_{c}', 'phi_{f1}', 'phi_{f2}', 'phi_{f3}'); title('Phase'); - -% custom function -% Correlation -function [ccm, imax, jmax, xo] = xcc(x, Ns, Ng, i_low, i_high, j_low, j_high, xi) - -Nu = Ns - Ng; -off = length(xi); - -xo = x(length(x)-off+1:length(x)); -xs = [xi' x']'; - -ccm = 0; -imax = 0; -jmax = 0; -for i_off=i_low:i_high, - ii = off+i_off+1:off+Ng+i_off; - xm_i = mean(xs(ii)); - xi = xs(ii)-xm_i; - var_i = var(xi); - for j_off=j_low:j_high, - jj = off+Nu+j_off+1:off+Nu+Ng+j_off; - xm_j = mean(xs(jj)); - xj = xs(jj) - xm_j; - var_j = var(xj); - cc = sum(xi.*xj)./sqrt(var_i*var_j); - if (cc > ccm) - imax = i_off; - jmax = j_off; - ccm = cc; - end; - end; -end; - +Ns = (CP_SIZE + FFT_SIZE); +Nf = length(x)/Ns; +for k=1:Nf + Xs = fft(x((k-1)*Ns+CP_SIZE+1:(k-1)*Ns+CP_SIZE+FFT_SIZE), FFT_SIZE)/k_fft; + mag = abs(Xs(1:FFT_SIZE/8)); + phase = angle(Xs(1:FFT_SIZE/8)); + subplot(2, 1, 1) + plot(fa*(0:lge(mag)-1)/FFT_SIZE, mag, '-*'); grid; + subplot(2, 1, 2) + plot(fa*(0:lge(phase)-1)/FFT_SIZE, phase, '-*'); axis([0, fa*(lge(phase)-1)/FFT_SIZE, -pi, +pi]);grid; + pause (0.001); +end diff --git a/ofdm/ofdm_tx.m b/ofdm/ofdm_tx.m index 73e5186..43c8d6f 100644 --- a/ofdm/ofdm_tx.m +++ b/ofdm/ofdm_tx.m @@ -2,12 +2,14 @@ function [yv xv] = ofdm_tx(N_frames) close all; -M_QAM = 4; -RC_ROLLOFF = 0.1; +WITH_RCWIN = 1; WITH_DATA = 1; WITH_FREQ_REF = 1; -WITH_TIME_REF = 0; +WITH_TIME_REF = 1; + +M_QAM = 16; +RCWIN_ROLLOFF = 0.1; % Params fa = 48000; @@ -80,11 +82,11 @@ Ts = Tu+Tg Ng = round(Tg*fa) Nu = round(Tu*fa) Ns = round(Ts*fa) -N_fft = Nu +N_fft = Nu; SubCarrierspacing_HZ = fa/N_fft % TX window -[txwin Nt] = txwin_eval(Nu, Ng, RC_ROLLOFF); +[rcwin Nt] = txwin_eval(Nu, Ng, RCWIN_ROLLOFF); % Source qlut = qamtable(M_QAM); @@ -102,7 +104,8 @@ 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)); + sym = round(M_QAM*rand(1, length(data_i))+0.5); + X(data_i) = 0.20*qlut(sym); end; % X(c2i(N_fft,65)) = 0.20*qlut(round(M_qam*rand(1, 1)+0.5)); @@ -117,13 +120,15 @@ for k=1:N_frames X(c2i(N_fft, ref_c)) = 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); + if WITH_RCWIN == 1 + xs = [xu(Nu-Ng+1:Nu) xu xu(1:Nt)] .* rcwin; + xs(1:Nt) = xs(1:Nt) + xt(1:Nt); + xt = xs(Ng+Nu+1:Ng+Nu+Nt); + else + xs = [xu(Nu-Ng+1:Nu) xu]; + end; 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; @@ -132,16 +137,12 @@ for k=1:N_frames 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) .* xv; %filter(hlp,1,xv); yv = real(yc) + imag(yc); -xv = xv'; +xv = conj(xv'); yv = yv'; -% Output -figure; -freqz(hlp); - wavwrite(0.9*yv,fa,16,'yv.wav') wavwrite(0.9*[real(xv) imag(xv)],fa,16,'xv.wav')