实验任务1

移动通信中的算法----功率计算&滑动相关计算

1、 系统设计要求

实验任务一:通过功率计算公式,计算各个实际信号的功率大小(即每个data文件存储的信号的功率大小),并按从大到小排序,输出前6个data文件的编号;
实验任务二:用滑动相关计算方法,求出能够检测到的小区,及小区类型;(即分别将三个确定信号与第一次实验任务求出的排序前6的6个实际信号依次做滑动相关计算,找出最相关两个信号,即哪个data信号与哪个PSS信号最相关
(输出: dataX与PSSY最相关,其中X、Y代表具体的编号)

2、 设计思路与方案

1) 设计思路
1. 读取文件- 将12个data信号数据文件读取并且存储在12个信号对象中,以及将3个pss信号读取同样存储在另外3个信号对象中。

2. 计算并筛选- 分别计算12个信号对象的总功率和并且通过辅助类实例的排序方法找出6个功率最大的信号,并且返回下标值。

3. 滑动相关计算- 通过返回的下标值将这6个信号对象与3个pss信号进行滑动相关计算,同时创建18个z信号对象用来存储。

4. 计算相关系数- 通过同样的方法计算18个z信号对象的总功率,再通过算法找到每个信号中的最大P值,通过总功率与最大P值计算出平均功率,再用最大P值与平均功率作比值得到相关系数。

5. 筛选最大的相关系数- 找出最大的相关系数,并且返回该组的具体的data信号与pss信号。
2) 程序总体框图
在这里插入图片描述
3)部分模块代码及说明

  1. 读取12个信号文件模块:
//读取12个数据文件,文件名为data0-data11        
        for(i=0;i<12;i=i+1){  
            Allsignal[i]=new signal();
            num=0;
                try {  
                 String encoding = "GBK" ;
                  File file = new File( "data/data"+i+".txt" ); //文件存放路径 
               if (file.isFile() && file.exists()) {  
               InputStreamReader read = new InputStreamReader(  
                      new FileInputStream(file), encoding);  
               BufferedReader bufferedReader = new BufferedReader(read);  
               String lineTXT = null ;  
 //先判断整行数据,以文本形式读入,再根据数据奇数偶数位置分别赋给实部与虚部数组
               while ((lineTXT = bufferedReader.readLine()) != null ) {  
                   Allsignal[i].data[num]=Double.parseDouble(lineTXT.toString().trim());
                   if(num%2==0){
                    Allsignal[i].data_re[num/2]=Double.parseDouble(lineTXT.toString().trim());
                   }
                   else{
                    Allsignal[i].data_im[num/2]=Double.parseDouble(lineTXT.toString().trim());
                   }
                   num=num+1;
            }  
               read.close();
               Allsignal[i].size=num;  
        } else {  
               System.out.println( "can`t find the file" );  
          }  
        } catch (Exception e) {  
           System.out.println( "read with wrong" );  
           e.printStackTrace();  
       } 
    }

2.读取3个关联信号文件模块

