« 高周波・RFニュース 2024年8月2日 mmTronが5G FWA向けミリ波パワーアンプを受注、Qualcommの6Gにおけるセンシングウェビナー、Yoleのスマホ向けプロセッサの調査レポート、Silicon LabsのZigbee SOCがスマートアダプタに採用、パナソニックのWi-Fi/Bluetoothコンボモジュール | トップページ | 三体III死神永生(文庫版上下)を一気に読む。I,IIに負けず面白い!前作で休戦したはずの三体世界の恐ろしい企み、智子に制御されるアンドロイド智子、階梯計画、二代目の執剣者、カモフラージュされた3つの物語、掩体計画、光速宇宙船そして高次元・低次元と全く飽きさせない。 »

2024年8月 2日 (金)

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

さてこれまで3回でフィルタ合成用の関数を作ってきた。

Pythonの高周波ライブラリscikit-rfを使ってマイクロ波LCフィルタ合成をする(1)プロトタイプLPF(チェビシェフ、バタワース)の素子の値を計算する関数をMatthai, Young & JonesのMicrowave Filters, Impedance-matching networks, and coupling structureを基に作る。

Pythonの高周波ライブラリscikit-rfを使ってマイクロ波LCフィルタ合成をする(2) Circuit機能を使ってL,CをつなげていってLPF(ローパスフィルタ)を合成してSパラメータを得る。チェビシェフとバタワースを比較したり素子の繋がりを図示したり。

Pythonの高周波ライブラリscikit-rfを使ってマイクロ波LCフィルタ合成をする(3) プロトタイプLPFから BPF(バンドパスフィルタ)を設計・合成してチェビシェフとバタワースを比べる。

ここにHPFも加えてモジュール化しよう。

このリンクからダウンロードできる。

ダウンロード - filtersynth.py

使い方はこのファイルを同じディレクトリ、あるいはパスが通っているところに置いて、

import filtersynthとする。

全コードは長いので関数の説明のみ書くと

def prototype_LPF(n, type = "Chebyshev", ripple = 0.1):
    """
    信号源、負荷のインピーダンス1、カットオフ周波数1のプロトタイプLPFの素子の値をndarrayで返す関数
    n : フィルタの次数(チェビシェフの場合、偶数だと負荷のインピーダンスが50Ωになりません)
    type : チェビシェフの場合"Chebyshev", バタワースの場合 "Butterworth"
    ripple : チェビシェフの場合のリップルの大きさをdBで表したもの
    """
def LC_LPF(n, fc, z0 = 50.0, first_element = "series", type = "Chebyshev", ripple = 0.1):
    """
    信号源、負荷の特性インピーダンスZo、カットオフ周波数fcのLPFのL,C素子の値をndarrayで返す関数
    n : フィルタの次数(チェビシェフの場合、偶数だと負荷のインピーダンスが50Ωになりません)
    fc : カットオフ周波数[GHz]
    z0 : 信号源の特性インピーダンス
    first_element : 最初にシリーズのLが来る場合"series", 最初にシャントのCが来る場合"shunt"
    type : チェビシェフの場合"Chebyshev", バタワースの場合 "Butterworth"
    ripple : チェビシェフの場合のリップルの大きさをdBで表したもの
    """
def LC_BPF(n, f0, df, z0 = 50.0, first_element = "series", type = "Chebyshev", ripple = 0.1):
    """
    信号源、負荷の特性インピーダンスZo、中心周波数f0, 帯域幅dfのBPFのL,C素子の値をndarrayで返す関数
    n : フィルタの次数(チェビシェフの場合、偶数だと負荷のインピーダンスが50Ωになりません)
    f0 : 中心周波数[GHz]
    df : 帯域幅[GHz]
    z0 : 信号源の特性インピーダンス
    first_element : 最初にシリーズのLCが来る場合"series", 最初にシャントのLCが来る場合"shunt"
    type : チェビシェフの場合"Chebyshev", バタワースの場合 "Butterworth"
    ripple : チェビシェフの場合のリップルの大きさをdBで表したもの
    """
def LC_HPF(n, fc, z0 = 50.0, first_element = "series", type = "Chebyshev", ripple = 0.1):
    """
    信号源、負荷の特性インピーダンスZo、カットオフ周波数fcのHPFのL,C素子の値をndarrayで返す関数
    n : フィルタの次数(チェビシェフの場合、偶数だと負荷のインピーダンスが50Ωになりません)
    fc : カットオフ周波数[GHz]
    z0 : 信号源の特性インピーダンス
    first_element : 最初にシリーズのLが来る場合"series", 最初にシャントのCが来る場合"shunt"
    type : チェビシェフの場合"Chebyshev", バタワースの場合 "Butterworth"
    ripple : チェビシェフの場合のリップルの大きさをdBで表したもの
    """
