Exemples de calcul de la capacité en Matlab
Contents
1.6. Exemples de calcul de la capacité en Matlab#
1.6.1. 1. Capacité du canal Gaussien à entrées gaussiennes#
La capacité pour une entrée non contrainte est donnée par la capacité d’un canal Gaussien complexe à temps discret avec une énergie moyenne par symbole \(\mathrm{E}_{\mathrm{s}}\) et une variance par dimension \(\sigma^{2}=\mathrm{N_0} / 2\) est donnée par
Pour les \(E_s/N_0\) faibles (régime limité en puissance), on a
On a donc un régime linéaire. A contrario, pour les forts \(E_s/N_0,\) on a un régime logarithmique, ie.
EsN0dB=(-10:30);
EsN0=10.^(EsN0dB/10);
ShannonCapacity=log2(1+EsN0);
%Capa vs SNR - linear scale
figure
plot(EsN0dB,ShannonCapacity);
grid on
xlabel('E_s/N_0')
ylabel('bit per channel use')
%Capa vs SNR - log scale
figure
semilogy(EsN0dB,ShannonCapacity);
hold on
semilogy(EsN0dB(1:5), (EsN0(1:5))/log(2),'r--')
semilogy(EsN0dB(end-10:end), log2(EsN0(end-10:end)),'g--')
grid on
xlabel('E_s/N_0')
ylabel('bit per channel use')
![_images/PlayWithCapacity_1_1.png](_images/PlayWithCapacity_1_1.png)
![_images/PlayWithCapacity_1_2.png](_images/PlayWithCapacity_1_2.png)
Quand on regarde la capacité en fonction de \(E_b/N_0\), on obtient
où \(E_b\) est l’énergie par bit utile/d’information. On a alors
En prenant, le rendement comme étant le sup atteignable, ie. \(R^*= C_{AWGN},\) on peut tracer la limite de Shannon en fonction de \(\frac{E_{b}}{N_{0}}.\)
%Capa vs Eb/N0 - linear sacle
EsN0dB=(-100:30);
EsN0=10.^(EsN0dB/10);
ShannonCapacity=log2(1+EsN0);
figure
plot(EsN0dB-10*log10(ShannonCapacity),log2(1+EsN0));
hold on
plot([-1.59,-1.59+eps],[0, 10],'r--');
grid on
xlabel('E_b/N_0')
ylabel('bit per channel use')
![_images/PlayWithCapacity_3_1.png](_images/PlayWithCapacity_3_1.png)
1.6.2. 2. Capacité du canal Gaussien à entrées binaires#
Soit le modèle de réception suivant:
où \(x[n] \in\{-1,+1\}.\) par définition, la capacité à entrée binaire est fournie par
En utilisant le fait que
on peut écrire
On peut alors introduire la quantité suivante (LLR)
En utilisant le fait que \({p(x=+1 | y)}+{p(x=-1 | y)}=1,\) il vient
Ce qui permet d’écrire $\(p(x | {y}) = \frac{1}{1+e^{-x L(y)}}\)$
Par intégration de Monte-Carlo, on obtient alors un estimateur empirique non biasé simple donné par
clear all;
%%%%
EbN0db=0.187;
N=1000000;
bits=randn(1,N)>0;
BPSK=1-2*bits;
R=0.5;
N0=1/R/10^(EbN0db/10);
bruit=sqrt(N0/2)*randn(1,N);
sigma2=N0/2;
y=BPSK+bruit;
LLR=2/sigma2*y;
%Capacity for Eb/N0=0.2dB
Capacity=1-mean(log2(1+exp(-BPSK.*LLR)))
%convergence of mean estimator
CapacityPartial=1-1./(1:N).*cumsum(log2(1+exp(-BPSK.*LLR)));
semilogx((1:N),CapacityPartial,'.')
hold on
semilogx((1:N),CapacityPartial(end)*ones(1,N),'-')
grid on
xlabel('trials')
ylabel('Capacity')
Capacity =
0.5002
![_images/PlayWithCapacity_5_1.png](_images/PlayWithCapacity_5_1.png)
ESN0db=(-20:10);
N=5000000;
for snr=1:numel(ESN0db)
bits=randn(1,N)>0;
BPSK=1-2*bits;
N0=1/10^(ESN0db(snr)/10);
bruit=sqrt(N0/2)*randn(1,N);
sigma2=N0/2;
y=BPSK+bruit;
LLR=2/sigma2*y;
%Capacity for Eb/N0=0.2dB
Capacity(snr)=1-mean(log2(1+exp(-BPSK.*LLR)));
end
figure
plot(ESN0db-10*log10(Capacity),Capacity)
hold on
plot(ESN0db+10*log10(2)-10*log10(2*Capacity),2*Capacity,'b-')
plot(ESN0db-10*log10(log2(1+10.^(ESN0db/10))),log2(1+10.^(ESN0db/10)),'r-')
grid on
xlabel('E_b/N_0')
ylabel('Capacity')
legend('BPSK Capacity','QPSK capacity','Gaussian Inputs Capacity')
figure
plot(ESN0db,Capacity)
hold on
plot(ESN0db+10*log10(2),2*Capacity,'b-')
plot(ESN0db,log2(1+10.^(ESN0db/10)),'r-')
grid on
xlabel('E_s/N_0')
ylabel('Capacity')
legend('BPSK Capacity','QPSK capacity','Gaussian Inputs Capacity')
![_images/PlayWithCapacity_6_1.png](_images/PlayWithCapacity_6_1.png)
![_images/PlayWithCapacity_6_2.png](_images/PlayWithCapacity_6_2.png)
1.6.3. 3. Capacité du canal Gaussien à entrées non binaires#
La capacité pour une entrée contrainte non binaire est donnée par
1.6.3.1. Calcul par intégration de Monté Carlo#
Contrairement, au cas précédent, même pour un canal de type AWGN, il n’existe pas d’expression analytique plus simple que cette formulation intégrale. Il faut donc pour un canal particulier calculer l’expression intégrale par intégration numérique ou de Monte-Carlo. Pour calculer efficacement cette capacité, cela revient à évaluer \(\mathbf{C} = I({X};{Y}) = H({X})-H({X}\mid{Y})\) au travers des Termes \(H({X})\) ou \(H({X}\mid{Y}).\) Voilà alors les différentes étapes pour calculer la capacité
Calcul de \(H({X})\) :
En considérant que le maximum est atteint pour une distribution uniforme des symboles d’entrée, on obtient facilement que $\(H({X})=\log_2(M).\)$
Calcul de \(H({X}\mid{Y})\) :
On doit donc calculer le terme \(h(X | Y)=-\log_2{(p(X | Y))}.\) Ceci est aisément obtenu en considérant la vraisemblance du canal de la manière suivante
Le calcul de \(H({X}\mid{Y})\) peut alors se faire par Monte-Carlo en utilisant un estimateur asymptotiquement sans biais de cette quantité. En effet, par ergodicité, on a
où \(h(x(n)| y(n))=-\log_2(p(x(n) | y(n)))).\)
La procédure globale pour l’estimation par monte-Carlo peut alors se résumé comme suit
a. Tirer aléatoirement et uniformément des symboles issue de la constellation,
b. Calculer pour chaque couple \((x(n),y(n))\), \(h(x(n) | y(n))\) et moyenner.
% Simulation parameters
Ns= 100000; % Number of Symbols
Es_N0_dB = (-5:40);
%loop for order M
for M = [4 16 64 256 1024]; % Constellation Order
Constellation=qammod((0:M-1)',M);
% Loop variable for SNR
% Monte carlo parameter
for snr=1:numel(Es_N0_dB)
%generate M-QAM modulation
s = randi([0 M-1],Ns,1);
x = qammod(s, M);
Es_N0=10^(Es_N0_dB(snr)/10);%normal
sigx2=var(x);
N0 = sigx2 /(Es_N0);
%add noise
noise_ = sqrt(N0/2 )*randn(length(x),1)+ ...
1j*sqrt(N0/2 )*randn(length(x),1);
sig_rx = x + noise_ ;
%Compute Capacity
%%Entropy
Hx=log2(M);
%%Conditionnal Entropy
xref=repmat(Constellation,1,Ns); %
d2=-abs((repmat(sig_rx,1,M).'-xref)).^2/N0;
PYX=exp(d2);
PYx=exp(-abs((sig_rx-Constellation(s+1))).^2/N0);
PxY=PYx./(sum(PYX)');
HXY=-mean(log2(PxY'));
ConstrainedCapacity(snr)=Hx-HXY;
end
plot(Es_N0_dB,ConstrainedCapacity)
hold on
end
plot(Es_N0_dB,log2(1+10.^(Es_N0_dB/10)),'r-')
legend({'M=4','M=16','M=64','M=256','M=1024','Gaussian'},'Location','northwest')
xlabel('E_s/N_0 dB')
ylabel('Capacity in bpcu')
grid on
![_images/PlayWithCapacity_8_1.png](_images/PlayWithCapacity_8_1.png)
1.6.4. 3.2 A vous de jouer…#
Déterminer les capacités pour des signaux PSK et APSK et QAM-(8,32,128). Conclure.
Regarder ces résultats en regardant la capacité versus \(E_b/N_0\).