实验任务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)部分模块代码及说明
- 读取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();
}
}
- 滑动相关计算模块
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];
}
}
- 相关系数计算
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);
}
- 输出相关系数与相关文件名:
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;
}
}
}