convl.asv

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

ASV
118
字号
function pb=convl(
% information source
rho_in_dB=1;
rho=10^(rho_in_dB/10);
K=3;
seg=2;
len=1000;
source=[randint(seg,len-K),zeros(seg,K)];

% outer encoder 
trel=poly2trellis(K,[7,5]);
code1=zeros(seg,2*len);
for i=1:seg
    code1(i,:)=convenc(source(i,:),trel,[]);
end

% interleave the output of the outer encoder
inte_in=zeros(seg,len);
inte_out=zeros(seg,len); 
for i=1:seg
    for j=1:len
        inte_in(i,j)=change2deci(code1(i,2*j-1:2*j),2);
    end
end
posit=zeros(size(inte_out));
for i=1:seg
    [inte_out(i,:),posit(i,:)]=interleave(inte_in(i,:));
end

% compute inner DFH state transition matrix
BPH=2;
number_of_states=64;
fanout=2^BPH;
L=floor(log(number_of_states)/log(fanout));
nextstate=zeros(number_of_states,fanout); 
formerstate=number_of_states.*ones(number_of_states,fanout,fanout);
for i=0:number_of_states-1
    for j=0:fanout-1
        k=1;
        next_state=G_func(i,j,L,fanout);
        nextstate(i+1,j+1)=next_state;
        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

%compute outer convolutional encoder state traceback matrix
formerstate1=trel.numStates.*ones(trel.numStates,trel.numInputSymbols,trel.numInputSymbols);
for i=0:trel.numStates-1
    for j=0:trel.numInputSymbols-1
        k=1;
        while(formerstate1(trel.nextStates(i+1,j+1)+1,k,j+1)~=trel.numStates)
            k=k+1;
        end
        formerstate1(trel.nextStates(i+1,j+1)+1,k,j+1)=i; 
    end
end

% inner encode and channel transmition
E=1;
sgma=sqrt(E/(BPH*2*rho));
depth_of_trellis=len;
demod_input=zeros(number_of_states,depth_of_trellis+1,seg);
for i=1:seg
    demod_input(:,1,i)=[1;zeros(number_of_states-1,1)];
end

% generate transmitted frequency sequence and inner encoder output
for t=1:seg
    f=zeros(1,depth_of_trellis);  
    P=0;
    for i=1:depth_of_trellis
        f(i)=nextstate(P+1,inte_out(t,i)+1);
        P=f(i);
    end
    for i=1:depth_of_trellis
        for j=0:number_of_states-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+1,t)=sqrt(rc^2+rs^2);
        end
    end
end
demod_input=demod_input./sgma^2;

% outer decode
itera=2;
num_of_err=0;
for i=1:seg
    extrin=zeros(fanout-1,depth_of_trellis);
    if(itera>=2)
        for j=1:itera-1
            inner_output=inner_decode(demod_input(:,:,i),extrin,nextstate,formerstate,fanout,depth_of_trellis,number_of_states);
            outer_input=deinterleave(inner_output,posit(i,:));
            outer_out_c=outer_decode_c(outer_input,trel,formerstate1);
            extrin=interleave1(outer_out_c,posit(i,:));
        end
    end
    inner_output=inner_decode(demod_input(:,:,i),extrin,nextstate,formerstate,fanout,depth_of_trellis,number_of_states);
    outer_input=deinterleave(inner_output,posit(i,:));
    outer_out_u=outer_decode_u(outer_input,trel,formerstate1);
    for j=1:size(source,2)
        if(source(i,j)~=outer_out_u(j))
            num_of_err=num_of_err+1;
        end
    end
end
pb=num_of_err/(size(source,1)*size(source,2));
sprintf('pb=%f',pb)
        

⌨️ 快捷键说明

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