(完整word版)卷积码的编译码MATLAB程序

合集下载

卷积码的编解码Matlab仿真

卷积码的编解码Matlab仿真
随着现代通信的发展,高速信息传输和高可靠性传输成为信息传输的两个主要 方面,而可靠性尤其重要。卷积码以其高速性和可靠性在实际应用中越来越广泛。 1967年Viterbi译码算法的提出,使卷积码成为信道编码中最重要的编码方 工巳之一[I)。
1.2国内外研究现状
在对卷积码的研究中,其中编码器较简单,模式也很统一。主要是研究提高卷 积码的译码速度和可靠度。译码算法中最重要的卷积码的Viterbi算法问世以来,软 件仿真和实现都得到了迅速发展。目前,利用计算机仿真Viterbi算法,模拟在各种 不同情况下(使用不同码率、不同约束度等)卷积编码时的译码性能,寻找Viterbi算 法的最佳适用信道和不同要求。日误码率)下最优编码。
2.1信道.............. .................. .................... ................. 2
2.2纠错编码................... ....... .. ................. ................. 2
4.2改变卷积码的参数仿真以及结论........................................ 12 4.2.1不同回
湖长度对卷积码性能的影响................................ 12
4.2.2不同码率对卷积码误码性能的晌........... ............................. 14
卷积码的编解码Matlab仿真摘要
卷积码是一种性能优越的信道编码。它的编码器和译码器都比较容易实现,同 时它具有较强的纠错能力D随着纠错编码理论研究的不断深入,卷积码的实际应用越 来越广泛。本文简明地介绍了卷积码的编码原理和译码原理o并在SIMULINK模块设计 中,完成了对卷积码的编码和译码以及误比特统计整个过程的 模块仿真。最后,通 过在仿真过程中分别改变卷积码的重要参数来加深理解卷积码的这些参数对卷积码 的误码性能的影响。经过仿真和实测,并对测试结果作了分析。得出了以下三个结 论z

Matlab设计卷积编码和Viterbi已实现_read me

Matlab设计卷积编码和Viterbi已实现_read me

1、卷积编码和Viterbi解码的原理参见tutorial,代码编写都是基于该文档进行
网址:
或者附带的pdf文件
2、Convolutional Encoding采用Matlab自带的编码程序;可以在Matlab安装目
录下的通信工具箱中找到
3、测试程序testV对比了uncoded system & (2,1,2)卷积码经维特比解码后误码率
和信噪比曲线图,也可以采用别的卷积编码生成矩阵
4、由于无法压缩上传,故把代码放在一个word文档中,可将其中各子程序分
别复制出来保存为M。

注意有可能某些注释在doc文件中换行了,需要修改为注释
5、代码很少用matlab内部函数和工具箱,除某些参考网上设计外其余皆为自己
编写并测试通过,可修改其内容实现其他功能。

MATLAB OFDM卷积编码程序及代码

MATLAB OFDM卷积编码程序及代码

