19.4.6.6.6 Subcarrier modulation mapping

xiaoxiao2021-02-27  277

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; }
转载请注明原文地址: https://www.6miu.com/read-5230.html

最新回复(0)