0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

集積回路(IC)設計に使う伝達関数

Last updated at Posted at 2025-02-15

冒頭

集積回路(IC)設計において重要となる各種伝達関数を整理し、それらの特性をボード線図(Bode Plot)を用いて可視化しました。伝達関数はアナログ回路の動作解析において不可欠であり、周波数特性の把握や安定性の評価に活用されます。特に、本資料では アンプ回路やフィルタ回路で頻繁に用いられる一次および二次系の伝達関数 を取り上げ、それぞれのゲイン特性と位相特性を示します。これにより、各伝達関数の周波数応答を直感的に理解できるようになります。
本解析では、Python の scipy.signal を用いて周波数応答を計算し、ボード線図としてプロットしました。得られた結果は、設計時のパラメータ調整や回路特性の最適化に役立つことを目的としています。



与えられた伝達関数


image.png

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()


0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?