當前位置:首頁 » 操作系統 » 信道容量迭代演算法

信道容量迭代演算法

發布時間: 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

熱點內容
入侵php 發布:2025-01-18 19:01:09 瀏覽:801
存儲的下標范圍 發布:2025-01-18 19:00:57 瀏覽:337
文件夾怎麼打開 發布:2025-01-18 18:47:07 瀏覽:296
杉德卡卡號和密碼看哪裡 發布:2025-01-18 18:43:27 瀏覽:712
android返回退出 發布:2025-01-18 18:43:26 瀏覽:601
linux採集視頻 發布:2025-01-18 18:38:38 瀏覽:638
差異度演算法 發布:2025-01-18 18:34:27 瀏覽:698
電腦全套配置有哪些 發布:2025-01-18 18:32:39 瀏覽:145
新項目源碼 發布:2025-01-18 18:14:48 瀏覽:517
腳本設計圖 發布:2025-01-18 18:06:17 瀏覽:601