离散信道容量迭代实现
- 格式:doc
- 大小:197.86 KB
- 文档页数:13
中文摘要信道是信息传递的通道,承担信息的传输和储存的任务,是构成通信系统的重要组成部分。
信道容量是指信道能够传输信息量的大小。
信道容量的研究在现实中有着非常重要的理论意义。
而信道容量的计算是一个比较复杂的问题,所以我们要借助于数学软件Matlab来解决这个难题。
本文的第一部分从信道容量的基本概念、基本原理、信道模型及分类等方面系统的介绍了信道容量。
并在此基础上,介绍了一般信道容量的计算步骤。
本文的第二部分开始介绍信道容量的迭代算法及迭代算法在Matlab中的实现,举例检验迭代算法在Matlab中实现的程序的可行性关键词信道容量 Matlab 迭代算法AbstractChannel is a channel of information transmission. And it take on the task of information transmission and storage. Channel is an important part of communication system. Channel capacity is the size of the amount of information can be transmitted. It has important significances in reality. However, calculating the channel capacity is a complex issue. So we must use the mathematical software Matlab to solve this problem.The first part of the article, it introduces channel capacity by the basic concepts, principles and the classification of channel models. On this basis, introduce and discuss the calculation steps of the general channel capacity.The second part of the article, it introduces the Iterative algorithm of the channel capacity and implementes the iterative algorithm in Matlab. After that, by realizing the feasibility of the procedure, we make some examples. And also analyze the procedure.Key word :channel capacity、matlab目录引言 (6)1、离散信道的数学模型 (6)2、信道容量和最佳输入概率分布 (6)2.1信道容量 (6)2.2最佳输入概率分布 (7)3、信道容量和平均互信息的计算步骤 (7)3.1平均互信息的计算 (7)3.2信道容量的计算 (7)4、信道容量的迭代算法 (8)5、实例分析 (9)结论 (10)参考文献 (11)附 (12)引言本文主要结合实例对离散信道及其信道容量进行相关阐述,及用迭代算法实现离散信道容量1、离散信道的数学模型设离散信道的输入为一个随机变量X ,相应的输出的随机变量为Y ,如图所示: 规定一个离散信道应有三个参数: 输入信号:X={X1, X2, …, XN} 输出信号:Y={Y1, Y2, …, YN}信道转移概率:P(y|x) 描述了输入信号和输出信号之间的依赖关系 。
信道容量matlab,离散⽆记忆信道容量的matlab算法《离散⽆记忆信道容量的matlab算法》由会员分享,可在线阅读,更多相关《离散⽆记忆信道容量的matlab算法(2页珍藏版)》请在⼈⼈⽂库⽹上搜索。
1、functionI,pp=channelcapacity(P,k)%I是信道容量,pp是最佳⼊⼝分布,P是信道概率转移矩阵,k是迭代精度if nargin=k %迭代过程n=n+1;pb=zeros(1,b);%pb是输出概率for j=1:bfor i=1:apb(j)=pb(j)+pa(i)*Pji(i,j);endendsuma=zeros(1,b);for j=1:bfori=1:aPij(j,i)=pa(i)*Pji(i,j)/(pb(j)+eps); %Pij是反向概率转移矩阵suma(j)=suma(j)+pa(i)*Pji(i,j)*log2(Pij(j,i)+eps)/(p。
2、a(i)+eps);endendIo=sum(suma);%求信道容量的过程L=zeros(1,a);sumaa=0;for i=1:aforj=1:bL(i)=L(i)+Pji(i,j)*log(Pij(j,i)+eps);endaf(i)=exp(L(i);endsumaa=sum(af);fori=1:app(i)=af(i)/(sumaa+eps);endI=log2(sumaa);pa=pp;enddisp(最佳输⼊分布pa:),disp(pp);disp(输⼊的符号数a:),disp(a);disp(输出的符号数b:),disp(b);disp(信道容量I:),disp(I);disp(输出迭代精度k:),disp(k);disp(输出迭代次数n:),disp(n);检验过程:P=0.5,0.3,0.2;0.3,0.5,0.2 I=0.036 bitP=1/2,1/3,1/6;1/6,1/2,1/3;1/3,1/6,1/2 I=0.126 bit1 输⼊P=1,0;1,0;1/2,1/2;0,1;0,1回车2 channelcapacity(P) 即可。
实验二信道容量迭代算法一、实验目的:了解信道容量的计算方法二、实验内容与原理:内容:1.令pe1=pe2=0.1和pe1=pe2=0.01,分别计算该对称信道的信道容量和最佳分布;2.令pe1=0.15,pe2=0.1和pe1=0.075pe2=0.01,分别计算该信道的信道容量和最佳分布;信道容量是信息传输率的极限,当信息传输率小于信道容量时,通过信道编码,能够实现几乎无失真的数据传输;当数据分布满足最佳分布时,实现信源与信道的匹配,使得信息传输率能够达到信道容量。
本实验利用信道容量的迭代算法,使用计算机完成信道容量的计算。
三、程序代码#include<stdio.h>#include<math.h>int main(){double Pe1,Pe2,Pa1_=0,Pa2_=0; double b1a1,b2a1,b1a2,b2a2;double Pa1=0,Pa2=0;double I=0,max=0;//平均互信息量,最大平均互信息量int count=0;printf("输入信道容量参数Pe1:");scanf("%lf",&Pe1);printf("输入信道容量参数Pe2:");scanf("%lf",&Pe2);printf("信道容量参数:Pe1=%lf Pe2=%f\n",Pe1,Pe2);b1a1=1-Pe1;b2a1=Pe1;b1a2=Pe2;b2a2=1-Pe2;for(Pa1=0.01;Pa1<=1;Pa1=Pa1+0.01){ Pa2=1-Pa1;count=count+1;I=Pa1*b1a1*( log( b1a1/(Pa1*b1a1+Pa2*b1a2) )/log(2) )+Pa1*b2a1*( log(b2a1/(Pa1*b2a1+Pa2*b2a2) )/log(2) )+Pa2*b1a2*( log(b1a2/(Pa1*b1a1+Pa2*b1a2) )/log(2) )+Pa2*b2a2*( log(b2a2/(Pa1*b2a1+Pa2*b2a2) )/log(2) );printf("%10lf",I);if (I>max){max=I;Pa1_=Pa1,Pa2_=Pa2;}elsecontinue;}printf("\n");printf(" 一共计算机了:%d\n",count);printf(" 最大互信息量为:%lf\n",max);printf(" 最大互信息量的P(a1)=%lf;P(a2)=%lf\n",Pa1_,Pa2_); }四、运行结果。
实验二---一般信道容量迭代算法.doc实验二一般信道容量迭代算法1.实验目的掌握一般离散信道的迭代运算方法。
2.实验要求1)理解和掌握信道容量的概念和物理意义2)理解一般离散信道容量的迭代算法3)采用Matlab 编程实现迭代算法4)认真填写试验报告3.算法步骤①初始化信源分布),,,,,(21)0(p p p p P ri =(一般初始化为均匀分布) ,置迭代计数器k=0 ,设信道容量相对误差门限为δ ,δ>0 ,可设-∞=C )0(;②∑=i k i ij k i ij k ji p p p p )()()(? s j r i ,??=??=,1;,,1 ③∑∑∑??=+i k ji j ij k ji j ij k i p p p ??)()()1(ln exp ln exp r i ,,1??= ④??=∑∑+ik ji j ij k p C ?)()1(ln exp ln ⑤如果δ≤-++C C Ck k k )1()()1( ,转向⑦;⑥置迭代序号k k →+1,转向②;⑦输出p k i )1(+和C k )(1+的结果;⑧停止。
4.代码P=input('转移概率矩阵P=')e=input('迭代精度e=')[r,s]=size(P);n=0;C=0;C_k=0;C_k1=0;X=ones(1,r)/r;A=zeros(1,r);B=zeros(r,s);%初始化各变量while(1)n=n+1;for i=1:rfor j=1:sB(i,j)=log(P(i,j)/(X*P(:,j))+eps); if P(i,j)==0B(i,j)=0;elseendendA(1,i)=exp(P(i,:)*B(i,:)');endC_k=log2(X*A');C_k1=log2(max(A));if (abs(C_0-C_1)。
信道容量的迭代算法实现#include <iostream>using namespace std;#define FLOAT_MINUS_PRECISION 0.00001typedef vector<float*> VEC_PFLOAT;//迭代计算信道容量,参数值为信源,信宿符号个数和信道转移概率矩阵,返回信道容量< /pre> float GetCapacity(int nSourceSymbol,int nHostSymbol,const VEC_PFLOAT& vTransMatrix){//信道容量初始化为最⼩值float fCapacity = FLT_MIN;//信源概率分布float *pfSoureProb = new float[nSourceSymbol];//初始化信源分布为均匀分布int i;for (i = 0; i < nSourceSymbol; i++){pfSoureProb[i] = 1.0 / nSourceSymbol;}//初始化φ函数VEC_PFLOAT vPhi;for (i = 0; i < nSourceSymbol; i++){float *pfTemp = new float[nHostSymbol];vPhi.push_back(pfTemp);}//设置精度;const float cfDelta = 0.02f;float fPrecision;//迭代计算int j,k;float *pfSum = new float[nSourceSymbol];do{for (i = 0; i < nSourceSymbol; i++){for (j = 0; j < nHostSymbol; j++){//计算ΣPi*Pjifloat fSum = 0.0f;for (k = 0; k < nSourceSymbol; k++){fSum += pfSoureProb[i] * vTransMatrix[k][i];}vPhi[i][j] = pfSoureProb[i] * vTransMatrix[j][i] / fSum;}}float fSumDeno = 0.0f; //分母求和for (i = 0; i < nSourceSymbol; i++){float fSum = 0.0f;for (j = 0; j < nHostSymbol; j++){fSum += vTransMatrix[j][i] * logf(vPhi[i][j]);}pfSum[i] = expf(fSum);fSumDeno += pfSum[i];}for (i = 0; i < nSourceSymbol; i++){pfSoureProb[i] = pfSum[i] / fSumDeno;}//计算新⼀轮的容量float fNewC = logf(fSumDeno);//计算精度fPrecision = fabs(fNewC - fCapacity) / fCapacity;fCapacity = fNewC;} while(fPrecision - cfDelta > 0.0f);//释放临时资源delete []pfSum;for (i = 0; i < vPhi.size(); i++){float* pfTemp = vPhi.at(i);delete pfTemp;}vPhi.clear();return fCapacity;}int main(){//转移矩阵VEC_PFLOAT vTransMatrix;int nCol,nLine;cout<<"请输⼊信源符号个数:";cin>>nLine;cout<<"请输⼊信宿符号个数:";cin>>nCol;cout<<"请依次输⼊"<<<"⾏信道转移概率矩阵:(以空格隔开每个概率)\n";< /pre> for (int i = 0; i < nLine; i++){float *pfTemp = new float[nCol];Labelfloat fSum = 0.0f;cout<<"X"<<<":";for (int j = 0; j < nCol - 1; j++){cin>>pfTemp[j];fSum += pfTemp[j];}if (1.0f - fSum < 0){cout<<"转移概率和应该为1,请重新输⼊!\n";goto Label1;}else{pfTemp[j] = 1.0f - fSum;cout<<"信源符号 X"<<<"的转移概率分别为:";for(int k = 0; k < nCol; k++)cout<cout<}vTransMatrix.push_back(pfTemp);}cout<<"信道容量为:"<< /pre>for (int k = 0; k < vTransMatrix.size(); k++){float* pfTemp = vTransMatrix.at(k);delete pfTemp;}vTransMatrix.clear();return0;}。
C语言方法实现,源程序如下:#include <stdio.h>#include <math.h>#include<stdlib.h>#define N 4#define M 4 /*转移矩阵行数为N,列数为M,自行调整*/ void Init(double *Pa); /* 输入概率分布初始化函数*/void Input(double *Pa,double *a); /*迭代输入概率分布重新调整函数*/void Output(double *Pa,double P[N][M],double *Pb); /*输出概率分布函数*/void Infor(double *Pb,double P[N][M],double *a); /*计算a(i)的函数*/double capacity1(double *Pa,double *a); /*计算C(n+1,n)*/double capacity2(double *a); /*计算C'(n+1,n)的函数*/void main(){ double c1,c2,s,temp;double Pa[N],a[N],Pb[M];double P[N][M];int i,j,count=0; /*count记录迭代次数*/for(i=0;i<N;i++)for(j=0;j<M;j++){ printf("please input P[%d][%d]:",i+1,j+1);scanf("%lf",&P[i][j]);} /*输入转移概率矩阵P*/for(i=0;i<N;i++){ temp=0.0;for(j=0;j<M;j++)temp+=P[i][j];if(temp!=1) { printf("Error!\n");exit(0);}} /*检查输入的转移概率矩阵是否正确:各行之和为1,则继续进行;否则退出程序*/printf("请输入精度:\n");scanf("%lf",&s);Init(Pa);while(1){ count++;Output(Pa,P,Pb);Infor(Pb,P,a);c1=capacity1(Pa,a);c2=capacity2(a);if(fabs(c1-c2)<s) break;else Input(Pa,a);}printf("迭代次数=%d次\n",count);printf("信道容量C=%fbit/符号\n",(1.0/log(2))*c1);printf("输入概率分布为:\n");for(i=0;i<M;i++){ printf("%10f",Pa[i]);if(i==N-1) printf("\n");}}void Init(double *Pa){ double s=N;int i;for(i=0;i<N;i++)Pa[i]=1.0/s;}void Input(double *Pa,double *a){ int i; double temp=0.0;for(i=0;i<N;i++)temp+=Pa[i]*a[i];for(i=0;i<N;i++)Pa[i]=(Pa[i]*a[i])/temp;}void Output(double *Pa,double P[N][M],double *Pb) { int i,j;double temp=0.0;for(j=0;j<M;j++){ for(i=0;i<N;i++)temp+=Pa[i]*P[i][j];Pb[j]=temp;temp=0.0;}}void Infor(double *Pb,double P[N][M],double *a) { int i,j;double temp=0.0;for(i=0;i<N;i++){ for(j=0;j<M;j++)if(P[i][j]==0)temp+=0;else temp+=P[i][j]*log(P[i][j]/Pb[j]);a[i]=exp(temp);temp=0.0;}}double capacity1(double *Pa,double *a){ int i; double temp=0.0;for(i=0;i<N;i++)temp+=Pa[i]*a[i];temp=log(temp);return temp;}double capacity2(double *a){ int i;double max;max=a[0];for(i=1;i<N;i++)if(max<a[i])max=a[i];max=log(max);return max;}实际运行结果如下:1、如果输入的转移概率矩阵不正确:2、正确输入转移概率矩阵:MATLAB语言方法实现,源程序如下:1、M-程序如下(命名为capacity.m):clear;P=input('请输入信道矩阵P='); %输入信道矩阵[r,s]=size(P);e=input('请输入迭代精度:'); %输入迭代精度for i=1:rPa(i)=1.0/r;end %初始概率为均匀分布count=0; %迭代次数while 1Pb=Pa*P; %计算输出概率分布for i=1:ra(i)=0;for j=1:sif P(i,j)==0a(i)=a(i)+0;elsea(i)=a(i)+P(i,j)*log(P(i,j)/Pb(j));endenda(i)=exp(a(i));end %计算a(i)temp=Pa*a'; %计算ΣPa(i)*a(i)C1=log(temp); %计算C(n+1,n)C2=log(max(a)); %计算C'(n+1,n)count=count+1;if abs(C1-C2)<eC=log2(exp(1))*C1;break;elsePa=(Pa.*a)/temp; %重新调整输入概率分布endenddisp('输入分布:');Padisp('信道矩阵为:');Pdisp('迭代次数');countdisp('信道容量');C2、命令窗口指令如下:>> capacity请输入信道矩阵P=[0.5,0.25,0,0.25;0,1,0,0;0,0,1,0;0.25,0,0.25,0.5]请输入迭代精度:0.00000001输入分布:Pa =0.1333 0.3667 0.3667 0.1333 信道矩阵为:P =0.5000 0.2500 0 0.25000 1.0000 0 00 0 1.0000 00.2500 0 0.2500 0.5000 迭代次数count =16信道容量C =1.3219>>。
一般离散无记忆信道容量的迭代计算信道容量的迭代算法1信道容量的迭代算法的步骤一、用了matlab 实现DMC 容量迭代的算法如下:第一步:首先要初始化信源分布:.0deta 10,1,0,1)(>>=⋯==,选置,,k r i rP k i 即选取一个精度,本次中我选deta=0.000001。
第二步:}{,)()()()(k ij i ji k i jik i k ij t p pp p t 得到反向转移概率矩阵根据式子∑=。
第三步:第四步:第五步: 若a C C C k k k det )1()()1(>-++,则执行k=k+1,然后转第二步。
直至转移条件不成立,接着执行下面的程序。
第六步:输出迭代次数k 和()1+k C 和1+k P ,程序终止。
()()()()(){}111]log exp[]log exp[+++==∑∑∑k i k i j ij k ji j ij k ji k i p P t pt p p 计算由式()()()()()()。
C t p t P I C k r i s j k ij ji k k k 10011log exp log ,+==++⎪⎭⎪⎬⎫⎪⎩⎪⎨⎧⎥⎦⎤⎢⎣⎡==∑∑计算由式2. Matlab实现clear;r=input('输入信源个数:');s=input('输入信宿个数:');deta=input('输入信道容量的精度: ');Q=rand(r,s); %形成r行s列随机矩阵QA=sum(Q,2); %把Q矩阵每一行相加和作为一个列矩阵AB=repmat(A,1,s); %把矩阵A的那一列复制为S列的新矩阵%判断信道转移概率矩阵输入是否正确P=input('输入信道转移矩阵P:')%从这句话开始将用下面两句代替可自动生成信道转移矩阵[r,s]=size(P);for i=1:rif(sum(P(i,:))~=1) %检测概率转移矩阵是否行和为1.error('概率转移矩阵输入有误!!')return;endfor j=1:sif(P(i,j)<0||P(i,j)>1) %检测概率转移矩阵是否负值或大于1error('概率转移矩阵输入有误!!')return;endendend%将上面的用下面两句代替可自动生成信道转移矩阵%disp('信道转移概率矩阵:')%P=Q./B 信道转移概率矩阵(每一个原矩阵的新数除以所在行的数总和)i=1:1:r; %设置循环首项为1,公差为1,末项为r(Q的行数)的循环p(i)=1/r; %原始信源分布r个信源,等概率分布disp('原始信源分布:')p(i)E=repmat(p',1,s);%把r个等概率元素组成一列,复制为s列for k=1:1:1/detam=E.*P; % m=p.*E; %后验概率的分子部分a=sum(m); %把得到的矩阵m每列相加之和构成一行su1=repmat(a,r,1);%把得到的行矩阵a复制r行,成一新矩阵sul,后验概率的分母部分t=m./su1; %后验概率矩阵n=exp(sum(P.*log(t),2)); %信源分布的分子部分su2=sum(n); %信源分布的分母部分p=n/su2; %信源分布E=repmat(p,1,s);C(k+1)=log(sum(exp(sum(P.*log(t),2))))/log(2);kk=abs(C(k+1)-C(k))/C(k+1);if(kk<=deta)break;enddisp('迭代次数:k='),disp(k)enddisp('最大信道容量时的信源分布:p='),disp(p')disp('最大信道容量:C='),disp(C(k+1))3.运行结果及分析结果分析:这两组数据都是我随机选的,都是选的信源个数为2,信宿的个数为3,选用的精度为0.000001。
C语言程序:#include<stdio.h>#include<math.h>#include<stdlib.h>int main(){int r,s,i,j,k=0;double p[20]; %存放输入信源概率矩阵double z[20];double q[20][20]; %存放信道转移概率矩阵p x y的概率分布矩阵的转置double F[20][20]; %存放(|)i idouble x,y,a;double epsilon=1e-5; %门限double C=-1000.0; %取初始迭代时的信道容量为一个较大的负数printf("\n请输入信源符号个数: ");scanf("%d",&r);printf("\n请输入信宿符号个数: ");scanf("%d",&s);printf("\n请输入信道转移概率矩阵: \n\n");for(i=0;i<r;i++){for(j=0;j<s;j++)scanf("%lf",&q[i][j]);printf("\n");}for(i=0;i<r;i++)p[i]=(double)(1.0/(double)r); %设初始信源分布为等概分布do{k++;a=C;for(j=0;j<s;j++){x=0.0;for(i=0;i<r;i++)p x y的分母部分x=x+(p[i])*(q[i][j]); % x 为(|)i iif(x>0)for(i=0;i<r;i++)p x y的概率分布矩阵的转置F[i][j]=(p[i])*(q[i][j])/x; % F为(|)i ielsefor(i=0;i<r;i++)F[i][j]=0.0; %的分母部分为0时, 令F=0}y=0.0;for(i=0;i<r;i++){z[i]=0.0;for(j=0;j<s;j++){if(F[i][j]>0)p的分子部分z[i]=z[i]+(q[i][j]*(log(F[i][j])/log(2.0))); %z[i]为i}z[i]=(pow(2.0,z[i]));p的分母部分y=y+z[i]; %z[i]为i}for(i=0;i<r;i++){p[i]=z[i]/y; %更新输入信源概率矩阵}C=(log(y)/log(2.0)); %求信道容量单位为“bit”}while(fabs((C-a)/C)>epsilon);printf("\n迭代次数为;k=%d\n",k); %输出迭代次数printf("\n最佳信源分布为: \n\n");for(i=0;i<r;i++){printf("%.3lf ",p[i]); %输出信源的最佳分布, 保留3位小数}printf("\n");printf("\n信道容量为:C=%.3lf bit\n\n",C); %输出信道容量, 保留3位小数}问题1的执行结果:问题2 的执行结果:。
实验四信道容量迭代算法一、实验目的让学生初步掌握信道容量的基础知识、计算方法及迭代算法计算方法,以及取得信道容量的判别算法,并学会使用c 语言完成迭代算法。
二、实验原理信息率失真函数迭代算法具体如下:(1)首先假设绝对值足够大的负数作为斜率S 的取值,并且选择试验信道的转移概率1(|)j k p b a 为等分布的,且令1n =。
(2)根据公式1()(|)()rn j n j k k k p b p b a p a ==∑计算出()n j p b 。
(2)将()n j p b 代入公式1()exp((,))(|)()exp[(,)]n j i j n j i n j i jj p b Sd a b p b a p b Sd a b +=∑计算出1(|)n j i p b a +。
(4)计算平均失真和信息率1111()(|)(,)s r n i n j i i j j i D p a p b a d a b ++===∑∑11(|)()(|)log()r s n j i n i n j i i j n j p b a R p a p b a p b ===∑∑(5)如果1||n n D D ε+-≤,则跳转到(6);否则,令1n n =+,跳转到(2)。
其中ε为事先确定的精度。
(6)令()n D S D =,()n R S R =;改变斜率值S ,选择初始条件概率为等概率分布,令1n =,然后跳转到(2),直至斜率足够接近0为止。
三、实验内容1)给定一个两输入的概率分布和失真矩阵测度分别如下12()1X a a p x p p ⎡⎤⎡⎤=⎢⎥⎢⎥-⎣⎦⎣⎦11122122(,)(,)01(,)(,)10d a b d a b d a b d a b ⎡⎤⎡⎤==⎢⎥⎢⎥⎣⎦⎣⎦D 令p=0.5,初始斜率s=-20,斜率递增步长为0.05,利用迭代算法完成信息率失真函数的计算;将失真和信息率的值写入excel 文档,利用excel 的绘图工具画出信息率失真函数曲线;2)令p=0.3,0.1重复上述过程。
中文摘要信道是信息传递的通道,承担信息的传输和储存的任务,是构成通信系统的重要组成部分。
信道容量是指信道能够传输信息量的大小。
信道容量的研究在现实中有着非常重要的理论意义。
而信道容量的计算是一个比较复杂的问题,所以我们要借助于数学软件Matlab来解决这个难题。
本文的第一部分从信道容量的基本概念、基本原理、信道模型及分类等方面系统的介绍了信道容量。
并在此基础上,介绍了一般信道容量的计算步骤。
本文的第二部分开始介绍信道容量的迭代算法及迭代算法在Matlab中的实现,举例检验迭代算法在Matlab中实现的程序的可行性关键词信道容量 Matlab 迭代算法AbstractChannel is a channel of information transmission. And it take on the task of information transmission and storage. Channel is an important part of communication system. Channel capacity is the size of the amount of information can be transmitted. It has important significances in reality. However, calculating the channel capacity is a complex issue. So we must use the mathematical software Matlab to solve this problem.The first part of the article, it introduces channel capacity by the basic concepts, principles and the classification of channel models. On this basis, introduce and discuss the calculation steps of the general channel capacity.The second part of the article, it introduces the Iterative algorithm of the channel capacity and implementes the iterative algorithm in Matlab. After that, by realizing the feasibility of the procedure, we make some examples. And also analyze the procedure.Key word :channel capacity、matlab目录引言 (6)1、离散信道的数学模型 (6)2、信道容量和最佳输入概率分布 (6)2.1信道容量 (6)2.2最佳输入概率分布 (7)3、信道容量和平均互信息的计算步骤 (7)3.1平均互信息的计算 (7)3.2信道容量的计算 (7)4、信道容量的迭代算法 (8)5、实例分析 (9)结论 (10)参考文献 (11)附 (12)引言本文主要结合实例对离散信道及其信道容量进行相关阐述,及用迭代算法实现离散信道容量1、离散信道的数学模型设离散信道的输入为一个随机变量X ,相应的输出的随机变量为Y ,如图所示: 规定一个离散信道应有三个参数: 输入信号:X={X1, X2, …, XN} 输出信号:Y={Y1, Y2, …, YN}信道转移概率:P(y|x) 描述了输入信号和输出信号之间的依赖关系 。
根据P(y|x) ,可对离散信道分类如下:(1)无干扰信道:输入信号与输出信号 有一一对应关系(2)有干扰无记忆信道:任意时刻输出符号只与对应时刻的输入符号有关;(3)有干扰有记忆信道:这是最一般的信道。
2、信道容量和最佳输入概率分布2、1 信道容量我们先定义信息传输率:R=I(X,Y)=[H(X)-H(X/Y)]=[H(Y)-H(Y/X)] 比特/符号。
互信息I(X;Y)是输入符号分布概率)(i a p 和信道转移概率)|(i j a b p 的函数。
对于某特定信道,转移概率)|(i j a b p 已经确定,则互信息就是关于输1()()(/)0()y f x y f x P y x y f x =⎧==⎨≠⎩,并且12121(|)(|)(|)Ni i i P y x P y y x x P y x ===∏N N ...y ...x ()()max{(;)}max{()(/)}P X P X C I X Y H X H X Y ==-入符号分布概率)(i a p 的 型凸函数,也就是可以找到某种概率分布)(i a p ,使I(X;Y)达到最大,该最大值就是信道所能传送的最大信息量,即信道容量(channel capacity )。
信道容量与与信源无关,它是信道的特征参数,反应的是信道的最大的信息传输能力。
2、2 最佳输入概率分布首先介绍一定理:一般离散信道达到信道容量的充要条件是输入概率分布满足该定理说明,当平均互信息达到信道容量时,信源每一个符号都对输出端输出相同的互信息。
此时满足该条件的输入概率分布即为最佳输入概率分布。
特别地对于二元对称信道P=1/2时,C =0。
不管输入概率如何,都能达到信道容量。
此信道没有实际意义,但在理论上说明信道的最佳输入分布不一定是唯一的。
3、信道容量和平均互信息的计算步骤 3、1平均互信息的计算3、2信道容量的计算()(;)0()(;)0i i a I x Y C x b I x Y C x =≠⎧⎨≤=⎩i i 对所有其p 对所有其p log 2()1()C H p H p =-=-1(/)(;)(/)log()sj i j i j j p b a I x Y p b a p b ==∑对于一般信道的求解方法,就是求解方程组移项得:令 则若r=s ,此方程有解,可以解出s 各未知数βj ,再根据得 从而信道容量求出后,计算并没有结束,必须解出相应的)(i x p ,并确认所有的)(i x p 都大于或等于0时,所求的C 才存在,因为在我们对 I(X;Y)求偏导时只限制1)(1=∑=ni i x p ,并没有限制0)(≥i x p ,所以求出的)(i x p 可能为负值,此时的C 就不存在,必须对)(i x p 进行调整再求解C.一般由迭代算法求出。
4、信道容量的迭代算法记ij i j p x y p =)|( ,i i p x p =)(,ji i i y x p ϕ=)|( i=1,2...r;j=1,2...s初始化信源分布)......,(21)0(r i p p p p p =,置迭代计数器k=0,设信道容量相对误差门限为δ,δ>0;②∑=ik i ij k i ij k ji p p p p )()()(ϕ11(/)[log ()](/)log (/)s sj i j j i j i j j P b a C P b P b a P b a ==+=∑∑log ()j j C P b β=+11(/)(/)log (/)ssji j j i j i j j P ba Pb a P b a β===∑∑()2j Cj P b β-=121jsCj β-==∑1log 2jsj C β==∑11(/)log (/)(/)log ()s sj i j i j i j j j P b a P b a P b a P b C ==-=∑∑③∑∑∑=+ijk jiijjk ji ij k i pp p ]}ln {exp[]ln exp[)()()1(ϕϕ④}]ln exp[ln{)()1(∑∑=+ijk ji ij k p C ϕ ⑤如果δ≤-=∆+++)1()()1(1k k k k CC C C)(,转向⑦ ⑥置迭代序号k+1 k,转向② ⑦输出)1()(+k i x p 的结果和)1(+k C 的结果 ⑧停止5、实例分析以教材3-4、3-6进行分析,并通过matlab 实现3-4概率转移矩阵为⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--=εεεε1010001|X Y p ,输入信号、输出信号均为 (0,1,2);3-6的概率转移矩阵为⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=2/1002/12/12/10002/12/10002/12/1|XY p ,显然该信道为对称信道,设允许误差门限e=0.0001,分别把这两题的条件代入matlab 程序,即得信道容量C 分别为1.584963比特/符号(3-4题ε=0时)、1.000000比特/符号(3-4题ε=1/2时)、1.000000比特/符号(3-6); 与书后答案1.58、1、1基本符合,故本次设计可行。
相关程序代码见附。
结论/讨论通过本次结合课后习题对离散信道容量通过matlab程序实现,对离散信道及其信道容量又有了更深的了解,同时也对matlab对于矩阵数值迭代的功能加强了掌握。
本次设计参考了一些教材及相关论文,有相当一部分知识不甚了解,所以对于离散信道的相关知识有待进一步地去渗透。
参考文献:【1】曹雪虹、张宗橙信息论与编码清华大学出版社 2009年第二版【2】管宇离散信道容量的迭代算法应用数学与计算数学学报2006年02期附:function main()clc;p=[1 0 00 1/2 1/20 1/2 1/2]p2=[1 0 00 1 00 0 1]p3=[1/2 1/2 0 00 1/2 1/2 00 0 1/2 1/21/2 0 0 1/2]channel_cap(p1,0.0001)channel_cap(p2,0.0001)channel_cap(p3,0.0001)% Matlab实现离散信道容量的迭代算法% 功能:利用迭代算法计算离散信道的容量%参数解释%C:信道容量%P:转移概率矩阵%B:中间变量矩阵%e:信道容限%X:输入概率分布%n:迭代次数function channel_cap(P, e)n=0;C=0;C_0=0;C_1=0;[r,s]=size(P);for i=1:rif(sum(P(i,:))~=1)%检测概率转移矩阵是否行和为1.error('概率转移矩阵输入有误!!')return;endfor j=1:sif(P(i,j)<0||P(i,j)>1)%检测概率转移矩阵是否负值或大于1 error('概率转移矩阵输入有误!!')return;endendendX=ones(1,r)/r;A=zeros(1,r);B=zeros(r,s);while(1)n=n+1;for i=1:rfor j=1:sB(i,j)=log(P(i,j)/(X*P(:,j))+eps);endA(1,i)=exp(P(i,:)*B(i,:)');endC_0=log2(X*A');C_1=log2(max(A));if (abs(C_0-C_1)<e) %满足迭代终止条件停止迭代C=C_0;fprintf('迭代次数: n=%d\n',n)fprintf('信道容量: C=%f比特/符号\n',C) break; %满足后输出结果并退出elseX=(X.*A)/(X*A');continue;endEnd程序运行结果为:p1 =1.0000 0 00 0.5000 0.50000 0.5000 0.5000p2 =1 0 00 1 00 0 1p3 =0.5000 0.5000 0 0 0 0.5000 0.5000 0 0 0 0.5000 0.5000 0.5000 0 0 0.5000迭代次数: n=2信道容量: C=1.000000比特/符号迭代次数: n=1信道容量: C=1.584963比特/符号迭代次数: n=1信道容量: C=1.000000比特/符号。