LLRFLibsPy库中sim_ncav_pulse函数解读

source code: Github

这段代码定义了一个名为 sim_ncav_pulse 的函数,该函数用于模拟脉冲射频驱动和束流电流对腔体的响应。这个函数特别适用于具有恒定质量因数 (QL) 和失谐频率 (detuning) 的常导腔 (normal conducting cavity)。以下是对这段代码的详细解读:

函数定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def sim_ncav_pulse(Arfc, Brfc, Crfc, Drfc, vf, Ts, 
Abmc = None,
Bbmc = None,
Cbmc = None,
Dbmc = None,
vb = None):
'''
Simulate the cavity response to a pulsed RF drive and beam current. This
function is for normal conducting cavties with constant QL and detuning.

Parameters:
Arfc, Brfc, Crfc, Drfc: numpy matrix (complex), continous cavity model for RF drive
vf: numpy array (complex), cavity forward voltage (calibrated to
the cavity probe signal reference plane)
Ts: float, sampling frequency, Hz
Abmc, Bbmc, Cbmc, Dbmc: numpy matrix (complex), continous cavity model for beam drive
vb: numpy array (complex), beam drive voltage (calibrated to
the cavity probe signal reference plane)

Returns:
status: boolean, success (True) or fail (False)
T: numpy array, time waveform, s
vc: numpy array (complex), cavity voltage waveform
vr: numpy array (complex), cavity reflected voltage waveform
'''

函数接受以下参数:

  • Arfc, Brfc, Crfc, Drfc:用于射频驱动的连续腔体模型的状态空间矩阵。
  • vf:腔体前向电压的复数 numpy 数组(校准到腔体探头信号参考平面)。
  • Ts:采样时间,单位为秒。
  • Abmc, Bbmc, Cbmc, Dbmc:用于束流驱动的连续腔体模型的状态空间矩阵(可选)。
  • vb:束流驱动电压的复数 numpy 数组(校准到腔体探头信号参考平面)(可选)。

返回值包括:

  • status:布尔值,表示成功 (True) 或失败 (False)。
  • T:时间波形的 numpy 数组,单位为秒。
  • vc:腔体电压波形的复数 numpy 数组。
  • vr:腔体反射电压波形的复数 numpy 数组。

参数检查

1
2
3
4
5
6
7
# check the input
if (Ts <= 0.0):
return False, None, None, None

if vb is not None:
if (not vb.shape == vf.shape):
return False, None, None, None

检查采样时间 Ts 是否大于 0。如果不满足条件,函数返回 False 和三个 None。如果提供了 vb,检查其形状是否与 vf 相同,否则返回 False 和三个 None

模拟连续系统的响应

1
2
3
4
5
6
7
# simulate the response of the continous system
T = np.arange(vf.shape[0]) * Ts
_, vc_rf, _ = signal.lsim((Arfc, Brfc, Crfc, Drfc), vf, T) # Returns: T, Yout, Xout
vc = vc_rf
if not any([x is None for x in (Abmc, Bbmc, Cbmc, Dbmc, vb)]):
_, vc_bm, _ = signal.lsim((Abmc, Bbmc, Cbmc, Dbmc), vb, T)
vc += vc_bm

首先计算时间数组 T。然后使用 signal.lsim 函数模拟射频驱动的连续系统响应,得到腔体电压 vc_rf。如果束流驱动模型和 vb 都不为 None,则模拟束流驱动的连续系统响应,得到腔体电压 vc_bm,并将其加到总的腔体电压 vc 上。

计算腔体反射电压

1
2
# get the cavity reflected
vr = vc - vf

计算腔体反射电压 vr,其等于总的腔体电压 vc 减去前向电压 vf

返回结果

1
return True, T, vc, vr

返回成功状态 True,时间波形 T,腔体电压波形 vc 和腔体反射电压波形 vr

总结

sim_ncav_pulse 函数的作用是模拟常导腔在脉冲射频驱动和束流电流下的响应。函数首先检查输入参数的有效性,然后模拟连续系统的响应,计算总的腔体电压波形和反射电压波形。最后返回成功状态和计算结果。