def LPF_synthesis(n, fc, fstart, fstop, points,
                  z0=50.0, first_element="series", type = "Chebyshev", ripple = 0.1, name="LPF"):
    """
    LPFを合成し、scikit-rfのCircuitとNetworkとして返す関数
    n : フィルタの次数(チェビシェフの場合、偶数だと負荷のインピーダンスが50Ωになりません)
    fc : カットオフ周波数[GHz]
    fstart : 開始周波数[GHz]
    fstop : 終了周波数[GHz]
    points : 周波数点数
    z0 : 信号源の特性インピーダンス
    first_element : 最初にシリーズのLが来る場合"series", 最初にシャントのCが来る場合"shunt"
    type : チェビシェフの場合"Chebyshev", バタワースの場合 "Butterworth"
    ripple : チェビシェフの場合のリップルの大きさをdBで表したもの
    name : networkの名前
    """
def BPF_synthesis(n, f0, df, fstart, fstop, points, z0=50.0,
                  first_element="series", type = "Chebyshev", ripple = 0.1, name = "BPF"):
    """
    BPFを合成し、scikit-rfのCircuitとNetworkとして返す関数
    n : フィルタの次数(チェビシェフの場合、偶数だと負荷のインピーダンスが50Ωになりません)
    f0 : 中心周波数[GHz]
    df : 帯域幅[GHz]
    fstart : 開始周波数[GHz]
    fstop : 終了周波数[GHz]
    points : 周波数点数
    z0 : 信号源の特性インピーダンス
    first_element : 最初にシリーズのLが来る場合"series", 最初にシャントのCが来る場合"shunt"
    type : チェビシェフの場合"Chebyshev", バタワースの場合 "Butterworth"
    ripple : チェビシェフの場合のリップルの大きさをdBで表したもの
    name : networkの名前
    """
def HPF_synthesis(n, fc, fstart, fstop, points, z0=50.0,
                  first_element="series", type = "Chebyshev", ripple = 0.1, name = "HPF"):
    """
    HPFを合成し、scikit-rfのCircuitとNetworkして返す関数
    n : フィルタの次数(チェビシェフの場合、偶数だと負荷のインピーダンスが50Ωになりません)
    fc : カットオフ周波数[GHz]
    fstart : 開始周波数[GHz]
    fstop : 終了周波数[GHz]
    points : 周波数点数
    z0 : 信号源の特性インピーダンス
    first_element : 最初にシリーズのLが来る場合"series", 最初にシャントのCが来る場合"shunt"
    type : チェビシェフの場合"Chebyshev", バタワースの場合 "Butterworth"
    ripple : チェビシェフの場合のリップルの大きさをdBで表したもの
    name : networkの名前
    """
という7つの関数が使える。

使い方は、例えばLPF、BPF、HPFを合成してグラフにするには

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

bpf_cir, bpf_network = fs.BPF_synthesis(3, 5, 0.2*10, 0.1, 20, 200)
lpf_cir, lpf_network = fs.LPF_synthesis(3, 5, 0.1, 20, 200)
hpf_cir, hpf_network = fs.HPF_synthesis(3, 5, 0.1, 20, 200)
bpf_network.plot_s_db(m=1, n=0, logx=True)
lpf_network.plot_s_db(m=1, n=0, logx=True)
hpf_network.plot_s_db(m=1, n=0, logx=True)
plt.ylabel("S21[dB]")
plt.ylim(-50 ,5)
とすると、このようなグラフが得られる。
Filtersynth01
素子のつながりを見るには以下のようにする。
bpf_cir.plot_graph(network_labels=True, edge_labels=True, port_labels=True)
Filtersynth02
さて、なぜこのようなライブラリを作ったかというと、AI・機械学習のための前段階だったのだ。
そのシリーズは来週あたりから(続く)

« 高周波・RFニュース 2024年8月2日 mmTronが5G FWA向けミリ波パワーアンプを受注、Qualcommの6Gにおけるセンシングウェビナー、Yoleのスマホ向けプロセッサの調査レポート、Silicon LabsのZigbee SOCがスマートアダプタに採用、パナソニックのWi-Fi/Bluetoothコンボモジュール | トップページ | 三体III死神永生(文庫版上下)を一気に読む。I,IIに負けず面白い!前作で休戦したはずの三体世界の恐ろしい企み、智子に制御されるアンドロイド智子、階梯計画、二代目の執剣者、カモフラージュされた3つの物語、掩体計画、光速宇宙船そして高次元・低次元と全く飽きさせない。 »

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

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

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

コメント

コメントを書く

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

« 高周波・RFニュース 2024年8月2日 mmTronが5G FWA向けミリ波パワーアンプを受注、Qualcommの6Gにおけるセンシングウェビナー、Yoleのスマホ向けプロセッサの調査レポート、Silicon LabsのZigbee SOCがスマートアダプタに採用、パナソニックのWi-Fi/Bluetoothコンボモジュール | トップページ | 三体III死神永生(文庫版上下)を一気に読む。I,IIに負けず面白い!前作で休戦したはずの三体世界の恐ろしい企み、智子に制御されるアンドロイド智子、階梯計画、二代目の執剣者、カモフラージュされた3つの物語、掩体計画、光速宇宙船そして高次元・低次元と全く飽きさせない。 »

最近の記事

最近のコメント

2024年12月
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 31        
フォト
無料ブログはココログ