レメッツのアルゴリズムによるサイドローブレベルの制御
モジュールのインポートや初期設定など
import numpy as np
from scipy import optimize
from scipy.signal import find_peaks
from scipy import linalg
import matplotlib.pyplot as plt
np.set_printoptions(precision=3)
import scienceplots
#Warning : As of version 2.0.0, you need to add import scienceplots before setting the style (plt.style.use('science')).
plt.style.use(['science', 'notebook'])
#plt.rcParams['font.family'] = 'Times New Roman' # font familyの設定
plt.rcParams['font.family'] = 'serif' # font familyの設定
plt.rcParams['mathtext.fontset'] = 'cm' # math fontの設定
計算条件
線状波源の長さ,サイドローブ数,サイドローブレベルを次のように設定して,
dd = 10.0# Diameter normalized by wave-length
nn = 9
epsdb = np.array([-32.0, -32.0, -32.0, -34.0, -36.0, -38.0, -40.0, -42.0, -42.0])# [dB]
epsi = 10**(epsdb/20.0)
初期値
一様分布による放射パターンを初期値として設定し,そのピーク値を出力すると,
n_th = 1801
th = np.linspace(0.0, np.pi*0.5, n_th)
thdeg = th*180/np.pi
akd = 2.0*np.pi*dd
u = akd/2.0 * np.sin(th)
uoverpi = u/np.pi
f = np.sinc(uoverpi)
p = 20.0*np.log10(np.abs(f))
locs0, _ = find_peaks(p)
print(f"{'locs0':>5s} {'u':>10s} {'f':>10s} {'p[dB]':>10s}")
for i in locs0:
print(f"{i:5d} {u[i]:10.5f} {f[i]:10.5f} {p[i]:10.5f}")
locs0 u f p[dB]
164 4.48082 -0.21722 -13.26215
285 7.73313 0.12837 -17.83069
406 10.89930 -0.09132 -20.78829
532 14.06677 0.07091 -22.98543
665 17.22514 -0.05797 -24.73575
808 20.36129 0.04903 -26.19126
969 23.51096 -0.04248 -27.43670
1162 26.67123 0.03747 -28.52539
1432 29.80982 -0.03353 -29.49260
一様分布による放射パターンはsinc関数ゆえ,図示すると(ピーク値は緑色の丸印),
fig = plt.figure() # グラフ領域
plt.plot(u, f, label='sinc$(u)$')
plt.xlabel(r"$u$") # x軸のラベル設定
plt.ylabel("$g(u)$") # y軸のラベル設定
plt.plot(u[locs0], f[locs0], 'o', label='peaks')
plt.legend(ncol=1, loc='best', fancybox=False, frameon = True)
fig.savefig('Remez_1.pdf')
plt.show()
放射パターンをデシベル値[dB]によって図示すると,
fig = plt.figure() # グラフ領域
plt.plot(u, p, label='sinc$(u)$')
plt.plot(u[locs0], p[locs0], 'o', label='peaks')
plt.xlim(0.0, 30.0) # x軸範囲の設定
plt.ylim(-50.0, 0.0) # y軸範囲の設定
plt.xlabel(r"$u$") # x軸のラベル設定
plt.ylabel("$g(u)$ [dB]") # y軸のラベル設定
plt.legend(ncol=1, loc='best', fancybox=False, frameon = True)
fig.savefig('Remez_2.pdf')
plt.show()
繰り返し計算
計算に用いるユーザ関数は,
def sinc_pm(n,u):
npi = n*np.pi
up = u+npi
um = u-npi
yp = np.sinc(up/np.pi)
ym = np.sinc(um/np.pi)
return yp+ym
レメッツのアルゴリズムにより計算すると,
fig = plt.figure() # グラフ領域
f = np.sinc(uoverpi) # 一様方形開口面分布による遠方放射電界
amat = np.empty((nn,nn))
ii = np.linspace(1,nn,nn)
epsii = (-1)**ii*epsi
n_iteration = 5
for m in range(n_iteration):
p = 20.0*np.log10(np.abs(f))
locs0, _ = find_peaks(p)
upeak = u[locs0]
uu = upeak[:nn]
print(m,'peaks=',p[locs0])
plt.xlabel(r"$\theta$ [deg]") # x軸のラベル設定
plt.ylabel("$g(u)$ [dB]") # y軸のラベル設定
plt.xlim(0.0, 90.0) # x軸範囲の設定
plt.ylim(-50.0, 0.0) # y軸範囲の設定
plt.plot(th*180/np.pi, p, label=r'$m=$'f"{m:.0f}", linewidth=1.5)
for i in range(nn):
for j in range(nn):
amat[i,j] = sinc_pm(j+1,uu[i])
bvec = -np.sinc(uu/np.pi)+epsii
bmat = bvec
xvec = np.linalg.solve(amat,bmat)
sss = np.sum(xvec**2)
eta = 1.0/(1+2.0*sss)
etap = np.round(eta*100)
eta2 = eta**2
f = np.sinc(uoverpi)
for i in range(nn):
f = f + xvec[i]*sinc_pm(i+1,u)
p = 20.0*np.log10(np.abs(f))
plt.legend(ncol=1, loc='best', bbox_to_anchor=(1, 1), fancybox=False, frameon = True)
fig.savefig('Remez_3.pdf')
plt.show()
0 peaks= [-13.262 -17.831 -20.788 -22.985 -24.736 -26.191 -27.437 -28.525 -29.493]
1 peaks= [-22.492 -29.329 -31.099 -33.319 -35.4 -37.403 -39.515 -41.81 -41.979]
2 peaks= [-30.905 -31.814 -31.881 -33.937 -35.964 -37.979 -39.973 -41.977 -41.996]
3 peaks= [-31.987 -32. -32. -34. -36. -37.999 -40. -42. -42. ]
4 peaks= [-32. -32. -32. -34. -36. -38. -40. -42. -42.]
線状波源分布と放射パターン
線状波源をフーリエ級数展開したときの展開係数は,
xvec# 展開係数
array([ 3.174e-01, -1.720e-02, 4.975e-03, -5.510e-03, 4.838e-03,
-4.091e-03, 3.193e-03, -2.090e-03, 2.633e-04])
開口能率は,
etap # 開口能率[%]
83.0
得られた放射パターンのピーク値は,
p = 20.0*np.log10(np.abs(f))
locs0, _ = find_peaks(p)
print(f"{'locs0':>5s} {'u':>10s} {'f':>10s} {'p[dB]':>10s}")
for i in locs0:
print(f"{i:5d} {u[i]:10.5f} {f[i]:10.5f} {p[i]:10.5f}")
locs0 u f p[dB]
210 5.72510 -0.02512 -32.00000
301 8.15752 0.02512 -32.00000
416 11.15601 -0.02512 -32.00000
543 14.33577 0.01995 -34.00000
677 17.49932 -0.01585 -36.00000
821 20.63139 0.01259 -38.00000
982 23.74584 -0.01000 -40.00000
1171 26.80080 0.00794 -42.00000
1436 29.84425 -0.00794 -42.00000
これを図示して,
fig = plt.figure() # グラフ領域
plt.xlabel(r"$\frac{u}{\pi}$") # x軸のラベル設定
plt.ylabel("$g(u)$") # y軸のラベル設定
plt.plot(uoverpi, f)
plt.plot(uoverpi[locs0], f[locs0], 'o', label='peaks')
plt.legend(ncol=1, loc='best', bbox_to_anchor=(1, 1), fancybox=False, frameon = True)
fig.savefig('Remez_4.pdf')
plt.show()
線状波源分布を求めると,
# aperture distribution
n_x = 101
xx = np.linspace(-1.0, 1.0, n_x)
af = 0.5
for i in range(nn):
alpha = (i+1)*np.pi*xx
af = af + xvec[i]*np.cos(alpha)
よって,線状波源分布の計算値の一部を出力すると,
print("aperture-field distribution")
print(f"{'2x/D':>8s} {'amp':>8s} {'p[dB]':>8s}")
for i in range(0,n_x,5):
print(f"{xx[i]:8.2f} {af[i]:8.3f} {20*np.log10(np.abs(af[i])):8.3f}")
aperture-field distribution
2x/D amp p[dB]
-1.00 0.140 -17.053
-0.90 0.185 -14.674
-0.80 0.252 -11.967
-0.70 0.321 -9.868
-0.60 0.416 -7.613
-0.50 0.514 -5.786
-0.40 0.609 -4.307
-0.30 0.691 -3.216
-0.20 0.751 -2.482
-0.10 0.790 -2.047
0.00 0.802 -1.918
0.10 0.790 -2.047
0.20 0.751 -2.482
0.30 0.691 -3.216
0.40 0.609 -4.307
0.50 0.514 -5.786
0.60 0.416 -7.613
0.70 0.321 -9.868
0.80 0.252 -11.967
0.90 0.185 -14.674
1.00 0.140 -17.053
線状波源分布を図示して,
fig = plt.figure() # グラフ領域
plt.xlim(-1.0, 1.0) # x軸範囲の設定
plt.ylim(0.0, 1.0) # y軸範囲の設定
plt.xticks(np.linspace(-1, 1, 5))
plt.xlabel(r"$\frac{2x}{a}$") # x軸のラベル設定
plt.ylabel(r"$e_1(x)$") # y軸のラベル設定
plt.plot(xx, af)
fig.savefig('Remez_5.pdf')
plt.show()
また,放射パターンの計算値の一部は,
print("radiation pattern")
print(f"{'th[deg]':>8s} {'amp':>8s} {'p[dB]':>8s} {'u':>8s} {'u/pi':>8s}")
for i in range(0,n_th,100):
print(f"{thdeg[i]:8.2f} {f[i]:8.3f} {p[i]:8.3f} {u[i]:8.3f} {uoverpi[i]:8.3f}")
radiation pattern
th[deg] amp p[dB] u u/pi
0.00 1.000 0.000 0.000 0.000
5.00 0.433 -7.279 2.738 0.872
10.00 -0.022 -33.005 5.455 1.736
15.00 0.025 -32.007 8.131 2.588
20.00 -0.023 -32.743 10.745 3.420
25.00 0.010 -40.374 13.277 4.226
30.00 0.005 -46.307 15.708 5.000
35.00 -0.014 -37.247 18.019 5.736
40.00 0.011 -38.908 20.194 6.428
45.00 0.001 -63.683 22.214 7.071
50.00 -0.009 -40.446 24.066 7.660
55.00 0.003 -49.732 25.734 8.192
60.00 0.007 -42.829 27.207 8.660
65.00 -0.001 -57.402 28.472 9.063
70.00 -0.008 -42.480 29.521 9.397
75.00 -0.007 -43.149 30.345 9.659
80.00 -0.004 -48.819 30.939 9.848
85.00 -0.001 -60.572 31.296 9.962
90.00 0.000 -333.382 31.416 10.000
放射角度の関数として放射パターンを図示すると,
fig = plt.figure() # グラフ領域
plt.xlim(0.0, 90.0) # x軸範囲の設定
plt.ylim(-50.0, 5.0) # y軸範囲の設定
plt.xlabel(r"$\theta$ [deg]") # x軸のラベル設定
plt.ylabel("$g(u)$ [dB]") # y軸のラベル設定
plt.plot(thdeg, p)
plt.plot(thdeg[locs0],p[locs0], 'o')
fig.savefig('Remez_6.pdf')
plt.show()
サイドローブレベルを広角になるにしたがって低くした放射パターン
サイドローブレベルを次のように設定すると,
nn = 9
epsdb = np.linspace(-30.0, -46.0, nn)# [dB]
放射パターンは,
このとき,線状波源分布は,
サイドローブレベルを等しくした放射パターン
サイドローブレベルを次のように設定すると,
nn = 9
epsdb = -34.0# [dB]
放射パターンは,
このとき,線状波源分布は,
前のページに戻る
「目次」のページに戻る