📄 common.c
字号:
{
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 + -