はじめに
本記事では、LTSpiceシミュレーションのネットリストを生成する方法を、CRローパスフィルタを通じて解説します。さらに、Pythonコードを使用して、CRローパスフィルタの伝達関数や周波数応答を計算し、ボード線図やインパルス応答をプロットする方法も紹介します。
Pythonコード
以下は、CRローパスフィルタのネットリスト生成、シミュレーション設定、そして伝達関数の計算とその応答をプロットするためのPythonコードです。LTSpiceシミュレーションからネットリストを読み取る手間を省くため、今回はプリント関数でネットリストを表示しています。
こちらを参考してください。
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# CRローパスフィルタのパラメータ
R = 1e3 # 抵抗値 (1kΩ)
C = 1e-6 # コンデンサ値 (1μF)
# ネットリストの生成 (インパルス入力を使用)
netlist = f"""
* CR Low-pass Filter Netlist
* 入力信号をインパルス信号に変更
* PULSE(0 1 0 1ms 1ms 1ms 2ms) は、1Vの振幅で1msの幅を持つインパルス信号を生成します
Vin N1 0 DC 0 AC 1 PULSE(0 1 0 1ms 1ms 1ms 2ms) ; インパルス信号
* 抵抗R1を定義します
* 抵抗R1はN1ノード(入力信号)からN2ノードに接続され、1kΩの抵抗値を持っています
R1 N1 N2 {R} ; 抵抗 ({R}Ω)
* コンデンサC1を定義します
* C1はN2ノードからグラウンド(0V)に接続され、容量は{C*1e6}μFです
C1 N2 0 {C} ; コンデンサ ({C*1e6}μF)
* 時間領域シミュレーションを設定します
* .tran 0 5msは、0秒から5ミリ秒までの時間領域でのシミュレーションを実行します
.tran 0 5ms ; 時間領域シミュレーション (5msのシミュレーション)
* 周波数領域シミュレーションを設定します
* .ac dec 20 1 100k は、1Hzから100kHzまでの範囲で周波数応答を解析します
* "dec 20" は、周波数軸で20ポイント/デケードの解析を意味します
.ac dec 20 1 100k ; 周波数領域シミュレーション (1Hzから100kHz)
* 周波数応答をプロットします
* V(N2) は、出力ノードN2の電圧を指します
.plot ac V(N2) ; 出力の周波数応答をプロット
* シミュレーション終了
.end
"""
# ネットリストを表示
print(netlist)
# 伝達関数の定義
# H(s) = 1 / (RCs + 1)
# scipy.signal.bodeで周波数応答を計算できる形式で定義する
numerator = [1]
denominator = [R*C, 1] # 分母の係数は RC と 1
# 系の伝達関数
system = signal.TransferFunction(numerator, denominator)
# 周波数応答(ボード線図)を計算
frequencies = np.logspace(1, 5, num=500) # 1Hzから100kHzまでの周波数
w, mag, phase = signal.bode(system, frequencies)
# ボード線図のプロット
plt.figure(figsize=(10, 6))
# 振幅特性のプロット
plt.subplot(2, 1, 1)
plt.semilogx(w, mag) # 横軸は対数スケール
plt.title('Frequency Response of CR Low-pass Filter')
plt.xlabel('Frequency [rad/s]')
plt.ylabel('Magnitude [dB]')
plt.grid(True, which='both', axis='both')
# 位相特性のプロット
plt.subplot(2, 1, 2)
plt.semilogx(w, phase)
plt.xlabel('Frequency [rad/s]')
plt.ylabel('Phase [degrees]')
plt.grid(True, which='both', axis='both')
# プロットの表示
plt.tight_layout()
plt.show()
# 時間応答をプロット
# インパルス入力に対する応答を計算
t = np.linspace(0, 0.01, 1000) # 時間軸 (0~10ms)
t, y = signal.impulse(system, T=t)
plt.figure(figsize=(10, 4))
plt.plot(t, y)
plt.title('Impulse Response of CR Low-pass Filter')
plt.xlabel('Time [s]')
plt.ylabel('Output')
plt.grid(True)
plt.show()
ステップ | 内容 |
---|---|
1. ネットリストの生成 | - PULSE(0 1 0 1ms 1ms 1ms 2ms) を使ってインパルス入力を定義- R1 と C1 によって、CRローパスフィルタの回路構成が記述されている。 |
2. 伝達関数の定義 | - CRローパスフィルタの伝達関数 ( H(s) = \frac{1}{RCs + 1} ) を定義 - scipy.signal.TransferFunction を使用してシステムをモデル化。 |
3. 周波数応答の計算とボード線図 | - scipy.signal.bode 関数を使って、システムの周波数応答(ボード線図)を計算- 振幅特性と位相特性をプロット。 |
4. 時間応答の計算 | - scipy.signal.impulse 関数を使用してインパルス入力に対する時間応答を計算- 時間応答をプロット。 |
おわりに
本記事では、CRローパスフィルタのネットリスト生成から始まり、伝達関数の定義、周波数応答の計算、さらに時間応答のシミュレーションに至るまで、PythonとLTSpiceのネットリストを組み合わせたPythonコードを作成しました。
本記事が、回路設計やシミュレーション技術の向上に役立つ一助となれば幸いです。今後とも、PythonやLTSpiceを活用したシミュレーション技術を深めていくことをお勧めします。