RENEWLab
1.1.0
RENEW project
|
Functions | |
1/sqrt(2 | modvec_bpsk () |
mod_fcn_16qam, tx_data | arrayfun () |
otherwise | fprintf ('Invalid MOD_ORDER(%d)! Must be in[2, 4, 16, 64]\n', MOD_ORDER) |
CN (0, nvar) | |
switch (MOD_ORDER) case 2 % BPSK rx_data | |
Variables | |
function | berr_th |
tx_data = randi(MOD_ORDER, N_DATA_SYMS, 1) - 1 | |
modvec_16qam = (1/sqrt(10)) .* [-3 -1 +3 +1] | |
modvec_64qam = (1/sqrt(42)) .* [-7 -5 -1 -3 +7 +5 +1 +3] | |
mod_fcn_bpsk = @(x) complex(modvec_bpsk(1+x),0) | |
mod_fcn_qpsk = @(x) complex(modvec_bpsk(1+bitshift(x, -1)), modvec_bpsk(1+mod(x, 2))) | |
mod_fcn_16qam = @(x) complex(modvec_16qam(1+bitshift(x, -2)), modvec_16qam(1+mod(x,4))) | |
mod_fcn_64qam = @(x) complex(modvec_64qam(1+bitshift(x, -3)), modvec_64qam(1+mod(x,8))) | |
Map the data values on to complex symbols switch MOD_ORDER case BPSK | tx_syms = arrayfun(mod_fcn_bpsk, tx_data) |
return | |
end Create channel if | awgn |
h = sqrt(hvar/2).*(randn(N_DATA_SYMS, N_ANT) + 1i*randn(N_DATA_SYMS, N_ANT)) | |
end Add noise | nvar = 1/ 10^(0.1*snr) |
w = sqrt(nvar/2).*(randn(N_DATA_SYMS,1) + 1i*randn(N_DATA_SYMS,1)) | |
rx_syms = h.*tx_syms + w | |
Equalize with *known * | channel |
Demodulate | demod_fcn_bpsk = @(x) double(real(x)>0) |
demod_fcn_qpsk = @(x) double(2*(real(x)>0) + 1*(imag(x)>0)) | |
demod_fcn_16qam = @(x) (8*(real(x)>0)) + (4*(abs(real(x))<0.6325)) + (2*(imag(x)>0)) + (1*(abs(imag(x))<0.6325)) | |
demod_fcn_64qam | |
case QPSK | rx_data = arrayfun(demod_fcn_qpsk, syms_eq) |
end Error rates | nbits = N_DATA_SYMS * log2(MOD_ORDER) |
bit_errs = length(find(dec2bin(bitxor(tx_data, rx_data),8) == '1')) | |
|
virtual |
CN | ( | 0 | , |
nvar | |||
) |
|
virtual |
switch | ( | MOD_ORDER | ) |
berr_th |
Equalize with* known* channel |
demod_fcn_16qam = @(x) (8*(real(x)>0)) + (4*(abs(real(x))<0.6325)) + (2*(imag(x)>0)) + (1*(abs(imag(x))<0.6325)) |
demod_fcn_64qam |
else h = sqrt(hvar/2).*(randn(N_DATA_SYMS, N_ANT) + 1i*randn(N_DATA_SYMS, N_ANT)) |
mod_fcn_16qam = @(x) complex(modvec_16qam(1+bitshift(x, -2)), modvec_16qam(1+mod(x,4))) |
mod_fcn_64qam = @(x) complex(modvec_64qam(1+bitshift(x, -3)), modvec_64qam(1+mod(x,8))) |
mod_fcn_bpsk = @(x) complex(modvec_bpsk(1+x),0) |
mod_fcn_qpsk = @(x) complex(modvec_bpsk(1+bitshift(x, -1)), modvec_bpsk(1+mod(x, 2))) |
modvec_16qam = (1/sqrt(10)) .* [-3 -1 +3 +1] |
modvec_64qam = (1/sqrt(42)) .* [-7 -5 -1 -3 +7 +5 +1 +3] |
end Error rates nbits = N_DATA_SYMS * log2(MOD_ORDER) |
return |
case QPSK rx_data = arrayfun(demod_fcn_qpsk, syms_eq) |
tx_data = randi(MOD_ORDER, N_DATA_SYMS, 1) - 1 |
case QPSK tx_syms = arrayfun(mod_fcn_bpsk, tx_data) |
w = sqrt(nvar/2).*(randn(N_DATA_SYMS,1) + 1i*randn(N_DATA_SYMS,1)) |