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; 
	}