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

📄 max-log-map.cpp

📁 max-log-map算法的C语言的实现
💻 CPP
字号:
//Turbo码:max-log-map 译码算法 
#include "CTC.h"	//	包含头文件
//using namespace std;
//ofstream ofileExtri ( "Extri.txt", ios::app );
//ofstream ofileLLR ( "LLR.txt", ios::app );
/********************************************************************
功能:	为每一个待译码bit计算其LLR (Max-log-Map) 
Input:	r_s[] 接收的系统位bit失量
		r_p1[],r_p2[] 分别为接收的校验位bit失量.
		prior[]:先验概率 (计算Gama时,每次迭代后先验概率都改变)
		sgmaSquare:	不同SNR时值不同.
Output: LLR[].	
*********************************************************************/
void computeLLR( double *r_s, double *r_p1, double *prior, double sgmaSquare, double *LLR )
//void computeLLR( double *r_s, double *r_p1, double *prior, double A, double *LLR )
{
	int i,j;
	double tempx,tempy;
	double sum_temp1, sum_temp0;


	//alfa[]和beta[]以交织长度为单位,再以s0,s1..,s7为次序依次存储
	//其中gama先存input=1后存input=0;	结果:由当前状态和input决定
	double *gama = new double [2 * n_states * interLength];//2*8*interLength;
	double *alfa = new double [n_states * (interLength+1)];//8*(interLength+1);
	double *beta = new double [n_states * (interLength+1)];//8*(interLength+1);

	double *tempmax = new double [ interLength+1 ];

	for ( i = 0; i < interLength+1; i++ )
		tempmax[i] = 0;
		//tempmax[i]=minusInfinity;

	//Initialization of alfa and beta,只对t=0和t=interLength时初试化
	//零状态时
	alfa[0] = 0;//1
	beta[interLength] = log(1.0/8.0);//1;//0
	//非零状态时
	for ( i = 1; i < n_states; i++ )
	{
		alfa[i * (interLength+1)] = minusInfinity;//0
		beta[i * (interLength+1) + interLength] = log(1.0/8.0);//0.125;// log(1/8);//minusInfinity;
		//ofileLLR << alfa[i * (interLength+1)] << beta[i * (interLength+1) + interLength]<<endl;
	}// End-Initialization of alfa and beta 

	//exit(1);
	
	//当初始状态分别为s0,s1...s7, and input = 1; 数组中元素为output,参考Trellis图
	int Trellis_1[n_states][2] = {{1,1}, {1,1}, {1,-1}, {1,-1}, {1,-1}, {1,-1}, {1,1}, {1,1}};
	//input = 0; 数组中元素为output
	int Trellis_0[n_states][2] = {{-1,-1}, {-1,-1}, {-1,1}, {-1,1}, 
	{-1,1}, {-1,1}, {-1,-1}, {-1,-1}};
	
	// compute gama,for t = 1,2,...,interLength; s = s0, s2,...,s7;
	// t 为时刻
	for (i = 0; i < interLength; i++)			
	{
		for (j = 0; j < n_states; j++)		//分别为s0,s1...s7
		{
			// 起始状态,and input=1,
			gama[(j*interLength*2) + 2*i+0] =( r_s[i]*Trellis_1[j][0] 
				+ r_p1[i]*Trellis_1[j][1] )/sgmaSquare  + 0.5*prior[i]; 
			//gama[(j*interLength*2) + 2*i+0] = exp( 0.5*prior[i] + 
				//( r_s[i]*Trellis_1[j][0] + r_p1[i]*Trellis_1[j][1] )/sgmaSquare );

			// 起始状态,and input=0
			//gama[(j*interLength*2) + 2*i+1] = exp( -0.5*prior[i] + 
				//( r_s[i]*Trellis_0[j][0] + r_p1[i]*Trellis_0[j][1] )/sgmaSquare );
			gama[(j*interLength*2) + 2*i+1] =( r_s[i]*Trellis_0[j][0] 
				+ r_p1[i]*Trellis_0[j][1] )/sgmaSquare -0.5*prior[i];
			//ofileLLR << gama[(j*interLength*2) + 2*i+0] << endl;
			
			//if(i==1000) exit(1);
			//if(gama[(j*interLength*2) + 2*i+0] < 1e-300)
			//{
			//	ofileLLR << "i = " <<i <<"j = " <<j<<",error";
			//	exit(1);
			//}
		
		}
	}//End-compute gama
    		
	//compute Alfa, for t = 1,2,...,interLength; s = s0, s2,...,s7
	//?-计算alfa似乎只需:alfa[0]到alfa[interLength-1]	
	int Forward_trellis[n_states][2] = { {0,1}, {2,3}, {4,5}, {6,7}, {0,1}, {2,3}, {4,5}, {6,7} };
	//第1,3个为状态,第2,4个元素:1表示input=0, 0表示input = 1 
	int mapA[n_states][4] = {{0,1,1,0}, {2,0,3,1}, {4,1,5,0}, {6,0,7,1}, {0,0,1,1}, {2,1,3,0}, 
	{4,0,5,1}, {6,1,7,0}};

	for (i = 1; i < interLength + 1; i++) //共interLength个
	{
		for (j = 0; j < n_states; j++)		//分别为s0,s1...s7
		{
			tempx = alfa[ Forward_trellis[j][0]*(interLength+1) + (i-1) ] 
				+ gama[ mapA[j][0]*2*interLength + 2*(i-1) + mapA[j][1] ];		
			tempy = alfa[ Forward_trellis[j][1]*(interLength+1) + (i-1) ] 
				+ gama[ mapA[j][2]*2*interLength + 2*(i-1) + mapA[j][3] ];

			//tempx = alfa[ Forward_trellis[j][0]*(interLength+1) + (i-1) ] * 
			//	gama[ mapA[j][0]*2*interLength + 2*(i-1) + mapA[j][1] ];		
			//tempy = alfa[ Forward_trellis[j][1]*(interLength+1) + (i-1) ] * 
			//	gama[ mapA[j][2]*2*interLength + 2*(i-1) + mapA[j][3] ];

			//alfa[j*(interLength+1) + i] = tempx + tempy;

			//if ( exp(tempx + tempy) < 1e-100 )
			//	alfa[j*(interLength+1) + i] = minusInfinity;
			//else
				
			alfa[j*(interLength+1) + i] = tempx > tempy ? tempx : tempy;
						
			//ofileLLR << alfa[j*(interLength+1) + i] << endl;
			//if(i==1000) 
			
		}
		/*-------------------------------------------添加的
		double sumalfa=0;
		for (j = 0; j < n_states; j++)
		{
			sumalfa += alfa[j*(interLength+1) + i];
		}
		for (j = 0; j < n_states; j++)	
		{	
			alfa[j*(interLength+1) + i] /= sumalfa;


		}*/
		
			//{
			//	ofileLLR << "i = " <<i <<"j = " <<j<<",error";
			//	exit(1);
		//--------------------------------------------

	}//End- compute Alfa
	//exit(1);

	////End- compute Beta, for t = 1,2,...,interLength; s = s0, s2,...,s7;
	int Bacward_trellis[n_states][2] = {{0,4}, {0,4}, {1,5}, {1,5}, {2,6}, {2,6}, {3,7}, {3,7}};
	int mapB[n_states][2] = {{1,0}, {0,1}, {0,1}, {1,0}, {1,0}, {0,1}, {0,1}, {1,0}};//1对应input = 0

	for ( i = interLength - 1; i >= 0; i-- ) //共interLength个
	{
		for (j = 0; j < n_states; j++)		//分别为s0,s1...s7
		{
			tempx = beta[ Bacward_trellis[j][0]*(interLength+1) + (i+1) ] 
				+ gama[ j*2*interLength + 2*i + mapB[j][0] ];				
			tempy = beta[ Bacward_trellis[j][1]*(interLength+1) + (i+1) ] 
				+ gama[ j*2*interLength + 2*i + mapB[j][1] ];

			//tempx = beta[ Bacward_trellis[j][0]*(interLength+1) + (i+1) ] * 
				//gama[ j*2*interLength + 2*i + mapB[j][0] ];				
			//tempy = beta[ Bacward_trellis[j][1]*(interLength+1) + (i+1) ] * 
				//gama[ j*2*interLength + 2*i + mapB[j][1] ];

			//beta[j*(interLength+1) + i] = tempx + tempy; 

		
			/*ofileLLR << beta[ Bacward_trellis[j][1]*(interLength+1) + (i+1) ]<<
				","<<gama[ j*2*interLength + 2*i + mapB[j][0] ] << endl;
			if(i==3160-5) exit(1); */
			
			//if ( exp(tempx + tempy) < 1e-100 )
				//beta[j*(interLength+1) + i] = minusInfinity;
			//else
				
			beta[j*(interLength+1) + i] = tempx > tempy ? tempx : tempy; 
			//ofileLLR <<beta[j*(interLength+1) + i]<<endl;

		}
		
		/*-------------------------------------------添加的
		double sumbeta=0;
		for (j = 0; j < n_states; j++)		
			 sumbeta += beta[j*(interLength+1) + i];
		

		//-------------------------------------------
		for (j = 0; j < n_states; j++)
		{
			beta[j*(interLength+1) + i] /= sumbeta;
			//ofileLLR << beta[j*(interLength+1) + i] << endl;
			//if(i==1000) exit(1);
		}*/

	}//End-compute Beta
	//exit(1);

	//compute LLR
	double temp1[n_states];	
	double temp0[n_states];
	int map1[n_states] = {4,0,1,5,6,2,3,7};
	int map0[n_states] = {0,4,5,1,2,6,7,3};
	for ( i = 0; i < interLength; i++ ) //共interLength个
	{
		sum_temp1 = 0;
		sum_temp0 = 0;
		for ( j = 0; j < n_states; j++ )	//分别为s0,s1...s7
		{
			temp1[j] = alfa[j*(interLength+1) + i] + gama[j*2*interLength + (2*i+0)] 
			+ beta[map1[j]*(interLength+1) + i+1]; //input=1
			temp0[j] = alfa[j*(interLength+1) + i] + gama[j*2*interLength + (2*i+1)] 
			+ beta[map0[j]*(interLength+1) + i+1];
			//temp1[j] = alfa[j*(interLength+1) + i] * gama[j*2*interLength + (2*i+0)] 
			//	* beta[map1[j]*(interLength+1) + i+1]; //input=1
			//temp0[j] = alfa[j*(interLength+1) + i] * gama[j*2*interLength + (2*i+1)] 
			//	* beta[map0[j]*(interLength+1) + i+1]; //input=0
		
			//ofileLLR << alfa[j*(interLength+1) + i]<<","<< gama[j*2*interLength + (2*i+0)]
				//<<","<< beta[map1[j]*(interLength+1) + i+1]<< endl;
		}
		/*for ( j = 0; j < n_states; j++ )
		{
			sum_temp1 += temp1[j];
			sum_temp0 += temp0[j];
		}*/
		//if( sum_temp1<1e-300)
			//LLR[i] = minusInfinity;
		//else if (sum_temp0<1e-300) 
		//	LLR[i] = -minusInfinity;
		//else 
			
		//LLR[i] = log(sum_temp1/sum_temp0);
		
		LLR[i] = getMax( temp1, n_states ) - getMax( temp0, n_states );
		//ofileLLR << LLR[i] << endl; 
		//exit(1);
		//
	}
	//ofileLLR << endl;
	//exit(1);
	delete []tempmax;

	delete []gama;
	delete []alfa;
	delete []beta;
}

/******************************************************************
功能:	得到一个序列中的最大值无素.
INPUT:data_seq - 
	      length - 序列长度.
RETURN VALUE: 返回最大值元素.
******************************************************************/
double getMax( double *dataSeq, int length )//本程序中为状态的个数,that is length=8=n_states;
{
	int i;
	double temp;
	temp = dataSeq[0];
	for ( i = 1; i < length; i++ )
	{
		if ( temp < dataSeq[i] )//
			temp = dataSeq[i];
	}

	return temp;
}
/******************************************************************
功能:	hard decisions
INPUT:data[] - 实际上为第二个译码器最后一次迭代后的对数似然比序列
OUPUT: result[]  0/1 sequence.
******************************************************************/
void decision( double *data, int *result )
{
	int i;
	for ( i = 0; i < interLength; i++ ) 
	{
		if( data[i] > 0) //if( data[i] >= 0)
			result[i] = 1;		
		else 
			result[i] = 0;
	}
}
/**************************************************************************************
功能:	计算外信息for each decoded bit.
Input:	LLR[]
		priorInfor[]先验信息
		r_s[]: 系统位信息
		sgmaSquare:	
Output: Extrinsic[] 由当前DECODER产生, 将作为先验信息用于下一个DECODER
****************************************************************************************/
//void getExtrinsic( double *LLR, double *priorInfor, double *r_s, double A, double *Extrinsic )
void getExtrinsic( double *LLR, double *priorInfor, double *r_s, double sgmaSquare, double *Extrinsic )
{
	int i = 0;
	for ( i = 0; i < interLength; i++ )
	{
		//add
		Extrinsic[i] = ( LLR[i] - r_s[i] * (2/sgmaSquare) - priorInfor[i] )*0.7;//
		//Extrinsic[i] =(LLR[i] - r_s[i] - priorInfor[i]) * 0.7;//
		//ofileExtri << LLR[i]<<","<< priorInfor[i] << endl; 
		/*if ( i==10 ) 
		{
			ofile1 << Extrinsic[i]<<","<<LLR[9]<<","<<priorInfor[9]<<endl;
		}*/
	}
	//exit(1);
	//ofileExtri << endl;
}













⌨️ 快捷键说明

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