一、实验目的:
熟悉 Matlab 工作环境及工具箱;
掌握一般信道容量迭代算法的原理。
二、实验仪器:
Matlab2015a
三、实验原理:
衡量一个信息传递系统的好坏,有两个主要指标:
数量(速度)指标——信息(传输)率R
质量指标——平均差错率Pe
信息率能大到什么程度——信道容量
信道容量的定义
信道
核心问题是信道容量和最佳输入分布。
根据定义,求信道容量问题就是求平均互信息量I(X;Y)关于输入概率分布Px的最大值问题。
¨ 常见信道
离散无噪信道(无损、确定、无损确定信道)
离散对称信道/准对称信道一般DMC信道容量
一般DMC信道容量的计算非常困难,信道容量计算的迭代算法能在给定的精度下用有限步数计算出一般DMC的信道容量。
定理
¨ 设DMC的转移概率矢量为,记是任意给定的一组初始输入分布,其所有分量均不为零。按下式不断对输入分布进行迭代、更新
其中
信道容量的迭代算法流程图
四、实验步骤:
1.先利用Matlab编写函数;
2.再根据函数将实验要求生成实验结果;
3.根据实验内容填写实验报告;
五、实验内容及数据整理:
用Matlab软件编程实现一般信道容量迭代算法
设定不同的迭代精度
设定不同的信道
六、实验结果及讨论
第一种编程方法:
clc;clear;close all
disp(‘请输入信道矩阵:’)
Pb_a=input(‘Pb_a=’);
Pb_a(Pb_a==0)=eps; %Pb_a==0返回矩阵中等于0的位置,再利用Pb_a=eps赋予精度
disp(‘请输入初始概率分布:’)
Pa0=input(‘Pa0=’);
[r, s]=size(Pb_a); %判断行列的数量
[r0, s0]=size(Pa0);
while (s0~=r) %Matlab中~=表示不等于
Pa0=input(‘阶数错误!请重新输入初始概率分布Pa0=’);
[r0, s0]=size(Pa0);
end
tol=1e-8;
Cn=0;
Cn1=10;
Pa=Pa0;
Pa(Pa==0)=eps;
while abs(Cn1-Cn)>tol
for k=1:s0 %表示创建一个从1到s0的行向量
Md=0;
for j=1:s
Me=0;
for i=1:r
Me=Me+Pa(i)*Pb_a(i,j);
end
Md=Md+Pb_a(k,j)*log2(Pb_a(k,j)/Me);
end
Mb(k)=exp(Md); % Mb(k)相当于a_k
end
for k=1:s0
Mc=0;
for i=1:r
Mc=Mc+Pa(i)*Mb(j);
end
Pa(k)=Pa(k)*Mb(k)/Mc;
end
M_Cn=0;
for j=1:r
M_Cn=M_Cn+Pa(j)*Mb(j);
end
Cn=log(M_Cn);
Cn1=log(max(Mb));
end
C=Cn;
disp(‘信道容量为:’)
disp(C)
disp(‘bit/sym’)
disp(‘最佳输入分布为:’);
disp(Pa)
结果:
第二种编程方法:
%离散单符号信道容量的迭代算法(MATLAB实现)
%程序编写测试环境为MATLAB R2014a
%程序运行涉及的四个参数现已调整合适,除这四个参数外其他部分不应修改
%为方便起见,程序仅输入信道转移概率矩阵P,通过P获取r,s
%鉴于MATLAB矩阵运算的优势,信道容量迭代算法改用矩阵形式表述
%程序输出部分包括最佳信源分布及对应信道容量
%提供测试矩阵,[0.5 0.5 0 0;0 0 0.5 0.5],信源等概时信道容量1.00比特/符号
clc;clear;close all;
%算法参数设置
err=1e-15; %误差门限参数设置
C_current=-1e30; %初始信道容量设置
K=10000; %最大迭代次数设置
fag=1e-50; %设定的高次小量用于替换0
%输入部分
%键盘输入,输入处理及输入判断
Pcc=input(‘请输入信道转移概率矩阵(输入格式示例[0.5 0.5;0.4 0.6])\n’);
M=size(Pcc); %读取信道转移概率矩阵的大小
r=M(:,1); %获取信源符号个数
s=M(:,2); %获取信宿符号个数
%判断输入矩阵是否满足要求
tag0=sum(Pcc(:)>=0);
% tag1=sum((Pcc*ones(s,1))==1);
tag1=sum(abs((Pcc*ones(s,1)-1)<fag));
if tag0~=r*s||tag1~=r
error(‘输入信道转移概率矩阵错误,请重新输入’);
end
Pcc(Pcc==0)=fag; %将矩阵中的0置为高次小量
%算法部分
%设定信源,迭代求解信道容量
p=ones(1,r)./r; %初始化信源分布
%迭代算法(采用矩阵表述)
for k=1:K
fai=(ones(s,1)*p).*Pcc’;
fai=fai./(fai*ones(r,r)); %计算信源条件下的后向概率
p0=exp(diag(Pcc*(log(fai)))’);
p=p0/sum(p0); %计算新的信源分布
C_new=log(sum(p0)); %计算信道容量,单位奈特/符号
%判断迭代是否终止
if (abs((C_new-C_current)))<=err*C_new
break;
else
C_current=C_new; %信道容量结果更新
end
end
%判断迭代是否失败
if k==K
error(‘迭代计算失败,请重新设置相关参数’);
end
%输出部分
%输出最大信道容量及对应的最佳信源分布
C=C_new/log(2); %单位转换,转换为比特/符号
fprintf(‘\n’);
disp(‘最佳信源分布P为’);
disp(p);
fprintf(‘信道容量C为%.10f比特/符号\n’,C);
结果: