⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uvlc.cpp

📁 DPCM编码的联合信源信道译码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "UVLC.h"
#include "stdlib.h"
#include "stdio.h"
#include "sim_system.h"
#include "init_UVLC.h"
#include "sim_config.h"
#include "conio.h"

#define MAXF 1e10
#define PI 3.1415926
#define DBG 0

void UVLCGen1()
{
  int comp, mask; 
  int L,INFO;

  int l=1,code_number;
  int temp=2;

	sys_UVLC.code[0][0]=1;       //VLC code table code_number = 0,1,2
	sys_UVLC.code[0][1]=1;

	sys_UVLC.code[1][0]=3;
	sys_UVLC.code[1][1]=0;
	sys_UVLC.code[1][2]=0;
	sys_UVLC.code[1][3]=1;	

	sys_UVLC.code[2][0]=3;
	sys_UVLC.code[2][1]=0;
	sys_UVLC.code[2][2]=1;
	sys_UVLC.code[2][3]=1;	

	for(int i=3;i<sys_UVLC.alphabet_size;i++)        // code_number>=3
	{
		mask=1;
		code_number=i;
		
		while(temp<code_number){          //H.26L VLC
			l++;
			temp+=twotothe(l);
		}
		L=l+l+1;
		printf(" %d",L);
		INFO=code_number+1-twotothe(l);
		sys_UVLC.code[i][0]=L;
		//mask << (l-1);
		mask = mask * twotothe(l-1);

		for(int j=1;j<=l;j++)
		{
			sys_UVLC.code[i][2*j-1]=0;
//			printf("%d",sys_UVLC.code[i][2*j-1]);
			comp=mask & INFO;    // pick-up the most significant bit
			if(comp>0) 
				sys_UVLC.code[i][2*j]=1;
			else sys_UVLC.code[i][2*j]=0;
//			printf("%d",sys_UVLC.code[i][2*j]);
			//INFO << 1;
			INFO = INFO * 2; 
		}
		sys_UVLC.code[i][L]=1;          // output the last 1 bit, and finish the encoding process
//		printf("%d\n",sys_UVLC.code[i][L]);		
	}
}

void UVLCGen2()
{
	int i,j,nn;
	int len, INFO,suffix_len;
	
	unsigned int temp,mask;
	
	
	for(i=0;i<sys_UVLC.alphabet_size;i++)
	{
		nn=(i+1)/2;
		for(j=0;j<sys_UVLC.alphabet_size && nn!=0;j++)
		{
			nn/=2;
		}
		len=2*j+1;
		INFO=i+1-(int)pow(2,j);
		suffix_len=len/2;
		sys_UVLC.code[i][0]=len;   //length
		
//		printf("%d=  %d\t",i,sys_UVLC.code[i][0]);
		
		temp=(1<<suffix_len)|(INFO&((1<<suffix_len)-1));
		mask = 1 << (len -1);
		
		for(j=0;j<len;j++)
		{
			if(temp & mask) sys_UVLC.code[i][j+1]=1;
			else sys_UVLC.code[i][j+1]=0;
			mask >>= 1;
//			printf("%d ",sys_UVLC.code[i][j+1]);
		}
//		printf("\n");
		
	}
}


void FLCGen1()
{
	int i,j;

	sys_UVLC.code[0][0]=3;
	sys_UVLC.code[0][1]=0;
	sys_UVLC.code[0][2]=0;
	sys_UVLC.code[0][3]=0;

	sys_UVLC.code[1][0]=3;
	sys_UVLC.code[1][1]=1;
	sys_UVLC.code[1][2]=1;
	sys_UVLC.code[1][3]=1;

	sys_UVLC.code[2][0]=3;
	sys_UVLC.code[2][1]=0;
	sys_UVLC.code[2][2]=1;
	sys_UVLC.code[2][3]=0;

	sys_UVLC.code[3][0]=3;
	sys_UVLC.code[3][1]=1;
	sys_UVLC.code[3][2]=0;
	sys_UVLC.code[3][3]=1;

	for(i=0;i<sys_UVLC.alphabet_size;i++)
	{
		printf("%d=  %d\t",i,sys_UVLC.code[i][0]);
		for(j=0;j<3;j++)	printf("%d ",sys_UVLC.code[i][j+1]);
		printf("\n");
				
	}



}

void FLCGen2()
{
	int i,j;

	sys_UVLC.code[0][0]=2;
	sys_UVLC.code[0][1]=0;
	sys_UVLC.code[0][2]=0;
	//sys_UVLC.code[0][3]=0;

	sys_UVLC.code[1][0]=2;
	sys_UVLC.code[1][1]=1;
	sys_UVLC.code[1][2]=1;
	//sys_UVLC.code[1][3]=1;

	sys_UVLC.code[2][0]=2;
	sys_UVLC.code[2][1]=0;
	sys_UVLC.code[2][2]=1;
	//sys_UVLC.code[2][3]=0;

	sys_UVLC.code[3][0]=2;
	sys_UVLC.code[3][1]=1;
	sys_UVLC.code[3][2]=0;
	//sys_UVLC.code[3][3]=1;

	for(i=0;i<sys_UVLC.alphabet_size;i++)
	{
		printf("%d=  %d\t",i,sys_UVLC.code[i][0]);
		for(j=0;j<2;j++)	printf("%d ",sys_UVLC.code[i][j+1]);
		printf("\n");
				
	}



}



int UVLCEncoder(FILE *fp,int k,int i,int m)
{
	  //int sym;
	  int j;
	  
	  sys_UVLC.encoded[m]=fgetc(fp);
	  for(j=0;j<sys_UVLC.code[sys_UVLC.encoded[m]][0];j++)
	  {
		  sys_spt.source_bits[k++]=sys_UVLC.code[sys_UVLC.encoded[m]][j+1];
	  }
	  		  
	  sys_UVLC.bpl[i]+=sys_UVLC.code[sys_UVLC.encoded[m]][0];

	  return k;

}

void UVLCDecoder(FILE *fp,int block_num)
{

	int count;
	int i,j,rank,m,n,d;
	double min,t_cost,f2;
	int bits;
	int dec,ran;
	int decst,ranst;
	int flag;
	double len_modi,c,sum=0;
//	double temp,N0,N1;
	int k1;
//	int BPSK;
	double p=(BSC_P/10);
	double *co;

//	sys_spt.noisevar = 1/(2*sys_spt.code_rate*pow(10,(sys_spt.EbNo+2)/10.));

//	N0=2*sys_spt.noisevar;
//    N1=sys_spt.noisevar/2.0;

	
 //printf("test point1 passed successfully!\n");             // test point1

//     sys_spt.noisevar = 1/(2*sys_spt.code_rate*pow(10,(sys_spt.EbNo+2)/10.));

/*	 for(i=0;i<sys_spt.message_bits;i++)
	 {
		 sys_UVLC.received[i] = sys_UVLC.received[i]*N1;	 	
	 }
*/

	for(i=0;i<sys_UVLC.bpl[block_num];i++)
	 {
		 sys_UVLC.received[i] = sys_spt.received[i];	 	
	 }
	
		  

    for(i=0;i<sys_UVLC.alphabet_size;i++)
       for(j=0;j<sys_UVLC.BESTC;j++)
	 {
	   sys_UVLC.cost_o[i][j]=MAXF;
	   sys_UVLC.used_bits_old[i][j]=0;
	 }
     sys_UVLC.cost_o[0][0]=0.0;

	 co=dvector(0,sys_UVLC.maxin);
	 for(i=0;i<sys_UVLC.maxin+1;i++)
		 if(p==0.)
			 co[i]=(double)(i)*(-1000.0);
		 else
			 co[i]=(double)(i)*log10(p/(1-p));
		 

 //printf("test point2 passed successfully!\n");             // test point2    

	 for(count=0;count<256;count++) 
     {
		for (i=0;i<sys_UVLC.alphabet_size;i++)
	   {
			for(m=0;m<sys_UVLC.alphabet_size;m++)
				for(n=0;n<sys_UVLC.BESTC;n++)
					sys_UVLC.cost_t[m][n]=sys_UVLC.cost_o[m][n];
			
			for(rank=0;rank<sys_UVLC.BESTC;rank++)
			{
				min = MAXF;
				for(k1=0; k1<(rank+1);k1++) 
					for (j=0;j<sys_UVLC.alphabet_size;j++)
					{
						if(sys_UVLC.cost_t[j][k1]!=MAXF)
						{
						/*	c=0;
							for(bits=0;bits<sys_UVLC.code[i][0];bits++)
							{
//								sys_UVLC.word[bits]=sys_UVLC.received[sys_UVLC.used_bits_old[j][k1]+bits];
								
								if(sys_UVLC.code[i][bits+1]==0)  BPSK=1;
								else BPSK=-1;
								temp = -((sys_UVLC.received[sys_UVLC.used_bits_old[j][k1]+bits]-BPSK)*(sys_UVLC.received[sys_UVLC.used_bits_old[j][k1]+bits]-BPSK))/N0;
								//temp = -((sys_UVLC.word[bits]-BPSK)*(sys_UVLC.word[bits]-BPSK))/N0;
								temp = log10((double)1/(sqrt(PI*N0))*exp(temp));
								c += temp;
							}
                         */ 

			   		    	d=0;
							for(bits=0;bits<sys_UVLC.code[i][0];bits++)
							{
								sys_UVLC.word[bits]=sys_UVLC.received[sys_UVLC.used_bits_old[j][k1]+bits];
								if(sys_UVLC.word[bits]!=sys_UVLC.code[i][bits+1])
									d++;
							}

							len_modi=(double)(sys_UVLC.code[i][0])*log10(2.0);
							f2=(double)(sys_UVLC.code[i][0])*log10(1-p);
							c=co[d]+f2;
         					t_cost=sys_UVLC.cost_t[j][k1]+sys_UVLC.hist1[i][j]-c-len_modi;

		           /* 		for(bits=0;bits<sys_UVLC.code[i][0];bits++)
							{
								sys_UVLC.word[bits]=sys_UVLC.received[sys_UVLC.used_bits_old[j][k1]+bits];
								d=(sys_UVLC.word[bits]-sys_UVLC.code[i][bits+1]);
								sum=sum+d;;
							}

							t_cost=sys_UVLC.cost_t[j][k1]+sum;
							printf("t_cost=%d ",t_cost);
							sum=0;                        
					*/
							if (t_cost < min )
							{
								min=t_cost;
								dec=j;
								ran=k1;
							}
	
						}
					}

				sys_UVLC.cost_t[dec][ran]=MAXF;
				sys_UVLC.cost_n[i][rank]=min;
				sys_UVLC.history[i][count][rank][0]=dec;
				sys_UVLC.history[i][count][rank][1]=ran;
				sys_UVLC.used_bits_new[i][rank]=sys_UVLC.used_bits_old[dec][ran]+sys_UVLC.code[i][0];
			}
		}
		for (i=0;i<sys_UVLC.alphabet_size;i++)
			for(j=0;j<sys_UVLC.BESTC;j++)
			{
				sys_UVLC.cost_o[i][j]=sys_UVLC.cost_n[i][j];
			    sys_UVLC.used_bits_old[i][j]=sys_UVLC.used_bits_new[i][j];
			}
	 
	 }
 
 
//	 printf("test point3 passed successfully!\n");             // test point3

     min=MAXF;
	 flag=0;
 
	 for (i=0;i<sys_UVLC.alphabet_size;i++)
		for(j=0;j<sys_UVLC.BESTC;j++)
		{
			if (sys_UVLC.cost_o[i][j]<min && (sys_UVLC.used_bits_new[i][j]==sys_UVLC.bpl[block_num]))
			{
				min=sys_UVLC.cost_o[i][j];
				dec=i;ran=j;flag=1;
			}
		}

     if(flag==0)
     {
		min=MAXF;
		for (i=0;i<sys_UVLC.alphabet_size;i++)
			for(j=0;j<sys_UVLC.BESTC;j++)
			{
				if (sys_UVLC.cost_o[i][j]<min)
				{
					min=sys_UVLC.cost_o[i][j];
					dec=i;ran=j;
				}
			}
     }

     sys_UVLC.decoded[255]=dec;
	 rank=ran;
	 
     for(i=255;i>0;i--)
	 {      
		 decst=sys_UVLC.history[dec][i][ran][0];
		 ranst=sys_UVLC.history[dec][i][ran][1];
		 dec=decst;ran=ranst;
		 sys_UVLC.decoded[i-1]=dec;     
     } 

	 if(DBG)
	 {
		 for(i=0;i<255;i++)  
		 {
			 printf("%d\t",sys_UVLC.decoded[i]);
		 	 //fputc(sys_UVLC.decoded[i],fo);
		 }

	 }

 	for(i=0;i<256;i++)
		putc(sys_UVLC.decoded[i],fp);

}


void UVLCDecoderOut(FILE *ft,int i)
{
	int remain;
	int j,in_cnt=0,out_cnt=0;
	int found,len;
	int max_num = 1;

	sys_UVLC.remain = ivector(0,sys_spt.message_bits*3-1);
	remain = sys_UVLC.bpl[i];


//	else
	{
		for(j=0;j<remain;j++)
			sys_UVLC.remain[j]=sys_spt.source_bits_out[j];

		while(remain>0)
		{
			for(j=0;j<remain;j++)
				sys_UVLC.remain[j]=sys_spt.source_bits_out[j+in_cnt];
			found=-1; len=0;
			while((found==-1)&(len<remain))
			{
				len++;
				found=SearchTable(sys_UVLC.remain,len);
			}
			if (found==-1) found = max_num;
			sys_UVLC.decoded[out_cnt] = found;
			out_cnt++;
			remain -= len;
			in_cnt += len;
		
		}
	}

	if(out_cnt<256)
	{
		for(j=out_cnt;j<256;j++)
			sys_UVLC.decoded[j]=1;//sys_UVLC.decoded[out_cnt];

	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -