c语言编程高斯白噪声信号,C语言-TCP协议传输下信号的处理

//======================================================

//程序功能:在客户端产生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;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值