Files
matlab/ofdm/ofdm_tx.m
T
jens b6e651271f - scaling of y prior wavwrite
git-svn-id: http://moon:8086/svn/matlab/trunk@46 801c6759-fa7c-4059-a304-17956f83a07c
2015-04-30 19:40:29 +00:00

128 lines
2.9 KiB
Matlab

% function ofdm_tx(N_frames)
function [yv xv] = ofdm_tx(mode, bandwidth, N_frames, withData, plot_speed)
close all;
DO_PLOT = (plot_speed > 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
sym_count = 0;
for k=1:N_frames
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_GAIN_REF == 1
[ref_c ref_p ref_a] = getRefGain(ofdm_params, ofdm_spec_occ, sym_count);
bins = c2i(N, ref_c);
X(bins) = ref_a.*(exp(j*2*pi*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(j*2*pi*ref_p/1024));
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(j*2*pi*ref_p/1024));
end;
X(c2i(N, 0)) = 0;
% Modulate
xu = 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 = fftshift(fft(xs(Ng+1:Ng+N), N)/k_fft);
Xs = fftshift(X);
subplot(2, 1, 1)
plot(0:N-1, abs(Xs(1:N)), '-*'); grid; axis([0 N-1 0 3.0]);
subplot(2, 1, 2)
plot(0:N-1, angle(Xs(1:N)), '-*'); grid; axis([0 N-1 -2*pi 2*pi]);
pause(plot_speed);
end
sym_count = mod(sym_count+1, ofdm_params.nspf);
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 = xv.' ./abs(max(xv));
yv = yv'./max(yv);
wavwrite(0.8*yv,4*fa,16,'yv.wav')
wavwrite(0.8*[real(xv) imag(xv)],fa,16,'xv.wav')