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:信道容量
%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=0A=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信道的模块,在blocksimulink里,这度个简短不了;
部分参考如下:
SNR=0
%定义信噪吵轮知比为0HZ
A=10^(SNR/10)
%信噪陵袭比的道单位转换关系式
Im=eye(1)
%这里回的"1"为发尺碰兄射天线和接收天线两者数目少答的根数
sum=0
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)