有人可以回答我为什么二进制对称通道上的汉明码的模拟性能(使用 matlab)与理论不完全吻合吗?这是我的代码:
clear all
n=15;
k=11;
I=eye(k);
%define the parity matrix for the hamming code
P=[1 1 0 0;1 0 1 0;0 1 1 0;1 0 0 1;0 1 0 1;0 0 1 1;1 1 1 0;1 1 0 1;1 0 1 1;0 1 1 1;1 1 1 1];
%The generator matrix combination of parity and identity matrix
G=[I,P];
%Define parity check matrix
HI=eye(n-k);
H=[P',HI];
%verify that rows of H represent the dual space for the rows of G
%(verification = 0)
verification=rem(G*H',2);
UoB=1043162;
%convert UoB number to binary
ci=dec2bin(UoB);
ci=ci-('0');
%take the 11 rightmost digits
cw=ci(:,10:20);
cw=rem(cw*G,2);
%monte carlo simulation index
mc=10000;
index=1;
Pe_matrix=zeros(21,mc);
Pe_vector=zeros(1,21);
在演示的过程error=rand(1,15)<p;
中,为 21 种不同的交叉概率生成了以下随机错误模式。因此,从原始码字c=xor(cw,error);
中减去这些模式以找到错误码字(在错误模式为 1 的任何地方,码字将翻转其位。之后,当前错误模式的错误概率是Pe=(sum(xor(cw,c)))./k;
通过将错误码字和原始码字相减后返回的(错误码字和原始码字不同的地方)相加,然后除以码字的总长度k=numel(c);
。Pe_matrix
存储每个交叉概率和每个 mc 迭代的所有 Pe 值。
for i=1:mc
for p=0:0.01:.2
error=rand(1,15)<p;
c=xor(cw,error);
k=numel(c);
Pe=(sum(xor(cw,c)))./k;
Pe_matrix(index,i)=Pe;
index=index+1;
end
index=1;
end
为了获得更平滑的结果,进行了蒙特卡罗模拟。在每次蒙特卡洛迭代中,Pe_matrix 的每一行都有不同交叉概率的 Pe 值。现在通过将每一行的元素相加并将它们除以蒙特卡洛模拟的总数,我们获得了一个强有力的估计二进制对称信道的 BER。
for j=1:21
Pe_vector(1,j)=sum(Pe_matrix(j,:))/mc;
end
%In the code demonstrated bellow the theoretical performance of the channel
%is calculated in order to compare it with the simulated.
for pe=0:0.01:.2
index=index+1;
Pblkerror=1-(1-pe)^15-15*pe*(1-pe)^14;
Pd(1,index)=(3/15)*Pblkerror;
end
%finally by creating a legend one can compare the theoretical with the
%simulated performance by the depicted BER graphs.
semilogy(Pe_vector,'r-o')
hold on;
semilogy(Pd,'k-*')
hold on;
legend('simulation','theoretical performance');
ylabel('Probability of error,Pe');
xlabel('cross over probability');
title('BsC simulation');
grid on;