1.1 前言
随着现代通信技术的发展,高速传输和高可靠性成为信息传输的两个主要方面,而可靠性尤为重要。信息在实际信道中传输时,信道特性的不理想、加性噪声和人为干扰等因素的影响,都会使系统接收的信息不可避免地出现差错。为降低误码率,实现可靠性通信,通常采用的途径有两种:一种是通过选择高质量的传输线路、改善信道的传输特性、增加发送信号的功率、选择有较强抗干扰能力的调制解调方式等,来降低信道本身引起的误码;另一种是通过信道编码对信道差错进行控制。许多情况下,前者常常会受条件的限制,不是所有情况都能采用,而信道差错控制编码则可以弥补前者的不。纠错编码的基本实现方法是在发送端将被传输的信息附上一些监督码元,这些多余的码元与信息码元之间以某种确定的规则相互关联(约束)。接收端则根据既定的规则校验信息码元与监督码元之间的关系。一旦传输发生差错,则信息码元与监督码元的关系就受到破坏,从而在接收端可以发现错误乃至纠正错误。
1.2纠错码的应用和发展
在实际传输信息时,如果由于信道传输特性、加性噪声和人为干扰等因素的影响而使接收到的信息出现差错,那么为了使系统能够达到一定的误比特率,可以通过合理设计基带信号,选择调制、解调方式,采用频域均衡或时域均衡等手段,使误比特率尽可能降低。但如果误比特率仍达不到要求,那么必须通过信道编码即纠错编码来进一步降低误比特率。由于信道编码可以使传输质量提高1-2个数量级或更多,所以在现代通信系统中,信道编码已经成为系统重要的组成部分,对提高整个系统的传输性能起着重要的作用。
1948年,香农(Shannon)在他的开创性论文“通信的数学理论“中,首次阐明了在有扰信道中实现可靠通信的方法,提出了著名的有扰信道编码定理:对于一个给定的有扰信道,若信道容量为C,只要发送端以低于C的速率R发送信息,则一定存在一种编码方法,使译码错误概率Pe随着码长n的增加。
目前,各种纠错码如循环码、BCH码、RS码、LDPC码以及调制与纠错码相结合的TCM码等都得到很好的研究、发展和应用,可以说纠错码已渗透到很多领域。在移动通信中,纠错码被广泛用于模拟体制的信令传输及数字体制的整个传输,以提高传输的可靠性和节省宝贵的频谱资源;在卫星通信中,纠错码技术已成为降低对高功放的要求和减少地球站天线孔径尺寸的经济且可靠的方法;在电话网上的数据传输中,纠错码技术已成为将高速数据传输变成现实的关键技术;在计算机存贮和运算系统中,也广泛应用了纠错码技术。此外,在超大规模集成电路设计中采用纠错码技术后,大大提高了集成电路芯片的成品率,同时又降低了芯片成本。
由信道编码理论可知,随着码长n的增加,译码错误概率按指数方式趋近于零。因此为提高纠错码有效性,就必须使用长码。但码长增加,码率会相应下降,译码设备复杂性与计算量也相应增加,以致难以实现。要解决这一矛盾,可采用级联码的方法。级联码一般由内码和外码两级组成。内码既可以用作纯纠错,也可以用做纠错与检错。但一般情况下,级联码被用在组合信道中,内码中出现的错误往往超过了内码的纠错能力。所以,内码通常仅用来纠正少量错误,其主要能力用来检错,指出错误位置;纠错任务则由外码译码器完成。这样两级译码的结果,得到了好的纠错效果,还使得内/外译码器均较简单,内译码器是检错译码器,外译码器是纠错译码器。
Turbo码是由C.Berron等人在1993年提出的接近香农极限的一种并行级联码,是在综合几十年来级联码、乘积码、最大后验概率译码及迭代译码等理论基础上的一种创新。其基本原理是通过编码器的巧妙构造,即多个子码通过交织器进行并行或串行级联(PCC/SCC),然
后进行迭代译码,从而获得卓越的纠错性能。Turbo码不但在抑制加性高斯噪声方面性能优越,而且还具有很强的抗衰落、抗干扰能力。在低于香农极限0.7dB的情况下,可以得到10-5
的误码率。正是由于Turbo码超乎寻常的性能,使得它的一经出现就立即引起编码学界的极大轰动,围绕Turbo码的研究也成了通信系统中的一个热点。
随着近年来电子技术和集成电路技术的发展,纠错编码技术不但早已应用于实际的通信设备之中,而且不断的有更高性能、更低功耗的译码器出现。正是这种实际应用与纠错码理论研究的相互促进,使得纠错编码技术不断呈现出蓬勃向上的活力。
1.3 本课题研究意义
进行信道编码时,可采用多种纠错码。其中卷积码和分组码是纠错码的两种主要形式,在码率和编码器复杂程度相同的情况下,卷积码的性能要优于分组码,而且更易于实现最佳译码和准最佳译码。由于卷积码的优异性能,使得它在很多方面都得到了应用。由于卷积码各码组之间的相互关联,在对卷积码的分析时,至今未找到像分组码那样严密的数学分析手段,因此对卷积码的性能分析比较困难,目前大多是通过计算机进行好码的搜索。卷积码的译码也较分组码容易,可有两大类译码方法:代数译码和概率译码。在概率译码中,维特比译码算法是一种最大似然算法,在码的约束度较小时,其效率比序列译码算法更高、速度更快,译码器也较之更为简单。所以,自维特比译码算法提出以来,在理论和实践方面都得到了极其迅速的发展,被广泛地应用于各种数传系统。
1.4 卷积编码和维特比译码
现代信息和编码理论的奠基人C.E.Shannon在1948年提出了著名的有噪信道编码定理,在定理中Shannon给出了在数字通信系统中实现可靠通信的方法以及在特定信道上实现可靠通信的信息传输速率上限。同时,该定理还给出了有效差错控制编码的存在性证明,从而促进了信道编码领域研究的快速发展。
卷积码是Elias等人在1955年提出的,是一种非常有前途的编码方法,尤其是在其最大似然译码算法-Viterbi译码算法提出之后,卷积码在通信系统中得到了极为广泛的应用。其中约束长度K=7,码率为1/2和1/3的卷积码己经成为商业卫星通信系统中的标准编码方法。在“航海家“以及“先驱者”等太空探测器上也都采用了卷积码作为其差错控制编码方法。在移动通信领域,GMS采用约束长度K=5,码率为1/2的卷积码;在IS-95中,上行链路中采用的是约束长度K=9,码率为1/3的卷积码,在下行链路中采用的是约束长度K=9,码率为1/2的卷积码。特别在第三代移动通信标准中也是以卷积码以及与卷积码相关的编码方法作为差错控制编码方案的。
1.5 本课题主要研究内容
本文首先介绍纠错编码的应用和发展,对本课题研究的现实意义进行了简要阐述。然后介绍了与卷积码有关的基本概念,同时对与Viterbi译码相关的两种卷积码的表示方法进行了介绍。然后详细介绍了Viterbi译码算法,由于Viterbi译码是一种最大似然译码,所以首先对此进行了介绍;然后从理论的角度,分析了Viterbi译码算法;软判决Viterbi译码的性能要优于硬判决译码,对此也进行了介绍和比较。然后利用MATLAB进行卷积编码和维特比译码的仿真和性能分析。
卷积码是Elias在1955年提出的。在分组码中,把k个信息比特序列编成n个比特的码组,每个码组中的(n-k)个校验位仅与本码组的k个信息位有关,而与其它码组无关。为了达到一定的纠错能力和编码效率,分组码的码组长度一般比较大。编译码时必须把整个信息码组存储起来,由此产生的译码延迟会随着n的增加而增加。和分组码不同,卷积码前后各码组之间具有相关性,即卷积码编码后的n个码元不仅与当前段的k个信息有关,而且还与前面(N-1)(N为编码约束度)段的信息有关。在卷积码中,k个信息比特也被编成n个比特的码组,但k和n通常很小,并且可以通过串行或并行的方式进行传输,而且时延很小。编码过程中互相关联的码元个数为nN。由于卷积码在编码过程中,充分地利用了各码组之间的相关性,且k和n都比较小,因此,在与分组码同样的码率和设备复杂性条件下,从理论和实际两个方面,均已证明卷积码的性能至少不比分组码差,且实现最佳和准最佳也较分组码容易。但卷积码没有分组码那样严密的数学分析手段,目前,好的卷积码大多是通过计算机进行搜索得到的。
卷积码编码器如图3-1所示:
图3-1码率为k/n,编码约束度为N的卷积码编码器
图3-1主要包括:一个输入移位寄存器(分为N段,每段k位);n个模2加法器;一个输出数据选择器(n选一)。某一时刻,输入到编码器的k个信息元组成一个信息组,相应的输出序列是由n个码元组成的码段。这里,称N为编码约束度,说明编码过程中互相约束的码段个数。令N=m+1,则m称为编码存储,它表示输入信息组在编码器中需存储的单位时间(有时为了简化,编码器中只用m段的输入移位寄存器)。称Nn为编码约束长度,说明编码过程中互相约束的码元个数,如m=2,n=2,则Nn=6。所以m或N以及Nn都是表示卷积码编码器复杂性的重要参数。
卷积码的表示方法主要有多项式矩阵表示法、状态图表示法和网格图表示法。其中,多项式矩阵表示法主要用于代数译码,而Viterbi译码算法主要采用后面两种方法来表示。下面以(2,1,2)码为例来介绍状态图表示法和网格图表示法。设(2,1,2)码的两个子生成元为:
所以,该码的生成多项式矩阵为:
根据G(D)可得如图3-2所示的编码电路:
图3-2(2,1,2)卷积码编辑器
3.3 卷积码的状态表示法
图3-3 (2,1,2)卷积编码状态图
上图为图3-2所示卷积码编码器的状态图。编码器的寄存器在任一时刻的所存储的内容称为编码器的一个状态,以s1表示。本例中,编码存储m=2,k=1,编码器由两级移位寄存器构成,所以,移位寄存器所存储的内容只有四种情况:00、10、01和11,这就是说本例中的编码器共有四种状态:s0、s1、s2和s3。随着信息序列不断送入,编码器会不断地从一个状态转移到另一个状态。利用状态转移路径不但可以表示出该转移过程中所对应的输出码段,同时还可以显示所对应的输入信息元。虽然状态图能够表示卷积码编码器在不同输入的信息序列下,编码器各状态之间的转移转移关系,但却不能描述随时间变化时系统状态转移的轨迹,为了解决这个问题,可引入下面要介绍的网格图表示法。
图3-4编码器的编码过程,可以用图3-4所示的码树来描述。图中每个节点“.”对应于一个输入码元。按照习惯,当输入为“0”时,走上分支:输入为“1”时,走下分支,并将编码器的输出标在每个分支的上面。按此规则,就可以画出码树的路径。对于任一个码元输入序列,编码器输出序列一定与码树中的一条特殊的路径相对应。因此,沿着码元输入序列,就可以获得相应的输出码序列。例如,如果输入的信息序列为1010…,输出编码序列为11100010…,如图中虚线所示。可以看出,编码器的输出与当前输入的码元mj和先前输入的两个码元mj-2mj-1,的取值有关。我们将编码器中寄存器内所存储的,先前输入的信息码元的可能取值称为编码器的状态。编码器mj-2mj-1,可能的取值有四种:00,01,10和11,我们分别用 s0,sl,s2和s3表示,并将其分别标注在码树的各节点上。
图3-4 (2,1,2)卷积码的码树
在编码器的输入端输入一个新的信息码元后,编码器会从原来的状态转换成新的状态。例如,若编码器原来的状态为sl,当输入码元为“1”时,编码器会从sl状态转换到s3状态:当输入码元为“0”时,编码器会从sl状态转换到s2状态。从码树上还可以看到,从第四条支路开始,码树的各节点从上而下开始重复出现s0,sl,s2,s3四种状态,并且码树的上半部和下半部分完全相同,这意味着从第4位信息元输入开始,无论第1位信息码是“0”还是“1”,对编码输出都没有影响,即输出码已经与第1位信息码元无关,这正是约束度N=3的含义。
在码树中,从同一个状态节点出发的分支都相同。我们可以将状态相同的节点合并在一起,这样就得到了卷积码的另外一种更为紧凑的图形表示方法,即网格图。虽然状态图展示了状态的转移的去向,但不能记录状态转移的轨迹,网格图可以弥补状态图的缺陷。它可以将状态转移展开在时间轴上,使编码的全过程跃然纸上,是分析卷积码的有力工具。在网格图中,将码树中的上分支(对应于输入码元为“o”的情况)用实线表示,下支路(对应于输入码元为“1”的情况)用虚线表示,并将编码输出标在每条支路的上方。网格图的每一行节点分别代表s0,sl,s2,s3四种编码器状态。(2,1,2)卷积码编码器的网格图如图3-5所示。
图3-5 卷积码的网状图
在某一时间单位i,离开每一状态的虚线分支,表示输入编码器的信息码元mi=0即输入为0:而实线分支表示此时刻输入至编码器的信息码元mi=l,即输入为1。每一分支上的2位数字,表示i时刻编码器输出的子组,因而网格图中的每一条路径都对应于不同输入的信息序列。与码树一样,任何可能的输入码元序列都对应着网格图上的一条路径。例如输入至图3-5中编码器序列m=(1011100),对应的编码输出序列C=(11,10,00,01,10,01,11),它相应于图3-5中粗
卷积码的自由距离,是用来衡量所有可能码字序列对之间的距离的。其定义为:整个编码码树上,所有半无限长序列之间的最小汉明距离。由于卷积码的自由距离直接决定了它的纠错能力,所以寻找具有最人白由距离的卷积码是一项非常重要的工作。不过对于卷积码的构造,目前除了计算机搜索外还没有其它更好的方法。下表是由奥登沃尔德和拉森采用计算机搜索方法得到的固定码率和约束长度时具有最大自由距离的卷积码。
表2-l卷积码的自由距离与编码增益
约束长度K |
生成多项式 |
白由距离 |
编码增益db |
3 |
(5,7) |
5 |
4.26 |
4 |
(15,17) |
6 |
5.23 |
5 |
(23,35) |
7 |
6.02 |
6 |
(53,75) |
8 |
6.37 |
7 |
(133,171) |
10 |
6.99 |
8 |
(247,371) |
10 |
7.72 |
9 |
(561,753) |
12 |
7.78 |
4.1维特比译码器的算法
当前最流行的,最常用的卷积码译码算法式A.J.维特比于1967年提出的维特比(Vietbri)算法,1973年,富尼最终证明了维特比算法实质上就是卷积码的最大似然译码,这就是说,从似然的角度上看,这种算法已经式最优的了,维特比算法在约束长度K<10卷积码译码中己成为首选的,最普遍采用的算法。
卷积编码的过程就是编码器状态沿着时间轴一级一级跳转的过程。维特比译码算法则是在网格图上搜索最可能的状态跳转路径的过程。维特比译码算法先读取t时刻的所有状态的幸存路径度量,再根据t+1时刻的输入,算出跳转路径的度量:根据这两类度量算出t+1时刻到状态S的所有路径的度量,比较选出一个具有较小路径度量的路径作为t+l时刻状态S的幸存路径。这样对每个状态都得到一个幸存路径,根据这些幸存路径和最终编码器所处的状态就可以得到编码器的状态转移路径即译码结果。维特比译码结果的可信度取决于幸存路径的深度和它的路径度量值。幸存路径越深、路径度量值越高,那么译出信息的可信度就越高。在译码过程中有些路径被抛弃了,有些路径被保留了下来。被以为是幸存路径的,也可能会在后面的搜索过程中被抛弃掉。这样随着搜索的深度不断加深,最终正确的路径将会被保留下来,所有的幸存路径都将收敛于一条路径。由上面的描述可知,维特比译码器至少需要完成以下操作:
·t时刻幸存路径度量的存储。
·t时刻到t+l时刻的分支度量的生成。
·t+1时刻幸存路径度量的生成和选择。
维特比译码器的基本结构正是按照这些操作划分的。前面说过,网格图是理解维特比算法的核心。其核心思想是依次在每个时刻对网格图相应列的每个点(对应于编码器该时刻的状态),按照最大似然准则比较所有以它为终点的的路径,只保留一条具有最大似然值的路径,称之为幸存路径,而将其他路径堵死弃之不用,故到了下一时刻只要对幸存路径延伸出来的路径继续比较即可。即接收一段,计算、比较一段保留下幸存路径,如此反复直到最后。
下面举个简单例子说明维特比译码算法的过程:
输入至(2,1,2)编码器的信息序列M=(1011100),编码器输出的码序列C=(11,10,00,01,10,01,11),通过二进制对称信道(BSC)送入译码器的序列R=(10,10,00,01,11,01,11)有两个错误,下面我们利用维特比译码算法输出估计信息序列M和码序列C。维特比译码器接收序列R的过程如下所示:
·第一时刻接收到子码R0=10
·第二时刻接收到子码Rl=10
·第三时刻接收到R2=00
·第四时刻收到子码R3=0l
·第五时刻接收到子码R4=11
·第六时刻接收到子码R5=01
·第六时刻接收到子码R6=11
线条所示。
上面描述出了各时刻进入每一状态的幸存路径及其度量值d(最小汉明距离),以及与此相应的译码器估计的信息序列M。当L+m=7个时刻以后,4条幸存路径只剩一条,它就是译码器输出的估值序列C=(11,10,00,01,10,01,11),相应的估值信息序列M=(1011100),R中的两个错误得到了纠正。在某一时刻,如j=3时,进入s0状态的幸存路径的确定过程可叙述如下。进入s0状态的有两条路径:一条是由(00)分支加上与此分支相连的前一时刻(第2时刻)的幸存路径C01=(00,00)连接组成的路径(C01,00)=(00,00,00),d(R2,00)=d(00,00)=0,因而d(C0l,00,ROR1R2)=d(C0l,ROR1)+d(R2,00)=2+0=2,所以该路径的度量值d是2;另一条路径是由(11)分支加上与此分支相连的前一时刻(第2时刻)的幸存路径C01’=(11,10)连接组成的路径(C01’,11)==(11,10,11),它的度量值d=d(C0l’11,R0R1R2)=d(C0l’,R0R1)+d(R2,11)=l+2=3。根据最小汉明距离准则可得在第3时刻s0的幸存路径是C012=(00,00,00),它的度量值d=2。在其他时刻及进入其余状态的幸存路径的选择与此完全相同。若某一时刻进入某一状态的两条路径有相同的度量,如第4时刻,进入s2状态的两条路径(11,10,00,10)和(00,11,01,01),它们的度量值d都为3,故可任选一条作为s2状态的幸存路径,在图中选择(11,10,00,10)。这种任意选的结果,并不会影响最后结果的正确性。
5.2 卷积编码的MATLAB仿真与分析
卷积编码的MATLAB代码如下所示:
function output=encode(G,k0,input)
if rem(length(input),k0)>0
input=[input,zeros(size(1:k0-rem(length(input),k0)))];
end
n=length(input)/k0;
if rem(size(G,2),k0)>0
error('Error,G is not of the right size.')
end
L=size(G,2)/k0;
n0=size(G,1);
u=[zeros(size(1:(L-1)*k0)),input,zeros(size(1:(L-1)*k0))];
u1=u(L*k0:-1:1);
for i=1:n+L-2
u1=[u1,u((i+L)*k0:-1:i*k0+1)];
end
uu=reshape(u1,L*k0,n+L-1);
output=reshape(rem(G*uu,2),1,n0*(L+n-1));
我们来验证输入的信号是否正确,加上输入的信号为:
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 ………………………
通过卷积编码以后,得到信号:
0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 ………………………
卷积编码比较简单,这里我们就不做详细介绍了。下面我们将介绍维特比译码的实现。
5.3 维特比译码的MATLAB仿真与分析
维特比译码的MATLAB代码如下所示:
·检验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
·从最优路径产生解码输出
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);
通过译码以后,我们可以得到信号:
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 ………………………
说明译码是完全正确的。我们对该信号进行误码率分析。得到如下结果:
图5-1 维特比译码的信噪比
该系统的MATLAB代码如下所示:
x = bin_generator(x_num);
x(find(x < 0)) = 0;
x(find(x > 0)) = 1;
s=encode(G,1,x); %卷码编码
r=(2*s-1)+sigma(k)*randn(1,length(s));
r(2:10004)=0.3*r(1:10003)+0.7*r(2:10004);
r(find(r < 0)) = 0;
r(find(r > 0)) = 1;
dd=viterbi(G,1,r); %译码
%误码计数
Pe = length(find(x – dd))/x_num;
Plot_Pe = [Plot_Pe Pe];
5.4 不通过维特比译码的性能仿真
以上信号不通过维特比译码,其顶层代码如下所示:
x = bingen(x_num);
x(find(x < 0)) = 0;
x(find(x > 0)) = 1;
r=(2*x-1)+sigma(k)*randn(1,length(x));
r(2:5000)=0.3*r(1:4999)+0.7*r(2:5000);
r(find(r < 0)) = 0;
r(find(r > 0)) = 1
Pe = length(find(x - r))/x_num;
Plot_Pe = [Plot_Pe Pe];
其性能仿真如下所示:
图5-2 无维特比译码的信噪比
来源:oschina
链接:https://my.oschina.net/u/4313143/blog/4664254