%bin22deci.mfunction y=bin22deci(x)%将二进制数转化为十进制数t=size(x,2);y=(t-1:-1:0);y=2.^y;y=x*y';%************************end of file***********************************%comb.m%AWGN加噪声程序function[iout,qout]=comb(idata,qdata,attn)%******************variables*************************%idata:输入I信道数据%qdata:输入Q信道数据%iout输出I信道数据%qout输出Q信道数据%attn:由信噪比导致的衰减系数%******************************************************iout=randn(1,length(idata)).*attn;qout=randn(1,length(qdata)).*attn;iout=iout+idata(1:length(idata));qout=qout+qdata(1:length(qdata));%************************end of file***********************************%crdemapping.m%数据逆映射载波程序function[iout,qout]=crdemapping(idata,qdata,fftlen,nd);%******************variables*************************%idata:输入I信道的数据%qdata:输入Q信道的数据%iout:输出I信道的数据%qout:输出Q信道的数据%fftlen:FFT的长度%nd:OFDM符号数%*****************************************************iout(1:26,:)=idata(2:27,:);qout(1:26,:)=qdata(2:27,:);iout(27:52,:)=idata(39:64,:);qout(27:52,:)=qdata(39:64,:);%********************end of file***************************%crmapping.m%数据映射载波程序function[iout,qout]=crmapping(idata,qdata,fftlen,nd);%******************variables*************************%idata:输入I信道的数据%qdata:输入Q信道的数据%iout:输出I信道的数据%qout:输出Q信道的数据%fftlen:FFT的长度%nd:OFDM符号数%*****************************************************iout=zeros(fftlen,nd);qout=zeros(fftlen,nd);iout(2:27,:)=idata(1:26,:);qout(2:27,:)=qdata(1:26,:);iout(39:64,:)=idata(27:52,:);qout(39:64,:)=qdata(27:52,:);%********************end of file***************************%deci22bin.mfunction y=deci22bin(x,t)%十进制数x转化为二进制数,二进制数至少表示为t位y=zeros(size(x,1),t);for j=1:size(x,1)i=1;while x(j)>=0&i<=ty(j,i)=rem(x(j),2);%x(j)为偶数时,y(j,i)为0;反之为1x(j)=(x(j)-y(j,i))/2;i=i+1;endy(j,:)=y(j,t:-1:1);%倒序排列end%************************end of file***********************************%giins1.m%插入保护间隔程序function[iout,qout]=giins1(idata,qdata,fftlen,gilen,nd);%******************变量*************************%idata:输入I信道数据%qdata:输入Q信道数据%iout:输出I信道数据%qout:输出Q信道数据%fftlen:FFT长度(points)%gilen:保护间隔长度(points)%*****************************************************idata1=reshape(idata,fftlen,nd);qdata1=reshape(qdata,fftlen,nd);idata2=[idata1(fftlen-gilen+1:fftlen,:);idata1];qdata2=[qdata1(fftlen-gilen+1:fftlen,:);qdata1];iout=reshape(idata2,1,(fftlen+gilen)*nd);qout=reshape(qdata2,1,(fftlen+gilen)*nd);%********************end of file***************************%qpskdemod1.m%QPSK解调程序function[demodata]=qpskdemod1(idata,qdata,para,nd,ml)%******************variables*************************%idata:输入I信道数据%qdata:数据Q信道数据%demodata:解调后数据(para-by-nd matrix)%para:并行信道数%nd:符号数%ml:调制数%(QPSK->2 16QAM->4)%*****************************************************demodata=zeros(para,ml*nd);demodata((1:para),(1:ml:ml*nd-1))=idata((1:para),(1:nd))>=0; demodata((1:para),(2:ml:ml*nd))=qdata((1:para),(1:nd))>=0;%************************end of file***********************************%qpskmod1.m%QPSK调制程序function[iout,qout]=qpskmod1(paradata,para,nd,ml)%******************variables*************************%paradata:输入数据%iout:输出数据I%qout:输出数据Q%para:并行信道数%nd:数据数%ml:调制数%(QPSK->2 16QAM->4)%*****************************************************m2=ml./2;paradata2=paradata.*2-1;count2=0;for jj=1:ndisi=zeros(para,1);isq=zeros(para,1);isi=isi+paradata2((1:para),1+count2);isq=isq+paradata2((1:para),2+count2);iout((1:para),jj)=isi;qout((1:para),jj)=isq;count2=count2+ml;end%********************end of file***************************%viterbi.m%viterbi解码程序function[decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output) %[decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output)%其中G是一个n行L*k列矩阵,它的每一行决定了从移位寄存器到输入码字的连接方式.%survivor_state是一个矩阵,它显示了通过网格的最优路径,这个矩阵通过一个单独%的函数metric(x,y)给出。

cycbd解卷积matlab代码

cycbd解卷积matlab代码

cycbd解卷积matlab代码
在MATLAB中进行循环卷积的解卷积操作可以使用MATLAB内置
的函数进行实现。

首先,你需要使用MATLAB的conv函数进行卷积
操作。

然后,可以使用MATLAB的deconv函数进行解卷积操作。


面我会详细解释这两个函数的使用方法。

首先,让我们来看一下如何使用conv函数进行卷积操作。

假设
你有两个信号x和y,你可以使用以下代码进行卷积操作:
matlab.
z = conv(x, y);
这将会对信号x和y进行卷积操作,并将结果存储在z中。

接下来,让我们来看一下如何使用deconv函数进行解卷积操作。

假设你有卷积后的结果z和原始信号y,你可以使用以下代码进行
解卷积操作:
matlab.
x_recovered = deconv(z, y);
这将会对卷积后的结果z和信号y进行解卷积操作,并将恢复
的信号存储在x_recovered中。

