解决方案

RP 系列 | 使用 RP 光纤功率软件进行超短脉冲仿真

显示了如何在超短脉冲(例如锁模光纤激光器,体激光器,再生放大器和光纤放大器)中进行数值模拟-特别是使用 RP Photonics 的 RP Fiber Power 软件。所使用的概念涉及功能调用,而不是用于通过各种光学组件发送脉冲的命令,因此具有极高的灵活性,从而允许用户实施相当复杂的仿真。

从V4开始,我们的软件 RP Fiber Power 可用于模拟超短脉冲的传播。对于许多人来说,了解其工作原理可能会很有用,无论您已经拥有该软件,还是考虑将其用于研究和开发。我们在该领域进行了实质性的软件改进。


这些功能不仅限于光纤中的脉冲传播,还将介绍如何考虑各种其他光学元件。因此,如果您正在使用锁模体激光器或再生放大器,请确保同样可以将相同的软件应用于此。到目前为止,仅对于同步泵浦光学参量振荡器和放大器,该软件不可用。


对于打算使用 Matlab 或其他编程环境自己开发此类仿真的人来说,本文也应该是有用的。然而,实现超短脉冲与光学组件相互作用的所有细节。对于某些元素而言,这非常简单,而对于其他元素(例如,光纤,甚至可能是活性纤维),这是一件相当复杂的事情。尽管这样做可能会学到很多东西,但是您肯定会花费很多时间。使用此类功能的软件,您可以专注于物理学和技术,可以快速地获得所需的结果。本质上,是要开始大型学习活动还是要快速产生结果的其他需求。使用此类软件时,您还将学到很多有关物理的知识。


概念


模拟 RP 光纤功率中超短脉冲传播的基本概念与我们早期产品 RP ProPulse 的概念不同。我们首先不介绍软件系统,我们使用脚本语言的某些功能来定义或加载初始脉冲,然后再通过光学元件发送该脉冲。可以使用其他功能来检索“当前脉冲”的各种属性,即当前(在看到某些元素之后)的脉冲。

这种方法的优点是它最灵活。提到的函数可以在任何表达式中使用,并且我们可以利用这些表达式的强大控制结构:if-then 语句,while-do 循环,for 循环,repeat-until 等。您可以通过多种方式使用此类表达式,例如,进行各种初始化,也可以在生成任何图形图的过程中使用。事实证明,这种灵活性对于任何实际的研究或开发工作都是必不可少的。


示例:锁模光纤激光器


在大多数情况下,主要是在锁模激光器的稳态下获得的脉冲。通常,由于它是由涉及光学增益和损耗(可能与波长有关),色散,光纤非线性,饱和吸收等复杂的相互作用而导致的,因此无法直接计算出该稳态。在大多数情况下,仅能模拟稳态的演化。一定数量的谐振器往返行程中的一些初始脉冲,希望系统在合理数量的往返行程中将接近稳态。在某些情况下,没有这样的稳定状态。有不稳定的激光器,其研究当然在科学上也很有趣。我们也注重喜欢研究启动过程的细节。

初始脉冲的细节通常并不严格;您只是不想离开稳定状态就可以快速达到目标。您只需粗略地猜测诸如脉冲能量和持续时间之类的参数,并生成高斯未扰动的起始脉冲,例如:

; Parameters:

l_s := 1060 nm { center wavelength }

T_range := 25 ps { width of temporal range }

N_t := 2^10 { number of grid points }

dt := T_range / N_t { temporal resolution }

E0 := 10 nJ { initial pulse energy }

tau0 := 1 ps { initial pulse duration }

chirp0 := 0 GHz / ps { initial chirp }

calc { evaluate the following composite expression }

begin

set_pulse_grid(T_range, N_t, l_s); { define the pulse grid }

startpulse_G(E0, tau0, chirp0); { generate the start pulse }

end


基本上由时间范围的宽度,数值点的数量和中心波长定义的,脉冲网格必须足够大,能够很好地容纳所有阶段的脉冲。同样,时间分辨率必须足够高以适应整个脉冲带宽。对于许多批量激光器模拟,256个点就足够了,但是对于强c脉冲(在光纤激光器中经常发生),则可能需要1024个点甚至更多点。(对于超连续谱的生成,可能甚至需要数万个。)

