移动通信中的信号功率排序及滑动相关检测

问题背景

移动通信(Mobilecommunication)是移动体之间的通信,或移动体与固定体之间的通信。

那么在所有业务流程开始前,手机(终端)是如何选择网络的?

这个问题可以分为 信号功率排序 滑动相关检测 两个部分来分析。

信号功率排序

  • 首先注意,数字信号处理的往往是复数信号。

a + bi

存储时,不存储i

只存储a、b,也称为IQ

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

  • 信号强度计算实例

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

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

扫描二维码关注公众号,回复: 14673258 查看本文章

而正常通信中,不可能把所有信号接收完成之后再计算信号强度,也不可能随便取一段数据计算而是在一定时间范围内的平均强度。此外这还涉及到对平均强度进行排序的问题。

  • 假设:

待测数据共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分配空间,算法的灵活度将会更高。​​​​​​​

猜你喜欢

转载自blog.csdn.net/weixin_45766278/article/details/125189945