亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? turbode.cpp

?? wcdma協(xié)議中的turbo碼鏈路仿真
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/*Turbo碼譯碼程序,2006-08-29。使用Log-MAP譯碼算法,在譯碼中不使用尾比特*/

#include<math.h>
//#include<time.h>
//#include<stdlib.h>
#include<iostream.h>
#include <fstream.h> 
 
ofstream myf("d:\\WCDMA.txt", ios::trunc);

//variable
int tmp;
const int block_size=40;  //碼塊長度
int niter=10;  //迭代的次數(shù)
double * rx_data;  //接收到的數(shù)據(jù)
double SNR_db;
double SNR;
double rate=(double)1/3;
double *rx_s1;
double *rx_s2;
double *rx_p1;
double *rx_p2;  //接收到的信息比特1,信息比特2,校驗比特1,校驗比特2,信息比特2和信息比特1相同
double *ext1,*ext2;  //譯碼器1輸出的外信息,譯碼器2輸出的外信息
//int *de_data;//譯碼輸出的數(shù)據(jù)
int de_data[block_size];
double **alpha,**beta;  //前項路徑度量,反向路徑度量
double **gama;  //分支度量
double Lc; //信道置信度 Lc=4*(Es/N0)
int const Infty_1=32767; //表示無窮大,用于限制alpha,beta
int const Infty_2=8191;  //表示無窮大,用于限制gamma

int *intlv_array;  //交織數(shù)組
int *de_intlv_array;  //解交織數(shù)組

//function
void decode_init();  //初始化
void turbo_decode();  //譯碼調(diào)度函數(shù)
void log_map_ext(double *rx_s,double *rx_p,double *ext_in,double *ext_out);  //Log-MAP譯碼算法,計算外信息
void log_map_llr(double *rx_s,double *rx_p,double *ext_in,double *llr);  //Log-MAP譯碼算法,計算對數(shù)似然比
int max(int a,int b); //比較a和b的最大值并返回
double max(double a,double b); //比較a和b的最大值并返回
int gcd(int a, int b);  //判斷a和b是否互質(zhì),返回1:互質(zhì);0:不互質(zhì)
double max_star(double a, double b);  //計算max star 運算 max*(a,b)=max(a,b)+log(1+exp(-abs(a-b))
void creat_interleaver();  //產(chǎn)生交織數(shù)組和解交織數(shù)組
void interleaver(int *data);  //交織
void deinterleaver(int *data);  //解交織
void interleaver(double *data);  //交織
void deinterleaver(double *data);  //解交織

void decision(double *indata);  //判決
void freemem();  //釋放內(nèi)存


void print(int * data,int len)
{
	for(int i=0;i<len;i++)
		cout<<data[i]<<" ";
	cout<<endl;
}

void print(double * data,int len)
{
	for(int i=0;i<len;i++)
		cout<<data[i]<<"  ";
	cout<<endl;
}

void zero(int *data,int len)
{
	for(int i=0;i<len;i++)
		data[i]=0;
}
void zero(double *data,int len)
{
	for(int i=0;i<len;i++)
		data[i]=0;
}

void rsc(int * input,int * output,int len)
{
	int reg[3];
	zero(reg,3);
	
	int feedback[3] = {0,0,0};
	for(int i=0;i<len;i++)
	{
		feedback[2] = reg[2] ^ reg[1];
		feedback[0] = feedback[2] ^ input[i];
		feedback[1] = feedback[0] ^ reg[0];
		output[i] =  feedback[1] ^ reg[2];
		reg[2] = reg[1];
		reg[1] = reg[0];
		reg[0] = feedback[0];
	}
}