在某些时候,您必须定义所涉及的纤维。从本质上讲,需要为每个模型定义一个用于连续波仿真的模型,此外,还要为其分配一些超短脉冲传播所需的属性:本质上,是色散和非线性指数,在某些情况下,还需要更多有关受激拉曼散射的详细信息(此处不予考虑)。以下是线性谐振器中具有有源和无源光纤的模型的使用代码,其中不包括各种参数的定义:

calc { define the fibers }

begin

{ active fiber: }

set_device(1);

set_fiber(L_active, 20, 'Yb');

add_ring(r_co, N_Yb);

pump := addinputchannel(P_pump_in, l_p, 'I_p', 0, forward);

signal_active_fw := addinputchannel(0, l_s, 'I_s', 0, forward);

signal_active_bw := addinputchannel(0, l_s, 'I_s', 0, backward);

set_GVD(GVD_af);

set_n2(n2_f); { nonlinear index }

finish_fiber();

{ passive fiber: }

set_device(2);

set_fiber(L_passive, 5, '-');

signal_passive_fw := addinputchannel(0, l_s, 'I_s', 0, forward);

signal_passive_bw := addinputchannel(0, l_s, 'I_s', 0, backward);

set_GVD(GVD_pf);

set_n2(n2_f); { nonlinear index }

finish_fiber();

end;


通常假定起始脉冲是刚好在到达输出耦合器之前的腔内脉冲。因此,造成一些损耗的输出耦合器将成为谐振器往返中首先看到的光学元件。之后,循环脉冲可能会看到有源光纤,一根或多根无源光纤,可饱和吸收器和/或光调制器,以及其他光学元件。定义执行完整谐振器往返的函数通常很方便:

DoResonatorRoundTrip() :=

{ Simulate one resonator round-trip of the pulse. }

begin

global allow all;

pp_multiply_expr_f('r_FBG%(f)');

{ fiber Bragg grating as output coupler }

pp_fiber(1, signal_active_fw); { active fiber }

pp_fiber(2, signal_passive_fw); { passive fiber }

pp_sat_abs(dR_S, tau_S, E_sat_S); { SESAM }}

pp_loss(loss_S); { loss in SESAM }

pp_fiber(2, signal_passive_bw); { passive fiber }

pp_fiber(1, signal_active_bw); { active fiber }

pp_center(1); { center the pulse }

calc_dyn(0, T_rt, T_rt);

{ dynamical simulation of gain recovery }

end


我们的示例基于线性谐振器,在到达另一端(SESAM,可饱和吸收器)之后,我们函数中使用的各种参数必须在其他地方定义。

最后一个函数调用在一个往返时间内模拟光纤的泵送,以补充存储的能量。此后,很容易模拟一些往返行程并在这些之后显示腔内脉冲的一些参数:

calc

for j := 1 to 1000 do

begin

DoResonatorRoundTrip();

store_pulse(j);

end

show "Energy: ", E_p():d3:"J"

show "Duration: ", tau_p():d3:"s"

show "Bandwidth: ", dl_p():d3:"m"


在这里,我们还存储了所有脉冲,以便以后可以调用它们以进行其他计算和生成图表,还可以使用交互式脉冲显示窗口检查它们。

这里显示的简单方法实际上存在一个问题:通常需要进行大量往返操作,直到光纤的增益稳定在最终水平。本质上,存在弛豫振荡只有经过大量往返之后,这些信息才会消失。如果您想学习这些,那就很好了。但是,如果您想快速找到稳定状态,则可以应用一些其他技巧:使用几行代码(此处未显示),您可以在每次往返过程中根据脉冲能量重新计算光纤的增益,只需好像增益可以立即做出响应。这样,您可以有效地抑制张弛振荡,并更快地获得最终结果。另一种可能性是人为地将增益饱和度大幅度提高(例如100),同时将有效脉冲重复频率降低相同因子。这将非常有效地加速弛豫振荡,从而极大地节省了计算时间。

当然,另一个问题是您可能不确定要达到稳定状态需要往返多少次。因此,您可能想要定义一个模拟往返的函数,直到基本脉冲属性(能量,持续时间,带宽)不再实质改变为止:

FindSteadyState(tol, N_max) :=