需要注意的是,解卷积操作可能会受到噪声和舍入误差的影响,因此解卷积的结果可能不是完全准确的。

在实际应用中,你可能需
要对解卷积的结果进行进一步处理以提高准确性。

除了使用内置函数外,你还可以编写自定义的解卷积算法来实
现解卷积操作。

这通常涉及到使用傅里叶变换或其他信号处理技术
来实现。

然而,在大多数情况下,使用MATLAB内置的函数已经能够
满足大部分解卷积的需求。

希望以上信息能够帮助你理解在MATLAB中进行解卷积操作的方法。

如果你有任何进一步的问题,欢迎随时向我提问。

matlab 卷积编解码函数

matlab 卷积编解码函数

主题:Matlab中的卷积编解码函数1. 概述Matlab是功能强大的科学计算软件,广泛应用于工程、科学和数学领域。

在通信系统设计和数字信号处理领域,卷积编解码函数是非常重要的工具。

本文将介绍Matlab中的卷积编解码函数,包括函数的基本原理、参数设置、使用方法和实际应用。

2. 卷积编解码函数的基本原理卷积编码是一种利用卷积操作来对数字信号进行编码的技术,主要用于在数字通信系统中实现信号的纠错和增强。

在Matlab中,卷积编码函数通常包括convenc和vitenc两个主要函数。

convenc函数用于对输入信号进行卷积编码,生成纠错编码后的输出信号;vitenc函数用于对卷积编码后的信号进行译码,还原原始信号。

3. 卷积编解码函数的参数设置在Matlab中,卷积编解码函数有一系列参数需要设置,以满足不同的应用需求。

其中包括生成多项式和约束长度等参数,用于指定卷积编码器的结构和特性;还有输入信号和输出信号的数据类型、结构和尺寸等参数。

设置这些参数可以对卷积编解码函数进行灵活的控制和定制化。

4. 卷积编解码函数的使用方法在使用Matlab中的卷积编解码函数时,通常需要按照一定的步骤进行。

首先是设置参数和初始化编解码器,然后是输入原始信号并进行编码,最后是对编码后的信号进行译码并输出结果。

在使用过程中,还需要注意对编解码过程中可能出现的错误进行处理和修正。

5. 实际应用举例在实际工程和科研项目中,卷积编解码函数有着广泛的应用。

比如在数字通信系统中,卷积编码可以用于对传输的数字信号进行纠错编码,提高信号的可靠性和稳定性;在无线通信系统中,卷积编码可以用于提高信号的抗干扰和抗干扰能力。

通过Matlab中的卷积编解码函数,工程师和科研人员可以快速、高效地实现对数字信号的编解码处理,加速研发和测试过程。

6. 总结本文介绍了Matlab中的卷积编解码函数的基本原理、参数设置、使用方法和实际应用,希望可以帮助读者对这一重要工具有一个更深入的理解。

卷积编码译码通信原理课程设计MATLAB

卷积编码译码通信原理课程设计MATLAB
elseif j==3
set(h,'color','y');
end
hold on
end
title('卷积编码译码');
legend('灾难编码器','1/2编码器','1/3编码器')
xlabel('信道信噪比');
ylabel('误码率');
六.实验结果及分析
编码器灾难性编码系统结果
对比三个仿真结果可知:灾难性编后果十分严重,在实际应用中必须编码,另外1/3编码器比1/2编码器性能要好。
d.网格图(研究卷积码最大似然译码维特比算法的工具)
纵坐标表状态,横坐标表时间。
从图中我们可看出编码过程中使用K-1个冲洗比特使得编码器恢复初始状态是有必要的。
三、卷积码的译码
Viterbi译码(最大似然译码)
先验概率条件下,后验概率最大者似然函数最大,最值MAP即最大似然(ML)译码。而最大对数似然函数即计算最小汉明距,如此,比较接受序列和发送序列汉明距,选出最小汉明距序列作为最佳译码即可。
如图:
状态表为:
ui
ui-1
si
0
0
a
1
0Байду номын сангаас
b
0
1
c
1
1
d
有如下状态图:
b.树图(将状态图按时间展开)
设初始状态s0=00为树根,对每个时刻的可能输入进行分支,分数级数L表示,L=0时,u0=0向上,u0=1向下,依次向后无限延伸,分支上数字表示相应输出,a,b,c,d表示状态。(优点:时序关系清晰)
四、卷积灾难性错误(Catastrophic error)

