问题背景
移动通信(Mobilecommunication)是移动体之间的通信,或移动体与固定体之间的通信。
信号功率排序
- 首先注意,数字信号处理的往往是复数信号。
a + bi
存储时,不存储i
只存储a、b,也称为IQ
终端在每个地点收到的是多个基站信号的叠加,需要依据强度,判断选择接入那个基站。
- 信号强度计算实例
序号为n的点,a[n]+b[n]i,其信号强度:
信号强度(N为序列个数):
而正常通信中,不可能把所有信号接收完成之后再计算信号强度,也不可能随便取一段数据计算,而是在一定时间范围内的平均强度。此外这还涉及到对平均强度进行排序的问题。
- 假设:
待测数据共10组,分别存储在data0.txt-data9.txt中,每个数据中有10000行(实部a与虚部b交替排列,总计各5000行),平均功率排序通过常用的冒泡排序(Bubble Sort)进行。
- 示例代码(C)如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
char str1[5000] = {0};
char str2[5000] = {0};
double value1;
double value2;
double ap[5000] = {0};
double av[10] = {0};
double sum;
double temp;
int main()
{
char filename[256] = {0};
for(int i=0; i<10; i++)
{
sprintf(filename, "%s%d.txt", "data", i); //连续开文件
FILE *fp = fopen(filename, "rt");
for(int j=0; j<5000; j++) //每两行读取文件数据(一实一虚)
{
fgets(str1,5000,fp);
fgets(str2,5000,fp);
value1 = atof(str1);
value2 = atof(str2);
ap[j] = sqrt(pow(value1,2) + pow(value2,2)); //功率计算
sum = sum + ap[j]; //累加
}
av[i] = sum/5000; //取均值
sum = 0;
fclose(fp);
}
for(int i=0;i<10-1;i++) //冒泡排序
{
for(int j=0;j<10-1-i;j++)
{
if(av[j]>av[j+1])
{
temp=av[j];
av[j]=av[j+1];
av[j+1]=temp;
}
}
}
for(int m=0;m<10;m++) //输出结果
{
printf("%lf\n",av[m]);
}
return 0;
}
滑动相关检测
相关检测技术是信号检测领域里一种重要工具,常用于从噪声背景中检测出有用的确定性信号。它利用确定性信号在不同时刻的取值一般都具有较强相关性,而干扰噪声因为随机性较强,不同时刻取值相关性较差的特性,把确定性信号和干扰噪声区分开来。
假设确定信号序列为x[m],具有噪声背景的实际信号序列为y[n],m<n,通过滑动相关计算,找出滑动相关计算序列z[k]的最大的值,则可以求出具有噪声背景的实际信号序列y中所包含的确定信号序列x的位置。
滑动相关计算公式为:
- 假设:
确定信号序列存储于sequence0.txt,共1000行(实部a与虚部b交替排列,总计各500行)。
待测信号序列存储于sequence1.txt,共10000行(实部a与虚部b交替排列,总计各5000行)。
寻求最大相关时采用循环对比的方法。
- 示例代码(C)如下:
#include <stdio.h>
#include <stdlib.h>
char x1[1000]={0};
char x2[1000]={0};
char y1[5000]={0};
char y2[5000]={0};
double xx1;
double xx2;
double yy1;
double yy2;
double value1;
double value2;
double x11[1000]={0};
double x22[1000]={0};
double y11[5000]={0};
double y22[5000]={0};
double z[4000]={0}; //5000-1000=4000
int main()
{
FILE *fp1 = fopen("sequence0.txt", "rt"); //第一个文件指针(确定信号序列)
for(int a=0; a<1000; a++)
{
fgets(x1,1000,fp1);
fgets(x2,1000,fp1);
xx1 = atof(x1);
xx2 = atof(x2);
x11[a] = xx1;
x22[a] = xx2;
}
fclose(fp1);
FILE *fp2 = fopen("sequence1.txt", "rt"); //第二个文件指针(待测信号序列)
for(int y=0; y<5000; y++)
{
fgets(y1,5000,fp2);
fgets(y2,5000,fp2);
yy1 = atof(y1);
yy2 = atof(y2);
y11[y] = yy1;
y22[y] = yy2;
}
fclose(fp2);
for(int k=0;k<=5000-1000;k++) //滑动相关计算
{
value1 =0;
value2 =0;
for(int i=0;i<1000;i++)
{
value1 += x11[i]*y11[i+k]-x22[i]*y22[i+k];
value2 += x11[i]*y22[i+k]+x22[i]*y11[i+k];
}
z[k] = sqrt(pow(value1,2) + pow(value2,2));
}
double max=z[0];
int index=0;
for(int k=0;k<=5000-1000;k++) //寻求最大值及其下标
{
if(max<z[k])
{
max=z[k];
index=k;
}
}
printf("%lf\n",max); //输出结果
printf("%d\n",index);
return 0;
}
注:
以上对内存的分配方式采用的是对数组的固定定义,可以考虑采用malloc分配空间,算法的灵活度将会更高。