MATLAB模拟译码器,MATLAB卷积viterbi译码器仿真问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

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没定义怎么回事

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值