⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 convolutiondecode.m

📁 % decode with soft-input viterbi algorithm 硬判决 % //k=4,r=1/2 %输入数据为软信息
💻 M
字号:
% decode with soft-input viterbi algorithm 硬判决

% //k=4,r=1/2
%输入数据为软信息,并且数据为均值为1的BPSK调制,如果均值为MEAN,那么62,63,103,104行应做相应修改
function [x,y]=convolutiondecode(indata,MEAN)   %MEAN没用到   (2,1,3) 卷积码的译码
x=zeros(1,length(indata)/2);
y=zeros(1,length(indata));
decode_out=zeros(1,length(indata)/2);
code_out=zeros(1,length(indata));

p=zeros(8,2);
c=zeros(8,2,2);
flag=zeros(1,8);           %//记录往上走还是向下走
survivor=zeros(8,14,3);
survivor2=zeros(8,14,3);   % //幸存路径
PM1=zeros(1,8);            % //路径度量
PM2=zeros(1,8);            % //幸存路径度量
BM=zeros(8,2);             %//当前分支路径度量
in=zeros(1,8);

% 	//inicialize the state,p(a,b)=nextState,a=1,2..8 are OrignalStates,b=1:inputdata 0,b=2:inputdata 1
    p(1,1)=1;p(1,2)=2;%s1=000,s2=100,s3=010,s4=110,s5=001,s6=101,s7=011,s8=111.s=indata,shift1,shift2
    p(2,1)=3;p(2,2)=4;
    p(3,1)=5;p(3,2)=6;
    p(4,1)=7;p(4,2)=8;
    p(5,1)=1;p(5,2)=2;
    p(6,1)=3;p(6,2)=4;
    p(7,1)=5;p(7,2)=6;
    p(8,1)=7;p(8,2)=8;
    
    in(5)=1;
    in(6)=1;
    in(7)=1;
    in(8)=1;
    
    c(1,1,1)=0;c(1,1,2)=0;%c(a,b,c)=encodeOutput,a=state;b=inputBit,1;0,2:1;c=1:Output_first,c=2,Output_second.
    c(1,2,1)=1;c(1,2,2)=1;
    c(2,1,1)=0;c(2,1,2)=1;
    c(2,2,1)=1;c(2,2,2)=0;
    c(3,1,1)=1;c(3,1,2)=1;
    c(3,2,1)=0;c(3,2,2)=0;
    c(4,1,1)=1;c(4,1,2)=0;
    c(4,2,1)=0;c(4,2,2)=1;
    c(5,1,1)=1;c(5,1,2)=1;
    c(5,2,1)=0;c(5,2,2)=0;
    c(6,1,1)=1;c(6,1,2)=0;
    c(6,2,1)=0;c(6,2,2)=1;
    c(7,1,1)=0;c(7,1,2)=0;
    c(7,2,1)=1;c(7,2,2)=1;
    c(8,1,1)=0;c(8,1,2)=1;
    c(8,2,1)=1;c(8,2,2)=0;

