当前位置:首页 » 操作系统 » 信道容量迭代算法

信道容量迭代算法

发布时间: 2022-07-29 22:35:22

A. 迭代法计算的程序

迭代法计算信道容量C++程序

#include <iostream>
#include <vector>
#include <cfloat>
#include <cmath>
using namespace std;

#define FLOAT_MINUS_PRECISION 0.00001

typedef vector<float*> VEC_PFLOAT;

//迭代计算信道容量,参数值为信源,信宿符号个数和信道转移概率矩阵,返回信道容量

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*Pji

float 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";

for (int i = 0; i < nLine; i++)

{

float *pfTemp = new float[nCol];

Label1:

float 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<<pfTemp[k];

cout<<"\n";

}

vTransMatrix.push_back(pfTemp);

}

cout<<"信道容量为:";

for (int k = 0; k < vTransMatrix.size(); k++)

{

float* pfTemp = vTransMatrix.at(k);

delete pfTemp;

}

vTransMatrix.clear();

return 0;

}

看看对你有帮助吧!!!

B. 急! 信道容量迭代算法哪里出错了,请高手帮帮忙

等待高手,我就是不会,要是我会的话,0分也给你解决。

C. 信道容量是什么意思

信道容量是信道能无错误传送的最大信息率。

对于只有一个信源和一个信宿的单用户信道,它是一个数,单位是比特每秒或比特每符号。它代表每秒或每个信道符号能传送的最大信息量,或者说小于这个数的信息率必能在此信道中无错误地传送。

对于多用户信道,当信源和信宿都是两个时,它是平面上的一条封闭线。当有m个信源和信宿时,信道容量将是m 维空间中一个凸区域的外界“面”。

信道容量计算思路:

为了评价实际信道的利用率,应具体计算已给信道的容量。这是一个求最大值的问题。由于互信息对输入符号概率而言是凸函数,其极值将为最大值,因此这也就是求极值的问题。对于离散信道,P(x)是一组数,满足非负性和归一性等条件,可用拉格朗日乘子法求得条件极值。

对于连续信道,P(x)是一函数,须用变分法求条件极值。但是对于大部分信道,这些方法常常不能得到显式的解,有时还会得到不允许的解,如求得的P(x)为负值等。为了工程目的,常把信道近似表示成某些易于解出容量的模式,如二元对称信道和高斯信道。

对于连续信道,只需把输入集和输出集离散化,就仍可用迭代公式来计算。当然如此形成的离散集,包含的元的数目越多,精度越高,计算将越繁。对于信息论中的其他量,如信息率失真函数,可靠性函数等,都可以用类似的方法得到的各种迭代公式来计算。

D. 信道容量的计算