//思路与读取12个信号文件一致
    for(i=0;i<3;i=i+1){
        Allpss[i]=new signal();
        num=0;
            try {  
             String encoding = "GBK" ;
              File file = new File( "data/pss"+i+".txt" );  
           if (file.isFile() && file.exists()) {  
           InputStreamReader read = new InputStreamReader(  
                  new FileInputStream(file), encoding);  
           BufferedReader bufferedReader = new BufferedReader(read);  
           String lineTXT = null ;  
           while ((lineTXT = bufferedReader.readLine()) != null ) {  
               Allpss[i].data[num]=Double.parseDouble(lineTXT.toString().trim());
               if(num%2==0){
                Allpss[i].data_re[num/2]=Double.parseDouble(lineTXT.toString().trim());
               }
               else{
                Allpss[i].data_im[num/2]=Double.parseDouble(lineTXT.toString().trim());
               }
               num=num+1;
        }  
           read.close();
           Allpss[i].size=num;  
    } else {  
           System.out.println( "can`t find the file" );  
      }  
    } catch (Exception e) {  
       System.out.println( "read with wrong" );  
       e.printStackTrace();  
   } 
}
  1. 滑动相关计算模块
        public void getdata_p(signal thesixsignal,signal pss){
            int i=0,j=0;
            size=(thesixsignal.size/2-pss.size/2+1)*2;
            //System.out.println(thesixsignal.size  +"   "+pss.size+" "+size);
            for(i=0;i<size/2;i=i+1)
            {
                
                data_re[i]=0;
                data_im[i]=0;
                for(j=0;j<pss.size/2;j=j+1)
                {
                    data_re[i]=data_re[i]+(pss.data_re[j]*thesixsignal.data_re[j+i]-pss.data_im[j]*thesixsignal.data_im[j+i]);
                    data_im[i]=data_im[i]+(pss.data_re[j]*thesixsignal.data_im[j+i]+pss.data_im[j]*thesixsignal.data_re[j+i]);
                }
                data[2*i]=data_re[i];
                data[2*i+1]=data_im[i];
            }
        }
  1. 相关系数计算
        public double get_related_coefficient(){
            getP_add();
            max_p=0.0;
            for(int j=0;j<size/2;j=j+1)
            {
                if(Math.sqrt(data_re[j]*data_re[j]+data_im[j]*data_im[j])>max_p)
                {
                    max_p=Math.sqrt(data_re[j]*data_re[j]+data_im[j]*data_im[j]);
                }
            }
            ave_p=(P_add-max_p)/(size/2-1);
            return (max_p/ave_p);

        }
  1. 输出相关系数与相关文件名:
    for(int j=0;j<18;j=j+1)
    {
        Allz[j]=new Zsignal();
        Allz[j].getdata_p(Allsignal[help.Remember_order[j%6]],Allpss[j/6]);
        System.out.println(Allz[j].get_related_coefficient()+"     The data is data"+help.Remember_order[j%6]+"     The pss is pss"+j/6);
        if(Allz[j].get_related_coefficient()>Allz[max_group].get_related_coefficient()){
            max_group=j;
        }
        if(j==17)
        {
            System.out.println("The max group is data"+help.Remember_order[max_group%6]+" and pss"+max_group/6);
        }
    }
3.运行结果展示

在这里插入图片描述

在这里插入图片描述

4.完整代码
import java.io.BufferedReader;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.InputStreamReader;
import java.util.ArrayList;  

 class abcd{  
    public static void main(String[] args) {  
        int num=0,i=0;
        helper help=new helper();
        signal[] Allsignal=new signal[12];
        signal[] Allpss=new signal[3];
        Zsignal[] Allz=new Zsignal[18];
        int max_group=0;

                                                   //read data0-data11
        for(i=0;i<12;i=i+1){
            Allsignal[i]=new signal();
            num=0;
                try {  
                 String encoding = "GBK" ;
                  File file = new File( "data/data"+i+".txt" );  
               if (file.isFile() && file.exists()) {  
               InputStreamReader read = new InputStreamReader(  
                      new FileInputStream(file), encoding);  
               BufferedReader bufferedReader = new BufferedReader(read);  
               String lineTXT = null ;  
               while ((lineTXT = bufferedReader.readLine()) != null ) {  
                   Allsignal[i].data[num]=Double.parseDouble(lineTXT.toString().trim());
                   if(num%2==0){
                    Allsignal[i].data_re[num/2]=Double.parseDouble(lineTXT.toString().trim());
                   }
                   else{
                    Allsignal[i].data_im[num/2]=Double.parseDouble(lineTXT.toString().trim());
                   }
                   num=num+1;
            }  
               read.close();
               Allsignal[i].size=num;  
        } else {  
               System.out.println( "can`t find the file" );  
          }  
        } catch (Exception e) {  
           System.out.println( "read with wrong" );  
           e.printStackTrace();  
       } 
    }

                                                        //read pss0-pss2
    for(i=0;i<3;i=i+1){
        Allpss[i]=new signal();
        num=0;
            try {  
             String encoding = "GBK" ;
              File file = new File( "data/pss"+i+".txt" );  
           if (file.isFile() && file.exists()) {  
           InputStreamReader read = new InputStreamReader(  
                  new FileInputStream(file), encoding);  
           BufferedReader bufferedReader = new BufferedReader(read);  
           String lineTXT = null ;  
           while ((lineTXT = bufferedReader.readLine()) != null ) {  
               Allpss[i].data[num]=Double.parseDouble(lineTXT.toString().trim());
               if(num%2==0){
                Allpss[i].data_re[num/2]=Double.parseDouble(lineTXT.toString().trim());
               }
               else{
                Allpss[i].data_im[num/2]=Double.parseDouble(lineTXT.toString().trim());
               }
               num=num+1;
        }  
           read.close();
           Allpss[i].size=num;  
    } else {  
           System.out.println( "can`t find the file" );  
      }  
    } catch (Exception e) {  
       System.out.println( "read with wrong" );  
       e.printStackTrace();  
   } 
}


    //calculate the 12`s signal and printf
    System.out.println("Before ordering:  ");
    for(int k=0;k<12;k=k+1)
    {
        
        Allsignal[k].getP_add();
        System.out.printf("%9.6f",Allsignal[k].P_add);
        System.out.println("  ");
        
    }
    
    System.out.println("After ordering:");
    help.getorder(Allsignal);
      for(int k=0;k<12;k=k+1){
         System.out.printf("%9.6f",Allsignal[help.Remember_order[k]].P_add);
         System.out.println("    The "+(k+1)+" is data"+help.Remember_order[k]);
    }

        //get the 18`s signal
    for(int j=0;j<18;j=j+1)
    {
        Allz[j]=new Zsignal();
        Allz[j].getdata_p(Allsignal[help.Remember_order[j%6]],Allpss[j/6]);
        System.out.println(Allz[j].get_related_coefficient()+"     The data is data"+help.Remember_order[j%6]+"     The pss is pss"+j/6);
        if(Allz[j].get_related_coefficient()>Allz[max_group].get_related_coefficient()){
            max_group=j;
        }
        if(j==17)
        {
            System.out.println("The max group is data"+help.Remember_order[max_group%6]+" and pss"+max_group/6);
        }
    }

}  
} 

