编程模拟相移键控gnuplot绘制星座图

什么是IQ调制解调?

  • IQ调制就是正交调制,是对于输入的I,Q两路信号,将I路信号与余弦信号相乘,Q路信号用来和正弦信号相乘,然后叠加在一起,对于输入的IQ信号,一般可以使用复数来表示,也就是对应于复平面上的一个点,再使用著名的欧拉公式,将原型转变一下,然后将相乘的结果取实部,任然可以实现正交调幅,这是利用了复数乘法的思想来实现的正交调幅。
  • IQ解调是把调制后产生的信号经过信道之后,分为两路,分别与原来的载波相乘,然后再分别积分,便可以输出原来的两路信号IQ。

如何使用正交调制实现数字键控调制?

对于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的时候,只需要将输入的原始数字信号进行两个两个一组的分开,分别实现。这个映射的结果可以通过星座图来表示出来,包括其他的一些调制。

c模拟相移键控gnuplot绘制星座图

什么是星座图?
对于数字信号调制中,使用载波的相位变化来反映输入数字信号,其中间的实现过程是搭载在正交调幅的基础之上的,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信号的原始星座图为:

编程模拟相移键控gnuplot绘制星座图_第1张图片

添加传输途中的高斯随机噪声精度0.05和相位偏移45度后

编程模拟相移键控gnuplot绘制星座图_第2张图片
当我增大高斯随机噪声的精度的时候,星座图变得散乱。
编程模拟相移键控gnuplot绘制星座图_第3张图片

再增大噪声的效果:

编程模拟相移键控gnuplot绘制星座图_第4张图片

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


16QAM星座图:
编程模拟相移键控gnuplot绘制星座图_第5张图片

加入精度为0.05的高斯噪声的时候:

编程模拟相移键控gnuplot绘制星座图_第6张图片

随着加入的高斯噪声的增大,调制的星座图会变得散乱在整个坐标上。

64QAM星座图:

编程模拟相移键控gnuplot绘制星座图_第7张图片

加入高斯噪声:

编程模拟相移键控gnuplot绘制星座图_第8张图片

改变相角旋转45度

编程模拟相移键控gnuplot绘制星座图_第9张图片

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,图中可以清晰的看到相位偏移与数字调制的映射关系。
编程模拟相移键控gnuplot绘制星座图_第10张图片
加入高斯噪声之后
编程模拟相移键控gnuplot绘制星座图_第11张图片

BPSK:
编程模拟相移键控gnuplot绘制星座图_第12张图片

加入一定的高斯白噪声:

编程模拟相移键控gnuplot绘制星座图_第13张图片

你可能感兴趣的:(通信)