function [decoder_output,survivor_state,cumulated_metric]=viterbi(channel_output)
k=2;
G=[0 0 1 0 1 0 0 1;0 0 0 0 0 0 0 1;1 0 0 0 0 0 0 1];
%k=1;
%G=[0 1 0 1 1 1;1 0 0 0 1 1;0 1 1 0 0 1;1 0 0 1 0 1];
n=size(G,1);
%检验G的维数
if rem(size(G,2),k)~=0
error('Size of G and k do not agree')
end
if rem(size(channel_output,2),n)~=0
error('channle output not of the right size')
end
L=size(G,2)/k;
number_of_states=2^((L-1)*k);
%产生状态转移矩阵,输出矩阵和输入矩阵
for j=0:number_of_states-1
for t=0:2^k-1
[next_state,memory_contents]=nxt_stat(j,t,L,k);
input(j+1,next_state+1)=t;
branch_output=rem(memory_contents*G',2);
nextstate(j+1,t+1)=next_state;
output(j+1,t+1)=bin2deci(branch_output);
end
end
input;
state_metric=zeros(number_of_states,2);
depth_of_trellis=length(channel_output)/n;
channel_output_matrix=reshape(channel_output,n,depth_of_trellis);
survivor_state=zeros(number_of_states,depth_of_trellis+1);
[row_survivor col_survivor]=size(survivor_state);
%开始非尾信道输出的解码
%i为段,j为每一阶段的状态,t为输入
for i=1:depth_of_trellis-L+1
flag=zeros(1,number_of_states);
if i<=L
step=2^((L-i)*k);
else
step=1;
end
for j=0:step:number_of_states-1
for t=0:2^k-1
branch_metric=0;
binary_output=deci2bin(output(j+1,t+1),n);
for tt=1:n
branch_metric=branch_metric+metric(channel_output_matrix(tt,i),binary_output(tt));
end
if ((state_metric(nextstate(j+1,t+1)+1,2)>state_metric(j+1,1)+branch_metric)|flag(nextstate(j+1,t+1)+1)==0)
state_metric(nextstate(j+1,t+1)+1,2)=state_metric(j+1,1)+branch_metric;
survivor_state(nextstate(j+1,t+1)+1,i+1)=j;
flag(nextstate(j+1,t+1)+1)=1;
end
end
end
state_metric=state_metric(:,2:-1:1);
end
%开始尾信道输出的解码
for i=depth_of_trellis-L+2:depth_of_trellis
flag=zeros(1,number_of_states);
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 tt=1:n
branch_metric=branch_metric+metric(channel_output_matrix(tt,i),binary_output(tt));
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
%从最优路径产生解码输出
%由段得到状态序列,再由状序列从input矩阵中得到该段的输出
state_sequence=zeros(1,depth_of_trellis+1);
size(state_sequence);
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
state_sequence;
decoder_output_matrix=zeros(k,depth_of_trellis-L+1);
for i=1:depth_of_trellis-L+1
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(:,i)=dec_output_bin(k:-1:1)';
end
decoder_output=reshape(decoder_output_matrix,1,k*(depth_of_trellis-L+1));
cumulated_metric=state_metric(1,1);
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1.版本:matlab2022A,包含仿真操作录像,操作录像使用windows media player播放。 2.领域:DF中继通信 3.仿真效果:仿真效果可以参考博客同名文章《基于差错检测的DF中继通信系统matlab误码率仿真》 4.内容:基于差错检测的DF中继通信系统matlab误码率仿真。基于差错检测的DF(Decode-and-Forward,解码转发)中继通信系统是一种利用中继节点来增加通信可靠性和扩展覆盖范围的无线通信技术。在该系统中,中继节点接收到源节点的信号后,首先对信号进行解码,然后再将解码后的信号转发给目的节点。 5.注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以参考视频录。
资源推荐
资源详情
资源评论
收起资源包目录
基于差错检测的DF中继通信系统matlab误码率仿真.rar (13个子文件)
code
Runme.m 2KB
func
demod_8psk.m 812B
bin2deci.m 97B
metric.m 86B
cnv.m 790B
mod_8psk.m 437B
CrcEncode.m 448B
RayleighCH.m 264B
CrcDecode.m 459B
viterbi.m 3KB
deci2bin.m 188B
nxt_stat.m 297B
20240125_212744.mp4 15.96MB
共 13 条
- 1
资源评论
- 当佩吴钩2024-04-05总算找到了想要的资源,搞定遇到的大问题,赞赞赞!
- qq_408962202024-05-25超级好的资源,很值得参考学习,对我启发很大,支持!
- m0_742807162024-05-11这个资源值得下载,资源内容详细全面,与描述一致,受益匪浅。
- m0_546140372024-06-11资源不错,对我启发很大,获得了新的灵感,受益匪浅。
fpga和matlab
- 粉丝: 17w+
- 资源: 2626
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功