📄 1.cpp
字号:
/*******************************************************************************************
#include<iostream>
#include<math.h>
using namespace std;
int A[45];//定义了一个全局变量,他代表的是我们产生的伪随即序列
void msequence() //该函数产生一个15位的m序列,函数内容可以忽略不看哈
{ int i,j;
int a[5]={1,0,1,0,1};
for(j=0;j<45;j++)
{
int temp=(a[0]+a[3])%2;
if(j%15==0) cout<<endl;
A[j]=a[4];
for(i=4;i>=0;i--)
a[i]=a[i-1];
a[0]=temp;
}
}
int main()//主程序
{
int i,j,d;
float Z=sqrt(2)/2;//Z是二分之根号2(8PSK中的某个实部或虚部的坐标)
float b[5]={1,Z,0,-Z,-1};//星座图中某点的实部数组
float c[5]={1,Z,0,-Z,-1};//星座图中某点的虚部数组
msequence();
for(i=0;i<45;i++) cout<<A[i];
cout<<endl;
for(j=0;j<15;j++)
{
for(i=2;i>=0;i--)
{cout<<A[i];}
cout<<endl;
d=A[2]*4+A[1]*2+A[0]*1;//每3个比特映射成一个符号或者叫码元,将二元码转换为自然数
for(i=0;i<42;i++)
A[i]=A[i+3];//不断将调制码元往后移位,每次移位数为3
switch(d)//根据3个比特数据选择他在8PSK中映射的星座点,以坐标形式来表示输出
{case(0):cout<<"("<<b[0]<<","<<c[2]<<")"<<endl; continue;
case(1):cout<<"("<<b[1]<<","<<c[1]<<")"<<endl; continue;
case(3):cout<<"("<<b[2]<<","<<c[0]<<")"<<endl; continue;
case(2):cout<<"("<<b[3]<<","<<c[1]<<")"<<endl; continue;
case(6):cout<<"("<<b[4]<<","<<c[2]<<")"<<endl; continue;
case(7):cout<<"("<<b[3]<<","<<c[3]<<")"<<endl; continue;
case(5):cout<<"("<<b[2]<<","<<c[4]<<")"<<endl; continue;
case(4):cout<<"("<<b[1]<<","<<c[3]<<")"<<endl; continue;
}
}
return 0;
}
********************************************************************************************/
#include<iostream>
#include<math.h>
using namespace std;
int A[45];//定义全局变量A数组,在程序中,这个数组表示的是我们得到的伪随机序列
void msequence() //15位M序列发生器函数
{ int i,j;
int a[5]={1,0,1,0,1};
for(j=0;j<45;j++)
{
int temp=(a[0]+a[3])%2;
if(j%15==0) cout<<endl;
A[j]=a[4];
for(i=4;i>=0;i--)
a[i]=a[i-1];
a[0]=temp;
}
}
int main()//主程序
{
int i,j,d,g;
float Z=sqrt(2)/2;//8PSK星座图中某些点的坐标值
float b[5]={1,Z,0,-Z,-1};//星座图中实部数组
float c[5]={1,Z,0,-Z,-1};//星座图中虚部数组
float xx,xy,yx,yy;//两根发射天线上发送的数据,其中xx表示X1的实部,xy表示X1的虚部,yx表示X2的实部,yy表示X2的虚部
msequence();//调用m序列函数发生器产生一个15位的m序列
for(i=44;i>=0;i--) cout<<A[i];//先将产生的序列输出(与产生顺序相反的方向输出,便于检测)
cout<<endl;
for(j=0;j<7;j++)//本程序中共有45个比特的数据,我们每次需要顺序取出6个比特来发射,故循环七次
{
for(i=5;i>=0;i--)//顺序取出6个比特来发射
{cout<<A[i];}//输出这6个比特便于检测
cout<<endl;
d=A[2]*4+A[1]*2+A[0]*1;//取每3个比特来进行8PSK调制,先将二进制转化为十进制,该步是为了便于写后面的选择语句
g=A[5]*4+A[4]*2+A[3]*1;//d为前3个输出的比特表示的十进制数,对应我们的X1;g为后3个输出的比特表示的十进制数,对应我们的X2;
for(i=0;i<42;i++) //每取6个比特后就将数组前移,便于后面取数
A[i]=A[i+6];
//8PSK中的映射关系,采用GRAY编码,这种编码可以使噪声引起的误差在3个比特的码元中仅出现一个比特的错
switch(d)//X1的8PSK映射;
{
case(0):xx=b[0];xy=c[2];break;
case(1):xx=b[1];xy=c[1];break;
case(3):xx=b[2];xy=c[0];break;
case(2):xx=b[3];xy=c[1];break;
case(6):xx=b[4];xy=c[2];break;
case(7):xx=b[3];xy=c[3];break;
case(5):xx=b[2];xy=c[4];break;
case(4):xx=b[1];xy=c[3];break;
}
cout<<"t时刻"<<endl;
cout<<"X="<<"("<<xx<<","<<xy<<")"<<endl; //t时刻第一根天线上输出的是X1
switch(g)//X2的8PSK映射;
{
case(0):yx=b[0];yy=c[2];break;
case(1):yx=b[1];yy=c[1];break;
case(3):yx=b[2];yy=c[0];break;
case(2):yx=b[3];yy=c[1];break;
case(6):yx=b[4];yy=c[2];break;
case(7):yx=b[3];yy=c[3];break;
case(5):yx=b[2];yy=c[4];break;
case(4):yx=b[1];yy=c[3];break;
}
cout<<"Y="<<"("<<yx<<","<<yy<<")"<<endl; //t时刻第二根天线上输出的是X2
//加入时延
cout<<"t+T时刻"<<endl;
cout<<"X="<<"("<<-yx<<","<<yy<<")"<<endl; //t+T时刻第一根天线上输出的是-X2*
cout<<"Y="<<"("<<xx<<","<<-xy<<")"<<endl; //t+T时刻第二根天线上输出的是X1*
cout<<endl;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -