//======================================================
//程序功能:在客户端产生LFM和高斯白噪声信号
//编程人:xx
//编程时间:2018/6/3
//======================================================
//**************************对LFM信号进行加噪所用***************************
#include "stdafx.h"
#include "math.h"
#include "time.h"
#include "iostream"
#define PI 3.1415926
#define F1 9300
#define F2 15300
#define Fs 630000
#define WIDE 0.003
#define NUM (int)(Fs*WIDE)
#define NumCreatRand 12
void add_noise_to_signal(int SNR,
double *signal_with_noise); //给LFM信号加上噪声
void product_signal(double
*signal_ini); //生成LFM信号子函数
void product_noise(double
mean,double sigma,double *noise); //生成高斯白噪声
void output_data(double*data,char
*file_name); //输出数据文件
//***************************************************************************
//*******************************TCP传输文件所用*****************************
#include
#include
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
#define PORT 5000
#define SRV_ADDR
"172.23.100.129"
#define BUFFER 1024
#define FILE_NAME_MAX 30
int client_socket();
//***************************************************************************
int _tmain(int argc, _TCHAR*
argv[])
{
//*******************************生成信号所用****************************
double signal_with_noise[NUM];
int SNR[4]={8,5,3,0};
for(int i=0;i<4;i++)
{
add_noise_to_signal(SNR[i],signal_with_noise);
char file_name2[30];
sprintf(file_name2,
"signal_with_noise_%d.txt", SNR[i]);
//LFM信号写入signal_with_noise_SNR.txt SNR是变化的
output_data(signal_with_noise,file_name2);
}
//***********************************************************************
client_socket(); //进行数据传输
return 0;
}
//===================给LFM信号加上指定信噪比噪声===================
//输入:信噪比SNR
// 存储加噪声信号*signal_with_noise
//输出:无
// 尚未加上噪声的信号写入signal_ini.txt
//功能:给LFM信号加上噪声
//=================================================================
void add_noise_to_signal(int SNR,
double *signal_with_noise)
{
double signal_ini[NUM];
product_signal(signal_ini);
//生成LFM信号
char file_name1[30];
strcpy(file_name1,"signal_ini.txt"
); //LFM信号写入signal_ini.txt
output_data(signal_ini,file_name1);
double snr_ture,nsr; //生成高斯白噪声
snr_ture=pow((double)10.0,(double)SNR/(double)10.0);
nsr=sqrt(1.0/(2*snr_ture));
//噪声功率的开方
double noise[NUM];
product_noise(0.0,1.0,noise);
//生成均值为0,方差为1的高斯分布随机数
for(int i=0;i
{
signal_with_noise[i]=signal_ini[i]+nsr*noise[i]; //给LFM信号加上噪声
}
}
//============================高斯分布==============================
//输入:mean高斯分布均值
// sigma高斯分布方差
// *noise存储数据地址 数据长度为NUM
//输出:无
//功能:根据输入高斯分布参数,生成高斯分布数据
//=================================================================
void product_noise(double
mean,double sigma,double *noise)
{
srand(time(NULL));
double prod_noise;
int i;
for(int j=0;j
{
for (prod_noise=0,i=0;i
prod_noise+=(double)rand()/(double)RAND_MAX; //产生[0,1]均匀分布
prod_noise=prod_noise-6.0;
noise[j]=mean+prod_noise*sigma;
//均值为MEAN,方差SIGMA的高斯噪声
}
}
//===========================生成LFM信号===========================
//输入:*signal_ini存储数据地址
数据长度为NUM
//输出:无
//功能:生成线性调频信号
//=================================================================
void product_signal(double
*signal_ini)
{
double k; //线性调频的斜率
double fre[NUM]; //对应的频率
k=(F2-F1)/WIDE; //计算斜率
for (int i=0;i
{
fre[i]=F1+k*i/Fs; //计算每一点下的频率
signal_ini[i]=cos(2*PI*fre[i]*i/Fs);
//LFM信号
}
}
//==========================输出数据MATLAB绘图=====================
//输入:绘图数据*data
// 写入文档名称*file_name
//输出:无
//功能:将数据写入txt文档
//=================================================================
void output_data(double*data,char
*file_name)
{
FILE *fp;
fp=fopen(file_name,"w");
for (int i=0;i
{
fprintf(fp,"%f\n",data[i]);
}
fclose(fp);
}
//============================客户端socket连接发送======================
//功能:实现初始化、发送请求、连接、发送
//返回:-1错误
// 0正确
//======================================================================
int client_socket()
{
WSADATA wsaData;
//对winsocket初始化
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
printf(">>Winsocket
初始化错误!\n");
return -1;
}
SOCKADDR_IN client_addr;
//地址处理
client_addr.sin_family =
AF_INET;
client_addr.sin_port =
htons(PORT);
client_addr.sin_addr.s_addr =
inet_addr(SRV_ADDR);
memset(client_addr.sin_zero,0,8);
while(1)
{
SOCKET
client_socket=socket(AF_INET,SOCK_STREAM,0); //socket描述符
if
(connect(client_socket,(LPSOCKADDR)&client_addr,sizeof(client_addr))
== -1)//请求连接
{
printf(">>连接请求错误!\n");
return -1;
}
printf(">>已连接到服务器!\n");
char status[10]={0};
printf(">>选择操作模式“upload”或者“download”\n>>");
scanf("%s",status);
send(client_socket,status,sizeof(status),0);
if(!strcmp(status, "upload"))
{
char ready[4]={0};
printf(">>等待服务器准备!\n");
while(strcmp(ready, "OK"))
recv(client_socket,ready,sizeof(ready),0);
printf(">>服务器已经准备完毕!\n");
char
file_name[FILE_NAME_MAX+1];
memset(file_name,0,sizeof(file_name));
printf(">>输入等待发送的文件名:\n>>");
scanf("%s",file_name);
printf(">>所输入的文件名为:%s\n",file_name);
FILE *fp=fopen(file_name,"rb");
//打开要发送的文件
if(fp==NULL)
{
printf(">>无法打开该文件,按任意键退出!\n");
system("pause");
exit(0);
}
char buffer[BUFFER]={0};
int count;
while((count=fread(buffer,1,BUFFER,fp))>0)
{
send(client_socket,buffer,count,0);
}
shutdown(client_socket,
SD_SEND);
printf(">>文件%s传输完成!\n",file_name);
recv(client_socket,buffer,BUFFER,0);
fclose(fp);
}
if(!strcmp(status,
"download"))
{
char filename[FILE_NAME_MAX]={0};
//数据写入文件
printf(">>输入保存的文件名称: ");
scanf("%s",filename);
FILE *fp = fopen(filename,
"wb");
printf(">>将把服务器数据保存到:%s\n",filename);
if(fp == NULL)
{
printf("无法打开%s文件!任意按键退出!\n",filename);
system("pause");
exit(0);
}
char ready[4]="OK";
send(client_socket,ready,sizeof(ready),0);
char
buffer[BUFFER]={0};
int count;
while((count=recv(client_socket,buffer,BUFFER,0))>0)
{
fwrite(buffer,count,1,fp);
}
printf(">>成功接收服务器端数据!\n");
fclose(fp);
}
closesocket(client_socket);
char goon[4]={0};
printf(">>是否继续保持连接?输入“yes”或者“no”!\n>>");
scanf("%s",goon);
if(!strcmp(goon,"no"))
break;
}
return 0;
}