利用MATLAB编写卷积函数myconv.docx

利用MATLAB编写卷积函数myconv.docx

一、实验目的1 .了解MATLAB的基本操作。

2.利用MATLAB实现正弦信号采样;3.利用MATLAB编写卷积函数my con V。

二、实验条件PC 机,MATLAB7.0三、实验内容(-)函数文件与脚本文件的定义,正弦信号的釆样函数文件代码:function seqs=mysampling(Fs z L, Fx)t=l/Fs:l/Fs:L/Fs;t1=0:0.001:L/Fs;x=sin(2*pi*Fx*t);xl=sin(2*pi*Fx*tl);plot(t1,xl),hold on;stem(t,x,1r1);hold off;脚本文件代码:Fs=40;Fx=20;L=15;for Fx=20:10:80,mysampling(Fs, L, Fx);pause,End运行结果:1080 60402-02-0406-0 8-10 0.05 0.1 0 15 02 0.25 0.3 0.35 0.4实验屮遇到的问题及改正:function seqs=mysampling(Fs,L,Fx)t=1/Fs:1/Fs:L/Fs;x=sin(2*pi*Fx*t);plot(t z x)z hold on;stem(t z x, 1r1);hold off;一开始并没有添加tl=0 :0.001: L/Fs;xl=sin (2*pi*Fx*tl);两行代码,想利用t=l/Fs:l/Fs:L/Fs;x=sin(2*pi*Fx*t);生成的函数直接作为需要抽样的原函数,但是t的采样间隔太大,没法生成平滑的正弦曲线,所以导致最后仿真岀来的图像中岀现不光滑的正弦曲线。

经过思考找出问题后,另外编写了一个正弦函数,设定的采样间隔为0.001后,仿真出来的图像中就出现了光滑的正弦曲线。

(二)编写卷积函数myconvConv函数代码:function y=myconvl(h f x) n=length(x);k=length (h) ; %定义序列长度for m=l:1: (n-1)A (m) =0;end for m=n:1:n+k-1A(m)=h(m-n+l) ; %给h 序列添(n-l)个0endB=hankel(A);for i=l:1:nC ( : , i) =B (:, i) ; %抽取B矩阵屮从笫1列到第n列的矩阵end D=fliplr (C) ; %C矩阵左右翻转E=D ' ; %转置y(n+k-1)=0;for a=l:1:n+k-1for b=l:1:nnumble(b)=x(b)*E (b,a);y(a)=numble(b)+y (a);endnumble=[0 0 0]; 貂青零endystem(y);脚木代码:x=[l -2 3 1];h=[-3 2 -1 4] ; %定义x,h 序列myconvl(h A x);运行结果:» UntitledGy =■38 -U 9 -9 11arts =-3 8 -14 9 -9 11A» I四、实验结论和讨论通过本次实验运用MATLAB实现采样以及自行编写卷积函数,基本能熟悉运用MATLAB来进行实验,并且对于采样以及卷积的认识更加的深入。

卷积码的编码和译码

卷积码的编码和译码

卷积码是一种纠错编码技术,通常用于无线通信和数字通信系统中,以提高数据传输的可靠性。

卷积码的编码和译码是两个关键步骤,下面分别介绍这两个步骤:**编码:**1. **选择卷积码的参数:** 在编码之前,您需要确定卷积码的参数,包括约束长度(constraint length)、生成多项式(generator polynomial)和码率(code rate)。

这些参数将决定编码器的结构和性能。

2. **构建编码器:** 卷积码编码器通常是一个有限状态自动机(Finite State Machine,FSM)。

根据所选的生成多项式,配置编码器的状态转移图。

编码器的输入是要编码的数据位,输出是编码后的码字。

3. **编码操作:** 对每个输入位进行编码操作。

编码器的状态会根据输入位的不同而变化,从而生成不同的编码输出。

通常,每个输入位都会产生多个输出位,这是卷积码的特点之一。

4. **输出码字:** 编码器将生成的码字传送出来,以便传输或存储。

