BER versus SNR for QPSK modulation. I have written following code. But BER not reducing with increasing SNR in case of simulation. Please check the above code and rectify it.
조회 수: 38 (최근 30일)
이전 댓글 표시
My MATLAB code is given as follows:
% Simulate the BER versus SNR curve for QPSK under AWGN communication channel.
% Assignment 3: Problem 1
% Empty workspace and close figures
clc; clearvars; close all;
% SNR in dB: snr_db = 10*log10(snr)
snr_db = -5 : 2 : 25;
% dB to linear scale conversion: snr = 10.^(snr_db/10)
snr = 10.^(snr_db/10);
% Define parameters and different numBits values for simulation
numBits = 1000 ;
numSimulations = 100;
%% Theoretical BER calculation for BPSK
qpsk_ber_theoretical = 2 * erfc(sqrt(snr/2)) - ( erfc(sqrt(snr/2))).^2;
qpsk_ber_simulations = zeros(size(snr_db));
%% Calculate BER for each SNR value
for j = 1:length(snr_db)
% Repeat simulations (as random quantities are involved) for numSimulations times
for sim = 1:numSimulations
% Generate Random Bits (0's and 1's) of size 1XnumBits, and it is a row vector
binaryBits_transmitted = randi([0, 1], 1, numBits);
% Make the binary sequence length a multiple of 2 (pad with zeros if needed)
numPaddingBits = mod(length(binaryBits_transmitted), 2);
if numPaddingBits > 0
binaryBits_transmitted = [binaryBits_transmitted, zeros(1, 2 - numPaddingBits)];
end
% Divide the binary sequence into groups of 2 bits each
qpsk_transmitted = reshape(binaryBits_transmitted,2,[])';
% Map each group of 2 bits to the corresponding QPSK symbol
% Initialize QPSK symbols (complex numbers)
qpsk_symbols = [exp(1i*0), exp(1i*pi/2), exp(1i*pi), exp(1i*3*pi/2)];
% Define the mapping from QPSK symbols to their corresponding 2-bit binary representation
qpsk_mapping = [0 0; 0 1; 1 0; 1 1];
% Map binary groups to the corresponding QPSK symbol
qpsk_modulated = qpsk_symbols (bin2dec(num2str(qpsk_transmitted)) + 1) ;
% Energy per bit = Symbol energy / 2
symbolEnergy = mean(abs(qpsk_modulated).^2);
Energy_bit = symbolEnergy / 2;
% Generate complex Gaussian noise samples
% Relate snr to the noise power (This is very important in this entire code)
Noise_Power = 1 / snr(j); % This holds true as Symbol energy is always 1
gaussian_noise = sqrt(Noise_Power) * (randn(1, numBits/2) + 1i * randn(1, numBits/2));
% Add noise to the QPSK modulated symbols to get noisy received signal
received_symbol = qpsk_modulated + gaussian_noise;
%% QPSK Demodulation with threshold as pi/4 in case of QPSK modulation scheme
% Initialize the decision regions (thresholds) for each quadrant
threshold = pi / 4; % ±45 degrees (±π/4 radians)
% Initialize a variable to store the demodulated symbols
qpsk_demodulated = zeros(1, length(received_symbol));
% Perform QPSK demodulation
for i = 1:length(received_symbol)
% Calculate the phase of the received signal
phase = angle(received_symbol(i));
% Perform threshold-based demodulation
if phase >= -3*threshold && phase < -threshold
qpsk_demodulated(i) = qpsk_symbols(1); % QPSK symbol at 0 degrees
elseif phase >= -threshold && phase < threshold
qpsk_demodulated(i) = qpsk_symbols(2); % QPSK symbol at 90 degrees
elseif phase >= threshold && phase < 3*threshold
qpsk_demodulated(i) = qpsk_symbols(3); % QPSK symbol at 180 degrees
else
qpsk_demodulated(i) = qpsk_symbols(4); % QPSK symbol at 270 degrees
end
end
%% QPSK received symbols using inverse process
qpsk_received = zeros(size(qpsk_demodulated));
% Find the closest QPSK symbol for each demodulated symbol
for i = 1: length(qpsk_demodulated)
% Calculate the distance b/w the demodulated symbol and each QPSK symbol
distances = abs(qpsk_demodulated(i) - qpsk_symbols) ;
% Find the index of the closest QPSK symbol
[~, index] = min(distances);
% Convert the index to its corresponding binary representation
binaryRepresentation = qpsk_mapping(index,:);
% Store the binary representation in the 'originalBinarySymbols' array
qpsk_received(2*i-1 : 2*i) = binaryRepresentation;
end
%% Number of bit errors
ErrorBits = xor( binaryBits_transmitted, qpsk_received);
Number_errorBits = sum(ErrorBits == 1); % bitErrors = sum(binaryBits ~= decodedBits)
Bit_Error_Rate = Number_errorBits / (numBits * 2) ;
% Store the calculated BER for this simulation
qpsk_ber_simulations(j) = qpsk_ber_simulations(j) + Bit_Error_Rate;
end
% Calculate Average Bit error rate for all the simulations for this SNR value and numBits
qpsk_simulation(j) = qpsk_ber_simulations (j) / numSimulations ;
end
%end
disp('binaryBits_transmitted');
disp(binaryBits_transmitted);
disp('qpsk_received');
disp(qpsk_received);
disp('qpsk_ber_simulations');
disp(qpsk_ber_simulations);
disp('qpsk_ber_theoretical');
disp(qpsk_ber_theoretical);
% Plot BER versus SNR curve for different numBits values
figure;
semilogy(snr_db, qpsk_simulation, '*-');
hold on;
semilogy(snr_db, qpsk_ber_theoretical, '*-');
hold on;
xlabel('Signal-to-Noise Ratio (SNR) [dB]');
ylabel('Bit Error Rate (BER)');
title('BER vs. SNR for QPSK Modulation');
legend('Simulation', 'Theoretical'); % Add more legends if needed
grid on;
hold off;
Graph is shown below:
댓글 수: 0
답변 (1개)
vidyesh
2023년 9월 29일
Hi KAGANA SARATH,
I see that you are currently facing a challenge during the simulation of the Bit Error Rate (BER) versus Signal-to-Noise Ratio (SNR) graph for QPSK modulation.
Please note that the ‘angle’ function, used to obtain the phase of the received symbol returns a value within the range of [- π, π].
To get the desired graph, you should modify the conditions within the if-else loop in the "Perform threshold-based demodulation" section as shown.
% Perform threshold-based demodulation
if phase >= -1*threshold && phase <threshold % phase between -45 and 45 degrees
qpsk_demodulated(i) = qpsk_symbols(1); % QPSK symbol at 0 degrees
elseif phase >= threshold && phase <= 3* threshold % phase between 45 and 135 degrees
qpsk_demodulated(i) = qpsk_symbols(2); % QPSK symbol at 90 degrees
elseif phase >=-3*threshold && phase < -1*threshold % phase between -135 and -45 degrees
qpsk_demodulated(i) = qpsk_symbols(4); % QPSK symbol at 270 degrees
else % phase greater thna 135 or lesster than -135 degrees
qpsk_demodulated(i) = qpsk_symbols(3); % QPSK symbol at 180 degrees
end
You can refer to the below documentation for more information on the ‘angle’ function and QPSK.
댓글 수: 0
참고 항목
카테고리
Help Center 및 File Exchange에서 QPSK에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!