« RF Weekly Digest (Gemini 3.1 Pro・Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ)2026/5/24-5/31 | トップページ | 高周波・RFニュース 2026年6月2日 QualcommがSnapdragon C発表&6G解説記事、アンリツが140Gbaudバイアスティ内蔵 広帯域リニアアンプ発売、SONY Xperia 10 VII分解動画など »

2026年6月 1日 (月)

高周波エンジニアのためのAI・機械学習入門(GPU編27)21次のチェビシェフ特性のLCバンドパスフィルタ(42パラメータ)のSパラメータをモンテカルロシミュレーションで10000個作る。後ほどディープラーニングなどで予測する準備。

以前もLCバンドパスフィルタのLとCの値を予測する、というのをやっていたがその時は3次のフィルタ(LとCのパラメータ6個)だったのであまりありがたみがなかった。機械学習使わなくても何とでもなりそうなので。

もっと次数を増やして、他の方法では時間がかかりそうなものを機械学習でやったほうがよさそう。ということで今回は21次のチェビシェフ特性のバンドパスフィルタ(パラメータは42個。生命、宇宙、そして万物についての究極の疑問の答え=42なので)をやってみよう。

今回は前準備としてモンテカルロシミュレーションで中心周波数と帯域幅を振ったバンドパスフィルタのSパラメータデータを10000個作る。

コードはこんな感じで。


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
odr = 21 #オーダー21のフィルタを作る。オーダーが大きいほど合成に使うLCの数が増えるので、予測する量も増える。
np.random.seed(1)
data = np.empty((0, points, 5))
label = np.empty((0, odr*2))
for i in range(N):
    f0 = f0min + (f0max - f0min) * np.random.rand()
    df = (dfrmin + (dfrmax - dfrmin) * np.random.rand()) * f0
    x, y = filter_data(odr, f0, df, fstart, fstop, points)
    data = np.vstack((data, x))
    label = np.vstack((label, y))
#予測する量(L,C)が小さすぎるのでnH, pF単位にする。
for j in range(odr*2):
    label[:, j] *= 1.0E9 if j % 2 == 0 else 1.0E12

#保存
np.savez_compressed("21stagefilter.npz", data=data, label=label)

できたデータの最初のほうをプロットしたもの。

21filterdata

次数が高いのでめちゃくちゃ減衰が急だな。ではこれを使って機械学習をしていく(続く)。

 

« RF Weekly Digest (Gemini 3.1 Pro・Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ)2026/5/24-5/31 | トップページ | 高周波・RFニュース 2026年6月2日 QualcommがSnapdragon C発表&6G解説記事、アンリツが140Gbaudバイアスティ内蔵 広帯域リニアアンプ発売、SONY Xperia 10 VII分解動画など »

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

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

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

コメント

コメントを書く

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

« RF Weekly Digest (Gemini 3.1 Pro・Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ)2026/5/24-5/31 | トップページ | 高周波・RFニュース 2026年6月2日 QualcommがSnapdragon C発表&6G解説記事、アンリツが140Gbaudバイアスティ内蔵 広帯域リニアアンプ発売、SONY Xperia 10 VII分解動画など »

最近の記事

2026年6月
  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 29 30        

最近のコメント

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