对于BPSK:
BPSK的实现原理是使用不同的相位来表示不同的信号源,分别是0相位和Π相位,他们的载波信号都是余弦信号cos信号,频率相同,只是相位不一样,对于BPSK的最初定义是,当输入的信号是0的时候,相位为0,当输入信号为1时,相位为Π。
QPSK:
依据上面的BPSK,推到得出QPSK就是拥有四个相位,那么同理,四个相位就可以表示四种形式的数字信号,分别是00,01,10,11。
8PSK:
同理,同上所述,8PSK就是输入的原始信号拥有8种初始状态,那么,就需要8种相位来表示这些信号。
16QAM和64QAM:
QAM技术是将ASK技术和PSK级数结合起来的技术,16QAM表示为16种状态,一个状态4比特,64QAM表示为64种调制状态,一个状态表示8比特信息。
那么QPSK具体是如何实现的呢:
当在正交调幅的IQ输入端输入+1,-1组成的四种不同的形式的初始信号的时候,得到的调制信号的结果有对应的四个,他们的区别在于拥有不同的初始相位,当然,这个时候信号的幅值不是1,若需要调制为1.只需要改变输入信号的幅值,因此,在实现QPSK的时候,只需要将输入的原始数字信号进行两个两个一组的分开,分别实现。这个映射的结果可以通过星座图来表示出来,包括其他的一些调制。
什么是星座图?
对于数字信号调制中,使用载波的相位变化来反映输入数字信号,其中间的实现过程是搭载在正交调幅的基础之上的,QPSK的调制解调过程,使用星座图就能完全反映出数字信号映射的过程。
在用c语言画星座图的过程中,使用随机数函数产生许多个映射后的QPSK的I,Q两路的输入数据的数值,若将I,Q两路信号看成实部和虚部组合的复数,然后将实部看为横轴即I路虚部看成纵轴即Q路,那么,就可以利用IQ两路数据直接画出QPSK调制后的星座图。对于信号传输的过程,使用高斯随机数模拟,在信号中添加高斯随机数,对于相角的偏移,也可以通过c定义变量来使用三角函数处理其相角偏转。
//QPSK星座图
#include
#include
#include
#define PI 3.14159265
double randn()
{
double r1,r2;
r1=(double)rand()/RAND_MAX;
r2=(double)rand()/RAND_MAX;
return sqrt(-2*log(r1+1e-100))*cos(2*PI*r2);
}
main(int argc, char *argv[])
{
double x,y,x1,y1,s=45;
int i;
double a=0.05;
srand(1234);
if(argc!=3)
{
printf("#Usage: a.exe att angle\n");
printf("#Default: a.exe 0.05 45\n");
}
else
{
a=atof(argv[1]);
s=atof(argv[2]);
}
s=s/180.0*PI;
FILE *fp=fopen("QPSK.dat","w");
for(i=0; i<1000; i++)
{
x=((double)rand()/RAND_MAX>0.5)? 1:-1;
y=((double)rand()/RAND_MAX>0.5)? 1:-1;
x=x+a*randn();
y=y+a*randn();
x1=x*cos(s)-y*sin(s);
y1=x*sin(s)+y*cos(s);
fprintf(fp,"%f\t%f\n",x1,y1);
}
fclose(fp);
}
对于无噪声干扰无相位偏移的qpsk信号的原始星座图为:
添加传输途中的高斯随机噪声精度0.05和相位偏移45度后
再增大噪声的效果:
16QAM,64QAM星座图:
//16,64pQAM星座图
#include
#include
#include
#define PI 3.14159265
double randn()
{
double r1,r2;
r1=(double)rand()/RAND_MAX;
r2=(double)rand()/RAND_MAX;
return sqrt(-2*log(r1+1e-100))*cos(2*PI*r2);
}
main(int argc, char *argv[])
{
double x,y,x1,y1,s=0,c;
int i;
int M=sqrt(64);
double a=0.05;
srand(1234);
if(argc!=4)
{
printf("#Usage: a.exe att angle\n");
printf("#Default: 64QAM a.exe 0.05 0 64\n");
}
else
{
a=atof(argv[1]);
s=atof(argv[2]);
M=sqrt(atoi(argv[3]));
}
s=s/180.0*PI;
FILE *fp=fopen("psk.dat","w");
for(i=0; i<1000; i++)
{
x=(rand()%M)*2-M+1;
y=(rand()%M)*2-M+1;
x=x+a*randn();
y=y+a*randn();
x1=x*cos(s)-y*sin(s);
y1=x*sin(s)+y*cos(s);
fprintf(fp,"%f\t%f\n",x1,y1);
}
}
加入精度为0.05的高斯噪声的时候:
随着加入的高斯噪声的增大,调制的星座图会变得散乱在整个坐标上。
64QAM星座图:
加入高斯噪声:
改变相角旋转45度
8PSK和MPSK,同理使用c语言产生描绘星座图的复数的实数点和虚数点,对于8psk,实部和虚部都是产生五个数值的点,分别对应不同的相位角。BPSK产生只是实部的两个数值,分别对应相角0和Π。
//8psk和mpsk星座图
#include
#include
#include
#define PI 3.14159265
double randn()
{
double r1,r2;
r1=(double)rand()/RAND_MAX;
r2=(double)rand()/RAND_MAX;
return sqrt(-2*log(r1+1e-100))*cos(2*PI*r2);
}
main(int argc, char *argv[])
{
double x,y,x1,y1,s=0;
int i;
int M=8;
double a=0.05;
srand(12345678);
if(argc!=4)
{
printf("#Usage: a.exe att angle\n");
printf("#Default: 8PSK a.exe 0.05 0 8\n");
}
else
{
a=atof(argv[1]);
s=atof(argv[2]);
M=atoi(argv[3]);
}
s=s/180.0*PI;
FILE *fp=fopen("psk.dat","w");
for(i=0; i<1000; i++)
{
x=(double)(rand()%M)/M*2*PI;
y=10*sin(x);
x=10*cos(x);
x=x+a*randn();
y=y+a*randn();
x1=x*cos(s)-y*sin(s);
y1=x*sin(s)+y*cos(s);
fprintf(fp,"%f\t%f\n",x1,y1);
}
fclose(fp);
}
gnuplot绘制8PSK,图中可以清晰的看到相位偏移与数字调制的映射关系。
加入高斯噪声之后
加入一定的高斯白噪声: