该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
state_metric(nextstate(j+1,l+1)+1,2)=state_metric(j+1,1)+branch_metric;
%survivor_state数组的一维坐标为下一个状态值,二维坐标为此状态
%在网格图中的列位置,记录的数值为当前状态,这样就可以从网格图中
%某位置的某个状态得出其对应上一个列位置的状态,从而能很方便的完
%成译码过程。
survivor_state(nextstate(j+1,l+1)+1,i+1)=j;
flag(nextstate(j+1,l+1)+1)=1;%指示该状态已被访问过
end
end
end
state_metric=state_metric(:,2:-1:1);%移动state_metric,将临时值移为确定值
end
%开始尾部信道输出解码
for i=depth_of_trellis-L+2:depth_of_trellis
flag=zeros(1,number_of_states);
% 状态数从number_of_states→number_of_states/2→...→2→1
%程序说明同上,只不过输入矢量只为0
last_stop=number_of_states/(2^((i-depth_of_trellis+L-2)*k));
for j=0:last_stop-1
branch_metric=0;
binary_output=deci2bin(output(j+1,1),n);
for ll=1:n
branch_metric=branch_metric+metric(channel_output_matrix(ll,i),binary_output(ll));
end
if((state_metric(nextstate(j+1,1)+1,2)>state_metric(j+1,1)...
+branch_metric)|flag(nextstate(j+1,1)+1)==0)
state_metric(nextstate(j+1,1)+1,2)=state_metric(j+1,1)+branch_metric;
survivor_state(nextstate(j+1,1)+1,i+1)=j;
flag(nextstate(j+1,1)+1)=1;
end
end
state_metric=state_metric(:,2:-1:1);
end
%从最佳路径中产生解码
%译码过程可从数组survivor_state的最后一个位置向前逐级译码
state_sequence=zeros(1,depth_of_trellis+1);
%survivor_state数组的最后的输出状态肯定是“0”
state_sequence(1,depth_of_trellis)=survivor_state(1,depth_of_trellis+1);
%逐级译码过程
for i=1:depth_of_trellis
state_sequence(1,depth_of_trellis-i+1)=survivor_state((state_sequence(1,depth_of_trellis+2-i)...
+1),depth_of_trellis-i+2);
end
decorder_output_matrix=zeros(k,depth_of_trellis-L+1);
for i=1:depth_of_trellis-L+1
%根据数组input的定义来得出从当前状态到下一个状态的输入信号矢量
dec_output_deci=input(state_sequence(1,i)+1,state_sequence(1,i+1)+1);
%转成二进制信号
dec_output_bin=deci2bin(dec_output_deci,k);
%将一次译码存入译码输出矩阵decoder_output_matrix相应的位置
decoder_output_matrix(:,i)=dec_output_bin(k:-1:1)';
end
%按照一维序列形式重新组织输出
decoder_output=reshape(decoder_output_matrix,1,k*(depth_of_trellis-L+1));
%state_metric为网格图最后一个列位置中“0”状态位置的汉明距
%离,这个值就是整个译码过程中的汉明距离。
cumulated_metric=state_metric(1,1);
%卷积码的维特比译码函数
%nxt_stat.m 记录状态函数
%next_state用于记录下一个状态的值
%memory_contents用于记录
function [next_state,memory_contents]=nxt_stat(current_state,input,L,k)
%将当前状态值(十进制)转成位数为k*(L-1)的二进制
binary_state=deci2bin(current_state,k*(L-1));
%将输入状态值(十进制)转成位数为k的二进制序列
binary_input=deci2bin(input,k);
%寄存器组的下一个状态值(二进制)
next_state_binary=[binary_input,binary_state(1:(L-2)*k)];
%将寄存器组的下一个状态值(二进制)转成十进制
next_state=bin2deci(next_state_binary);
%用memory_contents来记录各个寄存器在下一个状态下的信息(二进制)
%以便与生成矩阵相乘得出输出
memory_contents=[binary_input,binary_state];
%nxt_stat.m 记录状态函数
老出现此错误
??? Input argument 'G' is undefined.
Error in ==> G:\viterbi\viterbi.m
On line 12 ==> n=size(G,1);%取出矩阵G的一维大小,即得出输出端口
G没定义怎么回事