19.4.6.6.6 Subcarrier modulation mapping

来源:互联网 发布:linux脚本怎么建立 编辑:程序博客网 时间:2024/05/16 12:57
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,但是输出时需要转换成b3b2b1b0if(module == BPSK){//输人(b0) I路输出 Q路输出//        0    -1    0//        1    1     0int_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     0int_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    1int_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     1int_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    3int_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         5int_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通道不使用填充0return cnt;}

0 0
原创粉丝点击