**译码:**1. **构建译码器:** 卷积码的译码器通常是使用一种称为Viterbi算法的最大似然译码方法来实现的。

译码器需要与编码器具有相同的约束长度和生成多项式。

2. **接收和测量:** 译码器接收传输的码字,并测量接收到的码字与每个可能的发送码字之间的距离或差异。

这些度量值用于决定哪个发送码字最有可能是原始数据。

3. **路径追踪:** Viterbi算法使用路径追踪技术来跟踪可能的状态序列,并根据度量值来选择最有可能的路径。

这个过程可以看作是在状态图上搜索最佳路径的过程。

4. **译码操作:** 根据最佳路径上的状态序列,译码器重建原始数据位。

这些数据位就是译码器的输出。

卷积码的译码是一种计算密集型的过程,通常需要高效的硬件支持,特别是在高速通信系统中。

Viterbi算法是一种复杂的算法,但它在纠错性能方面非常出色,可以大大提高数据传输的可靠性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

%survivor state是一个矩阵,它显T了通过网格的最优路径,这个矩阵通过一个单独的函数metric(x,y)给出。

%其中G是一个矩阵,它的任一行决定了从移位寄存器到模2加法器的连接方式.为生成矩阵%这里,我们做了一个简单的(2,1,7)卷积码编码器。

k=1;G=[1 0 1 1 0 1 1;1 1 1 1 0 0 1];%G1=133,G2=171%以下3种输入序列,可任选一种%%input=[0 0 0 0 0 0 0];%全0输入%input=[1 1 1 1 1 1 1];%全1输入input=[round(rand(1,7)*1)];%随机系列输入,也可用 randint(1,7,[0 1])figure;plot(input,'*r') %figure1:画图:目标input,红色(red,r),形状为* s=input;g1=G(1,:);g2=G(2,:);c1=conv(s,g1);%作卷积%disp(c1);c2=conv(s,g2);%disp(c2);n=length(c1);%7位输入时n=13c=zeros(1,2*n);%生成全0矩阵,1*26%disp(c);for i=1:nc(2*i-1)=c1(i);c(2*i)=c2(i);%两个模2加法器分别输出卷积结果序列后,由旋转开关读取的结果(此时仅为卷积结果,非2进制0/1)endfor i=1:2*nif(mod(c(i),2)==0)% mod(c(i),2)==0意思:c(i)除以2,余数为0c(i)=0;else c(i)=1;endendoutput=c;channel_output=output;%输出矩阵%disp(channel_output);figure;plot(output,'*b') %画图:目标:卷积码编码输出,蓝色(blue,b)* %————————————————以上为编码部分,以下为维特比译码————————————————n=size(G,1);%取矩阵G的行数,故n=2。

即得到输出端口,即2个模2加法器%检验G的维数if rem(size(G,2),k)~=0 %当矩阵G的列数不为k的整数倍时,rem为求余函数error('Size of G and k do not agree')%报错endif rem(size(channel_output,2),n)~=0 %当输出矩阵的列数不是输出端口n的整数倍时。

(注:size(channel_output,2)=26,2个模2加法器合成的输出)error('channle output not of the right size')endL=size(G,2)/k;%得出移位数,即寄存器个数,此例程为7%由于L-1个寄存器的状态即可表示出输出状态,所以总的状态数number_of_states可由前L-1个寄存器的状态组合来确定number_of_states=2^((L-1)*k);%此例程中2^6,移位寄存器组的状态数为64个%产生状态转移矩阵,输出矩阵和输入矩阵for j=0:number_of_states-1 %表示当前寄存器组的状态。

