循环冗余校验(CRC)的编码是一个错误控制编码技术检测传送消息时发生错误。与块或卷积编码、CRC编码没有内置的纠错能力。相反,当收到的通信系统检测到一个错误消息,接收方请求发送者在发送消息。
在CRC编码发射机规则适用于每个消息词创建额外的比特,叫做<年代p一个nclass="emphasis">校验和,年代p一个n>或<年代p一个nclass="emphasis">综合症年代p一个n>校验和,然后附加到消息。接收一个传播词后,接收方同样的规则适用于接收到的词。如果非零结果校验和,发射机发生了一个错误,应该重新发送消息。
打开错误检测和校正图书馆通过双击它的图标在主通信工具箱™块库。双击它的图标打开CRC子程序库的错误检测和校正的图书馆。
使用仿真软件通信工具箱支持CRC编码万博1manbetx万博1manbetx<年代up>®年代up>块,系统对象,或MATLAB<年代up>®年代up>对象。在列出这些CRC编码功能<一个href="//www.tianjin-qmedu.com/help/comm/error-detection-and-correction.html" class="a">错误检测和校正一个>。
年代ect我在><年代ection itemprop="content">间接CRC算法接受一个二进制数据矢量,对应于一个多项式,并附加一个校验和r的位,对应于一个多项式c输入向量和校验和的连接对应于多项式*
x年代p一个n><年代up>r年代up>+
该算法分*
P+
CRC生成功能,该功能实现了CRC算法的传输阶段,如下:
离开输入向量的数据变化
设置校验和等于二进制向量的长度
附加的输入数据的校验和向量。结果是输出向量。
CRC计算校验和检测特性的完整的输入向量,如上所述。
CRC算法使用二进制向量来表示二元多项式,降序排列的权力。例如,向量(1 1 0 1)
代表了多项式<年代p一个nclass="emphasis">x年代p一个n><年代up>3年代up>+<年代p一个nclass="emphasis">x年代p一个n><年代up>2年代up>+ 1。
请注意年代tr在g>
在这一节中描述的实现是一个许多CRC算法的有效实现。不同的实现可以产生不同的数值结果。
位进入线性反馈移位寄存器(LFSR)指数为最高指数最低。输入消息的顺序位代表消息多项式的系数降幂。消息向量是增强
假设输入帧(1 1 0 0 1 1 0)'
,相应的多项式M =<年代p一个nclass="emphasis">x年代p一个n><年代up>6年代up>+<年代p一个nclass="emphasis">x年代p一个n><年代up>5年代up>+<年代p一个nclass="emphasis">x年代p一个n><年代up>2年代up>+<年代p一个nclass="emphasis">x年代p一个n>,发电机多项式P =<年代p一个nclass="emphasis">x年代p一个n><年代up>3年代up>+<年代p一个nclass="emphasis">x年代p一个n><年代up>2年代up>程度的+ 1,r = 3。通过多项式除法,M*
x年代p一个n><年代up>3年代up>= (<年代p一个nclass="emphasis">x年代p一个n><年代up>6年代up>+<年代p一个nclass="emphasis">x年代p一个n><年代up>3年代up>+<年代p一个nclass="emphasis">x年代p一个n>)*
P +<年代p一个nclass="emphasis">x年代p一个n>。其余的是R =<年代p一个nclass="emphasis">x年代p一个n>然后,校验和[0 1 0)'
。左边添加一个额外的0校验和长度3。
在哪里
消息块的输入<年代p一个nclass="inlineequation">
编码输出<年代p一个nclass="inlineequation">
发生的初始步骤直接CRC编码的三个开关位置x算法提要
[1]Sklar,伯纳德。
[2]柳条斯蒂芬·B。
错误控制编码技术检测,可能正确,错误发生在数字通信系统中传输的消息。为此,编码器传输不仅信息符号,还额外的冗余符号。译码器解释它接收,使用冗余符号检测和纠正任何错误可能发生在传输过程中。您可能使用错误控制编码如果你的传输通道非常嘈杂的或如果您的数据对噪声非常敏感。根据数据或噪声的性质,你可以选择一个特定类型的错误控制编码。
块编码的错误控制编码是一个特例。分块编码技术固定数量的信息符号映射到一个固定数量的代码符号。一块编码器对每个独立的数据块,都是一个无记忆的设备。通过提供仿真软件模块通信工具箱包含分块编码功能,系统对象和MATLAB函数。万博1manbetx
分块编码技术的类包括分类如下图所示。
通信工具箱支持一般线性分组码。万博1manbetx也循环过程,BCH、汉明和Reed-Solomon代码(所有特殊类型的线性分组码)。块的产品编码或解码消息使用前面提到的技术之一。Reed-Solomon和BCH解码器解码时表示他们发现多少错误。Reed-Solomon编码块也让你决定是否要使用符号或比特数据。
请注意年代tr在g>
通信工具箱设计的模块和功能错误控制编码使用一个字母有2或2<年代up>米年代up>符号。
<年代trong id="fp52729">通信工具箱年代p一个n>万博1manbetx支持功能。年代tr在g>在通信工具箱可以支持模拟块的功能万博1manbetx
确定的技术特点,如纠错能力或可能的消息的长度
执行低级计算相关技术,如
计算真值表
计算发电机或奇偶校验矩阵
发电机和奇偶校验之间的转换矩阵
计算发电机多项式
有关错误控制编码功能的更多信息,请参阅<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">分组码一个>。
年代ect我在><年代ection itemprop="content">在本节中,包括编码的信息<年代p一个nclass="emphasis">消息年代p一个n>符号和由产生的代码<年代p一个nclass="emphasis">码字年代p一个n>。
每一块的
每个消息或码字是符号的有序组合。每个块的块编码子程序库过程一个词在每个时间步,如以下部分所述,<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">二进制格式(所有编码方法)一个>。Reed-Solomon编码也让你选择二进制整数数据块,所述<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">整数格式(仅Reed-Solomon)一个>。
<年代tr在g id="fp54972">二进制格式(所有编码方法)。年代tr在g>你可以结构信息和二进制码字<年代p一个nclass="emphasis">向量年代p一个n>信号,每个向量代表一个消息词或一个码字。在给定的时间,编码器接收整个消息的话,编码,和输出整个码字。消息和代码信号操作在同一样品时间。
这个例子说明了编码器接收四位信息和生产时间0位码字。它重复这个过程在时间1新消息。
对于所有编码技术<年代p一个nclass="emphasis">除了年代p一个n>Reed-Solomon使用二进制输入,消息向量一定K和对应的代码长度向量长度n . Reed-Solomon码与二进制输入的符号代码的二进制序列长度M,对应元素的伽罗瓦域GF (2<年代up>米年代up>)。在这种情况下,消息向量一定长度M * K和对应的代码向量长度M * N。二进制输入RS编码器块RS译码器和二进制输出块使用此格式的消息和码字。
如果分块编码块的输入是一个框架向量,它必须是一个列向量,而不是一个行向量。
生产纸浆包信息的二进制格式,您可以配置<一个href="//www.tianjin-qmedu.com/help/comm/ref/bernoullibinarygenerator.html">伯努利二进制信号发生器年代p一个n>一个>块,使其<年代tr在g class="guilabel">的概率为零年代tr在g>参数是一个向量的长度是你想创造的信号。生产不定位信息的二进制格式,您可以配置相同的块,使其<年代tr在g class="guilabel">的概率为零年代tr在g>参数是一个标量和它<年代tr在g class="guilabel">样品每帧年代tr在g>参数是你想创造的长度信号。
<年代tr在g class="emphasis bold">使用串行信号年代tr在g>
如果你喜欢结构信息和码字作为标量信号,几个样品共同形成词或码字的消息,您可以使用<一个href="//www.tianjin-qmedu.com/help/dsp/ref/buffer.html">缓冲年代p一个n>一个>和<一个href="//www.tianjin-qmedu.com/help/dsp/ref/unbuffer.html">Unbuffer年代p一个n>一个>块。缓冲需要延迟和多频处理。如果你的模型计算错误率,初始延迟coding-buffering组合的影响<年代tr在g class="guilabel">接收延迟年代tr在g>参数<一个href="//www.tianjin-qmedu.com/help/comm/ref/errorratecalculation.html">出错率计算年代p一个n>一个>块。
你可以显示信号的样本时间模型。在<年代tr在g class="guimenuitem">调试年代tr在g>选项卡,扩大<年代tr在g class="guimenuitem">信息覆盖年代tr在g>。在<年代tr在g class="guimenuitem">样品时间年代tr在g>部分中,选择<年代tr在g class="guimenuitem">颜色年代tr在g>。或者,你可以附上<一个href="//www.tianjin-qmedu.com/help/simulink/slref/probe.html">探针年代p一个n>一个><年代pan role="cross_prod">(万博1manbetx模型)年代p一个n>块连接器线来帮助评估样本时间、缓冲和延迟。
<年代p一个n我d="integer_format" class="anchor_target">整数格式(仅Reed-Solomon)。年代tr在g>消息词(N, K) Reed-Solomon代码由M * K位,可以解释为从0到2 K的象征<年代up>米年代up>。这些符号的二进制序列长度M,对应元素的伽罗瓦域GF (2<年代up>米年代up>),按照降序排列的权力。的整数格式Reed-Solomon代码允许您结构信息和码字<年代p一个nclass="emphasis">整数年代p一个n>而不是二进制信号的信号。(输入必须框架列向量)。
请注意年代tr在g>
在这种背景下,仿真软件预计万博1manbetx<年代p一个nclass="emphasis">第一个年代p一个n>一点一点是最重要的象征。“第一”意味着最小的索引向量或一系列标量的最小时间。
下图演示了二进制和整数之间的等价Reed-Solomon编码器的信号。解码器是类似的。
整数中的生产纸浆包消息格式,您可以配置以便随机整数生成器的块<年代tr在g class="guilabel">多状态数年代tr在g>和<年代tr在g class="guilabel">最初的种子年代tr在g>参数向量的所需的长度和所有条目<年代tr在g class="guilabel">多状态数年代tr在g>向量是2<年代up>米年代up>。在整数生成框架消息格式,您可以配置相同的块,使其<年代tr在g class="guilabel">多状态数年代tr在g>和<年代tr在g class="guilabel">最初的种子年代tr在g>标量和参数<年代tr在g class="guilabel">样品每帧年代tr在g>参数是你想创造的长度信号。
年代ect我在><年代ection itemprop="content">一旦您已经配置了编码块,一些小技巧可以帮助你正确地将它们在你的模型:
如果一块有多个输出,第一个总是流的编码数据。
Reed- - - - - -- - - - - - - - - -年代olomon和BCH块有一个错误计数器作为第二输出。
确保信号大小适合面具参数。例如,如果您使用二进制循环编码器块和设置<年代tr在g class="guilabel">消息长度K年代tr在g>来4
,输入信号必须是一个向量的长度4。
您可以在您的模型显示信号的大小。在<年代tr在g class="guimenuitem">调试年代tr在g>选项卡,扩大<年代tr在g class="guimenuitem">信息覆盖年代tr在g>。在<年代tr在g class="guimenuitem">信号年代tr在g>部分中,选择<年代tr在g class="guimenuitem">信号的维度年代tr在g>。
例如:Reed-Solomon整数格式的代码。年代tr在g>这个示例使用Reed-Solomon整数格式的代码。它说明了适当的向量长度的代码和信息信号的编码块。展品纠错,使用一个简单的方法引入到每个码字的错误。
打开模型通过输入doc_rscoding
在MATLAB命令行。构建模型,收集和配置这些块:
集<年代tr在g class="guilabel">多状态数年代tr在g>来15
。
集<年代tr在g class="guilabel">最初的种子年代tr在g>一个正数,<一个href="//www.tianjin-qmedu.com/help/matlab/ref/randn.html">randn
检查<年代tr在g class="guilabel">不定位输出年代tr在g>复选框。
集<年代tr在g class="guilabel">样品每帧年代tr在g>来5
。
集<年代tr在g class="guilabel">码字长度N年代tr在g>来15
。
集<年代tr在g class="guilabel">消息长度K年代tr在g>来5
。
获得年代p一个n>一个><年代pan role="cross_prod">(万博1manbetx模型)年代p一个n>数学操作库,在仿真万博1manbetx软件
集<年代tr在g class="guilabel">获得年代tr在g>来[0;0;0;0;0;的(1)]
。
Integer-Output RS译码器年代p一个n>一个>
集<年代tr在g class="guilabel">码字长度N年代tr在g>来15
。
集<年代tr在g class="guilabel">消息长度K年代tr在g>来5
。
范围年代p一个n>一个><年代pan role="cross_prod">(万博1manbetx模型)年代p一个n>在仿真软件汇库。万博1manbetx两份这个块。
添加年代p一个n>一个><年代pan role="cross_prod">(万博1manbetx模型)年代p一个n>数学操作库,在仿真万博1manbetx软件
集<年代tr在g class="guilabel">符号列表年代tr在g>来| - +
连接块如前图所示。在<年代tr在g class="guimenuitem">模拟年代tr在g>选项卡,<年代tr在g class="guimenuitem">模拟年代tr在g>节中,设置<年代tr在g class="guilabel">停止时间年代tr在g>来500年
。的<年代tr在g class="guimenuitem">模拟年代tr在g>部分出现在多个选项卡。
你可以显示信号的矢量长度模型。在<年代tr在g class="guimenuitem">调试年代tr在g>选项卡,扩大<年代tr在g class="guimenuitem">信息覆盖年代tr在g>。在<年代tr在g class="guimenuitem">信号年代tr在g>部分中,选择<年代tr在g class="guimenuitem">信号的维度年代tr在g>。
编码器接受一个向量的长度5 K(在本例中),产生一个向量的长度15 N(在本例中)。译码器所做的恰恰相反。
运行模式产生以下范围的图像。绘制错误数会根据<年代tr在g class="guilabel">最初的种子年代tr在g>值随机整数生成器中使用的块。你可以调整轴范围精确匹配的第一个范围。右键单击图形区第二范围和选择<年代tr在g class="guimenuitem">配置属性年代tr在g>。在<年代tr在g class="guimenuitem">显示年代tr在g>选项卡中,调整轴的极限。
纠正之前的错误数量年代tr在g>
第二个情节是译码器检测到的错误数量在试图恢复消息。经常数是5,因为获得块取代了前五个符号在每个码字0。然而,错误的数量小于5时正确的码字包含一个或多个零在前五的地方。
第一个图是原始消息和恢复消息的区别;自从解码器能够纠正所有的错误发生,每五个数据流的情节是零。
年代ect我在><年代ection itemprop="content">虽然块编码子程序库比较统一的外观和感觉,各种编码技术是不相同的。本节描述特殊选项和限制适用于参数和信号的编码技术在这个子程序库类别。下面讨论编码技术包括通用的线性分组码,循环码、汉明码、BCH码,Reed-Solomon代码。
通用的线性分组码年代tr在g>
使用一个通用的线性分组码编码消息需要生成矩阵。解码代码可能需要生成矩阵和真值表。使用<一个href="//www.tianjin-qmedu.com/help/comm/ref/binarylinearencoder.html">二元线性编码器年代p一个n>一个>和<一个href="//www.tianjin-qmedu.com/help/comm/ref/binarylineardecoder.html">二元线性解码器年代p一个n>一个>块,你必须理解<年代tr在g class="guilabel">生成矩阵年代tr在g>和<年代tr在g class="guilabel">纠错真值表年代tr在g>参数。
<年代p一个nclass="emphasis">生成矩阵年代p一个n>——信息进行编码的过程变成一个(N, K)线性分组码是由K×N生成器矩阵<年代p一个nclass="emphasis">G年代p一个n>。具体来说,1-by-K消息向量<年代p一个nclass="emphasis">v年代p一个n>到1)×(n码字编码向量<年代p一个nclass="emphasis">vG年代p一个n>。如果<年代p一个nclass="emphasis">G年代p一个n>的形式(<年代p一个nclass="emphasis">我年代p一个n><年代ub>k年代ub>,<年代p一个nclass="emphasis">P年代p一个n>]或[<年代p一个nclass="emphasis">P年代p一个n>,<年代p一个nclass="emphasis">我年代p一个n><年代ub>k年代ub>),<年代p一个nclass="emphasis">P年代p一个n>是一些k×- (n - k)矩阵和<年代p一个nclass="emphasis">我年代p一个n><年代ub>k年代ub>是k×<年代p一个nclass="emphasis">- - - - - -年代p一个n>K单位矩阵,<年代p一个nclass="emphasis">G年代p一个n>据说在吗<年代p一个nclass="emphasis">标准形式年代p一个n>。(一些作家,如克拉克和凯恩<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">[2]一个>,使用第一个标准形式,而另一些人,比如林和科斯特洛<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">[3]一个>使用第二种)。这个产品需要的线性分块编码块<年代tr在g class="guilabel">生成矩阵年代tr在g>面具参数标准形式。
<年代p一个nclass="emphasis">译码表年代p一个n>讲述了一个译码器译码表如何纠正错误,可能在传输过程中损坏的代码。汉明码可以纠正任何single-symbol错误码字。其他代码可以纠正,或部分正确,错误,腐败的多个符号在一个给定的码字。
的<一个href="//www.tianjin-qmedu.com/help/comm/ref/binarylineardecoder.html">二元线性解码器年代p一个n>一个>块允许您指定一个表的解码<年代tr在g class="guilabel">纠错真值表年代tr在g>参数。译码表表示为一个矩阵N列和2<年代up>n - k年代up>行。每一行给出了校正矢量一收到的码字。
你可以避免显式地指定一个解码表,通过设置<年代tr在g class="guilabel">纠错真值表年代tr在g>参数0
。当<年代tr在g class="guilabel">纠错真值表年代tr在g>是0
,计算块译码表使用<一个href="//www.tianjin-qmedu.com/help/comm/ref/syndtable.html">syndtable
函数。
循环码年代tr在g>
循环码的码字长度N一定形式2<年代up>米年代up>1,M是一个整数大于或等于3。
<年代p一个nclass="emphasis">发电机多项式年代p一个n>循环码具有特殊的代数性质,允许一个多项式完全确定编码过程。这种所谓的发电机多项式是一个学位- (n - k)除数的多项式<年代p一个nclass="emphasis">x年代p一个n><年代up>N年代up>1。范线头<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">[5]一个>解释了一个发电机多项式确定循环代码。
的<一个href="//www.tianjin-qmedu.com/help/comm/ref/binarycyclicencoder.html">二进制循环编码器年代p一个n>一个>和<一个href="//www.tianjin-qmedu.com/help/comm/ref/binarycyclicdecoder.html">二进制循环译码器年代p一个n>一个>块允许您指定一个发电机多项式面具作为第二个参数,而不是明确的“K。块代表一个发电机多项式使用向量列表多项式的系数的顺序<年代p一个nclass="emphasis">提升年代p一个n>权力的变量。你可以找到发电机多项式对循环码使用<一个href="//www.tianjin-qmedu.com/help/comm/ref/cyclpoly.html">cyclpoly
函数。
如果你不想指定生成器多项式,设置第二个面具参数K的值。
汉明码年代tr在g>
汉明码,码字长度N一定形式2<年代up>米年代up>1,M是一个整数大于或等于3。消息长度K必须等于n - m。
<年代p一个nclass="emphasis">原始多项式年代p一个n>——汉明码依靠代数领域,2<年代up>米年代up>元素(或者,更普遍的是,<年代p一个nclass="emphasis">p年代p一个n><年代up>米年代up>元素的一个质数<年代p一个nclass="emphasis">p年代p一个n>)。等领域的元素命名<年代p一个nclass="emphasis">相对于年代p一个n>一位杰出的元素称为字段<年代p一个nclass="emphasis">原始的元素年代p一个n>。最小多项式的一种原始元素被称为<年代p一个nclass="emphasis">本原多项式年代p一个n>。的<一个href="//www.tianjin-qmedu.com/help/comm/ref/hammingencoder.html">汉明编码年代p一个n>一个>和<一个href="//www.tianjin-qmedu.com/help/comm/ref/hammingdecoder.html">汉明译码器年代p一个n>一个>块允许您指定一个本原多项式计算有限域,他们使用。如果你想指定这个多项式,在第二个面具参数字段。块代表一个本原多项式使用向量列表的系数多项式的顺序<年代p一个nclass="emphasis">提升年代p一个n>权力的变量。你可以找到发电机多项式对伽罗瓦领域使用<一个href="//www.tianjin-qmedu.com/help/comm/ref/gfprimfd.html">gfprimfd
函数。
如果你不想指定一个本原多项式,设置第二个面具参数K的值。
BCH码年代tr在g>
BCH码循环纠错码构造的使用有限的领域。对于这些代码,码字长度N一定形式2<年代up>米年代up>1,从3至9 M是一个整数。消息长度K仅限于特定的值依赖于N的值为给定的N, K是有效的<一个href="//www.tianjin-qmedu.com/help/comm/ref/comm.bchencoder-system-object.html">comm.BCHEncoder
系统对象™参考页面。没有任何已知的解析公式描述了码字长度之间的关系,消息长度和BCH码的纠错能力。
<年代tr在g class="emphasis bold">狭义BCH码年代tr在g>
狭义生成器多项式LCM [1 (x) m_2 (x)……m_2t (x)),地点:
中国大陆代表最小公倍数,
m_i (x)对应的最小多项式α<年代up>我年代up>α是一个默认的本原多项式的根域GF (n + 1
),
和t代表代码的纠错能力。
Reed-Solomon代码年代tr在g>
Reed-Solomon代码有助于纠正错误发生在爆发。在最简单的情况下,码字的长度在Reed-Solomon代码是N = 2的形式<年代up>米年代up>1,,2<年代up>米年代up>是符号的数量的代码。Reed-Solomon码的纠错能力地板((n - k) / 2)
,K是消息字的长度。n - k甚至必须的区别。
有时方便使用缩短Reed-Solomon N小于2的代码<年代up>米年代up>1。在这种情况下,编码器附加2<年代up>米年代up>其它零符号为每个消息词和码字。缩短Reed-Solomon码的纠错能力地板((n - k) / 2)
。通信工具箱Reed-Solomon块可以实现缩短Reed-Solomon代码。
<年代p一个nclass="emphasis">二进制符号的影响年代p一个n>——一个区别Reed-Solomon代码和其他代码支持这个产品是Reed-Solomon编码过程符号在GF (2万博1manbetx<年代up>米年代up>)而不是GF (2)。M位指定每个符号。Reed-Solomon代码符号的非自然原因Reed-Solomon块不同于其他编码块在这些方面:
您可以使用整数格式,通过<一个href="//www.tianjin-qmedu.com/help/comm/ref/integerinputrsencoder.html">整数输入RS编码器年代p一个n>一个>和<一个href="//www.tianjin-qmedu.com/help/comm/ref/integeroutputrsdecoder.html">Integer-Output RS译码器年代p一个n>一个>块。
二进制格式预计向量长度的整数倍数M * K (K)的消息和相同的整数M * N (N)码字。
错误信息年代p一个n>——Reed-Solomon解码块(<一个href="//www.tianjin-qmedu.com/help/comm/ref/binaryoutputrsdecoder.html">二进制输出RS译码器年代p一个n>一个>和<一个href="//www.tianjin-qmedu.com/help/comm/ref/integeroutputrsdecoder.html">Integer-Output RS译码器年代p一个n>一个>在模拟)返回错误信息。第二输出信号表示的错误块检测到输入码字。1在第二输出表明错误块检测到超过它可以正确使用编码方案。
年代ect我在><年代ection itemprop="content">许多标准利用戳破了编码和数字接收器可以很容易地输出“抹除”。BCH和RS性能大幅提高衰落信道接收机产生“抹除”。
一个<年代p一个nclass="emphasis">刺穿了码字的年代p一个n>只有平价符号删除,<年代p一个nclass="emphasis">缩短码字年代p一个n>只有信息符号删除。一个码字都可以有那些“抹除”的信息符号或平价符号。
<年代tr在g class="emphasis bold">里德所罗门与缩短例子,刺穿,“抹除”年代tr在g>
在本节中,一个代表性的例子,里德所罗门编码与缩短,刺穿,都是由增加的复杂性纠错。
<年代tr在g class="emphasis bold">编码器例子缩短和刺穿年代tr在g>
下面的图显示了一个代表性的例子(7,3)里德所罗门编码器缩短和刺穿。
在这个图中,消息源输出两个信息符号,我指定的<年代ub>1年代ub>我<年代ub>2年代ub>。(对于一个BCH的例子,这些符号二进制位。)因为代码是一个缩短(7,3)代码,必须添加一个零的信息符号,产生three-symbol消息(0)我<年代ub>1年代ub>我<年代ub>2年代ub>。修改后的消息序列RS编码,添加信息0然后删除,收益率(殖利率)我的结果<年代ub>1年代ub>我<年代ub>2年代ub>P<年代ub>1年代ub>P<年代ub>2年代ub>P<年代ub>3年代ub>P<年代ub>4年代ub>。(在这个例子中,奇偶校验位的码字)。
刺穿的操作是由穿刺向量,,在这种情况下,是1011。在穿刺向量,1
意味着保持象征,0
意味着符号是扔掉。在这个例子中,刺穿操作删除第二个平价符号,产生最后一个向量的我<年代ub>1年代ub>我<年代ub>2年代ub>P<年代ub>1年代ub>P<年代ub>3年代ub>P<年代ub>4年代ub>。
<年代tr在g class="emphasis bold">译码器的例子缩短和刺穿年代tr在g>
下图显示了缩短RS译码器如何操作,被刺穿的码字。
这种情况下对应的图中所示的编码器操作RS编码器缩短和刺穿。如前图所示,编码器接收(5,2)码字,因为它已经缩短从(7,3)码字通过一个符号,一个象征也被打破。
作为第一步,译码器添加一个擦除,E,指定的第二奇偶校验码字的位置。这对应于1011年穿刺向量。添加一个零占缩短,以同样的方式,如前图所示。一个擦除不超过erasure-correcting代码的能力,从而正确的四个“抹除”。DI three-symbol消息中解码操作的结果<年代ub>1年代ub>我<年代ub>2年代ub>。第一个符号是截断,在前面的图中,屈服我的最终输出<年代ub>1年代ub>我<年代ub>2年代ub>。
<年代tr在g class="emphasis bold">译码器与缩短例子,刺穿,“抹除”年代tr在g>
下面的图显示了译码器在穿刺操作,缩短码字,同时纠正接收机产生的“抹除”。
在这个图中,解调接收我<年代ub>1年代ub>我<年代ub>2年代ub>P<年代ub>1年代ub>P<年代ub>3年代ub>P<年代ub>4年代ub>向量编码器发送。解调器宣称5收到的两个符号是不可靠的足以抹去,这样符号2和5被认为是“抹除”。01001年的向量,由外部源提供,表明这些“抹除”。在“抹除”向量,1意味着是被替换为一个擦除的象征,象征和0意味着传递的象征。
解码器模块接收码字和擦除矢量,并执行“抹除”01001年向量表示。在“抹除”向量,1意味着是被替换为一个擦除的象征,象征和0意味着传递的象征。由此产生的码字向量是我<年代ub>1年代ub>EP<年代ub>1年代ub>P<年代ub>3年代ub>E, E是一个擦除的象征。
然后depunctured码字,根据穿刺向量(即用于编码操作。,1011)。因此,一个擦除符号之间插入P<年代ub>1年代ub>和P<年代ub>3年代ub>我的,产生一个码字向量<年代ub>1年代ub>EP<年代ub>1年代ub>EP<年代ub>3年代ub>E。
只是解码之前,开始时的零向量占缩短的信息。由此产生的向量是0<年代ub>1年代ub>EP<年代ub>1年代ub>EP<年代ub>3年代ub>E,这样一个(7,3)码字发送到Berlekamp算法。
这个码解码,收益率three-symbol DI的消息<年代ub>1年代ub>我<年代ub>2年代ub>(维指的是一个虚拟的符号)。最后,切除D象征从消息向量占缩短,收益率最初的我<年代ub>1年代ub>我<年代ub>2年代ub>向量。
有关更多信息,请参见<一个href="//www.tianjin-qmedu.com/help/comm/ref/comm.rsdecoder-system-object.html" class="a">Reed-Solomon编码与“抹除”,穿刺,缩短一个>米一个Tl一个B的例子或<一个href="//www.tianjin-qmedu.com/help/comm/ug/reed-solomon-coding-with-erasures-punctures-and-shortening.html" class="a">Reed-Solomon编码与“抹除”、穿刺和缩短仿真软件万博1manbetx一个>的例子。
年代ect我在><年代ection itemprop="content">打开一个例子在整数模型使用Reed-Solomon代码格式,类型doc_rscoding
在MATLAB命令行。关于模型的更多信息,请参阅<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">例如:Reed-Solomon整数格式的代码一个>
找到一个发电机多项式环,BCH,或Reed-Solomon代码,使用cyclpoly
,bchgenpoly
,或rsgenpoly
函数,分别。的命令
5)genpolyCyclic = cyclpoly(15日<年代p一个n年代tyle="color:#228B22">% 1 + X X ^ ^ 5 + 10年代p一个n>5)genpolyBCH = bchgenpoly(15日<年代p一个n年代tyle="color:#228B22">% x x ^ ^ 10 + 8 + x x ^ ^ 5 + 4 + x ^ 2 + x + 1年代p一个n>5)genpolyR年代=rsgenpoly(15日
寻找不同类型的分组码生成多项式。下面的输出。
genpolyCyclic = 1 0 0 0 0 1 0 0 0 0 1 genpolyBCH = GF(2)数组。数组元素= 1 0 1 0 0 1 1 0 1 1 1 genpolyRS = GF(2 ^ 4)数组。本原多项式= D ^ 4 + D + 1(十进制)19日数组元素= 1 4 8 10 12 9 4 2 12 2 7
这些输出的格式各不相同:
cyclpoly
使用一个整数代表一个发电机多项式行向量的顺序列出了多项式的系数<年代p一个nclass="emphasis">提升年代p一个n>权力的变量。
bchgenpoly
和rsgenpoly
代表一个发电机多项式使用伽罗瓦行向量的顺序列出了多项式的系数<年代p一个nclass="emphasis">下行年代p一个n>权力的变量。
rsgenpoly
使用系数在一个二进制字段之外的伽罗瓦域GF (2)。这些系数的含义的更多信息,参见<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">整数对应于伽罗瓦域元素如何一个>和<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">多项式对伽罗瓦字段一个>。
非唯一性的发电机多项式年代tr在g>
一些对消息长度和码字长度不唯一地确定发电机多项式。函数的语法上面的例子还包括选择检索发电机多项式满足您指定的某些约束。有关详细信息,请参阅函数的引用页关于语法的选择。
<年代tr在g class="emphasis bold">为发电机多项式代数表达式年代tr在g>
发电机产生的多项式bchgenpoly
和rsgenpoly
有表单(X -<年代up>b年代up>)(X -一个<年代up>b + 1年代up>)…(X- - - - - -一个<年代up>b + 2 t - 1年代up>),是一种原始元素为一个适当的伽罗瓦,和b和t是整数。看到函数的引用页关于这个表达式的更多信息。
本节描述函数,计算典型参数相关的线性分组码,以及功能将信息从一种格式到另一个地方。
线性分组码的纠错和错误检测年代tr在g>
您可以使用一个线性分组码来检测
如果你妥协的纠错功能的代码,你可以发现更多的比
找到纠错能力年代tr在g>
的bchgenpoly
和rsgenpoly
函数可以返回一个可选的第二个输出参数,指出了BCH纠错能力或Reed-Solomon代码。例如,命令
(g, t) = bchgenpoly(31日16);t t = 3
发现(31日16)BCH码在每个码字可以正确的三个错误。
发现发电机和奇偶校验矩阵年代tr在g>
找到一个奇偶校验和生成矩阵码字长度的汉明码2 ^ m - 1
,可以使用hammgen
函数如下。米
必须至少有三个。
[parmat, genmat] = hammgen (m);%汉明
找到一个奇偶校验和循环码的生成矩阵,使用cyclgen
函数。您必须提供码字的长度和一个有效的发电机多项式。您可以使用cyclpoly
多项式函数来产生一个可能的发电机后提供码字长度和消息长度。例如,
[parmat, genmat] = cyclgen (7, cyclpoly (7 4));<年代p一个n年代tyle="color:#228B22">%循环年代p一个n>
奇偶校验和发电机之间的转换矩阵年代tr在g>
的gen2par
函数发生器矩阵转换成一个奇偶校验矩阵,反之亦然。参考页面gen2par
包含的例子来说明这一点。
[1]Berlekamp、埃尔温R。
[2]克拉克,乔治·c·Jr .)和j .龙头该隐
[3]林、蜀和丹尼尔·j·科斯特洛。
[4]彼得森、w·韦斯利和e·j·韦尔登。
[5]van线头,j . H。
[6]柳条斯蒂芬·B。
[7]Gallager罗伯特·G。
瑞安[8],威廉·E。,“An introduction to LDPC codes,”
卷积编码的错误控制编码是一个特例。不像一块编码器,卷积编码器不是一个无记忆的设备。尽管卷积编码器接受一个固定数量的信息符号和产生一个固定数量的代码符号,计算不仅取决于当前的输入符号但在前面介绍过的一些符号。
通信工具箱提供了卷积编码功能仿真软件模块,系统对象和MATLAB函数。万博1manbetx本产品支持前馈和反馈卷积编万博1manbetx码可以被描述为框架结构或一组生成器多项式。它利用维特比算法来实现困难的决定和不痒的决定解码。
产品还包括一个<年代p一个nclass="emphasis">后验年代p一个n>概率译码器,可用于软输出卷积码的解码。
关于卷积编码的背景信息,请参阅作品中列出<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">选择卷积编码的参考书目一个>。
<年代tr在g class="emphasis bold">块卷积编码的参数年代tr在g>
卷积编码过程,使用<一个href="//www.tianjin-qmedu.com/help/comm/ref/convolutionalencoder.html">卷积编码器年代p一个n>一个>,<一个href="//www.tianjin-qmedu.com/help/comm/ref/viterbidecoder.html">维特比译码器年代p一个n>一个>和/或<一个href="//www.tianjin-qmedu.com/help/comm/ref/appdecoder.html">应用程序译码器年代p一个n>一个>块卷积子程序库。如果需要屏蔽参数编码器和解码器,使用两块相同的值。
卷积的块子程序库假设您使用卷积编码器的两种不同表示形式:
如果你设计编码器使用图表和移位寄存器和模2蛇,可以计算代码生成器多项式矩阵和随后使用<一个href="//www.tianjin-qmedu.com/help/comm/ref/poly2trellis.html">poly2trellis
在通信工具箱)函数(参数自动生成相应的格子结构面具。例如,看到的<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">使用仿真软件设计2/3速度前馈编码器万博1manbetx一个>。
如果你在设计你的编码器使用一个格子图,您可以在MATLAB构造格架结构和使用它作为掩模参数。
关于这些表示的更多信息,请参阅<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">多项式卷积编码的描述一个>和<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">格子卷积编码的描述一个>。
<年代tr在g class="emphasis bold">使用多项式描述的块年代tr在g>
使用多项式描述的<一个href="//www.tianjin-qmedu.com/help/comm/ref/convolutionalencoder.html">卷积编码器年代p一个n>一个>,<一个href="//www.tianjin-qmedu.com/help/comm/ref/viterbidecoder.html">维特比译码器年代p一个n>一个>,或<一个href="//www.tianjin-qmedu.com/help/comm/ref/appdecoder.html">应用程序译码器年代p一个n>一个>块,用效用函数<一个href="//www.tianjin-qmedu.com/help/comm/ref/poly2trellis.html">poly2trellis
从通讯工具。这个函数接受一个多项式描述并将其转换成格子描述。例如,下面的命令编码器的计算框架描述的约束长度是5和发电机的多项式都35和31:
格子= poly2trellis(5[35] 31日);
使用这个编码器的convolutional-coding块,简单的一个poly2trellis
命令,如
poly2trellis(5[35] 31日);
在<年代tr在g class="guilabel">框架结构年代tr在g>参数字段。
年代ect我在><年代ection itemprop="content">一个多项式描述卷积编码器的描述了移位寄存器之间的联系和模2条。举个例子,下面的图描绘了一个前馈卷积编码器有一个输入,两个输出,和两个移位寄存器。
卷积编码器的多项式描述两个或三个组件,取决于编码器是一种前馈和反馈:
约束长度。年代tr在g>约束长度的编码器组成一个向量的长度是编码器的输入图的数量。这个向量的元素显示存储在每个移位寄存器的比特数,<年代p一个nclass="emphasis">包括年代p一个n>当前输入比特。
在上图中,约束长度是3。是一个标量因为编码器有一个输入流,并将其值1 +输入移位寄存器的数量。
<年代tr在g id="fp7480">发电机多项式。年代tr在g>如果编码器图k n的输入和输出,代码生成器矩阵是一个k×n矩阵。在第i个元素行和j列表明第i个输入有助于第j输出。
为<年代p一个nclass="emphasis">系统的年代p一个n>系统反馈编码器,代码生成器中的条目匹配矩阵对应元素的反馈连接向量。看到<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">反馈连接多项式一个>下面的细节。
在其他情况下,您可以确定(i, j)进入矩阵如下:
通过将建立一个二进制数表示一个1在每个地方连接行移位寄存器提要加法器,和一个0。二进制数中的最左边的点代表当前的输入,而右边的点代表了最古老的仍在移位寄存器的输入。
这个二进制表示转换成一个八进制表示连续通过考虑三胞胎的位,从最右边的。最右边的每个三联体是最重要的。如果不是3的倍数的比特数,必要时零位在左端。(例如,解释1101010 001 101 010,把它转换成152。)
例如,相对应的二进制数上下蛇在上面的图是110年和111年,分别。这些二进制数相当于八进制数字6和7,分别,所以发电机多项式矩阵[6 7]。
请注意年代tr在g>
您可以执行在MATLAB binary-to-octal转换使用代码str2num (dec2base (bin2dec (“110”), 8))
。
表的一些好的卷积代码生成器,参考<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">[2]一个>一节中<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">选定的块编码的参考书目一个>,特别是那本书的附录。
<年代tr在g id="fp7500">反馈连接多项式。年代tr在g>如果你是代表一个反馈编码器,你需要一个向量的反馈连接多项式。这个向量的长度是编码器的输入图的数量。这个向量的元素显示为每个输入反馈连接,使用一个八进制格式。首先建立一个二进制数表示如上步骤1中。然后将二进制表示转换为八进制表示如上面的第2步。
如果编码器反馈配置和系统,代码生成器和反馈连接参数对应的系统必须有相同的价值观。
<年代p一个n我d="TrellisStructureFor12FeedbackConvolutionalEncoderExample" class="anchor_target">使用框架结构率1/2卷积编码器的反馈年代tr在g>
这个编码器5约束长度,33[37]作为发电机多项式矩阵,多项式和37的反馈联系。
第一个发电机多项式是八进制37。第二个发电机多项式是八进制33。反馈多项式八进制37。第一个发电机多项式与反馈连接多项式因为第一个输出对应于系统的比特。
(111)二进制向量表示八进制37,对应于二进制数字的上一行图。(1 1 0 1 1)二进制向量表示八进制33和对应于低排的二进制数字图。这些二进制数字显示连接的输出寄存器的两条图。最初的1对应的输入。
将多项式转换为使用的框架结构poly2trellis
函数。当使用一个反馈多项式,poly2trellis
使一个反馈连接到输入的格子。
格子= poly2trellis (5 [37 33] 37)
格子=<年代p一个nclass="emphasis">结构体字段:年代p一个n>numInputSymbols: 2 numOutputSymbols: 4 numStates: 16 nextStates: [16 x2双]输出:[16 x2双)
生成随机二进制数据。卷积编码数据通过使用指定的框架结构。解码编码数据通过使用指定的维特比算法框架结构,34岁的回溯深度,截断操作模式,艰难的决定。
data =兰迪([0,1],70,1);codedData = convenc(数据、格子);tbdepth = 34;<年代p一个n年代tyle="color:#228B22">%回溯深度维特比译码器年代p一个n>tbdepth解码D一个t一个= vitdec (codedData,格子,<年代p一个n年代tyle="color:#A020F0">“trunc”年代p一个n>,<年代p一个n年代tyle="color:#A020F0">“硬”年代p一个n>);
验证解码数据零错误。
decodedData biterr(数据)
ans = 0
在MATLAB中使用多项式描述。年代tr在g>使用多项式描述的功能convenc
和vitdec
首先把它变成格子描述使用poly2trellis
函数。例如,下面的命令编码器的计算框架描述图的部分<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">多项式卷积编码的描述一个>。
格子= poly2trellis (3、7 [6]);
米一个TLAB的结构格子
是一个合适的输入参数convenc
和vitdec
。
卷积编码器的框架描述了每个可能的编码器的输入如何影响输出和状态转换的编码器。本节描述棚<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">如何表示一个>在MATLAB格状结构,给出了一个<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">一个MATLAB格子的例子一个>。
下图描绘了一个格子的卷积编码器。编码器有四个州(从00到11以二进制编号),一比特的输入和低廉的输出。(输入位输出位的比例使得这个编码器rate-1/2编码器)。每个实心箭头显示了编码器改变其状态如果当前输入为零,并且每个虚线箭头显示了编码器状态如果当前的输入是一个变化。上面的八进制数字每个箭头指示当前编码器的输出。
作为一个例子解释这个格子图,如果编码器的10个州和接收一个输入为零,它输出代码符号3和01的变化状态。如果是在10个州和接收的输入,输出代码0和改变有11个州的象征。
请注意任何多项式描述的卷积编码器相当于一些格子描述,尽管一些棚没有相应的多项式描述。
<年代tr在g id="fp7623">在MATLAB中指定格子。年代tr在g>指定一个格子在MATLAB中,使用一个特定的MATLAB结构称为格子结构。一个格子结构必须有五个字段,如下表中。
字段的格子结构率k / n代码年代tr在g>
在框架结构 | 维 | 意义 |
---|---|---|
numInputSymbols |
标量 | 编码器的输入符号数量:2<年代up>k年代up> |
numOutputsymbols |
标量 | 编码器的输出符号数量:2<年代up>n年代up> |
numStates |
标量 | 许多州的编码器 |
nextStates |
numStates 2<年代up>k年代up>矩阵 | 下一个国家所有的当前状态和当前输入组合 |
输出 |
numStates 2<年代up>k年代up>矩阵 | 输出(八进制)的当前状态和当前输入组合 |
请注意年代tr在g>
当你的格子结构可以有任何名称,字段必须有<年代p一个nclass="emphasis">确切的年代p一个n>表中的名称。字段名称是区分大小写的。
在nextStates
矩阵,每个条目是一个整数0之间numStates
1。i行和第j列中的元素表示下一个状态时,张的起始状态和输入位小数表示j - 1。转换输入位十进制值,使用第一个输入一样最重要的一点(MSB)。例如,第二列的nextStates
矩阵存储下一个国家当当前的输入值集{0,0,1}。学习如何分配数字,看到页面的引用<一个href="//www.tianjin-qmedu.com/help/comm/ref/istrellis.html">istrellis
。
在输出
矩阵,i行和第j列中的元素表示编码器的输出,当张的起始状态和输入位小数表示j - 1。转换为十进制值,使用第一个输出位最高有效位。
<年代tr在g id="fp7674">如何创建一个MATLAB格子结构。年代tr在g>一旦你知道你想要什么信息放入每个字段,您可以创建一个框架结构在这些方面:
定义每个单独的五个领域,使用structurename.fieldname
符号。例如,设置第一个字段的结构年代
使用下面的命令。使用额外的命令定义其他字段。
年代。numInputSymbols = 2;
页面的引用<一个href="//www.tianjin-qmedu.com/help/comm/ref/istrellis.html">istrellis
函数说明了这种方法。
收集所有字段名和它们的值在一个结构体
命令。例如:
s =结构(“numInputSymbols”2“numOutputSymbols”, 2,…“numStates”2“nextStates”,[0 1; 0 1],“输出”,[0 0;1 1]);
开始一个多项式描述编码器和使用poly2trellis
函数将其转化为一个有效的框架结构。有关更多信息,请参见<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">多项式卷积编码的描述一个>。
检查是否你的结构是一个有效的框架结构,使用istrellis
函数。
<年代tr在g id="fp7691">例子:一个MATLAB格子结构。年代tr在g>考虑如下所示的格子。
建立一个框架结构,描述,使用下面的命令。
格子=结构(<年代p一个n年代tyle="color:#A020F0">“numInputSymbols”年代p一个n>2,<年代p一个n年代tyle="color:#A020F0">“numOutputSymbols”年代p一个n>4<年代p一个n年代tyle="color:#0000FF">…年代p一个n><年代p一个n年代tyle="color:#A020F0">“numStates”年代p一个n>4<年代p一个n年代tyle="color:#A020F0">“nextStates”年代p一个n>,(02;1 02;3,1 3],<年代p一个n年代tyle="color:#0000FF">…年代p一个n><年代p一个n年代tyle="color:#A020F0">“输出”年代p一个n>,(03;1 23 0;2 1]);
输入符号的数量是2,因为格子图有两种类型的输入路径:实心箭头,虚线箭头表示。输出符号的数量是4,因为箭头上方的数字可以是0,1,2,3。州的数量是4,因为有四个子弹格子图的左侧(右侧相当于4)。计算矩阵的下一个状态,创建一个矩阵的行对应的四个当前状态左边框架,它的列对应的输入0和1,最后的元素给下一个州的箭头右边的格子。计算矩阵的输出,创建一个矩阵的行和列,在接下来的状态矩阵,但其元素为八进制输出格子中的箭头所示。
年代ect我在><年代ection itemprop="content">编码和解码卷积码的功能convenc
和vitdec
。本节讨论使用这些函数来创建和解码卷积码。
<年代tr在g id="fp7755">编码。年代tr在g>一个简单的方法来使用convenc
创建一个卷积码如下所示的命令。
%定义一个格子。年代p一个n>3t= poly2trellis ([4], [4 5 17; 7 4 2]);<年代p一个n年代tyle="color:#228B22">%的编码向量。年代p一个n>x= 1(100 1);代码= convenc (x, t);
第一个命令前馈卷积编码器的多项式描述转换成相应的格子描述。第二个命令将100位编码,或50低廉的符号。因为这个示例中的代码率是2/3,输出向量代码
包含150位(即100输入位乘以3/2)。
检查是否你的格子对应于一个灾难性的卷积码,使用iscatastrophic
函数。
<年代tr在g id="fp7763">艰难的决定解码。年代tr在g>解码使用艰难的决定,使用vitdec
函数与国旗“硬”
和<年代p一个nclass="emphasis">二进制年代p一个n>输入数据。因为的输出convenc
是二进制,艰难的决定解码可以使用的输出convenc
直接,没有额外的处理。这个例子扩展前面的示例,并实现了艰难的决定解码。
定义<年代p一个n年代tyle="color:#A020F0">一个年代p一个n><年代p一个n年代tyle="color:#A020F0">格子。年代p一个n>3t= poly2trellis ([4], [4 5 17; 7 4 2]);编码<年代p一个n年代tyle="color:#A020F0">一个年代p一个n><年代p一个n年代tyle="color:#A020F0">向量年代p一个n><年代p一个n年代tyle="color:#A020F0">的年代p一个n><年代p一个n年代tyle="color:#A020F0">的人。年代p一个n>代码= convenc ((100 1), t);集<年代p一个n年代tyle="color:#A020F0">的年代p一个n><年代p一个n年代tyle="color:#A020F0">回溯年代p一个n><年代p一个n年代tyle="color:#A020F0">长度年代p一个n><年代p一个n年代tyle="color:#A020F0">为年代p一个n><年代p一个n年代tyle="color:#A020F0">解码年代p一个n><年代p一个n年代tyle="color:#A020F0">和年代p一个n><年代p一个n年代tyle="color:#A020F0">解码年代p一个n><年代p一个n年代tyle="color:#A020F0">使用年代p一个n><年代p一个n年代tyle="color:#A020F0">vitdec。年代p一个n>结核病= 2;解码= vitdec(代码,t,结核病,<年代p一个n年代tyle="color:#A020F0">“trunc”年代p一个n>,<年代p一个n年代tyle="color:#A020F0">“硬”年代p一个n>);验证<年代p一个n年代tyle="color:#A020F0">那年代p一个n><年代p一个n年代tyle="color:#A020F0">的年代p一个n><年代p一个n年代tyle="color:#A020F0">解码年代p一个n><年代p一个n年代tyle="color:#A020F0">数据年代p一个n><年代p一个n年代tyle="color:#A020F0">是年代p一个n><年代p一个n年代tyle="color:#A020F0">一个年代p一个n><年代p一个n年代tyle="color:#A020F0">向量年代p一个n><年代p一个n年代tyle="color:#A020F0">的年代p一个n><年代p一个n年代tyle="color:#A020F0">One hundred.年代p一个n><年代p一个n年代tyle="color:#A020F0">的人。年代p一个n>我年代e问ual(解码(100 1))
ans =逻辑1
不痒的决定解码。年代tr在g>使用软解码的决定,使用vitdec
函数与国旗“软”
。指定号码,nsdec
不痒的决定部分,使用输入0和之间的数据组成的整数2 ^ nsdec-1
。
0代表最自信的输入,而输入的2 ^ nsdec-1
1代表最自信。其他值代表缺乏自信的决定。例如,下表列出的解释值3-bit软决策。
输入值为3-bit软决策年代tr在g>
输入值 | 解释 |
---|---|
0 | 最自信的0 |
1 | 第二个最自信0 |
2 | 第三个最自信0 |
3 | 至少有信心0 |
4 | 至少有信心1 |
5 | 第三个最有信心1 |
6 | 第二个最有信心1 |
7 | 最有信心1 |
使用MATLAB实现不痒的决定解码年代tr在g>
下面的脚本说明与3-bit软解码的决定。首先,它创建了一个卷积码convenc
并添加高斯白噪声的代码情况下
。然后,准备不痒的决定解码,示例使用quantiz
将噪声数据值映射到适当的判定值整数0到7之间。第二个参数在quantiz
是一个分区向量确定哪些数据值映射到0,1,2,等。选择的分区,这样值附近0映射到0,和值接近1映射到7。(你可以细化分区来获得更好的解码性能如果应用程序需要它。)最后,解码的示例代码和计算比特误码率。比较与原始消息解码数据时,必须考虑到解码延迟的例子。的连续操作模式vitdec
导致延迟等于回溯长度,所以味精(1)
对应于解码(tblen + 1)
而不是解码(1)
。
s = RandStream.create (<年代p一个n年代tyle="color:#A020F0">“mt19937ar”年代p一个n>,<年代p一个n年代tyle="color:#A020F0">“种子”年代p一个n>,94384);prevStream = RandStream.setGlobalStream(年代);味精=兰迪([0,1],4000,1);<年代p一个n年代tyle="color:#228B22">%随机数据年代p一个n>t= poly2trellis (7 (171 133));<年代p一个n年代tyle="color:#228B22">%定义框架。年代p一个n><年代p一个n年代tyle="color:#228B22">%创建一个ConvolutionalEncoder系统对象年代p一个n>hC在vEnc= comm.ConvolutionalEncoder (t);<年代p一个n年代tyle="color:#228B22">%创建一个AWGNChannel系统对象。年代p一个n>hCh一个n=comm.AWGNChannel (<年代p一个n年代tyle="color:#A020F0">“NoiseMethod”年代p一个n>,<年代p一个n年代tyle="color:#A020F0">信号噪声比(信噪比)的年代p一个n>,<年代p一个n年代tyle="color:#0000FF">…年代p一个n><年代p一个n年代tyle="color:#A020F0">“信噪比”年代p一个n>6);<年代p一个n年代tyle="color:#228B22">%创建一个ViterbiDecoder系统对象年代p一个n>hVitDec = comm.ViterbiDecoder (t)<年代p一个n年代tyle="color:#A020F0">“InputFormat”年代p一个n>,<年代p一个n年代tyle="color:#A020F0">“软”年代p一个n>,<年代p一个n年代tyle="color:#0000FF">…年代p一个n><年代p一个n年代tyle="color:#A020F0">“SoftInputWordLength”年代p一个n>3,<年代p一个n年代tyle="color:#A020F0">“TracebackDepth”年代p一个n>现年48岁的<年代p一个n年代tyle="color:#0000FF">…年代p一个n><年代p一个n年代tyle="color:#A020F0">“TerminationMethod”年代p一个n>,<年代p一个n年代tyle="color:#A020F0">“连续”年代p一个n>);<年代p一个n年代tyle="color:#228B22">%创建一个ErrorRate计算器系统对象。考虑接受年代p一个n><年代p一个n年代tyle="color:#228B22">%延迟造成的回溯长度维特比译码器。年代p一个n>hErr或C一个lc = comm.ErrorRate (<年代p一个n年代tyle="color:#A020F0">“ReceiveDelay”年代p一个n>48岁);数量= 0 (3,1);<年代p一个n年代tyle="color:#228B22">%存储系统值年代p一个n>代码=步骤(hConvEnc、味精);<年代p一个n年代tyle="color:#228B22">%编码数据。年代p一个n>hCh一个n。年代我gnalPower = (code'*code)/length(code); ncode = step(hChan,code);<年代p一个n年代tyle="color:#228B22">%添加噪声。年代p一个n><年代p一个n年代tyle="color:#228B22">%数字转换准备不痒的决定解码。年代p一个n>问代码=quantiz(n代码 [0.001, 1, 3, 5, 7, 9, .999]);tblen = 48;延迟= tblen;<年代p一个n年代tyle="color:#228B22">%回溯长度年代p一个n>解码=步骤(hVitDec qcode);<年代p一个n年代tyle="color:#228B22">%解码。年代p一个n><年代p一个n年代tyle="color:#228B22">%计算比特误码率。年代p一个n>数量=步骤(hErrorCalc、味精、解码);比(1)数量= =误码率ber (2) RandStream.setGlobalStream (prevStream);
下面的输出。
数量= 5比率= 0.0013
实现不痒的决定解码使用<年代p一个nclass="trademark entity">万博1manbetx。年代tr在g>这个示例创建了一个1/2卷积码率。它使用一个量化器和维特比译码器块执行不痒的决定解码。打开模型,输入doc_softdecision
在MATLAB命令行。模型的描述,请参阅<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">仿真的概述一个>。
<年代tr在g class="emphasis bold">定义卷积码年代tr在g>
本例中的前馈卷积编码器如下图所示。
编码器的约束长度是一个标量编码器以来有一个输入。约束长度的值是存储在移位寄存器的比特数,包括当前的输入。有六个内存寄存器和当前的输入是一个比特。因此,约束长度的代码是7。
八进制数的代码生成器是一个1×2矩阵因为编码器有一个输入和两个输出。第一个元素的矩阵表示输入值为第一个输出,和第二个元素的矩阵表示输入值为第二个输出。
例如,第一个编码器的输出图的模2和图中最右边的和四个左边的元素输入值的数组。七位数的二进制数1111001捕捉这些信息,相当于171年八进制数。八进制数171因此成为第一个条目的代码生成器的矩阵。这里,每三个一组的使用最左边的点作为最重要的一点。第二个输出对应于二进制数1011011,相当于133年八进制数。因此代码生成器(171 133)。
的<年代tr在g class="guilabel">框架结构年代tr在g>卷积编码器的参数块告诉哪些代码在处理数据时使用。在这种情况下,<一个href="//www.tianjin-qmedu.com/help/comm/ref/poly2trellis.html">poly2trellis
在通信工具箱函数,将约束长度和一双八进制数字到一个有效的框架结构。
而进入卷积编码器的消息数据块是一个标量位流,离开的编码数据块是一连串的二进制向量长度为2。
<年代tr在g class="emphasis bold">将接收的数据映射年代tr在g>
接收的数据,即AWGN信道的输出块,包括复数,接近1和1。为了重建原始的二进制消息,接收者必须解码卷积模型的一部分代码。维特比译码器块在这个模型预计其输入数据之间的整数0和7。解调器,自定义子系统在这个模型中,将接收的数据转换成格式,维特比译码器块可以正确地解释。更具体地说,解调器子系统
将接收的数据信号转换为一个真正的信号通过删除其虚部。它是合理的假设的虚部接收的数据不包含重要信息,因为传输数据的虚部为零(忽略小舍入错误),由于信道噪声并不是很强大。
可实现接收的数据除以噪声估计的标准偏差,然后乘以1。
用三位数字转换规范化数据。
这种映射和维特比译码器块映射的决定逆转的BPSK调制BPSK调制基带块执行传输方面的这个模型。更详细地检查解调器子系统,双击图标标记Soft-Output BPSK解调。
<年代tr在g class="emphasis bold">解码卷积码年代tr在g>
接收的数据正确后映射到3-bit决策值的向量长度为2,维特比译码器块解码。2块使用不痒的决定算法<年代up>3年代up>因为不同的输入值<年代tr在g class="guilabel">决策类型年代tr在g>参数是软的决定
和<年代tr在g class="guilabel">数量的比特软决定年代tr在g>参数是3
。
<年代tr在g class="emphasis bold">不痒的决定的解释数据年代tr在g>
当<年代tr在g class="guilabel">决策类型年代tr在g>参数设置为软的决定
维特比译码器块需要输入值介于0和2<年代up>b年代up>1,<年代p一个nclass="emphasis">b年代p一个n>是<年代tr在g class="guilabel">数量的比特软决定年代tr在g>参数。块解释0作为最有信心决定码字位是0和解释2<年代up>b年代up>1是最自信的决定,码字是1。这两极之间的值代表缺乏自信的决定。下表列出了解释的八个可能的输入值的例子。
决定价值 | 解释 |
---|---|
0 | 最自信的0 |
1 | 第二个最自信0 |
2 | 第三个最自信0 |
3 | 至少有信心0 |
4 | 至少有信心1 |
5 | 第三个最有信心1 |
6 | 第二个最有信心1 |
7 | 最有信心1 |
回溯和解码延迟年代tr在g>
回溯深度影响解码延迟。解码延迟是零的数量符号之前第一个解码符号输出。
连续操作模式下,解码延迟等于回溯深度符号的数量。
截断或终止操作模式下,解码延迟是零。在这种情况下,回溯深度必须小于或等于符号在每个输入的数量。
回溯深度估计年代tr在g>
一般估计,一个典型的回溯深度值大约是两到三倍<年代p一个nclass="inlineequation">(格子
。numStates
)+ 1)年代p一个n>。的
1/2码率有回溯的深度<年代p一个nclass="inlineequation">5 (
2/3的代码有回溯深度<年代p一个nclass="inlineequation">7.5 (
3/4的代码有回溯深度<年代p一个nclass="inlineequation">10 (
率5/6的代码有一个回溯的深度<年代p一个nclass="inlineequation">15 (
的<年代tr在g class="guilabel">回溯深度年代tr在g>参数<一个href="//www.tianjin-qmedu.com/help/comm/ref/viterbidecoder.html">维特比译码器年代p一个n>一个>块代表解码延迟的长度。一些硬件实现提供选择48和96。本例中选择48因为这是接近的估计目标速度½代码约束长度为7。
<年代tr在g class="emphasis bold">延迟接收的数据年代tr在g>
的<年代tr在g class="guilabel">接收延迟年代tr在g>参数的<一个href="//www.tianjin-qmedu.com/help/comm/ref/errorratecalculation.html">出错率计算年代p一个n>一个>给定消息块零因为一点一点及其相应的恢复是分开的时间由一个非零的仿真时间。的<年代tr在g class="guilabel">接收延迟年代tr在g>参数告诉块元素的输入信号进行比较,检查错误。
在这种情况下,接收延迟值等于回溯深度值(48)。
<年代tr在g class="emphasis bold">仿真结果与理论结果进行比较年代tr在g>
本节描述如何比较的比特误码率仿真结果与理论上的比特误码率unquantized解码。这个过程包括以下步骤
计算比特误码率的理论界限年代tr在g>
计算比特误码率的理论界限<年代p一个nclass="emphasis">P年代p一个n><年代ub>b年代ub>的卷积码在这个模型中,您可以使用此估计基于unquantized-decision解码:
在这个估计,<年代p一个nclass="emphasis">c年代p一个n><年代ub>d年代ub>是一些错误的总和为错误事件的距离<年代p一个nclass="emphasis">d年代p一个n>,<年代p一个nclass="emphasis">f年代p一个n>是代码的自由距离。的数量<年代p一个nclass="emphasis">P年代p一个n><年代ub>d年代ub>成对错误概率,给出的
在哪里<年代p一个nclass="emphasis">R年代p一个n>1/2的编码速率,<一个href="//www.tianjin-qmedu.com/help/matlab/ref/erfc.html">误差补函数
MATLAB互补的误差函数,定义为
值系数<年代p一个nclass="emphasis">c年代p一个n><年代ub>d年代ub>和自由的距离<年代p一个nclass="emphasis">f年代p一个n>在发表的文章中如“最佳距离谱卷积码”<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">[3]一个>。这段代码的自由距离<年代p一个nclass="emphasis">f年代p一个n>= 10。
以下命令计算的值<年代p一个nclass="emphasis">P年代p一个n><年代ub>b年代ub>为<年代p一个nclass="emphasis">E年代p一个n><年代ub>b年代ub>/ N年代p一个n><年代ub>0年代ub>值的范围从1到4的增量0.5:
EbNoVec = [1:0.5:4.0];R = 1/2;<年代p一个n年代tyle="color:#228B22">%的向量是犯错误的错误年代p一个n><年代p一个n年代tyle="color:#228B22">%错误事件距离d, d从10 - 29。年代p一个n>错= [36 0 211 1404 11633 0 77433 502690 0,<年代p一个n年代tyle="color:#0000FF">…年代p一个n>3322763 21292910 0 21292910 0 3322763 0);<年代p一个n年代tyle="color:#228B22">% P矩阵的成对错误probilities,年代p一个n><年代p一个n年代tyle="color:#228B22">% Eb /不EbNoVec和d值10 - 29。年代p一个n>7P=0(20日);<年代p一个n年代tyle="color:#228B22">%初始化。年代p一个n><年代p一个n年代tyle="color:#0000FF">为年代p一个n>d= 29 P (d-9:) =(1/2) *误差补函数(sqrt (d * R * 10 ^ (EbNoVec / 10)));<年代p一个n年代tyle="color:#0000FF">结束年代p一个n><年代p一个n年代tyle="color:#228B22">%范围是上界的矢量位错误年代p一个n><年代p一个n年代tyle="color:#228B22">%,Eb / EbNoVec没有值。年代p一个n>边界=错* P;
模拟多次收集误比特率年代tr在g>
你可以有效地改变仿真参数使用<一个href="//www.tianjin-qmedu.com/help/simulink/slref/sim.html">sim卡
(万博1manbetx模型)年代p一个n>函数来模拟从MATLAB命令行运行。例如,下面的代码的比特误码率计算钻头energy-to-noise比例从1 dB 4 dB, 0.5 dB的增量。它会收集所有这些模拟的误比特率矩阵BERVec
。也块误比特率在图窗口以及理论计算在前面的代码片段。
请注意年代tr在g>
输入模型的模型doc_softdecision
在MATLAB命令行。然后执行这些命令,这可能需要几分钟。
%的阴谋理论界限和设置图。年代p一个n>图;semilogy (EbNoVec界限,<年代p一个n年代tyle="color:#A020F0">“波”年代p一个n>1南<年代p一个n年代tyle="color:#A020F0">的r *年代p一个n>);包含(<年代p一个n年代tyle="color:#A020F0">“Eb /不(dB)”年代p一个n>);ylabel (<年代p一个n年代tyle="color:#A020F0">的误比特率年代p一个n>);标题(<年代p一个n年代tyle="color:#A020F0">的误比特率(BER) '年代p一个n>);传奇(<年代p一个n年代tyle="color:#A020F0">理论一定误码率的年代p一个n>,<年代p一个n年代tyle="color:#A020F0">的实际数量年代p一个n>);轴([1 4 1 e-5 1]);持有<年代p一个n年代tyle="color:#A020F0">在年代p一个n>;BERVec = [];<年代p一个n年代tyle="color:#228B22">%的噪声级变量。年代p一个n>年代et_param (<年代p一个n年代tyle="color:#A020F0">doc_softdecision / AWGN信道的年代p一个n>,<年代p一个n年代tyle="color:#0000FF">…年代p一个n><年代p一个n年代tyle="color:#A020F0">“EsNodB”年代p一个n>,<年代p一个n年代tyle="color:#A020F0">“EbNodB + 10 * log10 (1/2)”年代p一个n>);<年代p一个n年代tyle="color:#228B22">%多次模拟。年代p一个n><年代p一个n年代tyle="color:#0000FF">为年代p一个n>n= 1:长度(EbNoVec) EbNodB = EbNoVec (n);sim卡(<年代p一个n年代tyle="color:#A020F0">“doc_softdecision”年代p一个n>,5000年000);:BERVec (n) = BER_Data;semilogy (EbNoVec (n), BERVec (n, 1),<年代p一个n年代tyle="color:#A020F0">的r *年代p一个n>);<年代p一个n年代tyle="color:#228B22">%的情节点。年代p一个n>dr一个wnow;<年代p一个n年代tyle="color:#0000FF">结束年代p一个n>持有<年代p一个n年代tyle="color:#A020F0">从年代p一个n>;
请注意年代tr在g>
的估计<年代p一个nclass="emphasis">P年代p一个n><年代ub>b年代ub>假设解码器使用unquantized数据,也就是说,一个无限细量化。相比之下,这个示例使用8度的仿真(3-bit)量化。由于这种量子化,模拟比特误码率并不完全一样低绑定时,信噪比高。
比特误码率与信噪比的情节。实际误码率点的位置可能不同,因为仿真包括随机数。
下面的例子使用了2/3速度前馈编码器中描述这个示意图。附带的描述解释如何确定框架结构参数从编码器的原理和如何使用这个编码器进行编码。
确定编码参数。年代tr在g>的convenc
和vitdec
函数可以执行这段代码如果它们的参数有适当的值。
编码器的约束长度是一个向量的长度2因为编码器有两个输入。这个向量的元素指示比特存储在每个移位寄存器的数量,包括当前输入比特。计算在每个图中移位寄存器和内存空间添加一个对当前输入导致约束长度的4 [5]。
确定代码生成器参数2×3矩阵的八进制数字,使用第i个行和j列中的元素来指示如何第i个输入有助于第j输出。例如,计算元素在第二行和第三列,最左边的和最右边的两个元素在第二个图的移位寄存器流入之和形成第三输出。获取这些信息的二进制数1011,相当于八进制数字13。代码生成器的全部价值矩阵[23 35 0;0 5 13]。
使用约束长度和代码生成器的参数convenc
和vitdec
功能,使用poly2trellis
函数将这些参数转换成一个框架结构。下面的命令就是。
灵(= poly2trellis (4 [5], [23 35 0, 0 5 13]);%定义框架。
<年代trong id="fp7936">使用编码器。年代tr在g>下面是一个脚本,该脚本使用这个编码器。
len = 1000;味精=兰迪([0,1],2 * len, 1);<年代p一个n年代tyle="color:#228B22">% 2比特符号的随机二进制消息年代p一个n>灵(= poly2trellis (4 [5], [23 35 0, 0 5 13]);<年代p一个n年代tyle="color:#228B22">%格子年代p一个n><年代p一个n年代tyle="color:#228B22">%创建一个ConvolutionalEncoder系统对象年代p一个n>hC在vEnc= comm.ConvolutionalEncoder(灵);<年代p一个n年代tyle="color:#228B22">%创建一个ViterbiDecoder系统对象年代p一个n>hVitDec = comm.ViterbiDecoder(灵,<年代p一个n年代tyle="color:#A020F0">“InputFormat”年代p一个n>,<年代p一个n年代tyle="color:#A020F0">“硬”年代p一个n>,<年代p一个n年代tyle="color:#0000FF">…年代p一个n><年代p一个n年代tyle="color:#A020F0">“TracebackDepth”年代p一个n>34岁的<年代p一个n年代tyle="color:#A020F0">“TerminationMethod”年代p一个n>,<年代p一个n年代tyle="color:#A020F0">“连续”年代p一个n>);<年代p一个n年代tyle="color:#228B22">%创建一个ErrorRate计算器系统对象。因为每个符号代表年代p一个n><年代p一个n年代tyle="color:#228B22">%两位,这个对象的接收延迟是回溯长度的两倍年代p一个n><年代p一个n年代tyle="color:#228B22">%的维特比译码器。年代p一个n>hErr或C一个lc = comm.ErrorRate (<年代p一个n年代tyle="color:#A020F0">“ReceiveDelay”年代p一个n>,68);数量= 0 (3,1);<年代p一个n年代tyle="color:#228B22">%存储系统值年代p一个n>代码=步骤(hConvEnc、味精);<年代p一个n年代tyle="color:#228B22">%对消息进行编码。年代p一个n>n代码=快速眼动(代码+ randerr (3 * len 1 0 1;。96 .04点),2);<年代p一个n年代tyle="color:#228B22">%添加噪声。年代p一个n>解码=步骤(hVitDec ncode);<年代p一个n年代tyle="color:#228B22">%解码。年代p一个n>数量=步骤(hErrorCalc、味精、解码);
convenc
接受一个向量包含2比特符号包含3-bit符号,并产生一个向量vitdec
相反的。还要注意,biterr
忽略了前68的元素解码
。解码延迟是68,这是每个符号的比特数(2)恢复消息的时间回溯深度值(34)vitdec
函数。第一个68的元素解码
是0,而随后的元素代表了解码信息。
这个示例使用2/3速度前馈卷积编码器描述如下图所示。描述解释如何确定编码块的参数从2/3速度前馈编码器的示意图。这个例子还说明了使用<一个href="//www.tianjin-qmedu.com/help/comm/ref/errorratecalculation.html">出错率计算年代p一个n>一个>块与接收延迟。
如何确定编码参数。年代tr在g>的<一个href="//www.tianjin-qmedu.com/help/comm/ref/convolutionalencoder.html">卷积编码器年代p一个n>一个>和<一个href="//www.tianjin-qmedu.com/help/comm/ref/viterbidecoder.html">维特比译码器年代p一个n>一个>可以实现这个代码块如果它们的参数有适当的值。
编码器的约束长度是一个向量的长度2自编码器有两个输入。这个向量的元素指示比特存储在每个移位寄存器的数量,包括当前输入比特。计算在每个图中移位寄存器和内存空间添加一个对当前输入导致约束长度的4 [5]。
确定代码生成器参数2×3矩阵的八进制数字,使用第i个行和j列中的元素来指示如何第i个输入有助于第j输出。例如,计算元素在第二行和第三列,注意最左边的和最右边的两个元素在第二个图的移位寄存器流入之和形成第三输出。获取这些信息的二进制数1011,相当于八进制数字13。代码生成器的全部价值矩阵[27 33 0;0 5 13]。
使用约束长度和代码生成器参数卷积编码器和维特比译码器块,使用poly2trellis
函数将这些参数转换成一个框架结构。
<年代tr在g id="fp74957">如何模拟编码器。年代tr在g>下面的模型模拟这个编码器。
打开模型,完成输入doc_convcoding
在MATLAB命令行。构建模型,收集和配置这些块:
集<年代tr在g class="guilabel">的概率为零年代tr在g>来。5
。
集<年代tr在g class="guilabel">最初的种子年代tr在g>任何正整数标量,最好的输出<一个href="//www.tianjin-qmedu.com/help/matlab/ref/randn.html">randn
函数。
集<年代tr在g class="guilabel">样品时间年代tr在g>来。5
。
检查<年代tr在g class="guilabel">不定位输出年代tr在g>复选框。
集<年代tr在g class="guilabel">样品每帧年代tr在g>来2
。
集<年代tr在g class="guilabel">框架结构年代tr在g>来poly2trellis (4 [5]、[23 35 0;0 5 13])
。
集<年代tr在g class="guilabel">误差概率年代tr在g>来0.02
。
集<年代tr在g class="guilabel">最初的种子年代tr在g>任何正整数标量,最好的输出<一个href="//www.tianjin-qmedu.com/help/matlab/ref/randn.html">randn
函数。
清除<年代tr在g class="guilabel">输出误差向量年代tr在g>复选框。
集<年代tr在g class="guilabel">框架结构年代tr在g>来poly2trellis (4 [5]、[23 35 0;0 5 13])
。
集<年代tr在g class="guilabel">决策类型年代tr在g>来艰难的决定
。
集<年代tr在g class="guilabel">接收延迟年代tr在g>来68年
。
集<年代tr在g class="guilabel">输出数据年代tr在g>来港口
。
检查<年代tr在g class="guilabel">停止仿真年代tr在g>复选框。
集<年代tr在g class="guilabel">目标数的错误年代tr在g>来One hundred.
。
显示年代p一个n>一个><年代pan role="cross_prod">(万博1manbetx模型)年代p一个n>在仿真软件汇库万博1manbetx
拖动底部边缘的图标显示足够大的3个条目。
连接块如前图所示。在<年代tr在g class="guimenuitem">模拟年代tr在g>选项卡,<年代tr在g class="guimenuitem">模拟年代tr在g>节中,设置<年代tr在g class="guilabel">停止时间年代tr在g>来正
。的<年代tr在g class="guimenuitem">模拟年代tr在g>部分出现在多个选项卡。
<年代tr在g id="fp74986">笔记模型。年代tr在g>你可以显示信号的矩阵大小模型。在<年代tr在g class="guimenuitem">调试年代tr在g>选项卡,扩大<年代tr在g class="guimenuitem">信息覆盖年代tr在g>。在<年代tr在g class="guimenuitem">信号年代tr在g>部分中,选择<年代tr在g class="guimenuitem">信号的维度年代tr在g>。
编码器接受一个2×1列向量并产生一个3×1列向量,而译码器的作用恰恰相反。的<年代tr在g class="guilabel">样品每帧年代tr在g>参数在伯努利二进制发电机块2,因为块必须生成一个消息长度2。
的<年代tr在g class="guilabel">接收延迟年代tr在g>参数在错误率的计算块是68,这是向量的长度(2)倍恢复消息<年代tr在g class="guilabel">回溯深度年代tr在g>维特比译码器块值(34)。如果你检查传输和接收信号矩阵的MATLAB工作区,你看到的第一个34行恢复消息包含0,而后续行解码消息。因此延迟接收到的信号是34向量长度2或68个样本。
运行三个数字组成的模型生成显示输出:错误率,错误的总数,总数的比较错误率在模拟计算块使。(前两个数字取决于你<年代tr在g class="guilabel">最初的种子年代tr在g>伯努利方程中的值二进制生成器和二进制对称信道块。)仿真100年后停止错误出现,因为<年代tr在g class="guilabel">目标数的错误年代tr在g>被设置为One hundred.
在误码率计算块。出错率远低于0.02
,<年代tr在g class="guilabel">误差概率年代tr在g>在二进制对称信道。
这个示例处理刺穿了卷积码的。它首先产生30000随机比特和编码使用rate-3/4卷积编码器的穿刺模式(1 1 1 0 0 1)。结果向量包含40000位,被映射到值1和1的传播。戳破了代码,punctcode
加性高斯白噪声,经过一个通道。然后vitdec
解码噪声向量使用“unquant”
决定类型。
最后,计算比特误码率和一些错误的数量。
len = 30000;味精=兰迪(len [0, 1], 1);<年代p一个n年代tyle="color:#228B22">%随机数据年代p一个n>t= poly2trellis (7 (133 171));<年代p一个n年代tyle="color:#228B22">%定义框架。年代p一个n><年代p一个n年代tyle="color:#228B22">%创建一个ConvolutionalEncoder系统对象年代p一个n>hC在vEnc= comm.ConvolutionalEncoder (t)<年代p一个n年代tyle="color:#0000FF">…年代p一个n><年代p一个n年代tyle="color:#A020F0">“PuncturePatternSource”年代p一个n>,<年代p一个n年代tyle="color:#A020F0">“属性”年代p一个n>,<年代p一个n年代tyle="color:#0000FF">…年代p一个n><年代p一个n年代tyle="color:#A020F0">“PuncturePattern”年代p一个n>,(1,1,1,0,0,1]);<年代p一个n年代tyle="color:#228B22">%创建一个AWGNChannel系统对象。年代p一个n>hCh一个n=comm.AWGNChannel (<年代p一个n年代tyle="color:#A020F0">“NoiseMethod”年代p一个n>,<年代p一个n年代tyle="color:#A020F0">信号噪声比(信噪比)的年代p一个n>,<年代p一个n年代tyle="color:#0000FF">…年代p一个n><年代p一个n年代tyle="color:#A020F0">“信噪比”年代p一个n>3);<年代p一个n年代tyle="color:#228B22">%创建一个ViterbiDecoder系统对象年代p一个n>hVitDec = comm.ViterbiDecoder (t)<年代p一个n年代tyle="color:#A020F0">“InputFormat”年代p一个n>,<年代p一个n年代tyle="color:#A020F0">“Unquantized”年代p一个n>,<年代p一个n年代tyle="color:#0000FF">…年代p一个n><年代p一个n年代tyle="color:#A020F0">“TracebackDepth”年代p一个n>,96,<年代p一个n年代tyle="color:#A020F0">“TerminationMethod”年代p一个n>,<年代p一个n年代tyle="color:#A020F0">“截断”年代p一个n>,<年代p一个n年代tyle="color:#0000FF">…年代p一个n><年代p一个n年代tyle="color:#A020F0">“PuncturePatternSource”年代p一个n>,<年代p一个n年代tyle="color:#A020F0">“属性”年代p一个n>,<年代p一个n年代tyle="color:#0000FF">…年代p一个n><年代p一个n年代tyle="color:#A020F0">“PuncturePattern”年代p一个n>,(1,1,1,0,0,1]);<年代p一个n年代tyle="color:#228B22">%创建一个ErrorRate计算器系统对象。年代p一个n>hErr或C一个lc = comm.ErrorRate;berP = 0 (3,1);berPE = berP;<年代p一个n年代tyle="color:#228B22">%存储系统值年代p一个n>punctcode =步骤(hConvEnc、味精);<年代p一个n年代tyle="color:#228B22">%长度(2 * len) * 2/3。年代p一个n>t代码= 1- - - - - -2* punctcode;<年代p一个n年代tyle="color:#228B22">%地图“0”位1和“1”位为1年代p一个n>hCh一个n。年代我gnalPower = (tcode'*tcode)/length(tcode); ncode = step(hChan,tcode);<年代p一个n年代tyle="color:#228B22">%添加噪声。年代p一个n><年代p一个n年代tyle="color:#228B22">%解码戳破了代码年代p一个n>解码=步骤(hVitDec ncode);<年代p一个n年代tyle="color:#228B22">%解码。年代p一个n>berP=步骤(hErrorCalc、味精、解码);<年代p一个n年代tyle="color:#228B22">%比特误码率年代p一个n><年代p一个n年代tyle="color:#228B22">%消除100年最可靠的符号,然后解码年代p一个n>释放(hVitDec);重置(hErrorCalc) hVitDec。ErasuresInputPort = true;[假idx] = (abs (ncode));“抹除”= 0(大小(ncode));“抹除”(idx (1:10 0)) = 1;解码=步骤(hVitDec ncode,檫除);<年代p一个n年代tyle="color:#228B22">%解码。年代p一个n>berPE=步骤(hErrorCalc、味精、解码);<年代p一个n年代tyle="color:#228B22">%比特误码率年代p一个n>流(<年代p一个n年代tyle="color:#A020F0">刺穿的错误:% d \ n '年代p一个n>berP(2))流(<年代p一个n年代tyle="color:#A020F0">“刺穿,“抹除”的错误:% d \ n”年代p一个n>berPE(2))
本节解释如何使用卷积编码器的块来实现系统编码器反馈。一个代码<年代p一个nclass="emphasis">系统的年代p一个n>如果实际的消息的话作为码字的一部分出现。下图显示了一个示例系统编码器。
实现这个编码器,设置<年代tr在g class="guilabel">框架结构年代tr在g>卷积编码器的参数块poly2trellis (5 [37 33] 37)
。此设置对应
约束长度:5
发电机多项式对:33 [37]
反馈多项式:37
反馈多项式表示的二进制向量(1 1 1 1 1),对应于二进制数字的上一行。这些数字表明连接加法器的输出寄存器。最初的1对应的输入。的八进制表示二进制数11111是37。
实现一个系统的代码,设置第一个发电机反馈多项式多项式是一样的<年代tr在g class="guilabel">框架结构年代tr在g>卷积编码器的参数块。在这个例子中,两个多项式的37个八进制表示。
第二个发电机多项式表示的二进制向量(1 1 0 1 1),对应于二进制数字的较低的行。八进制数对应的二进制数11011是33。
更多信息设置掩码卷积编码器的参数块,明白了<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">多项式卷积编码的描述一个>。
年代ect我在><年代ection itemprop="content">这个示例创建了一个1/2卷积码率。它使用一个量化器和维特比译码器块执行不痒的决定解码。这个描述涵盖了这些主题:
仿真的概述。年代tr在g>模型如下图所示。打开模型,输入doc_softdecision
在MATLAB命令行。模拟创建一个随机二进制消息信号,编码消息到一个卷积码,调节代码使用二进制相移键控(BPSK)技术,并添加高斯白噪声调制数据以模拟噪声信道。然后,模拟准备接收的数据解码,解码。最后,仿真比较了解码信息与原始消息信号来计算比特误码率。卷积编码器的配置为1/2编码器。每2位,编码器增加了另一个2冗余比特。为了适应这一点,并添加正确的数量的噪音,<年代tr在g class="guilabel">Eb /不(dB)年代tr在g>AWGN块的参数实际上是通过减去10 * log10(2)减半。仿真结束后,处理100位错误或10<年代up>7年代up>消息部分,以先到期者作准。
定义卷积码。年代tr在g>本例中的前馈卷积编码器如下图所示。
编码器的约束长度是一个标量编码器以来有一个输入。约束长度的值是存储在移位寄存器的比特数,包括当前的输入。有六个内存寄存器和当前的输入是一个比特。因此,约束长度的代码是7。
八进制数的代码生成器是一个1×2矩阵因为编码器有一个输入和两个输出。第一个元素的矩阵表示输入值为第一个输出,和第二个元素的矩阵表示输入值为第二个输出。
例如,第一个编码器的输出图的模2和图中最右边的和四个左边的元素输入值的数组。七位数的二进制数1111001捕捉这些信息,相当于171年八进制数。八进制数171因此成为第一个条目的代码生成器的矩阵。这里,每三个一组的使用最左边的点作为最重要的一点。第二个输出对应于二进制数1011011,相当于133年八进制数。因此代码生成器(171 133)。
的<年代tr在g class="guilabel">框架结构年代tr在g>卷积编码器的参数块告诉哪些代码在处理数据时使用。在这种情况下,<一个href="//www.tianjin-qmedu.com/help/comm/ref/poly2trellis.html">poly2trellis
在通信工具箱函数,将约束长度和一双八进制数字到一个有效的框架结构。
而进入卷积编码器的消息数据块是一个标量位流,离开的编码数据块是一连串的二进制向量长度为2。
<年代tr在g id="fp81912">将接收的数据映射。年代tr在g>接收的数据,即AWGN信道的输出块,包括复数,接近1和1。为了重建原始的二进制消息,接收者必须解码卷积模型的一部分代码。维特比译码器块在这个模型预计其输入数据之间的整数0和7。解调器,自定义子系统在这个模型中,将接收的数据转换成格式,维特比译码器块可以正确地解释。更具体地说,解调器子系统
将接收的数据信号转换为一个真正的信号通过删除其虚部。它是合理的假设的虚部接收的数据不包含重要信息,因为传输数据的虚部为零(忽略小舍入错误),由于信道噪声并不是很强大。
可实现接收的数据除以噪声估计的标准偏差,然后乘以1。
用三位数字转换规范化数据。
这种映射和维特比译码器块映射的决定逆转的BPSK调制BPSK调制基带块执行传输方面的这个模型。更详细地检查解调器子系统,双击图标标记Soft-Output BPSK解调。
<年代p一个n我d="decoding_convolutional_code" class="anchor_target">卷积码译码。年代tr在g>接收的数据正确后映射到3-bit决策值的向量长度为2,维特比译码器块解码。2块使用不痒的决定算法<年代up>3年代up>因为不同的输入值<年代tr在g class="guilabel">决策类型年代tr在g>参数是软的决定
和<年代tr在g class="guilabel">数量的比特软决定年代tr在g>参数是3
。
<年代tr在g class="emphasis bold">不痒的决定的解释数据年代tr在g>
当<年代tr在g class="guilabel">决策类型年代tr在g>参数设置为软的决定
维特比译码器块需要输入值介于0和2<年代up>b年代up>1,<年代p一个nclass="emphasis">b年代p一个n>是<年代tr在g class="guilabel">数量的比特软决定年代tr在g>参数。块解释0作为最有信心决定码字位是0和解释2<年代up>b年代up>1是最自信的决定,码字是1。这两极之间的值代表缺乏自信的决定。下表列出了解释的八个可能的输入值的例子。
决定价值 | 解释 |
---|---|
0 | 最自信的0 |
1 | 第二个最自信0 |
2 | 第三个最自信0 |
3 | 至少有信心0 |
4 | 至少有信心1 |
5 | 第三个最有信心1 |
6 | 第二个最有信心1 |
7 | 最有信心1 |
回溯和解码延迟年代tr在g>
的<年代tr在g class="guilabel">回溯深度年代tr在g>维特比译码器的参数块代表解码延迟的长度。典型值回溯深度约束长度大约五到六倍,这将是35或42在这个例子。然而,一些硬件实现提供48和96的选项。本例中选择48因为这是接近目标比96 (35 - 42)。
<年代tr在g id="fp82190">延迟接收的数据。年代tr在g>的<年代tr在g class="guilabel">接收延迟年代tr在g>参数的<一个href="//www.tianjin-qmedu.com/help/comm/ref/errorratecalculation.html">出错率计算年代p一个n>一个>给定消息块零因为一点一点及其相应的恢复是分开的时间由一个非零的仿真时间。的<年代tr在g class="guilabel">接收延迟年代tr在g>参数告诉块元素的输入信号进行比较,检查错误。
在这种情况下,接收延迟值等于回溯深度值(48)。
<年代tr在g id="fp82333">仿真结果与理论结果进行比较。年代tr在g>本节描述如何比较的比特误码率仿真结果与理论上的比特误码率unquantized解码。描述的过程包括几个步骤,在这些部分:
<年代tr在g class="emphasis bold">计算比特误码率的理论界限年代tr在g>
计算比特误码率的理论界限<年代p一个nclass="emphasis">P年代p一个n><年代ub>b年代ub>的卷积码在这个模型中,您可以使用此估计基于unquantized-decision解码:
在这个估计,<年代p一个nclass="emphasis">c年代p一个n><年代ub>d年代ub>是一些错误的总和为错误事件的距离<年代p一个nclass="emphasis">d年代p一个n>,<年代p一个nclass="emphasis">f年代p一个n>是代码的自由距离。的数量<年代p一个nclass="emphasis">P年代p一个n><年代ub>d年代ub>成对错误概率,给出的
在哪里<年代p一个nclass="emphasis">R年代p一个n>1/2的编码速率,<一个href="//www.tianjin-qmedu.com/help/matlab/ref/erfc.html">误差补函数
MATLAB互补的误差函数,定义为
值系数<年代p一个nclass="emphasis">c年代p一个n><年代ub>d年代ub>和自由的距离<年代p一个nclass="emphasis">f年代p一个n>在发表的文章中如“最佳距离谱卷积码”<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">[3]一个>。这段代码的自由距离<年代p一个nclass="emphasis">f年代p一个n>= 10。
以下命令计算的值<年代p一个nclass="emphasis">P年代p一个n><年代ub>b年代ub>为<年代p一个nclass="emphasis">E年代p一个n><年代ub>b年代ub>/ N年代p一个n><年代ub>0年代ub>值的范围从1到4的增量0.5:
EbNoVec = [1:0.5:4.0];R = 1/2;<年代p一个n年代tyle="color:#228B22">%的向量是犯错误的错误年代p一个n><年代p一个n年代tyle="color:#228B22">%错误事件距离d, d从10 - 29。年代p一个n>错= [36 0 211 1404 11633 0 77433 502690 0,<年代p一个n年代tyle="color:#0000FF">…年代p一个n>3322763 21292910 0 21292910 0 3322763 0);<年代p一个n年代tyle="color:#228B22">% P矩阵的成对错误probilities,年代p一个n><年代p一个n年代tyle="color:#228B22">% Eb /不EbNoVec和d值10 - 29。年代p一个n>7P=0(20日);<年代p一个n年代tyle="color:#228B22">%初始化。年代p一个n><年代p一个n年代tyle="color:#0000FF">为年代p一个n>d= 29 P (d-9:) =(1/2) *误差补函数(sqrt (d * R * 10 ^ (EbNoVec / 10)));<年代p一个n年代tyle="color:#0000FF">结束年代p一个n><年代p一个n年代tyle="color:#228B22">%范围是上界的矢量位错误年代p一个n><年代p一个n年代tyle="color:#228B22">%,Eb / EbNoVec没有值。年代p一个n>边界=错* P;
模拟多次收集误比特率年代tr在g>
你可以有效地改变仿真参数使用<一个href="//www.tianjin-qmedu.com/help/simulink/slref/sim.html">sim卡
(万博1manbetx模型)年代p一个n>函数来模拟从MATLAB命令行运行。例如,下面的代码的比特误码率计算钻头energy-to-noise比例从1 dB 4 dB, 0.5 dB的增量。它会收集所有这些模拟的误比特率矩阵BERVec
。也块误比特率在图窗口以及理论计算在前面的代码片段。
请注意年代tr在g>
打开模型,输入doc_softdecision
在MATLAB命令行。然后执行这些命令,这可能需要几分钟。
%的阴谋理论界限和设置图。年代p一个n>图;semilogy (EbNoVec界限,<年代p一个n年代tyle="color:#A020F0">“波”年代p一个n>1南<年代p一个n年代tyle="color:#A020F0">的r *年代p一个n>);包含(<年代p一个n年代tyle="color:#A020F0">“Eb /不(dB)”年代p一个n>);ylabel (<年代p一个n年代tyle="color:#A020F0">的误比特率年代p一个n>);标题(<年代p一个n年代tyle="color:#A020F0">的误比特率(BER) '年代p一个n>);传奇(<年代p一个n年代tyle="color:#A020F0">理论一定误码率的年代p一个n>,<年代p一个n年代tyle="color:#A020F0">的实际数量年代p一个n>);轴([1 4 1 e-5 1]);持有<年代p一个n年代tyle="color:#A020F0">在年代p一个n>;BERVec = [];<年代p一个n年代tyle="color:#228B22">%的噪声级变量。年代p一个n>年代et_param (<年代p一个n年代tyle="color:#A020F0">doc_softdecision / AWGN信道的年代p一个n>,<年代p一个n年代tyle="color:#0000FF">…年代p一个n><年代p一个n年代tyle="color:#A020F0">“EsNodB”年代p一个n>,<年代p一个n年代tyle="color:#A020F0">“EbNodB + 10 * log10 (1/2)”年代p一个n>);<年代p一个n年代tyle="color:#228B22">%多次模拟。年代p一个n><年代p一个n年代tyle="color:#0000FF">为年代p一个n>n= 1:长度(EbNoVec) EbNodB = EbNoVec (n);sim卡(<年代p一个n年代tyle="color:#A020F0">“doc_softdecision”年代p一个n>,5000年000);:BERVec (n) = BER_Data;semilogy (EbNoVec (n), BERVec (n, 1),<年代p一个n年代tyle="color:#A020F0">的r *年代p一个n>);<年代p一个n年代tyle="color:#228B22">%的情节点。年代p一个n>dr一个wnow;<年代p一个n年代tyle="color:#0000FF">结束年代p一个n>持有<年代p一个n年代tyle="color:#A020F0">从年代p一个n>;
请注意年代tr在g>
的估计<年代p一个nclass="emphasis">P年代p一个n><年代ub>b年代ub>假设解码器使用unquantized数据,也就是说,一个无限细量化。相比之下,这个示例使用8度的仿真(3-bit)量化。由于这种量子化,模拟比特误码率并不完全一样低绑定时,信噪比高。
比特误码率与信噪比的情节。实际误码率点的位置可能不同,因为仿真包括随机数。
这个例子演示了Tailbiting使用反馈编码器编码。编码器反馈,结束状态取决于整个数据块。完成tailbiting,必须计算给定信息向量(N比特),初始状态,导致相同的数据块编码后结束状态。
这是实现两个步骤:
第一步是确定零状态响应给定的数据块。编码器在全0开始。整个数据块输入和输出部分被忽略。N比特后,编码器状态
第二步是实际的编码。编码器从初始状态开始
请参考[8]的理论计算初始状态
打开模型,输入doc_mtailbiting_wfeedback
在MATLAB命令行。
函数mapStValues = getMapping (blkLen格子)%的函数返回映射值给定的块长度和格子用于确定零状态响应的初始状态。%的所有可能的组合映射mapStValuesTab =烫发(0:trellis.numStates-1);%循环遍历所有的组合映射条目:i = 1:长度(mapStValuesTab) mapStValues = mapStValuesTab(我:);%的模型参数化块长度sim (“mtailbiting_wfeedback”);为每个运行% %检查边界条件如果结束和开始匹配,选择映射设置如果独特()= = 0返回最终结束
选择返回的mapStValues
为<年代tr在g class="guilabel">表数据年代tr在g>参数的直接查找表(一天)
块选择的查询子系统将执行tailbiting编码块长度和格子。
[1]克拉克,乔治·c·Jr .)和j .龙头该隐
[2]Gitlin,理查德·D。,Jeremiah F. Hayes, and Stephen B. Weinstein,
[3]<年代p一个n>Frenger, P。,P。Orten, and T. Ottosson. “Convolutional Codes with Optimum Distance Spectrum.”
循环、汉明和通用线性分组码的功能在这个产品提供了多种方式来组织消息或码字比特。这些主题解释可用的格式:
学习如何代表对BCH或Reed-Solomon代码,看看<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">代表对BCH码一个>或<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">代表对Reed-Solomon代码一个>。
<年代tr在g id="fp6764">使用MATLAB来创建消息和二元矢量格式的码字。年代tr在g>你的消息和码字可以包含0和1的向量形式。例如,消息和代码的样子味精
和代码
在下面的行中。
n = 6;k = 4;<年代p一个n年代tyle="color:#228B22">%设置码字长度和消息长度年代p一个n><年代p一个n年代tyle="color:#228B22">%(6,4)代码。年代p一个n>味精= [1 0 0 1 1 0 1 0 1 0 1 1]';<年代p一个n年代tyle="color:#228B22">%的消息是一个二进制列。年代p一个n>代码=编码(味精,n, k,<年代p一个n年代tyle="color:#A020F0">“循环”年代p一个n>);<年代p一个n年代tyle="color:#228B22">%将二进制代码列。年代p一个n>味精的代码
下面的输出。
答1到5 1 0 0 1 1 =列列6到10 0 1 0 1 0列11到12 1 1 ans =列1到5 1 1 1 0 0列6到10 1 0 0 1 0列11通过15 1 0 0 1 1列16 18 0 1 1
在这个例子中,味精
由12个条目,解释为三个4位(因为k
= 4)消息。由此产生的向量代码
由三个6位(因为n
= 6)码字,连接形成一个向量的长度18。奇偶校验位是每个码字的开头。
<年代tr在g id="fp6791">使用MATLAB来创建消息和二进制矩阵格式的码字。年代tr在g>你可以组织编码信息,强调数字的分组成消息和码字。如果您使用这种方法,每个消息或在一个二进制矩阵码字占一行。下面的例子说明了这种方法的清单每4比特消息在不同的行味精
和每个6-bit码字在不同的行代码
。
n = 6;k = 4;<年代p一个n年代tyle="color:#228B22">%设置码字长度和消息长度。年代p一个n>味精= [1 0 0 1;1 0 1 0;1 0 1 1];<年代p一个n年代tyle="color:#228B22">%的消息是一个二进制矩阵。年代p一个n>代码=编码(味精,n, k,<年代p一个n年代tyle="color:#A020F0">“循环”年代p一个n>);<年代p一个n年代tyle="color:#228B22">%的代码将一个二进制矩阵。年代p一个n>味精的代码
下面的输出。
味精= 1 0 0 1 1 0 1 0 1 0 1 1代码= 1 1 1 0 0 1 0 0 1 0 1 0 0 1 1 0 1 1
请注意年代tr在g>
在二进制矩阵格式,必须有信息矩阵k
列。矩阵有相应的代码n
列。奇偶校验位是每一行的开头。
<年代trong id="fp6814">使用MATLAB来创建消息和十进制矢量格式的码字。年代tr在g>你的消息和码字可以包含整数向量的形式。每个元素的向量给出了位的十进制表示在一个信息或一个码字。
请注意年代tr在g>
如果2 ^ n
或2 ^ k
是非常大的,你应该使用默认的二进制格式而不是十进制格式。这是因为在内部函数使用一个二进制格式,而舍入误差与转换相关的许多位小数和回可能是实质性的。
请注意年代tr在g>
当你使用十进制矢量格式,编码
预计,<年代p一个nclass="emphasis">最左边的年代p一个n>的最低有效位。
的语法编码
命令必须明确的提到这个十进制格式,如以下示例。请注意,/十进制
是附加到第四个参数编码
命令。
n = 6;k = 4;<年代p一个n年代tyle="color:#228B22">%设置码字长度和消息长度。年代p一个n>味精= (9、5、13);<年代p一个n年代tyle="color:#228B22">%消息是一个小数列向量。年代p一个n><年代p一个n年代tyle="color:#228B22">%代码将一个十进制向量。年代p一个n>代码=编码(味精,n, k,<年代p一个n年代tyle="color:#A020F0">“循环/十进制”年代p一个n>)
下面的输出。
代码= 39 20 54
请注意年代tr在g>
上面的三个例子中使用循环编码。消息的格式和汉明编码是相似的和通用的线性分组码。
本节描述了项目,您可能需要为了过程(n, k)循环,汉明,通用的线性分组码。下表列出了项目和它们最相关的编码技术。
在块编码技术中使用的参数年代tr在g>
参数 | 块编码技术 |
---|---|
生成矩阵一个> | 通用的线性分组 |
奇偶校验矩阵一个> | 通用的线性分组 |
发电机多项式一个> | 循环 |
在MATLAB中使用译码表一个> | 通用的线性分组,汉明 |
生成矩阵。年代tr在g>编码信息的过程变成一个(n, k)线性分组码是由一个k×n生成矩阵g .专门1-by-k消息向量v到1)×(n码字编码向量vG。如果G(我的形式<年代ub>k年代ub>P]或[P I<年代ub>k年代ub>],P是k×- (n - k)矩阵和我<年代ub>k年代ub>是单位矩阵k×k,据说G<年代p一个nclass="emphasis">标准形式年代p一个n>。(一些作家,例如,克拉克和凯恩<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">[2]一个>,使用第一个标准形式,而另一些人,例如,林和科斯特洛<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">[3]一个>使用第二种)。大部分功能在这个工具箱假设生成矩阵是标准形式,当你使用它作为输入参数。
发电机的一些示例矩阵是在下一节中,<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">奇偶校验矩阵一个>。
<年代tr在g id="fp6894">奇偶校验矩阵。年代tr在g>解码一个(n, k)线性分组码需要一个(n - k)×n的奇偶校验矩阵h .它满足GH<年代up>tr年代up>2 = 0 (mod), H<年代up>tr年代up>表示矩阵的转置H G代码的生成矩阵,这零矩阵k×- (n - k)。如果G =我<年代ub>k年代ub>P]然后H = (- P<年代up>tr年代up>我<年代ub>n - k年代ub>]。大部分功能在这个产品在标准形式假定一个奇偶校验矩阵是当你使用它作为输入参数。
下表总结了发电机和奇偶校验矩阵的标准形式为(n, k)二进制线性分组码。
类型的矩阵 | 标准形式 | 维 |
---|---|---|
发电机 | (我<年代ub>k年代ub>P]或[P I<年代ub>k年代ub>] | k×n |
奇偶校验 | (- - - - - -- - - - - - - - - -p” 我<年代ub>n - k年代ub>]或[我<年代ub>n - k年代ub>- p” ] | (n- - - - - - - - - - -k)×n |
我<年代ub>k年代ub>单位矩阵k和大小”
符号表示矩阵的转置。(<年代p一个nclass="emphasis">二进制年代p一个n>代码,上面列出的奇偶校验表单中的负号是无关紧要的;也就是说,1 = 1的二进制字段。)
<年代tr在g class="emphasis bold">例子年代tr在g>
下面的命令parmat
是奇偶校验矩阵和genmat
是一个汉明码的生成矩阵[n, k] = [2<年代up>3年代up>1,n - 3] = [7, 4]。genmat
有标准形式(P I<年代ub>k年代ub>]。
[parmat, genmat] = hammgen (3) parmat = 1 0 0 1 0 1 1 0 1 0 1 1 1 0 0 0 1 0 1 1 1 genmat = 1 1 0 1 0 0 0 0 1 1 0 1 0 0 1 1 1 0 0 1 0 1 0 1 0 0 0 1)
下一个示例发现奇偶校验矩阵和发电机(7,3)循环码。的cyclpoly
函数是下面提到<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">发电机多项式一个>。
genpoly = cyclpoly (7,3);[parmat, genmat] = cyclgen (7, genpoly) parmat = 1 0 0 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 1 1 1 0 0 0 1 1 0 1 genmat = 1 0 1 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1
下面的例子将[5 3]的生成矩阵线性分组码成相应的奇偶校验矩阵。
genmat = [1 0 0 1 0;0 1 0 1 1;0 0 1 0 1];parmat = gen2par (genmat) parmat = 1 1 0 1 0 0 1 1 0 1
相同的功能gen2par
也可以一个奇偶校验矩阵转化为发电机矩阵。
<年代tr在g id="fp6968">发电机多项式。年代tr在g>循环码具有代数性质,允许一个多项式完全确定编码过程。这种所谓的<年代p一个nclass="emphasis">发电机多项式年代p一个n>是一个学位x - (n - k)除数的多项式<年代up>n年代up>1。范线头<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">[5]一个>解释了一个发电机多项式确定循环代码。
的cyclpoly
多项式函数发生器产生的循环代码。cyclpoly
代表了一种发电机多项式使用一个行向量,列出了多项式的系数的顺序<年代p一个nclass="emphasis">提升年代p一个n>权力的变量。例如,命令
genpoly = cyclpoly (7,3) genpoly = 1 0 1 1 1
发现一个有效的发电机多项式(7,3)循环码是1 + x<年代up>2年代up>+ x<年代up>3年代up>+ x<年代up>4年代up>。
<年代p一个n我d="UseDecodingTableInMATLABExample" class="anchor_target">在MATLAB中使用译码表年代tr在g>
关系操作符年代tr在g>——设置<年代tr在g class="guilabel">关系操作符年代tr在g>来~ =
块的对话框。关系操作符的块传输信号相比,来自伯努利随机发生器,与接收到的信号,来自汉明解码器。块输出0两个信号时同意和1当他们不同意。
观察频道错误的范围年代tr在g>
当您运行模型,显示错误的数据范围。每5000年底的时间步骤,出现如图所示,这个数字范围。然后清理范围显示数据和显示未来5000数据点。
上面显示生成频道错误的范围<一个href="//www.tianjin-qmedu.com/help/comm/ref/binarysymmetricchannel.html">二进制对称信道年代p一个n>一个>块。较低的范围显示了信道编码可以纠正错误。
单击<年代tr在g class="guibutton">停止年代tr在g>工具栏上的按钮顶部的模型窗口范围。
你可以看到个人错误放大范围。第一次点击中间的放大镜按钮的左上角<年代p一个nclass="block">范围年代p一个n>窗口。然后单击其中一个在较低的范围。这个缩放水平在直线上。继续单击行低范围直到横坐标是好的足以检测单个错误。一个典型的例子,你可能看到的是如下图所示。
更广泛的矩形脉冲的上层代表两个,1,s,范围。这两个错误,这发生在一个码字,不纠正。这占未改正的错误在较低的范围内。右边的窄矩形脉冲的范围是一个错误,这是纠正。
当你完成观察错误,选择<年代tr在g class="guimenuitem">模拟年代tr在g>><年代tr在g class="guimenuitem">停止年代tr在g>。
<一个href="//www.tianjin-qmedu.com/help/comm/ug/export-data-to-matlab.html" class="a">导出数据到MATLAB一个>解释如何将错误数据发送到MATLAB工作区进行更详细的分析。
年代ect我在>的消息(n
,k
)BCH码必须是k
二进制伽罗瓦列字段数组。消息是一个对应的代码n
二进制伽罗瓦列字段数组。伽罗瓦域数组的每一行表示一个词。
下面的例子说明了如何代表单词(15、11)BCH码。
味精= [1 0 0 1 0;1 0 1 1 1];<年代p一个n年代tyle="color:#228B22">%的消息在伽罗瓦数组年代p一个n>obj = comm.BCHEncoder;c1 =步骤(obj,味精(:1)');c2 =步骤(obj,味精(2:)');cbch = (c1, c2)。”
输出是
列1到5 1 0 0 1 0 1 0 1 1 1列6到10 0 0 1 1 1 0 0 0 0 1列11到15 1 0 1 0 1 0 1 0 0 1
BCH码使用特殊的值n
和k
:
n
、码字的长度是2的整数形式<年代up>米年代up>1整数m > 2。
k
消息长度,是一个正整数比n
。然而,只有一些正整数比n
是有效的选择k
。看到<一个href="//www.tianjin-qmedu.com/help/comm/ref/bchencoder.html">BCH编码年代p一个n>一个>块参考页面的有效值列表k
对应的值n
到511。
的BCH编码
和BCH译码器
系统对象创建和解码BCH编码,使用中描述的数据<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">代表对BCH码一个>和<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">参数BCH码一个>。
的主题是
例如:BCH编码语法。年代tr在g>下面的例子演示了如何使用一个编码和解码数据(15、5)BCH码。
n = 15;k = 5;<年代p一个n年代tyle="color:#228B22">%码字长度和消息长度年代p一个n>味精=兰迪([0,1],4 * k, 1);<年代p一个n年代tyle="color:#228B22">% 4个随机二进制消息年代p一个n><年代p一个n年代tyle="color:#228B22">%的简单语法编码年代p一个n>内附= comm.BCHEncoder (n、k);12月= comm.BCHDecoder (n、k);c1 =步骤(enc,味精);<年代p一个n年代tyle="color:#228B22">% BCH编码年代p一个n>d1=步骤(12月,c1);<年代p一个n年代tyle="color:#228B22">% BCH译码年代p一个n><年代p一个n年代tyle="color:#228B22">%检查正确解码工作。年代p一个n>嗯= isequal (d1、味精)<年代p一个n年代tyle="color:#228B22">%以下代码展示了如何执行编码和解码年代p一个n><年代p一个n年代tyle="color:#228B22">%如果选择预谋平价符号的操作。年代p一个n><年代p一个n年代tyle="color:#228B22">%的步骤与附加平价符号转换编码的数据年代p一个n><年代p一个n年代tyle="color:#228B22">%与前缀平价符号编码的数据年代p一个n>c11=重塑(c1, n, []);c12 = circshift (c11、n - k);c1_prepend = c12 (:);<年代p一个n年代tyle="color:#228B22">与前缀平价符号% BCH编码数据年代p一个n><年代p一个n年代tyle="color:#228B22">%的步骤与前缀平价符号转换编码的数据年代p一个n><年代p一个n年代tyle="color:#228B22">%与附加平价符号编码的数据解码之前年代p一个n>c21=重塑(c1_prepend n []);c22 = circshift (c21 k);c1_append = c22 (:);<年代p一个n年代tyle="color:#228B22">与附加平价符号% BCH编码数据年代p一个n><年代p一个n年代tyle="color:#228B22">%检查prepend-to-append正确转换工作。年代p一个n>d1_append =步骤(12月,c1_append);嗯= isequal(味精,d1_append)
下面的输出。
嗯= 1
<年代trong id="fp9909">检测和纠正错误使用MATLAB在BCH码。年代tr在g>下面的例子说明了损坏的解码结果代码。对一些数据进行编码的例子中,引入了错误在每个码字,并试图解码吵闹的代码使用BCH译码器
系统对象。
n = 15;k = 5;<年代p一个n年代tyle="color:#228B22">%码字长度和消息长度年代p一个n>(gp, t) = bchgenpoly (n, k);<年代p一个n年代tyle="color:#228B22">% t是纠错能力。年代p一个n>西北= 4;<年代p一个n年代tyle="color:#228B22">%的单词数量的过程年代p一个n>米年代gw =兰迪([0,1],nw * k, 1);<年代p一个n年代tyle="color:#228B22">%随机k-symbol消息年代p一个n>内附= comm.BCHEncoder (n, k, gp);12月= comm.BCHDecoder (n, k, gp);c =步骤(enc, msgw);<年代p一个n年代tyle="color:#228B22">%编码数据。年代p一个n>噪音= randerr (nw, n, t);<年代p一个n年代tyle="color:#228B22">% t错误每码字年代p一个n>嘈杂的=噪音';嘈杂的=吵(:);cnoisy = mod (c +吵闹,2);<年代p一个n年代tyle="color:#228B22">%向代码添加噪声。年代p一个n>(直流,nerrs) =(12月,cnoisy)步;<年代p一个n年代tyle="color:#228B22">% cnoisy解码。年代p一个n><年代p一个n年代tyle="color:#228B22">%检查正确解码工作。年代p一个n>相关= isequal nerrs(直流,msgw)<年代p一个n年代tyle="color:#228B22">%找出多少错误得到纠正。年代p一个n>
请注意,噪声值的数组包含二进制值,和添加操作c +噪声
发生在伽罗瓦域GF(2)因为c
是伽罗瓦域GF(2)数组。
下面的输出示例。的非零值答
表明,解码器能够纠正的密语,恢复原始消息。中的值向量nerrs
显示译码器纠正t
在每个码字的错误。
相关= 1 nerrs = 3 3 3 3
<年代trong class="emphasis bold">过量的噪音在BCH码字年代tr在g>
在前面的例子中,BCH译码器
系统对象纠正所有的错误。然而,每个BCH码纠错能力都是有限的。想要了解更多关于如何BCH译码器
系统对象的行为过度的噪音时,看到Reed-Solomon代码的类似的讨论<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">过量的噪音在Reed-Solomon密语一个>。
<年代tr在g id="bru6khb">概述。年代tr在g>错误解码算法用于BCH和RS编码可以被下面的步骤(部分5.3.2,5.4和5.6<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">[2]一个>)。
计算第一个2
如果这两个
如果一个或多个方面<年代p一个nclass="inlineequation">
非零,计算定位误差多项式,Λ(
评估者多项式计算错误,<年代p一个nclass="inlineequation"> 通过
在码字根据纠正一个错误
在哪里<年代p一个nclass="inlineequation">
是错误的大小<年代p一个nclass="inlineequation">
在码字的位置,
进一步的描述在以下部分中给出的几个步骤。
<年代tr在g id="bru6kku">综合症的计算。年代tr在g>狭义上的代码,2
定位误差多项式计算。年代tr在g>定位误差多项式,Λ(
我们定义以下变量。
变量 | 描述 |
---|---|
n | 迭代器变量 |
k | 迭代器变量 |
l | 长度的反馈登记用于生成第一个2 |
D( | 修正多项式 |
d | 差异 |
下图显示了迭代过程(即。Berlekamp算法)用于查找Λ(
评估者多项式计算错误。年代tr在g>错误多项式求值程序,<年代p一个nclass="inlineequation">
只是Λ的卷积(
这个工具箱支持Reed-S万博1manbetxolomon代码使用位符号而不是比特。的消息(n
,k
]Reed-Solomon代码必须是k
列的伽罗瓦域数组字段GF (2<年代up>米年代up>)。每个数组条目必须是一个整数0和2之间<年代up>米年代up>1。对应的代码,是一个消息n
列伽罗瓦域GF(2数组<年代up>米年代up>)。码字的长度n
3和2之间必须<年代up>米年代up>1。
请注意年代tr在g>
伽罗瓦的信息字段数组和如何创建它们,看到的<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">伽罗瓦的代表元素的领域一个>或参考页面<一个href="//www.tianjin-qmedu.com/help/comm/ref/gf.html">女朋友
函数。
下面的例子说明了如何代表单词的[7,3]Reed-Solomon代码。
n = 7;k = 3;<年代p一个n年代tyle="color:#228B22">%码字长度和消息长度年代p一个n>米=3;<年代p一个n年代tyle="color:#228B22">在每个符号%的比特数年代p一个n>味精= [1 6 4;0 4 3];<年代p一个n年代tyle="color:#228B22">%消息是伽罗瓦数组。年代p一个n>obj = comm.RSEncoder (n、k);c1 =步骤(obj,味精(:1)');c2 =步骤(obj,味精(2:)');c = (c1, c2)。”
输出是
C = 1 6 4 4 3 6 3 0 4 3 3 7 4 7
本节描述几个整数Reed-Solomon代码和相关讨论如何找到<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">发电机多项式一个>。
<年代tr在g id="fp12172">许用值的整数参数。年代tr在g>下表总结了一些正整数的含义和许用值数量相关Reed-Solomon代码支持工具箱。万博1manbetx的数量n
和k
在这个工具箱Reed-Solomon函数的输入参数。
象征 | 意义 | 值或范围 |
---|---|---|
米 | 每个符号的比特数 | 整数3至16 |
n |
每个码字的符号数 | 3和2之间的整数<年代up>米年代up>1 |
k |
每个消息的符号 | 正整数不到n ,这样n - k 甚至 |
t | 代码的纠错能力 | (n - k) / 2 |
发电机多项式。年代tr在g>的rsgenpoly
函数发生器产生多项式Reed-Solomon代码。rsgenpoly
代表了一种发电机多项式使用伽罗瓦行向量的顺序列出了多项式的系数<年代p一个nclass="emphasis">下行年代p一个n>权力的变量。如果每个符号有m比特,伽罗瓦行向量域GF (2<年代up>米年代up>)。例如,命令
r = rsgenpoly(15日,13)
r = GF(2 ^ 4)数组。本原多项式= D ^ 4 + D + 1(十进制)19日数组元素= 1 6 8
发现一个发电机多项式[15、13]Reed-Solomon代码是X<年代up>2年代up>+ (<年代up>2年代up>+ X + (A<年代up>3年代up>),一个是默认的本原多项式的根GF (16)。
<年代tr在g class="emphasis bold">为发电机多项式代数表达式年代tr在g>
的生成多项式rsgenpoly
生产形式(X -<年代up>b年代up>)(X -一个<年代up>b + 1年代up>)…(X- - - - - -一个<年代up>b + 2 t - 1年代up>),b是一个整数,一个是伽罗瓦的本原多项式的根,和t(n - k) / 2
。b的默认值是1。的输出rsgenpoly
是相乘的结果的因素和收集的x以下示例检查这个公式的情况下(15、13)Reed-Solomon代码,使用b = 1。
n = 15;= gf (2, log2 (n + 1));<年代p一个n年代tyle="color:#228B22">%本原多项式的根年代p一个n>f1=(1];f2 = [1 ^ 2];<年代p一个n年代tyle="color:#228B22">%发电机多项式形式的因素年代p一个n>f=conv(f1、f2)<年代p一个n年代tyle="color:#228B22">%发电机多项式,r上面一样。年代p一个n>
的RS编码器
和RS译码器
系统对象创建和解码Reed-Solomon代码,使用中描述的数据<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">代表对Reed-Solomon代码一个>和<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">参数Reed-Solomon代码一个>。
本节说明如何使用RS编码器
和RS译码器
系统对象。的主题是
在MATLAB Reed-Solomon编码语法。年代tr在g>下面的例子演示了多种方法来编码和解码数据使用[15、13]Reed-Solomon代码。这个例子表明,你可以
改变发电机多项式的代码,使用rsgenpoly
产生不同的发电机多项式。
不同的本原多项式伽罗瓦域包含符号,使用一个输入参数女朋友
。
不同码字中的奇偶校验符号的位置,选择结束(默认)或开始。
这个示例还显示相应的语法RS编码器
和RS译码器
系统对象使用相同的输入参数,除了第一个输入参数。
m = 4;<年代p一个n年代tyle="color:#228B22">在每个符号%的比特数年代p一个n>n= 2^米- - - - - -1;k = 13;<年代p一个n年代tyle="color:#228B22">%码字长度和消息长度年代p一个n>味精=兰迪([0 m - 1], 4 * k, 1);<年代p一个n年代tyle="color:#228B22">% 4个随机整数的消息年代p一个n><年代p一个n年代tyle="color:#228B22">%的简单语法编码年代p一个n>hEnc=comm.RSEncoder (n、k);hDec = comm.RSDecoder (n、k);c1 =步骤(hEnc、味精);d1 =步骤(hDec, c1);<年代p一个n年代tyle="color:#228B22">%不同代码生成器多项式。年代p一个n>(hEnc)发布,(hDec) hEnc发布。GeneratorPolynomialSource =<年代p一个n年代tyle="color:#A020F0">“属性”年代p一个n>;hDec。Gener一个t或PolynomialSource =<年代p一个n年代tyle="color:#A020F0">“属性”年代p一个n>;hEnc。Gener一个t或Polynomial = rsgenpoly(n,k,19,2); hDec.GeneratorPolynomial = rsgenpoly(n,k,19,2); c2 = step(hEnc, msg); d2 = step(hDec, c2);<年代p一个n年代tyle="color:#228B22">%不同GF(16)的本原多项式。年代p一个n>(hEnc)发布,(hDec) hEnc发布。PrimitivePolynomialSource =<年代p一个n年代tyle="color:#A020F0">“属性”年代p一个n>;hDec。Pr我米我t我vePolynomialSource =<年代p一个n年代tyle="color:#A020F0">“属性”年代p一个n>;hEnc。Gener一个t或PolynomialSource =<年代p一个n年代tyle="color:#A020F0">“汽车”年代p一个n>;hDec。Gener一个t或PolynomialSource =<年代p一个n年代tyle="color:#A020F0">“汽车”年代p一个n>;hEnc。Pr我米我t我vePolynomial = [1 1 0 0 1]; hDec.PrimitivePolynomial = [1 1 0 0 1]; c3 = step(hEnc, msg); d3 = step(hDec, c3);<年代p一个n年代tyle="color:#228B22">%检查正确解码工作。年代p一个n>嗯= isequal (d1、味精)& isequal (d2,味精)& isequal (d3、味精)<年代p一个n年代tyle="color:#228B22">%以下代码展示了如何执行编码和解码年代p一个n><年代p一个n年代tyle="color:#228B22">%如果选择预谋平价符号的操作。年代p一个n><年代p一个n年代tyle="color:#228B22">%的步骤与附加平价符号转换编码的数据年代p一个n><年代p一个n年代tyle="color:#228B22">%与前缀平价符号编码的数据年代p一个n>c31=重塑(c3 n []);c32 = circshift (c31, n - k);c3_prepend = c32 (:);<年代p一个n年代tyle="color:#228B22">与前缀平价符号% RS编码的数据年代p一个n><年代p一个n年代tyle="color:#228B22">%的步骤与前缀平价符号转换编码的数据年代p一个n><年代p一个n年代tyle="color:#228B22">%与附加平价符号编码的数据解码之前年代p一个n>c34=重塑(c3_prepend n []);c35 = circshift (c34 k);c3_append = c35 (:);<年代p一个n年代tyle="color:#228B22">与附加平价符号% RS编码的数据年代p一个n><年代p一个n年代tyle="color:#228B22">%检查prepend-to-append正确转换工作。年代p一个n>d3_append =步骤(hDec c3_append);嗯= isequal(味精,d3_append)
输出是
嗯= 1
<年代trong id="fp12290">检测和纠正错误使用MATLAB Reed-Solomon代码。年代tr在g>下面的例子说明了一个损坏的解码结果代码。对一些数据进行编码的例子中,引入了错误在每个码字,并试图解码吵闹的代码使用RS译码器
系统对象。
m = 3;<年代p一个n年代tyle="color:#228B22">%每个符号的比特数年代p一个n>n= 2^米- - - - - -1;k = 3;<年代p一个n年代tyle="color:#228B22">%码字长度和消息长度年代p一个n>t= (n- - - - - -k)/ 2;<年代p一个n年代tyle="color:#228B22">%纠错功能的代码年代p一个n>西北= 4;<年代p一个n年代tyle="color:#228B22">%的单词数量的过程年代p一个n>米年代gw =兰迪([0 n], nw * k, 1);<年代p一个n年代tyle="color:#228B22">%随机k-symbol消息年代p一个n>hEnc=comm.RSEncoder (n、k);hDec = comm.RSDecoder (n、k);c =步骤(hEnc msgw);<年代p一个n年代tyle="color:#228B22">%编码数据。年代p一个n>噪音=(1 +兰迪([0 n - 1], nw, n))。* randerr (nw, n, t);<年代p一个n年代tyle="color:#228B22">% t错误每码字年代p一个n>嘈杂的=噪音';嘈杂的=吵(:);cnoisy = gf (c m) +噪声;<年代p一个n年代tyle="color:#228B22">%向代码添加噪声gf (m)算术。年代p一个n>(直流nerrs) = (hDec cnoisy.x)步;<年代p一个n年代tyle="color:#228B22">%解码吵闹的代码。年代p一个n><年代p一个n年代tyle="color:#228B22">%检查正确解码工作。年代p一个n>我年代e问ual nerrs(直流,msgw)<年代p一个n年代tyle="color:#228B22">%找出多少hDec纠正错误。年代p一个n>
噪音值的数组包含1和之间的整数2 ^ m
,添加操作c +噪声
发生在伽罗瓦域GF (2 ^ m
),因为c
是女朋友的伽罗瓦域数组(2 ^ m
)。
下面的输出示例。的非零值答
表明,解码器能够纠正的密语,恢复原始消息。中的值向量nerrs
表明该译码器纠正t
在每个码字的错误。
ans = 1
nerrs = 2 2 2 2
<年代trong id="fp12319">过量的噪音在Reed-Solomon密语。年代tr在g>在前面的例子中,RS编码器
系统对象纠正所有的错误。然而,每个Reed-Solomon代码有一个有限的纠错能力。如果噪音很大,损坏码字的汉明距离太远是正确的码字,这意味着
接近有效码字的码字<年代p一个nclass="emphasis">除了年代p一个n>正确的码字。译码器返回的信息对应于另一个码字。
损坏的码字不是足够接近任何成功的解码码字。这种情况被称为<年代p一个nclass="emphasis">解码失败年代p一个n>。译码器删除损坏的符号在平价位置码字并返回剩余的符号。
在这两种情况下,译码器返回错误信息。然而,当解码失败是因为你可以告诉RS译码器
系统对象返回一个值1
在其第二个输出。
检查情况下,码字太嘈杂的成功解码,改变之前的例子,这样的定义噪音
是
噪音=(1 +兰迪([0 n - 1], nw, n))。* randerr (nw n t + 1);<年代p一个n年代tyle="color:#228B22">% t + 1错误/行年代p一个n>
创建缩短Reed-Solomon代码。年代tr在g>每个Reed-Solomon编码器使用码字长度等于2<年代up>米年代up>1整数m。缩短Reed-Solomon代码是一个码字的长度不是2<年代up>米年代up>1。缩短(n
,k
隐式地使用一个[n] Reed-Solomon代码<年代ub>1年代ub>k<年代ub>1年代ub>)编码器,
n<年代ub>1年代ub>= 2<年代up>米年代up>- 1,m是每个符号位的数量
k<年代ub>1年代ub>= k + (n<年代ub>1年代ub>- n)
的RS编码器
系统对象支持缩短代码使用相同万博1manbetx的语法使用nonshortened代码。你不需要明确地表明你想用缩短代码。
hEnc = comm.RSEncoder (7, 5);ordinarycode =步骤(hEnc [1 1 1 1 1) ');hEnc = comm.RSEncoder (5,3);shortenedcode =步骤(hEnc (1 1 1) ');
<年代trong class="emphasis bold">如何年代tr在g>RS编码器年代tr在g>
系统对象创建一个短代码年代tr在g>
在创建代码,缩短了RS编码器
系统对象执行这些步骤:
垫每条消息通过将为零
编码每个填充消息使用Reed-Solomon编码器有许用码字长度和所需的纠错能力
删除多余的零从nonparity每个码字的符号
下面的例子说明了这个过程。
n = 12;k = 8;<年代p一个n年代tyle="color:#228B22">%缩短代码的长度年代p一个n>米=装天花板(log2 (n + 1));<年代p一个n年代tyle="color:#228B22">%每个符号的比特数年代p一个n>味精=兰迪([0 2 ^ m - 1), 3 * k, 1);<年代p一个n年代tyle="color:#228B22">%的随机阵列3 k-symbol的话年代p一个n>hEnc=comm.RSEncoder (n、k);代码=步骤(hEnc、味精);<年代p一个n年代tyle="color:#228B22">%创建一个短代码。年代p一个n><年代p一个n年代tyle="color:#228B22">%的手动缩短,为了显示它是如何工作的。年代p一个n>n_pad = 2 ^ m - 1;<年代p一个n年代tyle="color:#228B22">%码字长度在实际的编码器年代p一个n>k_pad = k + (n_pad-n);<年代p一个n年代tyle="color:#228B22">% Messageword长度在实际的编码器年代p一个n>hEnc=comm.RSEncoder (n_pad k_pad);mw =重塑(味精、k、[]);<年代p一个n年代tyle="color:#228B22">%每个列向量代表一个messageword年代p一个n>米年代g_pad = [0 (n_pad-n 3);mw);<年代p一个n年代tyle="color:#228B22">%预谋0每个单词。年代p一个n>米年代g_pad = msg_pad (:);code_pad =步骤(hEnc msg_pad);<年代p一个n年代tyle="color:#228B22">%编码的字。年代p一个n>连续波=重塑(code_pad 2 ^ m - 1, []);<年代p一个n年代tyle="color:#228B22">%每个列向量代表一个码字年代p一个n>code_eqv = cw (n_pad-n + 1: n_pad:);<年代p一个n年代tyle="color:#228B22">%去除多余的零。年代p一个n>code_eqv = code_eqv (:);ck = isequal (code_eqv、代码);<年代p一个n年代tyle="color:#228B22">%返回true (1)。年代p一个n>
找到一个发电机多项式环,BCH,或Reed-Solomon代码,使用cyclpoly
,bchgenpoly
,或rsgenpoly
函数,分别。的命令
5)genpolyCyclic = cyclpoly(15日<年代p一个n年代tyle="color:#228B22">% 1 + X X ^ ^ 5 + 10年代p一个n>5)genpolyBCH = bchgenpoly(15日<年代p一个n年代tyle="color:#228B22">% x x ^ ^ 10 + 8 + x x ^ ^ 5 + 4 + x ^ 2 + x + 1年代p一个n>5)genpolyR年代=rsgenpoly(15日
寻找不同类型的分组码生成多项式。下面的输出。
genpolyCyclic = 1 0 0 0 0 1 0 0 0 0 1 genpolyBCH = GF(2)数组。数组元素= 1 0 1 0 0 1 1 0 1 1 1 genpolyRS = GF(2 ^ 4)数组。本原多项式= D ^ 4 + D + 1(十进制)19日数组元素= 1 4 8 10 12 9 4 2 12 2 7
这些输出的格式各不相同:
cyclpoly
使用一个整数代表一个发电机多项式行向量的顺序列出了多项式的系数<年代p一个nclass="emphasis">提升年代p一个n>权力的变量。
bchgenpoly
和rsgenpoly
代表一个发电机多项式使用伽罗瓦行向量的顺序列出了多项式的系数<年代p一个nclass="emphasis">下行年代p一个n>权力的变量。
rsgenpoly
使用系数在一个二进制字段之外的伽罗瓦域GF (2)。这些系数的含义的更多信息,参见<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">整数对应于伽罗瓦域元素如何一个>和<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">多项式对伽罗瓦字段一个>。
发电机多项式的非唯一性。年代tr在g>一些对消息长度和码字长度不唯一地确定发电机多项式。函数的语法上面的例子还包括选择检索发电机多项式满足您指定的某些约束。有关详细信息,请参阅函数的引用页关于语法的选择。
<年代tr在g id="bsx_pq7-3">为发电机多项式代数表达式。年代tr在g>发电机产生的多项式bchgenpoly
和rsgenpoly
有表单(X -<年代up>b年代up>)(X -一个<年代up>b + 1年代up>)…(X- - - - - -一个<年代up>b + 2 t - 1年代up>),是一种原始元素为一个适当的伽罗瓦,和b和t是整数。看到函数的引用页关于这个表达式的更多信息。
在本节中,一个代表性的例子,里德所罗门编码与缩短,刺穿,都是由增加的复杂性纠错。
<年代tr在g id="bsx_oxo">编码器例子缩短和刺穿。年代tr在g>下面的图显示了一个代表性的例子(7,3)里德所罗门编码器缩短和刺穿。
在这个图中,消息源输出两个信息符号,我指定的<年代ub>1年代ub>我<年代ub>2年代ub>。(BCH的例子中,符号只是二进制位。)因为代码是一个缩短(7,3)代码,必须添加一个零的信息符号,产生three-symbol消息(0)我<年代ub>1年代ub>我<年代ub>2年代ub>。修改的消息序列然后RS编码,添加信息零随后被删除,收益率(殖利率)我的结果<年代ub>1年代ub>我<年代ub>2年代ub>P<年代ub>1年代ub>P<年代ub>2年代ub>P<年代ub>3年代ub>P<年代ub>4年代ub>。(在这个例子中,奇偶校验位的码字)。
刺穿的操作是由穿刺向量,,在这种情况下,是1011。在穿刺向量,保持1意味着象征,0意味着象征扔掉。在这个例子中,刺穿操作删除第二个平价符号,产生最后一个向量的我<年代ub>1年代ub>我<年代ub>2年代ub>P<年代ub>1年代ub>P<年代ub>3年代ub>P<年代ub>4年代ub>。
<年代tr在g id="brdgf1t">译码器的例子缩短和刺穿。年代tr在g>下图显示了RS编码器如何作用于一个缩短和被刺穿的码字。
这种情况下对应的图中所示的编码器操作RS编码器缩短和刺穿。如前图所示,编码器接收(5,2)码字,因为它已经缩短从(7,3)码字通过一个符号,一个象征也被打破。
作为第一步,译码器添加一个擦除,E,指定的第二奇偶校验码字的位置。这对应于1011年穿刺向量。添加一个零占缩短,以同样的方式,如前图所示。一个擦除不超过erasure-correcting代码的能力,从而正确的四个“抹除”。DI three-symbol消息中解码操作的结果<年代ub>1年代ub>我<年代ub>2年代ub>。第一个符号是截断,在前面的图中,屈服我的最终输出<年代ub>1年代ub>我<年代ub>2年代ub>。
<年代tr在g id="bsx_or8">编码器与缩短例子,刺穿,“抹除”。年代tr在g>下面的图显示了译码器在穿刺操作,缩短码字,同时纠正接收机产生的“抹除”。
在这个图中,解调接收我<年代ub>1年代ub>我<年代ub>2年代ub>P<年代ub>1年代ub>P<年代ub>3年代ub>P<年代ub>4年代ub>向量编码器发送。解调器宣称5收到的两个符号是不可靠的足以抹去,这样符号2和5被认为是“抹除”。01001年的向量,由外部源提供,表明这些“抹除”。在“抹除”向量,1意味着是被替换为一个擦除的象征,象征和0意味着传递的象征。
解码器模块接收码字和擦除矢量,并执行“抹除”01001年向量表示。在“抹除”向量,1意味着是被替换为一个擦除的象征,象征和0意味着传递的象征。由此产生的码字向量是我<年代ub>1年代ub>EP<年代ub>1年代ub>P<年代ub>3年代ub>E, E是一个擦除的象征。
然后depunctured码字,根据穿刺向量(即用于编码操作。,1011)。因此,一个擦除符号之间插入P<年代ub>1年代ub>和P<年代ub>3年代ub>我的,产生一个码字向量<年代ub>1年代ub>EP<年代ub>1年代ub>EP<年代ub>3年代ub>E。
只是解码之前,开始时的零向量占缩短的信息。由此产生的向量是0<年代ub>1年代ub>EP<年代ub>1年代ub>EP<年代ub>3年代ub>E,这样一个(7,3)码字发送到Berlekamp算法。
这个码解码,收益率three-symbol DI的消息<年代ub>1年代ub>我<年代ub>2年代ub>(维指的是一个虚拟的符号)。最后,切除D象征从消息向量占缩短,收益率最初的我<年代ub>1年代ub>我<年代ub>2年代ub>向量。
有关更多信息,请参见<一个href="//www.tianjin-qmedu.com/help/comm/ug/reed-solomon-coding-with-erasures-punctures-and-shortening.html" class="a">Reed-Solomon编码与“抹除”、穿刺和缩短仿真软件万博1manbetx一个>的例子。
年代ect我在>低密度奇偶校验(LDPC)码是线性错误控制编码:
稀疏奇偶校验矩阵
长块长度,可以获得性能接近香农极限(见<一个href="//www.tianjin-qmedu.com/help/comm/ref/ldpcencoder.html">LDPC编码器年代p一个n>一个>和<一个href="//www.tianjin-qmedu.com/help/comm/ref/ldpcdecoder.html">LDPC译码器年代p一个n>一个>)
通信工具箱进行LDPC编码使用MATLAB仿真软件模块和对象。万博1manbetx
解码过程是迭代完成的。如果迭代的数量太小,算法不收敛。你可能需要尝试找到一个适当的值的迭代次数为您的模型。解码算法的细节,请参阅<一个href="//www.tianjin-qmedu.com/help/comm/ref/ldpcdecoder.html" class="a">解码算法一个>。
不像其他编解码器,你不能直接连接一个LDPC译码器的输出LDPC编码器,因为解码器需要对数似比率(LLR)。因此,你可以用llr解调器来计算。
同时,不像其他的解码器,它是可能的(虽然罕见)LDPC译码器的输出不满足所有奇偶校验检查。
年代ect我在><年代ection itemprop="content">一个<年代p一个nclass="emphasis">伽罗瓦域年代p一个n>是一个代数领域有限数量的成员。伽罗瓦领域有2<年代up>米年代up>用于错误控制编码和成员表示GF (2<年代up>米年代up>)。这一章描述了如何使用字段2<年代up>米年代up>成员,其中m 1和16之间是一个整数。在这一章的部分如下。
如果你需要使用伽罗瓦字段有奇数个元素,明白了<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">伽罗瓦的奇怪的特性一个>。
更多的细节过程伽罗瓦域数组元素的特定功能,查看在线参考页文档的MATLAB或通信工具箱软件。
请注意年代tr在g>
请注意,不支持的伽罗瓦域对象万博1manbetx复制
方法。
米一个TlAB函数的泛化伽罗瓦字段简单描述没有在本手册中引用页面,因为条目将MATLAB的文档保持一致。
<年代ect我在我temprop="content">伽罗瓦的讨论领域本文档中使用的一些术语不一致地使用在文学。这里采用的定义出现在范线头<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">[4]一个>:
一个<年代p一个nclass="emphasis">原始的元素年代p一个n>GF (2<年代up>米年代up>)是一个集团的循环发电机GF(2的非零元素<年代up>米年代up>)。这意味着每个非零元素字段可以表示为原始元素的整数次方。
一个<年代p一个nclass="emphasis">本原多项式年代p一个n>GF (2<年代up>米年代up>)是一些原始元素的最小多项式的GF (2<年代up>米年代up>)。binary-coefficient多项式的最小非零的程度有一定的原始元素作为根GF (2<年代up>米年代up>)。因此,一个本原多项式不可约m和程度。
定义暗示一种原始元素对应的本原多项式的根。
年代ect我在><年代ection itemprop="content">部分概述。年代tr在g>本节描述如何创建一个<年代p一个nclass="emphasis">伽罗瓦域数组年代p一个n>,这是一个MATLAB表达式代表了伽罗瓦域的元素。也介绍了MATLAB计算软件技术如何解释所使用的数字表示,和包括几个例子。
<年代tr在g id="fp7372">创建一个伽罗瓦域数组。年代tr在g>开始处理数据从伽罗瓦域GF (2 ^ m
),您必须设置上下文相关联数据和关键信息字段。的女朋友
函数执行本协会并创建一个MATLAB的伽罗瓦域数组。这个函数接受作为输入
伽罗瓦域数据,x
,这是一个MATLAB是整数0到数组的元素2 ^ m - 1
。
(<年代p一个nclass="emphasis">可选年代p一个n>一个整数,米
表示x
在字段GF (2 ^ m
)。有效的值米
1 - 16。默认是1,这意味着字段是GF (2)。
(<年代p一个nclass="emphasis">可选年代p一个n>)一个正整数,表示这本原多项式GF (2 ^ m
)在表示您正在使用x
。如果您省略这个输入参数,女朋友
使用一个默认的本原多项式GF (2 ^ m
)。这个论点的信息,请参阅<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">原始多项式和元素表示一个>。
的输出女朋友
函数是一个变量,MATLAB承认为伽罗瓦字段数组,而不是一个整数数组。因此,当你操作变量,MATLAB在伽罗瓦字段指定工作。例如,如果你的应用日志
伽罗瓦字段数组函数,伽罗瓦场和MATLAB计算对数<年代p一个nclass="emphasis">不年代p一个n>领域的真实的或复杂的数字。
<年代tr在g class="emphasis bold">当年代tr在g>MATLAB<年代tr在g class="emphasis bold">隐式地创建了伽罗瓦域数组年代tr在g>
伽罗瓦域上一些操作数组需要多个参数。如果你指定一个参数,是伽罗瓦域,另一个是一个普通的MATLAB数组,数组MATLAB解释既是伽罗瓦字段数组相同的字段。它隐式地调用女朋友
在普通的MATLAB函数数组。这种隐含的调用可以简化你的语法,因为你可以省略一些引用女朋友
函数。一个简化的例子,请参阅<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">例子:加法和减法一个>。
<年代tr在g id="fp6596">例子:创建伽罗瓦域变量。年代tr在g>下面的代码创建了一个条目的行向量域GF(4),然后添加行。
x = 0:3;<年代p一个n年代tyle="color:#228B22">%一个行向量包含整数年代p一个n>米= 2;<年代p一个n年代tyle="color:#228B22">%的工作领域GF(2 ^ 2),或者,GF (4)。年代p一个n>一个=女朋友(x,米)<年代p一个n年代tyle="color:#228B22">创建一个伽罗瓦数组百分比GF (2 ^ m)。年代p一个n>b=一个+<年代p一个n年代tyle="color:#228B22">%添加一个本身,创造b。年代p一个n>
输出是
一个= GF(2 ^ 2)数组。本原多项式= ^ 2 + D + 1(7小数)数组元素= 0 1 2 3 b = GF(2 ^ 2)数组。本原多项式= ^ 2 + D + 1(7小数)数组元素= 0 0 0 0
输出显示了伽罗瓦域数组的值命名一个
和b
。每个输出部分显示
包含变量的领域,即GF (2 ^ 2) = GF (4)。
字段的本原多项式。在这种情况下,它是工具箱的默认本原多项式GF (4)。
伽罗瓦的数组变量包含的字段值。特别是,数组元素一个
是完全的元素向量x
和数组元素b
是四个零元素的实例GF (4)。
创建的命令b
表明,在定义变量一个
伽罗瓦域数组,您可以添加一个
使用普通的本身+
操作符。MATLAB的矢量加法操作执行域GF (4)。输出显示
相比一个
,b
在相同的字段,并使用相同的本原多项式。没有必要显示字段定义之和时,b
,因为MATLAB记得信息叫做加数的定义,一个
。
的数组元素b
是零,因为任何与自身价值的总和,伽罗瓦域<年代p一个nclass="emphasis">特征的两个年代p一个n>,是零。这个结果不同于和x +
代表整数的加法操作在无限的领域。
GF(8)的例子:代表元素。年代tr在g>说明伽罗瓦域数组的数组元素是什么意思,下表列出了域GF(8)的元素作为整数和多项式的一个基本元素,a表应该帮助你解释一个伽罗瓦字段数组
gf8 = gf ([0:7], 3);<年代p一个n年代tyle="color:#228B22">%伽罗瓦向量GF (2 ^ 3)年代p一个n>
整数表示 | 二进制表示 | 元素的GF (8) |
---|---|---|
0 | 000年年年 | 0 |
1 | 001年年年 | 1 |
2 | 010年年年 | 一个 |
3 | 011年年年 | +1 |
4 | One hundred. | 一个<年代up>2年代up> |
5 | 101年年年 | 一个<年代up>2年代up>+ 1 |
6 | 110年年年 | 一个<年代up>2年代up>+一个 |
7 | 111年年年 | 一个<年代up>2年代up>+ + 1 |
如何整数对应伽罗瓦域元素。年代tr在g>基础上的<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">GF(8)上面的例子一个>本节解释解释,伽罗瓦域数组的数组元素更大的通用性。字段GF (2 ^ m
)2 ^ m
不同的元素,这个工具箱标签为0,1,2,…,2 ^ m - 1
。这些整数标签对应元素的伽罗瓦域通过多项式表达式涉及领域的原始元素。更具体地说,每个整数0到2 ^ m - 1
有一个二进制表示米
位。使用二进制表示的部分作为一个多项式系数,最低有效位是常数项,导致订单最多的二元多项式m - 1
。评价二元多项式的原始元素GF (2 ^ m
)导致的一个元素。
相反,任何元素的GF (2 ^ m
)可以表示为一个二元多项式的秩序m - 1
,评估领域的原始元素。的米
元组的系数多项式对应的二进制表示0和之间的一个整数2 ^ m
。
下面是一个象征性的插图对应的整数
例子:代表一个原始元素。年代tr在g>下面的代码定义了一个变量alph
代表一种原始域GF(2的元素<年代up>4年代up>)。
m = 4;<年代p一个n年代tyle="color:#228B22">%或选择任何正整数m的价值。年代p一个n>一个lph = gf(2米)<年代p一个n年代tyle="color:#228B22">%的原始元素GF (2 ^)年代p一个n>
输出是
alph = GF(2 ^ 4)数组。本原多项式= ^ 4 + D + 1 = 2(十进制)19日数组元素
伽罗瓦域数组alph
代表了一种原始的元素,因为之间的对应关系
整数2中指定女朋友
语法
的二进制表示2 = 10(或0010使用四位)
多项式+ 0,在这个领域是一个原始的元素(或0<年代up>3年代up>+ 0<年代up>2年代up>+ + 0使用四个最低的权力)
原始多项式和元素表示。年代tr在g>本节基于的讨论<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">创建一个伽罗瓦域数组一个>通过描述如何指定自己的本原多项式,当你创建一个伽罗瓦字段数组。的主题是
如果你执行许多使用默认的本原多项式计算,看看<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">速度和默认的原始多项式一个>。
<年代tr在g class="emphasis bold">指定本原多项式年代tr在g>
的讨论<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">整数对应于伽罗瓦域元素如何一个>指的是一种原始的元素,这是一个本原多项式的根。当你使用女朋友
函数创建一个伽罗瓦字段数组,函数解释整数数组中对一个特定的字段默认本原多项式,除非你显式地提供不同的本原多项式。列表默认原始多项式在参考页面<一个href="//www.tianjin-qmedu.com/help/comm/ref/gf.html">女朋友
函数。
指定自己的本原多项式在创建伽罗瓦域数组,使用这样的语法
c = gf (5、4、25)<年代p一个n年代tyle="color:#228B22">% 25显示了GF(16)的本原多项式。年代p一个n>
而不是
c1 = gf (4);<年代p一个n年代tyle="color:#228B22">%使用默认本原多项式GF (16)。年代p一个n>
额外的输入参数,25
在这种情况下,指定字段的本原多项式GF (2 ^ m
)在某种程度上类似于描述的表示<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">整数对应于伽罗瓦域元素如何一个>。在这种情况下,25对应于一个整数的二进制表示11001年,进而对应于多项式D<年代up>4年代up>+ D<年代up>3年代up>+ 1。
请注意年代tr在g>
指定本原多项式,输入参数时必须使用二进制表示m + 1
位,不包括不必要的前导零。换句话说,一个本原多项式GF (2 ^ m
)总是有秩序米
。
当你使用一个输入参数指定本原多项式,输出反映了你的选择通过展示整数值以及多项式表示。
d = gf (25 (1 2 3) 4)
d = GF(2 ^ 4)数组。本原多项式= D D ^ ^ 4 + 3 + 1 = 1 2 3(十进制)25日数组元素
请注意年代tr在g>
伽罗瓦域数组定义之后,你不能改变的本原多项式对MATLAB对数组元素。
找到原始多项式年代tr在g>
您可以使用primpoly
函数为女朋友找到原始多项式(2 ^ m
)和isprimitive
函数来确定一个多项式是否原始GF (2 ^ m
)。下面的代码演示了。
m = 4;defaultprimpoly = primpoly (m)<年代p一个n年代tyle="color:#228B22">%的默认原始聚GF (16)年代p一个n>一个llprimpolys = primpoly (m,<年代p一个n年代tyle="color:#A020F0">“所有”年代p一个n>)<年代p一个n年代tyle="color:#228B22">%的所有原始多边形GF (16)年代p一个n>我1=isprimitive(25)<年代p一个n年代tyle="color:#228B22">% 25可以prim_poly输入gf (…) ?年代p一个n>我2=isprimitive(21)<年代p一个n年代tyle="color:#228B22">% 21可以prim_poly输入gf (…) ?年代p一个n>
下面的输出。
本原多项式(s) = D D ^ ^ 4 + 1 + 1 defaultprimpoly = 19本原多项式(s) = D D ^ ^ 4 + 1 + 1 D D ^ ^ 4 + 3 + 1
allprimpolys = 19 25 i1和i2 = 0 = 1
<年代trong class="emphasis bold">默认的原始多项式对数值结果的影响年代tr在g>
大多数领域提供多种选择的本原多项式,帮助定义成员的代表。当你使用女朋友
函数,改变本原多项式改变数组元素的解释,反过来,改变一些对伽罗瓦域后续操作的结果数组中。例如,求幂的原始元素很容易看出本原多项式影响字段元素的表示。
a11 = gf (2、3);<年代p一个n年代tyle="color:#228B22">%使用默认本原多项式的11。年代p一个n>首次购物= gf (2、3、13);<年代p一个n年代tyle="color:#228B22">使用% D D ^ ^ 3 + 2 + 1的本原多项式。年代p一个n>z=一个13)^3+一个13。^2+ 1<年代p一个n年代tyle="color:#228B22">% 0因为a13满足的方程年代p一个n>新西兰= a11。^ 3 + a11。^ 2 + 1<年代p一个n年代tyle="color:#228B22">% 0。a11并不满足方程。年代p一个n>
下面的输出显示,当本原多项式的整数表示13
伽罗瓦字段数组满足一定的方程。相比之下,当本原多项式整数表示11
伽罗瓦字段数组未能满足的方程。
z = GF(2 ^ 3)数组。本原多项式= D D ^ ^ 3 + 2 + 1 = 0新西兰=(十进制)13日数组元素GF(2 ^ 3)数组。本原多项式= ^ 3 + D + 1 = 6(十进制)11日数组元素
输出,当你尝试这个例子还包括一个警告查找表。这是正常的如果你没有使用gftable
函数优化计算涉及一个默认的本原多项式的13。
部分概述。年代tr在g>你可以对伽罗瓦域执行算术运算阵列通过使用熟悉MATLAB运营商,在下表中列出。当你操作对伽罗瓦域数组,数组必须在相同的伽罗瓦域。
操作 | 操作符 |
---|---|
除了 | + |
减法 | - - - - - - |
Elementwise乘法 | 。* |
矩阵乘法 | * |
Elementwise左部 | 。/ |
Elementwise正确的部门 | 。\ |
矩阵左部 | / |
矩阵分裂 | \ |
Elementwise求幂 | 。^ |
Elementwise对数 | 日志() |
求幂方伽罗瓦矩阵的一个标量整数 | ^ |
对伽罗瓦域多项式的乘法和除法,明白了<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">多项式的加法和减法一个>。
<年代tr在g id="fp6359">例子:加法和减法。年代tr在g>下面的代码添加了两个伽罗瓦域数组创建一个添加表GF (8)。除了使用普通+
操作符。下面的代码也显示了如何索引数组addtb
找到的结果添加1 - GF(8)的元素。
m = 3;e = repmat ([0:2 ^ m - 1), 2 ^ m, 1);f = gf (e, m);<年代p一个n年代tyle="color:#228B22">%创建一个伽罗瓦数组。年代p一个n>一个ddtb=f+ f '<年代p一个n年代tyle="color:#228B22">% f添加到自己的矩阵的转置。年代p一个n>一个dd在e=addtb(2);<年代p一个n年代tyle="color:#228B22">%为伽罗瓦向量addone分配第二行。年代p一个n>
下面的输出。
addtb = GF(2 ^ 3)数组。本原多项式= ^ 3 + D + 1(十进制)11日数组元素= 0 1 2 3 4 5 6 7 1 0 3 2 5 4 7 6 2 3 0 6 7 5 4 3 2 1 0 7 6 5 4 0 1 2 3 4 5 6 7 5 4 7 6 1 0 3 2 6 7 4 2 3 5 0 1 7 6 5 4 3 2 1 0
例如阅读这表,(7,4)条目addtb
数组显示gf (3)
+gf (3)
=gf (3)
。同样,元素<年代up>2年代up>+ + + 1 =元素的元素<年代up>2年代up>+ 1。二进制表示的等价起源于6 110 3 011,5 101。
减法表,您可以获得通过替换+
通过- - - - - -
,是一样的addtb
。这是因为减法和加法是相同的业务领域<年代p一个nclass="emphasis">特征的两个年代p一个n>。事实上,沿着主对角线的0addtb
说明这一事实GF (8)。
<年代tr在g class="emphasis bold">简化的语法年代tr在g>
下面的代码演示了伽罗瓦场的标量扩张和隐式创建数组从一个普通的MATLAB数组。伽罗瓦字段数组h
和h1
是相同的,但创建呢h
使用一个简单的语法。
g = gf ((2、3)、4);<年代p一个n年代tyle="color:#228B22">%显式地创建一个伽罗瓦数组。年代p一个n>h=g + 5;<年代p一个n年代tyle="color:#228B22">%添加gf (4) g的每个元素。年代p一个n>h1=g + gf (5 * 1 (2、3)、4)<年代p一个n年代tyle="color:#228B22">% h一样。年代p一个n>
下面的输出。
h1 = GF(2 ^ 4)数组。本原多项式= D ^ 4 + D + 1 = 4(十进制)19日数组元素4 4 4 4 4
请注意,1 + 5是伽罗瓦领域的报告为4。这是真的,因为5代表多项式表达式<年代up>2年代up>+ 1和1 + (A<年代up>2年代up>+ 1)GF (16)<年代up>2年代up>。此外,整数,代表了一个多项式表达式<年代up>2年代up>是4。
<年代tr在g id="fp6360">例如:乘法。年代tr在g>下面的例子繁殖在伽罗瓦域数组使用单个元素。*
操作符。然后执行使用的矩阵乘法*
操作符。elementwise乘法产生一个数组的大小匹配的输入。相比之下,矩阵乘法产生矩阵乘积的伽罗瓦标量,因为它是一个行向量和列向量。
m = 5;第一行= gf ([1:2:9], m);row2 = gf ([2:2:10], m);坳= row2 ';<年代p一个n年代tyle="color:#228B22">% '创建一个列数组。年代p一个n>ep=第一行。* row2;<年代p一个n年代tyle="color:#228B22">% Elementwise产品。年代p一个n>米p=第一行*坳;<年代p一个n年代tyle="color:#228B22">%矩阵乘积。年代p一个n>
GF乘法表(8)年代tr在g>
另外一个例子,下面的代码复制两个伽罗瓦向量使用矩阵乘法。结果是一个乘法表GF (8)。
m = 3;els = gf ([0:2 ^ m - 1], m);multb = els * els的<年代p一个n年代tyle="color:#228B22">% els乘以其矩阵的转置。年代p一个n>
下面的输出。
multb = GF(2 ^ 3)数组。本原多项式= ^ 3 + D + 1(十进制)11日数组元素= 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 0 2 4 6 3 1 7 5 0 3 4 5 6 7 1 2 0 4 1 3 7 6 2 5 0 5 1 4 2 7 3 6 0 6 7 1 5 3 2 4 0 7 5 1 2 6 4 3
<年代trong id="fp8058">例如:部门。年代tr在g>下面的例子说明了伽罗瓦场四部门运营商通过计算乘法逆阵的各个元素和一个数组。你也可以计算逆使用发票
或者使用求幂1。
<年代tr在g class="emphasis bold">Elementwise部门年代tr在g>
这个例子将1×伽罗瓦域数组中的每个单独的元素使用。/
和。\
操作符。这两个操作符只在不同输入参数的顺序。列出了每个系数向量乘法逆非零元素的领域。在这个例子中,MATLAB扩展了标量1的大小新西兰
之前的计算;或者,您可以使用两个相同大小的数组作为参数。
m = 5;新西兰= gf ([1:2 ^ m - 1), m);<年代p一个n年代tyle="color:#228B22">%的非零元素的领域年代p一个n>我nv1= 1。/新西兰;<年代p一个n年代tyle="color:#228B22">% 1除以每个元素。年代p一个n>我nv2=新西兰。\ 1;<年代p一个n年代tyle="color:#228B22">%获得相同的结果。\运营商。年代p一个n>
矩阵分裂年代tr在g>
这个例子将身份广场伽罗瓦域数组的数组垫
使用/
和\
操作符。每个系数矩阵的乘法逆元垫
。注意转置操作符(”
)出现在相当于操作使用\
。方阵,转置操作的序列是不必要的,但对于nonsquare矩阵,这是必要的。
m = 5;垫= gf ([1 2 3;4 5 6;7 8 9],m);眼睛minv1 =(3) /垫;<年代p一个n年代tyle="color:#228B22">%计算矩阵的逆。年代p一个n>米发票2=(垫' \眼(3)')';<年代p一个n年代tyle="color:#228B22">%使用\运营商获得相同的结果。年代p一个n>
例如:求幂。年代tr在g>下面的例子说明了如何计算整数的伽罗瓦字段数组。对伽罗瓦字段执行矩阵求幂数组,您必须使用一个正方形伽罗瓦字段数组作为基础和一个普通的(不是伽罗瓦)整数指数标量。
<年代tr在g class="emphasis bold">Elementwise求幂年代tr在g>
这个例子计算的一个基本元素,伽罗瓦场的。然后分别使用这些计算能力来评估默认本原多项式A . 0的答案表明是本原多项式的根。的。^
独立操作符取幂每个数组元素。
m = 3;av = gf (2 * (1 + 1), m);<年代p一个n年代tyle="color:#228B22">%行包含原始元素年代p一个n>扩展= av。^ [0: m];<年代p一个n年代tyle="color:#228B22">%筹集元素不同的权力。年代p一个n>执行=扩张(4)+扩展(2)+扩张计划(1)<年代p一个n年代tyle="color:#228B22">% ^ 3 + D + 1进行评估。年代p一个n>
下面的输出。
执行副总裁= GF(2 ^ 3)数组。本原多项式= ^ 3 + D + 1(十进制)11日数组元素= 0
<年代trong class="emphasis bold">矩阵幂运算年代tr在g>
这个例子计算一个方阵的逆矩阵幂。这也引发了方阵的权力2和2。
m = 5;垫= gf ([1 2 3;4 5 6;7 8 9],m);minvs =垫^ (1);<年代p一个n年代tyle="color:#228B22">%反矩阵年代p一个n>米一个t年代问=垫^ 2;<年代p一个n年代tyle="color:#228B22">%一样垫垫年代p一个n>米一个t发票年代年代问=垫^ (2);<年代p一个n年代tyle="color:#228B22">% minvs * minvs一样年代p一个n>
例如:Elementwise对数。年代tr在g>下面的代码计算对数的伽罗瓦域数组的元素。输出表明如何表达<年代p一个nclass="emphasis">非零年代p一个n>GF(8)的元素作为基本元素的力量。的对数的零元素字段定义。
gf8_nonzero = gf ([1:7], 3);<年代p一个n年代tyle="color:#228B22">%的非零元素的向量GF (8)年代p一个n>exp为米一个t=日志(gf8_nonzero)<年代p一个n年代tyle="color:#228B22">%的对数每个元素年代p一个n>
输出是
expformat = 0 1 3 2 6 4 5
如何解释输出的一个例子,考虑最后一个条目在每个向量在这个例子。你可以推断该元素gf (7,3)
GF(8)可以表示为
一个<年代up>5年代up>,使用的最后一个元素expformat
一个<年代up>2年代up>+ + 1,使用7 111的二进制表示。看到<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">例子:代表元素的GF (8)一个>为更多的细节。
部分概述。年代tr在g>可以将逻辑测试应用到伽罗瓦域数组和获得一个逻辑数组。一些重要类型的测试正在测试两个平等的伽罗瓦字段数组和<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">非零值的测试一个>伽罗瓦域数组。
<年代tr在g id="fp6281">测试的平等。年代tr在g>比较对应的两个伽罗瓦域数组元素具有相同的大小,使用操作符= =
和~ =
。结果是一个逻辑数组,其中每个元素是真实还是虚假显示相应的elementwise比较。如果你使用相同的运营商来比较一个标量和伽罗瓦字段数组,MATLAB技术计算软件比较标量与数组的每个元素,产生逻辑相同大小的数组。
m = 5;r1 = gf ([1:3], m);r2 = 1。/ r1;lg1 = (r1, r2 * = = (1 1 1))<年代p一个n年代tyle="color:#228B22">% = 1每个元素吗?年代p一个n>lg2 = (r1, r2 * = = 1)<年代p一个n年代tyle="color:#228B22">%同上,使用标量扩张年代p一个n>r2lg3 = (r1 ~ =)<年代p一个n年代tyle="color:#228B22">%每个元素不同于它的逆矩阵吗?年代p一个n>
下面的输出。
lg1 = 1 1 1 lg2 = 1 1 1 lg3 = 0 1 1
<年代trong class="emphasis bold">比较isequal和= =年代tr在g>
比较完整的数组和获得一个逻辑<年代p一个nclass="emphasis">标量年代p一个n>结果,而不是一个逻辑数组,使用内置的isequal
函数。然而,isequal
使用严格的规则的比较,并返回一个值0
如果你比较(false)
伽罗瓦字段数组和一个普通的MATLAB数组,即使底层数组元素的值匹配
一个标量nonscalar数组,即使数组中的所有元素匹配的标量
下面的例子说明了这种区别= =
和isequal
。
m = 5;r1 = gf ([1:3], m);r2 = 1。/ r1;lg4 = isequal (r1, r2 * (1 1 1));<年代p一个n年代tyle="color:#228B22">%假年代p一个n>lg5 = isequal (r1, r2 * gf(1米));<年代p一个n年代tyle="color:#228B22">%假年代p一个n>lg6 = isequal (r1, r2 * gf ((1 1 1), m));<年代p一个n年代tyle="color:#228B22">%真实年代p一个n>
测试为非零值。年代tr在g>在伽罗瓦测试为非零值向量,或在伽罗瓦列字段数组有超过一行,使用任何
或所有
函数。这两个函数的行为就像普通的MATLAB函数任何
和所有
,除了他们只考虑底层数组元素而忽略,伽罗瓦域元素的信息。下面的例子。
m = 3;randel = gf (randi ([0 2 ^ m - 1), 6日1),m);<年代p一个n年代tyle="color:#0000FF">如果年代p一个n>所有(randel)<年代p一个n年代tyle="color:#228B22">%如果所有元素都是可逆的年代p一个n>我nvels = randel。\ 1;<年代p一个n年代tyle="color:#228B22">%计算逆元素。年代p一个n><年代p一个n年代tyle="color:#0000FF">其他的年代p一个n>d我年代p(<年代p一个n年代tyle="color:#A020F0">“至少有一个元素是不可逆的。”年代p一个n>);<年代p一个n年代tyle="color:#0000FF">结束年代p一个n>一个lph = gf (2、4);保利= 1 + alph + alph ^ 3;<年代p一个n年代tyle="color:#0000FF">如果年代p一个n>任何(聚)<年代p一个n年代tyle="color:#228B22">%如果多边形包含一个非零值年代p一个n>d我年代p(<年代p一个n年代tyle="color:#A020F0">alph不是根1 + D + D ^ 3。年代p一个n>);<年代p一个n年代tyle="color:#0000FF">结束年代p一个n>代码= [0:4 4 0;三4 5]<年代p一个n年代tyle="color:#0000FF">如果年代p一个n>(所有代码,2)<年代p一个n年代tyle="color:#228B22">%每一行完全是零吗?年代p一个n>d我年代p(<年代p一个n年代tyle="color:#A020F0">“码字都是完全零。”年代p一个n>);<年代p一个n年代tyle="color:#0000FF">其他的年代p一个n>d我年代p(<年代p一个n年代tyle="color:#A020F0">“至少一个码字包含了一个零。”年代p一个n>);<年代p一个n年代tyle="color:#0000FF">结束年代p一个n>
伽罗瓦域数组的基本操作。年代tr在g>对伽罗瓦基本数组操作字段数组是在下表中。这些操作的功能类似于MATLAB操作拥有相同的语法。
操作 | 语法 |
---|---|
索引数组,可能使用结肠算子代替一个向量的显式的指标 | (向量) 或(向量,vector1) ,在那里向量 和/或vector1 可以“: ”,而不是一个向量 |
转置数组 | 一个“ |
连接矩阵 | [a, b] 或[a, b] |
创建数组指定对角元素 | 诊断接头(向量) 或诊断接头(向量,k) |
提取对角元素 | 诊断接头(a) 或诊断接头(k) |
提取下三角部分 | 下三角阵(a) 或下三角阵(k) |
提取上三角部分 | triu (a) 或triu (k) |
改变形状的数组 | 重塑(k1, k2) |
下面的代码使用这些语法。
m = 4;a = gf ([0:15], m);(1:2)= 13 [13];<年代p一个n年代tyle="color:#228B22">%替代一些元素的向量。年代p一个n>b=重塑(2 8);<年代p一个n年代tyle="color:#228B22">%建立2-by-8矩阵。年代p一个n>c=(b((12], 1:3);(6)];<年代p一个n年代tyle="color:#228B22">%建立4-by-3矩阵。年代p一个n>d=(c(1:4) ');<年代p一个n年代tyle="color:#228B22">%建立4×4矩阵。年代p一个n>dvec=诊断接头(d);<年代p一个n年代tyle="color:#228B22">%提取主对角线的d。年代p一个n>质素=诊断接头((9));<年代p一个n年代tyle="color:#228B22">%创建5-by-5对角矩阵年代p一个n>dtr我l =下三角阵(d);<年代p一个n年代tyle="color:#228B22">%提取上下三角年代p一个n>dtr我u = triu (d);<年代p一个n年代tyle="color:#228B22">% d。年代p一个n>
伽罗瓦的基本信息字段数组。年代tr在g>您可以确定一个伽罗瓦向量的长度或大小的伽罗瓦域数组使用长度
和大小
功能。伽罗瓦域数组的功能类似于MATLAB普通数组的操作,除了输出参数大小
和长度
都是整数,而不是伽罗瓦域数组。下面的代码演示了使用这些功能。
m = 4;e = gf (0:5, m);f =重塑(e, 2、3);而言,=长度(e);<年代p一个n年代tyle="color:#228B22">%向量长度的e年代p一个n>年代zf=大小(f);<年代p一个n年代tyle="color:#228B22">% f的大小,作为双元素返回行年代p一个n>(nr、数控)= (f)大小;<年代p一个n年代tyle="color:#228B22">% f的大小,作为两个标量返回年代p一个n>nc2=大小(f, 2);<年代p一个n年代tyle="color:#228B22">%计算列数的另一种方式年代p一个n>
非零元素的位置年代tr在g>
另一种类型的信息您可能希望确定从伽罗瓦域数组非零元素的位置。对于一个普通的MATLAB数组,你可以使用找到
函数。然而,对于伽罗瓦字段数组,您应该使用找到
会同~ =
运营商了。
x = [0 1 2 1 0 2];m = 2;g = gf (x, m);nzx =找到(x);<年代p一个n年代tyle="color:#228B22">在普通数组x %找到非零值。年代p一个n>nzg =找到(g ~ = 0);<年代p一个n年代tyle="color:#228B22">%在伽罗瓦数组g找到非零值。年代p一个n>
反相矩阵和计算行列式。年代tr在g>反平方伽罗瓦字段数组,使用发票
函数。相关的是依据
伽罗瓦场的函数,该函数计算行列式数组。这两个发票
和依据
像普通的MATLAB同行,除了他们执行计算领域的伽罗瓦域而不是复数。
请注意年代tr在g>
伽罗瓦字段数组奇异当且仅当它的行列式就是零。没有必要考虑舍入错误,真正的和复杂的数组。
下面的代码说明了矩阵求逆和行列式计算。
m = 4;randommatrix = gf (randi ([0 2 ^ m - 1), 4, 4), m);gfid = gf(眼(4),m);<年代p一个n年代tyle="color:#0000FF">如果年代p一个n>依据(randommatrix) ~ = 0 invmatrix =发票(randommatrix);check1 = invmatrix * randommatrix;check2 = randommatrix * invmatrix;<年代p一个n年代tyle="color:#0000FF">如果年代p一个n>(我年代e问ual (check1 gfid) & isequal (check2 gfid)) disp (<年代p一个n年代tyle="color:#A020F0">发票找到正确的反矩阵。年代p一个n>);<年代p一个n年代tyle="color:#0000FF">结束年代p一个n><年代p一个n年代tyle="color:#0000FF">其他的年代p一个n>d我年代p(<年代p一个n年代tyle="color:#A020F0">“矩阵是不可逆的。”年代p一个n>);<年代p一个n年代tyle="color:#0000FF">结束年代p一个n>
这个例子的输出是这两个消息,取决于随机生成的矩阵是满秩或奇异。
发票找到了正确的矩阵的逆。矩阵是不可逆的。
<年代trong id="fp12791">计算排名。年代tr在g>伽罗瓦场的计算等级数组,使用排名
函数。它像普通MATLAB排名
当给定一个输入参数的函数。下面的例子说明了如何找到的秩广场和nonsquare伽罗瓦域数组。
m = 3;中途= gf ([4 7 6;4 6 5;0 6 1],m);r1 =排名(中途);anonsquare = gf ([4 7 6 3;4 6 5 1;0 6 1 1],m);r2 =排名(anonsquare);(r1, r2)
输出是
答3 = 2
的值r1
和r2
表明,中途
不到满秩,但anonsquare
满秩。
<年代tr在g id="fp11123">保理方阵。年代tr在g>表达一个正方形的伽罗瓦字段数组(或一个排列)的产品下三角伽罗瓦字段数组和一个上三角伽罗瓦字段数组,使用陆
函数。这个函数接受一个输入参数,产生两个或三个输出参数。它像普通MATLAB陆
函数时相同的语法。下面的例子说明了如何使用因素陆
。
tofactor = gf ([6 5 6 7;5 6 2 5;0 1 7 7;1 0 5 1)、3);陆[L U] = (tofactor);<年代p一个n年代tyle="color:#228B22">%路有两个输出参数年代p一个n>c1=isequal(l* U, tofactor)<年代p一个n年代tyle="color:#228B22">%真实年代p一个n>t的一个ct或2=女朋友((1 2 3 4; 1 2 3 0 2 5 2 1;0 5 0 0),3);陆(L2, U2, P) = (tofactor2);<年代p一个n年代tyle="color:#228B22">%三个输出参数年代p一个n>c2=isequal(l2 * U2, P * tofactor2)<年代p一个n年代tyle="color:#228B22">%真实年代p一个n>
解决线性方程。年代tr在g>找到一个特解线性方程的伽罗瓦,使用\
或/
运营商对伽罗瓦域数组。下表显示每个操作符地址的方程,假设一个
和B
是之前定义的伽罗瓦域数组。
操作符 | 线性方程 | 语法 | 相同的语法使用\ |
---|---|---|---|
反斜杠(\ ) | A * x = |
x = A \ B |
不适用 |
斜杠(/ ) | x * A = B |
x = B / A |
x = (‘\ B) ' |
表中语法的结果取决于特征的伽罗瓦域数组一个
:
如果一个
广场和非奇异的,输出x
线性方程的唯一解。
如果一个
广场和奇异,语法表中产生一个错误。
如果一个
不是广场,MATLAB试图找到一个特定的解决方案。如果“*
或*“
是一个单一的数组,或者如果一个
是一个矩阵,行比列,表示一个超定的系统,尝试可能会失败。
请注意年代tr在g>
一个错误消息并不一定表明,线性方程无解。你可以找到一个解决方案,描述这个问题。例如,gf ([1 2;0 0],3)\ gf ([1;0),3)
产生一个错误,但在数学上等价的gf ((1 2), 3) \ gf ([1], 3)
没有。第一个失败因为语法gf ([1 2;0 0],3)
是一个奇异方阵。
<年代trong class="emphasis bold">例如:解决线性方程年代tr在g>
下面的例子说明了如何找到在伽罗瓦域线性方程的特解。万博 尤文图斯
m = 4;A = gf(魔法(3),m);<年代p一个n年代tyle="color:#228B22">%广场满秩矩阵年代p一个n>什么方法= [A, 2 * (:, 3)];<年代p一个n年代tyle="color:#228B22">% 3×4矩阵冗余在右边年代p一个n>个子很高=什么';<年代p一个n年代tyle="color:#228B22">% 4-by-3矩阵冗余在底部年代p一个n>B=女朋友((0:2], m);C = [B;2 * B (3)];D = [B;B (3) + 1);和= \ B;<年代p一个n年代tyle="color:#228B22">% * x = B的解决方案年代p一个n>the年代olution2 = B / A;<年代p一个n年代tyle="color:#228B22">% x * A = B溶液的年代p一个n>和t =所有(A * B = =)<年代p一个n年代tyle="color:#228B22">%检查解决方案的有效性。万博 尤文图斯年代p一个n>ck2=所有(thesolution2 * = = B”)<年代p一个n年代tyle="color:#228B22">%什么* x = B有无穷多的解决方案。万博 尤文图斯找到一个。年代p一个n>在e年代olution =具有丰富\ B;ck3 =所有(什么* onesolution = = B)<年代p一个n年代tyle="color:#228B22">%检查解决方案的有效性。年代p一个n><年代p一个n年代tyle="color:#228B22">%个子* x = C一个解决方案。年代p一个n>想到=个子很高\ C;ck4 =所有(个子*想到= = C)<年代p一个n年代tyle="color:#228B22">%检查解决方案的有效性。年代p一个n><年代p一个n年代tyle="color:#228B22">%个子* x = D没有解决方案。年代p一个n>notasolution =个子很高\ D;ck5 =所有(个子* notasolution = = D)<年代p一个n年代tyle="color:#228B22">%,这不是一个有效的解决方案。年代p一个n>
这个例子表明有效性检查的输出都是真实的(1
),除了ck5
是假的(0
)。
部分概述。年代tr在g>您可以执行一些对伽罗瓦域阵列信号处理操作,如<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">过滤一个>,<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">卷积一个>,<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">离散傅里叶变换一个>。
本节描述如何执行这些操作。
其他信息对应的操作对普通真实向量在信号处理工具箱™文档。
<年代tr在g id="fp13763">过滤。年代tr在g>过滤伽罗瓦向量,使用过滤器
函数。它像普通MATLAB过滤器
函数时,给出三个输入参数。
下面的代码和图给一个特定的滤波器的脉冲响应/ GF (2)。
m = 1;<年代p一个n年代tyle="color:#228B22">%在GF(2)工作。年代p一个n>b=女朋友((1 00 1 0 1 0 1], m);<年代p一个n年代tyle="color:#228B22">%分子年代p一个n>一个=女朋友((1 01], m);<年代p一个n年代tyle="color:#228B22">%分母年代p一个n>x=女朋友((1, 0 (19)], m);y =过滤器(b, a, x);<年代p一个n年代tyle="color:#228B22">x %过滤器。年代p一个n>图;茎(y.x);<年代p一个n年代tyle="color:#228B22">%建立干细胞阴谋。年代p一个n>轴([0 20 -。1 1.1))
卷积。年代tr在g>通信工具箱软件提供了两种等效方法缠绕的伽罗瓦向量:
使用conv
功能,如中描述<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">多项式的乘法和除法一个>。这个工作因为卷积两个向量相当于乘以两个多项式的系数向量的条目。
使用convmtx
函数计算卷积矩阵的向量,然后用这个矩阵乘以另一个向量。这个作品,因为两个向量卷积等价于过滤的一个向量。的等效允许表示数字滤波器卷积矩阵,然后你可以乘以任何伽罗瓦适当长度的向量。
提示年代tr在g>
如果你需要缠绕大伽罗瓦向量,乘以卷积矩阵可能比使用conv
。
<年代trong class="emphasis bold">例子年代tr在g>
计算卷积矩阵向量b
GF (4)。代表分子为数字滤波器系数,然后说明了两个等价的卷积的方法b
与x
伽罗瓦域。
m = 2;b = gf ((1 2 3), m);n = 3;x = gf (randi ([0 2 ^ m - 1), n, 1), m);C = convmtx (b、n);<年代p一个n年代tyle="color:#228B22">%计算卷积矩阵。年代p一个n>v1=conv(b, x);<年代p一个n年代tyle="color:#228B22">%使用conv卷积b x年代p一个n>v2=C*x;<年代p一个n年代tyle="color:#228B22">%使用C b与x进行卷积。年代p一个n>
离散傅里叶变换。年代tr在g>离散傅里叶变换是数字信号处理的重要工具。这个工具箱提供了这些工具,以帮助您处理离散傅里叶变换:
fft
伽罗瓦向量的转换
传输线
反转,伽罗瓦的离散傅里叶变换向量
dftmtx
返回伽罗瓦字段数组,您可以使用它来执行或反伽罗瓦的离散傅里叶变换向量
在所有情况下,转换一定是伽罗瓦向量的向量长度的2<年代up>米年代up>1场GF (2<年代up>米年代up>)。下面的例子说明了这些函数的使用。你可以检查,使用isequal
函数,y
=日元
,z
=z1
,z
=x
。
m = 4;x = gf (randi ([0 2 ^ m - 1), 2 ^ m - 1, 1), m);<年代p一个n年代tyle="color:#228B22">%向量变换年代p一个n>一个lph = gf(2米);dm = dftmtx (alph);idm = dftmtx (1 / alph);dm * y = x;<年代p一个n年代tyle="color:#228B22">%变换x使用dftmtx的结果。年代p一个n>日元= fft (x);<年代p一个n年代tyle="color:#228B22">%利用fft变换x。年代p一个n>z=我d米*y;<年代p一个n年代tyle="color:#228B22">%恢复x使用的结果dftmtx (1 / alph)。年代p一个n>z1=传输线(y1);<年代p一个n年代tyle="color:#228B22">%恢复x使用的传输线。年代p一个n>
提示年代tr在g>
如果你有许多向量,你想转换(在同一个字段),这可能是更快的使用dftmtx
一次,多次矩阵乘法,而不是使用fft
很多次了。
部分概述。年代tr在g>您可以使用伽罗瓦多项式向量来表示在一个不确定的量x,伽罗瓦场系数。形式表示的清单多项式的系数向量中幂函数递减的顺序。例如,这个向量
gf (2 1 0 3, 4)
代表了多项式Ax<年代up>3年代up>x + 1<年代up>2年代up>+ 0 x + (+ 1)
是一种原始元素的域GF (2<年代up>4年代up>)。
x是不定数量的多项式。
然后,您可以使用这样一个向量进行算术,伽罗瓦<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">评估一个>,找到<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">根一个>多项式。你还可以找到<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">最小多项式一个>伽罗瓦的元素。
<年代tr在g id="fp5685">多项式的加法和减法。年代tr在g>多项式加减使用+
和- - - - - -
在等长伽罗瓦多项式向量表示。如果一个比另一个多项式的程度较低,必须垫短向量和零开始两个向量具有相同的长度。下面的例子显示了如何添加一个一度和二度多项式。
林= gf ((4 - 2), 3);<年代p一个n年代tyle="color:#228B22">% ^ 2 x +,在x是线性的年代p一个n>linpadded = gf ([0 4 2), 3);<年代p一个n年代tyle="color:#228B22">%相同的多项式,在年代p一个n>问uadr = gf ([1 4 2), 3);<年代p一个n年代tyle="color:#228B22">% x ^ 2 + x ^ 2 +,这是二次x年代p一个n><年代p一个n年代tyle="color:#228B22">%不能做林+ quadr因为他们有不同的向量长度。年代p一个n>年代umpoly =[0,林]+ quadr;<年代p一个n年代tyle="color:#228B22">%两个多项式之和年代p一个n>年代umpoly2 = linpadded + quadr;<年代p一个n年代tyle="color:#228B22">%的总和年代p一个n>
多项式的乘法和除法。年代tr在g>多项式乘法和除法,使用conv
和deconv
对伽罗瓦多项式向量表示。多项式的乘法和除法相当于卷积和反褶积向量。的deconv
函数返回两个多项式的系数以及其余多项式。下面的例子。
m = 4;载脂蛋白e = gf(4 5 3,米);<年代p一个n年代tyle="color:#228B22">% ^ 2 x ^ 2 + (^ 2 + 1) x + (+ 1)年代p一个n>业务流程外包= gf ([1], m);<年代p一个n年代tyle="color:#228B22">% x + 1年代p一个n>xpoly = gf ([1 0], m);<年代p一个n年代tyle="color:#228B22">% x年代p一个n><年代p一个n年代tyle="color:#228B22">%的产品是一个^ 2 x ^ 3 + x ^ 2 + (A ^ 2 + A) x + (+ 1)。年代p一个n>cpo = conv (apoe, bpo);[a2, remd] = deconv (cpo bpo);<年代p一个n年代tyle="color:#228B22">% a2 = =的载脂蛋白e。remd是零。年代p一个n>(otherpol, remd2] = deconv (cpo xpoly);<年代p一个n年代tyle="color:#228B22">% remd是零。年代p一个n>
乘法和除法运算符<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">伽罗瓦领域的算术一个>不把元素或矩阵,多项式。
<年代tr在g id="fp13148">评估多项式。年代tr在g>评估一个多项式在伽罗瓦场的一个元素,使用polyval
。它像普通MATLABpolyval
当两个输入参数函数。下面的例子评估一个多项式在几个元素字段和检查结果。^
和。*
在这个领域。
m = 4;载脂蛋白e = gf(4 5 3,米);<年代p一个n年代tyle="color:#228B22">% ^ 2 x ^ 2 + (^ 2 + 1) x + (+ 1)年代p一个n>x0=女朋友((0 1 2], m);<年代p一个n年代tyle="color:#228B22">%点评价多项式年代p一个n>y= polyval (apoe x0) = gf(2米);<年代p一个n年代tyle="color:#228B22">%的原始元素字段,对应于一个。年代p一个n>y2=^2。* x0。^ 2 + (^ 2 + 1)。* x0 + (+ 1)<年代p一个n年代tyle="color:#228B22">%检查结果。年代p一个n>
下面的输出。
y = GF(2 ^ 4)数组。本原多项式= ^ 4 + D + 1 = 3(十进制)19日数组元素2 10 y2 = GF(2 ^ 4)数组。本原多项式= ^ 4 + D + 1 = 3(十进制)19日数组元素2 10
的第一个元素y
评估的多项式0
因此,返回多项式的常数项3
。
<年代tr在g id="fp5958">多项式的根。年代tr在g>找到一个多项式的根在伽罗瓦域,使用根
伽罗瓦向量代表了多项式函数。这个函数找到根源,在同一个字段的伽罗瓦向量。的次数一个条目出现在输出向量根
就是它的多样性作为一个多项式的根。
请注意年代tr在g>
如果伽罗瓦向量GF (2<年代up>米年代up>),它所代表的多项式可能有额外的根在一些扩张域GF (2<年代up>米年代up>)<年代up>k年代up>)。然而,根
没有找到这些额外的根源或显示他们的存在。
下面的例子中找到三次多项式的根的女朋友(8)。
p = 3;m = 2;字段= gftuple ([^ 1: p m - 2)的m p);<年代p一个n年代tyle="color:#228B22">%的所有元素列表的GF (9)年代p一个n><年代p一个n年代tyle="color:#228B22">%使用默认本原多项式。年代p一个n>多项式= [1 0 1 1];<年代p一个n年代tyle="color:#228B22">% 1 + x ^ 2 + x ^ 3年代p一个n>rt年代=gfroots(多项式,m, p)<年代p一个n年代tyle="color:#228B22">%在指数格式找到根源年代p一个n><年代p一个n年代tyle="color:#228B22">%检查每一个实际上是一个根。年代p一个n><年代p一个n年代tyle="color:#0000FF">为年代p一个n>2= 1:3根= rts (ii);rootsquared = gfmul(根、根、字段);rootcubed = gfmul(根、rootsquared、字段);回答(2)= gfadd (gfadd (0 rootsquared字段),rootcubed,字段);<年代p一个n年代tyle="color:#228B22">%回想一下,1是α的零次方。年代p一个n><年代p一个n年代tyle="color:#228B22">%如果回答=无穷,那么变量根代表年代p一个n><年代p一个n年代tyle="color:#228B22">%多项式的根。年代p一个n><年代p一个n年代tyle="color:#0000FF">结束年代p一个n>回答
<年代trong id="fp9720">二元多项式的根。年代tr在g>特殊情况的多项式有二进制系数,也容易找到根源存在于一个扩展字段。这是因为元素0
和1
有相同的明确表示在各领域的两个特征。找到一个二元多项式的根在扩展领域,应用根
函数的伽罗瓦向量扩展字段数组元素的二元多项式的系数。
下面的例子寻求在各领域的二元多项式的根。
gf2poly = gf ((1 1 1), 1);<年代p一个n年代tyle="color:#228B22">% x ^ 2 + x + 1 GF (2)年代p一个n>n或oots =根(gf2poly);<年代p一个n年代tyle="color:#228B22">%没有根在地下场,GF (2)年代p一个n>gf4poly=女朋友((1 1 1), 2);<年代p一个n年代tyle="color:#228B22">% x ^ 2 + x + 1 GF (4)年代p一个n>roots4 =根(gf4poly);<年代p一个n年代tyle="color:#228B22">%根是+ 1,GF (4)。年代p一个n>gf16poly=女朋友((1 1 1), 4);<年代p一个n年代tyle="color:#228B22">% x ^ 2 + x + 1 GF (16)年代p一个n>roots16 =根(gf16poly);<年代p一个n年代tyle="color:#228B22">%的GF (16)年代p一个n>check回答4= polyval (gf4poly roots4);<年代p一个n年代tyle="color:#228B22">% 0向量年代p一个n>check回答16= polyval (gf16poly roots16);<年代p一个n年代tyle="color:#228B22">% 0向量年代p一个n>
多项式的根在GF(2),不存在的noroots
是一个空数组。然而,多项式的根存在于GF(4)以及GF (16)roots4
和roots16
非空的。
请注意,roots4
和roots16
是不相等的。他们在这些方面有所不同:
roots4
GF(4)数组,而roots16
是一个女朋友(16)数组。MATLAB跟踪底层字段的伽罗瓦字段数组。
数组元素的roots4
和roots16
不同,因为它们使用表示对不同原始多项式。例如,2
(代表一个原始元素)是一种元素的向量roots4
因为默认的本原多项式GF(4)是相同的多项式gf4poly
代表。另一方面,2
不是一个元素的roots16
因为女朋友的原始元素(16)并不是一个多项式的根gf16poly
代表。
最小多项式。年代tr在g>元素的最小多项式的GF (2<年代up>米年代up>)是最小的多项式非零binary-coefficient次数在GF(2元素作为根<年代up>米年代up>)。找到最小多项式的一个元素或一个列向量的元素,使用minpol
函数。
下面的代码发现的最小多项式gf (4)
是D<年代up>2年代up>+ D + 1,然后检查gf (4)
确实是多项式的根中域GF (16)。
m = 4;e = gf (4);em = minpol (e)<年代p一个n年代tyle="color:#228B22">%找到最小多项式的大肠em GF (2)。年代p一个n>e米r=根(gf ((0 0 1 1 1) m))<年代p一个n年代tyle="color:#228B22">% ^ 2 + D + 1的根GF (2 ^)年代p一个n>
输出是
em = GF(2)数组。数组元素= 0 0 1 1 1 emr = GF(2 ^ 4)数组。本原多项式= D ^ 4 + D + 1(十进制)19日数组元素= 6 7
找出哪些元素的伽罗瓦域共享相同的最小多项式,使用叠合组
函数。
部分概述。年代tr在g>本节描述的技术操纵伽罗瓦为伽罗瓦之间传输信息字段变量或数组和普通MATLAB数组。
请注意年代tr在g>
这些技术特别相关的如果您编写MATLAB文件函数过程伽罗瓦域数组。对于这种类型的使用情况的一个例子,输入编辑gf / conv
在命令窗口并检查第一个几行代码编辑器窗口。
<年代trong id="fp9927">判断一个变量是伽罗瓦字段数组。年代tr在g>找出一个变量是否是一个伽罗瓦域数组而不是一个普通的MATLAB数组,使用isa
函数。说明如下。
mlvar =眼(3);gfvar = gf (mlvar, 3);没有= isa (mlvar,<年代p一个n年代tyle="color:#A020F0">“女朋友”年代p一个n>);<年代p一个n年代tyle="color:#228B22">%假因为mlvar不是伽罗瓦数组年代p一个n>是的= isa (gfvar,<年代p一个n年代tyle="color:#A020F0">“女朋友”年代p一个n>);<年代p一个n年代tyle="color:#228B22">%真实因为gfvar伽罗瓦数组年代p一个n>
从伽罗瓦域数组中提取信息。年代tr在g>提取数组元素、现场秩序,或从一个变量本原多项式,伽罗瓦字段数组,附加一个后缀名称的变量。下表列出了确切的后缀,是独立的变量的名称。
信息 | 后缀 | 输出值 |
---|---|---|
数组元素 | 。x |
MATLAB的数组类型uint16 从伽罗瓦域包含数据值数组。 |
现场秩序 | 。米 |
整数类型的双 这表明,GF的伽罗瓦域数组(2 ^ m )。 |
本原多项式 | .prim_poly |
整数类型的uint32 这代表了本原多项式。表示描述的类似<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">整数对应于伽罗瓦域元素如何一个>。 |
请注意年代tr在g>
如果输出值是一个整数数据类型,你想把它转换成双
为以后操作,使用双
函数。
下面的代码演示了使用这些后缀。的定义empr
使用一个向量的二元多项式的系数在一个扩展字段创建一个伽罗瓦域数组。另一部分示例的检索字段的本原多项式,并将其转换为二进制向量表示有合适的的比特数。
%检查e解决自己的最小多项式。年代p一个n>e=女朋友(4);<年代p一个n年代tyle="color:#228B22">%的GF (16)年代p一个n>e米p=minpol(e);<年代p一个n年代tyle="color:#228B22">%的最小多项式,emp, GF (2)。年代p一个n>e米pr=根(gf (emp.x定位));<年代p一个n年代tyle="color:#228B22">%在GF(16)找到emp的根源。年代p一个n><年代p一个n年代tyle="color:#228B22">%检查原始元素gf(2米)年代p一个n><年代p一个n年代tyle="color:#228B22">%真的本原多项式的根。年代p一个n>pr我米poly_int =双(e.prim_poly);mval =定位;primpoly_vect = gf (de2bi (primpoly_int mval + 1,<年代p一个n年代tyle="color:#A020F0">“left-msb”年代p一个n>),米v一个l);containstwo =根(primpoly_vect);<年代p一个n年代tyle="color:#228B22">%输出向量包括2。年代p一个n>
伽罗瓦域数组转化为双打年代tr在g>
= gf ((1,0)) b = (a.x) %的两倍。x在uint16
米一个TLAB回报如下:
一个= GF(2)数组。数组元素= 1 0 b = 1 0
<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">原始多项式和元素表示一个>描述如何表示元素的伽罗瓦域对您选择的本原多项式。本节描述了如何提高计算的速度涉及伽罗瓦域数组使用本原多项式非默认的本原多项式。这项技术如果你执行许多这样的计算建议。
增加速度的机制是一个数据文件,userGftable.mat
,一些计算功能使用,以避免重复执行某些计算。利用这种机制的组合字段顺序(米
)和本原多项式(prim_poly
):
在MATLAB应用程序导航到一个文件夹的写权限。您可以使用cd
函数或当前文件夹功能导航。
定义米
和prim_poly
作为工作空间变量。例如:
m = 3;prim_poly = 13;%有效值的例子
调用gftable
功能:
gftable (m, prim_poly);如果你之前定义的m和prim_poly %
修改或创建的函数userGftable.mat
在你当前的工作目录,包括数据与现场秩序和本原多项式的组合。在你最初投资的时候调用gftable
使用这些值,随后的计算米
和prim_poly
应该会更快。
请注意年代tr在g>
如果你改变当前工作目录之后调用gftable
,你必须userGftable.mat
在MATLAB路径以确保MATLAB可以看到它。这通过使用吗目录
目录包含命令前缀userGftable.mat
MATLAB的路径。如果你有多个副本userGftable.mat
在你的路径,使用(“userGftable.mat”、“-”)
找出他们和MATLAB使用哪一个。
看到多少gftable
提高你的速度计算,可以环绕你的计算抽搐
和toc
功能。看到<一个href="//www.tianjin-qmedu.com/help/comm/ref/gftable.html">gftable
参考页面为例。
[1]Blahut理查德•E。
[2]朗、哔叽、
[3]林、蜀和丹尼尔·j·科斯特洛。
[4]van线头,j . H。
[5]柳条斯蒂芬·B。
一个<年代p一个nclass="emphasis">伽罗瓦域年代p一个n>是一个代数领域拥有p<年代up>米年代up>元素,p ' m是一个正整数。这一章描述了如何使用p是伽罗瓦字段<年代p一个nclass="emphasis">奇怪的年代p一个n>。伽罗瓦字段有偶数个工作元素,明白了<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">伽罗瓦域计算一个>。在这一章的部分如下。
在本节中,p是一个奇质数和m是一个正整数。
此外,本文使用一些术语,不习惯一直在文献中。这里采用的定义出现在范线头<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">[5]一个>。
一个<年代p一个nclass="emphasis">原始的元素年代p一个n>的女朋友(p<年代up>米年代up>)是一个集团的循环发电机GF (p的非零元素<年代up>米年代up>)。这意味着每个非零元素字段可以表示为原始元素的整数次方。原始元素在本节。
一个<年代p一个nclass="emphasis">本原多项式年代p一个n>GF (p<年代up>米年代up>)是一些原始元素的最小多项式的GF (p<年代up>米年代up>)。因此,它有不可约m和程度。
部分概述。年代tr在g>本节讨论如何表示使用该工具箱的伽罗瓦域元素<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">指数一个>格式和<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">多项式一个>格式。它还描述了一个方法<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">列出所有元素一个>伽罗瓦的领域,因为有些功能使用这样一个列表作为输入参数。最后,讨论了<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">非唯一性一个>伽罗瓦域元素的表示。
GF (p)的元素可以使用从0到p - 1的整数。
至少2米时,GF (p<年代up>米年代up>)一个扩展字段。整数本身并不能代表GF的元素(p<年代up>米年代up>在一个简单的方法。MATLAB计算软件使用技术的代表元素的两个主要约定GF (p<年代up>米年代up>):指数格式和多项式的格式。
请注意年代tr在g>
指数格式和多项式的格式都是相对于你选择的一个特定的原始元素的GF (p<年代up>米年代up>)。
<年代trong id="bql4k7s-3">指数格式。年代tr在g>这种格式使用女朋友的每个非零元素的属性(p<年代up>米年代up>可以表示为一个)<年代up>c年代up>对于一些整数0和p之间c<年代up>米年代up>2。不需要更高的指数,因为伽罗瓦理论领域意味着每个非零元素的GF (p<年代up>米年代up>)满足方程x<年代up>q1年代up>= 1 q = p<年代up>米年代up>。
使用指数格式如下表所示。
GF (p<年代up>米年代up>) | 米一个Tl一个B的代表元素 |
---|---|
0 | 负 |
一个<年代up>0年代up>= 1 | 0 |
一个<年代up>1年代up> | 1 |
… | … |
一个<年代up>q2年代up>在哪里问 = p<年代up>米年代up> |
q2 |
虽然负
是标准的指数表示零元素,所有负整数是等价的吗负
当用作<年代p一个nclass="emphasis">输入年代p一个n>指数格式的参数。这个等价可以有用;例如,看到代码的简洁的线条的最后部分<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">默认的原始多项式一个>。
请注意年代tr在g>
所有的负整数和等价负
随着指数格式意味着,例如,1<年代p一个nclass="emphasis">不年代p一个n>代表一个<年代up>1年代up>的乘法逆元a .相反,1代表场的零元素。
<年代trong id="bql4k7s-5">多项式的格式。年代tr在g>多项式的格式使用女朋友的每一个元素的属性(p<年代up>米年代up>)可以表示为一个多项式指数介于0和m - 1,和GF (p)的系数。多项式形式的元素
(1)
+(2)
+(3)
一个<年代up>2年代up>+……+(米)
一个<年代up>m - 1年代up>
在MATLAB的代表向量
((1)(2)(3)……(m))
请注意年代tr在g>
这个工具箱的伽罗瓦域函数代表一个多项式作为向量的系数为列表<年代p一个nclass="emphasis">提升年代p一个n>权力的变量。这是对订单的其他使用MATLAB函数。
<年代trong id="bql4k7s-6">伽罗瓦场的所有元素的列表。年代tr在g>一些伽罗瓦域函数在这个工具箱需要一个论点,列出了所有元素的一个扩展字段GF (p<年代up>米年代up>)。这也是相对于一个特定的原始元素的GF (p<年代up>米年代up>)。适当的格式的列表元素的矩阵p<年代up>米年代up>行,为每个元素之一。矩阵m列,每个在多项式的系数所示格式<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">多项式的格式一个>以上。第一行只包含0因为它对应于零元素GF (p<年代up>米年代up>)。如果k是2和p之间的关系<年代up>米年代up>,那么k行指定元素的多项式形式<年代up>k-2年代up>。
最小多项式的艾滋病在这个矩阵的计算,因为它告诉如何表达<年代up>米年代up>在低权力的a .例如,下表列出了GF(3的元素<年代up>2年代up>),一个是本原多项式的根2 + 2 x + x<年代up>2年代up>。这个多项式允许重复使用的替换
一个<年代up>2年代up>= 2 - 2 = 1 +
当执行中间的计算列的表。
元素的GF (9)年代tr在g>
指数格式 | 多项式的格式 | 行MATLAB矩阵的元素 |
---|---|---|
一个<年代up>负年代up> | 0 | 0 0 |
一个<年代up>0年代up> | 1 | 1 0 |
一个<年代up>1年代up> | 一个 | 0 1 |
一个<年代up>2年代up> | 1 +一个 | 1 |
一个<年代up>3年代up> | +一个<年代up>2年代up>= = 1 + 2 + 1 + | 1 2 |
一个<年代up>4年代up> | 一个+ 2<年代up>2年代up>= = 2 + 2 + 2 | 2 0 |
一个<年代up>5年代up> | 2 | 0 2 |
一个<年代up>6年代up> | 2<年代up>2年代up>= 2 + 2 | 2 - 2 |
一个<年代up>7年代up> | 2 + 2<年代up>2年代up>= 2 + 2 + 2 = 2 + | 2 1 |
例子年代tr在g>
一个自动的方式生成矩阵的行第三列的表上面是使用下面的代码。
p = 3;m = 2;<年代p一个n年代tyle="color:#228B22">%使用本原多项式2 + 2 x + x ^ 2 GF (9)。年代p一个n>pr我米_poly = (2 2 1);字段= gftuple ([^ 1: p m - 2]“prim_poly p);
的gftuple
函数中更详细地讨论<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">格式转换和简化元素一个>。
<年代tr在g id="bql4k7s-10">非唯一性表征。年代tr在g>给定的字段有多个原始元素。如果两个原始元素有不同的最小多项式,那么相应的矩阵的元素将行以不同的顺序。如果两个原始元素共享相同的最小多项式,然后田野的矩阵的元素是相同的。
请注意年代tr在g>
你可以使用任何你想要的原始元素,只要你了解伽罗瓦字段的输入和输出函数依赖的选择<年代p一个nclass="emphasis">一些年代p一个n>本原多项式。通常最好是使用相同的在一个给定的脚本或本原多项式函数。
其他的方式表示元素并不是唯一的来自伽罗瓦域元素满足的方程。举个例子,一个指数格式8 GF(9)是一样的一个指数格式(0),因为一个<年代up>8年代up>= 1 =<年代up>0年代up>GF (9)。另外一个例子,之前提到的替换表<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">元素的GF (9)一个>表明多项式格式(0 0 1)是一样的多项式形式[1]。
年代ect我在><年代ection itemprop="content">这个工具箱提供了一个<年代p一个nclass="emphasis">默认的年代p一个n>为每一个扩展字段本原多项式。您可以检索这个多项式使用gfprimdf
函数。命令
prim_poly = gfprimdf (m, p);%如果m和p已经定义
生产标准的行向量表示默认最小多项式GF (p<年代up>米年代up>)。
例如,下面的命令显示的默认本原多项式GF(9)是2 + x + x<年代up>2年代up>,<年代p一个nclass="emphasis">不年代p一个n>中使用的多项式<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">伽罗瓦场的所有元素的列表一个>。
poly1 = gfprimdf (2、3);
poly1 = 2 1 1
生成的列表元素的GF (p<年代up>米年代up>使用默认的本原多项式,使用命令
字段= gftuple ([^ 1: p m - 2)的m p);
转换成简单的多项式形式。年代tr在g>的gftuple
函数产生一个元素的简单的多项式表示的GF (p<年代up>米年代up>),给定一个指数表示或多项式表示的元素。这可以用于生成GF (p元素的列表<年代up>米年代up>),其他功能需要。
使用gftuple
需要三个参数:一个代表一个元素的GF (p<年代up>米年代up>),一个指示的本原多项式时要使用MATLAB技术计算软件计算输出,和' p。下表说明gftuple
表现在第一个两个参数以各种格式。
gftuple行为取决于前两个输入的格式年代tr在g>
如何指定元素 | 如何显示本原多项式 | 什么gftuple产生 |
---|---|---|
指数格式;c =任何整数 | 整数m > 1 | 多项式的格式<年代up>c年代up>,一个是一个的根源<年代p一个nclass="emphasis">默认的年代p一个n>本原多项式GF (p<年代up>米年代up>) |
例子:tp = gftuple (6、2、3);% c =6在这里 |
||
指数格式;c =任何整数 | 本原多项式的系数向量 | 多项式的格式<年代up>c年代up>,一个是一个的根源<年代p一个nclass="emphasis">鉴于年代p一个n>本原多项式 |
例子:多项式= gfprimdf (2、3);tp = gftuple(6、多项式、3);% c =6在这里 |
||
任何程度的多项式格式 | 整数m > 1 | 多项式的格式< m,使用程度<年代p一个nclass="emphasis">默认的年代p一个n>本原多项式GF (p<年代up>米年代up>)简化 |
例子:tp = gftuple ((0 0 0 0 0 0 1), 2), 3); |
||
任何程度的多项式格式 | 本原多项式的系数向量 | 多项式的格式< m,使用程度<年代p一个nclass="emphasis">鉴于年代p一个n>本原多项式GF (p<年代up>米年代up>)简化 |
例子:多项式= gfprimdf (2、3);tp = gftuple((0 0 0 0 0 0 1),多项式,3); |
在上面的表中出现的四个例子都产生相同的向量tp = (2, 1)
,但他们的不同的输入gftuple
对应表的行。每个例子表达了这一事实<年代up>6年代up>= 2 +,是一个根(默认)的本原多项式2 + x + x<年代up>2年代up>GF (3<年代up>2年代up>)。
<年代tr在g class="emphasis bold">例子年代tr在g>
这个例子显示了如何gfconv
和gftuple
结合两个相乘polynomial-format GF(3的元素<年代up>4年代up>)。最初,gfconv
增加两个多项式,将原始的元素,就好像它是一个变量。这产生一个高阶多项式gftuple
简化了使用多项式方程满足原始元素。最终结果是最简单的多项式形式的产品。
p = 3;m = 4;一个= [1 2 0 1];b = [2 2 1 2];notsimple = gfconv (a、b、p)<年代p一个n年代tyle="color:#228B22">% * b,使用高α年代p一个n>简单= gftuple (notsimple m p)<年代p一个n年代tyle="color:#228B22">% m - 1α指数最高年代p一个n>
下面的输出。
notsimple = 2 0 2 0 0 1 2简单= 2 1 0 1
<年代trong id="bql4k7s-16">例子:生成伽罗瓦域元素的列表。年代tr在g>这个例子转换功能适用于生成矩阵的任务,列出了所有元素的伽罗瓦。列出所有字段元素的矩阵是一个输入参数等功能gfadd
和gfmul
。的变量field1
和field2
下面的格式等功能。
p = 5;<年代p一个n年代tyle="color:#228B22">%或任何质数年代p一个n>米=4;<年代p一个n年代tyle="color:#228B22">%或任何正整数年代p一个n>f我eld1 = gftuple ([^ 1: p m - 2)的m p);prim_poly = gfprimdf (m, p);<年代p一个n年代tyle="color:#228B22">%或任何本原多项式年代p一个n><年代p一个n年代tyle="color:#228B22">%对GF (p m ^)年代p一个n>f我eld2 = gftuple ([^ 1: p m - 2]“prim_poly p);
<年代trong id="bql4k7s-17">转换成简单的指数形式。年代tr在g>相同的功能gftuple
也会产生一个元素的简单的指数表示的GF (p<年代up>米年代up>),给定一个指数表示或多项式表示的元素。检索该输出,使用语法
[polyformat, expformat] = gftuple (…)
输入和输出格式polyformat
是在桌子上吗<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">gftuple行为取决于前两个输入的格式一个>。此外,该变量expformat
包含元素的简单的指数形式表示polyformat
。它是<年代p一个nclass="emphasis">简单的年代p一个n>在某种意义上,指数负
或数字0和p之间<年代up>米年代up>2。
<年代tr在g class="emphasis bold">例子年代tr在g>
恢复的指数格式元素2 +一节认为,使用下面的命令。在这种情况下,polyformat
包含冗余信息,expformat
包含所需的结果。
[polyformat, expformat] = gftuple (2 1, 2, 3)
polyformat = 2 1 expformat = 6
这个输出出现在表中的信息相矛盾<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">元素的GF (9)一个>,但事实上并非如此。表中使用不同的原始元素;两个+原始元素有多项式和指数格式如下所示。
prim_poly = (2 2 1);[polyformat2, expformat2] = gftuple (prim_poly (2 - 1), 3)
下面的输出反映了信息表的底线。
polyformat2 = 2 1 expformat2 = 7
部分概述。年代tr在g>你可以进行加、减、乘和除元素的伽罗瓦字段使用功能gfadd
,gfsub
,gfmul
,gfdiv
,分别。每种功能模式<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">主要字段一个>和一个<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">模式扩展字段一个>。
<年代tr在g id="bql4k7s-20">在主要领域的算法。年代tr在g>算术的GF (p)是一样的算术模p。功能gfadd
,gfmul
,gfsub
,gfdiv
接受两个参数,表示元素GF (p)的整数0和p - 1之间。第三个参数指定了p。
<年代tr在g class="emphasis bold">例如:添加表GF (5)年代tr在g>
下面的代码构造一个加法表GF (5)。如果一个
和b
是介于0和4,那么元素gfp_add (a + 1, + 1)
代表和a + b
GF (5)。例如,gfp_add (3、5) = 1
因为2 + 4 = 1模5。
p = 5;行= 0:p - 1;表= (p - 1) *的行;gfp_add = gfadd(表,表”,p)
这个示例的输出。
gfp_add = 0 1 2 3 4 1 2 3 4 0 0 1 3 4 0 1 2 3 4 2 4 0 1 2 3
其他的值p
为不同的素数域GF(生产表p
)。替换gfadd
通过gfmul
,gfsub
,或gfdiv
为对应的算术运算生成一个表在GF (p
)。
<年代tr在g id="bql4k7s-22">在扩展领域的算法。年代tr在g>相同的运算功能可以添加元素的GF (p<年代up>米年代up>m > 1时),但参数的格式是更复杂的比上面的例子。一般来说,算术在扩展字段是更复杂的比算术'字段;看到作品中列出<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">伽罗瓦字段的选择的参考书目一个>对细节的算术运算是如何工作的。
当工作在扩展字段,功能gfadd
,gfmul
,gfsub
,gfdiv
使用女朋友的前两个参数来表示元素(p<年代up>米年代up>以指数格式)。第三个参数是必需的,列出了所有元素的GF (p<年代up>米年代up>)中所描述的<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">伽罗瓦场的所有元素的列表一个>。指数格式的结果。
<年代tr在g class="emphasis bold">例如:添加表GF (9)年代tr在g>
下面的代码构造一个加法表GF (3<年代up>2年代up>),使用指数格式相对于默认的本原多项式的根GF (9)。如果一个
和b
1和7之间,那么元素gfpm_add (a + 2, + 2)
代表一个的总和<年代up>一个年代up>和一个<年代up>b年代up>GF (9)。例如,gfpm_add (4、6) = 5
因为
一个<年代up>2年代up>+一个<年代up>4年代up>=一个<年代up>5年代up>
使用矩阵的第四和第六行场
,你可以确认
一个<年代up>2年代up>+一个<年代up>4年代up>= (1 + 2)+ (2 + 0)= 3 + 2 = 0 + 2 =<年代up>5年代up>模3。
p = 3;m = 2;<年代p一个n年代tyle="color:#228B22">%在GF(3 ^ 2)工作。年代p一个n>字段= gftuple ([^ 1: p m - 2)的m p);<年代p一个n年代tyle="color:#228B22">%构造元素的列表。年代p一个n>行= 1:p ^ m - 2;表= 1 (p m ^, 1) *行;gfpm_add = gfadd(表、表的字段)
下面的输出。
gfpm_add =负0 1 2 3 4 5 6 7 1 0 4 7 3 5负2 1 6 7 5 0 4 6负3 2 2 3 0 6 1 5 7负4 3 4 5 1 7 2 6 0负4负6 5 2 0 3 7 1 5 2负7 6 3 1 4 0 6 3负0 7 4 2 5 7 6 2 4负1 0 5 3
请注意年代tr在g>
如果你使用一个不同的本原多项式,那么表看起来不同。这是有道理的,因为表的行和列的排序是基于特定选择的本原多项式,而不是在任何自然排序的元素GF (9)。
其他的值p
和米
为不同的扩展域GF(生产表p m ^
)。替换gfadd
通过gfmul
,gfsub
,或gfdiv
为对应的算术运算生成一个表在GF (p m ^
)。
部分概述。年代tr在g>一个多项式/ GF (p)是一个多项式的系数是GF (p)的元素。通信工具箱软件提供的功能
改变多项式<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">化妆品一个>方法
执行<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">多项式算法一个>
特征多项式为<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">原始的或不可约一个>
发现<一个href="//www.tianjin-qmedu.com/help/comm/ug/error-detection-and-correction.html" class="intrnllnk">根一个>伽罗瓦的多项式
请注意年代tr在g>
这个工具箱的伽罗瓦域函数代表一个多项式对GF (p)为奇数的p值向量系数列表的顺序<年代p一个nclass="emphasis">提升年代p一个n>权力的变量。这是对订单的其他使用MATLAB函数。
多项式的表面的改变。年代tr在g>显示传统格式包含系数多项式对应于一个行向量,使用gfpretty
。来截断多项式指数通过删除所有zero-coefficient项<年代p一个nclass="emphasis">更高的年代p一个n>多项式的次数,使用gftrunc
。例如,
polynom = gftrunc([1 20 394年10 0 0 29 3 0 0])gfpretty (polynom)
下面的输出。
polynom = 1 394 10 0 0 29 3 2 3 6 7 1 + 20 X + 394 + 10 + 29 X + 3 X
请注意年代tr在g>
如果不使用固定宽度字体,那么显示的间隔可能看起来不正确。
<年代trong id="bql4k7s-26">多项式算法。年代tr在g>的函数gfadd
和gfsub
分别加减多项式/ GF (p)。的gfconv
函数多项式乘法/ GF (p)。的gfdeconv
函数将多项式GF (p)、生产系数多项式和剩余多项式。例如,下面的命令显示2 + x + x<年代up>2年代up>* 1 + x /域GF(3)是2 + 2 x<年代up>2年代up>+ x<年代up>3年代up>。
= gfconv ([2 1 1], [1], 3) [”, remd] = gfdeconv ((2 1 1), 3)
下面的输出。
= 2 0 2 1”= 1 1 remd = 0
前面讨论的功能gfadd
和gfsub
多项式加减,分别。因为它使用一个向量的系数来表示一个多项式,MATLAB并不区分两行向量elementwise添加两个多项式和添加。
<年代tr在g id="bql4k7s-27">特征多项式。年代tr在g>给定一个多项式对GF (p)gfprimck
功能决定是否不可约和/或原始。根据定义,如果是原始的那么不可约;然而,相反的不一定是真的。的gfprimdf
和gfprimfd
函数返回原始多项式。
给女朋友的因素(p<年代up>米年代up>),gfminpol
函数计算其最小多项式在GF (p)。
<年代tr在g class="emphasis bold">例子年代tr在g>
例如,下面的代码反映了最小多项式不可约性。然而,最小多项式的nonprimitive元素不是本原多项式。
p = 3;m = 4;<年代p一个n年代tyle="color:#228B22">%使用默认本原多项式。年代p一个n>pr我米_poly = gfminpol (1 m p);ckprim = gfprimck (prim_poly p);<年代p一个n年代tyle="color:#228B22">% ckprim = 1,因为prim_poly代表一个本原多项式。年代p一个n>notprimpoly = gfminpol (5 m p);cknotprim = gfprimck (notprimpoly p);<年代p一个n年代tyle="color:#228B22">% cknotprim = 0(不可约但不是原始)年代p一个n><年代p一个n年代tyle="color:#228B22">%因为α^ 5时并不是一个原始的元素p = 3。年代p一个n>ckreducible = gfprimck ([0 1 1], p);<年代p一个n年代tyle="color:#228B22">% ckreducible = 1由于多项式可约。年代p一个n>
多项式的根。年代tr在g>给定一个多项式对GF (p)gfroots
函数找到多项式的根在一个合适的扩张域GF (p<年代up>米年代up>)。有两种方法可以告诉MATLAB的m扩张域GF (p<年代up>米年代up>),见下表。
格式gfroots的第二个参数年代tr在g>
第二个参数 | 代表 |
---|---|
一个正整数 | 米如GF (p<年代up>米年代up>)。MATLAB使用默认的本原多项式的计算。 |
一个行向量 | GF (p的本原多项式<年代up>米年代up>)。m的程度这本原多项式。 |
例子:一个多项式的根GF (9)年代tr在g>
下面的代码找到多项式的根1 + x<年代up>2年代up>+ x<年代up>3年代up>GF(9),然后检查他们确实是根源。的指数格式GF(9)中使用的元素。
p = 3;m = 2;字段= gftuple ([^ 1: p m - 2)的m p);<年代p一个n年代tyle="color:#228B22">%的所有元素列表的GF (9)年代p一个n><年代p一个n年代tyle="color:#228B22">%使用默认本原多项式。年代p一个n>多项式= [1 0 1 1];<年代p一个n年代tyle="color:#228B22">% 1 + x ^ 2 + x ^ 3年代p一个n>rt年代=gfroots(多项式,m, p)<年代p一个n年代tyle="color:#228B22">%在指数格式找到根源年代p一个n><年代p一个n年代tyle="color:#228B22">%检查每一个实际上是一个根。年代p一个n><年代p一个n年代tyle="color:#0000FF">为年代p一个n>2= 1:3根= rts (ii);rootsquared = gfmul(根、根、字段);rootcubed = gfmul(根、rootsquared、字段);回答(2)= gfadd (gfadd (0 rootsquared字段),rootcubed,字段);<年代p一个n年代tyle="color:#228B22">%回想一下,1是α的零次方。年代p一个n><年代p一个n年代tyle="color:#228B22">%如果回答=无穷,那么变量根代表年代p一个n><年代p一个n年代tyle="color:#228B22">%多项式的根。年代p一个n><年代p一个n年代tyle="color:#0000FF">结束年代p一个n>回答
输出显示了一个<年代up>0年代up>(= 1)<年代up>5年代up>和一个<年代up>7年代up>是根。
根= 0 5 7的答案=负负无穷
看到页面的引用<一个href="//www.tianjin-qmedu.com/help/comm/ref/gfroots.html">gfroots
来看看gfroots
还可以为您提供多项式形式的根和所有元素的列表。
看到这些信息的在线参考页面伽罗瓦域通信工具箱软件功能:
[1]Blahut理查德•E。
[2]朗、哔叽、
[3]林、蜀和丹尼尔·j·科斯特洛。
[4]van线头,j . H。