void encode(int * input)
{
	rx_data = new double[3*block_size];
//	print(input,block_size);
//	int * y =new int[block_size];
	int y[block_size];
	zero(y,block_size);
	rsc(input,y,block_size);
//	print(y,block_size);
//	int * inter = new int[block_size];
	int inter[block_size];
	zero(inter,block_size);
	//init();
	for(int i=0;i<block_size;i++)
		inter[i] = input[intlv_array[i]];
//	interleaver(input);
	
//	int *y1 = new int[block_size];
	int y1[block_size];
	zero(y1,block_size);
	rsc(inter,y1,block_size);
	print(inter,block_size);
		for(i=0;i<block_size;i++)
		{
			rx_data[3*i] = input[i];
			rx_data[3*i+1] = y[i];
			rx_data[3*i+2] = y1[i];
		}
	//	print(rx_data,3*block_size);
		for(i=0;i<3*block_size;i++)
		{
			if(rx_data[i]==0)
				rx_data[i]=-1;
		}
}


void turbo_decode()  //控制譯碼的函數(shù)
{

	interleaver(rx_s2);  //對輸入第二級譯碼器的數(shù)據(jù)進行交織運算
//	cout<<"rx_s2:";
//	print(rx_s2,block_size);
	int i;  //用于控制迭代譯碼次數(shù)的循環(huán)變量
	
	for(i=0;i<niter-1;i++)  //首先迭代N-1次,在譯碼器之間傳遞外信息
	{
		log_map_ext(rx_s1,rx_p1,ext2,ext1);  //第一級譯碼器譯碼,輸出外信息
		interleaver(ext1);  //對第一級譯碼器輸出的外信息進行交織,然后輸入到第二級譯碼器
		log_map_ext(rx_s2,rx_p2,ext1,ext2);  //第二級譯碼器譯碼,輸出外信息
		deinterleaver(ext2);  //對第二級譯碼器輸出的外信息解交織,然后輸入到第一級譯碼器
	}
	//最后一次譯碼
	log_map_ext(rx_s1,rx_p1,ext2,ext1);  //第一級譯碼器譯碼,輸出外信息
	interleaver(ext1);   //對第一級譯碼器輸出的外信息進行交織,然后輸入到第二級譯碼器
	log_map_llr(rx_s2,rx_p2,ext1,ext2); //第二級譯碼器譯碼,輸出對數(shù)似然比
	deinterleaver(ext2);  //將第二級譯碼器輸出的對數(shù)似然比解交織
/*	for(i=0;i<block_size;i++)
	{
		cout<<ext2[i]<<" ";
	}
	cout<<endl;*/

	
	decision(ext2);  //對第二級譯碼器輸出的對數(shù)似然比進行硬判決,作為最后的譯碼輸出

	
	for (i=0;i<block_size;i++ )
	{
		de_data[i]=(int)ext2[i];
	}
		
	freemem(); 	
}

void decode_init()
{
	int i=0,j=0;
    rx_s1=new double[block_size];
	zero(rx_s1,block_size);
	rx_s2=new double[block_size];
	zero(rx_s2,block_size);
	rx_p1=new double[block_size];
	zero(rx_p1,block_size);
	rx_p2=new double[block_size];
	zero(rx_p2,block_size);
/*			for(i=0;i<3*block_size;i++)
			{
					cout<<rx_data[i]<<"  ";
			}
			cout<<endl;*/
	for(i=0;i<3*block_size;i=i+3)
	{
		rx_s1[j]=rx_data[i];
		rx_s2[j]=rx_data[i];
		rx_p1[j]=rx_data[i+1];
		rx_p2[j]=rx_data[i+2];
		j++;
	}
//cout<<"rx_s2:";	print(rx_s2,block_size);
/*	cout<<"rx_s2:";
	print(rx_s1,block_size);
	cout<<endl;
	cout<<"rx_p1:";
	print(rx_p1,block_size);
	cout<<endl;
	cout<<"rx_p2:";
	print(rx_p2,block_size);
	cout<<endl;*/

	//初始化其它
	ext1=new double[block_size]; 
	ext2=new double[block_size];
	zero(ext1,block_size);
	zero(ext2,block_size);

	alpha=new double*[block_size];
	beta=new double*[block_size];
	for(i=0;i<block_size;i++)  //創(chuàng)建alpha,beta矩陣
	{
		alpha[i]=new double[8];
		beta[i]=new double[8];
	}
	for(i=0;i<block_size;i++)
	{
		for(j=0;j<8;j++)
		{
			alpha[i][j]=0;
			beta[i][j]=0;
		}
	}

	alpha[0][0]=0;  //初始化alpha	
	for(i=1;i<8;i++)
	{
		alpha[0][i]=-Infty_1;
	}
	
	
	for(i=0;i<8;i++)	//初始化beta
	{
		beta[block_size-1][i]=-Infty_1;
	}
	
	gama=new double*[block_size];
	for(i=0;i<block_size;i++)
	{
		gama[i]=new double[4];//00 01 10 11
	}
	for(i=0;i<block_size;i++)
	{
		for(j=0;j<4;j++)
			gama[i][j]=0;
	}
	//Lc=4*pow(10,SNR/10);  //Lc=4*(EsN0)
//	Lc=4*0.5*pow(10,SNR_db/10);//SNR=(long double)pow(10.0,SNR_db/10.0);
	Lc=4*rate*SNR;
//	cout<<"snr"<<SNR<<endl;
//	cout<<"lc"<<Lc<<endl;

//	de_data=new int[block_size];
//	int de_data[block_size];
	zero(de_data,block_size);	
}

int gcd(int a, int b)
{
    int v, u, t, q;
    u = abs(a);
    v = abs(b);
    while (v>0) 
   {
      q = u / v;
      t = u - v*q;
      u = v;
      v = t;
    }
    return(u);
}

void creat_interleaver()
{
	intlv_array=new int[block_size];  //交織和解交織數(shù)組初始化
	de_intlv_array=new int[block_size];

    const int MAX_INTERLEAVER_SIZE = 5114;
    const int MIN_INTERLEAVER_SIZE = 40;
    int K;  
    int R;  
    int C;  
    int p=0;  
    int v=0;  
    int *s; 
    int *q; 
    int *r; 
    int *T; 
    int **U; 
    int i, j, qj, temp, row, col, index, count;
    int interleaver_size = block_size;

    if(interleaver_size > MAX_INTERLEAVER_SIZE)
    {
	cout<<"td-scdma_turbo_interleaver_sequence: The interleaver size is too large"<<endl;
    }	
    if(interleaver_size < MIN_INTERLEAVER_SIZE)
    {
		cout<<"td-scdma_turbo_interleaver_sequence: The interleaver size is too small"<<endl;
	}
    		 
      K = interleaver_size;
      static int primes[55] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257};
      static int roots[55] = {0,0,0,3,2,2,3,2,5,2,3,2,6,3,5,2,2,2,2,7,5,3,2,3,5,2,5,2,6,3,3,2,3,2,2,6,5,2,5,2,2,2,19,5,2,3,2,3,2,6,3,7,7,6,3};
      int primes_length  = 55;
      if ((K>=40) && (K<=159)) 
      {
	      R = 5;
      } 
      else if ( ((K>=160)&&(K<=200)) || ((K>=481)&&(K<=530)) ) 
      		{
			R = 10;
      		} 
      	    else {
			R = 20;
     		 }
      if ((K>=481)&&(K<=530)) 
      {
		p = 53;
		v = 2;
		C = p;
      } 
      else 
      {
		for (i=0; i<primes_length; i++) 
		{
		  if ( ( double(primes[i]+1) - double(K)/double(R) ) >= 0.0 ) 
		  {
		    p = primes[i];
		    v = roots[i];
		    break;
		  }
		}
	if ( ( double(p) - double(K)/double(R) ) >= 0.0 ) 
	{
	  if ( ( double(p) - 1.0 - double(K)/double(R) ) >= 0.0 ) 
	  {
	    C = p-1;
	  } 
	  else 
	  {
	    C = p;
	  }
	} 
	else 
	{
	  C = p+1;
	}
	  }
      
	  s = new int[p-1];
      s[0] = 1;
      for (i=1; i<=(p-2); i++) 
      {
		  s[i] = (int) fmod((v * s[i-1]), p);
      }
      q = new int[R];
      q[0] = 1;
      for (j=1; j<=(R-1); j++) 
      {
		  for (i=0; i<primes_length; i++) 

		  {
			  qj = primes[i];	  
			  if ( (qj>6) && (qj>q[j-1]) ) 	 
			  {	   
				  if (gcd((int) qj,(int) (p-1)) == 1) 	  
				  {
					  q[j] = qj;
					  break;
				  }
			  }
		  }     
	  }
      static int Pat1[20] = {19,9,14,4,0,2,5,7,12,18,10,8,13,17,3,1,16,6,15,11};
      static int Pat2[20] = {19,9,14,4,0,2,5,7,12,18,16,13,17,15,3,1,6,11,8,10};
      static int Pat3[10] = {9,8,7,6,5,4,3,2,1,0};
      static int Pat4[5] = {4,3,2,1,0};
      if (K>=3211)
	  {
		  T = Pat1;      
	  } 
	  else if (K>=3161)
	  {	
		  T = Pat2;     
	  } 
	  else if (K>=2481)
	  {
		  T = Pat1;
      } 
	  else if (K>=2281) 
	  {
		  T = Pat2;
      } 
	  else if (K>=531) 
	  {	
		  T = Pat1;
      } 
	  else if (K>=481)
	  {	
		  T = Pat3;
      }
	  else if (K>=201)
	  {
		  T = Pat1;
      } 
	  else if (K>=160) 
	  {
		  T = Pat3;
      }
	  else
	  {
		  T = Pat4;
      }

      r=new int[R];
      for (j=0; j<=(R-1); j++)
	  {
		  r[ T[j] ] = q[j];
      }
      U = new int*[R];
      for (i=0;i<R;i++) 
      {	
		  U[i] = new int[C];
      }

      if (C==p) 
	  {    	
		  for (j=0; j<=(R-1); j++) 
		  {	  
			  for (i=0; i<=(p-2); i++) 
			  {	   
				  U[j][i] = s[(int) fmod((int) (i*r[j]), (int) (p-1)) ];
			  }	  
			  U[j][p-1] = 0;	
		  }     
	  } 
	  else if (C==(p+1))
	  {	
		  for (j=0; j<=(R-1); j++)
		  {
			  for (i=0; i<=(p-2); i++) 
			  {	    
				  U[j][i] = s[(int) fmod((int) (i*r[j]),(int) (p-1)) ]; 	  
			  }	 
			  U[j][p-1] = 0;	 
			  U[j][p] = p;	
		  }	
		  if (K == (C*R))
		  {	  
			  temp = U[R-1][p];	 
			  U[R-1][p] = U[R-1][0];	  
			  U[R-1][0] = temp;
		  }     
	  } 
	  else if (C==(p-1)) 
	  {	
		  for (j=0; j<=(R-1); j++)
		  {
			  for (i=0; i<=(p-2); i++)
			  {
				  U[j][i] = s[(int) fmod((int) (i*r[j]),(int) (p-1)) ] - 1;	 
			  }	
		  }
      }
      
	  count = 0;    
	  for (i=0; i<C; i++)     
	  {	
		  for (j=0; j<R; j++) 	
		  {		
			  row = T[j];		
			  col = U[row][i];		
			  index = row * C + col;		
			  if (index < K) 		
			  {			
				  intlv_array[count] = index;			
				  count++;	    
			  }	
		  }
	  }
      for (i=0;i<K;i++)
      {
		  de_intlv_array[intlv_array[i]] = i;
	  }          
	  for (i=0;i<R;i++)       
	  {	
		  delete U[i];
      }
	  delete []s;
	  delete []q;
	  delete []r;
