« 高周波・RFニュース 2024年8月5日 iFixitのSamsugn Galaxy Watch 7 Ultra分解、Samsungの1TBのmicroSDカード、O-RAN allianceの仕様がATIS標準に、Mini-circuitsの750W 915MHz帯信号源、LCPを使ったメタサーフェスアブソーバー | トップページ | 高周波エンジニアのためのAI・機械学習入門(2)PythonとKeras3.0を使ってディープラーニング(DNN)で3次のLCバンドパスフィルタ(BPF)のSパラメータの値から素子の値(L、C)を推定する。  »

2024年8月 5日 (月)

高周波エンジニアのためのAI・機械学習入門(1) 準備としてPythonとscikit-rfを使って学習データとして大量のLCバンドパスフィルタ(BPF)のSパラメータデータとその回路素子の値をモンテカルロシミュレーションで作る。

いろいろな分野でAIが使われているのは言うまでもないが、物理で使われている例が興味深いと思った。

ディープラーニングと物理学 原理がわかる、応用ができる

物理学者,機械学習を使う ー機械学習・深層学習の物理学への応用ー

―Pythonで実践― 基礎からの物理学とディープラーニング入門 (エンジニア入門シリーズ112)

数学セミナー2024年8月号 通巻754号【特集】生成AIとこれからの数学

高周波領域で使われているかというと、最近の測定器やシミュレータ、CADには使われだしているが、普通に高周波だけやってきたエンジニアにはまだまだなじみがない。そこで今回から高周波エンジニアのためのAI・機械学習入門を何回かに分けて書いていく。

生成AIや、画像認識などはもう情報があふれているし、もうちょっと実践的な例題を取り上げる。ということで、以前に作ったフィルタ合成ライブラリ↓

 Pythonの高周波ライブラリscikit-rfを使ってマイクロ波LCフィルタ合成ライブラリ filtersynthを作った。任意の次数のバタワースとチェビシェフタイプのLPF, BPF, HPFを合成して回路定数のリストやSパラメータにして出力できる。

を使ってBPFのSパラメータとその回路定数(L,C)をモンテカルロシミュレーションを使って出力して、Sパラメータを入力データとし、L,Cの素子の値が機械学習で推定できるか、いわゆる回帰問題をやってみよう。

フィッティングと何が違うの?と言われるとまあそうなんだが、とりあえず機械学習入門ということで。

プログラムはこんな感じで。


import numpy as np
import matplotlib.pyplot as plt
import skrf as rf
import filtersynth as fs

#周波数の設定
fstart = 0.1
fstop = 20
points = 200

#モンテカルロシミュレーションでは中心周波数と比帯域幅を乱数で振るが、それの最大最小
f0min = 2
f0max = 18
dfrmax = 0.2
dfrmin = 0.1

#フィルタデータ1つ分作る関数
def filter_data(n, f0, df, fstart, fstop, points):
    """
    Kerasで読めるような形でBPFの2ポートSパラメータとその合成に使うL,Cの値をそれぞれ
    1つ分のdata, labelとして出力する。具体的にはdataは(1, points, 5), labelは(1, 6)。
    dataが5なのは奇数次のLCフィルタはS11=S22、S21=S12かつ複素数データなので
    freq, S11real, S11imag, S21real, S21imagだから。Sパラメータは絶対値1なので規格化はせず
    周波数のみ最大周波数で割っている。
    """
    LC_elements = fs.LC_BPF(n, f0, df)
    label = LC_elements.reshape(n*2+4)[2:2*n+2].reshape(1, n*2)
    bpf_cir, bpf_network = fs.BPF_synthesis(n, f0, df, fstart, fstop, points)
    freq = bpf_network.f
    Spara = bpf_network.s
    data = np.array([freq[:]/fstop*1E-9,Spara[:,0, 0].real, Spara[:,0, 0].imag,
                     Spara[:,1, 0].real, Spara[:,1, 0].imag]).T.reshape(1, Spara.shape[0],5)
    return data, label


#モンテカルロシミュレーションでデータ作成して保存する。
N = 10000
np.random.seed(1)
data = np.empty((0, points, 5))
label = np.empty((0, 6))
for i in range(N):
    f0 = f0min + (f0max - f0min) * np.random.rand()
    df = (dfrmin + (dfrmax - dfrmin) * np.random.rand()) * f0
    x, y = filter_data(3, f0, df, fstart, fstop, points)
    data = np.vstack((data, x))
    label = np.vstack((label, y))
#予測する量(L,C)が小さすぎるのでnH, pF単位にする。
label[:, 0] *= 1.0E9
label[:, 1] *= 1.0E12
label[:, 2] *= 1.0E9
label[:, 3] *= 1.0E12
label[:, 4] *= 1.0E9
label[:, 5] *= 1.0E12
#保存
np.savez_compressed("data_label.npz", data=data, label=label)

 

フィルタは3次のチェビシェフフィルタで、その中心周波数と帯域幅を乱数で振っている。周波数は0.1~20GHzの200点。

この場合のSパラメータはポート1とポート2で対称になるので、データとしては周波数、S11の実部、S11の虚部、S21の実部、S21の虚部の5つになるが、機械学習で使うためには並べ方をデータ数を一番最初に持ってきて

[データ数, 200, 5]

のようにしないといけない。ここが最初慣れないところ。一個のフィルタのデータは[1, 200, 5]のように作成して、numpyのvstackで積んでいっている。

なお、200,5の部分も機械学習のアルゴリズム(ディープラーニング、畳み込みニューラルネットワーク、回帰型ニューラルネットワークなど)によって後ほど並べかえる。

またLCの値は、今回は3次バンドパスフィルタなのでL3つ、C3つの合計6で、これもデータ数が最初に来て

[データ数, 6]

のようになっている。

今回は10000個のデータを作成した。最初の1000個のS21を重ねて書いたものがこちら。

Rfai002

中心周波数や帯域幅がいろいろになっていることがわかる。

次回からこのSパラメータを与えて回路定数が推定できるかを見ていく(続く)。

« 高周波・RFニュース 2024年8月5日 iFixitのSamsugn Galaxy Watch 7 Ultra分解、Samsungの1TBのmicroSDカード、O-RAN allianceの仕様がATIS標準に、Mini-circuitsの750W 915MHz帯信号源、LCPを使ったメタサーフェスアブソーバー | トップページ | 高周波エンジニアのためのAI・機械学習入門(2)PythonとKeras3.0を使ってディープラーニング(DNN)で3次のLCバンドパスフィルタ(BPF)のSパラメータの値から素子の値(L、C)を推定する。  »

パソコン・インターネット」カテゴリの記事

学問・資格」カテゴリの記事

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« 高周波・RFニュース 2024年8月5日 iFixitのSamsugn Galaxy Watch 7 Ultra分解、Samsungの1TBのmicroSDカード、O-RAN allianceの仕様がATIS標準に、Mini-circuitsの750W 915MHz帯信号源、LCPを使ったメタサーフェスアブソーバー | トップページ | 高周波エンジニアのためのAI・機械学習入門(2)PythonとKeras3.0を使ってディープラーニング(DNN)で3次のLCバンドパスフィルタ(BPF)のSパラメータの値から素子の値(L、C)を推定する。  »

最近の記事

2025年2月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28  

最近のコメント

無料ブログはココログ
フォト