信道的输入、输出都取值于离散符号集,且都用一个随机变量来表示的信道就是离散单符号信道。由于信道中存在干扰,因此输入符号在传输中将会产生错误,这种信道干扰对传输的影响可用传递概率来描述。
信道传递概率通常称为前向概率。它是由于信道噪声引起的,所以通常用它描述信道噪声的特性。
有时把p(x)称为输入符号的先验概率。而对应的把p(x|y)称为输入符号的后验(后向)概率。
平均互信息 I(X;Y) 是接收到输出符号集Y后所获得的关于输入符号集X的信息量。信源的不确定性为H(X),由于干扰的存在,接收端收到 Y后对信源仍然存在的不确定性为H(X|Y),又称为信道疑义度。信宿所消除的关于信源的不确定性,也就是获得的关于信源的信息为 I(X;Y),它是平均意义上每传送一个符号流经信道的信息量,从这个意义上来说,平均互信息又称为信道的信息传输率,通常用 R 表示。
有时我们所关心的是信道在单位时间内平均传输的信息量。如果平均传输一个符号为t秒,则信道平均每秒钟传输的信息量为Rt一般称为信息传输速率。
对于固定的信道,总存在一种信源(某种输入概率分布),使信道平均传输一个符号接收端获得的信息量最大,也就是说对于每个固定信道都有一个最大的信息传输率,这个最大的信息传输率即为信道容量,而相应的输入概率分布称为最佳输入分布。
信道容量是信道传送信息的最大能力的度量,信道实际传送的信息量必然不大于信道容量。
要使信道容量有确切的含义,尚须证明相应的编码定理,就是说当信息率低于信道容量时必存在一种编码方法,使之在信道中传输而不发生错误或错误可任意逼近于零。已经过严格证明的只有无记忆单用户信道和多用户信道中的某些多址接入信道和退化型广播信道。对某些有记忆信道,只能得到容量的上界和下界,确切容量尚不易规定。 为了评价实际信道的利用率,应具体计算已给信道的容量。这是一个求最大值的问题。由于互信息对输入符号概率而言是凸函数,其极值将为最大值,因此这也就是求极值的问题。对于离散信道,P(x)是一组数,满足非负性和归一性等条件,可用拉格朗日乘子法求得条件极值。对于连续信道,P(x)是一函数,须用变分法求条件极值。但是对于大部分信道,这些方法常常不能得到显式的解,有时还会得到不允许的解,如求得的P(x)为负值等。为了工程目的,常把信道近似表示成某些易于解出容量的模式,如二元对称信道和高斯信道。
对于其他信道的容量计算曾提出过一些方法,但都有较多的限制。比较通用的解法是迭代计算,可借助计算机得到较精确的结果。
对于连续信道,只需把输入集和输出集离散化,就仍可用迭代公式来计算。当然如此形成的离散集,包含的元的数目越多,精度越高,计算将越繁。对于信息论中的其他量,如信息率失真函数,可靠性函数等,都可以用类似的方法得到的各种迭代公式来计算。 从求信道容量的问题实际上是在约束条件下求多元函数极值的问题,在通常情况下,计算量是非常大的。下面我们介绍一般离散信道的平均互信息达到信道容量的充要条件,在某些情况下它可以帮助我们较快地找到极值点。(定理略去)
信道容量定理只给出了达到信道容量时,最佳输入概率分布应满足的条件,并没有给出最佳输入概率分布值,也没有给出信道容量的数值。另外,定理本身也隐含着达到信道容量的最佳分布不一定是唯一的,只要输入概率分布满足充要条件式,就是信道的最佳输入分布。在一些特殊情况下,我们常常利用这一定理寻求输入分布和信道容量值。 对于给定离散无记忆信道,其符号转移概率分布已定,通过适当改变输入符号集上的概率分布,可使传信率达到最大值,即该信道容量公式 如右图8 。其中E是输入符号集上所有可能概率分布的集。
对于连续信道,应将式中概率分布换成概率密度,求和号换成积分号,即得出连续信道的容量公式。
容量的计算是在特定约束条件下,求传信率函数I(X;Y)的极大值问题。对离散信道的约束条件是输入符号的概率,对于连续信道,除了概率约束条件外,还可有不同的约束条件,如平均功率或峰值功率受限。由于I(X;Y)是输入分布(或密度)的上凸函数,故其极值即为最大值,可见,求容量在于求I(X;Y)的条件极值。简单情况下,离散信道可用拉格朗日乘子法求解,连续信道可用变分法求解。R.E.勃拉赫特提出的迭代算法可精确求解一般离散无记忆信道的容量,也可用来近似计算连续信道的容量以及率失真函数和可靠性函数。
常见的二元对称信道(BSC)的容量公式如图9 ,式中ε是符号出差错的概率。常见的加性白高斯噪声(AWGN)信道的容量公式如图10 ,式中S是信道允许的平均功率,N0是白高斯噪声的单边功率谱密度,F是信道许用带宽。当F→∞时有。令Eb表示每比特信息占有的能量,则S=REb,R是传信率。由图11及编码定理有,通称-1.6dB为仙农极限,它表示在无限带宽的AWGN信道中,传送1bit信息所需的最小Eb/N0。
实际离散信道的输入和输出常常是随机变量序列,用随机矢量来表示,称为离散多符号信道。
若在任意时刻信道的输出只与此时刻信道的输入有关,而与其他时刻的输入和输出无关,则称之为离散无记忆信道,简称为DMC(discrete memoryless channel)。
输入、输出随机序列的长度为N的离散无记忆平稳信道通常称为离散无记忆信道的N次扩展信道。
对于离散无记忆N次扩展信道,当信源是平稳无记忆信源时,其平均互信息等于单符号信道的平均互信息的N倍。
当信源也是无记忆信源并且每一时刻的输入分布各自达到最佳输入分布时,才能达到这个信道容量NC。 前面我们分析了单符号离散信道和离散无记忆信道的扩展信道。实际应用中常常会遇到两个或更多个信道组合在一起使用的情况。例如,待发送的消息比较多时,可能要用两个或更多个信道并行发送,这种组合信道称为并联信道;有时消息会依次地通过几个信道串联发送,例如无线电中继信道,数据处理系统,这种组合信道称为级联信道。在研究较复杂信道时,为使问题简化,往往可以将它们分解成几个简单的信道的组合。这一节我们将讨论这两种组合信道的信道容量与其组成信道的信道容量之间的关系。
独立并联信道的信道容量才等于各信道容量之和。
级联信道是信道最基本的组合形式,许多实际信道都可以看成是其组成信道的级联。两个单符号信道组成的最简单的级联信道X→Y→Z 组成一个马尔可夫链。根据马尔可夫链的性质,级联信道的总的信道矩阵等于这两个串接信道的信道矩阵的乘积。求得级联信道的总的信道矩阵后,级联信道的信道容量就可以用求离散单符号信道的信道容量的方法计算。

