- added show_H command line switch [TX] - added M_QAM command line switch git-svn-id: http://moon:8086/svn/matlab/trunk@51 801c6759-fa7c-4059-a304-17956f83a07c
130 lines
3.0 KiB
Matlab
130 lines
3.0 KiB
Matlab
function [yv xv] = ofdm_tx(mode, bandwidth, N_frames, withData, M_QAM, plot_speed)
|
|
%
|
|
% function [yv xv] = ofdm_tx(mode, bandwidth, N_frames, withData, M_QAM, plot_speed)
|
|
% Example : ofdm_tx('B', '10k', 500, 1, 64, 0);
|
|
%
|
|
|
|
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;
|
|
|
|
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')
|
|
|