主要内容

vitdec

利用维特比算法对二进制数据进行卷积解码

描述

例子

decodedout= vitdec (codedin格子tbdepthopmodedectype解码的每一个符号codedin使用维特比算法进行输入。所有其他输入分别指定卷积编码网格、回溯深度、操作模式和决策类型,并在运行时共同配置Viterbi算法。

decodedout= vitdec (codedin格子tbdepthopmode“软”,nsdec配置用于软决策解码的维特比算法dectypensdec量化。

例子

decodedout= vitdec (codedin格子tbdepthopmodedectypepuncpat解码每一个被刺穿的符号codedin输入,puncpat是穿刺的图案。

decodedout= vitdec (codedin格子tbdepthopmodedectypepuncpateraspat指定擦除模式,eraspat.要不使用穿孔,请指定puncpat作为[]

decodedout= vitdec (codedin格子tbdepth“无法忍受”,dectype___imetricistateiinput的连续操作模式opmode对于任何前面的语法。方法指定的初始状态度量、回溯状态和回溯输入开始imetricistate,iinput,分别。

连续操作模式使您能够保存解码器的内部状态信息,以便在后续调用此函数时使用。如果数据被划分为在循环中处理的一系列向量,那么重复调用此函数将非常有用。有关需要重复调用维特比解码算法的工作流,请参见提示

decodedoutfmetricfstatefinput) = vitdec (codedin格子tbdepth“无法忍受”,___当对上述任何语法使用连续操作模式时,还在解码过程结束时返回最终状态度量、回溯状态和回溯输入。使用fmetricfstate,finput的初始设置imetricistate,iinput,在对该函数的后续调用中分别执行。有关需要重复调用维特比解码算法的工作流,请参见提示

例子

全部折叠

函数对向量1s进行卷积编码convenc函数,并通过使用vitdec函数。

方法定义网格结构poly2trellis函数。使用网格结构配置convenc函数在对1的向量进行编码时。

网格= poly2trellis([4 3],[4 5 17;7 4 2]);x = 1 (100 1);代码= convenc (x,格子);

在解码已编码的消息时,配置Viterbi解码器以使用前面定义的网格结构、回溯深度为2、截断操作模式和艰难决策。

结核病= 2;解码= vitdec(代码,格子,结核病,“trunc”“硬”);

验证已解码消息的向量为100 1s。

isequal(解码(100 1))
ans =逻辑1

将维特比解码应用于穿孔信号。穿孔将代码率从1/2更改为3/4。

初始化编码和解码操作的参数。

Trellis = poly2trellis(7,[171 133])
格子=结构体字段:numInputSymbols: 2 numOutputSymbols: 4 numStates: 64 nextStates: [64x2 double] outputs: [64x2 double]
tbdepth = 96;opmode =“trunc”;dectype =“硬”;puncpat = [1; 1, 0, 1, 1, 0];

计算未穿孔码率和已穿孔码率。

K = log2 (trellis.numInputSymbols);%输入流的数量N = log2 (trellis.numOutputSymbols);%输出流的数量unpunc_coderate = K / N
unpunc_coderate = 0.5000
punc_coderate = (K / N) *(长度(puncpat) /笔(puncpat))
punc_coderate = 0.7500

对全1s位的信息进行卷积编码,并对编码的输出进行穿刺。

味精= 1(100 *长度(puncpat), 1);puncturedcode = convenc(味精、格子、puncpat);

显示消息的长度、被戳穿的代码和戳穿的图案。

长度(味精)
ans = 600
长度(puncturedcode)
ans = 800
长度(puncpat)
ans = 6

对被戳穿的编码信息应用维特比解码。将解码后的输出与原始消息进行比较。即使对编码的信息进行了穿孔处理,维特比解码恢复了信息,误差为零。

codedin = puncturedcode;decodedout = vitdec (codedin,格子,tbdepth opmode, dectype, puncpat);
decodedout isequal(味精)
ans =逻辑1

如果链路使用速率为2/3的卷积码,采用16-QAM调制,并通过AWGN信道传输数据,则估计误码率(BER)模拟。此图显示了一个速率为2/3的编码器,有两个输入流,三个输出流和七个移位寄存器。

定义由图表示的卷积编码网格。

Trellis = poly2trellis([5 4],[23 35 0;0 5 13])
格子=结构体字段:numInputSymbols: 4 numOutputSymbols: 8 numStates: 128 nextStates: [128x4 double] outputs: [128x4 double]
K = log2 (trellis.numInputSymbols);输入位流的百分比N = log2 (trellis.numOutputSymbols);输出位流的百分比coderate = K / N;流(“K是%d, N是%d。编码率为%3.2f.\n'...K, N, coderate)
K等于2 N等于3。编码率为0.67。

设置调制顺序,并计算每个调制符号的比特数。生成随机二进制数据。输入位流必须是输入位流(K)进行编码操作,且必须是每个调制符号的位数的倍数(个基点)为调制操作。

M = 16;%调制顺序个基点= log2 (M);每个调制符号的比特数numSymPerFrame = 5000;dataIn = randi([0 1],K*bps*numSymPerFrame,1);

对输入数据进行卷积编码。

codedout = convenc (dataIn,格子);

对编码的符号应用16-QAM调制。

txSig = qammod (codedout, M,“InputType”“一点”);

使用每个符号的比特数(bps)和代码速率(coderate),将每比特能量的比值转换为噪声功率谱密度(EbNo)转换为信噪比(信噪比)值供情况下函数。将10db Eb/No转换为等效的信噪比。通过AWGN通道传递信号。

EbNo = 9;snr = EbNo + 10*log10(bps*coderate);rxSig = awgn (txSig,信噪比,“测量”);

解调接收到的信号。

demodSig = qamdemod (rxSig, M,“OutputType”“一点”);

指定维特比解码器的回溯深度。

tbdepth = 16;

使用在连续终止模式下工作的维特比解码器解码二进制解调信号。

tbdepth dataOut = vitdec (demodSig,格子,“合同”“硬”);

通过解码器计算延时,在计算误码率时考虑解码延时。将编码后的误码率与理论未编码的误码率进行比较,观察编码后数据的误码率改进情况。

decDelay = K * tbdepth;berCoded = biterr (...dataIn (1: end-decDelay) dataOut) / (decDelay + 1:结束)...长度(dataOut (decDelay + 1:结束);berUncoded = berawgn (EbNo,“qam”, M);流(编码的误码率为%6.5f。未编码的误码率为%6.5f.\n'...berCoded berUncoded)
编码误码率为0.00060。未编码误码率为0.00439。

输入参数

全部折叠

卷积编码的消息,指定为二进制或数值的向量。每个符号在codedinlog2 (格子numOutputSymbols位。

当您设置dectype“unquant”,输入范围[-10之外的值12,1012被剪到了-1012和1012,分别。

数据类型:|逻辑

网格描述,指定为MATLAB®结构,该结构包含速率的网格描述K/N代码。K表示输入位流的数量,和N表示输出位流的数量。

网格结构包含了这些区域。你可以使用poly2trellis函数来创建网格结构或手动创建它。有关此结构的更多信息,请参见卷积码的网格描述istrellis函数。

输入到编码器的符号数,指定为等于2的整数K,在那里K是输入位流的数目。

数据类型:

编码器输出的符号数,指定为等于2的整数N,在那里N输出位流的数量。

数据类型:

编码器中的状态数,指定为2的幂。

数据类型:

当前状态和当前输入的所有组合的Next状态,指定为整数矩阵。矩阵的大小必须是numStates2K

数据类型:

当前状态和当前输入的所有组合的输出,指定为八进制数矩阵。矩阵的大小必须是numStates2K

数据类型:

数据类型:结构体

回溯深度,指定为正整数。有关更多信息,请参见回溯深度估计

数据类型:

运行模式,指定为“合同”“术语”,或“trunc”.此输入表示解码器的工作模式以及对相应编码器的工作所作的这些假设。

  • “合同”—连续工作模式。在连续工作模式下,假定编码器已在全零状态启动。解码器从具有最佳度量的状态往回追溯。延时等于输入tbdepth符号在第一个解码的符号出现在输出中之前消失。当您重复调用此函数并希望保持连续调用之间的连续性时,此模式非常合适。有关需要重复调用维特比解码算法的工作流,请参见提示

  • “术语”—终止工作模式。在终止操作模式下,假定编码器已经开始并以全零状态结束,对于的默认语法是这样的convenc函数。解码器从全零状态开始追踪。这种模式产生零延迟。

    此模式适用于将消息输入到convenc函数的末尾有足够的零来填满编码器的所有内存寄存器。零值尾位从编码器中刷新所有消息数据位。利用编码器的多项式描述,对于具有K输入位和约束长度向量ConstraintLength时,刷新编码器所需的零数为K×max (ConstraintLength- 1).的第一个输入参数poly2trellis函数。

  • “trunc”—截断工作模式。在截断工作模式下,假定编码器已在全零状态启动。解码器从具有最佳度量的状态往回追溯。这种模式产生零延迟。当您不能假定编码器以全零状态结束,并且不希望在对该函数的连续调用之间保持连续性时,这种模式是合适的。

“术语”而且“trunc”模式,回溯深度,tbdepth,必须为正整数,小于或等于输入符号的数量codedin

有关更多信息,请参见回溯和解码延迟而且回溯深度估计

数据类型:字符|字符串

解码类型,指定为“unquant”“硬”,或“软”.此参数指示解码器作出的解码决策的类型,并影响解码器期望作为输入的数据的类型codedin

  • “unquant”-解码器期望有符号的数字输入值,其中正值映射到逻辑0负值映射到一个逻辑1

  • “硬”-解码器期望的二进制输入值01

  • “软”-解码器期望在[0,(2)范围内的整数输入值nsdec- 1)]。Viterbi算法决策准则以0为最自信的0和2nsdec- 1是最自信的1。

数据类型:字符|字符串

软决策量化比特数,指定为范围[1,13]的整数。作为参考,与硬决策解码相比,具有3位量化的软决策解码提高了错误解码恢复约2 dB。

依赖关系

要启用此输入参数,请设置dectype输入参数“软”

数据类型:

穿刺图案,指定为二进制值的矢量。用0S和未穿孔的钻头1s.输入码长度除以穿孔图案中1的个数乘以穿孔图案的长度,必须是输入符号比特数的整数倍。

数据类型:

擦除模式,指定为二进制值的向量。用1S和未擦除的位用0s.擦除模式的长度必须与输入码的长度相同。

数据类型:

解码器状态度量,指定为整数或整数值的向量。每个值在imetric表示相应解码器状态的启动状态度量。当您设置imetric对于一个向量,它的长度必须是格子numStates.若要使用默认解码器状态度量,请指定imetric作为[]

依赖关系

要启用此输入参数,请设置opmode输入参数“合同”

数据类型:

解码器初始回溯状态,指定为格子numStates——- - - - - -tbdepth范围为[0,(]的整数值的矩阵格子numStates- 1)]。若要使用默认解码器初始回溯状态,请指定istate作为[]

输入istate而且iinput联合指定解码器的初始回溯内存。如果编码器原理图有多个输入流,则接收第一个输入流的移位寄存器提供中的最低有效位istate,接收最后一个输入流的移位寄存器提供中最有效的位istate

依赖关系

要启用此输入参数,请设置opmode输入参数“合同”

数据类型:

解码器初始回溯输入,指定为格子numStates——- - - - - -tbdepth范围为[0,(]的整数值的矩阵格子numStates- 1)]。若要使用默认解码器初始回溯输入,请指定iinput作为[]

输入istate而且iinput联合指定解码器的初始回溯内存。

依赖关系

要启用此输入参数,请设置opmode输入参数“合同”

数据类型:

输出参数

全部折叠

已解码的消息,作为二进制值的向量返回。向量中的每个符号decodedoutlog2 (格子numInputSymbols位。

解码器最终状态度量,作为整数值的向量返回格子numStates元素。每个值在fmetric表示相应解码器状态的最终状态度量。

当调用vitdec在连续模式下,fmetric通常用来设置imetric的后续调用vitdec函数。

依赖关系

时应用此输出opmode参数设置为“合同”

数据类型:

解码器最终的回溯状态,返回为格子numStates——- - - - - -tbdepth范围为[0,(]的整数值的矩阵格子numStates- 1)]。

输出fstate而且finput共同描述解码器的最终回溯存储器。如果编码器原理图有多个输入流,则接收第一个输入流的移位寄存器提供中的最低有效位fstate,接收最后一个输入流的移位寄存器提供中最有效的位fstate

当调用vitdec在连续模式下,fstate通常用来设置istate的后续调用vitdec函数。

依赖关系

时应用此输出opmode参数设置为“合同”

数据类型:

解码器最终的回溯输入,返回为格子numStates——- - - - - -tbdepth范围为[0,(]的整数值的矩阵格子numStates- 1)]。

输出fstate而且finput共同指定解码器的最终回溯内存。

当调用vitdec在连续模式下,finput通常用来设置iinput的后续调用vitdec函数。

依赖关系

时应用此输出opmode参数设置为“合同”

数据类型:

更多关于

全部折叠

回溯和解码延迟

回溯深度会影响解码延迟。解码延迟是输出中第一个解码符号之前的零符号的数目。

  • 对于连续工作模式,解码延迟等于回溯深度符号的数量。

  • 对于截断或终止的操作模式,解码延迟为零。在这种情况下,回溯深度必须小于或等于每个输入中的符号数量。

回溯深度估计

一般估计,一个典型的回溯深度值大约是2到3倍ConstraintLength- 1) / (1 -coderate.代码的限制长度,ConstraintLength等于(log2 (格子numStates) + 1).的coderate等于K/N)×(长度(PuncturePattern) /笔(PuncturePattern

K是输入符号的数量,N是输出符号的个数,和PuncturePattern是穿刺模式向量。

例如,应用这个一般的估计,会得到这些近似的回溯深度。

  • 速率为1/2的代码的回溯深度为5(ConstraintLength- 1)

  • 速率为2/3的代码的回溯深度为7.5 (ConstraintLength- 1)

  • 速率为3/4的代码的回溯深度为10 (ConstraintLength- 1)

  • 速率为5/6的代码的回溯深度为15 (ConstraintLength- 1)

有关更多信息,请参见[7]

提示

  • 考虑使用comm.ViterbiDecoder当需要连续调用Viterbi算法时,系统对象™。System对象通过固有地保留状态度量、回溯状态和调用之间的输入,简化了所需的状态保留操作。

参考文献

[1]克拉克,乔治·C和j·比布·凯恩。数字通信纠错编码.通信理论的应用。纽约:全会出版社,1981年。

[2]吉特林,理查德D.,耶利米F.海耶斯,斯蒂芬B.温斯坦。数据通信原理。通信理论的应用.纽约:全会出版社,1992年。

[3]海勒,J.和I.雅各布斯。卫星和空间通信的维特比解码。IEEE通信技术汇刊19日,没有。5(1971年10月):835-48。https://doi.org/10.1109/TCOM.1971.1090711。

[4]安田,Y., Kashiki K.,平田Y.。软决策维特比解码的高速率穿孔卷积码。IEEE通信汇刊32岁的没有。3(1984年3月):315-19。https://doi.org/10.1109/TCOM.1984.1096047。

[5]哈昆,D.和G.贝京。维特比和顺序译码的高速率穿孔卷积码。IEEE通信汇刊37岁的没有。11(1989年11月):1113-25。https://doi.org/10.1109/26.46505。

[6]开始,G., D.哈昆,C.帕奎因。用于维特比和顺序解码的高速率穿孔卷积码的进一步结果。IEEE通信汇刊38岁的没有。11(1990年11月):1922-28。https://doi.org/10.1109/26.61470。

[7]Moision B。卷积码的截断深度经验法则。信息理论与应用研讨会(2008年1月27日- 2008年2月1日,加州圣地亚哥),555-557。纽约:IEEE, 2008。

扩展功能

版本历史

之前介绍过的R2006a

全部展开

Baidu
map