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

📄 turbo.c

📁 使用VC++实现3G通信中TURBO码编译码程序
💻 C
字号:
#include "turbo.h"
#include "limits.h" 
void log_map (const llr_t* apriori,const channel_t* y_parity, llr_t* ext);
inline void Init_LukLck(llr_t * msg, llr_t* parity, llr_t* apriori, channel_t* y_parity, llr_t* ext); 
inline void compute_gamma(llr_t* m11,llr_t* m10,const llr_t* apriori,const channel_t* y_parity);
inline void compute_alpha(llr_t*alpha,const llr_t* m11,const llr_t* m10);
inline void compute_beta(llr_t* beta,const llr_t* m11,const llr_t* m10,const llr_t* alpha);
inline void compute_ext(const llr_t* alpha,const llr_t* beta,const llr_t* m11,const llr_t* m10,llr_t* ext, const llr_t* ap);



llr_t alpha[(FRAME_LENGTH+3+1)*8];
llr_t beta[(FRAME_LENGTH+3+1)*8];
llr_t m11[(FRAME_LENGTH+3)];
llr_t m10[(FRAME_LENGTH+3)];
void log_map(const llr_t* apriori,const channel_t* y_parity, llr_t* ext)
{
	compute_gamma(m11,m10,apriori,y_parity);
	compute_alpha(alpha,m11,m10);
	compute_beta(beta,m11,m10,alpha);
	compute_ext(alpha,beta,m11,m10,ext,apriori);
}

inline void Init_LukLck(llr_t * msg, llr_t* parity, llr_t* apriori, channel_t* y_parity, llr_t* ext)
{
	unsigned char num;
	for(num = 0; num < FRAME_LENGTH; num++)
	{
		apriori[num] = ext[num] + Lc * msg[num];
		y_parity[num] = Lc * parity[num];
	}
} 


inline void compute_gamma(llr_t* m11,llr_t* m10,const llr_t* apriori,const channel_t* y_parity)
{
	int k; for (k=0;k<(FRAME_LENGTH+4)/2;k++)
	{
		m11[2*k] = (apriori[2*k]+y_parity[2*k])/2;
		m10[2*k] = (apriori[2*k]-y_parity[2*k])/2;
		m11[2*k+1] = (apriori[2*k+1]+y_parity[2*k+1])/2;
		m10[2*k+1] = (apriori[2*k+1]-y_parity[2*k+1])/2;
	};
}
inline void compute_alpha(llr_t* alpha,const llr_t* m_11,const llr_t* m_10)
{
	int k;
	llr_t m11,m10;
	llr_t old0,old1,old2, old3, old4, old5, old6, old7;
	llr_t new0,new1,new2, new3, new4, new5, new6, new7;
	llr_t m_b0,m_b1,m_b2, m_b3, m_b4, m_b5, m_b6, m_b7;
	// initialize log_alpha[0][m]
	old0 = 0;
	old1 = -MAX/2;
	old2 = -MAX/2; old3 = -MAX/2;
	old4 = -MAX/2; old5 = -MAX/2;
	old6 = -MAX/2; old7 = -MAX/2;
	alpha[0*(FRAME_LENGTH)+0] = old0;
	alpha[0*(FRAME_LENGTH)+1] = old1;
	alpha[0*(FRAME_LENGTH)+2] = old2;
	alpha[0*(FRAME_LENGTH)+3] = old3;
	alpha[0*(FRAME_LENGTH)+4] = old4;
	alpha[0*(FRAME_LENGTH)+5] = old5;
	alpha[0*(FRAME_LENGTH)+6] = old6;
	alpha[0*(FRAME_LENGTH)+7] = old7;
	//
	// compute log_alpha[k][m]
	//
	for (k=1;k<=(FRAME_LENGTH+3);k++)
	{
		m11=m_11[k-1];
		m10=m_10[k-1];
		m_b0 = old1 + M1T;
		m_b1 = old1 + M1B;
		m_b2 = old3 + M3T;
		m_b3 = old3 + M3B;
		m_b4 = old5 + M5T;
		m_b5 = old5 + M5B;
		m_b6 = old7 + M7T;
		m_b7 = old7 + M7B;
		new0 = old0 + M0T;
		new4 = old0 + M0B;
		new1 = old2 + M2T;
		new5 = old2 + M2B;
		new2 = old4 + M4T;
		new6 = old4 + M4B;
		new3 = old6 + M6T;
		new7 = old6 + M6B;
		if (m_b0 > new0) new0=m_b0;
		alpha[k*STATES + 0] = new0;
		old0=new0;
		if (m_b4 > new2) new2=m_b4;
		alpha[k*STATES + 2] = new2;
		old2=new2;
		if (m_b1 > new4) new4=m_b1;
		alpha[k*STATES + 4] = new4;
		old4=new4;
		if (m_b5 > new6) new6=m_b5;
		alpha[k*STATES + 6] = new6;
		old6=new6;
		if (m_b2 > new1) new1=m_b2;
		alpha[k*STATES + 1] = new1;
		old1=new1;
		if (m_b6 > new3) new3=m_b6;
		alpha[k*STATES + 3] = new3;
		old3=new3;
		if (m_b3 > new5) new5=m_b3;
		alpha[k*STATES + 5] = new5;
		old5=new5;
		if (m_b7 > new7) new7=m_b7;
		alpha[k*STATES + 7] = new7;
		old7=new7;
	};
}
inline void compute_beta(llr_t* beta,const llr_t *m_11,const llr_t* m_10,const
						 llr_t* alpha)
{
	int k,m_max;
	llr_t old0, old1, old2, old3, old4, old5, old6, old7;
	llr_t new0, new1, new2, new3, new4, new5, new6, new7;
	llr_t m_b0, m_b1, m_b2, m_b3, m_b4,m_b5, m_b6, m_b7;
	llr_t m11,m10; llr_t denominator1, enumerator1;
	llr_t denominator2, enumerator2;
	llr_t max1, temp1, max2, temp2;
	int m_max1, m_max2;
	llr_t *beta1;
	//
	// initialize the first stage;
	// for state for which alpha iz maximum, set log_beta to 0,
	// set the other ones to –MAX.
	m_max1 = 0;
	max1 = alpha[((FRAME_LENGTH+3)*STATES)+0];
	temp1 = alpha[((FRAME_LENGTH+3)*STATES)+1];
	if (temp1 > max1) { m_max1 = 1; max1 = temp1;};
	temp1 = alpha[((FRAME_LENGTH+3)*STATES)+2];
	if (temp1 > max1) { m_max1 = 2; max1 = temp1;};
	temp1 = alpha[((FRAME_LENGTH+3)*STATES)+3];
	if (temp1 > max1) { m_max1 = 3; max1 = temp1;};
	m_max2 = 7; max2 = alpha[((FRAME_LENGTH+3)*STATES)+7];
	temp2 = alpha[((FRAME_LENGTH+3)*STATES)+6];
	if (temp2 > max2) { m_max2 = 6; max2 = temp2;};
	temp2 = alpha[((FRAME_LENGTH+3)*STATES)+5];
	if (temp2 > max2) { m_max2 = 5; max2 = temp2;};
	temp2 = alpha[((FRAME_LENGTH+3)*STATES)+4];
	if (temp2 > max2) { m_max2 = 4; max2 = temp2;};
	if (max2 > max1) m_max1 = m_max2;
	
	if (m_max1==0) old0=0; else old0 = -MAX/2;
	if (m_max1==1) old1=0; else old1 = -MAX/2;
	if (m_max1==2) old2=0; else old2 = -MAX/2;
	if (m_max1==3) old3=0; else old3 = -MAX/2;
	if (m_max1==4) old4=0; else old4 = -MAX/2;
	if (m_max1==5) old5=0; else old5 = -MAX/2;
	if (m_max1==6) old6=0; else old6 = -MAX/2;
	if (m_max1==7) old7=0; else old7 = -MAX/2;
	beta[(STATES*(FRAME_LENGTH+3)) + 0] = old0;
	beta[(STATES*(FRAME_LENGTH+3)) + 1] = old1;
	beta[(STATES*(FRAME_LENGTH+3)) + 2] = old2;
	beta[(STATES*(FRAME_LENGTH+3)) + 3] = old3;
	beta[(STATES*(FRAME_LENGTH+3)) + 4] = old4;
	beta[(STATES*(FRAME_LENGTH+3)) + 5] = old5;
	beta[(STATES*(FRAME_LENGTH+3)) + 6] = old6;
	beta[(STATES*(FRAME_LENGTH+3)) + 7] = old7;
	//
	// compute beta[k][m]
	//
	for (k=(FRAME_LENGTH+3-1);k>=0;k--)
	{
		m11=m_11[k];
		m10=m_10[k];
		m_b0 = old4 + M0B;
		m_b1 = old4 + M1B;
		m_b2 = old5 + M2B;
		m_b3 = old5 + M3B;
		m_b4 = old6 + M4B;
		m_b5 = old6 + M5B;
		m_b6 = old7 + M6B;
		m_b7 = old7 + M7B;
		new0 = old0 + M0T;
		new1 = old0 + M1T;
		new2 = old1 + M2T;
		new3 = old1 + M3T;
		new4 = old2 + M4T;
		new5 = old2 + M5T;
		new6 = old3 + M6T;
		new7 = old3 + M7T;
		if (m_b0 > new0) new0=m_b0;
		beta[k*STATES + 0] = new0;
		old0=new0;
		if (m_b1 > new1) new1=m_b1;
		beta[k*STATES + 1] = new1;
		old1=new1;
		if (m_b2 > new2) new2=m_b2;
		beta[k*STATES + 2] = new2;
		old2=new2;
		if (m_b3 > new3) new3=m_b3;
		beta[k*STATES + 3] = new3;
		old3=new3;
		if (m_b4 > new4) new4=m_b4;
		beta[k*STATES + 4] = new4;
		old4=new4;
		if (m_b5 > new5) new5=m_b5;
		beta[k*STATES + 5] = new5;
		old5=new5;
		if (m_b6 > new6) new6=m_b6;
		beta[k*STATES + 6] = new6;
		old6=new6;
		if (m_b7 > new7) new7=m_b7;
		beta[k*STATES + 7] = new7;
		old7=new7;
	};
}
inline void compute_ext(const llr_t* alpha,const llr_t* beta,const llr_t*
						m_11,const llr_t* m_10,llr_t* ext, const llr_t* apriori)
{
	int k;
	llr_t m11,m10;
	llr_t m00_1,m11_1,m00_2,m11_2,m00_3,m11_3,m00_4,m11_4;
	llr_t m01_1,m10_1,m01_2,m10_2,m01_3,m10_3,m01_4,m10_4;
	//
	// LLR computation
	//
	for (k=1;k<=(FRAME_LENGTH+3);k++)
	{
		m00_4 = ALPHA_BETA_4m00;
		m11_4 = ALPHA_BETA_4m11;
		m00_3 = ALPHA_BETA_3m00;
		m11_3 = ALPHA_BETA_3m11;
		m00_2 = ALPHA_BETA_2m00;
		m11_2 = ALPHA_BETA_2m11;
		m11_1 = ALPHA_BETA_1m11;
		m00_1 = ALPHA_BETA_1m00;
		m01_4 = ALPHA_BETA_4m01;
		m10_4 = ALPHA_BETA_4m10;
		m01_3 = ALPHA_BETA_3m01;
		m10_3 = ALPHA_BETA_3m10;
		m01_2 = ALPHA_BETA_2m01;
		m10_2 = ALPHA_BETA_2m10;
		
		m10_1 = ALPHA_BETA_1m10;
		m01_1 = ALPHA_BETA_1m01;
		if (m01_2 > m01_1) m01_1 = m01_2;
		if (m01_3 > m01_1) m01_1 = m01_3;
		if (m01_4 > m01_1) m01_1 = m01_4;
		if (m00_2 > m00_1) m00_1 = m00_2;
		if (m00_3 > m00_1) m00_1 = m00_3;
		if (m00_4 > m00_1) m00_1 = m00_4;
		if (m10_2 > m10_1) m10_1 = m10_2;
		if (m10_3 > m10_1) m10_1 = m10_3;
		if (m10_4 > m10_1) m10_1 = m10_4;
		if (m11_2 > m11_1) m11_1 = m11_2;
		if (m11_3 > m11_1) m11_1 = m11_3;
		if (m11_4 > m11_1) m11_1 = m11_4;
		m11=m_11[k-1];
		m10=m_10[k-1];
		m01_1 = m01_1 - m10;
		m00_1 = m00_1 - m11;
		m10_1 = m10_1 + m10;
		m11_1 = m11_1 + m11;
		if (m00_1 > m01_1) m01_1 = m00_1;
		if (m11_1 > m10_1) m10_1 = m11_1;
		ext[k-1] = m10_1 - m01_1 - apriori[k-1] ;
	};
}

⌨️ 快捷键说明

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