因状态从0开始,所以循环为从0到number_of_states-1for t=0:2^k-1 %k位输入端的信号组成的状态,总的状态数为2^k,所以循环为从0到2^k-1[next_state,memory_contents]=nxt_stat(j,t,L,k);%nxt_stat完成从当前的状态和输入的矢量得出下寄存器组的一个状态input(j+1,next_state+1)=t;%input数组值是用于记录当前状态到下一个状态所要的输入信号矢量%input数组的维数:一维坐标x=j+1指当前状态的值,二维坐标y=next_state+1指下一个状态的值%由于Matlab中数组的下标是从1开始的,而状态值是从0开始的,所以以上坐标值为:状态值+1branch_output=rem(memory_contents*G',2);%branch_output用于记录在状态j下输入1时的输出nextstate(j+1,t+1)=next_state;%nextstate状态转移矩阵,记录了当前状态j 下输入1时的下一个状态output(j+1,t+1)=bin2deci(branch_output);%output记录了当前状态j下输入1时的输出(十进制)endendinput;state_metric=zeros(number_of_states,2);%state_metric数组用于记录译码过程在每个状态时的汉明距离,大小为number_of_states,2%(:,1)为当前状态位置的汉明距离,为确定值;(:,2)为当前状态加输入得到的下一个状态汉明距离,为临时值depth_of_trellis=length(channel_output)/n;%depth_of_trellis用于记录网格图的深度channel_output_matrix=reshape(channel_output,n,depth_of_trellis);%cha nnel_output_matrix为输出矩阵,每一列为一个输出状态%res hape改变原矩阵形状,将channel_output矩阵变为n行depth_of_trellis列矩阵survivor_state=zeros(number_of_states,depth_of_trellis+1);%survivor_s tate描述译码过程中在网格图中的路径[row_survivor col_survivor]=size(survivor_state);%开始非尾信道输出的解码%i为段,j为何一阶段的状态,t为输入for i=1:depth_of_trellis-L+1 %i指示网格图的深度flag=zeros(1,number_of_states);%flag矩阵用于记录网格图中的某一列是否被访问过if i<=Lstep=2^((L-i)*k);%在网格图的开始处,并非所有的状态都取到else%用step来说明这个变化step=1; %状态数从1到2到4,直到number_of_statesendfor j=0:step:number_of_states-1 %j表示寄存器的当前状态for t=0:2^k-1 %t为当前的输入branch_metric=0; %用于记录码间距离binary_output=deci2bin(output(j+1,t+1),n);%将当前状态下输入状态t时的输出output转为n位2进制,以便计算码间距离。

(说明:数组坐标大小变化同上)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;%survivor_state数组的一维坐标为下一个状态值,二维坐标为此状态%在网格图中的列位置,记录的数值为当前状态,这样就可以从网格中某位置的%某个状态得出其对应上一个列位置的状态,从而能很方便的完成译码过程。

flag(nextstate(j+1,t+1)+1)=1;%指示该状态已被访问过endendendstate_metric=state_metric(:,2:-1:1);%移动state_metric,将临时值移为确定值end%开始尾信道输出的解码for i=depth_of_trellis-L+2:depth_of_trellisflag=zeros(1,number_of_states);%状态数从number_of_states→number_of_states/2→……→2→1%程序说明同上,只不过输入矢量只为0last_stop=number_of_states/(2^((i-depth_of_trellis+L-2)*k));for j=0:last_stop-1branch_metric=0;binary_output=deci2bin(output(j+1,1),n);for tt=1:nbranch_metric=branch_metric+metric(channel_output_matrix(tt,i),binary_output(tt));endif((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;endendstate_metric=state_metric(:,2:-1:1);end%从最优路径产生解码输出%译码过程可从数组survivor_state的最后一个位置逐级向前译码%由段得到状态序列,再由状序列从input矩阵中得到该段的输出%数组survivor_state的最后的输出状态肯定为“0”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_trellisstate_sequence(1,depth_of_trellis-i+1)=survivor_state((state_sequence(1,depth_of_trellis+2-i)+1),depth_of_trellis-i+2);%由后向前endstate_sequence;decoder_output_matrix=zeros(k,depth_of_trellis-L+1);for i=1:depth_of_trellis-L+1dec_output_deci=input(state_sequence(1,i)+1,state_sequence(1,i+1)+1);%根据数组input的定义来得出从当前状态到下一个状态的输入信号矢量dec_output_bin=deci2bin(dec_output_deci,k);%转换成2进制信号decoder_output_matrix(:,i)=dec_output_bin(k:-1:1)';%将每一次译码存入译码输出矩阵decoder_output_matrix相应的位置enddecoder_output=reshape(decoder_output_matrix,1,k*(depth_of_trellis-L+1));%按照一维序列形式重新组织输出cumulated_metric=state_metric(1,1);%state_metric为网格图最后一个列位置中“0”状态位置的汉明距离,此值就是整个译码过程中的汉明距离%卷积码的维特比译码函数figure;plot(decoder_output,'*r') %还原出的输入信号。

相关文档
最新文档