📄 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 + -