(Antenna Radiation Pattern)。
1. 什么是天线方向图?
它是用来描述天线在空间各个方向上发射或接收电磁波能力的图形。简单来说,它告诉我们这个雷达/天线主要往哪个方向“看”,以及它的“视力”范围形状是怎样的。
2. 核心组成部分
专业的雷达天线图通常包含以下几个关键部分(形似花瓣):
-
主瓣 (Main Lobe):能量最集中的区域,也是雷达主要探测或通信的方向。主瓣越窄,方向性越好,探测越精准。
-
旁瓣/副瓣 (Side Lobes):主瓣旁边的小波瓣。这是不需要的能量泄漏,旁瓣过大容易造成干扰或被敌方侦测,通常设计时要尽量压低。
-
后瓣 (Back Lobe):指向天线后方的辐射瓣,通常也是希望消除的。
-
零点 (Nulls):辐射极弱甚至为零的方向,用于隔离干扰信号。

代码部分
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import os
def configure_chinese_font():
"""
配置Matplotlib的中文字体,尝试适配不同操作系统。
"""
# 常见的中文字体列表 (Windows, Linux, macOS)
font_candidates = [
'SimHei', # Windows 黑体
'Microsoft YaHei', # Windows 微软雅黑
'Heiti TC', # macOS 黑体
'WenQuanYi Micro Hei', # Linux 文泉驿
'SimSun', # 宋体
'Arial Unicode MS' # 通用后备
]
# 找到第一个系统中存在的字体
found_font = None
for font in font_candidates:
try:
# 尝试通过名字获取字体路径来验证字体是否存在
matplotlib.font_manager.findfont(font, fallback_to_default=False)
found_font = font
break
except:
continue
if found_font:
print(f"检测到可用中文字体: {found_font}")
plt.rcParams['font.sans-serif'] = [found_font]
plt.rcParams['axes.unicode_minus'] = False # 解决负号'-'显示为方块的问题
else:
print("未检测到常用中文字体,将使用默认字体(中文可能无法显示)。")
# 这种情况下通常建议手动安装 SimHei.ttf
def generate_antenna_pattern():
# 1. 设置数据
# theta: 角度范围,从 -pi 到 pi
theta = np.linspace(-np.pi, np.pi, 1000)
# 模拟一个 8 阵元的均匀线性阵列 (ULA)
N = 8 # 阵元数量
d_lambda = 0.5 # 阵元间距(波长的一半)
# 相位差 psi
psi = 2 * np.pi * d_lambda * np.sin(theta)
# 阵列因子 (Array Factor) 公式,并进行归一化
# 使用 np.errstate 忽略除以 0 的警告
with np.errstate(divide='ignore', invalid='ignore'):
gain = np.abs(np.sin(N * psi / 2) / (N * np.sin(psi / 2)))
# 修正 NaN 值
gain = np.nan_to_num(gain, nan=1.0)
# 2. 创建极坐标图
# 稍微增加一点画布高度
plt.figure(figsize=(10, 9), dpi=150)
ax = plt.subplot(111, projection='polar')
# 3. 绘制图形
ax.plot(theta, gain, color='red', linewidth=2, label='辐射强度 (归一化)')
# 4. 美化图表
ax.set_theta_zero_location('N')
ax.set_theta_direction(-1)
ax.fill(theta, gain, color='red', alpha=0.1)
# 移除极径轴的刻度标签(0.2, 0.4等),让图更清爽
ax.set_yticklabels([])
# 5. 添加标注 (Annotation)
# 标注主瓣 (Main Lobe) - 调整了 xytext,稍微往下移了一点 (1.3 -> 1.2)
ax.annotate('主瓣 (Main Lobe)\n能量最集中,用于探测',
xy=(0, 1.0),
xytext=(0, 1.2), # 位置下调,防止超出边界
arrowprops=dict(facecolor='black', shrink=0.05),
horizontalalignment='center',
fontsize=12,
color='blue')
# 标注旁瓣 (Side Lobe)
side_lobe_angle = np.arcsin(1.5 / (N * d_lambda))
ax.annotate('旁瓣 (Side Lobe)\n能量泄漏,易受干扰',
xy=(side_lobe_angle, 0.25),
xytext=(side_lobe_angle + 0.3, 0.6),
arrowprops=dict(facecolor='green', shrink=0.05),
fontsize=10,
color='green')
# 标注零点 (Null)
null_angle = np.arcsin(1.0 / (N * d_lambda))
ax.annotate('零点 (Null)\n无辐射区域',
xy=(null_angle, 0.0),
xytext=(null_angle + 0.2, 0.3),
arrowprops=dict(facecolor='gray', arrowstyle='->'),
fontsize=10,
color='gray')
# 设置标题,稍微减小 padding
plt.title(f'雷达天线辐射方向图 (Antenna Pattern)\nN={N} 阵元均匀阵列模拟', va='bottom', fontsize=14, pad=15)
# 6. 保存到本地
save_path = 'radar_antenna_pattern.png'
# 关键:使用 tight_layout 自动调整布局,确保内容不被裁剪
plt.tight_layout()
# 保持 bbox_inches='tight' 作为双重保险
plt.savefig(save_path, bbox_inches='tight')
print(f"图像已成功生成并保存为: {os.path.abspath(save_path)}")
# 显示图形
plt.show()
if __name__ == "__main__":
configure_chinese_font()
generate_antenna_pattern()

94

被折叠的 条评论
为什么被折叠?



