sexta-feira, 8 de agosto de 2014

Cálculo de taxa de erro quando a probabilidade dos bits 0's e 1's são diferentes


Quando um sinal binário é transmitido e o número de bits '0's e '1's possuem probabilidade de ocorrência diferente (ex: 60% e 40%), o cálculo da taxa de erro é um pouco mais complicado que na situação mais simples de bits equiprováveis.
Se o sinal binário for mapeado nos símbolos "+1" e "-1" distribuídos com igual probabilidade, a taxa de erro, considerando um ruído do tipo gaussiano e de média nula e variância $\sigma_x^2$, pode ser calculada por:
$$ P_e = Q\left( \frac{1}{\sigma_x}\right) = \frac{1}{2} erfc\left( \frac{1}{\sqrt{2}\sigma_x}\right) $$
se for usado um limiar de comparação $\lambda = 0$.
Se os símbolos "+1" e "-1" não forem igualmente prováveis, é necessário se calcular primeiro o limiar de comparação. Esse limiar vai depender do ruído (variância do ruído) e da probabilidade de ocorrência ($P_0$ para o símbolo "-1" e $P_1$ para o símbolo "+1") dos símbolos:
$$ \lambda_0 = -\frac{\sigma_x^2}{2}\ln\left(\frac{P_1}{P_0}\right) $$
Com esse valor de limiar, a taxa de erro pode ser calculada por:
$$ P_e = P_0 Q(\lambda_u) + P_1 Q(-\lambda_t)$$
sendo $\lambda_u = (\lambda_0 + 1)/\sigma_x$ e $\lambda_t = (\lambda_0 - 1)/\sigma_x$. Os detalhes dessas deduções foram, naturalmente, omitidos.

O programa Scilab abaixo faz uma simulação e o cálculo do valor ótimo de comparação quando os símbolos apresentam uma probabilidade de 60% (+1) e 40% (-1) e ruído apresenta uma variância de 0,50. O resultado gráfico é:


----------------------------------
--------------
----
clear; clc; 
close; close; close;
N = 1e5;
pv = 1;

for mm=1:5
    disp(mm);
// gerando +1 (60%), -1 (40%)
b = ones(1,N);
for k=1:N
    x= rand(1,1,'u');
    if x>0.6 then b(k)=-1;
    end
end

// corrigindo o numero de +1, -1:
mmb = mean(b);
pos = 100;
while mmb<0.199999
    b(pos) = 1;
    pos = pos + 10;
    mmb = mean(b);
end
disp([1, pos]);
while mmb>0.200001
    b(pos) = -1;
    pos = pos + 10;
    mmb = mean(b);
end
disp([2 pos]);

// ruido:
vn = sqrt(0.5);
n = rand(1,N,'n');
n = n - mean(n);
n = n/sqrt(variance(n));
n = vn*n;

bn = b + n;
bd = sign(bn);
erros = sum(abs(bd - b))/2;

vcomp = -vn*vn*log(0.6/0.4)/2; // valor ótimo de comp.

emm = 0.1;
vc1 = vcomp - 4*0.02;
vc2 = vcomp + 4*0.02;
pv=1; er = 0.00001;
vlamb = vc1:0.02:vc2;
verrosm = 0*vlamb;
verros = verrosm;
for lamb = (vc1):0.02:(vc2+0.0001)
for k=1:N
    if bn(k) > lamb then bd(k) = 1;
        else bd(k) = -1;
    end
end
erros2 = sum(abs(bd - b))/2;
verros(pv) = erros2/N;
// disp([pv, lamb])
pv = pv + 1;
end;
if mm==1 then verrosm = verros;
    else verrosm = verrosm + verros; 
end
end;
verrosm = verrosm/mm;
plot(vlamb, verrosm); xgrid; 
title('Taxa de erros em função do limiar');

figure;
subplot(2,2,1); bar([-1  1],[0.4 0.6],0.1);

x=-3:0.001:3;
g1 = (0.4/(sqrt(2*%pi)*vn))*exp(-(x+1).*(x+1)/(2*vn*vn));
g2 = (0.6/(sqrt(2*%pi)*vn))*exp(-(x-1).*(x-1)/(2*vn*vn));
gn = (1/(sqrt(2*%pi)*vn))*exp(-(x).*(x)/(2*vn*vn));

subplot(2,2,2); plot(x,gn); title('Ruído');
subplot(2,1,2); histplot(50,bn); 
plot(x,g1,x,g2,x,g1+g2); title('Sinal com ruido');
plot([vcomp vcomp],[0 0.4],'m');

Nenhum comentário:

Postar um comentário