第一篇:消息隊列通信實驗報告
實驗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={
操作結果:隊列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式”計算得:v1?12v,則 fH?18?6?108Hz;v2?8v,則fp?18?4?72Hz 3.由公式?n?RCKdKo及??6811?n計算環路參數ωn和ζ,式中 Kd=6 2(R25?R68)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)。 答:?n??n2??18?6.5fn??17.6Hz遠小于碼速率 ;?111rad43?62?(2?10?5?10)?2.2?105?103?2.2?10?6170.5(波特);???111?0.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系統之所能克服相位模糊現象,是因為在發端將絕對碼變為了相對碼,在收端又將相對碼變為絕對碼,載波相位模糊可 使解調出來的相對碼有兩種相反的狀態,但它們對應的絕對碼是相同的。第三篇:通信原理實驗報告
第四篇:通信網絡實驗報告
第五篇:通信原理實驗報告