冒頭
集積回路(IC)設計において重要となる各種伝達関数を整理し、それらの特性をボード線図(Bode Plot)を用いて可視化しました。伝達関数はアナログ回路の動作解析において不可欠であり、周波数特性の把握や安定性の評価に活用されます。特に、本資料では アンプ回路やフィルタ回路で頻繁に用いられる一次および二次系の伝達関数 を取り上げ、それぞれのゲイン特性と位相特性を示します。これにより、各伝達関数の周波数応答を直感的に理解できるようになります。
本解析では、Python の scipy.signal
を用いて周波数応答を計算し、ボード線図としてプロットしました。得られた結果は、設計時のパラメータ調整や回路特性の最適化に役立つことを目的としています。
与えられた伝達関数
Pythonで伝達関数をまとめる
Pythonコード
# 必要なライブラリのインポート
from scipy.signal import freqs
import matplotlib.pyplot as plt
import numpy as np
# 具体的なパラメータの設定(実際の回路設計でありそうな値に調整)
z = 1e3 # 零点の位置 (Hzオーダー)
p = 1e5 # 極の位置 (MHzオーダー)
A = 40 # ゲイン (40dB程度を想定)
B = 1e-6 # 係数 B (時間定数系, 小さい値)
C = 1e-9 # 係数 C (キャパシタンス, nFオーダー)
D = 1e-6 # 係数 D (時間定数, µsオーダー)
# 周波数範囲の設定(10 Hz ~ 10 MHz 相当の範囲)
frequencies = np.logspace(1, 7, 1000) # 10 rad/s から 10,000,000 rad/s
# 伝達関数の係数定義(分子と分母)
G1_num = [1, -1/z] # 1 - s/z
G1_den = [1, 1/p] # 1 + s/p
G2_num = [1, 1/z] # 1 + s/z
G2_den = [1, 1/p] # 1 + s/p
G3_num = [A] # A
G3_den = [1, 1/p] # 1 + s/p
G4_num = [A * B, A] # A(1 + sB) = A * sB + A
G4_den = [1] # 1
G5_num = [-A * B, A] # A(1 - sB) = -A * sB + A
G5_den = [1] # 1
G6_num = [-A * B, A] # A(1 - sB)
G6_den = [C * D, C + D, 1] # (Cs+1)(Ds+1) = C*D*s^2 + (C+D)s + 1
# 各伝達関数の周波数応答を計算
w, H1 = freqs(G1_num, G1_den, worN=frequencies)
w, H2 = freqs(G2_num, G2_den, worN=frequencies)
w, H3 = freqs(G3_num, G3_den, worN=frequencies)
w, H4 = freqs(G4_num, G4_den, worN=frequencies)
w, H5 = freqs(G5_num, G5_den, worN=frequencies)
w, H6 = freqs(G6_num, G6_den, worN=frequencies)
# ボード線図(ゲインと位相)のプロット
fig, axs = plt.subplots(2, 1, figsize=(10, 8))
# ゲインプロット
axs[0].semilogx(w, 20 * np.log10(abs(H1)), label="G1")
axs[0].semilogx(w, 20 * np.log10(abs(H2)), label="G2")
axs[0].semilogx(w, 20 * np.log10(abs(H3)), label="G3")
axs[0].semilogx(w, 20 * np.log10(abs(H4)), label="G4")
axs[0].semilogx(w, 20 * np.log10(abs(H5)), label="G5")
axs[0].semilogx(w, 20 * np.log10(abs(H6)), label="G6")
axs[0].set_ylabel("Magnitude [dB]")
axs[0].set_title("Bode Magnitude Plot")
axs[0].grid(which="both", linestyle="--")
axs[0].legend()
# 位相プロット
axs[1].semilogx(w, np.angle(H1, deg=True), label="G1")
axs[1].semilogx(w, np.angle(H2, deg=True), label="G2")
axs[1].semilogx(w, np.angle(H3, deg=True), label="G3")
axs[1].semilogx(w, np.angle(H4, deg=True), label="G4")
axs[1].semilogx(w, np.angle(H5, deg=True), label="G5")
axs[1].semilogx(w, np.angle(H6, deg=True), label="G6")
axs[1].set_xlabel("Frequency [rad/s]")
axs[1].set_ylabel("Phase [degrees]")
axs[1].set_title("Bode Phase Plot")
axs[1].grid(which="both", linestyle="--")
axs[1].legend()
# グラフを表示
plt.tight_layout()
plt.show()