Okumura-Hata模型的计算机编程(C语言)

来源:互联网 发布:java linux创建文件夹 编辑:程序博客网 时间:2024/06/06 21:59

本学期移动通信课程中有关于Okumura-Hata模型的,所以自己动手写了一个!

以下编写的程序由于时间紧迫,可能会有一些错误或不足,恳请大家指正:

基本原理:

Okumura/Hata模型是以准平滑地形的市区作基准,其余各区的影响均以校正因子的形式出现。Okumura/Hata模型市区的基本传输损耗模式为:
Lbα(hm) + (44. 9 - 6. 55lghb)lgd                (5)
Lb:市区准平滑地形电波传播损耗中值(dB)
f:工作频率(MHz)
hb基站天线有效高度(m)
hm移动台天线有效高度(m)
d :移动台与基站之间的距离(km)
α(hm)移动台天线高度因子
对于大城市,移动台天线高度因子为
                     (6)
当hm在1 5-4m之间,上面两式基本一致。
对于中小城市(除大城市以外的其它所有城市〉 
α(hm) = (1 1 19f - 0. 7)hm一(1 56 19f - 0. 8)                                  (7)
对于郊区
Lbs市区)-2[g(f/28)]2—5.4   dB                                                 (8)
对于开阔地
Lb市区)-4. 78(gf)2+18. 33Igf-40. 94   dB                                (9)= Lb (
原代码:
Code:
  1. #include <stdio.h>   
  2. #include <math.h>   
  3. #define SIZE 300   
  4. #define TRUE 1   
  5. /*--------------------OH_PRA用于存放7个影响Lb的参数以及Lb---------------------*/  
  6. typedef struct  
  7. {   
  8.     int area;                                             //地区(市区-0.郊区-1.  
  9.                                                           //开阔区-2)   
  10.     int city;                                             //城市(中.小城市-0,  
  11.                                                           //大城市-1)   
  12.     double d;                                             //收发天线之间的距离,  
  13.                                                           //km   
  14.     double f;                                             //工作频率,MHz   
  15.     double Hb;                                            //基站天线有效高度,m   
  16.     double Hm;                                            //移动台天线高度,m   
  17.     double AHm;                                           //移动台天线高度校  
  18.                                                           //正因子,dB  
  19.     double Lb;                                            //基本传输损耗,dB  
  20. }OH_PRA;   
  21. /*-------------------------------全局变量-------------------------------------*/  
  22.   
  23. OH_PRA data[SIZE];//数据组最大容量300组   
  24. int Number=0;   
  25.   
  26. /*-------------------------------函数列表-------------------------------------*/  
  27.   
  28. void InitOH();                                            //初始化界面   
  29. void RET();                                               //返回主程序   
  30. int read();                                               //从OH读入数据到data  
  31.                                                           //数组   
  32. void write();                                             //测试值写入文件OH   
  33. void ADD();                                               //添加测试值   
  34. double Aa(int city,double f,double Hm);                   //计算移动台天线高度  
  35.                                                           //校正因子   
  36. double L(int area,double f,double d,double Hb,double AHm);//计算Lb基本传输损耗  
  37.                                                           //函数   
  38. void LIST();                                              //查看测试值   
  39.   
  40. /*-------------------------------主程序---------------------------------------*/  
  41. int main()   
  42. {   
  43.     FILE *fp;   
  44.     int i=0;   
  45.     int choose=0;   
  46.     char yesorno;   
  47.     if( (fp=fopen("OH","rb"))!= 0)    
  48.     {   
  49.         Number=read();//从文件读入数据,并返回读入数据的个数给Number,  
  50.                       //若文件原来有两组数据,则Number为3   
  51.     }   
  52.     else  
  53.     {   
  54.         printf("/n=========>提示:文件不存在,是否要创建一个?(y/n)/n");   
  55.         scanf("%c",&yesorno);   
  56.         if( yesorno=='y' )   
  57.         {   
  58.             fp=fopen("OH","wb");   
  59.             fclose(fp);   
  60.         }   
  61.         else  
  62.         {   
  63.             exit(0);   
  64.         }   
  65.     }//创建新文件    
  66.     system("cls");   
  67.     while(TRUE)//始终显示主界面   
  68.     {   
  69.         InitOH();   
  70.         scanf("%d",&choose);   
  71.         system("cls");   
  72.         switch(choose)   
  73.         {   
  74.             case 1:ADD();RET();break;   
  75.             case 2:LIST();RET();break;   
  76.             case 0:return;   
  77.             default:break;   
  78.         }   
  79.         fflush(stdin);   
  80.         getchar();   
  81.         system("cls");   
  82.     }   
  83.     return 0;   
  84. }   
  85. void InitOH()   
  86. {   
  87.     printf("/t*************************************************************/n");   
  88.     printf("/t* */n");   
  89.     printf("/t* Okumura-Hata预测系统 */n");   
  90.     printf("/t* */n");   
  91.     printf("/t* [1] 增加预测值          [2] 查看预测值      */n");   
  92.     printf("/t*                         [0] 退出系统          */n");   
  93.     printf("/t*************************************************************/n");   
  94. }   
  95. void RET()   
  96. {   
  97.     printf("/t===>按Enter键返回主菜单/n");   
  98. }   
  99. int read()   
  100. {   
  101.     FILE *fp=NULL;   
  102.     int i=0;   
  103.     fp=fopen("OH","rb");   
  104.     while(fread(&data[i],sizeof(OH_PRA),1,fp))//if an error occurs or if the   
  105.                                               //end of the file is encountered   
  106.                                               //before reaching count.  
  107.     i++;   
  108.     fclose(fp);   
  109.     return i;   
  110. }   
  111. void write()   
  112. {   
  113.     FILE *fp;   
  114.     fp=fopen("OH","ab+");   
  115.     fwrite(&data[Number],sizeof(OH_PRA),1,fp);   
  116.     fclose(fp);   
  117. }   
  118. void ADD()   
  119. {   
  120.     printf("ADD a new dataum:/n");   
  121.     printf(">>input area(0,1,2):/n");   
  122.     scanf("%d",&data[Number].area);   
  123.     printf(">>input city(0,1):/n");   
  124.     scanf("%d",&data[Number].city);   
  125.     printf(">>input d(km):/n");   
  126.     scanf("%lf",&data[Number].d);   
  127.     printf(">>input f(MHz):/n");   
  128.     scanf("%lf",&data[Number].f);   
  129.     printf(">>input Hb(m):/n");   
  130.     scanf("%lf",&data[Number].Hb);   
  131.     printf(">>input Hm(m):/n");   
  132.     scanf("%lf",&data[Number].Hm);   
  133.     data[Number].AHm=Aa(data[Number].city,data[Number].f,data[Number].Hm);   
  134.     data[Number].Lb=L(data[Number].area,data[Number].f,data[Number].d,   
  135.                        data[Number].Hb,data[Number].AHm);   
  136.     printf("the contents that you wanted to add is:/n");   
  137.     printf("area city/td/tf/tHb/tHm/tAHM/tLb/n");   
  138.     printf("%4d%5d/t%.2lf/t%.2lf/t%.2lf/t%.2lf/t%.2lf/t%.2lf/n",   
  139.         data[Number].area,data[Number].city,data[Number].d,data[Number].f,   
  140.         data[Number].Hb,data[Number].Hm,data[Number].AHm,data[Number].Lb);   
  141.     write();   
  142.     Number++;   
  143. }   
  144. double Aa(int city,double f,double Hm)   
  145. {   
  146.     double AHm=0;   
  147.     switch(city)   
  148.     {   
  149.         case 0:AHm=(1.1*log10(f)-0.7)*Hm-1.56*log10(f)+0.8;break;   
  150.         case 1:   
  151.         if(f<=300)   
  152.         {   
  153.             AHm=8.29*((log10(1.54*Hm))*(log10(1.54*Hm)))-1.1;   
  154.         }   
  155.         else  
  156.         {   
  157.             AHm=3.2*((log10(11.75*Hm))*(log10(11.75*Hm)))-4.97;   
  158.         }   
  159.         break;   
  160.         default:break;   
  161.     }   
  162.     return AHm;   
  163. }   
  164. double L(int area,double f,double d,double Hb,double AHm)   
  165. {   
  166.     double Lb=0,Lb0=0;   
  167.     Lb0=69.55+29.16*log10(f)-13.82*log10(Hb)-AHm+(44.9-6.55*log10(Hb))*log10(d);   
  168.     switch(area)   
  169.     {   
  170.         case 0:Lb=Lb0;break;   
  171.         case 1:Lb=Lb0-2*((log10(f/28))*(log10(f/28)))-5.4;break;   
  172.         case 2:Lb=Lb0-4.78*(log10(f)*log10(f))+18.33*log10(f)-40.98;break;   
  173.         default:break;   
  174.     }   
  175.     return  Lb;   
  176. }   
  177. void LIST()   
  178. {   
  179.     int i=0;   
  180.     printf("area city/td/tf/tHb/tHm/tAHM/tLb/n");   
  181.     for(i=0;i<Number;i++)   
  182.     {   
  183.         printf("%4d%5d/t%.2lf/t%.2lf/t%.2lf/t%.2lf/t%.2lf/t%.2lf/n",   
  184.         data[i].area,data[i].city,data[i].d,data[i].f,   
  185.         data[i].Hb,data[i].Hm,data[i].AHm,data[i].Lb);   
  186.     }   
  187. }   
  188.