uint_8 get_bit_value(uint_8 *bin, const int size)
{
//bn...b4b3b2b1b0这样的顺序
uint_8 bitval = bin[0];
for (int i = 1; i < size; i++)
{
bitval |= (bin[i] << i);
}
return bitval;
}
int_32 Subcarrier_Modulation_Mapping(IN int_32 module, IN uint_8 indat[], int_32 inlen, OUT Complex outdat[])
{
int_32 i = 0;
uint_8 bitval = 0;
int_32 cnt = 0;
//indat 把bit stream转换成了byte stream,每一个bit对应一个byte
//b0最先输出,所以多个bit进行map时,最后输出要反转
//例如map时输入b0b1b2b3,但是输出时需要转换成b3b2b1b0
if(module == BPSK)
{
//输人(b0) I路输出 Q路输出
// 0 -1 0
// 1 1 0
int_16 code_bpsk[2] = { -1, 1};
//const double kmod_bpsk = 1;
for(i = 0; i < inlen;)
{
bitval = indat[i++] & 0x01;
outdat[cnt][0] = code_bpsk[bitval];
outdat[cnt][1] = 0;
cnt++;
}
}
else if(module == DBPSK)
{
//输人(b0) I路输出 Q路输出
// 0 -1 0
// 1 1 0
int_16 code_bpsk[2] = { -1, 1};
//const double kmod_bpsk = 1;
for(i = 0; i < inlen;)
{
bitval = indat[i++] & 0x01;
outdat[cnt][0] = 0;
outdat[cnt][1] = code_bpsk[bitval];
cnt++;
}
}
else if(module == QPSK)
{
//输人(b0) I路输出 输人(b1) Q路输出
// 0 -1 0 -1
// 1 1 1 1
int_16 code_qpsk[2] = { -1, 1};
const double kmod_qpsk = 0.7071; // 1/(√2)
if(inlen % 2)
{
err("VSG QPSK mapping\n");
return 0;
}
for(i = 0; i < inlen;)
{
bitval = indat[i++] & 0x01;
outdat[cnt][0] = code_qpsk[bitval] * kmod_qpsk;
bitval = indat[i++] & 0x01;
outdat[cnt][1] = code_qpsk[bitval] * kmod_qpsk;
cnt++;
}
}
else if(module == QAM16)
{
//输人(b0b1) 1路输出 输入(b2b3) 转换 (b1b0) 1路输出
// 00 -3 00 -3 00 -3
// 01 -1 01 -1 01 3
// 11 1 11 1 10 -1
// 10 3 10 3 11 1
int_16 code_qam16[4] = { -3, 3, -1, 1};
const double kmod_qam16 = 0.3162; // 1/(√10)
const int N_BPSC = 2;
if(inlen % 4)
{
err("VSG QAM16 mapping\n");
return 0;
}
for(i = 0; i < inlen;)
{
bitval = get_bit_value(&indat[i], N_BPSC);
outdat[cnt][0] = code_qam16[bitval] * kmod_qam16;
i += N_BPSC;
bitval = get_bit_value(&indat[i], N_BPSC);
outdat[cnt][1] = code_qam16[bitval] * kmod_qam16;
i += N_BPSC;
cnt++;
}
}
else if(module == QAM64)
{
//输人(b0b1b2) I路输出 输人(b3b4b5) Q路输出 转换 输人(b2b1b0) I路输出
// 000 -7 000 -7 000 -7
// 001 -5 001 -5 001 7
// 011 -3 011 -3 010 -1
// 010 -1 010 -1 011 1
// 110 1 110 1 100 -5
// 111 3 111 3 101 5
// 101 5 101 5 110 -3
// 100 7 100 7 111 3
int_16 code_qam64[8] = { -7, 7, -1, 1, -5, 5, -3, 3};
const double kmod_qam64 = 0.1543; // 1/(√42)
const int N_BPSC = 3;
if(inlen % 6)
{
err("VSG QAM64 mapping\n");
return 0;
}
for(i = 0; i < inlen;)
{
bitval = get_bit_value(&indat[i], N_BPSC);
outdat[cnt][0] = code_qam64[bitval] * kmod_qam64;
i += N_BPSC;
bitval = get_bit_value(&indat[i], N_BPSC);
outdat[cnt][1] = code_qam64[bitval] * kmod_qam64;
i += N_BPSC;
cnt++;
}
}
else if(module == QAM256)
{
//输人(b0b1b2b3) I路输出 输人(b4b5b6b7) Q路输出 转换 输人(b3b2b1b0) I路输出
// 0000 -15 0000 -15 0000 -15
// 0001 -13 0001 -13 1000 15
// 0011 -11 0011 -11 0100 -1
// 0010 -9 0010 -9 1100 1
// 0110 -7 0110 -7 0010 -9
// 0111 -5 0111 -5 1010 9
// 0101 -3 0101 -3 0110 -7
// 0100 -1 0100 -1 1110 7
// 1100 1 1100 1 0001 -13
// 1101 3 1101 3 1001 13
// 1111 5 1111 5 0101 -3
// 1110 7 1110 7 1101 3
// 1010 9 1010 9 0011 -11
// 1011 11 1011 11 1011 11
// 1001 13 1001 13 0111 -5
// 1000 15 1000 15 1111 5
int_16 code_qam256[16] = { -15, 15, -1, 1, -9, 9, -7, 7, -13, 13, -3, 3, -11, 11, -5, 5};
const double kmod_qam256 = 0.076696498884737; // 1/(√170)
const int N_BPSC = 4;
if(inlen % 8)
{
err("VSG QAM256 mapping\n");
return 0;
}
for(i = 0; i < inlen;)
{
bitval = get_bit_value(&indat[i], N_BPSC);
outdat[cnt][0] = code_qam256[bitval] * kmod_qam256;
i += N_BPSC;
bitval = get_bit_value(&indat[i], N_BPSC);
outdat[cnt][1] = code_qam256[bitval] * kmod_qam256;
i += N_BPSC;
cnt++;
}
}
else
{
err("Subcarrier_Modulation_Mapping\n");
return 0;
}
//说明:11A中
// 每次总数据流中取出NCbps54位,然后再以NBpsc54位对其分解成48个通道数据. 再经过映射得到48个复数;
// 48个复数分别放到通道-26,+26中(其中-21,-7,7,21通道保留不存入数据,用于后面插入导频; 0通道放到复数0)
// 其它-32,-27; 27,31通道不使用填充0
return cnt;
}