//	  delete []T;
	  delete []U;
}

void interleaver(int *data)
{
	int i;
	int *temp=new int[block_size];
	for(i=0;i<block_size;i++)
	{
		temp[i]=data[i];
	}
	for(i=0;i<block_size;i++)
	{
		data[i]=temp[intlv_array[i]];
	}
	delete []temp;
}

void interleaver(double *data)
{

	int i;
	double *temp=new double[block_size];
	for(i=0;i<block_size;i++)
	{
		temp[i]=data[i];
	}
	for(i=0;i<block_size;i++)
	{
		data[i]=temp[intlv_array[i]];
	}
	delete []temp;
}

void deinterleaver(int *data)
{
	int i;
	int *temp=new int[block_size];
	for(i=0;i<block_size;i++)
	{
		temp[i]=data[i];
	}
	for(i=0;i<block_size;i++)
	{
		data[i]=temp[de_intlv_array[i]];
	}
	delete []temp;
}

void deinterleaver(double *data)
{
	int i;
	double *temp=new double[block_size];
	for(i=0;i<block_size;i++)
	{
		temp[i]=data[i];
	}
	for(i=0;i<block_size;i++)
	{
		data[i]=temp[de_intlv_array[i]];
	}
	delete []temp;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本一区二区三区电影| 日韩欧美国产高清| proumb性欧美在线观看| 国产一区二区不卡在线| 精品一区二区三区久久久| 蜜臀av性久久久久蜜臀aⅴ流畅| 日韩二区在线观看| 日韩有码一区二区三区| 视频一区二区三区在线| 日韩国产高清影视| 日韩精品欧美精品| 日本成人在线看| 久99久精品视频免费观看| 久久国产婷婷国产香蕉| 久久se这里有精品| 国产在线播精品第三| 国产91在线看| 91日韩精品一区| 欧美日韩一卡二卡| 欧美一级国产精品| 久久亚洲精品国产精品紫薇| 亚洲国产成人在线| 亚洲人成网站色在线观看| 亚洲精品乱码久久久久久| 亚洲午夜在线视频| 日韩成人一区二区三区在线观看| 久久国产精品99精品国产| 国产伦理精品不卡| www.亚洲国产| 91精品欧美久久久久久动漫| 26uuu国产电影一区二区| 国产精品国产a| 亚洲va韩国va欧美va精品 | 成人激情免费电影网址| 99精品久久免费看蜜臀剧情介绍| 欧美系列在线观看| 日韩欧美亚洲国产精品字幕久久久| 国产亚洲精品中文字幕| 亚洲猫色日本管| 蜜桃免费网站一区二区三区| 岛国av在线一区| 欧美精品乱码久久久久久按摩| 欧美α欧美αv大片| 国产精品久久久久久久午夜片| 亚洲一区二区3| 国产精品福利一区二区| 亚洲第一成人在线| 日本va欧美va瓶| 岛国精品在线播放| 欧美日韩视频第一区| 亚洲精品在线三区| 国产欧美日韩三区| 亚洲国产一区二区三区青草影视| 美国十次综合导航| 93久久精品日日躁夜夜躁欧美| 精品视频免费在线| 国产欧美日韩三级| 日韩精品亚洲一区二区三区免费| 激情欧美一区二区| 欧美亚洲免费在线一区| 日韩美女主播在线视频一区二区三区| 久久日韩粉嫩一区二区三区 | 91精品国产美女浴室洗澡无遮挡| 日韩欧美精品在线视频| 亚洲女人的天堂| 奇米精品一区二区三区四区| 日韩成人一级片| 国产成人自拍高清视频在线免费播放| 欧美中文字幕一区| 亚洲成人av在线电影| 欧美成人aa大片| 一个色在线综合| 99re热视频精品| 欧美精品一区二区三区视频| 亚洲国产精品人人做人人爽| 成人免费视频一区二区| 精品福利一二区| 午夜精品久久久久久| 97久久精品人人爽人人爽蜜臀| 亚洲精品在线一区二区| 国产亚洲一区二区在线观看| 亚洲第一精品在线| 欧美性受xxxx| 一区二区三区视频在线看| 日本韩国欧美一区二区三区| 国产精品视频第一区| 国产999精品久久久久久绿帽| 在线电影国产精品| 五月天久久比比资源色| 久久人人97超碰com| 欧美一区二区三区视频在线 | 亚洲成a人v欧美综合天堂| 国产成人aaa| 久久中文字幕电影| 久久国产人妖系列| 日韩欧美在线不卡| 日韩中文字幕亚洲一区二区va在线| 日本电影欧美片| 一区二区三区在线视频观看58| 一本一道久久a久久精品| 国产精品久久久久久久久免费相片| 国产成人精品三级| 久久九九99视频| 国产成人h网站| 国产女人aaa级久久久级| 国产精品91xxx| 亚洲国产精品成人综合色在线婷婷| 国产精品99精品久久免费| 久久久午夜电影| 国产91富婆露脸刺激对白| 中文子幕无线码一区tr| 成人黄色在线看| 最新不卡av在线| 色综合天天视频在线观看 | 成人高清免费在线播放| 国产精品视频线看| 99精品视频一区二区三区| 亚洲啪啪综合av一区二区三区| 色婷婷综合久久久中文字幕| 一区二区三区免费| 欧美日韩国产另类一区| 日本中文一区二区三区| 精品久久久久久久久久久久久久久 | 亚洲综合在线电影| 99re这里只有精品首页| 一区二区三区av电影| 欧美日韩一区在线| 男人的j进女人的j一区| xfplay精品久久| 97aⅴ精品视频一二三区| 亚洲综合色在线| 日韩欧美亚洲国产另类| 岛国一区二区在线观看| 亚洲精品国产一区二区精华液| 欧美日韩国产首页| 久久se这里有精品| 国产精品免费网站在线观看| 91久久国产最好的精华液| 亚洲高清免费视频| 老司机精品视频在线| 丝袜亚洲另类丝袜在线| 玉足女爽爽91| 丝瓜av网站精品一区二区| 亚洲一区二区三区视频在线播放| 亚洲第一激情av| 午夜精品福利一区二区三区av| 亚洲国产精品天堂| 日韩和欧美一区二区三区| 亚洲精品国产成人久久av盗摄| 一区二区三区在线观看动漫| 亚洲天堂2016| 亚洲一区精品在线| 国产不卡在线一区| 狠狠色综合日日| 国产福利一区在线| 91色综合久久久久婷婷| 欧美色网站导航| 日韩久久久久久| 亚洲一区二三区| 免费在线观看成人| 免费看欧美美女黄的网站| 欧美在线制服丝袜| 亚洲精品videosex极品| 99热精品国产| 色综合天天综合在线视频| 高清shemale亚洲人妖| 色婷婷精品久久二区二区蜜臂av| 日本一区二区三区四区| 欧美视频精品在线观看| 国产亚洲精品久| 久久99国产精品尤物| 亚洲愉拍自拍另类高清精品| 国产日韩欧美精品电影三级在线| 欧美电影一区二区三区| 97久久精品人人爽人人爽蜜臀| 国精产品一区一区三区mba视频| 亚洲一区精品在线| 国产精品久久久久久久久图文区| 久久在线免费观看| 9191精品国产综合久久久久久| 99精品国产一区二区三区不卡| 国产成人在线视频播放| 亚洲已满18点击进入久久| fc2成人免费人成在线观看播放| 日韩免费视频一区| 亚洲免费在线观看| 成人午夜视频网站| 国产午夜精品在线观看| 亚洲高清视频在线| 欧美综合视频在线观看| 午夜在线电影亚洲一区| 岛国av在线一区| 精品噜噜噜噜久久久久久久久试看 | 26uuu成人网一区二区三区| 国产永久精品大片wwwapp| www.欧美日韩国产在线| 黄色日韩网站视频| 日本欧美一区二区在线观看| 一区二区三区欧美日| 国产精品久久久久永久免费观看|