锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Matlab信道容量的迭代计算实验

时间:2022-09-16 16:00:00 fag中轴力矩传感器

一、实验目的:

熟悉 Matlab 工作环境及工具箱;

掌握一般信道容量迭代算法的原理。

二、实验仪器:

Matlab2015a

三、实验原理:

有两个主要指标可以衡量信息传输系统的质量:

数量(速度)指数-信息(传输)率R

质量指标-平均差错率Pe

信息率有多大-信道容量

定义信道容量

信道

核心问题是信道容量和最佳输入分布。

根据定义,求信道容量的问题是求平均相互信息量I(X;Y)关于输入概率分布Px最大值问题。

¨ 常见信道

离散无噪声信道(无损、确定、无损信道)

离散对称信道/准对称信道DMC信道容量

一般DMC信道容量的计算非常困难。信道容量计算的迭代算法可以在给定的精度下以有限的步数计算DMC信道容量。

定理

¨ 设DMC转移概率矢量为,记录为任意给定的初始输入分布,其所有分量不为零。输入分布按下不断迭代更新

其中

迭代算法流程图信道容量

四、实验步骤:

1.先利用Matlab编写函数;

2.根据函数生成实验结果;

3.根据实验内容填写实验报告;

五、实验内容及数据整理:

用Matlab软件编程实现一般信道容量迭代算法

设置不同的迭代精度

设置不同的信道

nbsp;                                                                                   

 六、实验结果及讨论                                                          

 

第一种编程方法:

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)

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);

结果:

 

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章