通软第一次实验

编程入门 行业动态 更新时间:2024-10-06 14:29:54

通软第一次实验

通软第一次实验

背景:移动通信信号接入需要对信号的强度进行检测,同时需要用相关检测法从噪声中检测出有用的确定性信号。因此本次实验需要通过提供的data文件中的信号数据计算出各个信号强度,并对信号强度进行排名,得到信号强度排名前六的data文件,然后对该六个文件与提供的PSS文件进行相关检测,找出功率最强的三个确定性信号。

c语言代码实现如下:

#define _CRT_SECURE_NO_WARNINGS
#define N 20000
#include <stdio.h>
#include <math.h>float I = 0;//定义信号实部
float Q = 0;//定义信号虚部
double P[12] = { 0 };//用于储存12个文件的信号功率大小
char c;//用于文件读行数
int i = 0,j = 0,h = 0;//随便定义的两个变量,用于计循环次数
int lines = 0;//存储文件行数
int n = 0;//用于记文件个数
FILE* file;
char filename[100];//存储文件路径
char outfilename[100];//存储文件路径
struct cell_1 {int cell_ID;float cell_Power;
};//保存小区信号功率以及小区序号
struct cell_1 cell47[12] = { 0,0 };//初始化结构体数组,用于保存各小区信息
struct cell_1 temp = { 0,0 };//初始化结构体temp,用于排序时交换结构体顺序FILE* outfile;//输出txt文件
FILE* file1;//用于存储PSS文件路径
FILE* file2;//用于存储data文件路径
float I_PSS[N] = { 0 };//用于存储PSS文件的信号实部
float I_data[N] = { 0 };//用于存储data文件的信号实部
float Q_PSS[N] = { 0 };//用于存储PSS文件的信号虚部
float Q_data[N] = { 0 };//用于存储data文件的信号虚部
int loc = 0;//用于储存最大信号的位置
int num_data[6] = { 0 };//用于保存功率排序前六的data文件
int num_PSS[3] = { 0,1,2 };//用于保存三个PSS文件
double I_a = 0, I_b = 0, I_ans = 0;//a为实部,b为虚部,I_ans为两复数相乘
double I_SUM[18] = { 0 };//用于储存十八个data和PSS文件的信号最大值
int n_sum = 0;//用于计数十八个最大信号
double max = 0;//用于比较信号最大值,并储存
int lines_PSS = 0;//计数PSS文件的行数
int lines_data = 0;//计数data文件的行数
int n_PSS = 0;//对PSS文件计次
int n_data = 0;//对data文件计次
struct cell_2 {int data;int PSS;double power;
};//保存data文件的序号,PSS文件的序号,以及两个文件对应的信号最大值
struct cell_2 matching[18] = { 0,0,0 };//初始化结构体数组,用于保存两个文件滚动信息
struct cell_2 temp2 = { 0,0,0 };初始化结构体temp,用于排序交换int main()
{/*****************信号功率排序*****************/for (n = 0; n < 12; n++){sprintf(filename, "C:/Users/l/Desktop/学习资料/第一次实验数据/data%d.txt", n);file = fopen(filename, "r");//读文件行数if (file){while ((c = fgetc(file)) != EOF)if (c == '\n') lines++;}rewind(file);//功率计算for (j = 0; j < lines / 2; j++){fscanf(file, "%f", &I);fscanf(file, "%f", &Q);P[n] += sqrt(pow(I, 2) + pow(Q, 2));}//功率和序号赋值给cellcell47[n].cell_Power = P[n];cell47[n].cell_ID = n;//循环结束后将该文件关闭并对行数清零lines = 0;rewind(file);fclose(file);}//冒泡排序for (i = 0; i < 12; i++){for (j = 0; j < 12 - i; j++){if (cell47[j].cell_Power < cell47[j + 1].cell_Power){temp = cell47[j];cell47[j] = cell47[j + 1];cell47[j + 1] = temp;}}}//最后输出排名前六的功率printf("文件\t功率大小\n");for (i = 0; i < 6; i++){printf("data%d\t%f\n", cell47[i].cell_ID, cell47[i].cell_Power);num_data[i] = cell47[i].cell_ID;}/*****************信号功率排序*****************//*****************滑动相关检测*****************/n = 0;//初始化nfor (n_PSS = 0; n_PSS < 3; n_PSS++){//先读确定信号PSS文件sprintf(filename, "C:/Users/l/Desktop/学习资料/第一次实验数据/PSS%d.txt", num_PSS[n_PSS]);file1 = fopen(filename, "r");for (n_data = 0; n_data < 6; n_data++){//再读实际信号data文件sprintf(outfilename, "C:/Users/l/Desktop/学习资料/第一次实验数据/PSS%d_data%d.txt", num_PSS[n_PSS],num_data[n_data]);outfile = fopen(outfilename, "w");sprintf(filename, "C:/Users/l/Desktop/学习资料/第一次实验数据/data%d.txt", num_data[n_data]);file2 = fopen(filename, "r");//分别读两个文件的行数if (file1){while ((c = fgetc(file1)) != EOF)if (c == '\n') lines_PSS++;}rewind(file1);//文件复位if (file2){while ((c = fgetc(file2)) != EOF)if (c == '\n') lines_data++;}rewind(file2);//文件复位//两个文件的信号数值分别储存到对应数组中for (i = 0; i < lines_PSS / 2; i++){fscanf(file1, "%f", &I_PSS[i]);fscanf(file1, "%f", &Q_PSS[i]);}for (i = 0; i < lines_data / 2; i++){fscanf(file2, "%f", &I_data[i]);fscanf(file2, "%f", &Q_data[i]);}//作滑动相关计算for (h = 0; h <= (lines_data - lines_PSS) / 2; h++){I_a = 0;I_b = 0;for (j = 0, i = h; j < lines_PSS / 2; j++, i++){//对滑动相关中所有的信号实部与虚部进行求和后,再进行求模I_a += I_PSS[j] * I_data[i] - Q_PSS[j] * Q_data[i];I_b += I_PSS[j] * Q_data[i] + Q_PSS[j] * I_data[i];}I = sqrt(pow(I_a, 2) + pow(I_b, 2));fprintf(outfile, "%d\t%f\n", h, I);//输出功率大小与位置到txt文件//比较求出信号最大值,并记录最大数值的位置if (I > I_SUM[n]){I_SUM[n] = I;loc = h;}}//将文件序号与信号最大值信息存储到结构体中,用于比较/*printf("data%d\tPSS%d\tloc:%d\t%f\n", num_data[n_data], num_PSS[n_PSS], loc, I_SUM[n]);*/matching[n].data = num_data[n_data];matching[n].PSS = num_PSS[n_PSS];matching[n].power = I_SUM[n];//进行每一次循环的初始化n++;lines_PSS = 0;lines_data = 0;rewind(file1);//文件复位rewind(file2);//文件复位}}for (i = 0; i < 18; i++)//冒泡排序{for (j = 0; j < 18 - i; j++){if (matching[j].power < matching[j + 1].power){temp2 = matching[j];matching[j] = matching[j + 1];matching[j + 1] = temp2;}}}//输出排名前两位的最相关信号printf("最相关信号\n");for (n = 0; n < 18; n++){if (matching[n].PSS == 0){printf("data%d\tPSS%d\t%f\n", matching[n].data, matching[n].PSS, matching[n].power);break;}}for (n = 0; n < 18; n++){if (matching[n].PSS == 1){printf("data%d\tPSS%d\t%f\n", matching[n].data, matching[n].PSS, matching[n].power);break;}}for (n = 0; n < 18; n++){if (matching[n].PSS == 2){printf("data%d\tPSS%d\t%f\n", matching[n].data, matching[n].PSS, matching[n].power);break;}}fclose(file1);fclose(file2);/*****************滑动相关检测*****************/return 0;
}

更多推荐

通软第一次实验

本文发布于:2024-02-28 12:51:58,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1769679.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!