首页/文章/ 详情

用Python实现喇叭天线设计小工具(二)

1年前浏览1809
摘要:本文主要介绍软件安装、参考论文,以及第一个模块——参数计算模块。

准备工作

在开始之前,请确保装了以下软件或资源(括号中是我个人推荐版本或配置,若安装有困难,请自行搜索相关教程):


  • Python3.x,必装推荐直接安装Anaconda,融合了常用Python模块的开源软件,可免去自行下载各种包的麻烦

Home - Anaconda    www.anaconda.com


  • HFSS,必装我使用的是ANSYS Electronics Desktop19.0,如果使用其他版本的话,代码可能会有出入,但问题不大,稍作修改即可

Electromagnetic Simulation Products | ANSYS    www.ansys.com


  • IDE,可选IDE即编程环境,我用的是Pycharm,个人比较喜欢,免费社区版即可

https://www.jetbrains.com/pycharm/    www.jetbrains.com



  • Python包,必装除了打包用的cx-Freeze,没什么特殊的包,基本都是Python自带,如果后续运行报错提示缺xxx module的话,在windows命令行中输入pip install xxx,xxx为缺的包,即可


理论部分


本文理论部分比较简单直观,只需要简单提一下。首先,参考论文链接如下:

https://pan.baidu.com/s/1iggiF1ijjnuG3pBdDFrp8Q    pan.baidu.com



文章发表于2002年IEEE Antenna's and Propagation Magazine,收录于Antenna Designer's Notebooks栏目(顺便提一句,该栏目我一直很喜欢,经常介绍一些偏实际工程使用的文章,内容也很靠谱)。文章主要介绍了给定E面和H面的波束宽度,如何设计角锥喇叭,使得在满足该波束宽度要求的前提下,最大化天线的方向性系数(或增益)。


文中并没有罗列大量理论公式,因为这部分早已研究透彻,而是选用了一种为广大工程师喜闻乐见的方法:参数拟合,并给出了详尽的参数列表,从而得到了快速、方便的查表式设计公式,并给出了一些实际算例来证明理论的可靠性。


理论部分大体就是这样,当然,有兴趣的同志可以认真看一下论文和参考文献,大部分理论公式均可于Balanis那本“天线圣经”中找到更为详细的推导(参见原书第13.2章节),此处不再赘述。


编写参数计算模块

从最简单的模块入手,首先编写参数计算模块,该模块要实现参考文献的内容,即给出设计参数,返回喇叭天线的尺寸,从程序角度来看,其输入和输出如下:


输入:设计频点f0,E面波束宽度HPE,H面波束宽度HPE,波导宽边a,波导窄边b。

输出:喇叭宽边A,喇叭窄边B,喇叭长L。


显然,对于这种输入输出很单一的功能,写一个函数来实现是最为合适的,也方便后续为其他模块所调用。


代码如下:

import math

#constant
t0, s0, a0, a1, a2 = 0.375, 0.25, 0.2974, 7.0401, -37.5383
c00,c01,c10, c11, c12, c13, c14, c15 = 44.8365, 4.3374, -8.1501, -2.9183, 8.4217, -13.2623, 10.6702, -3.4713
ah, bh, ch, dh, eh, fh, gh, hh, ih = 0.3534, -5.9711, -1.5379, 13.4735, 2.4359, -13.3102, -1.6386, 4.7981, 0.6333
ae, be, ce, de, ee, fe, ge, he = 0.1962, -11.3448, -1.9135, 4.78, 5.7284, -47.9711, -4.8935, -6.4175
d0, d1, d2, d3, d4, d5, d6, d7, d8 = \
   0.1020, 2.9658e-2, -2.4894e-3, -2.0962e-2, 6.3028e-4, -5.9327e-6, -0.6802, -4.4039e-2, 1.0213e-3
f00, f01, f10, f11, f12, f13, f14, f15 = 44.3672, -4.098, -8.0775, -4.2683, 14.5647, -26.1244, 23.9791, -8.7301


def calc(freq, HPE, HPH, a, b):
   lam = 300 / freq
   k = HPH / HPE

   if k < 1:
       t = t0
       c0 = c00 + c01*math.log(k)
       c1 = c10 + c11*k + c12*k**2 + c13*k**3 + c14*k**4 + c15*k**5
       D = c0 + c1 * math.log(HPH)
       s = (a0 + a1 / k**2 + a2 / D) ** (-1)

       A = 0.5 * math.sqrt(
           (ah + ch*t**2 + eh*t**4 + gh*t**6 + ih*t**8) / (1 + bh*t**2 + dh*t**4 + fh*t**6 + hh*t**8)) * \
           lam * math.cos(HPH*math.pi/720) / math.tan(HPH*math.pi/720)

       B = 0.5 * math.sqrt(
           (ae + ce*s**2 + ee*s**4 + ge*s**6) / (1 + be*s**2 + de*s**4 + fe*s**6 + he*s**8)) * \
           lam * math.cos(HPE*math.pi/720) / math.tan(HPE*math.pi/720)

       R = A * (A - a) / (8 * lam * t)

   else:
       s = s0
       f0 = f00 + f01 * math.log(k)
       f1 = f10 + f11 / k + f12 / k**2 + f13 / k**3 + f14 / k**4 + f15 / k**5
       D = f0 + f1 * math.log(HPE)
       t = (d0 + d1*k + d2*k**2 + d3*D + d4*D**2 + d5*D**3) / (1 + d6*k + d7*D + d8*D**2)

       A = 0.5 * math.sqrt(
           (ah + ch * t ** 2 + eh * t ** 4 + gh * t ** 6 + ih * t ** 8) / (
                       1 + bh * t ** 2 + dh * t ** 4 + fh * t ** 6 + hh * t ** 8)) * \
           lam * math.cos(HPH * math.pi / 360) / math.tan(HPH * math.pi / 720)

       B = 0.5 * math.sqrt(
           (ae + ce * s ** 2 + ee * s ** 4 + ge * s ** 6) / (
                       1 + be * s ** 2 + de * s ** 4 + fe * s ** 6 + he * s ** 8)) * \
           lam * math.cos(HPE * math.pi / 360) / math.tan(HPE * math.pi / 720)

       R = A * (B - b) / (8 * lam * s)

   return round(A, 2), round(B, 2), round(R, 2)


if __name__ == '__main__':
   _A, _B, _R = calc(freq=10, HPE=30, HPH=20, a=47.55, b=22.15)
   print(_A, _B, _R)


结尾部分做简单的测试,并和论文中的算例结果比较(Table7.a),以证明代码无误。


这个过程几乎是将论文的参数和公式直接“翻译”到程序里,没有太多可讲的,但针对对于Python语法不太熟悉的读者,我提炼出了以下几点帮助理解:

  • Python对每一行前面的空格有严格要求,不可为了好看随意增减,否则出错;

  • 和Matlab一样,Python对于变量无需先定义再使用,如先int a、float b等,而是直接使用即可,因而代码会比大部分语言更“自然”一些;

  • 与Matlab不同的是,Python并非专门针对科学计算和工程计算而设计,故基本运算只有四则(+-\)、平方(*)等,复杂点的数学符号,如log、sin、cos等,则依赖于其他包(module),故而在代码开头要写一句import math,并在中间调用时使用math.xxx格式,需要说明的是,如果将开头一句改为:from math import *,则可不必使用math.xxx而直接输入运算符xxx,但编程教科书说最好别这样

  • 用round(A,2)输出小数点后两位格式。

  • 代码最后的if __name__ == '__main__': 部分比较有Python特色,其作用可简单理解为供测试使用。因本部分代码是为了被其他模块调用,这句话的意思就是说被调用时不执行后面内容,因此冒号后面可以方便、随意地写调试代码,而不用担心影响调用它的程序;

  • 与Matlab相比不便的地方是,Python并不会保存并显示中间变量,调试起来诸多不便,办法一是用print语句将变量“打印”出来;方法二是在IDE中设置断点,如下图所示(以pycharm举例):

小结

到此为止,核心功能其实已经完成,但为了把工作做得更漂亮,还需要做很多工作。本篇介绍即到此结束,下一部分将会讲到波导查值模块和主调用模块,谢谢各位观看(*^_^*)!


转载自:知乎@况泽灵,发布于 2018-11-20

来源:老猫电磁馆
Electronics DesktopHFSS理论ANSYS
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-07-30
最近编辑:1年前
老猫电磁馆——学无止境也
理无专在,而学无止境也,然则问...
获赞 49粉丝 202文章 237课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