% 	//inicialize the state
    MAX=1000;
    PM1(1)=MAX;	
    PM1(2)=0;
    PM1(3)=0;
    PM1(4)=0;
    PM1(5)=0;
    PM1(6)=0;
    PM1(7)=0;
    PM1(8)=0;
    
    %  //length is the uncoded data number
 	for k=1:14    %indata中的第K个数据
		for i=1:8		
			BM(i,1)=indata(2*k-1)*(2*c(i,1,1)-1)*MEAN+indata(2*k)*(2*c(i,1,2)-1)*MEAN;%BM(i,1)=indata(2*k-1)*(2*c(i,1,1)-1)+indata(2*k)*(2*c(i,1,2)-1);
            BM(i,2)=indata(2*k-1)*(2*c(i,2,1)-1)*MEAN+indata(2*k)*(2*c(i,2,2)-1)*MEAN;%BM(i,2)=indata(2*k-1)*(2*c(i,2,1)-1)+indata(2*k)*(2*c(i,2,2)-1);
			if  PM1(p(i,1))+BM(i,1)>PM1(p(i,2))+BM(i,2)
				PM2(i)=PM1(p(i,1))+BM(i,1);
				flag(i)=1;			
			else 			
				PM2(i)=PM1(p(i,2))+BM(i,2);
				flag(i)=2;
            end
            % //survivor2[i]=survivor[p[i][flag[i]]];
			for j=1:14			
				survivor2(i,j,1)=survivor(p(i,flag(i)),j,1);
                survivor2(i,j,2)=survivor(p(i,flag(i)),j,2);
                survivor2(i,j,3)=survivor(p(i,flag(i)),j,3);%decode_output
            end
            
			for temp=k:-1:2		
				survivor2(i,temp,1)=survivor2(i,temp-1,1);
				survivor2(i,temp,2)=survivor2(i,temp-1,2);
                survivor2(i,temp,3)=survivor2(i,temp-1,3);
            end
			survivor2(i,1,1)=c(i,flag(i),1);
			survivor2(i,1,2)=c(i,flag(i),2);
            survivor2(i,1,3)=in(i);
        end
		
        % //survivor[i]=survivor2[i];
		for i=1:8					
			for j=1:14			
				survivor(i,j,1)=survivor2(i,j,1);
				survivor(i,j,2)=survivor2(i,j,2);
                survivor(i,j,3)=survivor2(i,j,3);
            end
			PM1(i)=PM2(i);
        end

    end
    
    point=1;%第一轮结束
    for k=15:length(indata)/2	
		for i=1:8		
			BM(i,1)=indata(2*k-1)*(2*c(i,1,1)-1)*MEAN+indata(2*k)*(2*c(i,1,2)-1)*MEAN;%BM(i,1)=indata(2*k-1)*(2*c(i,1,1)-1)+indata(2*k)*(2*c(i,1,2)-1);
            BM(i,2)=indata(2*k-1)*(2*c(i,2,1)-1)*MEAN+indata(2*k)*(2*c(i,2,2)-1)*MEAN;%BM(i,2)=indata(2*k-1)*(2*c(i,2,1)-1)+indata(2*k)*(2*c(i,2,2)-1);	
			if  (PM1(p(i,1))+BM(i,1))>(PM1(p(i,2))+BM(i,2)) 			
				PM2(i)=PM1(p(i,1))+BM(i,1);
				flag(i)=1;			
			else 			
				PM2(i)=PM1(p(i,2))+BM(i,2);
				flag(i)=2;
            end
            % //survivor2[i]=survivor[p[i][flag[i]]];
			for j=1:14			
				survivor2(i,j,1)=survivor(p(i,flag(i)),j,1);
                survivor2(i,j,2)=survivor(p(i,flag(i)),j,2);
                survivor2(i,j,3)=survivor(p(i,flag(i)),j,3);
            end 
        end
        
	    maxpath=maxposition(PM2);   %从8条路径中找出最大似然的一条,maxpath=1,2,...8     %此调用函数找不到
        % output data
        code_out(point)=survivor2(maxpath,14,1);
        decode_out(k-14)=survivor2(maxpath,14,3);
        point=point+1;
        code_out(point)=survivor2(maxpath,14,2);
        point=point+1;
        
        %point=point+1;

		for i=1:8		
			for  temp=14:-1:2
                survivor2(i,temp,1)=survivor2(i,temp-1,1);
				survivor2(i,temp,2)=survivor2(i,temp-1,2);
                survivor2(i,temp,3)=survivor2(i,temp-1,3);
            end
			survivor2(i,1,1)=c(i,flag(i),1);
			survivor2(i,1,2)=c(i,flag(i),2);
            survivor2(i,1,3)=in(i);
            
			%//survivor[i]=survivor2[i];
			for j=1:14			
				survivor(i,j,1)=survivor2(i,j,1);
				survivor(i,j,2)=survivor2(i,j,2);
                survivor(i,j,3)=survivor2(i,j,3);
            end
			PM1(i)=PM2(i);
        end
        
		if  mod(k,30)==0		
			for i=1:8
				PM1(i)=PM1(i)-20;
            end
        end
    end

	for k=14:-1:1	
        code_out(point)=survivor2(maxpath,k,1);
        decode_out(length(indata)/2-k+1)=survivor2(maxpath,k,3);
        point=point+1;
        code_out(point)=survivor2(maxpath,k,2);
        point=point+1;
        %y(point)=survivor2(maxpath,k,3);
        %point=point+1;
    end
    x=decode_out;
    y=code_out;


⌨️ 快捷键说明

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