|
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)) |