Files
matlab/ofdm/ofdm_tx.m
T
jens 65fc129d88 - TX: process data at symbol rate
- RX: removed kdown stuff (hardcode to 4), fixed redundant down sampling for base band processing

git-svn-id: http://moon:8086/svn/matlab/trunk@37 801c6759-fa7c-4059-a304-17956f83a07c
2015-04-19 20:06:40 +00:00

123 lines
2.7 KiB
Matlab

% function ofdm_tx(N_frames)
function [yv xv] = ofdm_tx(mode, bandwidth, N_frames, withData)
close all;
DO_PLOT = 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
for k=1:N_frames
for sym_count=0:ofdm_params.nspf-1,
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_FREQ_REF == 1
[ref_c ref_p ref_a] = getRefFreq(ofdm_params.mode);
bins = c2i(N, ref_c);
X(bins) = ref_a.*(exp(2*pi*i*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(2*pi*i*ref_p/1024));
end;
if WITH_GAIN_REF == 1
[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 = conj(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 = 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
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 = conj(xv')./abs(max(xv));
yv = yv'./max(yv);
wavwrite(0.9*yv,4*fa,16,'yv.wav')
wavwrite(0.9*[real(xv) imag(xv)],fa,16,'xv.wav')