- fixed zero pilot after FFT

- added FFT evaluation
- cleaned up

git-svn-id: http://moon:8086/svn/matlab/trunk@4 801c6759-fa7c-4059-a304-17956f83a07c
This commit is contained in:
2014-07-27 08:19:29 +00:00
parent 2a04c6b44c
commit 2e49c862b8
+32 -36
View File
@@ -1,9 +1,13 @@
% function ofdm_tx(N_frames) % function ofdm_tx(N_frames)
function [yv xv] = ofdm_tx(N_frames) function [yv xv] = ofdm_tx(N_frames)
WITH_DATA = 0; close all;
M_QAM = 4;
RC_ROLLOFF = 0.1;
WITH_DATA = 1;
WITH_FREQ_REF = 1; WITH_FREQ_REF = 1;
WITH_TIME_REF = 1; WITH_TIME_REF = 0;
% Params % Params
fa = 48000; fa = 48000;
@@ -69,9 +73,6 @@ ofdm_params_drm(DRM_MODE_E) = struct('nu', 27, 'ng', 3, 'nspf', 40);
ofdm_params = ofdm_params_drm(DRM_MODE_B) ofdm_params = ofdm_params_drm(DRM_MODE_B)
ofdm_spec_occ = ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_10k) 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; T = 4/fa;
Tu = ofdm_params.nu * T Tu = ofdm_params.nu * T
Tg = ofdm_params.ng * T Tg = ofdm_params.ng * T
@@ -83,22 +84,16 @@ N_fft = Nu
SubCarrierspacing_HZ = fa/N_fft SubCarrierspacing_HZ = fa/N_fft
% TX window % TX window
[txwin Nt] = txwin_eval(Nu, Ng, 0.05); [txwin Nt] = txwin_eval(Nu, Ng, RC_ROLLOFF);
% Source % Source
qlut = qamtable(M_qam); 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); k_fft = 2*sqrt(N_fft);
xv = []; xv = [];
xt = zeros(1, Nt); xt = zeros(1, Nt);
figure;
for k=1:N_frames for k=1:N_frames
for s=0:ofdm_params.nspf-1, for s=0:ofdm_params.nspf-1,
@@ -107,19 +102,19 @@ for k=1:N_frames
% Data % Data
if WITH_DATA == 1 if WITH_DATA == 1
data_i = c2i(N_fft, ofdm_spec_occ.kmin:1:ofdm_spec_occ.kmax); 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)); X(data_i) = 0.20*qlut(round(M_QAM*rand(1, length(data_i))+0.5));
end; end;
% X(78) = 0.20*qlut(round(M_qam*rand(1, 1)+0.5)); % X(c2i(N_fft,65)) = 0.20*qlut(round(M_qam*rand(1, 1)+0.5));
if WITH_FREQ_REF == 1 if WITH_FREQ_REF == 1
[ref_i ref_p ref_a] = getRefFreq(N_fft, DRM_MODE_B, s); [ref_c ref_p ref_a] = getRefFreq(DRM_MODE_B, s);
X(ref_i) = 0.20*ref_a.*exp(-2*pi*i*ref_p/1024); X(c2i(N_fft, ref_c)) = 0.20*ref_a.*(exp(2*pi*i*ref_p/1024));
end; end;
if (s==0) & (WITH_TIME_REF == 1) if (s==0) & (WITH_TIME_REF == 1)
[ref_i ref_p ref_a] = getRefTime(N_fft, DRM_MODE_B); [ref_c ref_p ref_a] = getRefTime(DRM_MODE_B);
X(ref_i) = 0.20*ref_a.*exp(-2*pi*i*ref_p/1024); X(c2i(N_fft, ref_c)) = 0.20*ref_a.*(exp(2*pi*i*ref_p/1024));
end; end;
% X(1) = 0.2; % X(1) = 0.2;
@@ -130,19 +125,20 @@ for k=1:N_frames
xs(1:Nt) = xs(1:Nt) + xt(1:Nt); xs(1:Nt) = xs(1:Nt) + xt(1:Nt);
xt = xs(Ng+Nu+1:Ng+Nu+Nt); xt = xs(Ng+Nu+1:Ng+Nu+Nt);
xv = [xv xs(1:Ng+Nu)]; 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;
pause (0.001);
end; end;
end; end;
% Modulate on carrier % 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) .* filter(hlp,1,xv);
yv = real(yc) + imag(yc); yv = real(yc) + imag(yc);
xv = xv'; xv = xv';
yv = yv'; yv = yv';
% Output % Output
close all;
figure; figure;
freqz(hlp); freqz(hlp);
@@ -153,9 +149,9 @@ function index = c2i(N_fft, carriers)
ri = []; ri = [];
ri = [ri find(carriers == 0)]; ri = [ri find(carriers == 0)];
carriers(ri) = []; carriers(ri) = [];
index = mod(carriers, 1024) + 1; index = mod(-carriers, 1024) + 1;
function [ref_i ref_p ref_a] = getRefFreq(N_fft, drmMode, s) function [ref_c ref_p ref_a] = getRefFreq(drmMode, s)
ref_A_c = [18 54 72]; ref_A_c = [18 54 72];
ref_A_p = [205 836 215]; ref_A_p = [205 836 215];
@@ -180,32 +176,32 @@ ref_E_a = [];
switch drmMode switch drmMode
case 1 case 1
ref_i = c2i(N_fft, ref_A_c); ref_c = ref_A_c;
ref_p = ref_A_p; ref_p = ref_A_p;
ref_a = ref_A_a; ref_a = ref_A_a;
case 2 case 2
ref_i = c2i(N_fft, ref_B_c); ref_c = ref_B_c;
ref_p = ref_B_p; ref_p = ref_B_p;
ref_a = ref_B_a; ref_a = ref_B_a;
case 3 case 3
ref_i = c2i(N_fft, ref_C_c); ref_c = ref_C_c;
ref_p = ref_C_p; ref_p = ref_C_p;
ref_a = ref_C_a; ref_a = ref_C_a;
case 4 case 4
ref_i = c2i(N_fft, ref_D_c); ref_c = ref_D_c;
ref_p = ref_D_p; ref_p = ref_D_p;
ref_a = ref_D_a; ref_a = ref_D_a;
case 5 case 5
ref_i = c2i(N_fft, ref_E_c); ref_c = ref_E_c;
ref_p = ref_E_p; ref_p = ref_E_p;
ref_a = ref_E_a; ref_a = ref_E_a;
end; end;
function [ref_i ref_p ref_a] = getRefTime(N_fft, drmMode) 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_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_p = [304 108 620 192 704 44 432 588 844 651 651 460 460 944 940 428];
@@ -213,27 +209,27 @@ ref_B_a = sqrt(2)*ones(1,16);
switch drmMode switch drmMode
case 1 case 1
ref_i = []; ref_c = [];
ref_p = []; ref_p = [];
ref_a = []; ref_a = [];
case 2 case 2
ref_i = c2i(N_fft, ref_B_c); ref_c = ref_B_c;
ref_p = ref_B_p; ref_p = ref_B_p;
ref_a = ref_B_a; ref_a = ref_B_a;
case 3 case 3
ref_i = []; ref_c = [];
ref_p = []; ref_p = [];
ref_a = []; ref_a = [];
case 4 case 4
ref_i = []; ref_c = [];
ref_p = []; ref_p = [];
ref_a = []; ref_a = [];
case 5 case 5
ref_i = []; ref_c = [];
ref_p = []; ref_p = [];
ref_a = []; ref_a = [];
end; end;