为了举例说明如何使用 sim_ncav_pulse 函数,我们需要提供一些示例输入参数,包括连续状态空间模型的矩阵和驱动信号的波形。以下是一个示例,演示如何调用 sim_ncav_pulse 函数并解释其输出。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import numpy as np
import scipy.signal as signal
import matplotlib.pyplot as plt

# 定义连续腔体模型的状态空间矩阵(假设的值)
Arfc = np.array([[0.0, 1.0], [-1.0, -1.0]])
Brfc = np.array([[0.0], [1.0]])
Crfc = np.array([[1.0, 0.0]])
Drfc = np.array([[0.0]])

# 定义采样时间
Ts = 1e-3 # 1毫秒

# 定义前向电压驱动信号(示例脉冲信号)
time_steps = 1000
vf = np.zeros(time_steps)
vf[100:200] = 1.0 # 在100到200时间步之间有一个幅度为1的脉冲

# 定义束流驱动模型的状态空间矩阵(假设的值,可选)
Abmc = np.array([[0.0, 1.0], [-1.0, -1.0]])
Bbmc = np.array([[0.0], [1.0]])
Cbmc = np.array([[1.0, 0.0]])
Dbmc = np.array([[0.0]])

# 定义束流驱动信号(与前向电压驱动信号形状相同,可选)
vb = np.zeros(time_steps)
vb[150:250] = 0.5 # 在150到250时间步之间有一个幅度为0.5的脉冲

# 调用 sim_ncav_pulse 函数
status, T, vc, vr = sim_ncav_pulse(Arfc, Brfc, Crfc, Drfc, vf, Ts, Abmc, Bbmc, Cbmc, Dbmc, vb)

# 检查状态并打印结果
if status:
plt.figure(figsize=(10, 6))

plt.plot(T, np.real(vf), label='Forward Voltage (Real Part)')
plt.plot(T, np.imag(vf), '--', label='Forward Voltage (Imaginary Part)')
plt.plot(T, np.real(vc), label='Cavity Voltage (Real Part)')
plt.plot(T, np.imag(vc), '--', label='Cavity Voltage (Imaginary Part)')
plt.plot(T, np.real(vr), label='Reflected Voltage (Real Part)')
plt.plot(T, np.imag(vr), '--', label='Reflected Voltage (Imaginary Part)')

plt.legend()
plt.xlabel('Time [s]')
plt.ylabel('Voltage [V]')
plt.title('Cavity Response to Pulsed RF Drive and Beam Current')
plt.grid(True)
plt.show()
else:
print("Simulation failed.")

示例解释

  1. 定义连续腔体模型的状态空间矩阵

    • 这里我们假设了一些值,用于创建射频驱动的状态空间模型。
  2. 定义采样时间

    • Ts = 1e-3,表示采样时间为1毫秒。
  3. 定义前向电压驱动信号

    • vf 是一个包含1000个时间步的零向量。
    • 在时间步100到200之间,电压为1,形成一个脉冲信号。
  4. 定义束流驱动模型的状态空间矩阵和驱动信号

    • 这些矩阵和信号是可选的,同样是假设的值。
    • vb 在时间步150到250之间有一个幅度为0.5的脉冲。
  5. 调用 sim_ncav_pulse 函数

    • 使用定义好的参数调用函数,得到模拟的结果。
  6. 检查状态并打印结果

    • 如果模拟成功,使用 matplotlib 绘制前向电压、腔体电压和反射电压的波形图。
    • 如果模拟失败,打印失败信息。

输出解释

  • 前向电压:显示输入到腔体的脉冲信号。
  • 腔体电压:显示腔体对前向电压和束流驱动信号的响应。
  • 反射电压:显示腔体的反射电压,其值等于总腔体电压减去前向电压。

通过这种方式,您可以看到脉冲射频驱动和束流电流对腔体的响应,并观察到前向电压、腔体电压和反射电压的时域行为。

example-sim-ncav-pulse.png