レメッツのアルゴリズムによるサイドローブレベルの制御

モジュールのインポートや初期設定など

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]
放射パターンは,

このとき,線状波源分布は,