log_map_simu4.m

来自「短波信道抗多音干扰的性能分析及其仿真」· M 代码 · 共 133 行

M
133
字号
function pb=log_map_simu4(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);
dsource=zeros(1,N*BPH);
if(BPH~=1)
    for i=1:N
        dsource((i-1)*BPH+1:i*BPH)=deci2change(source(i),BPH,2);
    end
else
    dsource=source(1:N);
end
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=sqrt(E)+sgma*randn;
           rs=sgma*randn;
       end
       demod_input(j+1,i)=sqrt(rc^2+rs^2);
   end
   P=nextstate(P+1,source(i)+1);
end
demod_input=demod_input/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);
decision=zeros(1,BPH*N);

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
                    gamma(h,i)=demod_input(output(formerstate(j,h,k)+1,k)+1,i);
                    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
            gamma(k,i)=demod_input(output(j,k)+1,i);
            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;
    if(BPH~=1)
        decision((i-1)*BPH+1:i*BPH)=deci2change(decis(i),BPH,2);
    else
        decision(i)=decis(i);
    end
end

num_of_err=0;
for i=1:BPH*N
    if(dsource(i)~=decision(i))
        num_of_err=num_of_err+1;
    end
end
pb=num_of_err/(BPH*N);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?