1. 通信软件基础-移动通信中的算法问题-实验

本文介绍了如何在移动通信中使用快速排序算法对基站信号强度进行排序,并通过滑动相关检测方法找到含有噪声背景的实际信号序列。作者提供了代码示例,展示了如何计算信号强度、读取文本文件数据以及执行相关检测任务。
摘要由CSDN通过智能技术生成

目录

简介

 任务描述:

关键词:无线信号强度 排序算法 相关检测

无线信号强度计算

 基站信号强度排序

相关检测

代码模块

头文件定义:

函数相关:

快排:

无限信号求和:

主函数:

变量定义

主要流程一

主要流程二(搭档写的)

总结


简介

移动通信中的算法问题是指在移动通信系统中,为了实现高效的通信和资源分配,需要设计和实现各种算法。这些算法涉及到信道分配、功率控制、调度、路由选择等方面,目的是优化系统性能,提高通信质量和用户体验。

数字信号处理的往往 是复数信号。

在开始代码之前,先了解一些基础的东西。

算法方面希望去了解快速排序         

如: a + bi

信号强度计算实例

序号为n的点,a[n]+b[n]i,其信号强度:

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

相关检测方法 假设确定信号序列为x[m],具有噪声背景的实际信号序列为y[n],m<n,通过滑动相关计算,找出滑动相关计算序列z[k]的最大的值,则可以求出具有噪声背景的实际信号序列y中所包含的确定信号序列x的位置。    

滑动相关计算公式为: 

 任务描述:

关键词:无线信号强度 排序算法 相关检测

无线信号强度计算

已知0到9号基站信号数据在0.txt-9.txt文件中

奇数行是信号实部和偶数行是信号虚部

计算N=20时各基站的信号强度 (各基站前20个采样信号的强度)

需要几个txt文本,需要读者自行准备。

 基站信号强度排序

对各基站信号强度进行排序,输出排序结果

输出应接入基站(信号强度最大基站)的序号

推荐使用:快速排序

相关检测

已知10号基站信号(噪音+原始信号)强度数据在y.txt文件中(无需再计算实部虚部的模);

原始信号强度数据在x.txt中 确定10号基站的信号序列(原始信号)位置,即计算使得z最大的k值 (设原始信号长度m=50)

文本文件需要自行准备

代码模块

头文件定义:

#define _CRT_SECURE_NO_DEPRECATE//不使用这个在vs里运行,读写文件会出错
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include<conio.h>

函数相关:

快排:

int quick_sort(float* a,int *c, int low,  int high)//a是需要计算的数组,c的存在是为了保护下标
{
	int i = low;
	int j = high;
	int temp1,temp2;
	float key = a[i];
	while (i < j)
	{
		while (i < j && a[j] >= key)
		{
			j--;
		}
		temp1 = c[i];
		c[i] = c[j];
		c[j] = temp1;
		a[i] = a[j];
		while (i < j && a[i] <= key)
		{
			i++;
		}
		temp2 = c[j];
		c[j] = c[i];
		c[i] = temp2;
		a[j] = a[i];
	}
	a[i] = key;
	if (i - 1 > low)
	{
		quick_sort(a, c,low, i - 1);
	}

	if (i + 1 < high)
	{
		quick_sort(a, c,i + 1, high);
	}

	return 0;
}

无限信号求和:

/*无线信号的求和*/
float wireless_Signal_Strength_Calculations(int a[N], int b[N], double * c)
{
	float sum=0;
		for(int i = 0; i <N; i++)
		{
			c[i] = sqrt(pow(a[i], 2) + pow(b[i], 2));
			sum += c[i];
	    }

		return sum;
}

主函数:

变量定义

/*变量声明*/
int a[N];
int b[N];
double c[N];
FILE* file;
char line[MAX_LINE_LENGTH];
char filename[MAX_FILENAME_LENGTH];
char filenames[2][MAX_FILENAME_LENGTH];
int sort_Bs[N] = { 0,1,2,3,4,5,6,7,8,9 };//一个数组存储下标
float signal_Sum[10] = {};