class signal{
    int size;
    double P_add;
    double[] data=new double[50000];
    double[] data_re=new double[50000];
    double[] data_im=new double[50000];

    public void getsize(int num){
        size=num;
    }
    public void getP_add(){
        double p=0;
        for(int j=0;j<size/2;j=j+1)
        {
            p=p+Math.sqrt(data_re[j]*data_re[j]+data_im[j]*data_im[j]);
        }
        P_add=p;

    }

}
class Zsignal extends signal{
        double[] data_p=new double[50000];
        double max_p;
        double ave_p;

        public void getdata_p(signal thesixsignal,signal pss){
            int i=0,j=0;
            size=(thesixsignal.size/2-pss.size/2+1)*2;

            for(i=0;i<size/2;i=i+1)
            {
                
                data_re[i]=0;
                data_im[i]=0;
                for(j=0;j<pss.size/2;j=j+1)
                {
                    data_re[i]=data_re[i]+(pss.data_re[j]*thesixsignal.data_re[j+i]-pss.data_im[j]*thesixsignal.data_im[j+i]);
                    data_im[i]=data_im[i]+(pss.data_re[j]*thesixsignal.data_im[j+i]+pss.data_im[j]*thesixsignal.data_re[j+i]);
                }
                data[2*i]=data_re[i];
                data[2*i+1]=data_im[i];
            }
        }
        public double get_related_coefficient(){
            getP_add();
            max_p=0.0;
            for(int j=0;j<size/2;j=j+1)
            {
                if(Math.sqrt(data_re[j]*data_re[j]+data_im[j]*data_im[j])>max_p)
                {
                    max_p=Math.sqrt(data_re[j]*data_re[j]+data_im[j]*data_im[j]);
                }
            }
            ave_p=(P_add-max_p)/(size/2-1);
            return (max_p/ave_p);

        }

}
class helper{
    int[] Remember_order=new int[12];
    public void getorder(signal[] Allsignal){
        int order=11;
        int n=0,m=0;
        int i=0,j=0;
        for(n=0;n<12;n=n+1)
        {
            order=11;
            for(m=0;m<12;m=m+1)
            {
                if(Allsignal[n].P_add>Allsignal[m].P_add)
                {
                    order=order-1;
                }
            }
            Remember_order[order]=n;
        }
    }
}
Logo

获得宣传、场地、资金和创业导师资源

更多推荐