Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- num_bits = 1e6;
- num_symb = num_bits / 2;
- symb_energy = 1;
- A_qpsk = sqrt(symb_energy);
- A_zero = sqrt(4/3*symb_energy);
- qpsk_alphabet = zeros(4, 1);
- qpsk_alphabet(1) = A_qpsk * exp(1i*pi/4);
- qpsk_alphabet(2) = A_qpsk * exp(1i*3*pi/4);
- qpsk_alphabet(3) = A_qpsk * exp(1i*5*pi/4);
- qpsk_alphabet(4) = A_qpsk * exp(1i*7*pi/4);
- zero_alphabet = zeros(4, 1);
- zero_alphabet(1) = 0;
- zero_alphabet(2) = A_zero;
- zero_alphabet(3) = A_zero * exp(1i*2*pi/3);
- zero_alphabet(4) = A_zero * exp(1i*4*pi/3);
- symbols = randi(4, num_symb, 1);
- qpsk_sig = zeros(num_symb, 1);
- zero_sig = zeros(num_symb, 1);
- snr_vec = 0:30; % in dB;
- serr_vec_qpsk = zeros(size(snr_vec));
- serr_vec_zero = zeros(size(snr_vec));
- % Map
- for k=1:num_symb
- qpsk_sig(k) = qpsk_alphabet(symbols(k));
- zero_sig(k) = zero_alphabet(symbols(k));
- end
- % plot(real(qpsk_sig), imag(qpsk_sig), '.');
- % hold on;
- % plot(real(zero_sig), imag(zero_sig), '.');
- % grid on;
- % xlim([-1.5 1.5]);
- % ylim([-1.5 1.5]);
- for six = 1:numel(snr_vec)
- % Add noise
- snr = snr_vec(six);
- noise_energy = symb_energy * 10^(-snr/10);
- noise = sqrt(noise_energy/2) .* (randn(num_symb, 1) + 1i*randn(num_symb, 1));
- qpsk_sig_rx = qpsk_sig + noise;
- zero_sig_rx = zero_sig + noise;
- % figure;
- % plot(real(qpsk_sig_rx), imag(qpsk_sig_rx), '.');
- % hold on;
- % plot(real(zero_sig_rx), imag(zero_sig_rx), '.');
- % grid on;
- % xlim([-1.5 1.5]);
- % ylim([-1.5 1.5]);
- % Demap
- symbols_qpsk_rx = zeros(size(symbols));
- symbols_zero_rx = zeros(size(symbols));
- for k=1:num_symb
- qdist = abs(qpsk_sig_rx(k).*ones(4, 1) - qpsk_alphabet).^2;
- [~, ix] = min(qdist);
- symbols_qpsk_rx(k) = ix;
- zdist = abs(zero_sig_rx(k).*ones(4, 1) - zero_alphabet).^2;
- [~, ix] = min(zdist);
- symbols_zero_rx(k) = ix;
- end
- num_serr_qpsk = sum( symbols ~= symbols_qpsk_rx );
- num_serr_zero = sum( symbols ~= symbols_zero_rx );
- serr_rate_qpsk = num_serr_qpsk / num_symb;
- serr_rate_zero = num_serr_zero / num_symb;
- serr_vec_qpsk(six) = serr_rate_qpsk;
- serr_vec_zero(six) = serr_rate_zero;
- fprintf('%d dB: QPSK/ZERO: %f / %f\n', snr, serr_rate_qpsk, serr_rate_zero);
- end
- figure;
- semilogy(snr_vec, serr_vec_qpsk);
- hold on;
- semilogy(snr_vec, serr_vec_zero);
- legend('QPSK', 'Proposed');
- grid on;
- ylabel('symbol error rate');
- xlabel('SNR in dB');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement