quarta-feira, 1 de junho de 2022

Comparação entre as modulações 8-PSK e 8-QAM

 


A constelação 8-QAM pode ser gerada pela sobreposição de duas modulações 4-PSK com energias diferentes e com uma rotação de 45 graus entre elas.  Na figura acima, as modulações 8-PSK e 8-QAM possuem a mesma energia média. Usando o código Scilab abaixo, é mostrado que a modulação 8-QAM possui melhor desempenho que a modulação 8-PSK. Desempenho em termos de taxa de erro de símbolo em função da relação sinal-ruído:

Código:

clc; close(winsid());

function dd=decide(cc, pk); 
    nf = max(size(pk));
    dd = 0*pk;
    for k=1:nf
        dist = abs(cc-pk(k));
        [aa,bb] = min(dist);
        dd(k) = cc(bb);
    end
    //disp([aa,bb,dist]);
endfunction

//// 8-PSK
k=0:7;
cpsk = exp(%i*k*%pi/4);
subplot(2,2,1); title('8-PSK');
plot(1.01*real(cpsk),1.01*imag(cpsk),'*'); 

N = 4*8*1000;
s = sign(rand(1,N,'n')) + 2*sign(rand(1,N,'n'));
s = s + 4*sign(rand(1,N,'n'));
s = (s + 7)/2;

spsk = exp(%i*s*%pi/4);
subplot(2,2,2); plot(1.01*real(spsk),1.01*imag(spsk),'*'); 

nn = rand(1,N,'n') + %i*rand(1,N,'n');
nn = nn - mean(nn);
nn = nn/sqrt(variance(nn));

ruido = 0.1*nn;
spskr = spsk + ruido;
subplot(2,2,3); plot(1.01*real(spskr),1.01*imag(spskr),'*'); 
plot(1.01*real(spsk),1.01*imag(spsk),'oy'); 

//// 8-QAM:
a  = 0.6501152;
b = sqrt(2-a*a);
disp([a,b]);
raio = a;
f = 0;
sqam = 0*spsk;
k=0:3;
cqam = [a*exp(%i*k*%pi/2), b*exp(%i*((k)*%pi/2 + %pi/4))];
for k=1:N
    if s(k)<4 then raio = a; f = 0; end;
    if s(k)>3 then raio = b; f = %pi/4; end;
    tt = sign(rand(1,1,'n')) + 2*sign(rand(1,1,'n'));
    tt = tt + 3;
    tt = tt/2;
    sqam(k) = raio*exp(%i*(tt*%pi/2 + f));
end
sqamr = sqam + ruido;
subplot(2,2,4); plot(real(sqamr),imag(sqamr),'*');
plot(real(cqam),imag(cqam),'oy');

a=0.4:0.01:0.85;
b=sqrt(2-a.*a);
da = a*sqrt(2);
dx = sqrt(b.*b + a.*a - sqrt(2)*a.*b);
figure; plot(a,da,a,dx,'m'); xgrid;
legend('da','dx');

////////////////
figure;
txq = [];
txp = [];
snrdb = [];
for snr = 0:16
    snrdb = [snrdb, snr];
   A = sqrt(10^(-snr/10)); 
   ruido = A*nn;
   Pn = variance(ruido);
   disp([snr, Pn]);
   sqamr = sqam + ruido;
   spskr = spsk + ruido;
   if abs(snr-13)<0.1 then
       subplot(2,2,1); plot(real(sqamr),imag(sqamr),'*');
       subplot(2,2,2); plot(real(spskr),imag(spskr),'*');  
       subplot(2,2,4); plot(errosp); title('Erros 8-PSK');
       subplot(2,2,3); plot(errosq); title('Erros 8-QAM');
   end;
   spskd = decide(cpsk,spskr); 
   sqamd = decide(cqam,sqamr);
   errosp = sign(abs(spsk - spskd));
   errosq = sign(abs(sqam - sqamd));
   txq = [txq, sum(errosq)/N];
   txp = [txp, sum(errosp)/N];
end

figure;
plot(snrdb,txq,'-o',snrdb,txp,'-*');
legend('8-QAM','8-PSK');


Nenhum comentário:

Postar um comentário