利用matplotlib errorbar繪製相位誤差對陣列天線方向圖的影響

簡介

在工程實際中陣列天線的各單元的饋電相位是不可能達到理想的饋電相位情況的,總存在相位誤差。接下來我將編寫python程序,隨機產生10W組饋電相位,並計算相位的均方根誤差對陣列天線副瓣電平的影響。

圖示

等相位陣列

陣元間距0.5λ,陣元數量12,原始陣列爲等幅同相饋電,每組陣列隨機產生-20到20度的相位誤差的,產生10W組樣本,並計算每組的相位均方根誤差對和陣列天線副瓣電平,並繪製誤差線,點線是該相位均方根誤差下的副瓣電平的平均值,豎線是副瓣電平的最大值和最小值。
在這裏插入圖片描述
陣列同上,每組陣列隨機產生-40到40度的相位誤差,10W組樣本。
在這裏插入圖片描述

掃描陣列

陣元間距0.5λ,陣元數量12,原始陣列爲等幅相位遞增90度饋電,產生30度掃描角,每組陣列隨機產生-20到20度的相位誤差的,產生10W組樣本,並計算每組的相位均方根誤差對和陣列天線副瓣電平,並繪製誤差線,點線是該相位均方根誤差下的副瓣電平的平均值,豎線是副瓣電平的最大值和最小值。
在這裏插入圖片描述

掃描陣列的方向圖

30度掃描陣列,相位均方根誤差20度,陣列副瓣-6dB
在這裏插入圖片描述

python代碼

import numpy as np
from Array_Pattern import Pattern
import sys
import matplotlib.pyplot as plt


# 計算均方根誤差
def get_rmse(records_real, records_predict):
    if len(records_real) == len(records_predict):
        return np.sqrt(sum([(x - y) ** 2 for x, y in zip(records_real, records_predict)]) / len(records_real))
    else:
        return None

f = 1.5  # 頻率
k = 0.5  # 間距係數
n_cell = 12  # 陣元數量
n_group = 100000  # 樣本數
low_limit = -20  # 隨機相位的下限
high_limit = 20  # 隨機相位的上限

# 單元天線的方向圖,全向方向圖
data_angle = np.arange(-180, 181) / 2
data_gain = np.ones(361)
# 陣列的位置和幅度,0.5λ間距,等幅度
myposition = np.arange(n_cell) * 300 / f * k
mypower = np.ones(n_cell)
# 產生隨機相位樣本
myphase_list = np.random.uniform(low_limit, high_limit, (n_group, n_cell))
# 產生零相位列表
phase_real  = np.zeros(n_cell)
# 記錄RMSE,角度誤差,SSLL
pattern_dict = {'RMSE': [], 'Angle_Error': [], 'SSLL': []}
# 記錄最大角度誤差和最大副瓣電平的相位
sll_phase_list = []
angle_phase_list = []
angle_error = -sys.maxsize
ssll = -sys.maxsize
# 進行方向圖綜合並記錄數據
pattern = Pattern()
for i in range (0,n_group):
    # 計算陣列方向圖
    array_pattern = pattern.pattern_main(f, n_cell, myposition, myphase_list[i], mypower, data_angle, data_gain, 1)
    myphase_temp = np.mean(myphase_list[i])
    phase_predict = myphase_list[i]-myphase_temp
    # 計算陣列方向圖的最大值和角度並記錄相位
    array_angle = pattern.Pattern_Max(array_pattern,data_angle)
    if abs(array_angle[1]) >= angle_error:
        angle_phase_list.append(myphase_list[i].tolist())
        angle_error = abs(array_angle[1])
    # 計算陣列方向圖的副瓣電平並記錄相位
    array_ssll = pattern.Pattern_SSLL(array_pattern,data_angle)
    if (array_ssll[0] >= ssll):
        sll_phase_list.append(myphase_list[i].tolist())
        ssll = array_ssll[0]
    # 計算相位的均方根誤差
    phase_rmse = int(get_rmse(phase_real, phase_predict))
    # 記錄數據
    pattern_dict['RMSE'].append(phase_rmse)
    pattern_dict['Angle_Error'].append(array_angle[1])
    pattern_dict['SSLL'].append(round(array_ssll[0],1))
# 歸類數據
rmse_min = min(pattern_dict['RMSE'])
rmse_max = max(pattern_dict['RMSE'])
rmse_list = np.arange(rmse_min, rmse_max+1)
ssll_list =[[] for i in range(rmse_max-rmse_min+1)]
for i in range(0,len(pattern_dict['RMSE'])):
    ssll_list[pattern_dict['RMSE'][i]-rmse_min].append(pattern_dict['SSLL'][i])
ssll_mean = []
ssll_min_list=[]
ssll_max_list =[]
for i in range(0,len(rmse_list)):
    ssll_mean .append(np.mean(ssll_list[i]))
    ssll_min_list.append(np.min(ssll_list[i]))
    ssll_max_list.append(np.max(ssll_list[i]))
# 繪製誤差線
x = rmse_list
y = np.array(ssll_mean)
lower_error = np.array(ssll_mean)-np.array(ssll_min_list)
upper_error = np.array(ssll_max_list)-np.array(ssll_mean)
asymmetric_error = [lower_error, upper_error]
fig = plt.figure()
plt.errorbar(x, y, yerr=asymmetric_error, fmt='-o')
plt.show()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章