?? log_map_rayleigh.m
字號(hào):
function pb=log_map_rayleigh(rho_in_dB,BPH,number_of_states)
%this function simulate the MAP demodulation of the DFH system
N=1000;
fanout=2^BPH;
rho=10^(rho_in_dB/10);
L=floor(log(number_of_states)/log(fanout));
source=randint(1,N,fanout);
depth_of_trellis=length(source);
nextstate=zeros(number_of_states,fanout);
formerstate=number_of_states.*ones(number_of_states,fanout,fanout);
output=zeros(number_of_states,fanout);
number_of_out=number_of_states*fanout;
for i=0:number_of_states-1
for j=0:fanout-1
k=1;
[next_state,out_put]=G_func1(i,j,L,fanout);
nextstate(i+1,j+1)=next_state;
output(i+1,j+1)=out_put;
while(formerstate(next_state+1,k,j+1)~=number_of_states)
k=k+1;
end
formerstate(next_state+1,k,j+1)=i;
end
end
E=1;
sgma=sqrt(E/(BPH*2*rho));
demod_input=zeros(number_of_out,depth_of_trellis);
f=zeros(1,depth_of_trellis);
P=0;
for i=1:depth_of_trellis
f(i)=output(P+1,source(i)+1);
for j=0:number_of_out-1
if(j~=f(i))
rc=sgma*randn;
rs=sgma*randn;
else
rc=raylrnd(1/sqrt(2))+sgma*randn;
rs=sgma*randn;
end
demod_input(j+1,i)=rc^2+rs^2;
end
P=nextstate(P+1,source(i)+1);
end
sgma21=2*sgma^2*(1+BPH*rho);
sgma22=2*sgma^2;
alpha=zeros(number_of_states,depth_of_trellis);
alpha(:,1)=[0;-1e10*ones(number_of_states-1,1)];
alpha1=zeros(1,fanout);
gamma=zeros(fanout,depth_of_trellis);
max=-1e10*ones(1,depth_of_trellis-1);
beta=zeros(number_of_states,depth_of_trellis);
beta(:,depth_of_trellis)=log(1/number_of_states)*ones(number_of_states,1);
beta1=zeros(1,fanout);
decis=zeros(1,depth_of_trellis);
for i=1:depth_of_trellis-1
for j=1:number_of_states
for k=1:fanout
if(formerstate(j,1,k)~=number_of_states)
for h=1:fanout
sel=demod_input(output(formerstate(j,h,k)+1,k)+1,i);
neg=sum(demod_input(:,i))-sel;
gamma(h,i)=70-(sel/sgma21+neg/sgma22);
alpha1(h)=alpha(formerstate(j,h,k)+1,i)+gamma(h,i);
if(alpha1(h)<=-80)
alpha1(h)=0;
else
alpha1(h)=exp(alpha1(h));
end
end
if(sum(alpha1)>1e-30)
alpha(j,i+1)=log(sum(alpha1));
else
alpha(j,i+1)=-1e10;
end
if(max(i)<alpha(j,i+1))
max(i)=alpha(j,i+1);
end
end
end
end
alpha(:,i+1)=alpha(:,i+1)-max(i);
end
for i=depth_of_trellis:-1:1
temp=zeros(1,fanout);
for j=1:number_of_states
for k=1:fanout
sel=demod_input(output(j,k)+1,i);
neg=sum(demod_input(:,i))-sel;
gamma(k,i)=70-(sel/sgma21+neg/sgma22);
beta1(k)=beta(nextstate(j,k)+1,i)+gamma(k,i);
if(beta1(k)<=-80)
beta1(k)=0;
else
beta1(k)=exp(beta1(k));
end
temp(k)=temp(k)+exp(alpha(j,i)+gamma(k,i)+beta(nextstate(j,k)+1,i));
end
if(i>1)
if(sum(beta1)>1e-30)
beta(j,i-1)=log(sum(beta1))-max(i-1);
else
beta(j,i-1)=-1e10;
end
end
end
[C,I]=max(temp);
decis(i)=I-1;
end
num_of_err=0;
for i=1:N
if(source(i)~=decis(i))
num_of_err=num_of_err+1;
end
end
ps=num_of_err/N;
t=fanout/(2*(fanout-1));
pb=t*ps;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -