📄 metric.cpp
字号:
/* Imaginary part --------------------------------------- */
/* Lowest bit defined by "vecSubsetDef3",highest defined
by "vecSubsetDef1" */
iTabInd0 =
((ExtractBit(vecSubsetDef1[k + 1]) & 1) << 2) |
(ExtractBit(vecSubsetDef3[k + 1]) & 1);
vecMetric[k + 1].rTow0 =
Minimum1((*pcInSymb)[i].cSig.imag(),
rTableQAM64HMsym[iTabInd0][1], (*pcInSymb)[i].rChan);
vecMetric[k + 1].rTow1 =
Minimum1((*pcInSymb)[i].cSig.imag(),
rTableQAM64HMsym[iTabInd0 | (1 << 1)][1],
(*pcInSymb)[i].rChan);
}
else
{
/* There are two possible points for each bit. Both have to
be used. In the first step: {i_2} = 0, Higest bit
defined by "vecSubsetDef1" */
/* Real part -------------------------------------------- */
iTabInd0 = ((ExtractBit(vecSubsetDef1[k]) & 1) << 2);
vecMetric[k].rTow0 =
Minimum2((*pcInSymb)[i].cSig.real(),
rTableQAM64HMsym[iTabInd0][0],
rTableQAM64HMsym[iTabInd0 | 1][0],
(*pcInSymb)[i].rChan);
iTabInd0 = ((ExtractBit(vecSubsetDef1[k]) & 1) << 2) |
(1 << 1);
vecMetric[k].rTow1 =
Minimum2((*pcInSymb)[i].cSig.real(),
rTableQAM64HMsym[iTabInd0][0],
rTableQAM64HMsym[iTabInd0 | 1][0],
(*pcInSymb)[i].rChan);
/* Imaginary part --------------------------------------- */
iTabInd0 = ((ExtractBit(vecSubsetDef1[k + 1]) & 1) << 2);
vecMetric[k + 1].rTow0 =
Minimum2((*pcInSymb)[i].cSig.imag(),
rTableQAM64HMsym[iTabInd0][1],
rTableQAM64HMsym[iTabInd0 | 1][1],
(*pcInSymb)[i].rChan);
iTabInd0 = ((ExtractBit(vecSubsetDef1[k + 1]) & 1) << 2) |
(1 << 1);
vecMetric[k + 1].rTow1 =
Minimum2((*pcInSymb)[i].cSig.imag(),
rTableQAM64HMsym[iTabInd0][1],
rTableQAM64HMsym[iTabInd0 | 1][1],
(*pcInSymb)[i].rChan);
}
}
break;
case 2:
for (i = 0, k = 0; i < iInputBlockSize; i++, k += 2)
{
/* Real part ------------------------------------------------ */
/* Higest bit defined by "vecSubsetDef1" next bit defined
by "vecSubsetDef2" */
iTabInd0 =
((ExtractBit(vecSubsetDef1[k]) & 1) << 2) |
((ExtractBit(vecSubsetDef2[k]) & 1) << 1);
vecMetric[k].rTow0 = Minimum1((*pcInSymb)[i].cSig.real(),
rTableQAM64HMsym[iTabInd0][0], (*pcInSymb)[i].rChan);
vecMetric[k].rTow1 = Minimum1((*pcInSymb)[i].cSig.real(),
rTableQAM64HMsym[iTabInd0 | 1][0], (*pcInSymb)[i].rChan);
/* Imaginary part ------------------------------------------- */
/* Higest bit defined by "vecSubsetDef1" next bit defined
by "vecSubsetDef2" */
iTabInd0 =
((ExtractBit(vecSubsetDef1[k + 1]) & 1) << 2) |
((ExtractBit(vecSubsetDef2[k + 1]) & 1) << 1);
/* Calculate distances, imaginary part */
vecMetric[k + 1].rTow0 = Minimum1((*pcInSymb)[i].cSig.imag(),
rTableQAM64HMsym[iTabInd0][1], (*pcInSymb)[i].rChan);
vecMetric[k + 1].rTow1 = Minimum1((*pcInSymb)[i].cSig.imag(),
rTableQAM64HMsym[iTabInd0 | 1][1], (*pcInSymb)[i].rChan);
}
break;
}
break;
case CParameter::CS_3_HMMIX:
/**********************************************************************/
/* 64QAM HMmix ********************************************************/
/**********************************************************************/
/* (i_0 i_1 i_2 q_0 q_1 q_2) =
(y_0,0Re y_1,0Re y_2,0Re y_0,0Im y_1,0Im y_2,0Im) */
switch (iLevel)
{
case 0:
for (i = 0; i < iInputBlockSize; i++)
{
if (bIteration == TRUE)
{
/* Real part -------------------------------------------- */
/* Lowest bit defined by "vecSubsetDef5" next bit defined
by "vecSubsetDef3" */
iTabInd0 =
(ExtractBit(vecSubsetDef5[i]) & 1) |
((ExtractBit(vecSubsetDef3[i]) & 1) << 1);
vecMetric[i].rTow0 = Minimum1((*pcInSymb)[i].cSig.real(),
rTableQAM64HMmix[iTabInd0][0], (*pcInSymb)[i].rChan);
vecMetric[i].rTow1 = Minimum1((*pcInSymb)[i].cSig.real(),
rTableQAM64HMmix[iTabInd0 | (1 << 2)][0],
(*pcInSymb)[i].rChan);
}
else
{
/* Real part -------------------------------------------- */
vecMetric[i].rTow0 = Minimum4((*pcInSymb)[i].cSig.real(),
rTableQAM64HMmix[BI_000 /* [0 0 0] */][0],
rTableQAM64HMmix[BI_001 /* [0 0 1] */][0],
rTableQAM64HMmix[BI_010 /* [0 1 0] */][0],
rTableQAM64HMmix[BI_011 /* [0 1 1] */][0],
(*pcInSymb)[i].rChan);
vecMetric[i].rTow1 = Minimum4((*pcInSymb)[i].cSig.real(),
rTableQAM64HMmix[BI_100 /* [1 0 0] */][0],
rTableQAM64HMmix[BI_101 /* [1 0 1] */][0],
rTableQAM64HMmix[BI_110 /* [1 1 0] */][0],
rTableQAM64HMmix[BI_111 /* [1 1 1] */][0],
(*pcInSymb)[i].rChan);
}
}
break;
case 1:
for (i = 0; i < iInputBlockSize; i++)
{
if (bIteration == TRUE)
{
/* Imaginary part --------------------------------------- */
/* Lowest bit defined by "vecSubsetDef6" next bit defined
by "vecSubsetDef4" */
iTabInd0 =
(ExtractBit(vecSubsetDef6[i]) & 1) |
((ExtractBit(vecSubsetDef4[i]) & 1) << 1);
/* Calculate distances, imaginary part */
vecMetric[i].rTow0 = Minimum1((*pcInSymb)[i].cSig.imag(),
rTableQAM64HMmix[iTabInd0][1], (*pcInSymb)[i].rChan);
vecMetric[i].rTow1 = Minimum1((*pcInSymb)[i].cSig.imag(),
rTableQAM64HMmix[iTabInd0 | (1 << 2)][1],
(*pcInSymb)[i].rChan);
}
else
{
/* Imaginary part --------------------------------------- */
vecMetric[i].rTow0 = Minimum4((*pcInSymb)[i].cSig.imag(),
rTableQAM64HMmix[BI_000 /* [0 0 0] */][1],
rTableQAM64HMmix[BI_001 /* [0 0 1] */][1],
rTableQAM64HMmix[BI_010 /* [0 1 0] */][1],
rTableQAM64HMmix[BI_011 /* [0 1 1] */][1],
(*pcInSymb)[i].rChan);
vecMetric[i].rTow1 = Minimum4((*pcInSymb)[i].cSig.imag(),
rTableQAM64HMmix[BI_100 /* [1 0 0] */][1],
rTableQAM64HMmix[BI_101 /* [1 0 1] */][1],
rTableQAM64HMmix[BI_110 /* [1 1 0] */][1],
rTableQAM64HMmix[BI_111 /* [1 1 1] */][1],
(*pcInSymb)[i].rChan);
}
}
break;
case 2:
for (i = 0; i < iInputBlockSize; i++)
{
if (bIteration == TRUE)
{
/* Real part -------------------------------------------- */
/* Lowest bit defined by "vecSubsetDef5",highest defined
by "vecSubsetDef1" */
iTabInd0 =
((ExtractBit(vecSubsetDef1[i]) & 1) << 2) |
(ExtractBit(vecSubsetDef5[i]) & 1);
vecMetric[i].rTow0 = Minimum1((*pcInSymb)[i].cSig.real(),
rTableQAM64HMmix[iTabInd0][0], (*pcInSymb)[i].rChan);
vecMetric[i].rTow1 = Minimum1((*pcInSymb)[i].cSig.real(),
rTableQAM64HMmix[iTabInd0 | (1 << 1)][0],
(*pcInSymb)[i].rChan);
}
else
{
/* There are two possible points for each bit. Both have to
be used. In the first step: {i_2} = 0, Higest bit
defined by "vecSubsetDef1" */
/* Real part -------------------------------------------- */
iTabInd0 = ((ExtractBit(vecSubsetDef1[i]) & 1) << 2);
vecMetric[i].rTow0 = Minimum2((*pcInSymb)[i].cSig.real(),
rTableQAM64HMmix[iTabInd0][0],
rTableQAM64HMmix[iTabInd0 | 1][0],
(*pcInSymb)[i].rChan);
iTabInd0 =
((ExtractBit(vecSubsetDef1[i]) & 1) << 2) | (1 << 1);
vecMetric[i].rTow1 = Minimum2((*pcInSymb)[i].cSig.real(),
rTableQAM64HMmix[iTabInd0][0],
rTableQAM64HMmix[iTabInd0 | 1][0],
(*pcInSymb)[i].rChan);
}
}
break;
case 3:
for (i = 0; i < iInputBlockSize; i++)
{
if (bIteration == TRUE)
{
/* Imaginary part --------------------------------------- */
/* Lowest bit defined by "vecSubsetDef6",highest defined
by "vecSubsetDef2" */
iTabInd0 =
((ExtractBit(vecSubsetDef2[i]) & 1) << 2) |
(ExtractBit(vecSubsetDef6[i]) & 1);
vecMetric[i].rTow0 = Minimum1((*pcInSymb)[i].cSig.imag(),
rTableQAM64HMmix[iTabInd0][1], (*pcInSymb)[i].rChan);
vecMetric[i].rTow1 = Minimum1((*pcInSymb)[i].cSig.imag(),
rTableQAM64HMmix[iTabInd0 | (1 << 1)][1],
(*pcInSymb)[i].rChan);
}
else
{
/* There are two possible points for each bit. Both have to
be used. In the first step: {i_2} = 0, Higest bit
defined by "vecSubsetDef1" */
/* Imaginary part ------------------------------------------- */
iTabInd0 = ((ExtractBit(vecSubsetDef2[i]) & 1) << 2);
vecMetric[i].rTow0 = Minimum2((*pcInSymb)[i].cSig.imag(),
rTableQAM64HMmix[iTabInd0][1],
rTableQAM64HMmix[iTabInd0 | 1][1], (*pcInSymb)[i].rChan);
iTabInd0 =
((ExtractBit(vecSubsetDef2[i]) & 1) << 2) | (1 << 1);
vecMetric[i].rTow1 = Minimum2((*pcInSymb)[i].cSig.imag(),
rTableQAM64HMmix[iTabInd0][1],
rTableQAM64HMmix[iTabInd0 | 1][1], (*pcInSymb)[i].rChan);
}
}
break;
case 4:
for (i = 0; i < iInputBlockSize; i++)
{
/* Real part ------------------------------------------------ */
/* Higest bit defined by "vecSubsetDef1" next bit defined
by "vecSubsetDef2" */
iTabInd0 =
((ExtractBit(vecSubsetDef1[i]) & 1) << 2) |
((ExtractBit(vecSubsetDef3[i]) & 1) << 1);
vecMetric[i].rTow0 = Minimum1((*pcInSymb)[i].cSig.real(),
rTableQAM64HMmix[iTabInd0][0], (*pcInSymb)[i].rChan);
vecMetric[i].rTow1 = Minimum1((*pcInSymb)[i].cSig.real(),
rTableQAM64HMmix[iTabInd0 | 1][0], (*pcInSymb)[i].rChan);
}
break;
case 5:
for (i = 0; i < iInputBlockSize; i++)
{
/* Imaginary part ------------------------------------------- */
/* Higest bit defined by "vecSubsetDef1" next bit defined
by "vecSubsetDef2" */
iTabInd0 =
((ExtractBit(vecSubsetDef2[i]) & 1) << 2) |
((ExtractBit(vecSubsetDef4[i]) & 1) << 1);
/* Calculate distances, imaginary part */
vecMetric[i].rTow0 = Minimum1((*pcInSymb)[i].cSig.imag(),
rTableQAM64HMmix[iTabInd0][1], (*pcInSymb)[i].rChan);
vecMetric[i].rTow1 = Minimum1((*pcInSymb)[i].cSig.imag(),
rTableQAM64HMmix[iTabInd0 | 1][1], (*pcInSymb)[i].rChan);
}
break;
}
break;
}
#ifdef USE_ERASURE_FOR_FASTER_ACQ
/* Take care of special case with "CS_3_HMMIX" */
if (eMapType != CParameter::CS_3_HMMIX)
{
for (i = 0; i < iInputBlockSize; i++)
{
/* If input symbol is erasure, reset metrics to zero */
if ((*pcInSymb)[i].rChan == ERASURE_TAG_VALUE)
{
vecMetric[2 * i].rTow0 = (_REAL) 0.0;
vecMetric[2 * i].rTow1 = (_REAL) 0.0;
vecMetric[2 * i + 1].rTow0 = (_REAL) 0.0;
vecMetric[2 * i + 1].rTow1 = (_REAL) 0.0;
}
}
}
else
{
for (i = 0; i < iInputBlockSize; i++)
{
/* If input symbol is erasure, reset metrics to zero */
if ((*pcInSymb)[i].rChan == ERASURE_TAG_VALUE)
{
vecMetric[i].rTow0 = (_REAL) 0.0;
vecMetric[i].rTow1 = (_REAL) 0.0;
}
}
}
#endif
}
void CMLCMetric::Init(int iNewInputBlockSize, CParameter::ECodScheme eNewCodingScheme)
{
iInputBlockSize = iNewInputBlockSize;
eMapType = eNewCodingScheme;
}
/* Cleanup definitions afterwards */
#undef BI_00
#undef BI_01
#undef BI_10
#undef BI_11
#undef BI_000
#undef BI_001
#undef BI_010
#undef BI_011
#undef BI_100
#undef BI_101
#undef BI_110
#undef BI_111
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -