解决方案

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

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

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

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

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


概念

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

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


示例:锁模光纤激光器

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

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

参数:

ls:= 1060 nm {中心波长}

T_range:= 25 ps {时间范围的宽度}

N_t:= 2 ^ 10 {网格点数}

dt:= T_range / N_t {时间分辨率}

E0:= 10 nJ {初始脉冲能量}

tau0:= 1 ps {初始脉冲持续时间}

chirp0:= 0 GHz / ps {初始chi}

calc {计算以下复合表达式}

开始

set_pulse_grid(T_range,N_t,l_s);

{定义脉冲网格}

startpulse_G(E0,tau0,chirp0);

{产生起始脉冲}

结尾


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

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

calc {定义纤维} 开始

calc {定义纤维} 开始

set_device(1);

set_fiber(L_active,20,'Yb');

add_ring(r_co,N_Yb);

泵:= addinputchannel(P_pump_in,l_p,'I_p',0,转发);

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

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

set_GVD(GVD_af);

set_n2(n2_f); {非线性指标}

finish_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,向后);

set_GVD(GVD_pf);

set_n2(n2_f); {非线性指标}finish_fiber();

结尾;


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

DoResonatorRoundTrip():=

{模拟脉冲的一个谐振器往返行程。}

开始

全球允许所有人;

pp_multiply_expr_f('r_FBG%(f)');

{光纤布拉格光栅作为输出耦合器}

pp_fiber(1,signal_active_fw); {主动光纤}

pp_fiber(2,signal_passive_fw); {无源光纤}

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

pp_loss(loss_S);

{SESAM损失}

pp_fiber(2,signal_passive_bw);

{无源光纤}

pp_fiber(1,signal_active_bw);

{主动光纤}

pp_center(1);

{使脉动居中}

calc_dyn(0,T_rt,T_rt);

{增益恢复的动态模拟}

结尾

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

最后一个函数调用在一个往返时间内模拟光纤的泵送,以补充存储的能量。

此后,很容易模拟一些往返行程并在这些之后显示腔内脉冲的一些参数:

计算对于j:= 1到1000

开始

DoResonatorRoundTrip();

store_pulse(j);

结尾


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

最后一个函数调用在一个往返时间内模拟光纤的泵送,以补充存储的能量。

此后,很容易模拟一些往返行程并在这些之后显示腔内脉冲的一些参数:

计算对于j:= 1到1000

开始

DoResonatorRoundTrip();

store_pulse(j);

结尾

显示“能量:”,E_p():d3:“ J”

显示“持续时间:”,tau_p():d3:“ s”

显示“带宽:”,dl_p():d3:“ m”

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

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

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

FindSteadyState(tol,N_max):=

{找到稳定状态,

由相对变化的时间定义

E_out和tau的连续三个步骤的

总和小于tol。

如果在N_max个步骤内找到稳定状态,则返回1,

否则为0。}

开始

var n_sc,N,E1,E2,tau1,tau2,

df1,df2;

N:= 0; {往返次数}

n_sc:= 0;

{脉冲参数变化很小的往返次数}

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

重复

inc(N);

DoResonatorRoundTrip();

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

如果abs(E2 / E1-1)<= tol

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

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

然后inc(n_sc)

否则n_sc:= 0;

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

直到n_sc = 3或N> = N_max;

(n_sc = 3);

结尾

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

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

“泵功率的变化”

x:400、600

“泵浦功率(mW)”,@ x

y:0、20

框架

!对于x:= CS_x1至CS_x2步骤20

开始

set_device(1); {主动光纤}

set_P_in(泵,x * mW);

如果FindSteadyState(0.01,1000)

然后开始

点(x + i * E_p()/ nJ,“ R”);

{实心矩形,以nJ为单位的脉冲能量}

点(x + i * tau_p()/ ps,“ t”);

{脉冲持续时间以ps为单位的空心三角形}

结尾


其他情况

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

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

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


其他光学软件

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

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()之类的函数通常使用相同的参数多次应用。因此,实现了这些功能,以便存储从频域脉冲幅度获得的频率相关因素,并可以在以后的函数调用中重新使用这些因素。即使在仿真中使用了多个参数集,该方法也可以工作。由于用户甚至不必考虑这些技巧,因此此类计算的性能可能会非常高。

希望您已经看到拥有如此强大的工具会非常有趣。研究人员可以使用它来相对快速地进行相当复杂的研究,并且在行业中,您可以快速分析系统的行为以优化系统或了解某些特性。另一种选择是在盲飞模式下工作–在实践中效率不高……

当然,超短脉冲仿真不是一件容易的事,涉及很多物理问题,也涉及很多重要的实践方面。因此,不仅要拥有一些好的软件,而且要获得强大的技术支持也很重要。