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

📄 viterbi1.m

📁 viterbi译码的S函数程序,已通过验证,对使用matlab的simulink者有很大的帮助
💻 M
字号:
function viterbi1(block)
setup(block);
function setup(block)
  block.NumInputPorts  = 1;
  block.NumOutputPorts = 1;
  block.SetPreCompInpPortInfoToDynamic;
  block.SetPreCompOutPortInfoToDynamic;
  
  block.NumDialogPrms     = 3;
  block.DialogPrmsTunable = {'Tunable','Tunable','Tunable'};
  
  block.InputPort(1).Dimensions        =size(block.DialogPrm(2).Data,1);
  block.InputPort(1).DirectFeedthrough = false;
  block.OutputPort(1).Dimensions       =size(block.DialogPrm(2).Data,2)/block.DialogPrm(1).Data;
  block.SampleTimes = [-1 0];
  
  block.RegBlockMethod('CheckParameters', @CheckPrms);
  block.RegBlockMethod('PostPropagationSetup', @DoPostPropSetup);
  block.RegBlockMethod('InitializeConditions', @InitializeConditions);
  block.RegBlockMethod('Outputs', @Outputs);
  block.RegBlockMethod('Update', @Update);
  
function CheckPrms(block)
  L = block.DialogPrm(1).Data;
  G = block.DialogPrm(2).Data;%G is n rows and k*L column
  if rem(size(G,2),L)~=0
   error('Error,size of G and L do not agree.');
  end
  
function DoPostPropSetup(block)
  L = block.DialogPrm(1).Data;
  G = block.DialogPrm(2).Data;
  k=size(G,2)/L;
  depth=block.DialogPrm(3).Data;
  number_of_states=2^((L-1)*k);
  
  block.NumDworks = 5;
  
  block.Dwork(1).Name = 'metric';
  block.Dwork(1).Dimensions      = 2*(number_of_states);
  block.Dwork(1).DatatypeID      = 0;      % double
  block.Dwork(1).Complexity      = 'Real'; % real
  block.Dwork(1).UsedAsDiscState = true;
  
  block.Dwork(2).Name = 'survivor_state';
  block.Dwork(2).Dimensions      = depth*(number_of_states);
  block.Dwork(2).DatatypeID      = 0;      % double
  block.Dwork(2).Complexity      = 'Real'; % real
  block.Dwork(2).UsedAsDiscState = true;
  
  block.Dwork(3).Name = 'next_state';
  block.Dwork(3).Dimensions      = (2^k)*(number_of_states);
  block.Dwork(3).DatatypeID      = 0;      % double
  block.Dwork(3).Complexity      = 'Real'; % real
  block.Dwork(3).UsedAsDiscState = true;
  
  block.Dwork(4).Name = 'input';
  block.Dwork(4).Dimensions      = (number_of_states)^2;
  block.Dwork(4).DatatypeID      = 0;      % double
  block.Dwork(4).Complexity      = 'Real'; % real
  block.Dwork(4).UsedAsDiscState = true;
  
  block.Dwork(5).Name = 'memory_contents';
  block.Dwork(5).Dimensions      = (2^k)*number_of_states;
  block.Dwork(5).DatatypeID      = 0;      % double
  block.Dwork(5).Complexity      = 'Real'; % real
  block.Dwork(5).UsedAsDiscState = true;
  
function InitializeConditions(block)
  L = block.DialogPrm(1).Data;
  G = block.DialogPrm(2).Data;
  k=size(G,2)/L;
  number_of_states=2^((L-1)*k);  
  depth=block.DialogPrm(3).Data;
block.Dwork(1).Data=zeros(1,2*number_of_states);
block.Dwork(2).Data=zeros(1,depth*number_of_states);
block.Dwork(4).Data=zeros(1,(number_of_states)^2);
for j=0:number_of_states-1
        for t=0:2^k-1
            binary_input=dec2binvec(t,k);
            binary_state=dec2binvec(j,k*(L-1));
            next_state_binary=[binary_input,binary_state(1:(L-2)*k)];
            next_state=binvec2dec(next_state_binary);
            binary_memory_contents=[binary_input,binary_state];
            memory_contents=binvec2dec(binary_memory_contents);
            block.Dwork(3).Data(j*(2^k)+t+1)= next_state;
            block.Dwork(4).Data(j*number_of_states+next_state+1)=t;
            block.Dwork(5).Data(j*(2^k)+t+1)= memory_contents;
        end
end

function Outputs(block)
  L = block.DialogPrm(1).Data;
  G = block.DialogPrm(2).Data;
  k=size(G,2)/L;
  depth=block.DialogPrm(3).Data;
  number_of_states=2^((L-1)*k);
  n=size(block.DialogPrm(2).Data,1);
 
%%加比存

flag=zeros(1,number_of_states);
for j=0:number_of_states-1
        for t=0:2^k-1
            branch_metric=0;
            nextstate=block.Dwork(3).Data(j*(2^k)+t+1);
            memory=dec2binvec(block.Dwork(5).Data(j*(2^k)+t+1),k*L);     %最后输出时应将二进制数倒序输出
            branch_output=rem(memory*G',2);
            for tt=1:n
                if branch_output(tt)~=block.InputPort(1).Data(tt)
                   branch_metric=branch_metric+1;
                end
            end
            if ((block.Dwork(1).Data(nextstate+1)>(block.Dwork(1).Data(j+number_of_states+1)+branch_metric))||flag(nextstate+1)==0)
                block.Dwork(1).Data(nextstate+1)=block.Dwork(1).Data(j+number_of_states+1)+branch_metric;
                block.Dwork(2).Data(nextstate+1)=j;
                flag(nextstate+1)=1;
            end
        end
end

%%选择最优路径

a=block.Dwork(1).Data(1);
b=0;
for i=2:number_of_states
    if  block.Dwork(1).Data(i)<a
        a=block.Dwork(1).Data(i);
        b=i-1;
    end
end   

%%深度译码

d=0;
while(d<(depth-1))    
    b=block.Dwork(2).Data(b+d*number_of_states+1);
    d =d+1;
end
    c=block.Dwork(2).Data(b+(depth-1)*number_of_states+1);

%%译码输出
outcode=block.Dwork(4).Data(c*number_of_states+b+1);
binary_outcode=double(dec2binvec(outcode,k));
block.OutputPort(1).Data=binary_outcode(k:-1:1);

function Update(block)
  L = block.DialogPrm(1).Data;
  G = block.DialogPrm(2).Data;
  k=size(G,2)/L;
  depth=block.DialogPrm(3).Data;
  number_of_states=2^((L-1)*k);  
for i=1:number_of_states
    block.Dwork(1).Data(i+number_of_states)=block.Dwork(1).Data(i);
end

for i=0:depth-2
   for j=0:number_of_states-1
       block.Dwork(2).Data((depth-i)*number_of_states-j)=block.Dwork(2).Data((depth-i-1)*number_of_states-j);
   end
end

⌨️ 快捷键说明

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