📄 modulating.cpp
字号:
#include "parameter_sets.h"
const double sqrt2norm[4] = {1.0, 1.414213562373095, 3.16227766016838, 6.48074069840786};
// {sqrt(1), sqrt(2), sqrt(10), sqrt(42)}, derived from Matlab 2006R
const Complex constMap_bpsk[2] = {{1.0, 0}, {-1.0, 0}};
const Complex constMap_qpsk[4] = {{1.0, 1.0}, {1.0, -1.0}, {-1.0, 1.0}, {-1.0, -1.0}};
const Complex constMap_16qam[16] = {{1.0, 1.0}, {1.0, 3.0}, {1.0, -1.0}, {1.0,-3.0}, {3.0, 1.0},
{3.0, 3.0}, {3.0, -1.0}, {3.0, -3.0}, {-1.0, 1.0}, {-1.0, 3.0}, {-1.0, -1.0}, {-1.0, -3.0},
{-3.0, 1.0}, {-3.0, 3.0}, {-3.0, -1.0}, {-3.0, -3.0}};
const Complex constMap_64qam[64] = {{3.0, 3.0}, {3.0, 1.0}, {3.0, 5.0}, {3.0, 7.0}, {3.0, -3.0},
{3.0, -1.0}, {3.0, -5.0}, {3.0, -7.0}, {1.0, 3.0}, {1.0, 1.0}, {1.0, 5.0}, {1.0, 7.0}, {1.0, -3.0},
{1.0, -1.0}, {1.0, -5.0}, {1.0, -7.0}, {5.0, 3.0}, {5.0, 1.0}, {5.0, 5.0}, {5.0, 7.0}, {5.0, -3.0},
{5.0, -1.0}, {5.0, -5.0}, {5.0, -7.0}, {7.0, 3.0}, {7.0, 1.0}, {7.0, 5.0}, {7.0, 7.0}, {7.0, -3.0},
{7.0, -1.0}, {7.0, -5.0}, {7.0, -7.0}, {-3.0, 3.0}, {-3.0, 1.0}, {-3.0, 5.0}, {-3.0, 7.0}, {-3.0, -3.0},
{-3.0, -1.0}, {-3.0, -5.0}, {-3.0, -7.0}, {-1.0, 3.0}, {-1.0, 1.0}, {-1.0, 5.0}, {-1.0, 7.0},
{-1.0, -3.0}, {-1.0, -1.0}, {-1.0, -5.0}, {-1.0, -7.0}, {-5.0, 3.0}, {-5.0, 1.0}, {-5.0, 5.0},
{-5.0, 7.0}, {-5.0, -3.0}, {-5.0, -1.0}, {-5.0, -5.0}, {-5.0, -7.0}, {-7.0, 3.0}, {-7.0, 1.0},
{-7.0, 5.0}, {-7.0, 7.0}, {-7.0, -3.0}, {-7.0, -1.0}, {-7.0, -5.0}, {-7.0, -7.0}};
struct Complex * ModulatingF(struct BasicParaS * ctrl, int * input, int N)
{
struct Complex * output;
int i, r, temp;
switch (ctrl->typeModu)
{
case 0: //BPSK
r = 1;
break;
case 1: //QPSK
r = 2;
break;
case 2: //16QAM
r = 4;
break;
case 3: //64QAM
r = 6;
break;
default:
exit(EXIT_FAILURE);
}
ctrl->numSymOut = N/r; //输出符号数=码长/r
ctrl->bitsPerSym = r; //每个符号含r个bit
if (ctrl->codeN%r)
{
printf("The number of symbols is not an integer!!!\n");
exit(EXIT_FAILURE);
}
output = new struct Complex[ctrl->numSymOut];
switch (ctrl->typeModu)
{
case 0: //BPSK
for (i=0; i<ctrl->numSymOut; i++)
{
temp = *(input+i);
(*(output+i)).real = constMap_bpsk[temp].real/sqrt2norm[0];
(*(output+i)).imag = constMap_bpsk[temp].imag/sqrt2norm[0];
}
break;
case 1: //QPSK
for (i=0; i<ctrl->numSymOut; i++)
{
temp = (*(input+2*i))*2+(*(input+2*i+1));
(*(output+i)).real = constMap_qpsk[temp].real/sqrt2norm[1];
(*(output+i)).imag = constMap_qpsk[temp].imag/sqrt2norm[1];
}
break;
case 2:
for (i=0; i<ctrl->numSymOut; i++)
{
temp = (*(input+4*i))*8+(*(input+4*i+1))*4+(*(input+4*i+2))*2+(*(input+4*i+3));
(*(output+i)).real = constMap_16qam[temp].real/sqrt2norm[2];
(*(output+i)).imag = constMap_16qam[temp].imag/sqrt2norm[2];
}
break;
case 3:
for (i=0; i<ctrl->numSymOut; i++)
{
temp = (*(input+6*i))*32+(*(input+6*i+1))*16+(*(input+6*i+2))*8+(*(input+6*i+3))*4+
(*(input+6*i+4))*2+(*(input+6*i+5))*1;
(*(output+i)).real = constMap_64qam[temp].real/sqrt2norm[3];
(*(output+i)).imag = constMap_64qam[temp].imag/sqrt2norm[3];
}
break;
default:
exit(EXIT_FAILURE);
}
if (ctrl->mode == 1)
{
printf("The modulated symbol are ..\n");
temp = 0;
for (i=0; i<ctrl->numSymOut; i++)
{
printf(" %.3f+j%.3f", (*(output+i)).real, (*(output+i)).imag);
temp++;
if (temp == 4)
{
printf("\n");
temp = 0;
}
}
}
return output;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -