19.4.6.6.6 Subcarrier modulation mapping

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值