www.pudn.com > viterbidecoder.zip > VER.C
#include "stdio.h"
int Trans_table[16]={0};
unsigned Tran;
void BFLYA(int dp,int *p1,int *p2, int *p3);
void BFLYB(int dm,int *p1,int *p2,int *p3);
int trace_back();
void main()
{
int sd[32]={-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,
-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1};
int bef[4]={40,0,0,0};
int aft[4]={0};
int t0,t1;
int n,i;
int output;
int * pb,* pa1,* pa2;
int * pd,* p4;
pd = sd;
p4 = Trans_table;
for (n=0;n<16;n++)
{ pb = bef;
pa1 = aft;
pa2 = aft+2;
t1 = *(pd++);
t0 = t1+*pd;
t1 = t1 - *(pd++);
/* printf("t0=%d,t1=%d.\n",t0,t1); */
Tran = 0;
BFLYA(t0,pb,pa1,pa2);
pb = pb+2;
pa1++;
pa2++;
BFLYB(t1,pb,pa1,pa2);
*(p4++) =Tran;
for (i =0;i<4;i++)
{bef[i]=aft[i];
/* printf("aft[%d]=%d,",i,aft[i]); */
}
/* printf("\n");*/
}
output=trace_back();
printf("output=%x",output);
/* for(i=0;i<16;i++)
printf("trans_table[%d]=%x\n",i,Trans_table[i] );*/
}
void BFLYA (int dp,int *p1, int *p2, int *p3)
{
int a,b,c,d;
Tran = 0;
a = *p1+dp;
b = *(p1++)-dp;
c = *p1-dp;
d = *p1+dp;
Tran = Tran<<1;
*p2 = a;
*p3 = b;
if(c>a)
{ Tran = Tran|0x01;
*p2 = c;
}
Tran = Tran<<1;
if(d>b)
{ Tran = Tran|0x01;
*p3 = d;
}
}
void BFLYB(int dm,int *p1,int *p2,int *p3)
{ int a,b,c,d;
a = *p1-dm;
b = *(p1++)+dm;
c = *p1+dm;
d = *p1-dm;
Tran = Tran<<1;
*p2 = a;
*p3 = b;
if(c>a)
{
Tran = Tran|0x01;
*p2 = c;
}
Tran = Tran<<1;
if(d>b)
{
Tran = Tran|0x01;
*p3 = d;
}
}
int trace_back()
{
int *p4;
int state;
unsigned temp = 0;
int i,num;
p4 = Trans_table+16;
state = 0;
for(i=0;i<16;i++)
{
p4--;
if(state&0x02)
temp = (temp>>1)|0x8000;
else
temp = temp>>1;
/* num = state*2+(state>>1)&0x01
num = 3-(num&0x03);*/
num = state;
if(state==0)
num = 3;
if(state==3)
num = 0;
state = state<<1;
if((*p4>>num)&0x01)
state = state|0x01;
state = state&0x03;
printf("state=%x\n",state);
}
return temp;
}