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

📄 common.c

📁 B3g_phase2_C语言_Matlab程序及说明
💻 C
📖 第 1 页 / 共 5 页
字号:
			{
				L2[i] = 10*inf;
			}
		}
		
	
		//end of D2 process

		deinterleave_double(temp_L, L2, Len, interleave_table);

		for(i=0; i<L; i++)
		{
			L2[i]		 = temp_L[i];
			new_llr[i]   = L2[i];
		}

		deinterleave_double(temp_L, L1, Len, interleave_table);

		for(i=0; i<L; i++)
		{
			L1[i] = temp_L[i];
		}
		
	

	}//end of iteration
	
	for(i=0; i<L; i++)
	{
		t0 = a1[i*S+0] + r1[(i*S+0)*2+0] - rc1[(i*S+0)*2+0] + b1[(i+1)*S+nextstate_matrix[2*0+0]];
		t1 = a1[i*S+0] + r1[(i*S+0)*2+1] - rc1[(i*S+0)*2+1] + b1[(i+1)*S+nextstate_matrix[2*0+1]];
		if (output_matrix[2*0+0] == 1)
		{
			nom		=	t0;
			denom	=	t1;
		}
		else
		{
			nom		=	t1;
			denom	=	t0;
		}
		for(j=1; j<S; j++)
		{
			t0 = a1[i*S+j] + r1[(i*S+j)*2+0] - rc1[(i*S+j)*2+0] + b1[(i+1)*S+nextstate_matrix[2*j+0]];
			t1 = a1[i*S+j] + r1[(i*S+j)*2+1] - rc1[(i*S+j)*2+1] + b1[(i+1)*S+nextstate_matrix[2*j+1]];	
			if (output_matrix[2*j+0] == 1)
			{
				nom		=	g(nom, t0);
				denom	=	g(denom, t1);
			}
			else
			{
				nom		=	g(nom, t1);
				denom	=	g(denom, t0);
			}		
		}
		llrp1[i] = nom - denom;
		
		if (llrp1[i] < -10*inf)
		{
			llrp1[i] = -10*inf;
		}
		if (llrp1[i] > 10*inf)
		{
			llrp1[i] = 10*inf;
		}
	}
		
	for(i=0; i<Len; i++)
	{
		t0 = a2[i*S+0] + r2[(i*S+0)*2+0] - rc2[(i*S+0)*2+0] + b2[(i+1)*S+nextstate_matrix[2*0+0]];
		t1 = a2[i*S+0] + r2[(i*S+0)*2+1] - rc2[(i*S+0)*2+1] + b2[(i+1)*S+nextstate_matrix[2*0+1]];
		if (output_matrix[2*0+0] == 1)
		{
			nom		=	t0;
			denom	=	t1;
		}
		else
		{
			nom		=	t1;
			denom	=	t0;
		}
		for(j=1; j<S; j++)
		{
			t0 = a2[i*S+j] + r2[(i*S+j)*2+0] - rc2[(i*S+j)*2+0] + b2[(i+1)*S+nextstate_matrix[2*j+0]];
			t1 = a2[i*S+j] + r2[(i*S+j)*2+1] - rc2[(i*S+j)*2+1] + b2[(i+1)*S+nextstate_matrix[2*j+1]];	
			if (output_matrix[2*j+0] == 1)
			{
				nom		=	g(nom, t0);
				denom	=	g(denom, t1);
			}
			else
			{
				nom		=	g(nom, t1);
				denom	=	g(denom, t0);
			}		
		}
		llrp2[i] = nom - denom;
		
		if (llrp2[i] < -10*inf)
		{
			llrp2[i] = -10*inf;
		}
		if (llrp2[i] > 10*inf)
		{
			llrp2[i] = 10*inf;
		}		
		
	}
		

	//decision: Just Output Decoded InfoBit(Not include TailBit).
	for(i=0; i<L-Mem; i++)
	{
		decoded[i] = (msg[i] + L1[i] + L2[i] > 0) ? 1 : 0;
	}

	for(i=0; i<L; i++)
	{
		if (puncture)
		{
			//llr_all[2*i]	= L1[i] + L2[i];
			//llr_all[2*i+1]	= (i%2) ? llrp2[i] : llrp1[i];
			llr_all[2*i]	= msg[i] + L1[i] + L2[i];
			llr_all[2*i+1]	= (i%2) ? (parity2[i]+llrp2[i]) : (parity1[i]+llrp1[i]);
		}
		else
		{
			//llr_all[3*i]	 = L1[i] + L2[i];
			//llr_all[3*i+1] = llrp1[i];
			//llr_all[3*i+2] = llrp2[i];
			llr_all[3*i]	= msg[i] + L1[i] + L2[i];
			llr_all[3*i+1]	= parity1[i] + llrp1[i];
			llr_all[3*i+2]	= parity2[i] + llrp2[i];
		}
	}

	//free the memory
	free(msg);
	free(imsg);
	free(parity1);
	free(parity2);
	free(L1);
	free(L2);
	free(llrp1);
	free(llrp2);
	free(temp_L);
	free(a1);
	free(a2);
	free(b1);
	free(b2);
	free(r1);
	free(r2);
	free(rc1);
	free(rc2);
	free(ru1);
	free(ru2);
	
	free(output_matrix);
	free(nextstate_matrix);
	free(laststate_matrix);
	free(tail_bit);
}