{ Find the steady state,

defined by the time where the relative changes

of E_out and tau are less than tol for 3 successive steps

Return 1 if steady state is found within N_max steps,

0 otherwise. }

begin

var n_sc, N, E1, E2, tau1, tau2, df1, df2;

N := 0; { number of round trips }

n_sc := 0;

{ number of round trips with small change of pulse parameters }

E1 := E_p(); tau1 := tau_p(); df1 := df_p();

repeat

inc(N);

DoResonatorRoundTrip();

E2 := E_p(); tau2 := tau_p(); df2 := df_p();

if abs(E2 / E1 - 1) <= tol

and abs(tau2 / tau1 - 1) <= tol

and abs(df2 / df1 - 1) <= tol

then inc(n_sc)

else n_sc := 0;

E1 := E2; tau1 := tau2; df1 := df2;

until n_sc = 3 or N >= N_max;

(n_sc = 3);

end


然后,您可以随时调用该函数以有效地计算出稳态。如果有效,它将返回1;如果在给定的最大往返次数内找不到稳态,它将返回0。您可以根据情况轻松修改该策略的详细信息。

我们为您提供该功能的应用示例。假设我们要生成一个图,在该图中我们要绘制稳态脉冲能量和持续时间作为泵浦功率的函数:

"Variation of Pump Power"

x: 400, 600

"pump power (mW)", @x

y: 0, 20

frame

! for x := CS_x1 to CS_x2 step 20 do

begin

set_device(1); { active fiber }

set_P_in(pump, x * mW);

if FindSteadyState(0.01, 1000) then

begin

point(x + i * E_p() / nJ, "R");

{ filled rectangle for pulse energy in nJ }

point(x + i * tau_p() / ps, "t");

{ open triangle for pulse duration in ps }

end;;

end


其他情况


上面的示例向您展示了如何在不使用太多代码的情况下实现相对复杂的仿真。以下是一些针对可能情况的示例:

考虑一个由种子激光器的连续脉冲序列馈送的放大器系统。同样,您可以模拟脉冲能量如何向稳态发展。您还可以研究,例如,如果您在脉冲之间有随机的时间间隔,或者只是缺少一些脉冲,或者是一系列脉冲串,或者泵浦功率或种子脉冲的特性发生波动等,那么它是如何波动的。

甲再生放大器工作使得一个有时注入种子脉冲,然后让它在演变一定数量往返,然后喷射它。在抽运放大器晶体一段时间后,可以执行下一个放大周期。在这里,可以轻松实现一种功能,该功能可以在给定数量的谐振器往返行程下模拟完整的放大周期。同样,可以使用一种函数来模拟这种放大循环,直到达到稳态为止。有些系统会出现分叉甚至混乱的情况,请参阅一些在线示例案例。


其他光学元件


在上面的示例中,您已经了解了如何通过不同的光纤发送脉冲,以及如何应用具有某些光学损耗或某些饱和吸收的光学组件。应用其他光学组件还有许多其他功能:

pp_dispersion()用于应用色散高达4阶

pp_multiply_expr_f()用于将脉冲的频域幅度乘以与频率相关的因子,例如,用于施加任意色散(相移)或带通滤波器;可以在时域中完成类似的操作,例如对于光调制器

pp_prism_pair()和pp_grating_pair()用于分别使用给定参数(例如间距,每毫米的行数等)应用棱镜对或光栅对的色散。

pp_compress()用于自动优化的色散压缩器(最高4阶)

pp_noise()用于添加一些随机噪声

pp_SPM()用于具有自相位调制的光学元件

pp_add_pulse()用于相干地添加脉冲,例如在干涉仪的模拟中或附加脉冲模式锁定中

这些组件使您能够模拟所有常见类型的设置,以生成或操纵超短脉冲,仅(到目前为止)没有参数非线性增益。

所有这些都经过精心开发。举个例子,意识到像 pp_multiply_expr_f()和pp_prism_pair()之类的函数通常使用相同的参数多次应用。因此,我们实现了这些功能,以便存储从频域脉冲幅度获得的频率相关因素,并可以在以后的函数调用中重新使用这些因素。即使在仿真中使用了多个参数集,该方法也有效。由于用户甚至不必考虑这些技巧,因此此类计算的性能可能会非常高。