Lab 02 — 理想 LC 振盪器 toy model: 與電荷線性度
lab_01 給了幾何直覺:相位=切向、振幅=徑向。 這個 lab 把它算成一個具體的函數。對一個理想無耗並聯 LC 振盪器,把 current impulse 注進 電容節點,所造成的永久相位偏移可以完全解析地寫出來,得到 ISF:
這是全站第一個「真的有形狀」的 ISF,且它不是 toy 假設而是從 state geometry 推出來的。 我們會 (a) 畫出波形與其 ISF、(b) 用數值模擬驗證 small-signal 下 與 嚴格成 正比、(c) 在 state space 看過零注入如何變成「純相位跳變」。
物理直覺(先講結論):LC 的狀態 在圓上等速轉。 current impulse 只把電容電壓 水平推一步 。這一步有多少變成 相位、取決於此刻半徑(指向圓心外)與切向(垂直半徑)的夾角。在波峰(, )這一步完全沿半徑 → 全是振幅;在過零(,)這一步完全沿切向 → 全是相位。把這個投影寫成相位增量,恰好是 。
1. 教學目標
- 從物理導出 理想 LC 的 ISF ,不靠背、不靠假設。
- 理解 ISF 的「形狀」如何對應波形: 最大在過零、為零在波峰。
- 用數值模擬驗證 small-signal 線性度:,即在固定注入相位 下 與 成正比(重現 [P1] Fig. 6 的結論)。
- 在 state space 看見「過零注入=沿切向推=純相位跳變、軌跡半徑不變」。
- 為 convolution_derivation 與 ISF 的傅立葉 分解(lab_05)準備一個乾淨可解析的範例。
2. 數學模型
理想無耗並聯 LC:能量在 、 之間無損 地來回,狀態在 2-D 平面上等速繞圓。寫成 normalized state():
- =電容電壓();=(正比於)電感電流()。
- 此處 (無振幅恢復),對應「marginally stable 的理想 LC」。模擬時為了讓軌跡乾淨地 停在環上,我們在 (a)(b) 用很小的 (弱恢復),在 (c) 用 看純旋轉。
impulse → 電壓步階([P1] Eq.(9), p.182):
它只動 (電感電流不能瞬變),即 state 沿 軸跳 。
把電壓步階投影成相位。在 處,切向(相位增加方向)的單位向量是 。一個沿 軸的步階 ,其 切向投影(除以半徑 換成角度增量)為:
代入 並用 :
- dimension check: 是 rad(無因次); 無因次; 故 無因次 ✓。 是 週期,與 [P1] Eq.(10),(11) 的定義一致。
- 物理檢查:(波峰)→ (只改振幅,與 lab_01 圖二紅點吻合); (上升過零)→ ( 最大,純相位,與綠點吻合)。負號代表 「相位被往後推」的方向慣例。
toy model 聲明:理想無耗 LC + 純 2-D 旋轉 + small-signal 投影,是 pedagogical toy model, 非 transistor-level。真實 LC 有有限 、harmonic、cyclostationary noise,會讓 偏離乾淨的 (見 effective_isf)。
3. Block diagram
4. Python 核心 code
節錄自 simulations/lab_02_lc_toy_model.py(已對照原始碼)。理想 LC 的 ISF 直接由
gamma_lc_ideal(即 )提供;線性度則靠 simulate_lc 在固定過零相位注入不同
、再用 excess_phase 量持續相位偏移:
from oscillator_models import simulate_lc, excess_phase
from simulations.common.isf_utils import gamma_lc_ideal
f0, fs = 1.0, 8000.0
theta = np.linspace(0, 2 * np.pi, 400)
# (a) 波形 cos(theta) 與其 ISF -sin(theta)
V = np.cos(theta)
Gamma = gamma_lc_ideal(theta) # = -np.sin(theta)
# (b) 線性度:在過零 (theta=pi/2, ISF=-1) 注入一系列 dq/qmax,量持續 Δφ
dq_list = np.linspace(-0.05, 0.05, 11) # dq / q_max
T = 1.0 / f0
t_inj = 4 * T + (np.pi / 2) / (2 * np.pi * f0) # 注入時刻對應 theta=pi/2
t_ref, xr, yr = simulate_lc(f0, 10 * T, fs, mu=0.3)
phi_ref = excess_phase(t_ref, xr, yr, f0)
dphi = []
for dq in dq_list:
t_p, xp, yp = simulate_lc(f0, 10 * T, fs, mu=0.3,
impulse_time=t_inj, impulse_dx=dq)
phi_p = excess_phase(t_p, xp, yp, f0)
m = t_p >= (10 * T - T) # 取最後一週期的穩定值
dphi.append(np.mean(phi_p[m] - phi_ref[m]))
# theory: Δφ = Γ·Δq/q_max = -1 · (dq/q_max)
excess_phase 把載波旋轉 扣掉,只留擾動造成的相位
(),這正是 [P1] Eq.(1) 裡的
。
5. 完整 script path
simulations/lab_02_lc_toy_model.py
(依賴 simulations/common/oscillator_models.py 的 simulate_lc、excess_phase;
simulations/common/isf_utils.py 的 gamma_lc_ideal;simulations/common/plot_utils.py 的 savefig。)
跑法:python scripts/run_all_sims.py 或 python simulations/lab_02_lc_toy_model.py。
6. 參數表
| 參數 | 程式變數 | 值 | 意義 |
|---|---|---|---|
| 振盪頻率 | f0 | 1.0(normalized) | 只看形狀,用無因次 |
| 取樣率 | fs | 8000 | 每週期 8000 點 |
| 弱振幅恢復 | mu | 0.3((a)(b))/ 0.0((c)) | (c) 用純旋轉看相位跳變 |
| 注入電荷 掃描 | dq_list | () | small-signal 範圍 |
| 注入相位 | (過零,) | 最大敏感度處量線性度 | |
| (c) 注入量 | impulse_dx | 0.25 | 稍大以便在圖上看見跳變 |
| 量測窗 | — | 最後 1 個週期 | 取相位偏移的穩定值 |
7. 單位表
| 量 | 符號 | 單位 | 備註 |
|---|---|---|---|
| 相位 | rad | ISF 自變數 | |
| ISF | 無因次 | 週期 | |
| 注入電荷(normalized) |