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 + -
显示快捷键?