求一个信道容量的matlab程序

求一个信道容量的matlab程序,第1张

代码:function main()

clc

p=[1/2 1/4 0 1/4

0 1 0 0

0 0 1 0

1/4 0 1/4 1/2]

channel_cap(p,0.001)

% 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: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

结果:迭代次数: n=6

信道容量: C=1.321928比特/符号

>> 参考: http://hi.baidu.com/snowworld2008/blog/item/22f091f3d78925da0b46e037.html

SNR=0

A=10^(SNR/10)

C=zeros(9,9)

sum=zeros(9,9)

for Nt=1:9

for Nr=1:9

if (Nt>=Nr)

Im=eye(Nr)

else Im=eye(Nt)

end

%sum=0

H=randn(Nr,Nt)

if(Nr<Nt)

Q=H*H'

else Q= H'*H

end

sum(Nt,Nr)= log2(det(Im+A*Q/Nt))

C(Nt,Nr)=sum(Nt,Nr)

end

end

C

按上面语此袜逗句森卖试试好晌

matlab自带了一个百mimo信道的模块,在block

simulink里,这度个简短不了;

部分参考如下:

SNR=0

%定义信噪吵轮知比为0HZ

A=10^(SNR/10)

%信噪陵袭比的道单位转换关系式

Im=eye(1)

%这里回的"1"为发尺碰兄射天线和接收天线两者数目少答的根数

sum=0


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12458545.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存