WHY IS MY BER CURVE NOT RIGHT? (QPSK)
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
folks!!
I have a problem. This is my code but I don't know where I can be wrong. my BER curve is not correct nor does it look like the theoretical curve.
Can someone help me?
follow the code:
clear all;
close all;
clc;
% Número de bits
N=10000;
% Número máximo de iterações para um único SNR
max_run=20;
% Bit de energia
Eb=1;
% Relação Sinal-Ruído (em dB)
SNRdB=0:1:9;
SNR=10.^(SNRdB/10);
% Cria caixa de diálogo da barra de espera
hand=waitbar(0,'Please Wait....');
% Início do loop para SNR diferente
for count=1:length(SNR)
% erro médio
avgError=0;
% Calcule a potência de ruído do SNR
No=Eb/SNR(count);
% Início do loop para diferentes execuções
for run_time=1:max_run
waitbar((((count-1)*max_run)+run_time-1)/(length(SNRdB)*max_run));
% erro inicial
Error=0;
% 1 ou -1 para sinal em fase
x_inp_I=sign(rand(1,N)- 0.5);
% 1 ou -1 para sinal de quadratura
x_inp_Q=sign(rand(1,N)- 0.5);
% Gera bits de marca d'água aleatórios
Bit_wat = randi([0 1],1,N);
% Ângulo da marca d'água
Theta = pi/12;
% loop para identificar bit com a marca d'água
for k = 1:N
if Bit_wat(k)==1
Bit_enviado(k) = x_inp_I(k)*(cos(Theta)+sin(Theta))+ 1i*x_inp_Q(k)*(cos(Theta)-sin(Theta));
else
Bit_enviado(k) = x_inp_I(k)*(cos(Theta)-sin(Theta))+ 1i*x_inp_Q(k)*(cos(Theta)+sin(Theta));
end
end
noise=1/sqrt(2)*[randn(1,N) + 1i*randn(1,N)];
% Adicionando sinal ruído ao bit enviado
Y= Bit_enviado + noise;
y_re = real(Y); % real
y_im = imag(Y); % imaginary
% Dispositivo de decisão tomando decisões difíceis e erro de decodificação
for m=1:N
if sign(real(Bit_enviado(m)))==sign(real(Y(m))) && sign(imag(Bit_enviado(m)))==sign(imag(Y(m)))
Error = Error + 0;
elseif sign(real(Bit_enviado(m)))~=sign(real(Y(m))) && sign(imag(Bit_enviado(m)))~=sign(imag(Y(m)))
Error= Error + 1;
elseif sign(real(Bit_enviado(m)))~=sign(real(Y(m))) && sign(imag(Bit_enviado(m)))==sign(imag(Y(m)))
Error= Error + 1;
else
Error= Error + 2;
end
end
% Calcular erro/bit
Error=Error/N;
% Calcular erro / bit para diferentes execuções
avgError=avgError+Error;
% Término do loop para diferentes execuções
end
% Calcule BER para um SNR particular
BER_sim(count)=avgError/max_run;
% Término do loop para SNR diferente
end
% Calcular BER analítico
BER_th=(1/2)*erfc(sqrt(SNR));
close(hand);
%Plot BER
semilogy(SNRdB,BER_th,'b.-');
hold on
semilogy(SNRdB,BER_sim,'mx-');
hold on
legend('Teórica','Simulada');
axis([min(SNRdB) max(SNRdB) 10^(-5) 1]);
xlabel('Eb/No, dB');
ylabel('Bit Error Rate');
title('Curva De Probabilidade De Erro De Bit Para Modulação BPSK ');
hold on
grid on
0 Kommentare
Antworten (0)
Siehe auch
Kategorien
Mehr zu QPSK finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!