21 模拟超短脉冲传播
RP Fiber Power可以模拟超短脉冲的传播。不仅可以模拟光纤放大器的单通传输,还可以模拟其他光学元件(例如可饱和吸收器或光谱滤波器)的效应。我们可以将这种效应应用于任何序列的脉冲,例如,这样可以模拟锁模光纤激光器中的脉冲演化,该激光器的谐振腔包含多个光学元件。
前面解释了基本原则。要实现模拟,必须执行以下步骤:
定义数值网格
脉冲的数值网格必须用一个类似set_pulse_grid(T, N, lambda)的函数调用来定义,其中T是时间范围的宽度,N是数值样本的数量(必须是2的幂,最多220),lambda是中心波长。确定数值参数的一些提示:
时间宽度T必须足够大,以完全包含时间脉冲分布(不仅对于初始脉冲,而且对于整个传播)。频率分辨率时网格的时间宽度的倒数。
注意,模拟受激拉曼散射需要高的时间分辨率。对于二氧化硅光纤,时间分辨率应优于10 fs。
在频域中,分辨率为1/T(即网格时间宽度的倒数),总覆盖光谱范围为N/T。该范围必须足够大,以完全包含光谱脉冲分布。
正确选择这些参数是用户的责任。如果数值分辨率增加一倍,可以通过将T和N加倍(使用双倍的时间范围,但相同的光谱范围)或仅将N加倍(使用双倍的光谱范围)来检查结果是否有显著变化。
数字样本的数量可能非常大——有时可能需要N=216甚至218,尽管在大多数情况下,28或210这样的值是完全足够的。大量的数据意味着计算速度变慢,需要更多的内存。这可能会限制主内存中可以保存的脉冲数。
定义初始脉冲
必须定义初始脉冲。在最简单的情况下,我们使用高斯形状的脉冲,调用startpulse_G(E,tau,chirp),其中E是脉冲能量,tau是脉冲持续时间(半最大全宽),chirp是啁啾参数(光学频率变化的速率,单位为Hz/s)。假设光谱最大值在所选信道的中心波长处。
同样,可以用startpulse_s(E,tau,chirp)获得sech2形状脉冲。这种脉冲形状(没有啁啾)是基本孤子脉冲的典型特征。
对于基于时间脉冲分布定义任意初始脉冲,可以调用startpulse_t("A0%(t)"),其中参数是以前定义的复包络函数A0%(t)。同样,使用startpulse_f("A0%(f)")可以确定光谱分布,由函数A0%(f)定义,其中f是(绝对)光频率。这样一个函数分别在所有时间或频率上的平方模的积分是脉冲能量。
最后,还可以使用先前用函数store_pulse(j)存储的脉冲,其中j表示存储索引(例如0)。我们可以用startpulse_recall(j)使用这个脉冲。
定义光纤详细信息和光纤特定模拟参数
如果脉冲要通过光纤传输,首先必须通过某些函数调用定义一些额外的光纤参数:
波长相关的背景损耗(不是来自激光活性掺杂剂,而是来自杂质和散射)可以用set_bgloss(loss[])来定义,其中参数是一个包含长相关损耗值的数组,单位为db/m。在使用set_bgloss()之前,必须定义和填充该数组。除了光纤的波长无关的背景损耗外,还应用这些损耗(请参见addinputchannel())。
群速度色散(GVD)用set_GVD(GVD)定义。这定义了一个恒定的群速度色散(单位为s2/m)。如果GVD与波长相关,则可以调用s_GVD_l("GVD_fiber(l)"),其中参数是一个取决于波长l的表达式(在示例中,GVD函数GVD_fiber(l)已预先定义)。或者,可以使用set_n_eff("n_eff(l)")来定义波长相关的有效折射率函数。
如果函数pp_fiber_2p()用于通过光纤发送两个脉冲,则默认情况下,第二个脉冲将看到与第一个脉冲相同的群速度色散。但是,可以调用函数set_GVD2()、set_GVD_l2()或set_n_eff2()(与上面描述的函数类似,调用这些函数后),为第二个脉冲定义不同的色散。
非线性指数可以用函数set_n2(n2)来定义。(参数必须是以m2/W为单位的实际数值,例如,二氧化硅为2.6e-20。)加上光信道的有效模式面积,这决定了非线性的强度。
set_ss(s)定义自陡峭系数。如果给定值为1,则取自陡效应的正常值。如果非线性折射率和光纤的有效模式面积与波长无关,这是合适的。我们可以用较大的数值来模拟非线性折射率波长依赖性和有效模式面积的影响。
set_dnr("h_R(t)",f_R)定义了导致拉曼散射的延迟非线性响应的参数。(对于纯自相位调制,可以省略这一点。)第一个参数是(先前定义的)拉曼响应函数。f_R是介于0和1之间的参数,它规定了延迟非线性响应的相对强度。
如果函数pp_fiber_2p()用于通过光纤发送两个脉冲,则可以使用函数set_XPM(x)设置非线性互(本质上是交叉相位调制)的强度。这里,x是一个无量纲参数,默认值是2。这意味着脉冲1每瓦功率脉冲2的相位变化是自相位调制的2倍。这是两个脉冲以相同的偏振方向在同一光信道中传播的情况。如果偏振方向是线性但相互正交的,并且介质是各向同性的(例如玻璃),则x的正确值为2/3。例如,还可以修改该值以考虑减少的空间重叠。
set_TPA(beta)定义双光子吸收(TPA)的系数。根据
,时间域中的光功率衰减,其中β是一个单位为m/W的系数,Aeff是强度分布的有效面积。请注意,TPA与大多数光纤无关。
如果不需要模拟增益饱和的影响,可以调用函数set_gain_sat(0)。在参数1中,增益饱和通常被处理;这是默认值。较大的值可用于模拟多次通过或多次脉冲时的增益饱和。请注意,此函数(如本节所述)仅适用于脉冲模拟,而不适用于连续波模拟。
set_auto_center(1)在每个传播步长后,激活时间域中脉冲的自动中心。这意味着脉冲不能“消失”。通过使用参数0调用函数,可以再次关闭该设置。
set_fiber_step_expr(expr$)定义了一个表达式(字符串形式),该表达式将在光纤中的每个数值步长之后进行计算。这可用于许多目的,例如,设置某些变量或在满足某个条件时显示某些内容,用于衰减或滤除光纤中的脉冲或使其在时间域居中。有关详细信息,请参阅在线文档。
对于活性(放大)光纤,准备正确的光纤初始状态是很重要的。例如,如果在无信号输入的情况下长时间泵送光纤后放大脉冲,则可以计算出无信号输入光纤的稳态。
如果一个高重复率的脉冲串被放大而且稳态是重要的,我们首先计算出连续波信号的输出功率,其功率等于脉冲串的平均功率。(对于宽带脉冲,可能需要组合多个信号信道才能正确模拟脉冲频谱。)
严格地说,所解释的方法不会得到精确的自洽解,因为脉冲频谱在传播过程中可能发生变化,这也会影响脉冲的实际放大器增益。然而,这很少是一个重大问题。如果是这样,就必须模拟一系列放大通过和泵浦相位;在这种情况下,需要技术支持。
所使用的算法自动监控数值精度,并相应地调整z方向的数值步长尺寸。默认设置通常应该是适当的。它们导致相当高的精确度。尽管如此,计算时间并不比可能的长得多,即使精度大大降低。
通过调用函数set_pulse_tolerance(tol),可以修改所需的精度(影响自动步长尺寸控制),其中tol是介于10-6(1e-6)和10-1之间的值。默认值为10-2,这意味着时间或频率综合振幅误差的平方根约是脉冲能量平方根的10-2倍。如果需要高精度,计算时间可能更长,并且在某些情况下可能无法达到所需的精度(这会导致数值错误,从而中止计算)。但是,如果使用负参数调用函数set_pulse_tolerance(),则将脉冲公差视为其模数,并应用附加规则:即使使用尽可能最精细的数值步长也无法达到所需的精度,也不会触发错误。
请注意,数值误差只能由软件估计,因为精确解未知。用于估计数值误差大小的方法相当保守。因此,实际达到的精度通常比预期的要高得多。
另外,请注意,对于超短脉冲传播,可以忽略光纤端面的反射率,发射率可以用set_R()函数定义。同样适用于局部损耗.
通过光学元件传播
许多函数可用于通过各种光学元件传播当前脉冲。以下列表仅简要介绍这些函数;
pp_fiber(fn, ch)使用光信道ch通过光纤fn传播脉冲。光纤编号fn通常为1,但如果使用set_device()定义了不同的光纤,则可能不同。指定的光信道决定了脉冲的传播方向(向前或向后)、强度分布(与非线性效应相关)和背景损耗。当脉冲从另一端离开光纤时,产生的脉冲将是这个脉冲。
通过函数get_pulse(z),可以在光纤中的特定位置获得脉冲,但必须在调用pp_fiber()之后才能获得。
pp_fiber_2p(fn, ch1, ch2,p2_in, p2_out)通过光纤fn传播两个不同的脉冲,它们可以通过非线性相互作用。光纤编号fn通常为1,但如果使用set_device()定义了不同的光纤,则可以不同。两个脉冲的光信道ch1和ch2可以相同或不同。当第一个脉冲取自当前脉冲时,第二个脉冲取为索引p2_in的存储脉冲(见函数store_pulse()),交互后的第二个脉冲将用索引p2_out存储。在光纤中的某个位置的第二个脉冲可以用get_pulse2()获得。
注意,两个脉冲原则上也可以组合在一个时间或频率轨迹中,并通过pp_fiber()传播。但是,如果脉冲的中心波长非常不同,那么pp_fiber_2p()更适合。在这种情况下,使用pp_fiber()时,频率轨迹必须非常宽。
pp_dispersion(D2, D3, D4)采用二阶、三阶和四阶的色度色散。这些参数的单位分别为s2、s3和s4。
pp_compress(order)计算脉冲的色散压缩。函数调用的参数确定压缩的详细信息:
如果为零,则假设一个完美的压缩机,将所有频率的光谱相位设置为零。
如果介于2和6之间,则应用达到相应阶数的色度色散,以使压缩脉冲的峰值功率最大化。
如果它在-2和-6之间,则应用达到相应阶数(参数的模数)的色度色散,以使压缩脉冲的持续时间最小化。
pp_grating_pair(g, d, m,theta, f)应用于一对衍射光栅(用于传输或反射)的色度色散(所有阶数),线间距g,垂直距离d,衍射阶数m(通常为-1)和入射角theta(光束与法向之间,以弧度表示)。对于负衍射阶数,衍射光束的方向朝着输入光束的方向移动。色散效应乘以系数f,例如,用f=2表示双通。考虑所有的色散阶数,即不仅是二阶色散。
如果某些频率分量不能衍射,它们将在输出中丢失。假设所有能在第一光栅上衍射的频率分量都会撞击第二光栅,并且第一光栅不会阻挡在第二光栅上衍射的任何光。
还有函数dispersion_grating_pair(g, d, m, theta, f, lambda, order),用于计算(但不适用于脉冲)特定波长下特定阶数的色散。
pp_prism_pair(n_expr$,alpha, d, h_tot, l_ref, f)应用于一对棱镜的色度色散(所有阶数)。在这里,n_expr$是将棱镜材料的折射率作为波长l的函数传递的表达式。(例如,它可能是"n_silica(l)",假设已经定义了这样一个函数。)alpha是棱镜的顶角(即输入面和输出面之间的角度,以弧度表示),d是棱镜之间的距离(从顶点到顶点测量),h是光束插入的和(即光束轴和棱镜顶点之间的距离之和)在参考波长l_ref,f是计算的单通色散乘以的系数(例如,对于双通为2)。
函数dispersion_prism_pair(n_expr$, alpha, d, h_tot, l_ref, f, lambda, order)计算(但不应用到一个脉冲)在某些特定波长某特定阶数的色散。
pp_loss(fl)模拟与波长无关的线性损耗。参数是分数功率损耗(例如,10%的损耗为0.10)。对于波长相关的损耗,使用函数pp_multiply_f()(见下文)。
pp_multiply_expr_t(expr$)将整个时间轨迹与从表达式(取决于时间t,可能取决于光功率P)计算的复值相乘,该表达式作为字符串参数给出。这样,就可以模拟具有随时间变化的传输损耗的光调制器的效应。(在线帮助包含更多详细信息。)
ppp_multiply_expr_f(expr$)将整个频率轨迹与从表达式(取决于光频率f)计算出的复值相乘,该表达式作为字符串参数给出。这样,就可以模拟频率相关的损耗。(在线帮助包含更多详细信息。)
pp_multiply_t(f_t%[])将整个时间轨迹(即时间振幅)与具有给定名称的数组内容相乘。
pp_multiply_f(f_f%[])与pp_multiply_t()类似,但在频域中。例如,该函数可用于模拟光谱滤波器或用于具有任意波长依赖性的色度色散。
pp_phase_shift_t(dphi[])使用阵列中的相位变化值改变时域中的光相位。
pp_phase_shift_expr_t(expr$)使用来自取决于时间变量t(可能取决于光功率P)的表达式的相位变化值来改变时域中的光相位。
pp_phase_shift_f(dphi[])使用阵列中的相位变化值改变频域中的光相位。
pp_phase_shift_expr_f(expr$)使用来自取决于光频率f的表达式的相位变化值改变频域中的光相位。
pp_SPM(gamma)应用自相位调制(SPM)发生的非线性光学元件。参数是一个单位为rad/W的非线性系数。
pp_sat_abs(loss, tau, E_sat)应用具有一些初始功率损耗的可饱和吸收体(例如,0.10代表10%),恢复时间tau和饱和能量E_sat。如果恢复时间为非零,则是具有给定初始(不饱和)损耗、恢复时间和饱和能量的缓慢可饱和吸收体。如果恢复时间为零,则是一个快速可饱和吸收体(将损耗瞬间调整为光功率),最后一个参数是饱和功率(而不是能量)。
pp_loss_p(lossfunc$,tau)提供了一种具有功率依赖性损耗的更通用的光学元件。如果第二个参数为零,第一个参数是一个函数的名称,该函数用于确定光功率P的分数损耗(例如,10%损耗为0.10)。在第二个参数tau非零的情况下,函数取决于E,即时间积分入射功率,tau是激发衰减的时间常数。
例如,具有饱和功率P_sat的快速可饱和吸收体可以用以下建模
nl_loss(P) := loss_unsat/(1+P/P_sat)
calc pp_loss_p("nl_loss",0)
而缓慢可饱和吸收体可以用以下建模
nl_loss(E) := loss_unsat*exp(-E/E_sat_a)
calc pp_loss_p("nl_loss",tau_a)
例如,该函数还允许模拟诱导吸收。注意,如果一个时间步长内的饱和值很大,对于一个慢吸收体,这种方法的精度很低。
pp_TPA(beta)应用双光子吸收(TPA)到光学元件。对于较小的吸收,根据
,时域中的光功率是衰减的,其中P(t)是入射功率,β是单位为W-1的系数。对于更大的吸收,输出功率将高于根据公式计算的结果,因为TPA在通过装置的过程中变得更弱。
pp_MPA(beta, n)应用多光子吸收(MPA)到光学元件。对于较小的吸收,根据
,时域中的光功率是衰减的,其中P(t)是入射功率,n是阶数(2到10),β是一个单位为W-(n-1)的系数。对于更大的吸收,输出功率将高于根据公式计算的结果,因为在通过装置的过程中,MPA变弱。
pp_noise(p) 应用白色(频率无关)随机噪声到脉冲。如果参数为正,则参数直接决定噪声功率。如果它是负的,它的模定义了相对于量子噪声极限的噪声功率。
pp_center(w) 将脉冲放在时间域的中心,即移动时间轨迹,使最大功率出现在t=0。如果参数为非零,则时间轨迹边缘的振幅可以“环绕”。使用函数dt_c(),可以获得所有调用pp_center()函数所应用的总时间移位。
pp_shift_t(dt, wrap) 通过dt改变时间脉冲包络(不影响相位)。如果wrap不为零,则振幅可以在时间轨迹的边缘环绕。
pp_shift_phi(dphi) 通过dphi改变整个脉冲的光相位。
pp_add_pulse(j, f%)将指数j的存储脉冲的振幅乘以f%加到当前脉冲上。例如,这可用于干涉仪建模。
在每次这样的函数调用之后,可以使用下一节中介绍的函数获得脉冲属性。可以应用任何光学元件序列。
对于一些线性效应,如频率相关的相移或色度色散,应用于脉冲的复因子被存储起来,如果以后再次应用相同的物理效应,可以重复使用。即使应用了数个不同量的色散,这种方法也有效;软件可以存储多组相位因子。该特性可以大大提高计算速度,例如,对于锁模激光器中许多谐振腔往返的仿真。
获取脉冲属性
现在人们可以用各种函数获得脉冲属性。一些例子:
P_t(t)是时间相关的光功率。
P_p()是峰值功率。
tau_p()是脉冲持续时间(FWHM=半峰全宽)。
P_f(f)返回与绝对光频率有关的功率谱密度,单位为J/Hz。类似地,P_l(l)返回与波长有关的功率谱密度,单位为J/m(当在所有频率或波长上整合这样的功率谱密度时,可以获得脉冲能量)。
df_p()是以Hz为单位的脉冲带宽(FWHM),dl_p()是以米为单位的波长域中的脉冲带宽(FWHM)。
e_p()是脉冲能量。
保存和调用脉冲
脉冲用save_pulse_t(n$)可以保存在一个文件中,其中函数参数是文件名。这将保存时域信息。使用save_pulse_f(n$)可以保存频域信息。在任何情况下,如果需要,加载后将自动重新计算其他域。
可以用load_pulse(n$)加载脉冲文件,其中参数是文件名。数值网格是根据文件中的数据设置的。
如果成功,保存和加载函数将返回值1,否则返回0。
在主内存中也可以存储多达10000个脉冲。这些脉冲可以用0到9999之间的存储索引来区分。可以用store_pulse(j)来存储当前脉冲,然后用recall_pulse(j)来调用它。还可以在交互式脉冲显示窗口(第4.13节)中检查存储的脉冲。
脉冲描述
使用交互式脉冲显示窗口(第4.13节)检查脉冲时,显示脉冲描述可能很有用。例如,它们可以提醒在哪个操作之后获得所示脉冲。这些描述是自动设置的,但是可以用函数describe_pulse(description$)来定义当前脉冲的更有用和更全面的描述,其中参数是带有新描述的字符串。还可以使用函数pulse_description()检索当前脉冲的描述。
调整脉冲轨迹大小
在某些情况下,需要在时域和频域中修改脉冲轨迹的大小。例如,如果对一个脉冲施加大量的色度色散,使其变长,则可能需要先相应地在时域中展开脉冲轨迹。
使用类似set_pulse_size_t(2^10)的函数调用,可以设置修改后的脉冲网格大小,同时保留时域中的数值分辨率。如果新脉冲网格的大小大于旧脉冲网格的大小,则时间轨迹在外部区域获得零;否则,它将被截断。
同样,可以使用类似set_pulse_size_f(2^10)这样的函数调用来更改脉冲网格大小,从而保留频域中的数字分辨率。例如,在通过发生强光谱展宽的高度非线性光纤发送脉冲之前,这可能很有用。
例子
考虑一个简单的例子,高斯初始脉冲在具有恒定二阶色散(GVD)和克尔非线性的光纤中被放大。
将所需的函数调用打包到用户定义的函数中通常比较方便,因为这样很容易重复所有操作,如果以后需要为函数图中的每个点重新进行计算。
假设已经建立了一个名为signal1_fw的信号信道的光纤模型,并且已经计算了光纤的初始状态(例如,对于零输入信号),使用的代码可能如下:
; Parameters of initial pulse:
lambda0 := 1060 nm { center wavelength }
E0 := 0.1 nJ { pulse energy }
tau0 := 100 fs { pulse duration }
chirp0 := 0 { chirp }
; Fiber details for ultrashort pulseamplification:
GVD_f := 20000 fs^2 { per meter }
n2_f := 3e-20 { nonlinear index }
; Numerical parameters:
N_t := 2^10
T := 30*tau0
DoPulsePropagation() :=
begin { define the required inputs }
set_pulse_grid(T, N_t, lambda0);
startpulse_G(E0, tau0, 0);
set_GVD(GVD_f);
set_n2(n2_f); { nonlinear index }
pp_fiber(1,signal1_fw);
end
calc DoPulsePropagation()
{ execute the function now }
show "Pulse energy: ",E_p():d3:"J"
show "final gain: ",sp_gain(signal):d3:np:"dB"
如果以后需要显示输出脉冲能量与输入脉冲能量函数关系的函数图,则该图的代码如下:
f: (E0 := x * nJ; DoPulsePropagation();E_p())
请注意,这将使脉冲在图形之后保持修改状态。为了恢复其初始状态,可以使用以下方法:
f: (E0 := x * nJ; DoPulsePropagation();E_p()),
init E00 := E0,
finish (E0 := E00; DoPulsePropagation())