LTSpiceのネットリストを学ぶRCローパスフィルタのシミュレーション



## はじめに

本記事では、**LTSpiceシミュレーションのネットリスト**を生成する方法を、**CRローパスフィルタ**を通じて解説します。さらに、Pythonコードを使用して、CRローパスフィルタの伝達関数や周波数応答を計算し、**ボード線図**や**インパルス応答**をプロットする方法も紹介します。



## Pythonコード

以下は、CRローパスフィルタのネットリスト生成、シミュレーション設定、そして伝達関数の計算とその応答をプロットするためのPythonコードです。LTSpiceシミュレーションからネットリストを読み取る手間を省くため、今回はプリント関数でネットリストを表示しています。
こちらを参考してください。

https://qiita.com/dl10yr/items/a4f1710f5f8d9fdcb810


```python
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)` を使ってインパルス入力を定義<br>- `R1` と `C1` によって、CRローパスフィルタの回路構成が記述されている。 |
| **2. 伝達関数の定義**             | - CRローパスフィルタの伝達関数 \( H(s) = \frac{1}{RCs + 1} \) を定義<br>- `scipy.signal.TransferFunction` を使用してシステムをモデル化。   |
| **3. 周波数応答の計算とボード線図**| - `scipy.signal.bode` 関数を使って、システムの周波数応答（ボード線図）を計算<br>- 振幅特性と位相特性をプロット。                           |
| **4. 時間応答の計算**             | - `scipy.signal.impulse` 関数を使用してインパルス入力に対する時間応答を計算<br>- 時間応答をプロット。                                       |

##  おわりに

本記事では、**CRローパスフィルタのネットリスト生成**から始まり、**伝達関数の定義**、**周波数応答の計算**、さらに**時間応答のシミュレーション**に至るまで、PythonとLTSpiceのネットリストを組み合わせたPythonコードを作成しました。
本記事が、回路設計やシミュレーション技術の向上に役立つ一助となれば幸いです。今後とも、PythonやLTSpiceを活用したシミュレーション技術を深めていくことをお勧めします。


http://easylabo.com/2016/01/ltspice/12076/