📄 viterbi1.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 + -