通信人家园

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索
查看: 2304|回复: 0
打印

Okumura-Hata模型c程序 [复制链接]

军衔等级:

  上等兵

注册:2012-10-16
跳转到指定楼层
1#
发表于 2012-11-24 14:04:25 |只看该作者 |倒序浏览
#include <stdio.h>
#include <string.h>
#include <stdlib.h>   
#include <math.h>   
#define SIZE 300   
   
/*--------------------OH_PRA用于存放7个影响Lb的参数以及Lb---------------------*/   
typedef struct   
{   
    int area;                                             //地区(市区-0.郊区-1.开阔区-2)     
    int city;                                             //城市(中.小城市-0, 大城市-1)     
    double d;                                             //收发天线之间的距离, km     
    double f;                                             //工作频率,MHz     
    double Hb;                                            //基站天线有效高度,m     
    double Hm;                                            //移动台天线高度,m     
    double AHm;                                           //移动台天线高度校正因子,dB   
    double Lb;                                            //基本传输损耗,dB   
}OH_PRA;   
/*-------------------------------全局变量-------------------------------------*/   
   
OH_PRA data[SIZE];//数据组最大容量300组     
int Number=0;   
   
/*-------------------------------函数列表-------------------------------------*/   
   
void InitOH();                                            //初始化界面     
void RET();                                               //返回主程序     
int read();                                               //从OH读入数据到data数组     
void write();                                             //测试值写入文件OH     
void ADD();                                               //添加测试值     
double Aa(int city,double f,double Hm);                   //计算移动台天线高度校正因子     
double L(int area,double f,double d,double Hb,double AHm);//计算Lb基本传输损耗 函数     
void LIST();                                              //查看测试值     
   
/*-------------------------------主程序---------------------------------------*/   
void main()   
{   
    FILE *fp;   
    int i=0;   
    int choose=0;   
    char yesorno;   
    if( (fp=fopen("OH","rb"))!= 0)     
    {   
        Number=read();//从文件读入数据,并返回读入数据的个数给Number,   
                      //若文件原来有两组数据,则Number为3     
    }   
    else   
    {   
        printf("\n=========>提示:文件不存在,是否要创建一个?(y/n)\n");   
        scanf("%c",&yesorno);   
        if( yesorno=='y' )   
        {   
            fp=fopen("OH","wb");   
            fclose(fp);   
       }   
       else   
        {   
            exit(0);   
        }   
    }//创建新文件     
    system("CLS"); //清除屏幕   
    while(1)//始终显示主界面     
    {   
        InitOH();   
        scanf("%d",&choose);   
        system("CLS");   
        switch(choose)   
        {   
            case 1:ADD();RET();break;   
            case 2IST();RET();break;   
            case 0:return;   
            default:break;   
        }   
        fflush(stdin);   
        getchar();   
        system("CLS");   

    }   
//    return 0;   
}  
  
void InitOH()   
{   
    printf("\t*************************************************************\n");   
    printf("\t* *\n");   
    printf("\t* Okumura-Hata预测系统 *\n");   
    printf("\t* *\n");   
    printf("\t* [1] 增加预测值          [2] 查看预测值      *\n");   
    printf("\t*                         [0] 退出系统          *\n");   
    printf("\t*************************************************************\n");   
}
   
void RET()   
{   
    printf("\t===>按Enter键返回主菜单\n");   
}
   
int read()   
{   
    FILE *fp=NULL;   
    int i=0;   
    fp=fopen("OH","rb");   
    while(fread(&data[i],sizeof(OH_PRA),1,fp))//if an error occurs or if the     
                                              //end of the file is encountered     
                                              //before reaching count.   
    i++;   
    fclose(fp);   
    return i;   
}  
  
void write()   
{   
    FILE *fp;   
    fp=fopen("OH","ab+");   
    fwrite(&data[Number],sizeof(OH_PRA),1,fp);   
    fclose(fp);   
}  
  
void ADD()   
{   
    printf("ADD a new dataum:\n");   
    printf(">>请输入地区类型(市区-0.郊区-1.开阔区-2):\n");   
    scanf("%d",&data[Number].area);   
    printf(">>请输入城市类型(中.小城市-0,大城市-1):\n");   
    scanf("%d",&data[Number].city);   
    printf(">>请输入收发天线之间的距离d(km):\n");   
    scanf("%lf",&data[Number].d);   
    printf(">>请输入工作频率f(MHz):\n");   
    scanf("%lf",&data[Number].f);   
    printf(">>请输入基站天线有效高度Hb(m):\n");   
    scanf("%lf",&data[Number].Hb);   
    printf(">>请输入移动台天线高度(m):\n");   
    scanf("%lf",&data[Number].Hm);   
    data[Number].AHm=Aa(data[Number].city,data[Number].f,data[Number].Hm);   
    data[Number].Lb=L(data[Number].area,data[Number].f,data[Number].d,   
                       data[Number].Hb,data[Number].AHm);   
    printf("the contents that you wanted to add is:\n");   
    printf("area city\td\tf\tHb\tHm\tAHM\tLb\n");   
    printf("%4d%5d\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n",   
        data[Number].area,data[Number].city,data[Number].d,data[Number].f,   
        data[Number].Hb,data[Number].Hm,data[Number].AHm,data[Number].Lb);   
    write();   
    Number++;   
}
   
double Aa(int city,double f,double Hm)   
{   
    double AHm=0;   
    switch(city)   
    {   
        case 0:AHm=(1.1*log10(f)-0.7)*Hm-1.56*log10(f)+0.8;break;   
        case 1:   
        if(f<=300)   
        {   
            AHm=8.29*((log10(1.54*Hm))*(log10(1.54*Hm)))-1.1;   
        }   
        else   
        {   
            AHm=3.2*((log10(11.75*Hm))*(log10(11.75*Hm)))-4.97;   
        }   
        break;   
        default:break;   
    }   
    return AHm;   
}
   
double L(int area,double f,double d,double Hb,double AHm)   
{   
    double Lb=0,Lb0=0;   
    Lb0=69.55+29.16*log10(f)-13.82*log10(Hb)-AHm+(44.9-6.55*log10(Hb))*log10(d);   
    switch(area)   
    {   
        case 0b=Lb0;break;   
        case 1b=Lb0-2*((log10(f/28))*(log10(f/28)))-5.4;break;   
        case 2b=Lb0-4.78*(log10(f)*log10(f))+18.33*log10(f)-40.98;break;   
        default:break;   
    }   
    return  Lb;   
}   
void LIST()   
{   
    int i=0;   
    printf("area city\td(km)\tf(MHz)\tHb(m)\tHm(m)\tAHM(dB)\tLb(dB)\n");   
    for(i=0;i<Number;i++)   
    {   
        printf("%4d%5d\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n",data[i].area,
      data[i].city,data[i].d,data[i].f,data[i].Hb,data[i].Hm,data[i].AHm,data[i].Lb);   
    }
}

举报本楼

您需要登录后才可以回帖 登录 | 注册 |

版规|手机版|C114 ( 沪ICP备12002291号-1 )|联系我们 |网站地图  

GMT+8, 2025-9-5 16:19 , Processed in 0.802920 second(s), 17 queries , Gzip On.

Copyright © 1999-2025 C114 All Rights Reserved

Discuz Licensed

回顶部