第一篇:消息队列通信实验报告
实验6 消息队列通信
实验目的
1、了解什么是消息、消息队列
2、掌握消息传送的机理
实验内容
1、消息的创建、发送和接收。使用系统调用msgget(),msgsnd(),msgrev(),及msgctl()编制一长度为1k的消息发送和接收的程序。
Msgqid.c #include
#include
#include
#include
#define MSGKEY 75
/*定义关键词MEGKEY*/
struct msgform
/*消息结构*/
{
long mtype;
char mtext[1030];/*文本长度*/
}msg;
int msgqid,i;
void CLIENT()
{
int i;
msgqid=msgget(MSGKEY,0777);
for(i=10;i>=1;i--)
{
msg.mtype=i;
printf(“(client)sentn”);
msgsnd(msgqid,&msg,1024,0);/*发送消息msg入msgid消息队列*/
}
exit(0);
}
void SERVER()
{
msgqid=msgget(MSGKEY,0777|IPC_CREAT);/*由关键字获得消息队列*/
do
{
msgrcv(msgqid,&msg,1030,0,0);/*从msgqid队列接收消息msg */
printf(“(server)receivedn”);
}while(msg.mtype!=1);
/*消息类型为1时,释放队列*/
msgctl(msgqid,IPC_RMID,0);
exit(0);
}
main()
{
while((i=fork())==-1);
if(!i)SERVER();
while((i=fork())==-1);
if(!i)CLIENT();
wait(0);
wait(0);
}
实验结果:
2、选做实验:模拟从c/s通信
客户端client功能:
1)显示服务功能菜单
Enter your choice: 1.2.Save noney Take money 2)接收用户键入的功能号进行选择;3)将用户键入的功能号作为一条消息发送到消息队列,然后结束 服务端功能:
1)从消息队列接收client发送的一条消息; 2)根据消息作如下处理: 若消息为“1”,创建子进程1,子进程1加载服务模块save,该模块显示以下信息:Your money was saved!若消息为“2”,创建子进程2,子进程2加载服务模块take,该模块显示以下信息:
Please take your money!3)等待子进程终止后,server消息对列结束。
注意:1)save和take要事先编译连接好,放在同一目录下;
2)先运行客户端进程,再运行服务端进程。
1、client.c #include
{ long mtype;
char mtext[1000];}msg;int msgqid;
void client(){
int i;msgqid=msgget(MSGKEY,0777);
/*打开75#消息队列*/ for(i=20;i>=1;i--){ msg.mtype=i;printf(“(client)sent %dn”,i);sleep(3);msgsnd(msgqid,&msg,1024,0);
/*发送消息*/ } exit(0);} main(){
client();} server.c #include
{ long mtype;
char mtext[1000];}msg;int msgqid;
void server(){
msgqid=msgget(MSGKEY,0777|IPC_CREAT);/*创建75#消息队列*/ do
{ msgrcv(msgqid,&msg,1030,0,0);
/*接收消息*/
printf(“(server)received %ldn”,msg.mtype);sleep(3);}while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0);/*删除消息队列,归还资源*/ exit(0);}
main(){
server();}
实验结果:
第二篇:数据结构 队列实验报告
队列实验报告
小组成员:xxxxxxxx日期:xxxxxxxx
一、需求分析(xxx)
1.链队列
1)在本演示程序中,首先要链队列添加一个头结点,并判断队列是否为空,它只允许在表的一端进行插入,而在另一端删除元素,允许插入的一段叫队尾,允许删除的一端则为对头,接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。最后销毁队列,释放空间。2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“销毁队列”“清空队列”之后。由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。3)程序执行的命令包括: 欢迎来到链队列 1输出队列长度 2元素入队 3元素出队 4销毁队列 5清空队列 6对头元素 7退出链队列 4)测试数据 入队 1 2 3 4 5 分别执行“元素入队”“元素出队”“销毁队列”“清空队列”等操作。2.顺序队列
1)在本演示程序中,首先要顺序队列添加一个头结点,并判断队列是否为空,它只允许在表的一端进行插入,而在另一端删除元素,允许插入的一段叫队尾,允许删除的一端则为对头,接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“取得头结点”“输出显示”之后。由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。3)程序执行的命令包括: 欢迎来到顺序队列 1入队 2出队
3判断是否为空 4取得头结点 5输出显示 6退出顺序队列 4)测试数据 入队 1 2 3 4 5 分别执行“元素入队”“元素出队”等操作。3循环队列
1)在本演示程序中,首先要顺序队列添加一个头结点,并判断队列是否为空,初始化建空队列时,令front=rear=0,每当插入新的队列尾元素时,“尾指针增1”;每当删除队列头元素时,“头指针增1”。接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“取得头结点”“输出显示”之后。由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。3)程序执行的命令包括: 欢迎来到循环队列 1入队 2出队
3判断是否为空 4取得头结点 5输出显示 6退出顺序队列 4)测试数据 入队 1 2 3 4 5 分别执行“元素入队”“元素出队”等操作。
二.概要设计(xxxx)
⒈ 为实现上述算法,需要顺序表的抽象数据类型,抽象数据类型定义如下:
ADT Queue { 数据对象:D={ ai|ai∈ElemSet, i=1,2,3...,n, n>=0 } 数据关系: R={ |ai-1,ai∈D,i=2,...,n } 基本操作: InitQueue(&Q)操作结果:构造一个空队列。DestroyQueue(&Q)初始条件:队列Q已存在。
操作结果:队列Q已被销毁。ClearQueue(&Q)初始条件:队列Q已存在。
操作结果:将Q清为空队列。QueueEmpty(Q)初始条件:队列Q已存在。
操作结果:若Q为空队列,则返回TRUE,否则FALSE。QueueLength(Q)初始条件:队列Q已存在。
操作结果:返回Q元素的个数,即队列的长度。GetHead(Q,&e)初始条件:Q为非空队列。
操作结果:用e返回Q的队头元素。EnQueue(&Q,e)初始条件:队列Q已存在。
操作结果:插入e返回Q的新的队尾元素。DeQueue(&Q,&e)初始条件:Q为非空队列。
操作结果:删除Q的队头元素,并用e返回其值。}ADT Queue
2.单链队列
typedefstructQNode { QElemType;structQNode *next;//指针域 }QNode,*QueuePtr;Typedefstruct{ QueuePtr front;QueuePtr rear;}LinkQueue;Status InitQueue(LinkQueue&Q)//构造一个空队列。
Status DestroyQueue(LinkQueue&Q)//销毁队列Q,Q不存在。
Status ClearQueue(LinkQueue&Q)//将Q清为空队列。
Status QueueEmpty(LinkQueueQ)//若Q为空队列,则返回TRUE,否则FALSE。intQueueLength(LinkQueueQ)//返回Q元素的个数,即队列的长度。
Status GetHead(LinkQueueQ,QElemType&e)//若队列不为空,则用e返回Q的队头元素,并返回OK;否则返回ERROR。
Status EnQueue(LinkQueue&Q,QElemType e)//插入e返回Q的新的队尾元素。
Status DeQueue(LinkQueue&Q,QElemType&e)//若队列不空,则删除Q的队头元素,并用e返回其值,并返回OK;否则返回ERROR。
三.详细设计(xxx)
1.顺序队列的实现和运算
1)元素的类型 typedefstruct { Datatypedata[MAXSIZE];intfront,rear;}Squeue;2)空的队列的构造
void InitSqueue(Squeue *p)/*初始化队列*/ { p->front=0;p->rear=0;} 3)元素的入队
int Ensqueue1(Squeue1 *q, Datatype e)/*入队*/ { if((q->rear+1)% MAXSIZE == q->front){ printf(“n队列已满n”);return 0;} 4)元素的出队
int DeSqueue1(Squeue1 *q,Datatype *e)/*出队*/ { if(q->front==q->rear){ printf(“队列已空,无法出队!”);return 0;} *e=q->data[q->front];q->front=(q->front+1)%MAXSIZE;return 1;} 5)判断队列是否为空
int QueueEmpty1(Squeue1 q)// 判断是否为空 { if(q.front==q.rear)return 1;else return 0;} 6)队头元素的取值的算法
int Gethead1(Squeue1 *q,Datatype *e)// 取对头元素 { if(q->front==q->rear){ printf(“队列已空,无法出队!”);return 0;} else *e=q->data[q->front];return 1;} 7)遍历顺序队列的算法
void display1(Squeue1 q)//遍历顺序对列 { printf(“此队列数据为:n”);if(q.front==q.rear)printf(“此队列为空!”);else { while(q.front void InitQueue2(LinkQueue *q){ // 构造一个空队列Q q->front=q->rear=malloc(sizeof(QNode));if(!q->front)exit(1);q->front->next=NULL;} 2)元素的入队算法 void EnQueue2(LinkQueue *q, QElemType e)//将元素e进队 { QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode));//创建新节点 if(!p)//如果内存分配成功 exit(1); p->data=e;//初始化新节点数据为e p->next=NULL; q->rear->next=p; q->rear=p;} 3)元素的出队的算法 int DeQueue2(LinkQueue *q,QElemType e)//队头结点出队,将出队的元素存入e { QueuePtr p;if(q->front==q->rear)//队列为空 return 0;p=q->front->next;//初始化temp为要出队的结点指针 if(q->front->next==q->rear)//要出队的结点为最后一个结点 q->rear=q->front;e=p->data;//要出队的数据元素为e q->front->next=p->next;//使下一个结点变为对头 free(p);//删除要出队的结点 return e;} 4)队列的长度算法 void QueueLength2(LinkQueue *q)//返回队列长度 { QueuePtr p;int i=0;p=q->front->next;while(p){ ++i; p=p->next;} printf(“链队列长度为:%dn”,i);} 5)队列的销毁 void DestroyQueue2(LinkQueue *q){ while(q->front){ q->rear=q->front->next; free(q->front); q->front=q->rear; if(!q->rear) free(q->rear);} free(q->front);} 6)队列的输出算法 void output2(LinkQueue *q)//输出队列 { QueuePtr p;p=q->front->next;printf(“链队列元素依次为:”);while(p){ printf(“%d->”,p->data); p=p->next;} printf(“n”);} 7)队列的清空的算法 void Clear2(LinkQueue *q)//清空队列 { QueuePtr temp=q->front->next;while(temp){ QueuePtrtp=temp; temp=temp->next; free(tp);} temp=q->front; q->front=q->rear=NULL;free(temp);} 8)返回对头元素的算法 int GetHead2(LinkQueue *q, int *e)//返回对头结点元素,存入e { if(q->front==q->rear) return 0;*e=q->front->next->data;return 1;} 3.循环队列的实现和运算 1)队列的初始化算法 void InitSqueue3(Squeue3 *p)/*初始化队列*/ { p->base=(Datatype *)malloc(sizeof(Datatype)* MAXSIZE);p->front=0;p->rear=0;} 2)入队的算法 int Ensqueue3(Squeue3 *q, Datatype e)/*入队*/ { if((q->rear+1)% MAXSIZE == q->front){ printf(“n队列已满n”);return 0;} else q->base[q->rear]=e;/*将接收到得值付给队尾所指的节点*/ q->rear=(q->rear+1)% MAXSIZE;/*队尾向后移一位完成入队*/ return 1;} 3)出队的算法 int DeSqueue3(Squeue3 *q,Datatype *e)/*出队*/ { if(q->front==q->rear){ printf(“队列已空,无法出队!”);return 0;} *e=q->base[q->front];q->front=(q->front+1)%MAXSIZE;return 1;} 4判断队列是否为空的算法 int QueueEmpty3(Squeue3 q)// 判断是否为空 { if(q.front==q.rear)return 1;else return 0;} 5)对头元素的返还的算法 int Gethead3(Squeue3 *q,Datatype *e)// 取对头元素 { if(q->front==q->rear){ printf(“队列已空,无法出队!”);return 0;} else *e=q->base[q->front];return 1;} 6)遍历循环队列的算法 void display3(Squeue3 *q)//遍历循环对列 { int tail;tail=q->front;printf(“此队列数据为:n”);if(q->front==q->rear)printf(“此队列为空!”);else { while(tail!=q->rear){ printf(“%dt”, q->base[tail]);tail=(tail+1)%MAXSIZE;} printf(“n”);} } 4.主函数的算法 void main(){ int choice;Datatype e1;int i1,a1,x1,s1,j1;//顺序队列定义的量 int e2,i2,n2,s2,a2;//链队列定义的量 int i3,a3,x3,s3,j3;//循环队列定义的量 Datatype e3; Squeue1 Q1; //******************************* LinkQueue q; //******************************** Squeue3 Q; //**************************** choice=-1;Begin();while(choice!=0){ scanf(“%d”,&choice);switch(choice){ case 1://顺序队列 { system(“cls”);InitSqueue1(&Q1);printf(“创建队列完成!n”);printf(“请输入数据个数j1=”);scanf(“%d”,&j1);for(i1=1;i1<=j1;i1++)//输入的数据个数不要超过MAXSIZE,多了的部分没有插入队列 { printf(“请输入第%d个数据:”,i1);scanf(“%d”,&a1);Ensqueue1(&Q1,a1); } printf(“对头为:%dn”,Q1.data[Q1.front]);printf(“队尾为:%dn”,Q1.data[Q1.front+j1-1]);display1(Q1);s1=-1;start1();while(s1!=0) { scanf(“%d”,&s1);switch(s1) { case 0: system(“cls”); choice=-1; Begin(); break;case 1: { system(“cls”);printf(“请输入入队元素:n ”);scanf(“%d”,&x1);Ensqueue1(&Q1,x1);display1(Q1); s1=-1; start1();break; } case 2: { system(“cls”);DeSqueue1(&Q1,&e1);display1(Q1);s1=-1; start1();break; } case 3: { system(“cls”);if(QueueEmpty1(Q1))printf(“此队列为空!n”);else printf(“此队列不为空!n”); } s1=-1; start1();break;case 4: { system(“cls”); Gethead1(&Q1,&e1);printf(“对头元素为:%dn”,e1); s1=-1; start1();break; } case 5: { system(“cls”);display1(Q1);s1=-1; start1();break; } }//switch } //while }//case1 break;//************************************************* case 2: { system(“cls”); InitQueue2(&q);printf(“创建队列完成!n”);printf(“输入将建立链队列元素的个数:n2=”);scanf(“%d”,&n2);printf(“请输入队列的元素:n”);for(i2=1;i2<=n2;i2++) { printf(“请输入第%d个元素:”,i2); scanf(“%d”,&e2); EnQueue2(&q,e2); } a2=-1;start2();while(a2!=0) { scanf(“%d”,&a2); switch(a2) { case 1:system(“cls”); QueueLength2(&q); a2=-1;start2(); break; case 2:{ system(“cls”); printf(“请输入入队元素:”); scanf(“%d”,&e2);EnQueue2(&q,e2); output2(&q);a2=-1;start2(); }break; case 3: system(“cls”); e2=DeQueue2(&q,e2); output2(&q); printf(“出队元素为:%dn”,e2);a2=-1;start2(); break; case 4:DestroyQueue2(&q);printf(“队列已销毁!n”); a2=0;system(“cls”); choice=-1; Begin(); break; case 5: Clear2(&q);printf(“队列已清空n”); a2=0;system(“cls”); choice=-1; Begin(); break; case 6: system(“cls”);GetHead2(&q,&e2); printf(“队头元素为:%dn”,e2);s2=-1; start2(); break; case 0: system(“cls”); choice=-1; Begin(); break; }//switch }//while }//case2 break;//************************************************** case 3: { system(“cls”); InitSqueue3(&Q);printf(“创建队列完成!n”);printf(“请输入数据个数j3=”);scanf(“%d”,&j3);for(i3=1;i3<=j3;i3++)//输入的数据个数不要超过MAXSIZE,多了的部分没有插入队列 { printf(“请输入第%d个数据:”,i3);scanf(“%d”,&a3);Ensqueue3(&Q,a3); } printf(“对头为:%dn”,Q.base[Q.front]);printf(“队尾为:%dn”,Q.base[Q.front+j3-1]);display3(&Q);s3=-1;start3();while(s3!=0) { scanf(“%d”,&s3);switch(s3) { case 0: system(“cls”); choice=-1; Begin(); break;case 1: { system(“cls”);printf(“请输入入队元素:n ”);scanf(“%d”,&x3);Ensqueue3(&Q,x3);display3(&Q); s3=-1; start3();break; } case 2: { system(“cls”);DeSqueue3(&Q,&e3);display3(&Q);s3=-1; start3();break; } case 3: { system(“cls”);if(QueueEmpty3(Q))printf(“此队列为空!n”);else printf(“此队列不为空!n”); } s3=-1; start3();break;case 4: { system(“cls”); Gethead3(&Q,&e3);printf(“对头元素为:%dn”,e3); s3=-1; start3();break; } case 5: { system(“cls”);display3(&Q);s3=-1; start3();break; } }//switch } //while }//case 3 break; case 0: printf(“ 谢谢使用!!n”); break; //*************************** }//switch }//while }//main 四.调试分析(xxx) 顺序队列 1.编译并调试,运行程序。 2.设计测试用例,分析测试结果,以验证所完成的系统是否达到预期效果。3.判断队列是否为空。队列是否为空的标志就是队头指针和队尾指针是否同时指向队列中的同一个位置,即队头指针和队尾指针是否相等。 4.队列满时候不能入队列,否则会出现溢出现象。即先要判断队列是否已经已满,因为队尾指针的最大值是MAXQSIZE,所以通过检查队尾指针rear是否等于MAXQSIZE来判断队列是否已满。在删除队首元素时,应首先通过队头指针和队尾指针是否相等判断队列是否已空。 5.在元素出队操作,先通过队头指针和队尾指针是否相等判断队列是否已空,空时不能操作,这是要注意的。 6.程序满足了本次试验的目的和任务要求,可以进行人机交互,在后来的程序中将会做些改进,以增强人机交互性。 7.本程序存在较多不足,如有问题,参考用户手册。 8.在程序语句中,原本使用了大量的生僻的函数名,经过改进,目前使用都是通俗易懂的函数名称,方便用户理解。 链队列 1.编译并调试,运行程序。2.设计测试用例,分析测试结果,以验证所完成的系统是否达到预期效果。 3.要注意设定一个在链队列添加一个头结点并令指针指向头结点。同时,删除不可以在最后面进行删除,但是插入可以最后一个进行插入,这点需要注意 4.需要分别指向队头和队尾的指针。 5.程序满足了本次试验的目的和任务要求,可以进行人机交互,在后来的程序中将会做些改进,以增强人机交互性。 6.本程序存在较多不足,如有问题,参考用户手册。 7.在程序语句中,原本使用了大量的生僻的函数名,经过改进,目前使用都是通俗易懂的函数名称,方便用户理解。 循环队列 1.编译并调试,运行程序。 2.设计测试用例,分析测试结果,以验证所完成的系统是否达到预期效果。 3.为了避免顺序队列造成的“假溢出”现象,我们通常采用顺序循环队列实现队列的顺序存储。4.队头指针和对尾指针与队列元素之间关系和顺序队列一样,不变。5.先判断队列是否为空。就是看队头指针和队尾指针是否同时指向队列中的同一个位置,即队头指针和队尾指针是否相等,空时不能操作,这是要注意的。 6.在将元素插入到队列之前首先要判断队列是否已经已满,根据顺序循环队列队满条件front==(rear+1)%MAXQSIZE来判断队列是否已满。在删除队首元素时,应首先通过队头指针和队尾指针是否相等判断队列是否已空。 6.程序满足了本次试验的目的和任务要求,可以进行人机交互,在后来的程序中将会做些改进,以增强人机交互性。 7.本程序存在较多不足,如有问题,参考用户手册。 8.在程序语句中,原本使用了大量的生僻的函数名,经过改进,目前使用都是通俗易懂的函数名称,方便用户理解。 五、用户手册(xx)1.链队列 (1)本程序的运行环境为DOS操作系统,执行文件名为:j.exe.(2)进入演示程序后即显示文本方式的用户界面,输入元素1,2,3,4,5创建队列。 (3)根据提示,选择操作2执行元素入队操作。回车,输入入队元素0,回车,将0插入到队列中。 (4)选择操作3执行元素出队操作,回车,队首元素1出队。 (5)选择操作1执行输出队列长度操作,回车,输出队列长度为5.(6)选择操作5执行清空队列操作,回车,清空。 (7)选择操作6执行输出队头元素操作,回车,输出元素2。 2.顺序队列 (1)创建队列,输入数据 1,2,3,4,5.(2)选择操作1,执行入队操作.输入入队元素0 (3)选择操作2,执行出队操作。 队首元素1出队.(4)选择操作3,判断对是否为空 (5)选择操作4,输出对头元素2.(6)选择操作5,显示队列元素 3、循环队列 (1)创建队列,输入数据 1,2,3,4,5.(2)选择操作1,执行入队操作.输入入队元素0 (3)选择操作2,执行出队操作。队首元素1出队.(3)选择操作3,判断对是否为空 (5)选择操作4,输出对头元素2.(6)选择操作5,显示队列元素为,2,3,4,5,0 六.测试结果(xxx)1.顺序队列的实现和运算 1)输入1即可进行进入到顺序队列 2)顺序队列的建立,输入元素的个数为5,输入的数据分别为1,2,3,4,5,对头为1,队尾为5,此时队列的数据为1 2 3 3)输入2即可进行入队运算,输入的入队元素为0,此时的队列的数据为1 2 3 4 5 0 4)输入3即可进行判断队列的是否为空,如下图: 5)输入4即可进行去的对头元素的算法,如下图所示: 6)此时的队列的数 据 为 0,如 下 图 : 7)输入0即可退出顺序队列,如下图: 8)输入3即可进行顺序队列的算法,如下图所示: 9)输入1即可进 行 相 应的入 队 运 算,如 下 10)输入2即可进行队列的出队运算,如下图所示: 所 示 图 :11)输入3 即可判断顺序队列是否为空的算法,如下图所示: 12)输入4即可进行去的头结点的运算,如下图所示: 13)输入5即可进行队列的输出显示的运算,如 14)输入0即可进行退出顺序队列的算法,如下图所示: 下图所示:2.链式队列的实现和运算 1)队列的建立以及队列的个数输入为5,输入的数据分别为1,2,3,4,5.如下图: 2)输入2即可进入到元素的入队运算,输入入队的元素的为0,输入3即可进行相应的元素的出队运算,出队元素为1.如下图: 3)则此时的队列的长度为5,输入4即可进行队列的销毁以及输入5即可进行队列的清空运算,如下图: 4)输入6即可进行输出队列的对头元素,输入0即可进行退出链队列的运算 3.循环队列的实现和运算 1)输入3即可进行循环队列的操作,输入5个数据,它们分别为1 2 3 4 5,输入1,即可进行入队操作,输入入队的元素为0,则此时的数据为1 2 3 4 5 0,如下图所示: 2)输入2即可进行出队运算,如下图所示: 3)输入3即可进行判断队列的是否为空,如下图所示: 4)输入4即可进行取得对头元素,如 下 5)输入5即可进行输出所有的数据显示,如下图所示: 所示图: 七.心得体会(xx) 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出” 的线性表。注意的是为了避免顺序队列造成的“假溢出”现象,我们通常采用顺序循环队列实现队列的顺序存储。还有要注意的是在C语言中不能用动态分配的一维数组来实现循环队列,如果用户的应用程序中设有循环队列,则必须为它设定一个最大队列长度;若用户无法估计所用队列的最大长度,则宜采用链式队列。 1,必做题目 1.1 无线信道特性分析 1.1.1 实验目的 1)了解无线信道各种衰落特性; 2)掌握各种描述无线信道特性参数的物理意义; 3)利用MATLAB中的仿真工具模拟无线信道的衰落特性。 1.1.2 实验内容 1)基于simulink搭建一个QPSK发送链路,QPSK调制信号经过了瑞利衰落信道,观察信号经过衰落前后的星座图,观察信道特性。仿真参数:信源比特速率为500kbps,多径相对时延为[0 4e-06 8e-06 1.2e-05]秒,相对平均功率为[0-3-6-9]dB,最大多普勒频移为200Hz。例如信道设置如下图所示: 移动通信系统 1.1.3 实验作业 1)根据信道参数,计算信道相干带宽和相干时间。 fm=200;t=[0 4e-06 8e-06 1.2e-05];p=[10^0 10^-0.3 10^-0.6 10^-0.9];t2=t.^2;E1=sum(p.*t2)/sum(p);E2=sum(p.*t)/sum(p);rms=sqrt(E1-E2.^2);B=1/(2*pi*rms)T=1/fm 2)设置较长的仿真时间(例如10秒),运行链路,在运行过程中,观察并分析瑞利信道输出的信道特征图(观察Impulse Response(IR)、Frequency Response(FR)、IR Waterfall、Doppler Spectrum、Scattering Function)。(配合截图来分析)Impulse Response(IR) 移动通信系统 从冲击响应可以看出,该信道有四条不同时延的路径。多径信道产生随机衰落,信道冲击响应幅值随机起伏变化。可以看出,该信道的冲激响应是多路冲激响应函数的叠加,产生严重的码间干扰。Frequency Response(FR) 频率响应特性图不再是平坦的,体现出了多径信道的频率选择性衰落。 移动通信系统 IR Waterfall 频率展宽后,信号的冲激响应不再平坦,是由于多径信道中不同信道的叠加影响 Doppler Spectrum 由于多普勒效应,接受信号的功率谱展宽扩展到fc-fm至fc+fm范围。 移动通信系统 3)观察并分析信号在经过瑞利衰落信道前后的星座图变化(截图并解释)。 前 标准的QPSK星座图,4个相位 后 移动通信系统 信号经过多径信道后,相位和幅值均发生了随机变化,信号不再分布在四个点附近,可以看出信号质量很差。说明多径信道对信号产生了巨大的干扰。PSK/QPSK通信链路搭建与误码性能分析 1.2BPSK/QPSK通信链路搭建与误码性能分析 1.2.1实验目的 掌握基于simulink的BPSK、QPSK典型通信系统的链路实现,仿真BPSK/QPSK信号在AWGN信道、单径瑞利衰落信道下的误码性能。 1.2.2实验作业 1)基于simulink搭建BPSK/QPSK通信链路,经过AWGN信道,接收端相干解调,仿真并绘出BPSK和QPSK信号在EbN0为0~10dB时(间隔: 移动通信系统 1dB)误码性能曲线。仿真参数: a)仿真点数:106 b)信源比特速率:1Mbps。 Bpsk通信链路 QPSK通信链路 BPSK AWGN参数 移动通信系统 QPSK AWGN参数 用bertool画出BPSK信号的误码率曲线(0~10dB) 移动通信系统 由此可见BPSK和QPSK的在同一Eb/No时误比特率基本一样,这与理论分析一致 2)在1的基础上,信号先经过平坦(单径)瑞利衰落,再经过AWGN信道,假设接收端通过理想信道估计获得了信道衰落值(勾选衰落信道模块的“Complex path gain port”)。仿真并绘出BPSK和QPSK信号在EbN0为0~40dB时(间隔:5dB)误码性能曲线。信道仿真参数:最大多普勒频移为100Hz。 BPSK通信链路 移动通信系统 QPSK通信链路 瑞利单径信道参数 移动通信系统 QPSK AWGN参数 移动通信系统 BPSK AWGN参数 BPSK/QPSK 0-40db误码率曲线 BPSK和QPSK在同一Eb/No的误比特率基本一致,这和理论基本一致 移动通信系统 2、分组题目 2.1SIMO系统性能仿真分析 2.1.1实验目的 1.掌握基于simulink的单发多收(SIMO)16QAM仿真通信链路; 2.仿真SIMO 16QAM信号在单径瑞利衰落信道下,不同接收分集数、不同合并方式下的误比特率性能。 2.1.2实验内容 1.掌握单发多收的原理,利用分集技术,搭建单发多收通信系统框图。2.利用MATLAB中simulink所包含的通信系统模块搭建基于各种分集技术类型的单发多收通信链路。 3.比较分析不同接收分集数、不同合并方式下的误比特率性能。 2.1.3实验原理 移动信道的多径传播引起的瑞利衰落、时延扩展以及伴随接收机移动过程产生的多普勒频移使接收信号受到严重的衰落;阴影效应会使接收的信号过弱而造成信号的中断;信道存在噪声和干扰,也会使接收信号失真而造成误码。因此,在移动通信系统中需要采取一些数字信号处理技术来改善接收信号的质量。其中,多天线分集接收技术就是一个非常重要且常见的方法。 分集接收的基本思想就是把接收到的多个衰落独立的信号加以处理,合理地利用这些信号的能量来改善接收信号的质量。 分集技术总体来说分为两类,针对阴影衰落的宏观分集和针对微观衰落的微观分集。本实验主要注重微观分集。分集技术对信号的处理包含两个过程,首 先是要获得M个相互独立的多径信号分量,然后对它们进行处理以获得信噪比 的改善,这就是合并技术。合并方式共分为三种,选择合并、等增益合并和最大 比值合并。 选择合并是最简单的一种,在所接收的多路信号中,合并器选择信噪比最高的一路输出。最大比值合并会将所有路信号的能量和信息都利用上,会明显改善 移动通信系统 合并器输出的信噪比。基于这样的考虑,最大比值合并把各支路信号加权后合并。各路信号权值用数学方法得出。等增益合并性能上不及最大比值合并,但是却容易实现得多,其主要思想是将各路信号赋予相同权值相加。2.1.4 实验仿真 2.1.4.1实验框图 系统整体框图 移动通信系统 接收分集 二分集等增益合并 移动通信系统 三分集等增益合并 二分集选择合并 三分集选择合并 移动通信系统 二分集最大比值合并 三分集最大比值合并 2.1.4.2 仿真结果 从图中可以看到,通过等增益合并方式能够显著的减小误码率,并且随着Eb/N0 的增加而更好的显示出性能优越;相对比不同的分集数可看出,分集数的增加能 有效地减小误码率。 移动通信系统 由图可看到,三种合并方式都能显著地减小误码率,在分集数为二的情况下,效果最好的是最大比值合并,等增益次之,都优于选择合并; 2.1.5 实验结论 移动信道的多径传播引起的瑞利衰落、时延扩展以及伴随接收机移动过程产生的多普勒频移使接收信道受到严重的衰落,所以必须采取相应的抗衰落的措施来提高系统性能。在本次课程设计中,我们小组学习研究了对三种不同分集合并技术在改善系统性能方面的效果的课题实验。通过仿真实验得出的不同分集的误码率,分集技术能有效地减小误码率从而提高系统性能;而通过对误码率曲线的分析,可以看出:对于三种分集合并技术,等分集前提下,最大比值合并优于等增益合并优于选择合并;而对于同一合并技术,增加分集数能优化其性能。 2.2直接序列扩频系统性能分析 2.2.1实验目的 1)了解直接序列扩频系统的原理 2)基于simulink搭建直接序列扩频仿真通信链路,仿真分析在不同信道条件下的误比特率性能。 3)观察体会直接序列扩频对误码率的改善程度 2.2.2 实验内容 1)搭建基于simulink搭建直接序列扩频仿真通信链路,观察频谱和波形 2)仿真分析在不同信道条件下的误比特率性能。 移动通信系统 2.2.3实验原理 所谓直接序列扩频,就是直接用具有高码率的扩频码序列在发送端去扩展信号的频谱。而在接收端,用相同的扩频码序列去进行解扩,把展宽的扩频信号还原成原始的信息。 直扩系统的抗干扰能力是由接收机对干扰的抑制产生的,如果干扰信号的带宽与信息带宽相同(即窄带),此干扰信号经过发送机伪噪声码调制后将展宽为与发送信号相同的带宽,而其谱密度却降低了若干倍。相反,直扩信号经伪噪声码解扩后变成了窄带信息,从而使增益提高了若干倍。 实验原理框图 伯努利信源b(t)x(t)s(t)信道r(t)e(t)Tby(Tb)dt判决0y(t)c(t)cos(wct)c(t)cos(wct) 直接序列扩频通信系统 2.2.4实验仿真 直接序列扩频simulink仿真通信链路 a.伯努利序列参数和PN序列参数: 伯努利信源100bps 移动通信系统 PN序列2kbps 移动通信系统 b.扩频前后频谱变化: 扩频前频谱: 类似sinc函数的频谱 扩频后频谱: 频谱明显展宽 功率谱密度降低 移动通信系统 扩频调制后波形: 移动通信系统 解扩解调波形: c.误比特率 AWGN信道(仿真点数1e6) 移动通信系统 BPSK理论误码率(-7到10dB的误比特率曲线) 通过两者对比,我们可以发现直接序列扩频通信系统对Eb/No的改善近似为13dB,这和理论分析出的值接近。 通信网络实验报告 实验一 隐终端和暴露终端问题分析 一、实验目的1、2、3、4、了解无线网络中的载波检测机制; 熟悉节点的传输范围、冲突干扰范围、载波检测范围和噪声干扰范围的概念; 了解载波检测接入体制中存在的隐终端问题和暴露终端问题; 结合仿真实验分析载波检测无线网络中的隐终端问题和暴露终端问题。 二、实验结果 Node: 1, Layer: AppCbrClient,(0)Server address: 2 Node: 1, Layer: AppCbrClient,(0)First packet sent at [s]: 0.000000000 Node: 1, Layer: AppCbrClient,(0)Last packet sent at [s]: 99.990000000 Node: 1, Layer: AppCbrClient,(0)Session status: Not closed Node: 1, Layer: AppCbrClient,(0)Total number of bytes sent: 5120000 Node: 1, Layer: AppCbrClient,(0)Total number of packets sent: 10000 Node: 1, Layer: AppCbrClient,(0)Throughput(bits per second): 409600 Node: 2, Layer: AppCbrServer,(0)Client address: 1 Node: 2, Layer: AppCbrServer,(0)First packet received at [s]: 0.007438001 Node: 2, Layer: AppCbrServer,(0)Last packet received at [s]: 99.999922073 Node: 2, Layer: AppCbrServer,(0)Average end-to-end delay [s]: 0.739902205 Node: 2, Layer: AppCbrServer,(0)Session status: Not closed Node: 2, Layer: AppCbrServer,(0)Total number of bytes received: 4975616 Node: 2, Layer: AppCbrServer,(0)Total number of packets received: 9718 Node: 2, Layer: AppCbrServer,(0)Throughput(bits per second): 398078 Node: 3, Layer: AppCbrClient,(0)Server address: 4 Node: 3, Layer: AppCbrClient,(0)First packet sent at [s]: 0.000000000 Node: 3, Layer: AppCbrClient,(0)Last packet sent at [s]: 99.990000000 Node: 3, Layer: AppCbrClient,(0)Session status: Not closed Node: 3, Layer: AppCbrClient,(0)Total number of bytes sent: 5120000 Node: 3, Layer: AppCbrClient,(0)Total number of packets sent: 10000 Node: 3, Layer: AppCbrClient,(0)Throughput(bits per second): 409600 Node: 4, Layer: AppCbrServer,(0)Client address: 3 Node: 4, Layer: AppCbrServer,(0)First packet received at [s]: 0.003058001 Node: 4, Layer: AppCbrServer,(0)Last packet received at [s]: 99.993058001 Node: 4, Layer: AppCbrServer,(0)Average end-to-end delay [s]: 0.003119031 Node: 4, Layer: AppCbrServer,(0)Session status: Not closed Node: 4, Layer: AppCbrServer,(0)Total number of bytes received: 5120000 Node: 4, Layer: AppCbrServer,(0)Total number of packets received: 10000 Node: 4, Layer: AppCbrServer,(0)Throughput(bits per second): 409612 三、实验结果分析 通过仿真结果可以看出,节点2无法收到数据。由于节点3是节点1的一个隐终端,节点1无法通过物理载波检测侦听到节点3的发送,且节点3在节点2的传输范围外,节点3无法通过虚拟载波检测延迟发送,所以在节点1传输数据的过程中,节点3完成退避发送时将引起冲突。 四、思考题 1、RTS/CTS能完全解决隐终端问题吗?如果不能,请说明理由。 从理论分析上看,RTS/CTS协议似乎可以完全解决数据链隐藏终端问题,然而在实际网络中并非如此,尤其是在AdHoc 网络中。以节点为中心,存在发送区域和干扰区域。在发送区域内,在没有干扰的情况下,数据包可正常收发;该区域的大小由站点的功率等参数确定,可视为定值。干扰区域是相对于接受节点而言的,在该区域内,节点可以受到来自非相关节点发送的数据的干扰,造成冲突、丢包。RTS/CTS对隐藏终端问题的屏蔽实际上是建立在两区域相等的基础上的,即所有的隐藏终端都位于接受节点发送范围内。此中假设并不成立,干扰区域与收发节点间距有关。 实验二 无线局域网DCF协议饱和吞吐量验证 一、实验目的 1、了解IEEE 802.11 DCF 协议的基本原理。 2、理解网络饱和吞吐量的概念。 3、通过仿真对DCF协议饱和吞吐量的二维马尔可夫链模型进行验证。 二、实验结果 Node: 1, Layer: AppCbrClient,(4)Server address: 55 Node: 1, Layer: AppCbrClient,(4)First packet sent at [s]: 0.000000000 Node: 1, Layer: AppCbrClient,(4)Last packet sent at [s]: 99.990000000 Node: 1, Layer: AppCbrClient,(4)Session status: Not closed Node: 1, Layer: AppCbrClient,(4)Total number of bytes sent: 5120000 Node: 1, Layer: AppCbrClient,(4)Total number of packets sent: 10000 Node: 1, Layer: AppCbrClient,(4)Throughput(bits per second): 409600 Node: 1, Layer: AppCbrClient,(3)Server address: 54 Node: 1, Layer: AppCbrClient,(3)First packet sent at [s]: 0.000000000 Node: 1, Layer: AppCbrClient,(3)Last packet sent at [s]: 99.990000000 Node: 1, Layer: AppCbrClient,(3)Session status: Not closed Node: 1, Layer: AppCbrClient,(3)Total number of bytes sent: 5120000 Node: 1, Layer: AppCbrClient,(3)Total number of packets sent: 10000 Node: 1, Layer: AppCbrClient,(3)Throughput(bits per second): 409600 Node: 1, Layer: AppCbrClient,(2)Server address: 53 Node: 1, Layer: AppCbrClient,(2)First packet sent at [s]: 0.000000000 Node: 1, Layer: AppCbrClient,(2)Last packet sent at [s]: 99.990000000 Node: 1, Layer: AppCbrClient,(2)Session status: Not closed Node: 1, Layer: AppCbrClient,(2)Total number of bytes sent: 5120000 Node: 1, Layer: AppCbrClient,(2)Total number of packets sent: 10000 Node: 1, Layer: AppCbrClient,(2)Throughput(bits per second): 409600 Node: 1, Layer: AppCbrClient,(1)Server address: 52 Node: 1, Layer: AppCbrClient,(1)First packet sent at [s]: 0.000000000 Node: 1, Layer: AppCbrClient,(1)Last packet sent at [s]: 99.990000000 Node: 1, Layer: AppCbrClient,(1)Session status: Not closed Node: 1, Layer: AppCbrClient,(1)Total number of bytes sent: 5120000 Node: 1, Layer: AppCbrClient,(1)Total number of packets sent: 10000 Node: 1, Layer: AppCbrClient,(1)Throughput(bits per second): 409600 Node: 1, Layer: AppCbrClient,(0)Server address: 51 Node: 1, Layer: AppCbrClient,(0)First packet sent at [s]: 0.000000000 Node: 1, Layer: AppCbrClient,(0)Last packet sent at [s]: 99.990000000 Node: 1, Layer: AppCbrClient,(0)Session status: Not closed Node: 1, Layer: AppCbrClient,(0)Total number of bytes sent: 5120000 Node: 1, Layer: AppCbrClient,(0)Total number of packets sent: 10000 Node: 1, Layer: AppCbrClient,(0)Throughput(bits per second): 409600 Node: 51, Layer: AppCbrServer,(0)Client address: 1 Node: 51, Layer: AppCbrServer,(0)First packet received at [s]: 0.003056858 Node: 51, Layer: AppCbrServer,(0)Last packet received at [s]: 99.995493030 Node: 51, Layer: AppCbrServer,(0)Average end-to-end delay [s]: 0.351972641 Node: 51, Layer: AppCbrServer,(0)Session status: Not closed Node: 51, Layer: AppCbrServer,(0)Total number of bytes received: 5102592 Node: 51, Layer: AppCbrServer,(0)Total number of packets received: 9966 Node: 51, Layer: AppCbrServer,(0)Throughput(bits per second): 408219 Node: 52, Layer: AppCbrServer,(1)Client address: 1 Node: 52, Layer: AppCbrServer,(1)First packet received at [s]: 0.006449537 Node: 52, Layer: AppCbrServer,(1)Last packet received at [s]: 99.998965709 Node: 52, Layer: AppCbrServer,(1)Average end-to-end delay [s]: 0.355584451 Node: 52, Layer: AppCbrServer,(1)Session status: Not closed Node: 52, Layer: AppCbrServer,(1)Total number of bytes received: 5102592 Node: 52, Layer: AppCbrServer,(1)Total number of packets received: 9966 Node: 52, Layer: AppCbrServer,(1)Throughput(bits per second): 408233 Node: 53, Layer: AppCbrServer,(2)Client address: 1 Node: 53, Layer: AppCbrServer,(2)First packet received at [s]: 0.010001809 Node: 53, Layer: AppCbrServer,(2)Last packet received at [s]: 99.992000125 Node: 53, Layer: AppCbrServer,(2)Average end-to-end delay [s]: 0.358534977 Node: 53, Layer: AppCbrServer,(2)Session status: Not closed Node: 53, Layer: AppCbrServer,(2)Total number of bytes received: 3926016 Node: 53, Layer: AppCbrServer,(2)Total number of packets received: 7668 Node: 53, Layer: AppCbrServer,(2)Throughput(bits per second): 314112 Node: 54, Layer: AppCbrServer,(3)Client address: 1 Node: 54, Layer: AppCbrServer,(3)First packet received at [s]: 0.013774900 Node: 54, Layer: AppCbrServer,(3)Last packet received at [s]: 0.773715844 Node: 54, Layer: AppCbrServer,(3)Average end-to-end delay [s]: 0.184107930 Node: 54, Layer: AppCbrServer,(3)Session status: Not closed Node: 54, Layer: AppCbrServer,(3)Total number of bytes received: 22016 Node: 54, Layer: AppCbrServer,(3)Total number of packets received: 43 Node: 54, Layer: AppCbrServer,(3)Throughput(bits per second): 1761 Node: 55, Layer: AppCbrServer,(4)Client address: 1 Node: 55, Layer: AppCbrServer,(4)First packet received at [s]: 0.017127686 Node: 55, Layer: AppCbrServer,(4)Last packet received at [s]: 0.777148630 Node: 55, Layer: AppCbrServer,(4)Average end-to-end delay [s]: 0.187729553 Node: 55, Layer: AppCbrServer,(4)Session status: Not closed Node: 55, Layer: AppCbrServer,(4)Total number of bytes received: 22016 Node: 55, Layer: AppCbrServer,(4)Total number of packets received: 43 Node: 55, Layer: AppCbrServer,(4)Throughput(bits per second): 1761 三、实验结果分析 各发送节点发包间隔较大,当网络中发送节点较少时,网络还未饱和。逐渐往网络中增加负载,网络总吞吐量逐渐增大,之后,网络吞吐量逐渐趋向于平稳,此时,网络即达到了饱和状态。 四、思考题 1、总结IEEE 802.11DCF协议饱和吞吐量和哪些因素有关。 任选一个时隙,网络中有节点在发送数据的概率 当有节点在发送数据包时,数据包发送成功的概率 数据包发送成功和发送失败所需的时间 2、为什么在数据包长度较长时,采用RTS/CTS模式更合理? “隐藏终端”多发生在大型单元中(一般在室外环境),这将带来效率损失,并且需要错误恢复机制。当需要传送大容量文件时,尤其需要杜绝“隐藏终端”现象的发生。 实验三 动态源路由协议路由选择验证 一、实验目的1、2、了解DSR路由协议的优缺点。 理解DSR路由协议中路由发现过程和路由维护过程。 3、掌握DSR路由协议性能的仿真分析方法。 二、实验结果 Time(s): 1.000001000, Node: 1, Route path: 2 Time(s): 2.000001000, Node: 1, Route path: 2 Time(s): 3.000001000, Node: 1, Route path: 2 Time(s): 4.000001000, Node: 1, Route path: 2 Time(s): 5.000001000, Node: 1, Route path: 2 Time(s): 6.000001000, Node: 1, Route path: 2 Time(s): 7.000001000, Node: 1, Route path: 2 Time(s): 8.000001000, Node: 1, Route path: 4-2 Time(s): 9.000001000, Node: 1, Route path: 4-2 Time(s): 10.000001000, Node: 1, Route path: 4-2 Time(s): 11.000001000, Node: 1, Route path: 4-2 Time(s): 12.000001000, Node: 1, Route path: 4-2 Time(s): 13.000001000, Node: 1, Route path: 4-2 Time(s): 14.000001000, Node: 1, Route path: 4-2 Time(s): ***0, Node: 1, Route path: 4-2 Time(s): 16.000001000, Node: 1, Route path: 4-2 Time(s): 17.000001000, Node: 1, Route path: 4-2 Time(s): 18.000001000, Node: 1, Route path: 4-2 Time(s): 19.000001000, Node: 1, Route path: 4-2 Time(s): 20.000001000, Node: 1, Route path: 4-2 Time(s): 21.000001000, Node: 1, Route path: 4-2 Time(s): 22.000001000, Node: 1, Route path: 4-2 Time(s): 23.000001000, Node: 1, Route path: 4-2 Time(s): 24.000001000, Node: 1, Route path: 4-2 Time(s): 25.000001000, Node: 1, Route path: 4-2 Time(s): 26.000001000, Node: 1, Route path: 4-2 Time(s): 27.000001000, Node: 1, Route path: 4-2 Time(s): 28.000001000, Node: 1, Route path: 4-2 Time(s): 29.000001000, Node: 1, Route path: 4-2 Time(s): 30.000001000, Node: 1, Route path: 4-2 Time(s): 31.000001000, Node: 1, Route path: 4-2 Time(s): 32.000001000, Node: 1, Route path: 4-2 Time(s): 33.000001000, Node: 1, Route path: 4-2 Time(s): 34.000001000, Node: 1, Route path: 4-2 Time(s): 35.000001000, Node: 1, Route path: 4-2 Time(s): 36.000001000, Node: 1, Route path: 4-2 Time(s): 37.000001000, Node: 1, Route path: 4-2 Time(s): 38.000001000, Node: 1, Route path: 5-4-2 Time(s): 39.000001000, Node: 1, Route path: 5-4-2 Time(s): 40.000001000, Node: 1, Route path: 5-4-2 Time(s): 41.000001000, Node: 1, Route path: 5-4-2 Time(s): 42.000001000, Node: 1, Route path: 5-4-2 Time(s): 43.000001000, Node: 1, Route path: 5-4-2 Time(s): 44.000001000, Node: 1, Route path: 5-4-2 Time(s): 45.000001000, Node: 1, Route path: 5-4-2 Time(s): 46.000001000, Node: 1, Route path: 5-4-2 Time(s): 47.000001000, Node: 1, Route path: 5-4-2 Time(s): 48.000001000, Node: 1, Route path: 5-4-2 Time(s): 49.000001000, Node: 1, Route path: 5-4-2 Time(s): 50.000001000, Node: 1, Route path: 5-4-2 Time(s): 51.000001000, Node: 1, Route path: 5-4-2 Time(s): 52.000001000, Node: 1, Route path: 5-4-2 Time(s): 53.000001000, Node: 1, Route path: 5-4-2 Time(s): 54.000001000, Node: 1, Route path: 5-4-2 Time(s): 55.000001000, Node: 1, Route path: 5-4-2 Time(s): 56.000001000, Node: 1, Route path: 5-4-2 Time(s): 57.000001000, Node: 1, Route path: 5-4-2 Time(s): 58.000001000, Node: 1, Route path: 5-4-2 Time(s): 59.000001000, Node: 1, Route path: 5-4-2 Time(s): 60.000001000, Node: 1, Route path: 5-4-2 Time(s): 61.000001000, Node: 1, Route path: 5-4-2 Time(s): 62.000001000, Node: 1, Route path: 5-4-2 Time(s): 63.000001000, Node: 1, Route path: 5-4-2 Time(s): 64.000001000, Node: 1, Route path: 5-4-2 Time(s): 65.000001000, Node: 1, Route path: 5-4-2 Time(s): 66.000001000, Node: 1, Route path: 5-4-2 Time(s): 67.000001000, Node: 1, Route path: 5-4-2 Time(s): 68.000001000, Node: 1, Route path: 3-2 Time(s): 69.000001000, Node: 1, Route path: 3-2 Time(s): 70.000001000, Node: 1, Route path: 3-2 Time(s): 71.000001000, Node: 1, Route path: 3-2 Time(s): 72.000001000, Node: 1, Route path: 3-2 Time(s): 73.000001000, Node: 1, Route path: 3-2 Time(s): 74.000001000, Node: 1, Route path: 3-2 Time(s): 75.000001000, Node: 1, Route path: 3-2 Time(s): 76.000001000, Node: 1, Route path: 3-2 Time(s): 77.000001000, Node: 1, Route path: 3-2 Time(s): 78.000001000, Node: 1, Route path: 3-2 Time(s): 79.000001000, Node: 1, Route path: 3-2 Time(s): 80.000001000, Node: 1, Route path: 3-2 Time(s): 81.000001000, Node: 1, Route path: 3-2 Time(s): 82.000001000, Node: 1, Route path: 3-2 Time(s): 83.000001000, Node: 1, Route path: 3-2 Time(s): 84.000001000, Node: 1, Route path: 3-2 Time(s): 85.000001000, Node: 1, Route path: 3-2 Time(s): 86.000001000, Node: 1, Route path: 3-2 Time(s): 87.000001000, Node: 1, Route path: 3-2 Time(s): 88.000001000, Node: 1, Route path: 3-2 Time(s): 89.000001000, Node: 1, Route path: 3-2 Time(s): 90.000001000, Node: 1, Route path: 3-2 Time(s): 91.000001000, Node: 1, Route path: 3-2 Time(s): 92.000001000, Node: 1, Route path: 3-2 Time(s): 93.000001000, Node: 1, Route path: 2 Time(s): 94.000001000, Node: 1, Route path: 2 Time(s): 95.000001000, Node: 1, Route path: 2 Time(s): 96.000001000, Node: 1, Route path: 2 Time(s): 97.000001000, Node: 1, Route path: 2 Time(s): 98.000001000, Node: 1, Route path: 2 Time(s): 99.000001000, Node: 1, Route path: 2 三、实验结果分析 仿真过程中路由表变化:2,4-2,5-4-2,3-2,2。当节点[1]在节点[2]的传输范围内时,节点[1]和[2]之间直接通信,不需要中间节点。随着节点[1]的移动,节点[1]离开节点[2]的传输范围并渐渐远离,最后又逐渐靠近。在节点[1]离开节点[2]的传输范围,节点[1]和[2]需要通过中间节点来通信,而且节点[1]离节点[2]越远,需要的中间节点越多。 通信原理实验报告 中南大学 《通信原理》实验报告 姓 名 班 级 学 号 课程名称 指导教师 通信原理 董健 通信原理实验报告 目录 通信原理实验报告 实验一 数字基带信号 一、实验目的 1、了解单极性码、双极性码、归零码、不归零码等基带信号波形特点。 2、掌握AMI、HDB3码的编码规则。 3、掌握从HDB3码信号中提取位同步信号的方法。 4、掌握集中插入帧同步码时分复用信号的帧结构特点。 5、了解HDB3(AMI)编译码集成电路CD22103。 二、实验内容 1、用示波器观察单极性非归零码(NRZ)、传号交替反转码(AMI)、三阶高密度双极性码(HDB3)、整流后的AMI码及整流后的HDB3码。 2、用示波器观察从HDB3码中和从AMI码中提取位同步信号的电路中有关波形。、用示波器观察HDB3、AMI译码输出波形 三、实验步骤 1、熟悉数字信源单元和HDB3编译码单元的工作原理。接好电源线,打开电源开关。 2、用示波器观察数字信源单元上的各种信号波形。 用信源单元的FS作为示波器的外同步信号,示波器探头的地端接在实验板任何位置的GND点均可,进行下列观察: (1)示波器的两个通道探头分别接信源单元的NRZ-OUT和BS-OUT,对照发光二极管的发光状态,判断数字信源单元是否已正常工作(1码对应的发光管亮,0码对应的发光管熄); 通信原理实验报告 (2)用开关K1产生代码×1110010(×为任意代码,1110010为7位帧同步码),K2、K3产生任意信息代码,观察本实验给定的集中插入帧同步码时分复用信号帧结构,和NRZ码特点。 通信原理实验报告 3、用示波器观察HDB3编译单元的各种波形。仍用信源单元的FS信号作为示波器的外同步信号。 (1)示波器的两个探头CH1和CH2分别接信源单元的NRZ-OUT和HDB3单元的AMI-HDB3,将信源单元的K1、K2、K3每一位都置1,观察全1码对应的AMI码(开关K4置于左方AMI端)波形和HDB3码(开关K4置于右方HDB3端)波形。再将K1、K2、K3置为全0,观察全0码对应的AMI码和HDB3码。观察时应注意AMI、HDB3码的码元都是占空比为0.5的双极性归零矩形脉冲。编码输出AMI-HDB3比信源输入NRZ-OUT延迟了4个码元。 全1码对应的AMI码 全1码对应的HDB3码 通信原理实验报告 全0码对应的AMI码 (2)将K1、K2、K3置于0111 0010 0000 1100 0010 0000态,观察并记录对应的AMI码 通信原理实验报告 和HDB3码。 AMI码 HDB3码 通信原理实验报告 (3)将K1、K2、K3置于任意状态,K4先置左方(AMI)端再置右方(HDB3)端,CH1接信源单元的NRZ-OUT,CH2依次接HDB3单元的DET、BPF、BS-R和NRZ,观察这些信号波形。 CH1接信源单元的NRZ-OUT,CH2依次接AMI单元的DET CH1接信源单元的NRZ-OUT,CH2依次接HDB3单元的DET HDB3 通信原理实验报告 CH1接信源单元的NRZ-OUT,CH2依次接AMI单元的BPF CH1接信源单元的NRZ-OUT,CH2依次接HDB3单元的BPF CH1接信源单元的NRZ-OUT,CH2依次接AMI单元的BS-R 通信原理实验报告 CH1接信源单元的NRZ-OUT,CH2依次接HDB3单元的BS-R 通信原理实验报告 CH1接信源单元的NRZ-OUT,CH2依次接AMI单元的NRZ CH1接信源单元的NRZ-OUT,CH2依次接HDB3单元的NRZ 通信原理实验报告 四、根据实验现象回答 1.根据实验观察和纪录回答: (1)不归零码和归零码的特点是什么? 不归零码特点:脉冲宽度τ 等于码元宽度Ts 归零码特点:τ <Ts(2)与信源代码中的“1”码相对应的AMI码及HDB3码是否一定相同?为什么? 与信源代码中的“1”码对应的AMI 码及HDB3 码不一定相同。因信源代码中的 “1”码对应的AMI 码“1”、“-1”相间出现,而HDB3 码中的“1”,“-1”不但与信源代码中的“1”码有关,而且还与信源代码中的“0”码有关。 举例: 信源代码: ***001 AMI: 10000-110000-1000001 HDB3:10001-11-100-100010-1 2.总结从HDB3码中提取位同步信号的原理。HDB3位同步信号 整流窄带带通滤波器整形移相 HDB3中不含有离散谱fS(fS在数值上等于码速率)成分。整流后变为一个占空比等于0.5的单极性归零码,其连0个数不超过3,频谱中含有较强的离散谱fS成分,故可 通过窄带带通滤波器得到一个相位抖动较小的正弦信号,再经过整形、移相后即可得到合乎要求的位同步信号。 通信原理实验报告 实验二 数字调制 一、实验目的 1、掌握绝对码、相对码概念及它们之间的变换关系。 2、掌握用键控法产生2ASK、2FSK、2DPSK信号的方法。 3、掌握相对码波形与2PSK信号波形之间的关系、绝对码波形与2DPSK信号波形之间的关系。 4、了解2ASK、2FSK、2DPSK信号的频谱与数字基带信号频谱之间的关系。 二、实验内容 1、用示波器观察绝对码波形、相对码波形。 2、用示波器观察2ASK、2FSK、2PSK、2DPSK信号波形。 3、用频谱仪观察数字基带信号频谱及2ASK、2FSK、2DPSK信号的频谱。 三、实验步骤 本实验使用数字信源单元及数字调制单元。 1、熟悉数字调制单元的工作原理。接通电源,打开实验箱电源开关。将数字调制单元单刀双掷开关K7置于左方N(NRZ)端。 2、用数字信源单元的FS信号作为示波器的外同步信号,示波器CH1接信源单元的(NRZ-OUT)AK(即调制器的输入),CH2接数字调制单元的BK,信源单元的K1、K2、K3置于任意状态(非全0),观察AK、BK波形,总结绝对码至相对码变换规律以及从相对码至绝对码的变换规律 AK波形 通信原理实验报告 BK波形 3、示波器CH1接2DPSK,CH2分别接AK及BK,观察并总结2DPSK信号相位变化与绝对码的关系以及2DPSK信号相位变化与相对码的关系(此关系即是2PSK信号相位变化与信源代码的关系)。注意:2DPSK信号的幅度比较小,要调节示波器的幅度旋钮,而且信号本身幅度可能不一致,但这并不影响信息的正确传输。 CH1接2DPSK,CH2接AK 通信原理实验报告 CH1接2DPSK,CH2接BK 4、示波器CH1接AK、CH2依次接2FSK和2ASK;观察这两个信号与AK的关系(注意“1”码与“0”码对应的2FSK信号幅度可能不相等,这对传输信息是没有影响的)示波器CH1接AK、CH2接2FSK 通信原理实验报告 示波器CH1接AK、CH2接2ASK 四、实验总结 1、设绝对码为全 1、全0或1001 1010,求相对码。 2、设相对码为全 1、全0或1001 1010,求绝对码。 3、设信息代码为1001 1010,假定载频分别为码元速率的1倍和1.5倍,画出2DPSK及2PSK信号波形。 4、总结绝对码至相对码的变换规律、相对码至绝对码的变换规律并设计一个由相对码至绝对码的变换电路。 通信原理实验报告 实验三 模拟锁相环与载波同步 一、实验目的 1.掌握模拟锁相环的工作原理,以及环路的锁定状态、失锁状态、同步带、捕捉带等基本概念。 2.掌握用平方环法从2DPSK信号中提取相干载波的原理及模拟锁相环的设计方法。 3.了解相干载波相位模糊现象产生的原因。 二、实验内容 1.观察模拟锁相环的锁定状态、失锁状态及捕捉过程。2.观察环路的捕捉带和同步带。 3.用平方环法从2DPSK信号中提取载波同步信号,观察相位模糊现象。 三、实验步骤 本实验使用数字信源单元、数字调制单元和载波同步单元。 1.熟悉载波同步单元的工作原理。接好电源线,打开实验箱电源开关。 2.检查要用到的数字信源单元和数字调制单元是否工作正常(用示波器观察信源NRZ-OUT(AK)和调制2DPSK信号有无,两者逻辑关系正确与否)。 3.用示波器观察载波同步模块锁相环的锁定状态、失锁状态,测量环路的同步带、捕捉带。 (1)观察锁定状态与失锁状态 打开电源后用示波器观察ud,若ud为直流,则调节载波同步模块上的可变电容C34,ud随C34减小而减小,随C34增大而增大(为什么?请思考),这说明环路处于锁定状态。用示波器同时观察调制单元的CAR和载波同步单元的CAR-OUT,可以看到两个信号频率相等。若有频率计则可分别测量CAR和CAR-OUT频率。在锁定状态下,向某一方向变化C34,可使ud由直流变为交流,CAR和CAR-OUT频率不再相等,环路由锁定状态变为失锁。 接通电源后ud也可能是差拍信号,表示环路已处于失锁状态。失锁时ud的最大值和最小值就是锁定状态下ud的变化范围(对应于环路的同步范围)。环路处于失锁状态时,CAR和CAR-OUT频率不相等。调节C34使ud的差拍频率降低,当频率降低到某一程度时ud会突然变成直流,环路由失锁状态变为锁定状态。 4.观察环路的捕捉过程 先使环路处于失锁定状态,慢慢调节C34,使环路刚刚进入锁定状态后,关闭电源开关,然后再打开电源,用示波器观察ud,可以发现ud由差拍信号变为直流的变化瞬态过程。ud的这种变化表示了环路的捕捉过程。 通信原理实验报告 5.观察相干载波相位模糊现象 使环路锁定,用示波器同时观察调制单元的CAR和载波同步单元的CAR-OUT信号,反复断开、接通电源可以发现这两个信号有时同相、有时反相。 通信原理实验报告 四、实验总结 1.总结锁相环锁定状态及失锁状态的特点。 答:模拟锁相环锁定的特点:输入信号频率与反馈信号的频率相等,鉴相器输出电压为直流。模拟锁相环失锁的特点:鉴相器输出电压为不对称的差拍电压。2.设K0=18 HZ/V,根据实验结果计算环路同步带ΔfH及捕捉带ΔfP。答:代入指导书“3式”计算得:v112v,则 fH186108Hz;v28v,则fp18472Hz 3.由公式nRCKdKo及6811n计算环路参数ωn和ζ,式中 Kd=6 2(R25R68)C114 -6 V/rad,Ko=2π×18 rad/s.v,R25=2×10,R68=5×10,C11=2.2×10F。(fn=ωn/2π应远小于码速率,ζ应大于0.5)。 答:nn2186.5fn17.6Hz远小于码速率 ;111rad4362(210510)2.21051032.2106170.5(波特);1110.6 24.总结用平方环提取相干载波的原理及相位模糊现象产生的原因。 答:平方运算输出信号中有2fc离散谱,模拟环输出信号频率等于2fc,二分频,滤波后得到干扰波;2电路有两个初始状态,导致提取的相干载波有两种相反的相位状态 5.设VCO固有振荡频率f0 不变,环路输入信号频率可以改变,试拟订测量环路同步带及捕捉带的步骤。 答:环路处于锁定状态后,慢慢增大C34,使ud增大到锁定状态下的最大值ud1(此值不大于+12V); ① ud增大到锁定状态下的最大值ud1值为: 4.8 V 通信原理实验报告 ② 继续增大C34,ud变为交流(上宽下窄的周期信号)。③ 环路失锁。再反向调节减小C34,ud的频率逐渐变低,不对称程度越来越大。 ④ 直至变为直流。记环路刚刚由失锁状态进入锁定状态时鉴相器输出电压为ud2;继续减小C34,使ud减小到锁定状态下的最小值ud3; 环路刚刚由失锁状态进入锁定状态时鉴相器输出电压为ud2为:2.4 V ud减小到锁定状态下的最小值ud3为 :1.6 V ⑤ 再继续减小C34,ud变为交流(下宽上窄的周期信号),环路再次失锁。然后反向增大C34,记环路刚刚由失锁状态进入锁定状态时鉴相器输出电压为ud4。环路刚刚由失锁状态进入锁定状态时鉴相器输出电压为ud4的值为:4.4 V 通信原理实验报告 实验四 数字解调与眼图 一、实验目的 1.掌握2DPSK相干解调原理。 2.掌握2FSK过零检测解调原理。 二、实验内容 1.用示波器观察2DPSK相干解调器各点波形。 2.用示波器观察2FSK过零检测解调器各点波形。3.用示波器观察眼图。 三、实验步骤 1.复习前面实验的内容并熟悉2DPSK解调单元及2FSK解调单元的工作原理,接通实验箱电源。将数字调制单元单刀双掷开关K7置于左方NRZ端。 2.检查要用到的数字信源、数字调制及载波同步单元是否工作正常,保证载波同步单元处于同步态! 3.2DPSK解调实验 (1)将数字信源单元的BS-OUT用信号连线连接到2DPSK解调单元的BS-IN点,以信源单元的FS信号作为示波器外同步信号,将示波器的CH1接数字调制单元的BK,CH2(建议使用示波器探头的x10衰减档)接2DPSK解调单元的MU。MU与BK同相或反相,其波形应接近图4-3所示的理论波形。 (2)示波器的CH2接2DPSK解调单元的LPF,可看到LPF与MU同相。当一帧内BK中“1”码“0”码个数相同时,LPF的正、负极性信号电平与0电平对称,否则不对称 通信原理实验报告 (3)示波器的CH1接VC,调节电位器R39,保证VC处在0电平(当BK中“1”与“0”等概时LPF的中值即为0电平),此即为抽样判决器的最佳门限。 (4)观察数字调制单元的BK与2DPSK解调单元的MU、LPF、BK之间的关系,再观察数字信源单元中AK信号与2DPSK解调单元的MU、LPF、BK、AK-OUT信号之间的关系。BK与 2DPSK 的MU BK与 2DPSK 的LPF 通信原理实验报告 BK与 2DPSK 的BK AK与 2DPSK 的MU 通信原理实验报告 AK与 2DPSK 的LPF AK与 2DPSK 的BK 通信原理实验报告 AK与 2DPSK 的AK-OUT (6)将数字调制单元单刀双掷开关K7置于右方(M序列)端,此时数字调制器输入的基带信号是伪随机序列(本系统中是M序列)信号。用示波器观察2DPSK解调单元LPF点,即可看到无噪声状态下的眼图。 通信原理实验报告 4.2FSK解调实验 将数字调制单元单刀双掷开关K7还原置于左方NRZ端。将数字信源单元的BS-OUT用信号连线换接到2FSK解调单元的BS-IN点,示波器探头CH1接数字调制单元中的AK,CH2分别接2FSK解调单元中的FD、LPF、CM及AK-OUT,观察2FSK过零检测解调器的解调过程(注意:低通及整形2都有倒相作用)。LPF的波形应接近图4-4所示的理论波形。 AK与 2FSK的 FD AK与 2FSK的 LPF 通信原理实验报告 AK与 2FSK的 AK-OUT 四、实验总结 1.设绝对码为1001101,根据实验观察得到的规律,画出如果相干载波频率等于码速率的1.5倍,在CAR-OUT与CAR同相、反相时2DPSK相干解调MU、LPF、BS、BK、AK波形示意图,总结2DPSK克服相位模糊现象的机理。 当相干载波为-cosωt时,MU、LPF及BK与载波为cosωt时的状态反相,但AK仍不变(第一位与BK的起始电平有关)。2DPSK系统之所能克服相位模糊现象,是因为在发端将绝对码变为了相对码,在收端又将相对码变为绝对码,载波相位模糊可 使解调出来的相对码有两种相反的状态,但它们对应的绝对码是相同的。第三篇:通信原理实验报告
第四篇:通信网络实验报告
第五篇:通信原理实验报告