/*任务三变量声明*/
float* x, * y, ret = 0,max = 0;
int xSize = 100, ySize = 100;
int xIndex = 0, yIndex = 0;
int i = 0, j = 0, pos = 0;

主要流程一

/*主要流程1:一二题的实现*/
for (int i = 0; i <= 9; i++)
{
	sprintf(filename, "%d.txt", i);
	file = fopen(filename, "r");
	if (file == NULL) {
		printf("无法打开文件 %s\n", filename);
		continue;  // 如果无法打开文件,跳过当前循环,继续下一个文件
	}
	//读取文件内容
	int file_size = 0;
	while (fgets(line, MAX_LINE_LENGTH, file) != NULL)
	{
		int number = atoi(line);
		//printf(" % d", number);
		if (file_size % 2 != 0)
		{
			a[file_size / 2] = number;

		}
		else
		{
			b[file_size / 2] = number;

		}
		file_size++;
	}
	fclose(file);

	signal_Sum[i] = wireless_Signal_Strength_Calculations(a, b, c);
	file_size++;
	// 关闭文件


}

printf("第一,二题:");
printf("排序之前:\n");
for (int i = 0; i < sizeof(signal_Sum) / sizeof(signal_Sum[0]); i++)
{
	printf("%lf ", signal_Sum[i]);
}
putchar(10);//换行

//调用-快排
quick_sort(signal_Sum, sort_Bs, 0, (sizeof(signal_Sum) / sizeof(signal_Sum[0])-1));

printf("排序之后:\n");
for (int i = 0; i < sizeof(signal_Sum) / sizeof(signal_Sum[0]); i++)
{
	printf("%lf ", signal_Sum[i]);
}
putchar(10);
printf("信号最大的基站是%d", sort_Bs[sizeof(signal_Sum) / sizeof(signal_Sum[0])-1]);
printf("\n按任意键继续...");
char nouse=_getch();//屏幕停顿
system("cls");//清屏

主要流程二(搭档写的)

/*第三题*/


printf("第三题:");
strcpy(filenames[0], "x.txt");
strcpy(filenames[1], "y.txt");

x = (float*)malloc(xSize * sizeof(float));
y = (float*)malloc(ySize * sizeof(float));

// 逐个处理每个文件
for (int fileIndex = 0; fileIndex < 2; fileIndex++) {
	// 打开文件
	file = fopen(filenames[fileIndex], "r");
	if (file == NULL) {
		printf("无法打开文件 %s\n", filenames[fileIndex]);
		continue; // 如果无法打开文件,跳过当前文件,继续处理下一个文件
	}

	// 逐行读取文件内容
	while (fgets(line, MAX_LINE_LENGTH, file)) {
		// 将字符串转换为数字
		float number = atof(line);

		// 根据文件索引存储到相应的数组中
		if (fileIndex == 0) {
			if (xIndex >= xSize) {
				// 如果数组已满,扩展数组大小
				xSize *= 2;
				x = (float*)realloc(x, xSize * sizeof(float));
			}
			x[xIndex] = number;
			xIndex++;
		}
		else if (fileIndex == 1) {
			if (yIndex >= ySize) {
				// 如果数组已满,扩展数组大小
				ySize *= 2;
				y = (float*)realloc(y, ySize * sizeof(float));
			}
			y[yIndex] = number;
			yIndex++;
		}
	}

	// 关闭文件
	fclose(file);
}

for (i = 0; i <= yIndex - xIndex; i++) {
	ret = 0;
	for (j = 0; j < xIndex; j++) {
		ret = ret + y[j + i] * x[j];
	}
	if (ret > max) {
		pos = i;
		max = ret;
	}
}
printf("最大相关=%lf, 此时位置 = %d\n", max, pos);

// 释放动态分配的内存
free(x);
free(y);

return 0;

总结

实验内容其实很简单,尽量自己跟着老师完成,大多数其实通过查资料都可以解决,这有助于你的代码能力。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值