卷积码C语言

合集下载

卷积码的编码原理

卷积码的编码原理

卷积码的编码原理一、卷积码的编码原理1. 基本概念卷积码 (Convolutional Code,简称CC) 是一类非常重要的编码方式,它可以提供很好的信道纠错能力。

CC在误码率低于特定水平时,在降低带宽的前提下能够提供较高的信息传输率,并且能够很好地降低误码率。

卷积码主要应用在信号处理领域,如通信系统、卫星通信系统、信道编码等。

2. 编码过程编码过程是将原始信息信号以一种特定的编码方式,按一定的规则进行编码,生成一组编码位序列。

在卷积码中,采用可编程规则把输入信息流通过称为码子的矩阵表来实现编码,码子由编码器按照一定的规则进行编码生成,所得编码结果由编码后位序列表示。

3. 解码过程解码过程也是通过码子表实现的,即根据接收到的编码位序列,通过与码子相乘来得到原始信息的流。

由于在信号传输过程中可能存在差错,所以需要对接收到的编码位序列进行纠错操作来提高信号传输效率,这一过程就是纠错解码。

纠错解码方法一般分为两种:一种是基于译码算法的,如Viterbi算法、Sequential算法等;另一种是基于信息编码的方法,如组合编码技术、蒙特卡罗技术等。

4. 优缺点卷积码的优点有:(1)具有很强的纠错能力,能够避免在信道过程中由于信号传播可能的串扰、失真等引起的差错;(2)可以降低信道带宽,提高码率,以达到更高的信息传输率;(3)可以有效地降低误码率,保证传输信息的可靠性;(4)可以有效地平衡误码率和码率之间的关系,在较低的误码率下,可以获得较高的码率。

卷积码的缺点有:(1)实现复杂,需要耗费大量的计算资源;(2)解码复杂,需要用到分析、数学等方法;(3)不是所有类型的信号都适合使用卷积码。

2012.卷积码

2012.卷积码
信息组i-1对当前输出的贡献 g1=[m1, m1+Dm1,m1+D2m1]=m1[1, 1+D, 1+D2]=[0,1,0] 信息组i-2对当前输出的贡献 g2=[m2, m2+Dm2,m2+D2m2]=m2[1, 1+D, 1+D2]=[0,0,1]
输入 … i + 1m i m p i,1 mi p i,2 输出
12
我们称G∞为该卷积码的生成矩阵。 由此矩阵看出,
这是一个半无限矩阵。 它有无限多的行和列。 但是,仔 细观察G∞ 可知,它的每一行都是前一行右移n0(3)位的 结果,也就是说它完全由第一行决定。 若第一行决定了, 则该码的G∞矩阵也就完全决定了。 我们把决定G∞的第 一行取出,并表示成 g∞=[111,010,001,000,000,…]=[g0,g1,g2,0,0,…] (10.2.2)
7
一、 卷积码的生成矩阵
卷积码的一般编码器如图 10 - 3所示。 在某一时刻i,
输入到编码器的是由k0个信息元组成的信息组mi,相应地输 出序列是由n0 个码元组成的子码ci 。 若输入的信息序列
m0,m1,…,mi,…是一个半无限序列,则由卷积码编码器输出的
序列,也是一个由各子码c0,c1,…,ci,…组成的半无限长序列,称 此序列为卷积码的一个码序列。
c i(3)
(3,2,2)卷积码编码器
G (D) 1 0
g
0 1
2 1 D 1 D
101 000 001 000 011 001 000 000 g 0 , g 1 , g 2 , 0, ...

... ...

26
101 011 C M G M

卷积码C++源码(完整版)