E. 信道容量的迭代算法如何求吖

《应用数学与计算数学学报》 2006年02期
离散信道容量的迭代算法 管宇

信息给你了,你自己通过网上图书馆找吧

顺便问一句,同学,你海院学信息的吧,教这课的是李XX吧
我们也正找这些资料呢,大家互相帮助啊!

F. 求信道容量的迭代算法

#include<stdio.h>
#include<math.h>
#define MAX 100
double Calculate_a(int k,double pa[]);
double Calculate_C1(double pa[],double a[]);
double Calculate_C2(double a[]);
int r,s;
double pba[MAX][MAX];
void main()
{
int i,j;
double C1,C2,E;
double a[MAX],pa[MAX];
E=0.000001;
printf("请输入信源符号个数r:\n");
scanf("%d",&r);
printf("请输入信宿符号个数s:\n");
scanf("%d",&s);
printf("请输入信源P[ai]:\n");
for(i=0;i<r;i++)
scanf("%lf",&pa[i]);
printf("请输入信道转移概率矩阵P[bj][ai]:\n");
for(i=0;i<r;i++)
for(j=0;j<s;j++)
scanf("%lf",&pba[i][j]);
do
{
for(i=0;i<r;i++)
a[i]=Calculate_a(i,pa);
C1=Calculate_C1(pa,a);
C2=Calculate_C2(a);
if(C2-C1>=E)
{
double sum=0;
for(i=0;i<r;i++)
sum+=pa[i]*a[i];
for(i=0;i<r;i++)
pa[i]=pa[i]*a[i]/sum;
}
else
{
printf("最佳信源分布:\n");
for(i=0;i<r;i++)
printf(" %lf \n",pa[i]);
}
}while(C2-C1>=E);
printf("信道容量为:%lf\n",C1/log(2));
}
double Calculate_a(int k,double pa[])
{
int i,j;
double temp,sum2=0;
for(j=0;j<s;j++)
{
double sum1=0;
for(i=0;i<r;i++)
{
sum1+=pa[i]*pba[i][j];
}
temp=pba[k][j]/sum1;
temp=log(temp);
sum2+=pba[k][j]*temp;
}
return exp(sum2);
}
double Calculate_C1(double pa[],double a[])
{
int i;
double sum=0;
for(i=0;i<r;i++)
sum+=pa[i]*a[i];
return log(sum);
}
double Calculate_C2(double a[])
{
int i;
double max=a[0];
for(i=0;i<r;i++)
if(max<a[i]) max=a[i];
return log(max);
}

G. 急求信道容量matlab编程代码!!已知一个信道的信道转移矩阵为 p用Matlab编写函数求信道容量.

%亲自验证,绝对可用!
% Matlab实现离散信道容量的迭代算法% 功能:利用迭代算法计算离散信道的容量
%参数解释
%C:信道容量
%P:转移概率矩阵
%B:中间变量矩阵
%e: 信道容限,一般选0.00001
%X:输入概率分布
%n:迭代次数

function channel_cap(P, e)
n=0;
C=0;
C_0=0;
C_1=0;
[r,s]=size(P);
for i=1:r
if(sum(P(i,:))~=1)%检测概率转移矩阵是否行和为1.
error('概率转移矩阵输入有误!!')
return;
end
for j=1:s
if(P(i,j)<0||P(i,j)>1)%检测概率转移矩阵是否负值或大于1
error('概率转移矩阵输入有误!!')
return;
end
end
end
X=ones(1,r)/r;
A=zeros(1,r);
B=zeros(r,s);
while(1)
n=n+1;
for i=1:r
for j=1:s
B(i,j)=log(P(i,j)/(X*P(:,j))+eps);
end
A(1,i)=exp(P(i,:)*B(i,:)');
end
C_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; %满足后输出结果并退出
else
X=(X.*A)/(X*A');
continue;
end
end

热点内容
源码分享站 发布:2025-01-19 01:21:26 浏览:909
安卓如何设置方向锁定生效 发布:2025-01-19 01:21:25 浏览:70
iis上传限制 发布:2025-01-19 01:14:52 浏览:12
我的世界宝可梦服务器181 发布:2025-01-19 01:12:32 浏览:181
如何用云服务器挂游戏 发布:2025-01-19 01:09:19 浏览:209
电脑系统还原如何清除缓存 发布:2025-01-19 01:08:08 浏览:780
easyui删除数据库数据库数据库数据 发布:2025-01-19 01:01:54 浏览:27
扣扣号密码也没有多少 发布:2025-01-19 01:01:46 浏览:608
用文件夹怎么安装系统 发布:2025-01-19 00:48:04 浏览:476
购买华为云服务器是固定ip吗 发布:2025-01-19 00:46:35 浏览:901