dmc matlab程序,DMC信道容量迭代算法(Matalab实现)

一些公式没法粘贴,以后再补上

一、用了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元素的概率转移矩阵。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值