第一篇:socket通信原理
? Socket原理,大致分為以下幾個步驟。
服務器端的步驟如下。
(1)首先,在實用Socket之前,要首先初始化Socket,就是實用AfxSocketInit()函數。
(2)在初始化完成以后,就可以建立服務端的Socket,然后實用該Sokcet開始偵聽整個網絡中的連接請求。
(3)當檢測到來自客戶端的連接請求時,向客戶端發送收到連接請求的信息,并建立與客戶端之間的連接。連接的過程中,在MFC的框架中會觸發一個前面創建的服務端Socket的消息響應函數OnAccept(),我們將建立的連接的代碼放到該響應函數里面,在建立連接的過程中,會產生一個新的Socket,我們使用找個Socket來進行數據的通信。
(4)在通信的過程中,服務器端的產生的新的Socket會通過一個消息響應函數OnReceive()來接受到達的數據。數據的發送可以使用Send()來完成(5)當完成通信后,服務器關閉與客戶端的Socket連接。
客戶端的步驟如下。
(1)同樣的,初始化Socket,并建立客戶端的Socket,確定要連接的服務器的主機名和端口。
(2)發送連接請求到服務器(MFC中使用Connect()),并等待服務器的回饋信息。
(3)連接成功后,與服務器進行數據的交互。
(4)數據的讀取同服務端一樣,也是通過OnReceive()來完成的,數據的發送通過Send()即可。
(5)數據處理完畢后,關閉自身的Socket連接。
這就是網絡Socket的原理的簡單介紹,大家有什么疑問可以提出來,另外,在服務器端建立Socket連接的過程中,如何支持并發的最大數量,以及服務器端的負載問題,大家可以多加研究一下。
第二篇:c語言簡單socket通信
server:
#include
#include
#pragma comment(lib,“ws2_32.lib”)
int main(int argc, char* argv[]){
//3?ê??ˉWSA
WORD sockVersion = MAKEWORD(2,2);WSADATA wsaData;if(WSAStartup(sockVersion, &wsaData)!=0){return 0;} //′′?¨ì×?ó×? SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(slisten == INVALID_SOCKET){printf(“socket error!”);return 0;} //°ó?¨IPoí???ú sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(8888);sin.sin_addr.S_un.S_addr = INADDR_ANY;if(bind(slisten,(LPSOCKADDR)&sin, sizeof(sin))== SOCKET_ERROR){printf(“bind error!”);} //?aê??àìy if(listen(slisten, 5)== SOCKET_ERROR){} //?-?·?óê?êy?Y SOCKET sClient;sockaddr_in remoteAddr;printf(“listen error!”);return 0;
char revData[255];while(true){printf(“μè′yá??ó...n”);sClient = accept(slisten,(SOCKADDR *)&remoteAddr, &nAddrlen);if(sClient == INVALID_SOCKET)
{
printf(“accept error!”);
continue;
}
printf(“?óêüμ?ò???á??ó£o%s
inet_ntoa(remoteAddr.sin_addr));
//?óê?êy?Y
int ret = recv(sClient, revData, 255, 0);
if(ret > 0)
{
revData[ret] = 0x00;
printf(revData);
}
//·¢?íêy?Y
char * sendData = ”??o?£?TCP?í?§??£?n“;
send(sClient, sendData, strlen(sendData), 0);
closesocket(sClient);
}
closesocket(slisten);
WSACleanup();
return 0;
}
client:
#include
#include
#pragmacomment(lib,”ws2_32.lib“)
rn”,int main(int argc, char* argv[])
{
WORD sockVersion = MAKEWORD(2,2);
WSADATA data;
if(WSAStartup(sockVersion, &data)!= 0)
{
return 0;
}
SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(sclient == INVALID_SOCKET)
{
printf(“invalid socket!”);
return 0;
}
sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(8888);
serAddr.sin_addr.S_un.S_addr = inet_addr(“127.0.0.1”);
if(connect(sclient,(sockaddr *)&serAddr, sizeof(serAddr))SOCKET_ERROR)
{
printf(“connect error!”);
closesocket(sclient);
return 0;
}
char * sendData = “??o?£?TCP·t????£??òê??í?§??!n”;
send(sclient, sendData, strlen(sendData), 0);
char recData[255];
int ret = recv(sclient, recData, 255, 0);
if(ret > 0)
{
recData[ret] = 0x00;
printf(recData);
}
closesocket(sclient);
WSACleanup();
return 0;
} ==
第三篇:vc socket通信實例總結
VC++ socket通信實例 總結
1.兩天計算機通信需要協議,通信的兩臺計算機IP必須唯一
2.同一個計算機可以進行多個應用程序與其他計算機通信,IP地址唯一,而端口號是區別同一計算機(同一IP)的唯一標示。
3.實際上就類似于一個辦公室的總機號碼(IP)和分機號碼(端口號)
4.協議:為了進行網絡中的數據交換(通信)而建立的規則、標準或約定
5.協議=語義+語法+規則 6.不同層具有各自不同的協議
7.上層使用下層提供的服務,實際通信在最底層完成
8.對等層實體之間虛擬通信| 9.TCP:面向連接的可靠的傳輸協議 10.UDP:面向無連接的不可靠的傳輸協議
11.端口是一種抽象的軟件結構。應用程序通過系統調用與某端口建立連接后,傳輸層傳給端口的數據都被響應的進行所接收,相應進程發給傳輸層的數據都通過該端口輸出。12.端口用一個整數型標示符來表示。端口號跟協議相關,TCP/IP傳輸層的兩個協議TCP和UDP是完全獨立的兩個軟件模塊,因此各自的端口號也相互獨立。13.端口使用一個16位的數字來表示,它的范圍是0~65535,1024以下的端口號保留給預定義的服務。例如:http使用的是80端口。
14.socket(套接字):windows sockets只支持一個通信區域:網際域(AF_INET),這個域被使用網際協議簇通信的進程使用。
15.C/S模式:客戶機向服務器提出請求,服務器接收到請求后,提供相應的服務。16.套接字的類型
a)
流式套接字:(SOCK_STREAM):面向連接可靠的數據傳輸服務,按順序接收
b)
數據包式套接字:(SOCK_DGRAM):無連接服務。接收順序混亂。
c)
原始套接字(SOCK_RAM)17.基于TCP(面向連接)的socket編程 a)
服務器端程序:
i.創建套接字socket
ii.將套接字綁定到一個本地地址和端口上bind
iii.將套接字設為監聽模式,準備接收客戶請求listen
iv.等待客戶請求到了;當請求到來后,接收連接請求,返回一個新的對應于此次連接的套接字accept
v.和客戶端進行通信rend/recv
vi.戶請求
vii.b)
客戶端程序:
i.socket
ii.接請求connect
iii.通信rend/recv
iv.18.基于UDP的socket編程 a)
服務器端(接收端)程序:
i.socket
用返回的套接字 返回,等待另一客關閉套接字
創建套接字
向服務端發出連
和服務器端進行 關閉套接字
創建套接字
ii.將套接字綁定到一個本地地址和端口上bind
iii.等待接收數據recv/from
iv.關閉套接字 b)
客戶端(發送端)程序:
i.創建套接字socket
ii.向服務器發送數據sendto
iii.關閉套接字 19.int WSAStartup(WORD wVersionRequested, //打算使用的最高winsock版本號
LPWSADATA lpWSAData //是個結構體,接收socket的詳細信息);20.alt+F8:格式化代碼 21.面向TCP的連接,服務器端
a)
套接字SOCKET socket(int af,//指定地址簇
int type,//socket類型
int protocol //協議);b)
綁定int bind(SOCKET s,//要綁定的套接字
const struct sockaddr FAR* name, //指定了該套接字的本地地址信息
int namelen
//該地址結構的長度);struct sockaddr {
u_short
sa_family;
char
sa_data[14];};c)
監聽int listen(SOCKET s,int backlog);d)
接受連接SOCKET accept(SOCKET s,struct sockaddr FAR* addr,int FAR* addrlen);e)
發送int send(SOCKET s,//建立連接的socket const char FAR * buf, //發送的數據
int len,//發送數據的長度
int flags);f)
接收int recv(SOCKET s,char FAR* buf,int len,int flags);g)
需要的文件#include
Socket b)
連接:connect int connect(SOCKET s,const struct sockaddr FAR* name,int namelen);c)
接收:recv d)
發送:send e)
關閉:closesocket
Tcp服務端程序:=========#include
#include
voidmain()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if(err!= 0){
return;
}
if(LOBYTE(wsaData.wVersion)!= 1 ||
HIBYTE(wsaData.wVersion)!= 1){
WSACleanup();
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprintf(sendBuf,“Welcome %s to 劉洼村”,inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf(“%sn”,recvBuf);
closesocket(sockConn);
}
} 24.Tcp客戶端程序:[cpp] view plaincopy#include
#include
void main(){
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if(err!= 0){
return;
}
if(LOBYTE(wsaData.wVersion)!= 1 ||
HIBYTE(wsaData.wVersion)!= 1){
WSACleanup();
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr(“127.0.0.1”);//服務器端的地址
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf(“%sn”,recvBuf);
send(sockClient,“This is 劉洼村”,strlen(“This is 劉洼村”)+1,0);
closesocket(sockClient);
WSACleanup();}
25.運行之后,開啟了6個客戶端,一個服務器端。程序運行效果:
26.面向UDP的連接 27.服務器:socket a)
bind b)
接收數據:int recvfrom(SOCKET s,//套接字
char FAR* buf,//接收數據
int len,//長度
int flags,//會影響調用行為,0 struct sockaddr FAR* from, //接收發送方的地址信息
int FAR* fromlen
//接收長度);c)
關閉closesocket d)
Cleanup 28.UDP服務器端程序:[cpp] view plaincopy#include
#include
void main(){
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if(err!= 0){
return;
}
if(LOBYTE(wsaData.wVersion)!= 1 ||
HIBYTE(wsaData.wVersion)!= 1){
WSACleanup();
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[100];
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
printf(“%sn”,recvBuf);
closesocket(sockSrv);
WSACleanup();
} 28.UDP客戶端: a)
socket定義
b)
發送:
int sendto(SOCKET s,const char FAR * buf,int len,int flags,const struct sockaddr FAR * to,int tolen);29.UDP客戶端程序[cpp] view plaincopy#include
#include
void main(){
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if(err!= 0){
return;
}
if(LOBYTE(wsaData.wVersion)!= 1 ||
HIBYTE(wsaData.wVersion)!= 1){
WSACleanup();
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr(“127.0.0.1”);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
sendto(sockClient,“Hello 劉洼村”,strlen(“Hello 劉洼村”)+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();} 運行結果:
30.注意:每個程序都要加上ws2_32.lib鏈接庫。如下添加:
By 劉洼村
第四篇:通信原理
通信的目的:傳遞消息中所包含的信息。
消息:是物質或精神狀態的一種反映,例如語音、文字、音樂、數據、圖片或活動圖像等。信息:是消息中包含的有效內容。
信道:將來自發送設備的信號傳送到接收端的物理媒質。分為有線信道和無線信道兩大類。模擬通信系統是利用模擬信號來傳遞信息的通信系統。
數字通信系統是利用數字信號來傳遞信息的通信系統。
信源編碼與譯碼目的:提高信息傳輸的有效性、完成模/數轉換
信道編碼與譯碼目的:增強抗干擾能力
加密與解密目的:保證所傳信息的安全
數字調制與解調目的:形成適合在信道中傳輸的帶通信號
同步目的:使收發兩端的信號在時間上保持步調一致。
數字通信的特點
優點:
抗干擾能力強,且噪聲不積累
傳輸差錯可控
便于處理、變換、存儲
便于將來自不同信源的信號綜合到一起傳輸
易于集成,使通信設備微型化,重量輕
易于加密處理,且保密性好
缺點:
需要較大的傳輸帶寬
對同步要求高
通信系統的分類
按通信業務分類:電報通信系統、電話通信系統、數據通信系統、圖像通信系統 … … 按調制方式分類:基帶傳輸系統和帶通(調制)傳輸系統
調制傳輸系統又分為多種調制,詳見書中表1-1。
按信號特征分類:模擬通信系統和數字通信系統
按傳輸媒介分類:有線通信系統和無線通信系統
按工作波段分類:長波通信、中波通信、短波通信 … …
按信號復用方式分類:頻分復用、時分復用、碼分復用
通信方式:
單工通信:消息只能單方向傳輸的工作方式
半雙工通信:通信雙方都能收發消息,但不能同時收發的工作方式
全雙工通信:通信雙方可同時進行收發消息的工作方式
并行傳輸:將代表信息的數字信號碼元序列以成組的方式在兩條或兩條以上的并行信道上同時傳輸
優點:節省傳輸時間,速度快:不需要字符同步措施
缺點:需要 n 條通信線路,成本高
串行傳輸 :將數字信號碼元序列以串行方式一個碼元接一個碼元地在一條信道上傳輸優點:只需一條通信信道,節省線路鋪設費用
缺點:速度慢,需要外加碼組或字符同步措施
第五篇:通信原理課程設計
目錄
一、設計目的和意義????????????????????2
二、設計原理???????????????????????2
1.2FSK的介紹?????????????????????????2
2.2FSK的產生?????????????????????????2
3.2FSK濾波器的調解及抗噪聲性能????????????????4
4.2FSK解調原理????????????????????????7
三、詳細設計步驟????????????????????^7 1.信號產生??????????????????????????7
2.信號調制??????????????????????????7 3.信號解調??????????????????????????8
四、設計結果及分析????????????????????8 1.信號產生??????????????????????????8 2.信號調制??????????????????????????8 3.信號解調??????????????????????????9 4.課程設計程序???????????????????????11
五、心得體會??????????????????????15
六、參考文獻???????????????????????16
2FSK的調制解調仿真實現
一、設計目的和意義
1.熟練地掌握matlab在數字通信工程方面的應用; 2.了解信號處理系統的設計方法和步驟;
3.理解2FSK調制解調的具體實現方法,加深對理論的理解,并實現2FSK的調制解調,畫出各個階段的波形;
4.學習信號調制與解調的相關知識;
5.通過編程、調試掌握matlab軟件的一些應用,掌握2FSK調制解調的方法,激發學習和研究的興趣。
二、設計原理
1.2FSK的介紹
二進制頻率調制是用二進制數字信號控制正弦波的頻率隨二進制數字信號的變化而變化。由于二進制數字信息只有兩個不同的符號,所以調制后的已調信號有兩個不同的頻率f1和f2,f1對應數字信息“1”,f2對應數字信息“0”。二進制數字信息及已調載波如圖2-1所示。
圖2-1 2FSK信號
2.2FSK的產生
在2FSK信號中,當載波頻率發生變化時,載波的相位一般來說是不連續的,這種信號稱為不連續2FSK信號。相位不連續的2FSK通常用頻率選擇法產生,如圖2-2所示:
圖2-2 2FSK信號調制器
兩個獨立的振蕩器作為兩個頻率發生器,他們受控于輸入的二進制信號。二進制信號通過兩個與門電路,控制其中的一個載波通過。調制器各點波形如圖2-3所示:
圖2-3 2FSK調制器各點波形
由圖2-3可知,波形g是波形e和f的疊加。所以,二進制頻率調制信號2FSK可以看成是兩個載波頻率分別為f1和f2的2ASK信號的和。由于“1”、“0”
統計獨立,因此,2FSK信號功率譜密度等于這兩個2ASK信號功率譜密度之和,即
(2-1)
2FSK信號的功率譜如圖2-4所示:
圖2-4 2FSK信號的功率譜
由圖2-4看出,2FSK信號的功率譜既有連續譜又有離散譜,離散譜位于兩個載波頻率f1和f2處,連續譜分布在f1和f2附近,若取功率譜第一個零點以內的成分計算帶寬,顯然2FSK信號的帶寬為
(2-2)為了節約頻帶,同時也能區分f1和f2,通常取|f1-f2|=2fs,因此2FSK信號的帶寬為
(2-3)當|f1-f2|=fs時,圖2-4中2FSK的(2-4)對于功率譜是
功率譜由雙峰變成單峰,此時帶寬為
單峰的2FSK信號,可采用動態濾波器來解調。此處介紹功率譜為雙峰的2FSK信號的解調。
3.2FSK濾波器的調解及抗噪聲性能
2FSK信號的解調也有相干解調和包絡解調兩種。由于2FSK信號可看做是兩個2ASK信號之和,所以2FSK解調器由兩個并聯的2ASK解調器組成。圖2-5為相干2FSK和包絡解調。
圖2-5 2FSK信號調解器
相干2FSK抗噪聲性能的分析方法和相干2ASK很相似?,F將收到的2FSK信號表示為(2-5)當發送數字信息為“1”時,2FSK信號的載波頻率為f1,信號能通過上支路的帶通濾波器。上支路帶通濾波器的輸出是信號和窄帶噪聲ni1(t)的疊加(噪聲中的下標1表示上支路窄帶高斯噪聲),即
(2-6)此信號與同步載波cos2πf1t相乘,再經低通濾波器濾除其中的高頻成分,送給取樣判決器的信號為
(2-7)上式中未計入系數1/2。與此同時,頻率為f1的2FSK信號不能通過下支路中的帶通濾波器,因為下支路中的帶通波器的中心頻率為f2,所以下支路帶通濾波器的輸出只有窄帶高斯噪聲,即
πf2t相乘,再經低通濾波器濾波后輸出為
(2-8)此噪聲與同步載波cos2(2-9)上式中未計入系數1/2。定義
(2-10)取樣判決器對x(t)取樣,取樣值為為
(2-11)其中,nI1、nI2都是均值為0、方差的高斯隨機變量,所以x是均值為a、方差為的高斯隨機變量,x的概率密度函數為 概率密度曲線如圖2-6所示:
(2-12)
圖2-6 判決值的函數示意圖
判決器對x進行判決,當x>0時,判發送信息為“1”,此判決是正確的; 當x<0時,判決發送信息為“0”,顯然此判決是錯誤的。由此可見,x<0的概率就是發“1”錯判成“0”的概率,即(2-13)
當發送數字信號“0”時,下支路有信號,上支路沒有信號。用與上面分析完全相同的方法,可得到發“0” 碼時錯判成“1”碼的概率P(1/0),容易發現,此概率與上式表示的P(0/1)相同,所以解調器的平均誤碼率為
Pe=P(1)P(0/1)+P(0)P(1/0)=P(0/1)[P(1)+P(0)]=P(0/1)(2-14)所以
(2-15)式中
注意,式中無需“1”、“0”等概這一條件。
4.2FSK解調原理
2FSK的解調方式有兩種:相干解調方式和非相干解調方式,本次課程設計采用的是相干解調方式。根據已調信號由兩個載波f1、f2調制而成,相干解調先用兩個分別對f1、f2帶通的濾波器對已調信號進行濾波,然后再分別將濾波后的信號與相應的載波f1、f2相乘進行相干解調,再分別低通濾波、用抽樣信號進行抽樣判決器即可其原理如下:
圖2-7 解調原理框圖
輸入的信號為:S(t)=[∑аn*g(t-nTs)]cosω1t+[ān*g(t-nTs)]cosω1t(ān是аn的反碼)來設計仿真。
三、詳細設計步驟
1.信號產生:二進制隨機序列和兩列頻率不等的載波
1)利用matlab 庫函數產生10個二進制隨機數,也就是我們的基波調制信號a。并畫出其波形。
2)產生兩列余弦波tuf1和tuf2,頻率分別為f1=20hz,f2=100hz;并畫出其波形。
2.信號調制:產生2FSK信號和加入高斯噪聲后的2FSK信號
1)用二進制序列a去調制f1和f2,產生2fsk信號,具體做法是用以a生成的方波信號g1a直接與tuf1相乘,用a取反后的方波g2a與tuf2相乘,再將兩列信號相加。并畫出其波形。
2)調用matlab 庫函數產生高斯噪聲no,并與2fsk信號相加得到加入噪聲后的sn信號。并畫出其波形。
3.信號解調:
1)對于兩列讓sn通過兩個帶通濾波器H1和H2,他們分別以f1和f2為中心頻率,并畫出經過帶通濾波器后的波形。
2)對這兩列波形分別相干解調乘以與他們同頻同相的余弦波tuf1和tff2,畫出此時的波形。
3)讓這兩列波形再通過低通濾波器sw1和sw2得到這兩列基帶調制波形g1a和g2a.畫出其波形。
4)最后將兩列波g1a和g2a通過抽樣判決器,畫出其波形st,并與之前調制后的波形sn做對比。
四、設計結果及分析
1.信號產生 波形figure(1)
圖4-1 figure(1)
figure(1)分析:第一幅圖現實了此時產生的二進制序列是1011011011,第二和第三幅圖片是頻率為20hz的載波tuf1和頻率為100hz的載波tuf2的波形。2.信號調制 波形figure(2)
圖4-2 figure(2)
figure(2)分析:由于產生的隨即序列是1011011011,對比上面figure2可以看出,波形較疏的是tuf1,波形較密的是tuf2,上圖呈現的序列是:1011011011,與調制波相符。3.信號解調 波形figure(3)
圖4-3 figure(3)
figure(3)分析:經過帶通濾波器之后濾出了頻率為f1和f2的載波,從figure(2)和figure(3)的對比可以看出這一步做對了。波形figure(4)
圖4-4 figure(4)
figure(4)分析:這是兩列信號經過相干解調乘以同頻同相的載波之后得到的波形,可以看出figure(4)比figure(3)的波形更密了。波形figure(5)
圖4-5 figure(5)figure(5)分析:經過低通濾波器之后,調制信號被濾出來了,第一幅為tuf1,濾波后的序列為:1011011011,與之前的調制信號相同。第二幅圖為:0100100100,與調制信號相反,這是因為在程序中隊調制信號取反之后才和tuf2相乘的。波形figure(6)
圖4-6 figure(6)figure(6)分析:經過抽樣判決之后,恢復出來的基帶信號是:1011011011,與調制信號一樣,從原始波形也可以看出,解調后的波形與調制信號相同。2FSK調制解調實現。4.課程設計程序: fs=2000;%抽樣頻率 dt=1/fs;f1=20;%定義兩列載波的頻率 f2=100;a=round(rand(1,10));%產生二進制隨機序列 g1=a;g2=~a;g11=(ones(1,2000))'*g1;%產生方波信號 g1a=g11(:)';g21=(ones(1,2000))'*g2;g2a=g21(:)';t=0:dt:10-dt;t1=length(t);tuf1=cos(2*pi*f1.*t)tuf2=cos(2*pi*f2.*t)
subplot(311)n=0:9;x=square(1,50);stem([0:9],a*x);grid;xlabel('二進制隨機序列')ylabel('幅度')
subplot(312);plot(t,tuf1);title('頻率為f1的余弦波')ylabel('幅度')
subplot(313);plot(t,tuf2);title('頻率為f2的余弦波')ylabel('幅度')
figure(2)fsk1=g1a.*tuf1;fsk2=g2a.*tuf2;fsk=fsk1+fsk2;no=0.01*randn(1,t1);%噪聲 sn=fsk+no;subplot(211);plot(t,fsk);title('2fsk波形')ylabel('幅度')
subplot(212);plot(t,sn);title('加入高斯噪聲后的2fsk波形')ylabel('幅度的大小')xlabel('t')
figure(3)%FSK解調
b1=fir1(101,[10/800 20/800]);b2=fir1(101,[90/800 110/800]);%設置帶寬參數
H1=filter(b1,1,sn);%b1為分子,1為分母,sn為濾波器輸入序列 H2=filter(b2,1,sn);%噪聲信號同時通過兩個濾波器 subplot(211);plot(t,H1);
title('經過帶通濾波器H1后的波形')%畫出經過H1濾波器后的波形 ylabel('幅度');subplot(212);plot(t,H2);%畫出經過濾波器二后的波形 title('經過帶通濾波器H2后的波形')ylabel('幅度')xlabel('t')sw1=H1.*H1;%相干解調乘以同頻同相的載波 sw2=H2.*H2;%經過相乘器
figure(4)subplot(211);plot(t,sw1);title('經過相乘器h1后的波形')%畫出乘以同頻同相載波后的波形 ylabel('幅度')subplot(212);plot(t,sw2);13
title('經過相乘器h2后的波形')ylabel('.幅度')xlabel('t')bn=fir1(101,[2/800 10/800]);%經過低通濾波器
figure(5)st1=filter(bn,1,sw1);st2=filter(bn,1,sw2);subplot(211);plot(t,st1);title('經過低通濾波器sw1后的波形')%ylabel('幅度')%subplot(212);plot(t,st2);title('經過低通濾波器sw2后的波形')ylabel('幅度')xlabel('t')%判決
for i=1:length(t)if(st1(i)>=st2(i))st(i)=0;else st(i)=st2(i);end end
figure(6)st=st1+st2;subplot(211);plot(t,st);title('經過抽樣判決器后的波形')%ylabel('幅度')14
經過低通濾波器,濾出頻率為f1,f2的基帶調制信號波形 畫出經過抽樣判決的波形
subplot(212);plot(t,sn);title('原始的波形')ylabel('幅度')xlabel('t')
五、心得體會
課程設計不僅是對前面所學知識的一種檢驗,而且也是對自己能力的一種提高。下面我對整個課程設計過程做一下簡單的總結。第一,查資料室做課程設計的前期準備工作,好的開端就相當于成功了一半,到圖書館或上網找相關資料雖說是比較原始的方式,但也有可取之處。不管通過哪種方式查的資料都是有利用價值的,要一一記錄下來以備后用。第二,通過上面的過程,已經積累了不少資料,對所給的課程也大概有了一些了解,這一步就在這樣的基礎上,綜合已有的資料來更透徹的分析題目。第三,有了研究方向,就該動手實現了。其實以前的兩步都是為這一步作的鋪墊。
本次課程設計主要涉及到了通信原理和MATLB的相關知識與運用,主要有基帶信號的調制原理及方法、低通和帶通濾波器等等,加深了對上述相關知識的了解,使自己更深刻理解了調制與解調的原理和實現方法,以及基本掌握了MATLAB的基本應用。因為是以所學理論為基礎,所以在課程設計的過程中,我又重溫2FSK的調制與解調等知識,更加熟悉了MATLB里面的Simulink工具箱,學會了獨立建立模型,分析調制與解調結果,和加入噪聲之后的情況,通過自己不斷的調試,更好的理解加入噪聲對信道的影響。
這次課程設計對我的自身能力有了進一步了解。第一點,這進一步端正了我的學習態度,學會了實事求是、嚴謹的作風,提高了動手能力。也要對自己嚴格要求,不能夠一知半解,要力求明明白白。浮躁的性格對于搞設計來說或者學習是致命的,一定要靜下心來,踏實的做事。第二點,我覺得動手之前,頭腦里必須清楚應該怎么做,這一點是很重要的,所謂三思而后行。
在這次課程設計中我們遇到了許多的困難,由于粗心大意出了一些簡單的錯誤,浪費了許多時間去改正。還好在同學和老師的幫組下,給我指出了錯誤的原因以及改正的方法,我們組才順利的完成了本次課程設計。通過這次課程設計,15
我學到了很多書本上沒有的知識。鍛煉了我們獨立思考問題、分析問題、解決問題的能力。而且本次設計有自己和本組成員共同完成。加強了和別人溝通的能力以及團隊精神,對我們走向社會是個很好的鍛煉。這個課程設計完成倉促,在編程過程中,我發現自己的程序還有很多地方可以完善,其中若有不足之前,請老師指出,我將及時改正。
六、參考文獻
[1] 王興亮 編著,《數字通信原理與技術》,西安電子科技大學出版社,第二版
[2] 徐明遠 邵玉斌 編著,《MATLAB仿真在通信與電子工程中的應用》,西安電子科技大學出版社,2005 [3] 孫屹 吳磊編著, 《Simulink通信仿真開發手冊》,國防工業出版社,2003 [4] 黃葆華 牟華坤編著,《通信原理》,先電子科技大學出版社