int TurboEncoder(short * p_InfoBit, int * p_CodedBit, CODE_PARAMETER * p_code_parm, int * p_CodeInlvTable)
{
	int i;
	int Len = p_code_parm->n_InfoBit_length;
	int Mem = p_code_parm->n_CodeMemLength;
	int g0  = p_code_parm->Code_Poly[0];
	int g1  = p_code_parm->Code_Poly[1];
	int pun = p_code_parm->n_puncture;

	int * p_tmpInfoBit;

	Len += Mem;
	p_tmpInfoBit = (int *)malloc(Len*sizeof(int));

	for(i=0; i<Len-Mem; i++)
	{
		*(p_tmpInfoBit+i) = (int)(*(p_InfoBit+i));
	}
	for(; i<Len; i++)
	{
		*(p_tmpInfoBit+i) = 0;
	}
	
	turbo_encode(p_tmpInfoBit, p_CodedBit, pun, Len, g0, g1, Mem, p_CodeInlvTable);

	free(p_tmpInfoBit);
	
	return 1;
	
}

int TurboDecoder(double * p_InfoBitLLR, double * p_CodedBitLLR, short * p_DecodedBit, CODE_PARAMETER * p_code_parm, int * p_CodeInlvTable, int n_IterNum)
{
	int Len = p_code_parm->n_InfoBit_length;
	int Mem = p_code_parm->n_CodeMemLength;
	int g0  = p_code_parm->Code_Poly[0];
	int g1  = p_code_parm->Code_Poly[1];
	int pun = p_code_parm->n_puncture;

	Len += Mem;
	
	turbo_decode(p_DecodedBit, p_InfoBitLLR, p_InfoBitLLR, p_CodedBitLLR, p_CodedBitLLR, pun, Len, n_IterNum, p_CodeInlvTable, g0, g1, Mem);
	
	return Len;
}

/* END _CODE_C_ */

//----------------------------------------------------------------------
//----------------------_MCFB_C_----------------------------------------
//----------------------------------------------------------------------
void cmx_FFT(COMPLEX * fft_in, COMPLEX * fft_out, int n, int order, int flag)
{
   int it,m,is,i,j,nv,l0;
   double p,q,s,vr,vi,poddr,poddi;
   
   for(it=0; it<=n-1; it++)
   { 
     m = it; 
     is = 0;
     
     for(i=0; i<=order-1; i++)
     {
    	 j = m/2; 
    	 is = 2*is+(m-2*j); 
    	 m = j;
     }
     
     fft_out[it].real  = fft_in[is].real; 
     fft_out[it].image = fft_in[is].image;
   }
   
   fft_in[0].real  = 1.0; 
   fft_in[0].image = 0.0;
   p = 6.28318530717959/(1.0*n); 
 
   fft_in[1].real  =  cos(p); 
   fft_in[1].image = (flag==0) ? (-sin(p)) : sin(p);
   
   for(i=2; i<=n-1; i++)
   {   
   	p = fft_in[i-1].real*fft_in[1].real; 
   	q = fft_in[i-1].image*fft_in[1].image;
   	
        s = (fft_in[i-1].real+fft_in[i-1].image)*(fft_in[1].real+fft_in[1].image);
        
        fft_in[i].real  = p-q; 
        fft_in[i].image = s-p-q;
   }
   
   for(it=0; it<=n-2; it=it+2)
   {   
   	vr = fft_out[it].real; 
        vi = fft_out[it].image;
        
        fft_out[it].real  = vr+fft_out[it+1].real; 
        fft_out[it].image = vi+fft_out[it+1].image;
        
        fft_out[it+1].real  = vr-fft_out[it+1].real; 
        fft_out[it+1].image = vi-fft_out[it+1].image;
   }
   
   m=n/2; nv=2;
   for(l0=order-2; l0>=0; l0--)
   { 
   	m=m/2; nv=2*nv;
        for(it=0; it<=(m-1)*nv; it=it+nv)
        for(j=0; j<=(nv/2)-1; j++)
        {   
        	p=fft_in[m*j].real*fft_out[it+j+nv/2].real;
          	q=fft_in[m*j].image*fft_out[it+j+nv/2].image;
         	
         	s=fft_in[m*j].real+fft_in[m*j].image;
         	s=s*(fft_out[it+j+nv/2].real+fft_out[it+j+nv/2].image);
         	
         	poddr=p-q; 
         	poddi=s-p-q;
         	
         	fft_out[it+j+nv/2].real=fft_out[it+j].real-poddr;
         	fft_out[it+j+nv/2].image=fft_out[it+j].image-poddi;
         	fft_out[it+j].real=fft_out[it+j].real+poddr;
         	fft_out[it+j].image=fft_out[it+j].image+poddi;
      	}
    }
    
    //Output
    if(flag!=0)	//IFFT
    {
      	for(i=0; i<=n-1; i++)
        { 
        	fft_out[i].real  /= (1.0*n);
          	fft_out[i].image /= (1.0*n);
        }
    }
    
    return;
    
}


int tx_MCSFB(COMPLEX * p_InBuffer, int n_sizeInBuffer, COMPLEX * p_OutBuffer, BASEBAND_PARM * p_Baseband_Parm)
{
	int i,j;
	int n_SubCarrier;
	int n_FilterLength = 0;
	int n_ParellelLength = n_sizeInBuffer/USED_CARRIER;
	int n_SignalLength   = p_Baseband_Parm->FRAME_SLOTNUM*SLOT_LENGTH*UPSAMPLE_FACTOR+FILTER_LENGTH-UPSAMPLE_FACTOR;
	
	double beta;
	
	COMPLEX temp;
	
	//Pointer
	COMPLEX * p_Cur_x;
	COMPLEX * p_Cur_InBuffer;
	
	//Memory
	COMPLEX cmx_FFTIn[CARRIER_NUMBER];
	COMPLEX cmx_FFTOut[CARRIER_NUMBER];
	COMPLEX tmp1[2*CARRIER_NUMBER];
	double  d_filter[FILTER_LENGTH];

	COMPLEX * x;
	x = (COMPLEX *)malloc(CARRIER_NUMBER*n_ParellelLength*sizeof(COMPLEX));
	
	n_FilterLength = readfilter("filter.dat", (double*)&d_filter);


	//Initialization
	for(i=0; i<n_SignalLength; i++)
	{
		(p_OutBuffer+i)->real = (p_OutBuffer+i)->image = 0;
	}
	
	for(i=0; i<n_ParellelLength; i++)
	{
		p_Cur_x        = x          + i*CARRIER_NUMBER;
		p_Cur_InBuffer = p_InBuffer + i*USED_CARRIER;
		
		for(n_SubCarrier=0; n_SubCarrier<SUBCARRIER_FIRST; n_SubCarrier++)
		{
			(p_Cur_x+n_SubCarrier)->real = (p_Cur_x+n_SubCarrier)->image = 0;
		}
		for(n_SubCarrier=SUBCARRIER_FIRST; n_SubCarrier<=SUBCARRIER_LAST; n_SubCarrier++)
		{
			beta=2*PI*( (double)(n_SubCarrier-(double)(CARRIER_NUMBER-1)/2) * (double)(UPSAMPLE_FACTOR*i-(double)(n_FilterLength-1)/2) )/(double)CARRIER_NUMBER;
			temp.real  = cos(beta);
			temp.image = sin(beta);
			
			*(p_Cur_x+n_SubCarrier) = mul_cmx(*(p_Cur_InBuffer+n_SubCarrier-SUBCARRIER_FIRST), temp);
		}
		for(n_SubCarrier=SUBCARRIER_LAST+1; n_SubCarrier<CARRIER_NUMBER; n_SubCarrier++)
		{
			(p_Cur_x+n_SubCarrier)->real = (p_Cur_x+n_SubCarrier)->image = 0;
		}
	}
	
	//Main
	for(i=0; i<n_ParellelLength; i++)
	{
		p_Cur_x = x + i*CARRIER_NUMBER;
		
		for(n_SubCarrier=0; n_SubCarrier<CARRIER_NUMBER; n_SubCarrier++)
		{
			cmx_FFTIn[n_SubCarrier].real  = (p_Cur_x+n_SubCarrier)->real;
			cmx_FFTIn[n_SubCarrier].image = (p_Cur_x+n_SubCarrier)->image;
		}
		
		cmx_FFT(cmx_FFTIn, cmx_FFTOut, CARRIER_NUMBER, 4, IFFT);
		
		for(n_SubCarrier=0; n_SubCarrier<CARRIER_NUMBER; n_SubCarrier++)
		{
			beta = -1*PI*(double)n_SubCarrier*(double)(CARRIER_NUMBER-1)/(double)CARRIER_NUMBER;
			temp.real  = CARRIER_NUMBER*cos(beta);
			temp.image = CARRIER_NUMBER*sin(beta);
			
			cmx_FFTOut[n_SubCarrier] = mul_cmx(cmx_FFTOut[n_SubCarrier], temp);
			tmp1[n_SubCarrier].real  = cmx_FFTOut[n_SubCarrier].real;
			tmp1[n_SubCarrier].image = cmx_FFTOut[n_SubCarrier].image;
			tmp1[CARRIER_NUMBER+n_SubCarrier].real  = -1*cmx_FFTOut[n_SubCarrier].real;
			tmp1[CARRIER_NUMBER+n_SubCarrier].image = -1*cmx_FFTOut[n_SubCarrier].image;
		}
		
		for(j=0; j<n_FilterLength; j++)
		{
			*(p_OutBuffer+i*UPSAMPLE_FACTOR+j) = add_cmx(mul_cmxreal( tmp1[j%(2*CARRIER_NUMBER)], d_filter[j]), *(p_OutBuffer+i*UPSAMPLE_FACTOR+j));
		}
	}
	
	//Free memory
	free(x);
	
	return (i-1)*UPSAMPLE_FACTOR+j;
	
}

int rx_MCAFB(COMPLEX * p_InBuffer, int n_sizeInBuffer, COMPLEX * p_OutBuffer, BASEBAND_PARM * p_Baseband_Parm)
{
	int i,j;
	int n_SubCarrier;
	int n_FilterLength = 0;
	int N =  p_Baseband_Parm->FRAME_SLOTNUM*SLOT_LENGTH;	//OutLength per subcarrier
	 
	double    d_filter[FILTER_LENGTH];
	double    beta;
	COMPLEX   temp;
	
	//Pointer
	COMPLEX * p_CurIn;
	COMPLEX * p_CurOut;
	
	//Memory
	COMPLEX * tmp0;
	COMPLEX   tmp1[2*CARRIER_NUMBER];
	COMPLEX   tmp2[CARRIER_NUMBER];
	COMPLEX   tmp3[CARRIER_NUMBER];
	
	n_FilterLength = readfilter("filter.dat", (double*)&d_filter);
	
	tmp0 = (COMPLEX *)malloc(n_FilterLength*sizeof(COMPLEX));
	
	//Main
	for(i=0; i<N; i++)
	{
		p_CurOut = p_OutBuffer + i*USED_CARRIER;
		p_CurIn  = p_InBuffer  + i*DOWNSAMPLE_FACTOR;
		
		for(j=0; j<2*CARRIER_NUMBER; j++)
		{
			tmp1[j].real = tmp1[j].image = 0;
		}
		for(j=0; j<n_FilterLength; j++)
		{
			tmp0[j] = mul_cmxreal(*(p_CurIn+j), d_filter[j]);
			tmp1[j%(2*CARRIER_NUMBER)] = add_cmx(tmp1[j%(2*CARRIER_NUMBER)], tmp0[j]);
		}
		for(n_SubCarrier=0; n_SubCarrier<CARRIER_NUMBER; n_SubCarrier++)
		{
			tmp2[n_SubCarrier] = sub_cmx(tmp1[n_SubCarrier], tmp1[CARRIER_NUMBER+n_SubCarrier]);
		
			beta = PI*(double)n_SubCarrier*(double)(CARRIER_NUMBER-1)/(double)CARRIER_NUMBER;
			temp.real  = cos(beta);
			temp.image = sin(beta);
			tmp2[n_SubCarrier] = mul_cmx(tmp2[n_SubCarrier], temp);
		}
		cmx_FFT(tmp2, tmp3, CARRIER_NUMBER, 4, FFT);
		
		for(n_SubCarrier=SUBCARRIER_FIRST; n_SubCarrier<=SUBCARRIER_LAST; n_SubCarrier++)
		{
			beta = (-2)*PI*( (double)n_SubCarrier-((double)CARRIER_NUMBER-1)/2)*((double)DOWNSAMPLE_FACTOR*(i-0)-((double)n_FilterLength-1)/2)/(double)CARRIER_NUMBER;
			temp.real  = cos(beta);
			temp.image = sin(beta);
			*(p_CurOut+n_SubCarrier-SUBCARRIER_FIRST) = mul_cmx(tmp3[n_SubCarrier], temp);
		}
	}
	
	//Free memory
	free(tmp0);
	
	return i*USED_CARRIER;
}

int readfilter(char* sz_filterfile, double* filtercoeff)
{
	int		length=0;
    double FILTER[217]={
						   0.00390273035019,
						   0.00352038979216,
						   0.00297761175573,
						   0.00228667632330,
						   0.00146621148936,
						   0.00054078329928,
						  -0.00045975810150,
						  -0.00150116213476,
						  -0.00254586762595,
						  -0.00355426662319,
						  -0.00448610224340,
						  -0.00530195401052,
						  -0.00596475904456,
						  -0.00644131406614,
						  -0.00670370168534,
						  -0.00673058496685,
						  -0.00650831685892,

⌨️ 快捷键说明

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