通信软件基础实验01

写在前面

本次通信软件基础实验可作为C语言复健的一个小项目,所以将其记录下来,总体实验原理并不难,仅涉及基础语法以及文件操作。

以下为实验报告内容(偷个懒),有删改。

一. 引言

  1. 移动通信中的数字信号往往是复数信号a+bi,储存时只储存a、b也称I、Q。

  2. 终端在每个地点收到的是多个基站信号的叠加,需要依据强度,根据门限判断选择接入哪个基站。

  3. 信号强度(N为序列个数):

  1. 正常通信中,不是把所有信号接收完成之后再计算信号强度,不是随便取一段数据计算,而是在一定时间范围内的平均强度。

二. 系统设计要求

总体要求:计算12个候选小区的强度,找出大于强度门限的小区,并进行从强到弱的排序。强度门限自行设定。

  1. 输出中间过程的信息。

  2. 打印各小区强度以及小区排序的结果(小区ID即文件名)。

  3. 打印设置的强度门限。

三. 设计思路与方案

1. 流程图

2.全局变量及结构体

1
2
3
4
5
6
7
8
9
10
#define MAX 30000
#define NUM 12

struct Area//小区结构体
{
char ID[15]; //小区ID
double avg_strength;//小区平均信号强度
};

struct Area Areas[NUM];//小区结构体数组

3.各类函数

小区初始化函数

在此可以根据文件名称来对小区ID进行修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void initialization()//初始化小区ID
{
strcpy(Areas[0].ID, "data12.txt");
strcpy(Areas[1].ID, "data13.txt");
strcpy(Areas[2].ID, "data14.txt");
strcpy(Areas[3].ID, "data15.txt");
strcpy(Areas[4].ID, "data16.txt");
strcpy(Areas[5].ID, "data17.txt");
strcpy(Areas[6].ID, "data18.txt");
strcpy(Areas[7].ID, "data19.txt");
strcpy(Areas[8].ID, "data20.txt");
strcpy(Areas[9].ID, "data21.txt");
strcpy(Areas[10].ID, "data22.txt");
strcpy(Areas[11].ID, "data23.txt");
}

计算核心函数

对数据进行计算并最终给小区结构体的平均信号强度赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int kqlt(struct Area *area,double Q,double I)//求平均强度函数
{
static double sum; //利用static对数据进行累加
static int i = 0; //利用static对计算次数进行统计
sum = sum + sqrt(Q * Q + I * I); //信号强度计算公式并对结果求和
i++;//计算次数累加
if (i == MAX/2)//当执行到MAX/2次时执行以下代码
{
area->avg_strength = sum / MAX * 2;//求平均信号强度并写入结构体
sum = 0;//总和清零
i = 0;//次数清零
return 0;//返回0表示计算完成
}
return 1;//返回1表示计算未完成
}

数据读取处理函数

读取文件中的数据并调用kqlt函数计算数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void fileop(int num)//读取文件并计算
{
FILE* fp;
double Q, I;
int flag;//设置旗标flag
if((fp = fopen(Areas[num].ID, "r")) == NULL)//打开文件
{
printf("打开文件错误");
}
for (int i = 0;; i++)
{
fscanf(fp, "%lf %lf", &Q, &I);//读取文件,并将数值写入Q、I
flag = kqlt(&Areas[num], Q, I);//通过kqlt函数返回值判断是否计算完成
if (flag == 0)//flag=0时计算完成
{
fclose(fp);//关闭文件
break;//跳出循环
}
}
}

冒泡排序函数

依据小区平均信号强度对小区进行排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void sort()//冒泡算法排序
{
struct Area temp;
for (int j = 0; j < NUM - 1; j++)
{
for (int i = 0; i < NUM - 1 - j; i++)
{
if (Areas[i].avg_strength > Areas[i + 1].avg_strength)
{
temp = Areas[i] ;
Areas[i] = Areas[i + 1];
Areas[i + 1] = temp;
}
}
}
}

主函数

显示提示信息、调用相关函数、输出结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 void main()
{
double lim;
initialization();//调用初始化函数,对结构体进行初始化
printf("计算数据中...\n");
for (int i = 0; i < NUM; i++)//利用for循环计算多个文件信号平均强度
{
fileop(i);
printf("ID:%s \t信号平均强度:%lf\n", Areas[i].ID, Areas[i].avg_strength);
}
sort();//对数据进行排序
printf("\n排序后结果:\n");
for (int i = 0; i < NUM; i++)
{
printf("ID:%s \t信号平均强度:%lf\n",Areas[i].ID, Areas[i].avg_strength);
}
printf("请输入门限:");
scanf("%lf", &lim);//输入门限条件
printf("满足门限条件的小区:\n");
for (int i = 0; i < NUM; i++)
{
if(Areas[i].avg_strength>=lim)//如果满足门限条件打印相关信息
printf("ID:%s \t信号平均强度:%lf\n", Areas[i].ID, Areas[i].avg_strength);
}
}

4. 整体代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
设计概览
1、设置小区结构体,包含:ID,平均信号强度
2、读取文件
3、计算数据(边读取边计算)
4、对相关数据进行排序
5、打印相关信息
*/

#include <stdio.h>
#include <string.h>
#include <math.h>

#define MAX 30000
#define NUM 12

struct Area//小区结构体
{
char ID[15]; //小区ID
double avg_strength;//小区平均信号强度
};

struct Area Areas[NUM];//小区结构体数组

void initialization()//初始化小区ID
{
strcpy(Areas[0].ID, "data12.txt");
strcpy(Areas[1].ID, "data13.txt");
strcpy(Areas[2].ID, "data14.txt");
strcpy(Areas[3].ID, "data15.txt");
strcpy(Areas[4].ID, "data16.txt");
strcpy(Areas[5].ID, "data17.txt");
strcpy(Areas[6].ID, "data18.txt");
strcpy(Areas[7].ID, "data19.txt");
strcpy(Areas[8].ID, "data20.txt");
strcpy(Areas[9].ID, "data21.txt");
strcpy(Areas[10].ID, "data22.txt");
strcpy(Areas[11].ID, "data23.txt");
}


int kqlt(struct Area *area,double Q,double I)//求平均强度函数
{
static double sum; //利用static对数据进行累加
static int i = 0; //利用static对计算次数进行统计
sum = sum + sqrt(Q * Q + I * I); //信号强度计算公式并对结果求和
i++;//计算次数累加
if (i == MAX/2)//当执行到MAX/2次时执行以下代码
{
area->avg_strength = sum / MAX * 2;//求平均信号强度并写入结构体
sum = 0;//总和清零
i = 0;//次数清零
return 0;//返回0表示计算完成
}
return 1;//返回1表示计算未完成
}

void fileop(int num)//读取文件并计算
{
FILE* fp;
double Q, I;
int flag;//设置旗标flag
if((fp = fopen(Areas[num].ID, "r")) == NULL)//打开文件
{
printf("打开文件错误");
}
for (int i = 0;; i++)
{
fscanf(fp, "%lf %lf", &Q, &I);//读取文件,并将数值写入Q、I
flag = kqlt(&Areas[num], Q, I);//通过kqlt函数返回值判断是否计算完成
if (flag == 0)//flag=0时计算完成
{
fclose(fp);//关闭文件
break;//跳出循环
}
}
}

void sort()//冒泡算法排序
{
struct Area temp;
for (int j = 0; j < NUM - 1; j++)
{
for (int i = 0; i < NUM - 1 - j; i++)
{
if (Areas[i].avg_strength > Areas[i + 1].avg_strength)
{
temp = Areas[i] ;
Areas[i] = Areas[i + 1];
Areas[i + 1] = temp;
}
}
}
}


void main()
{
double lim;
initialization();//调用初始化函数,对结构体进行初始化
printf("计算数据中...\n");
for (int i = 0; i < NUM; i++)//利用for循环计算多个文件信号平均强度
{
fileop(i);
printf("ID:%s \t信号平均强度:%lf\n", Areas[i].ID, Areas[i].avg_strength);
}
sort();//对数据进行排序
printf("\n排序后结果:\n");
for (int i = 0; i < NUM; i++)
{
printf("ID:%s \t信号平均强度:%lf\n",Areas[i].ID, Areas[i].avg_strength);
}
printf("请输入门限:");
scanf("%lf", &lim);//输入门限条件
printf("满足门限条件的小区:\n");
for (int i = 0; i < NUM; i++)
{
if(Areas[i].avg_strength>=lim)//如果满足门限条件打印相关信息
printf("ID:%s \t信号平均强度:%lf\n", Areas[i].ID, Areas[i].avg_strength);
}
}

四. 调试

在用VS调试代码时,出现报错

1
错误CXXXX 'XXX': This function or variable may be unsafe. Consider using XXX_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.	

可将项目–>属性–>C/C++–>常规中的SDL检查设置成否

调试时,发现无法正常打开文件以及代码陷入死循环,排查检测发现是将判断语句中的‘==’写成‘=’。

五. 心得体会

虽然C语言上学年学习过,还通过了计算机二级,但是时间久了,相关算法和语法还是有些遗忘,接下来应该在多看看C语言的书籍和资料,巩固加强自身能力。

六. 结果展示

七.相关资源

实验数据

有什么问题在下面留言吧~~~

(附一张edgerunners David & Lucy 的好结局图)

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2023 Block Chen
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信