Python勉強計画(scikit-rf, pygame, scikit-learn )

雑記

ウィーンでテレワークになってから一か月が経った。隔日頻度の会社や大学の人とのビデオ会議以外は文献調査、回路設計、シミュレーション、レポート作成、論文執筆等、家にいてもやることはそこそこあるので暇はしていない。日中はほぼ一人なのでむしろラボにいるよりも集中できる環境な気がする。

新調したPCも問題なく動いてくれている。ただ一点の問題を除いては。それはMATLABが使えないこと。アカデミックのスタンドアロンライセンスなのだがサポート曰く、ライセンスを移行するにはもともと使っているPCからライセンスをエクスポートして書き換えてうんぬんかんぬん。。。現在、ラボのPCへリモートデスクトップ接続ができない自分にとってはハードルが高すぎた。

もともと電磁解析シミュレーションやら実測結果としてのTouchstoneファイル(.sNp)を総合的に管理・解析していたのがMATLAB(RF toolbox)だったのだが、この際ライセンスに依存することのないような環境を整備したいと思い立った結果、Pythonに行き着いた。PythonにはScikit-rfというRF分野のためのパッケージがあるのが主な理由。Touchstoneファイルの管理と行列計算、回路パラメータ変換関数とか入ってればとりあえず一通りのことはできると思う。ただせっかくのPythonをRF(高周波)分野のことのみに使うのはつまらないのでこの機を活かしていろいろ勉強することにした。具体的にはゲームデザイン(pygame)と統計処理・機械学習関連(scikit-learn)。以下、それぞれの項目と勉強計画についてもう少し詳しく。


Scikit-rf

概要は上で述べた通りで直近の目標としては「MATLAB環境の再現。いくつかの簡単な受動回路の設計」

受動回路の設計の一例として、基本的なClosed formで定義された伝送線路(マイクロストリップやコプレーナ線路)をつなげた回路がCUIで設計できるのでまず慣れるために特に実用性は無い簡単な2.45 GHz 3段チェビシェフLPF(ローパスフィルタ)を設計した。稼働周波数の波長よりも十分に長さが短いステップ回路はその特性インピーダンスに応じて直列インダクタンス・並列キャパシタンスとみなすことができる。ステップ線路のそれぞれの線路幅を計算し、線路を定義したあとにScikit-rfの回路のカスケード接続を行うと下図左のような等価的な3段ステップLPFが得られる。これの解析結果とフルウェーブ解析による解析結果を比較すると同様の結果が得られた(下図右)。Closed Form解析による等価回路では不連続部や放射・高モードの影響が顕著になる30 GHz以上のミリ波帯では対応できないかもしれないがフルウェーブ解析結果と比較してどのあたりまで実用可能なのかを検証していきたいと思う。本パッケージに関しては日本語の文献がWebにほとんど無いので本ブログで解説できそうなところは解説していきたい。今回のコードは本記事最後に載せる(手計算なので計算過程は無し。HFSSシミュレーション結果もコメントアウトしているのでそのまま実行できるはず)

Pygame

ゲーム開発に必要な描画系モジュールが揃っているPygameでゲームを作る。こちらは完全な趣味。昔大学のサークルでC++を使ってちまちま作っていたような弾幕シューティングを再現できれば満足。ただ勉強することはこちらの方が多そう。とりあえず直近の目標はメニュー画面から1面ボスまで一通り作り上げること。思い出しながら、2週間くらいで。

Scikit-learn

こちらも半ば趣味。統計処理・機械学習系は以前書いたRの記事を見ればわかる通り少しだけかじっている程度なので当面はKaggleのタイタニックや住宅購入価格のデータセットを使ってRでできてたことをPythonでもできるようにすることが直近の目標。ただこちらはRを優先していきたいので先の話になるかも。

ロックダウンでしばらく旅行の記事も書けないし記事のテーマをしばらくは技術・語学あたりに絞って更新していきたいと思う。

import numpy as np
import matplotlib.pyplot as plt
import skrf as rf
import scipy as sci
from numpy import real, log10, sum, absolute, pi, sqrt
from skrf import Network, Frequency
from skrf.media import CPW
from skrf.media import MLine

Frequency = rf.Frequency(0.1,5,601,'ghz') #define frequency range

#define material characteristics
Er = 4.4
H = 1.6e-3 #dielectric tickness
T = 30e-6 #copper height
tand = 0.02 #dielectric loss tangent
LineWidth = 3.1e-3
InputLength = 15e-3

#define step line width 
StepLineWidth1 = 1.42e-3
StepLineLength1 = 7.2e-3
StepLineWidth2 = 8.5e-3
StepLineLength2 = 10.4e-3

#define Microstrip linestructure
InputLine = MLine(frequency=Frequency, w=LineWidth, h=H, t=T,
        ep_r=Er, mu_r=1, rho=1.712e-8, tand=tand, rough=0,
        f_low=1e3, f_high=1e12,
        diel='djordjevicsvensson', disp='kirschningjansen')
StepLine1 = MLine(frequency=Frequency, w=StepLineWidth1, h=H, t=T,
        ep_r=Er, mu_r=1, rho=1.712e-8, tand=tand, rough=0,
        f_low=1e3, f_high=1e12,
        diel='djordjevicsvensson', disp='kirschningjansen')
StepLine2 = MLine(frequency=Frequency, w=StepLineWidth2, h=H, t=T,
        ep_r=Er, mu_r=1, rho=1.712e-8, tand=tand, rough=0,
        f_low=1e3, f_high=1e12,
        diel='djordjevicsvensson', disp='kirschningjansen')

#construct input/step lines with specified length
Input  = InputLine.line(InputLength, 'm', z0=50,embed = True)
Step1 = StepLine1.line(StepLineLength1,'m',embed=True)
Step2 = StepLine2.line(StepLineLength2,'m',embed = True)

#construct input/output line with same length
Input_Left = Input
Input_Right = Input.flipped()
#connect defined lines as Device under Test
DUT = Input_Left ** Step1 ** Step2 ** Step1 ** Input_Left

#DUT_simulated = Network('ThirdChebyshev_HFSS.s2p')

#LPF Graph
plt.figure()
plt.subplots_adjust(hspace = 0.5)
plt.subplot(3,1,1)
plt.title('Planar 3rd chebyshev low pass filter')
DUT.s21.plot_s_db(label = 'skrf')
#DUT_simulated.s21.plot_s_db(label = 'HFSS',dashes=[6, 2])
plt.ylabel('S21 [dB]')
plt.subplot(3,1,2)
DUT.s11.plot_s_db(label = 'skrf')
#DUT_simulated.s11.plot_s_db(label = 'HFSS',dashes=[6, 2])
plt.ylabel('S11 [dB]')
plt.subplot(3,1,3)
DUT.s21.plot_s_deg(label = 'skrf')
#DUT_simulated.s21.plot_s_deg(label = 'HFSS',dashes=[6, 2])
plt.ylabel('S21 [deg]')
plt.show()

コメント

タイトルとURLをコピーしました