一些公式没法粘贴,以后再补上
一、用了matlab实现DMC容量迭代的算法如下:
设信道输入和输出符号集大小分别为r,s.
1.初始化信源分布:这里选deta=0.000001。
2.。
3.
。
4.
5.
若,则k=k+1,转第2步
6. 输出迭代次数k和和,终止。
二、了解了信道容量的定义和DMC信道容量迭代计算方法,我用了matlab来进行编程进行迭代计算得出信道容量。不足之处在于每迭代一次就输出一次迭代次数直到最后一次迭代。
1)输入:输入信源个数、信宿个数和信道容量的精度,输入信道转移矩阵。
2)输出:输出最佳信源分布和信道容量。
三、检验程序
之一:
输入信源个数:2
输入信宿个数:3
输入信道容量的精度:0.000001
输入信道转移矩阵P:[0.98 0.02; 0.05 0.95]
之二:P:[0.60.4;0.05 0.95]
之三:P:[0.8 0.150.05;0.05 0.15 0.8]
之四:P:[0.99 0.01 0;0.005 0.99 0.005;0 0.010.99]
四、程序源代码:
clear;
%r=input('输入信源个数:');
%s=input('输入信宿个数:');
%deta=input('输入信道容量的精度: ');
deta=0.000001;
%判断信道转移概率矩阵输入是否正确
P=input('输入信道转移矩阵P:');
[r,s]=size(P);
for i=1:r
if(sum(P(i,:))~=1)
error('概率转移矩阵输入有误!!')
return;
end
for j=1:s
if(P(i,j)<0||P(i,j)>1)
error('概率转移矩阵输入有误!!')
return;
end
end
end
i=1:1:r;
p(i)=1/r;%p为列向量
disp('原始信源分布:'),disp(p)
E=repmat(p',1,s);%把r个等概率元素组成一列,复制为s列
for k=1:1:1/deta
m=E.*P;
q=sum(m);%把得到的矩阵m每列内部相加之和构成一行,得到输出矩阵
su1=repmat(q,r,1);%把得到的行矩阵a复制r行,成一新矩阵su1
t=P./su1;
for i=1:r
for j = 1:s
if t(i,j)==0
t(i,j)=1
end
end
end
n=exp(sum(P.*log(t),2));%ln(t)在这里表示为log(t),列向量
u=p.*n';%信源分布的分子,行向量
su2=sum(u);%信源分布的分母
p=u/su2;
E=repmat(p',1,s);
su3=max(n);
C1=log2(su2);C2=log2(su3);
kk=C2-C1;
if(kk<=deta)
break;
end
end
disp('迭代次数:k='),disp(k)
disp('最大信道容量时的信源分布:p='),disp(p)
disp('最大信道容量:C='),disp(C1)
五、运行结果如下:
检验程序之一:
输入信道转移矩阵P:[0.98 0.02;0.05 0.95]
原始信源分布:
0.5000 0.5000
迭代次数:k=
7
最大信道容量时的信源分布:p=
0.5129 0.4871
最大信道容量:C=
0.7858
检验程序之二:
P:[0.6 0.4;0.05 0.95]
原始信源分布:
0.5000 0.5000
迭代次数:k=
26
最大信道容量时的信源分布:p=
0.4487 0.5513
最大信道容量:C=
0.2838
检验程序之三:
P:[0.8 0.15 0.05;0.05 0.15 0.8]
原始信源分布:
0.5000 0.5000
迭代次数:k=
1
最大信道容量时的信源分布:p=
0.5000 0.5000
最大信道容量:C=
0.5757
检验程序之四:
P:[0.99 0.01 0;0.005 0.99 0.005;0 0.01 0.99]
原始信源分布:
0.3333 0.3333 0.3333
迭代次数:k=
4
最大信道容量时的信源分布:p=
0.3358 0.3283 0.3358
最大信道容量:C=
1.5009
五、程序调试遇到的问题
检验第4个转移概率矩阵时,由于含有0元素,导致,从而使得。因此应该插入判断矩阵{}元素时候为0,为0就用1代替。即for i=1:r
for j = 1:s
if t(i,j)==0
t(i,j)=1
end
end
end
因此可以计算含有0元素的概率转移矩阵。