第一篇: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[]){
//³õʼ»¯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;} //°ó¶¨IPºÍ¶Ë¿Ú 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!”);} //¿ªÊ¼¼àÌý if(listen(slisten, 5)== SOCKET_ERROR){} //Ñ-»·½ÓÊÕÊý¾Ý SOCKET sClient;sockaddr_in remoteAddr;printf(“listen error!”);return 0;
char revData[255];while(true){printf(“µÈ´ýÁ¬½Ó...n”);sClient = accept(slisten,(SOCKADDR *)&remoteAddr, &nAddrlen);if(sClient == INVALID_SOCKET)
{
printf(“accept error!”);
continue;
}
printf(“½ÓÊܵ½Ò»¸öÁ¬½Ó£º%s
inet_ntoa(remoteAddr.sin_addr));
//½ÓÊÕÊý¾Ý
int ret = recv(sClient, revData, 255, 0);
if(ret > 0)
{
revData[ret] = 0x00;
printf(revData);
}
//·¢ËÍÊý¾Ý
char * sendData = ”ÄãºÃ£¬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 = “ÄãºÃ£¬TCP·þÎñ¶Ë£¬ÎÒÊÇ¿Í»§¶Ë!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很相似。现将收到的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] 黄葆华 牟华坤编著,《通信原理》,先电子科技大学出版社