From 4b0c3420da32e89da4681ca192982d06a42341b5 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sun, 19 Apr 2015 18:48:26 +0000 Subject: [PATCH] - working TX and RX git-svn-id: http://moon:8086/svn/matlab/trunk@34 801c6759-fa7c-4059-a304-17956f83a07c --- ofdm/ofdm_rx.m | 295 ++++++++++++++++++++++++++++++++++++++++++++----- ofdm/ofdm_tx.m | 284 +++++++++-------------------------------------- 2 files changed, 321 insertions(+), 258 deletions(-) diff --git a/ofdm/ofdm_rx.m b/ofdm/ofdm_rx.m index a17b4d3..58b8cc0 100644 --- a/ofdm/ofdm_rx.m +++ b/ofdm/ofdm_rx.m @@ -1,26 +1,269 @@ -function ofdm_rx(x) - -close all; - -CP_SIZE = 256; -FFT_SIZE = 1024; -fa = 48000; -fo = 0.0; -k_fft = 2*sqrt(FFT_SIZE); - -% Introduce frequency offset -x = 0.5*exp(i*2*pi.*(0:length(x)-1)*fo/fa)' .* x; - -figure; -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 +function [x] = ofdm_rx(filename, foff, knoise_dB, with_cir) +% +% Example: ofdm_rx('drm-15435-if.wav', -174.65, -400, 0) +% Example: ofdm_tx(40, 1) +% ofdm_rx('xv.wav', 0, -400, 0) +% or ofdm_rx('yv.wav', 0, -400, 0) + +drm_mode = 'B'; +drm_bw = '10k'; + +[ofdm_drm_params, ofdm_spec_occ] = drm_params(drm_mode, drm_bw); + +close all; +pre_mix = 0; +Kdown = 4; +fs = 48000/Kdown; +fc = fs/4; +N = 1024/Kdown; +Ng = 256/Kdown; +[carrier_pilot, phi_pilot, mag_pilot] = getRefFreq(drm_mode); +[carrier_time, phi_time, mag_time] = getRefTime(drm_mode); + +h_cir = [0 0 .1 -.2 .5 .2 -.1 0 0 ]; + +close all; + +% Generate signal +[xwav fs_ nbits] = wavread(filename); + +[len ndim] = size(xwav); + +if (ndim == 2) + fprintf('Mode: Baseband\n'); + x = xwav(:, 1) + j*xwav(:, 2); +elseif (ndim == 1) + fprintf('Mode: Passband\n'); + x = xwav.*exp(-j*(2*pi*(0.25-foff/fs_)*(0:len-1)')); + hlp = FIRCalcLowpass(12000/fs_, 33); + x = filter(hlp, 1, x); +else + error('Cannot read file!'); +end +x = x(1:Kdown:length(x)); + +if with_cir + x = filter(h_cir, 1, x); +end +x = x - mean(x); +x = x./max(abs(x)); +xout = [real(x) imag(x)]; +wavwrite(xout,fs,nbits,'ofdm_rx.wav'); + +x = x + sqrt(0.5)*10^(knoise_dB/20)*(randn(size(x)) + j*randn(size(x))); + + +K = fix((length(x)-Ng)/(N+Ng)); + +% Timing coarse +cp_off_ = []; +cp_off = 0; +if 1 + fprintf('Coarse timing estimation\n'); + Z = 0; + for k=1:20 + xp = x((k-1)*(N+Ng)+1:k*(N+Ng)); + [cp_off, Nd, valid, Z] = timing_coarse(xp, N, Ng, Ng, Z); + if (valid) + cp_off_ = [cp_off_ cp_off]; + end + end; + cp_off = round(median(cp_off_)) + Nd = Nd +end + +fdet_coarse_Z = 0; +Z_cfa_pre = 0; +df_i_ = []; +df_ = []; +f_pilots = carrier_pilot'/N*fs +valid_latency_count = 20; +if 1 +fprintf('Coarse integer CFO estimation\n'); +% Integer CFO coarse +for k=1:200 + xp = x((k-1)*(N+Ng)+cp_off+1:k*(N+Ng)+cp_off); + [d_bin, valid, fdet_coarse_Z] = cfo_coarse_int(xp(Ng+1:N+Ng), N, carrier_pilot, 11, fdet_coarse_Z); + if valid + df_i = -d_bin(1)/N*fs; + if valid_latency_count > 0 + valid_latency_count = valid_latency_count - 1; + else + break; + end + end +end; +end + +fprintf('Coarse fractional CFO estimation\n'); +% CFO coarse +df_f_ = []; +for k=1:200 + xp = x((k-1)*(N+Ng)+cp_off+1:k*(N+Ng)+cp_off); + [domega_f, Z_cfa_pre] = cfo_coarse_fract(xp, N, Ng, Ng, Nd, Z_cfa_pre); + df_f_ = [df_f_ domega_f*fs]; +end; +df_coarse = df_i + mean(df_f_(10:200)) +df_coarse_ = df_i + df_f_; + +if pre_mix + x1 = x.*exp(j*(2*pi*df_coarse/fs.*(0:length(x)-1)')); + df_track = 0; +else + x1 = x; + df_track = df_coarse; +end + +% CFO Fine +fprintf('Fine CFO estimation\n'); +fprintf('Receive Symbols\n'); +Xlast = []; +df_fine = 0; +df_fine_ = []; +df_track_ = []; +kn = fs/(2*pi*(1+Ng/N))/N; +x_ = []; +Hp_ = []; +Z_ = []; +phi = 0.0; +bin_track = 1; +sym_pilot = exp(j*2*pi*phi_pilot'/1024); + +bin_pilot = c2i(N, carrier_pilot); +for k=1:K, + xp = x1((k-1)*(N+Ng)+cp_off+1:k*(N+Ng)+cp_off); + xp = xp.*exp(j*(2*pi*df_track/fs*(0:N+Ng-1)' + phi)); + phi = phi + 2*pi*df_track/fs*(N+Ng); + xp = xp(Ng+1:N+Ng); + x_ = [x_' xp']'; + X = fft(xp); + if (~isempty(Xlast)) + Z = Xlast .* conj(X); + df_fine = kn*angle(Z(bin_pilot)); + df_fine_ = [df_fine_ df_fine]; + phi_p = angle(X(bin_pilot)); + mag_p = abs(X(bin_pilot)); + df_track = df_track + 0.1*mean(df_fine(bin_track)); + df_track_ = [df_track_ df_track]; + Hp = X(bin_pilot)./conj(sym_pilot); + Hp_ = [Hp_ Hp]; + Z_ = [Z_ X]; + end + Xlast = X; +end + +df_track = mean(df_track_(10:200)) +mean_df_fine = mean(df_fine_, 2) +mu_Hp = mean(abs(Hp_'))' +sigma_Hp = var(abs(Hp_'))' +SNR_Hp = -10*log10(sigma_Hp)' + +G = (conj(Hp)*1)./(abs(Hp).^2 * 1 + sigma_Hp) +Hp_1 = 1./Hp + +if ~isempty(cp_off_) + figure; + plot(0:length(cp_off_)-1, cp_off_, 0:length(cp_off_)-1, cp_off*ones(size(cp_off_)), 'r-'); grid; title('cp_{off}') +end + +df_track_ = df_track_'; + +figure; +subplot(3, 1, 1) +plot(0:length(df_coarse_)-1, df_coarse_); grid; title('df_{coarse}') + +subplot(3, 1, 2) +plot(0:length(df_track_)-1, df_track_); grid; title('df_{track}') + +subplot(3, 1, 3) +plot(0:length(df_fine_)-1, df_fine_); grid; title('df_{fine}') + +figure; +Z_pilot = Z_(bin_pilot, 200:length(Z_))'; +plot(real(Z_pilot), imag(Z_pilot), '+'); grid; title('SymPilot_{Freq}'); +maxZ = max(max(abs(Z_pilot))); +if (maxZ < 1) + axis([-1 1 -1 1]); +else + axis([-maxZ maxZ -maxZ maxZ]); +end + +%% Detect start of DRM frame +bins = c2i(N, carrier_time); +kc_max = -1000; +n_max = 0; +for n=0:15-1 + frame_timing_Z = 0; + k = 200+n; + for m=1:2 + [kc valid frame_timing_Z] = timing_frame(Z_(bins, k)', bins, 15, frame_timing_Z); + k = k + 15; + end + if valid + if kc > kc_max + n_max = n; + kc_max = kc; + end + end +end +frame_start = n_max; + +figure; +start = 200+frame_start; +Z_timing = Z_(bins, start:15:length(Z_))'; +plot(real(Z_timing), imag(Z_timing), '+'); grid; title('SymPilot_{Time}'); +maxZ = max(max(abs(Z_timing))); +if (maxZ < 1) + axis([-1 1 -1 1]); +else + axis([-maxZ maxZ -maxZ maxZ]); +end + +figure; +% Detect scattered gain pilots +sym_count = 0; +start = 200+frame_start; +H = zeros(N, 1); +sym_H = []; +for k=start:length(Z_) + [carrier_gain, phi_gain, mag_gain] = getRefGain(ofdm_spec_occ, ofdm_drm_params, sym_count); + carrier_gain_bins = c2i(N, carrier_gain); + Hp = Z_(carrier_gain_bins, k)./(mag_gain.*exp(-j*2*pi*phi_gain/1024))'; + H(carrier_gain_bins) = Hp; + sym_count_str = sprintf('%d', sym_count); + if 0 + plot(abs(Hp)); grid; title(sym_count_str); + pause(0.1); + end + + if (sym_count < 14) + sym_count = sym_count+1; + else + H(1:2:N) = H(2:2:length(H)); + if 1 +% G = ones(size(H)); +% G = 1./(H+1e-6); + G = (conj(H)*1)./(abs(H).^2 * 1 + sigma_Hp(1)); + subplot(4, 1, 1) + plot(abs(spec_order(N, H))); grid; title('abs(H)'); + subplot(4, 1, 2) + plot(angle(spec_order(N, H))); grid; title('phi(H)'); + subplot(4, 1, 3) + plot(abs(spec_order(N, G))); grid; title('abs(G)'); + subplot(4, 1, 4) + plot(angle(spec_order(N, G))); grid; title('phi(G)'); + pause(0.01); + + bin = c2i(N, 13); + sym_H = [sym_H Z_(bin, k).*G(bin)]; + end + H_gather = zeros(N, 1); + sym_count = 0; + end; +end + +figure; +plot(real(sym_H'), imag(sym_H'), '+'); grid; title('Sym_{H}'); axis([-2 2 -2 2]); + +function Y = spec_order(N, X) + Y = [X(N/2+1:N)' X(1:N/2)']'; diff --git a/ofdm/ofdm_tx.m b/ofdm/ofdm_tx.m index 3653ab3..a01806b 100644 --- a/ofdm/ofdm_tx.m +++ b/ofdm/ofdm_tx.m @@ -1,16 +1,18 @@ % function ofdm_tx(N_frames) -function [yv xv] = ofdm_tx(N_frames, withData) +function [yv xv] = ofdm_tx(mode, bandwidth, N_frames, withData) close all; +DO_PLOT = 1; WITH_RCWIN = 1; WITH_FREQ_REF = 1; -WITH_TIME_REF = 0; -WITH_GAIN_REF = 0; +WITH_TIME_REF = 1; +WITH_GAIN_REF = 1; WITH_DATA = withData; +DELAY = 100; -M_QAM = 4; -RCWIN_ROLLOFF = 0.1; +M_QAM = 64; +RCWIN_ROLLOFF = 0.125; % Params fa = 48000; @@ -19,78 +21,7 @@ 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('spec', SPEC_OCC_4k5, 'kmin', 2, 'kmax', 102); -ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_5k0) = struct('spec', SPEC_OCC_5k0, 'kmin', 2, 'kmax', 114); -ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_9k0) = struct('spec', SPEC_OCC_9k0, 'kmin', -102, 'kmax', 102); -ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_10k) = struct('spec', SPEC_OCC_10k, 'kmin', -114, 'kmax', 114); -ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_18k) = struct('spec', SPEC_OCC_18k, 'kmin', - 98, 'kmax', 314); -ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_20k) = struct('spec', SPEC_OCC_20k, 'kmin', -110, 'kmax', 350); - -ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_4k5) = struct('spec', SPEC_OCC_4k5, 'kmin', 1, 'kmax', 91); -ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_5k0) = struct('spec', SPEC_OCC_5k0, 'kmin', 1, 'kmax', 103); -ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_9k0) = struct('spec', SPEC_OCC_9k0, 'kmin', - 91, 'kmax', 91); -ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_10k) = struct('spec', SPEC_OCC_10k, 'kmin', -103, 'kmax', 103); -ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_18k) = struct('spec', SPEC_OCC_18k, 'kmin', - 87, 'kmax', 279); -ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_20k) = struct('spec', SPEC_OCC_20k, 'kmin', - 99, 'kmax', 311); - -ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_4k5) = struct('spec', SPEC_OCC_4k5, 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_5k0) = struct('spec', SPEC_OCC_5k0, 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_9k0) = struct('spec', SPEC_OCC_9k0, 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_10k) = struct('spec', SPEC_OCC_10k, 'kmin', - 69, 'kmax', 69); -ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_18k) = struct('spec', SPEC_OCC_18k, 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_20k) = struct('spec', SPEC_OCC_20k, 'kmin', - 67, 'kmax', 213); - -ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_4k5) = struct('spec', SPEC_OCC_4k5, 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_5k0) = struct('spec', SPEC_OCC_5k0, 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_9k0) = struct('spec', SPEC_OCC_9k0, 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_10k) = struct('spec', SPEC_OCC_10k, 'kmin', - 44, 'kmax', 44); -ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_18k) = struct('spec', SPEC_OCC_18k, 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_20k) = struct('spec', SPEC_OCC_20k, 'kmin', - 43, 'kmax', 135); - -ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_4k5) = struct('spec', SPEC_OCC_4k5, 'kmin', -106, 'kmax', 106); -ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_5k0) = struct('spec', SPEC_OCC_5k0, 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_9k0) = struct('spec', SPEC_OCC_9k0, 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_10k) = struct('spec', SPEC_OCC_10k, 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_18k) = struct('spec', SPEC_OCC_18k, 'kmin', 0, 'kmax', 0); -ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_20k) = struct('spec', SPEC_OCC_20k, 'kmin', 0, 'kmax', 0); - -W1024{DRM_MODE_A,:,:} = [228 341 455; 455 569 683; 683 796 910; 910 0 114; 114 228 341]; -W1024{DRM_MODE_B,:,:} = [512 0 512 0 512; 0 512 0 512 0; 512 0 512 0 512]; -W1024{DRM_MODE_C,:,:} = [465 372 279 186 93 0 931 838 745 652; 931 838 745 652 559 465 372 279 186 93]; -W1024{DRM_MODE_D,:,:} = [366 439 512 585 658 731 805 878; 731 805 878 951 0 73 146 219; 73 146 219 293 366 439 512 585]; -W1024{DRM_MODE_E,:,:} = []; -Z1024{DRM_MODE_A,:,:} = [0 81 248; 18 106 106; 122 116 31; 129 129 39; 33 32 111]; -Z1024{DRM_MODE_B,:,:} = [0 57 164 64 12; 168 255 161 106 118; 25 232 132 233 38]; -Z1024{DRM_MODE_C,:,:} = [0 76 29 76 9 190 161 248 33 108; 179 178 83 253 127 105 101 198 250 145]; -Z1024{DRM_MODE_D,:,:} = [0 240 17 60 220 38 151 101; 110 70 78 82 175 150 106 25; 165 7 252 124 253 177 197 142]; -Z1024{DRM_MODE_E,:,:} = []; -Q1024{DRM_MODE_A,:,:} = [36]; -Q1024{DRM_MODE_B,:,:} = [12]; -Q1024{DRM_MODE_C,:,:} = [12]; -Q1024{DRM_MODE_D,:,:} = [14]; -Q1024{DRM_MODE_E,:,:} = []; - -ofdm_params_drm(DRM_MODE_A) = struct('mode', 'MODE_A', 'nu', 288, 'ng', 32, 'nspf', 15, 'W', W1024(DRM_MODE_A), 'Z', Z1024(DRM_MODE_A), 'Q', Q1024(DRM_MODE_A)); -ofdm_params_drm(DRM_MODE_B) = struct('mode', 'MODE_B', 'nu', 256, 'ng', 64, 'nspf', 15, 'W', W1024(DRM_MODE_B), 'Z', Z1024(DRM_MODE_B), 'Q', Q1024(DRM_MODE_B)); -ofdm_params_drm(DRM_MODE_C) = struct('mode', 'MODE_C', 'nu', 176, 'ng', 64, 'nspf', 20, 'W', W1024(DRM_MODE_C), 'Z', Z1024(DRM_MODE_C), 'Q', Q1024(DRM_MODE_C)); -ofdm_params_drm(DRM_MODE_D) = struct('mode', 'MODE_D', 'nu', 112, 'ng', 88, 'nspf', 24, 'W', W1024(DRM_MODE_D), 'Z', Z1024(DRM_MODE_D), 'Q', Q1024(DRM_MODE_D)); -ofdm_params_drm(DRM_MODE_E) = struct('mode', 'MODE_E', 'nu', 27, 'ng', 3, 'nspf', 40, 'W', W1024(DRM_MODE_E), 'Z', Z1024(DRM_MODE_E), 'Q', Q1024(DRM_MODE_E)); - -ofdm_params = ofdm_params_drm(DRM_MODE_B); -ofdm_spec_occ = ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_10k); +[ofdm_params, ofdm_spec_occ] = drm_params(mode, bandwidth); ofdm_params_mode = ofdm_params.mode ofdm_spec_occ_kmin = ofdm_spec_occ.kmin @@ -101,202 +32,91 @@ Tu = ofdm_params.nu * T Tg = ofdm_params.ng * T Ts = Tu+Tg Ng = round(Tg*fa) -Nu = round(Tu*fa) +N = round(Tu*fa) Ns = round(Ts*fa) -N_fft = Nu -SubCarrierspacing_HZ = fa/N_fft +SubCarrierspacing_HZ = fa/N % TX window -[rcwin Nt] = txwin_eval(Nu, Ng, RCWIN_ROLLOFF); +[rcwin Nt wng] = txwin_eval(N, Ng, RCWIN_ROLLOFF); +Nt = Nt % Source qlut = qamtable(M_QAM); -k_fft = sqrt(N_fft); -xv = []; +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 -figure; for k=1:N_frames - for s=0:ofdm_params.nspf-1, + for sym_count=0:ofdm_params.nspf-1, - X = zeros(N_fft,1); + X = zeros(N,1); % Data if WITH_DATA == 1 - data_i = c2i(N_fft, ofdm_spec_occ.kmin:1:ofdm_spec_occ.kmax); + 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) = 0.20*qlut(sym); + X(data_i) = qlut(sym); end; if WITH_FREQ_REF == 1 [ref_c ref_p ref_a] = getRefFreq(ofdm_params.mode); - X(c2i(N_fft, ref_c)) = 0.20*ref_a.*(exp(2*pi*i*ref_p/1024)); + bins = c2i(N, ref_c); + X(bins) = ref_a.*(exp(2*pi*i*ref_p/1024)); end; - if (s==0) & (WITH_TIME_REF == 1) + if (sym_count==0) & (WITH_TIME_REF == 1) [ref_c ref_p ref_a] = getRefTime(ofdm_params.mode); - X(c2i(N_fft, ref_c)) = 0.20*ref_a.*(exp(2*pi*i*ref_p/1024)); + bins = c2i(N, ref_c); + X(bins) = ref_a.*(exp(2*pi*i*ref_p/1024)); end; if WITH_GAIN_REF == 1 - [ref_c ref_p ref_a] = getRefGain(ofdm_spec_occ, ofdm_params, s); - X(c2i(N_fft, ref_c)) = 0.20*ref_a.*(exp(2*pi*i*ref_p/1024)); + [ref_c ref_p ref_a] = getRefGain(ofdm_spec_occ, ofdm_params, sym_count); + X(c2i(N, ref_c)) = ref_a.*(exp(2*pi*i*ref_p/1024)); end; % Modulate - xu = k_fft*ifft(X, N_fft)'; + xu = conj(k_fft*ifft(X, N)'); 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); + 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(Nu-Ng+1:Nu) xu]; + xs = [xu(N-Ng+1:N) xu]; end; - xv = [xv xs(1:Ng+Nu)]; - Xs = fft(xs(Ng+1:Ng+Nu), N_fft)/k_fft; - plot(0:N_fft-1, abs(Xs(1:N_fft)), '-*'); grid; - pause (0.001); + xv = [xv xs(1:Ng+N)]; + + if (DO_PLOT == 1) + Xs = fft(xs(Ng+1:Ng+N), N)/k_fft; + plot(0:N-1, abs(Xs(1:N)), '-*'); grid; + pause(0.01); + end end; end; +hold off; +grid; + +plot(wng); grid; % Modulate on carrier -yc = 0.5*exp(j*2*pi.*(0:length(xv)-1)*fc/fa) .* xv; +yc = exp(j*2*pi.*(0:length(xv)-1)*fc/fa) .* xv; yv = real(yc) + imag(yc); -xv = conj(xv'); -yv = yv'; +xv = conj(xv')./abs(max(xv)); +yv = yv'./max(yv); 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, N_fft) + 1; - -function [ref_c ref_p ref_a] = getRefFreq(drmMode) - -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 'MODE_A' - ref_c = ref_A_c; - ref_p = ref_A_p; - ref_a = ref_A_a; - - case 'MODE_B' - ref_c = ref_B_c; - ref_p = ref_B_p; - ref_a = ref_B_a; - - case 'MODE_C' - ref_c = ref_C_c; - ref_p = ref_C_p; - ref_a = ref_C_a; - - case 'MODE_D' - ref_c = ref_D_c; - ref_p = ref_D_p; - ref_a = ref_D_a; - - case 'MODE_E' - ref_c = ref_E_c; - ref_p = ref_E_p; - ref_a = ref_E_a; -end; - -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]; -ref_B_a = sqrt(2)*ones(1,16); - -switch drmMode - case 'MODE_A' - ref_c = []; - ref_p = []; - ref_a = []; - - case 'MODE_B' - ref_c = ref_B_c; - ref_p = ref_B_p; - ref_a = ref_B_a; - - case 'MODE_C' - ref_c = []; - ref_p = []; - ref_a = []; - - case 'MODE_D' - ref_c = []; - ref_p = []; - ref_a = []; - - case 'MODE_E' - ref_c = []; - ref_p = []; - ref_a = []; -end; - -function [ref_c ref_p ref_a] = getRefGain(spec_occ, ofdm_params, s) - -switch ofdm_params.mode - case 'MODE_A' - ref_c = []; - ref_p = []; - ref_a = []; - - case 'MODE_B' - k0 = 1; - x = 2; - y = 3; - k = (spec_occ.kmin:1:spec_occ.kmax); - ref_c = 1 + 2*mod(s,3)+6*k; - ref_c(find(ref_c > spec_occ.kmax)) = []; - ref_c(find(ref_c < spec_occ.kmin)) = []; - n = mod(s, y); - m = floor(s/y); - p = (ref_c - k0 - n*x)/(x*y); - ref_p = mod(4*ofdm_params.Z(n+1,m+1) + p*ofdm_params.W(n+1,m+1) + p.*p*(1+s)*ofdm_params.Q, 1024); - ref_a = sqrt(2)*ones(1,length(ref_c)); - - case 'MODE_C' - ref_c = []; - ref_p = []; - ref_a = []; - - case 'MODE_D' - ref_c = []; - ref_p = []; - ref_a = []; - - case 'MODE_E' - ref_c = []; - ref_p = []; - ref_a = []; -end; -