信道容量及其一般计算方法
实验一 信道容量及其一般计算方法
1. 实验目的
一般离散信道容量的迭代运算
2. 实验要求
(1)理解和掌握信道容量的概念和物理意义
(2)理解一般离散信道容量的迭代算法
(3)采用Matlab编程实现迭代算法
(4)认真填写实验报告。
3.源代码
clc;clear all; //清屏
N = input('输入信源符号X的个数N='); //输入行数
M = input('输出信源符号Y的个数M='); //输入列数
p_yx=zeros(N,M); //程序设计需要信道矩阵初始化为零
fprintf('输入信道矩阵概率\n')
for i=1:N //从第一行第一列开始输入
for j=1:M
p_yx(i,j)=input('p_yx='); //输入信道矩阵概率
if p_yx(i)
end
end
end
for i=1:N //各行概率累加求和
s(i)=0;
for j=1:M
s(i)=s(i)+p_yx(i,j);
end
end
for i=1:N //判断是否符合概率分布
if (s(i)=1.000001) //若行相加小于等于0.9999999或者大于等于1.000001
Error //('不符合概率分布')
end
end
b=input('输入迭代精度:'); //输入迭代精度
for i=1:N
p(i)=1.0/N; //取初始概率为均匀分布(每行值分别为1/N,) end
for j=1:M //计算q(j)
q(j)=0;
for i=1:N
q(j)=q(j)+p(i)*p_yx(i,j); //均匀分布的值乘上矩阵值后+q(j),然后赋值给q(j)实现求和
end
end
for i=1:N //计算d(i)=∑p(yi|xi)ln[p(yi|xi)/∑p(xi)*p(yi|xi)] d(i)=0;
for j=1:M
if(p_yx(i,j)==0)
d(i)=d(i)+0;
else
d(i)=d(i)+p_yx(i,j)*log(p_yx(i,j)/q(j)); //公式如上
end
end
a(i)=exp(d(i)); //公式如上,对d(i)求指数
end
u=0;
for i=1:N
u=u+p(i)*a(i); //对u的叠加求和
end
IL=log2(u); //计算IL(信道容量C1=log2∑p(xi)*a(i)) IU=log2(max(a)); //计算IU(信道容量C2=log2max(a(i))) n=1;
while((IU-IL)>=b) //若C1-C2
for i=1:N //以下均同上步骤
p(i)=p(i)*a(i)/u; //重新赋值p(i)
end
for j=1:M //计算q(j)
q(j)=0;
for i=1:N
q(j)=q(j)+p(i)*p_yx(i,j); //重复刚才步骤
end
end
for i=1:N //计算a(i)
d(i)=0;
for j=1:M
if(p_yx(i,j)==0)
d(i)=d(i)+0;
else
d(i)=d(i)+p_yx(i,j)*log(p_yx(i,j)/q(j));
end
end
a(i)=exp(d(i));
end
u=0;
for i=1:N //计算u
u=u+p(i)*a(i);
end
IL=log2(u); U=log2(max(a)); n=n+1;
end
fprintf('信道矩阵为:\n');
disp(p_yx);
fprintf('迭代次数n=%d\n',n);
fprintf('信道容量C=%f比特/符号',IL); //计算IL //计算IU
4.实验的算法:
11. 初始化信源分布:pi=,循环变量k=1,门限△,C(0)=-∞; r
(k)φij=pi(k)pji
2. ∑p
i=1
rr(k)ipji 3. pi(k+1)(k)exp[∑pjilogφij]s=
∑exp[∑p
i=1j=1
r
i=1j=1s ji(k)logφij]4. C(k+1)(k)=log[∑exp(∑pjilogφij)] j=1s
5. 若C(k+1)-C(k)
C(k+1)>∆,则k=k+1,转第2步
6. 输出P*=Pi(k+1)r和C(k+1),终止。
()
5.实验结果