社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

微波射频网 • 4 年前 • 338 次点击  
上期文章 用Python实现喇叭天线设计小工具(一)
摘要:本文主要介绍软件安装、参考论文,以及第一个模块——参数计算模块。

准备工作

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


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

Home - Anacondawww.anaconda.com


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

Electromagnetic Simulation Products | ANSYSwww.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/1iggiF1ijjnuG3pBdDFrp8Qpan.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


上期文章:用Python实现喇叭天线设计小工具(一)


最新研讨会

Wi-Fi 6/6e射频性能测试及法规一致性测试挑战(6月25日)
无线新技术研讨会:UWB及WiFi6/6E(6月30日)
相控阵天线的工作原理和校准技术(7月9日)

原创文章:

模拟和矢量信号源进阶使用技巧
IQ正交调制器基础知识和测试详解
学个Antenna:Wi-Fi双频金属中框天线
学个Antenna:手机天线之宽带匹配原理
学个Antenna:手机天线入门

学个Antenna:HFSS脚本建模入门

Wi-Fi 6射频技术全面解析及Wi-Fi 7热点技术介绍

无线技术专栏:无线通信信号传输模型

使用矢网测量PA S11、S21和饱和功率的方法

学个Antenna:Matlab天线工具箱知多少(一)

原创干货:使用矢网测量PA S12 S22和功率的方法

ETC 天线技术概览(工作方式、极化方式、实现方式、技术革新点)

附加相位噪声测试方法

4G和5G基站天线工程知识和应用场景

噪声的意义及测量方法

非50欧系统阻抗的S参数测试

交调失真的意义及矢网实例测量方法

增益压缩的意义及矢网实操测量方法

S参数的意义及矢网实例测量方法

学个Antenna:偶极子天线馈电及倒V天线

从电磁波产生到对称阵子天线

张跃平教授:无线电科学与技术中的因子4


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/115962
 
338 次点击