卷积码C++源码(完整版)
{
for(j=0;j<n0;j++)
{
if(j>=k0)
g[k0*t+i][j]=h[j-k0][t*n0+i];
else
{
if(t==m-1&&i==j)
g[k0*t+i][j]=1;
else
g[k0*t+i][j]=0;
string Info_str,Code_str;
int total_num,extra_num;
public:
void Initializing();
void Trans_h_to_H();
void Trans_h_to_g();
void Print_g();
void Trans_g_to_G();
void main()
{
JuanjiCode J_Code;
char choice=' ';
int flag=0;
cout<<"\n";
while(choice!='3')
{
C: cout<<" "<<"*************************卷积码简易编码器*************************\n";
for(t=0;t<m;t++)
{
for(i=0;i<r0;i++)
{
for(j=0;j<(t+1)*n0;j++)
{

c语言里使用卷积 使用矩阵乘法加速

c语言里使用卷积 使用矩阵乘法加速

文章标题:深入探讨C语言中使用卷积的方法以及通过矩阵乘法加速在计算机科学领域中,C语言作为一种高效的编程语言,被广泛运用于各种领域,包括图像处理和信号处理等。

其中,卷积和矩阵乘法是C语言中常见的运算,对于加速计算过程具有重要意义。

本文将深入探讨C语言中使用卷积的方法,并介绍如何通过矩阵乘法加速这一过程。

1. 卷积的基本概念在图像处理和信号处理中,卷积是一种重要的运算,用于实现图像滤波、边缘检测等功能。

在C语言中,卷积的实现通常需要使用嵌套循环来遍历输入数据和卷积核,并进行相乘累加的运算。

这种实现方式在处理大规模数据时效率较低,需要寻求优化方法。

2. C语言中使用卷积的方法为了提高卷积运算的效率,可以采用多种方法来优化C语言中卷积的实现。

可以使用分块计算的方式来减少内存访问次数,提高数据局部性;还可以采用SIMD指令集来实现并行计算,加速卷积运算的速度。

还可以通过使用快速傅立叶变换等算法来加速卷积运算的过程。

3. 通过矩阵乘法加速在C语言中,矩阵乘法是一种常见的运算,可以通过优化算法和硬件指令集来实现高效的计算。

将卷积运算转化为矩阵乘法的形式,可以利用矩阵乘法的优化方法来加速卷积运算。

可以使用分块矩阵乘法来减少内存访问次数,提高数据局部性;还可以利用矩阵乘法的并行计算能力,实现卷积运算的加速。

4. 个人观点和理解在C语言中使用卷积并通过矩阵乘法加速是一项具有挑战性和重要意义的工作。

通过深入理解卷积运算的原理和C语言的特性,可以实现高效的图像处理和信号处理算法。

通过探索矩阵乘法在卷积运算中的应用,可以为C语言编程提供新的思路和方法。

总结与回顾本文讨论了C语言中使用卷积的方法以及通过矩阵乘法加速这一过程。

首先介绍了卷积的基本概念,然后探讨了在C语言中使用卷积的方法,包括优化算法和硬件指令集的应用;最后介绍了通过矩阵乘法加速卷积运算的方法,包括分块矩阵乘法和并行计算等技术。

个人观点认为,通过深入理解卷积运算和矩阵乘法的原理,可以为C语言编程带来新的思路和方法。

实验九-(2-1-5)卷积码编码译码技术

实验九-(2-1-5)卷积码编码译码技术

实验九 (2,1,5)卷积码编码译码技术一、实验目的1、掌握(2,1,5)卷积码编码译码技术2、了解纠错编码原理。

二、实验内容1、(2,1,5)卷积码编码。

2、(2,1,5)卷积码译码。

三、预备知识1、纠错编码原理。

2、(2,1,5)卷积码的工作原理。

四、实验原理/卷积码是将发送的信息序列通过一个线性的,有限状态的移位寄存器而产生的编码。

通常卷积码的编码器由K级(每级K比特)的移位寄存器和n个线性代数函数发生器(这里是模2加法器)组成。

若以(n,k,m)来描述卷积码,其中k为每次输入到卷积编码器的bit数,n 为每个k元组码字对应的卷积码输出n元组码字,m为编码存储度,也就是卷积编码器的k元组的级数,称m+1= K为编码约束度m称为约束长度。

卷积码将k 元组输入码元编成n元组输出码元,但k和n通常很小,特别适合以串行形式进行传输,时延小。

与分组码不同,卷积码编码生成的n元组元不仅与当前输入的k元组有关,还与前面m-1个输入的k元组有关,编码过程中互相关联的码元个数为n*m。

卷积码的纠错性能随m的增加而增大,而差错率随N的增加而指数下降。

在编码器复杂性相同的情况下,卷积码的性能优于分组码。

编码器随着信息序列不断输入,编码器就不断从一个状态转移到另一个状态并同时输出相应的码序列,所以图3所示状态图可以简单直观的描述编码器的编码过程。

因此通过状态图很容易给出输入信息序列的编码结果,假定输入序列为110100,首先从零状态开始即图示a状态,由于输入信息为“1”,所以下一状态为b并输出“11”,继续输入信息“1”,由图知下一状态为d、输出“01”……其它输入信息依次类推,按照状态转移路径a->b->d->c->b->c->a输出其对应的编码结果“”。

译码方法⒈代数代数译码是将卷积码的一个编码约束长度的码段看作是[n0(m+1),k0(m+1)]线性分组码,每次根据(m+1)分支长接收数字,对相应的最早的那个分支上的信息数字进行估计,然后向前推进一个分支。

卷积码

卷积码

(n ,k ,N )=(2,1,6)n 个输出比特。

当前的k 个输入信息,还与前(N-1)k 个信息有关。

002356101236y x x x x x y x x x x x =⊕⊕⊕⊕=⊕⊕⊕⊕2.2.1 Viterbi 译码卷积码概率译码的基本思路是:以接收码流为基础,逐个计算它与其他所有可能出现的、连续的网格图路径的距离,选出其中可能性最大的一条作为译码估值输出。

概率最大在大多数场合可解释为距离最小,这种最小距离译码体现的正是最大似然的准则。

卷积码的最大似然译码与分组码的最大似然译码在原理上是一样的,但实现方法上略有不同。

主要区别在于:分组码是孤立地求解单个码组的相似度,而卷积码是求码字序列之间的相似度。

基于网格图搜索的译码是实现最大似然判决的重要方法和途径。

用格图描述时,由于路径的汇聚消除了树状图中的多余度,译码过程中只需考虑整个路径集合中那些使似然函数最大的路径。

如果在某一点上发现某条路径已不可能获得最大对数似然函数,就放弃这条路径,然后在剩下的“幸存”路径中重新选择路径。

这样一直进行到最后第L级(L为发送序列的长度)。

由于这种方法较早地丢弃了那些不可能的路径,从而减轻了译码的工作量,Viterbi译码正是基于这种想法。

对于(n, k, K )卷积码,其网格图中共2kL种状态。

由网格图的前K-1条连续支路构成的路径互不相交,即最初2k_1条路径各不相同,当接收到第K条支路时,每条路径都有2条支路延伸到第K级上,而第K级上的每两条支路又都汇聚在一个节点上。

在Viterbi译码算法中,把汇聚在每个节点上的两条路径的对数似然函数累加值进行比较,然后把具有较大对数似然函数累加值的路径保存下来,而丢弃另一条路径,经挑选后第K级只留下2K条幸存路径。

选出的路径同它们的对数似然函数的累加值将一起被存储起来。

由于每个节点引出两条支路,因此以后各级中路径的延伸都增大一倍,但比较它们的似然函数累加值后,丢弃一半,结果留存下来的路径总数保持常数。

卷积码

卷积码卷积码将k个信息比特编成n个比特,但k和n通常很小,特别适合以串行形式进行传输,时延小。

定义若以(n,k,m)来描述卷积码,其中k为每次输入到卷积编码器的bit数,n为每个k元组码字对应的卷积码输出n元组码字,m为编码存储度,也就是卷积编码器的k元组的级数,称m+1= K为编码约束度m称为约束长度。

卷积码将k元组输入码元编成n元组输出码元,但k和n通常很小,特别适合以串行形式进卷积码的编码器行传输,时延小。

与分组码不同,卷积码编码生成的n元组元不仅与当前输入的k元组有关,还与前面m-1个输入的k元组有关,编码过程中互相关联的码元个数为n*m。

卷积码的纠错性能随m的增加而增大,而差错率随N的增加而指数下降。

在编码器复杂性相同的情况下,卷积码的性能优于分组码。

介绍一种卷积码编码器卷积码是1955年由Elias等人提出的,是一种非常有前途的编码方法。

我们在一种卷积码编码器一些资料上可以找到关于分组码的一些介绍,分组码的实现是将编码信息分组单独进行编码,因此无论是在编码还是译码的过程中不同码组之间的码元无关。

根本区别卷积码和分组码的根本区别在于,它不是把信息序列分组后再进行单独编码,而是由连续输入的信息序列得到连续输出的已编码序列。

即进行分组编码时,其本组中的n-k个校验元仅与本组的k个信息元有关,而与其它各组信息无关;但在卷积码中,其编码器将k个信息码元编为n个码元时,这n个码元不仅与当前段的k个信息有关,而且与前面的(m-1)段信息有关(m为编码的约束长度)。

有关信息同样,在卷积码译码过程中,不仅从此时刻收到的码组中提取译码信息,而且还要卷积码编码器利用以前或以后各时刻收到的码组中提取有关信息。

而且卷积码的纠错能力随约束长度的增加而增强,差错率则随着约束长度增加而呈指数下降。

约束关系卷积码(n,k,m) 主要用来纠随机错误,它的码元与前后码元有一定的约束关系,编码复杂度可用编码约束长度m*n来表示。

C语言卷积码(附注释)

ret_msg(j,1:chip+i) = msg_temp1;
ret_dis(j) = dis_temp1;
else
ret_msg(j,1:chip+i) = msg_temp2;
ret_dis(j) = dis_temp2;%选择较小汉明距的状态储存并输出在ret_msg中,最小汉明距存于ret_dis
word1=word
msg_1 = decode_conv213(word1)
msg-msg_1
function[output,nextState] = state_machine(input,current_state)
output(1) = mod(current_state(1)+current_state(3),2);
output(2) = mod(input+current_state(2)+current_state(1),2);
nextState(1) = current_state(2);
nextState(2) = current_state(3);
nextState(3) = input;
functiondistance = hamming_distance(a,b)
fori = 1:2^chip
M(i,:) = de2bi(i-1,chip);%把所有可能性按二进制输出
W(i,:) = encode_conv213(M(i,:));%得到相应的二进制编译后的码字
D(i) = hamming_distance(W(i,:),word(1:chip*2));%与出错码字对比得到汉明距
ret_msg(i,1:chip) = M(index(i),:);

卷积码

2.7.卷积码分组码是把k个信息比特的序列编成n个比特的码组,每个码组的n-k个校验位仅与本码组的k个信息位有关,而与其他码组无关。

为了达到一定的纠错能力和编码效率,分组码的码组长度一般都比较大。

编译码时必须把整个信息码组存储起来,由此产生的译码时延随n的增加而增加。

卷积码是另外一种编码方法,它也是将k个信息比特编成n个比特,但k和n通常很小,特别适合以串行形式进行传输,时延小。

与分组码不同,卷积码编码后的n个码元不仅与当前段的k个信息有关,还与前面的N-1段信息有关,编码过程中互相关联的码元个数为nN。

卷积码的纠错性能随N的增加而增大,而差错率随N的增加而指数下降。

在编码器复杂性相同的情况下,卷积码的性能优于分组码。

但卷积码没有分组码那样严密的数学分析手段,目前大多是通过计算机进行好码的搜索。

2.7.1.卷积码的结构和描述一、卷积码的一般结构卷积码编码器的形式如图所示,它包括:一个由N段组成的输入移位寄存器,每段有k个,共Nk个寄存器;一组n个模2和相加器,一个由n级组成的输出移位寄存器。

对应于每段k个比特的输入序列,输出n个比特。

由上图可以看到,n个输出比特不仅与当前的k个输入信息有关,还与前(N-1)k个信息有关。

通常将N称为约束长度,(有的书的约束长度为Nn)。

常把卷积码记为:(n,k,N),当k=1时,N-1就是寄存器的个数。

二、卷积码的描述描述卷积码的方法有两类:图解法和解析表示。

图解法包括:树图、状态图、网格图解析法包括:矩阵形式、生成多项式形式。

以如下的结构说明各种描述方法。

1、树图根据上图,我们可以得到下表:我们可以画出如下的树状图:2、 状态图3、 网格图例1, 输入为1 1 0 1 1 1 0,输出为: 11 01 01 00 01 10 014、 生成多项式表示 定义],,[1211101g g g g=,],,[2221202g g g g=则上述结构为71=g,52=g,这里用8进制表示21,g gabcd⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=2101211101],,[m m m g g g c ,⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=2102221202],,[m m m g g g c定义2212111011)(DD Dg D g g D g ++=++=2222212021)(DDg D g g D g +=++=则输入信息,...,,210b b b 的多项式为....)(332210++++=b D b D b b D M那么我们可以得到输出)()()(11D g D M D C = )()()(22D g D M D C =最终输出是)(),(21D C D C的相同次数项的排列。

卷积码C语言

include <stdio.h>include "Conio.h"define N 7include "math.h"include <stdlib.h>include<time.h>define randomize srandunsignedtimeNULLencodeunsigned int symbols; /编码输出/unsigned int data; /编码输入/unsigned int nbytes; /nbytes=n/16;n为实际输入码字的数目/ unsigned int startstate /定义初始化状态/{int j;unsigned int input;a1=0;a2=0;forj=0;j<nbytes;j++{ input=data;data++;symbols = input^a1^a2;symbols++;symbols = input^a2;symbols++;a2=a1;a1=input;}return 0;}int trandistanceint m; /符号m与从state1到state2时输出符号的汉明距离;如果state1无法到state2则输出度量值为100/int state1;int state2{int c;int sym;sym1;sym2;sym1=state2>>1&1^state2&1^state1&1;sym2=state2>>1&1^state1&1;sym=sym1<<1 | sym2;if state1&2>>1==state2&1c=m&1^sym&1+m>> 1&1^sym >> 1&1;elsec=10000;returnc;}int traninputint a;int b /状态从a到b时输入卷积码的符号/{int c;c=b&2>>1;returnc;}int tranoutputint a;int b /状态从a到b时卷积码输出的符号/{int c;s1;s2;s1=a&1^a&2>>1^b&2>>1;s2=a&1^b&2>>1;c=s1<<1|s2;returnc;}void viterbiint initialstate; /定义解码器初始状态/int viterbiinput; /解码器输入码字序列/int viterbioutput /解码器输出码字序列/{struct sta /定义网格图中每一点为一个结构体;其元素包括/{int met; /转移到此状态累计的度量值/int value; /输入符号 /struct sta last; /及指向前一个状态的指针/};struct sta state4N;struct sta g;head;int i;j;p;q;t;r;u;l;fori=0;i<4;i++ / 初始化每个状态的度量值/forj=0;j<N;j++stateij.met=0;forl=0;l<4;l++{statel0.met=trandistanceviterbiinput;initialstate;l;statel0.value=traninputinitialstate;l;st=NULL;}viterbiinput++; /扩展第一步幸存路径/fort=1;t<N;t++{forp=0;p<4;p++{statept.met=state0t-1.met+trandistanceviterbiinput;0;p; statept.value=traninput0;p;st=&state0t-1;forq=0;q<4;q++{ifstateqt-1.met+trandistanceviterbiinput;q;p<statept.met{statept.met=stateqt-1.met+trandistanceviterbiinput;q;p;statept.value=traninputq;p;st=&stateqt-1;}}}viterbiinput++;} /计算出剩余的幸存路径/r=state0N-1.met; /找出n步后度量值最小的状态;准备回溯路由/g=&state0N-1;foru=N;u>0;u-- /向前递归的找出最大似然路径 /{viterbioutput+u-1=g->value;g=g->last;}/ foru=0;u<8;u++viterbioutput+u=stateu2.met; / /此行程序可用于检测第n 列的度量值/}void decodeunsigned int input; int output;int n{int viterbiinput100;int j;forj=0;j<n+2;j++{viterbiinputj=inputj2<<1|inputj2+1;//printf"%3d";viterbiinputj;}viterbi0;viterbiinput;output;}void main{unsigned int encodeinput100;wrong10={0;0;0;0;0;0;0;0;0;0};encodeoutput100;int n=5;i;m;j=0;decodeinput100;decodeoutput100;randomize;fori=0; i<n; i++encodeinputi=rand%2;encodeinputn= encodeinputn+1=0;encodeencodeoutput;encodeinput;n+2;0;printf"the input of encoder is :\n";fori=0;i<n; i++printf"%2d";encodeinputi;printf"\n";printf"the output of encoder is :\n";fori=0;i<n+22;i++{printf"%2d";encodeoutputi;ifi%20==19printf"\n";}printf"\n";printf"please input the number of the wrong bit\n";scanf"%d";&m;printf"please input the positions of the wrong bit0-9\n";fori=0;i<m;i++{ scanf"%d";&wrongm;ifencodeoutputwrongm==0encodeoutputwrongm=1;elseencodeoutputwrongm=0;}printf"the input of decoder is :\n";fori=0;i<n+22;i++{printf"%2d";encodeoutputi;ifi%20==19printf"\n";}printf"\n";decodeencodeoutput;decodeoutput;n+2;printf"the output of decoder is :\n";fori=0;i<n;i++printf"%2d";decodeoutputi;printf"\n";fori=0;i<n;i++{ ifencodeinputi=decodeoutputij++;}printf"the number of incorrect bit is:%d\n";j; }。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
unsigned int input,a1=0,a2=0;
for(j=0;j<nbytes;j++)
{ input=*data;
data++;
*symbols = input^a1^a2;
symbols++;
*symbols = input^a2;
symbols++;
a2=a1;
a1=input;
}
#include <stdio.h>
#include "Conio.h"
#define N 7
#include "math.h"
#include <stdlib.h>
#include<time.h>
#define randomize() srand((unsigned)time(NULL))
encode(
s2=(a&1)^((b&2)>>1);
c=(s1<<1)|s2;
return(c);
}
void viterbi(int initialstate, /*定义解码器初始状态*/
int *viterbiinput, /*解码器输入码字序列*/
int *viterbioutput /*解码器输出码字序列*/
} /*计算出剩余的幸存路径*/
r=state[0][N-1].met; /*找出n步后度量值最小的状态,准备回溯路由*/
g=&state[0][N-1];
for(u=N;u>0;u--) /*向前递归的找出最大似然路径*/
{*(viterbioutput+(u-1))=g->value;
g=g->last;
unsigned int *symbols, /*编码输出*/
unsigned int *data, /*编码输入*/
unsigned int nbytes, /*nbytes=n/16,n为实际输入码字的数目*/
unsigned int startstate /*定义初始化状态*/
)
{
int j;
)
{struct sta /*定义网格图中每一点为一个结构体,其元素包括*/
{int met; /*转移到此状态累计的度量值*/
int value; /*输入符号*/
struct sta *last; /*及指向前一个状态的指针*/
};
struct sta state[4][N];
struct sta *g,*head;
int i,j,p,q,t,r,u,l;
for(i=0;i<4;i++) /*初始化每个状态的度量值*/
for(j=0;j<N;j++)
state[i][j].met=0;
for(l=0;l<4;l++)
{state[l][0].met=trandistance(*viterbiinput,initialstate,l);
int j;
for(j=0;j<n+2;j++)
{viterbiinput[j]=(input[j*2]<<1)|input[j*2+1];
//printf("%3d",viterbiinput[j]);
}
viterbi(0,viterbiinput,output);
}
void main()
{unsigned int encodeinput[100],wrong[10]={0,0,0,0,0,0,0,0,0,0},encodeoutput[100];
}
/* for(u=0;u<8;u++)
*(viterbioutput+u)=state[u][2].met; */ /*此行程序可用于检测第n列的度量值*/
}பைடு நூலகம்
void decode(unsigned int *input, int *output,int n)
{
int viterbiinput[100];
return 0;
}
int trandistance(int m, /*符号m与从state1到state2时输出符号的汉明距离,如果state1无法到state2则输出度量值为100*/
int state1,
int state2)
{int c;
int sym,sym1,sym2;
sym1=((state2>>1)&1)^(state2&1)^(state1&1);
}
int traninput(int a,int b) /*状态从a到b时输入卷积码的符号*/
{int c;
c=((b&2)>>1);
return(c);
}
int tranoutput(int a,int b) /*状态从a到b时卷积码输出的符号*/
{int c,s1,s2;
s1=(a&1)^((a&2)>>1)^((b&2)>>1);
state[p][t].value=traninput(0,p);
state[p][t].last=&state[0][t-1];
for(q=0;q<4;q++)
{if(state[q][t-1].met+trandistance(*viterbiinput,q,p)<state[p][t].met)
int n=5,i,m,j=0,decodeinput[100],decodeoutput[100];
state[l][0].value=traninput(initialstate,l);
state[l][0].last=NULL;
}
viterbiinput++; /*扩展第一步幸存路径*/
for(t=1;t<N;t++)
{for(p=0;p<4;p++)
{state[p][t].met=state[0][t-1].met+trandistance(*viterbiinput,0,p);
{state[p][t].met=state[q][t-1].met+trandistance(*viterbiinput,q,p);
state[p][t].value=traninput(q,p);
state[p][t].last=&state[q][t-1];
}
}
}
viterbiinput++;
sym2=((state2>>1)&1)^(state1&1);
sym=(sym1<<1) | sym2;
if ( ((state1&2)>>1)==(state2&1))
c=((m&1)^(sym&1))+(((m>> 1)&1)^((sym >> 1)&1));
else
c=10000;
return(c);
相关文档
最新文档