对于光纤中的强放大光信号,通常需要使用两个甚至更多的光纤放大级。例如,可能需要滤除阶与阶之间的ASE或反向传播的光,或者可能需要在不同级使用不同的光纤(例如,对于功率放大器,使用更大的有效模面积和包层泵浦)。在这里,我们想分享一些关于如何用我们的软件RP Fiber Power建模这样的多级放大器的想法。

 

每个阶段一个脚本

概念上最简单的方法是为不同的阶段使用单独的模拟脚本,或者使用交互式表单对它们建模。这可能是一种适当的方法,特别是如果每个阶段都需要在进行下一阶段之前详细分析和优化。

 

一个具有实际重要性的问题可能是如何在不同的模拟之间传输数据。在简单的情况下,它可能只是一个恒定的信号输出功率,需要作为下一级的输入功率;您可以手动传送。但是,也可能有一个完整的ASE频谱要转移,即一整个功率值阵列。在超短脉冲放大的情况下,需要转移整个脉冲,例如在时域或频域用复杂的振幅表示。自然的解决方案是将这些数据保存到一个或多个文件中,然后脚本可以在下一个阶段读取这些文件。这只需要更多的代码,但是我们强大的脚本语言允许您保存和加载任何数据。您甚至可以在交互式表单中使用它,可以为此类任务注入一些脚本代码。

 

在如下情况下,可能会遇到这种简单方法的局限性:

如果第一个放大级的某些细节被修改,您将需要再次手动启动后续阶段的模拟——如果这种情况经常发生,这将是一个痛苦的过程。

 

制作包含多个阶段输出的图(如图1所示)是可能的,但同样需要保存和加载数据,这可能有点不方便。

 

简单的方法在阶与阶之间相互作用的情况下失败了。例如,设想第二个放大器级的反向ASE或剩余泵浦功率会影响第一个放大器级。为了计算自洽状态,显然不能再单独考虑阶段。

 

图1:包含两个有源光纤的光纤激光器的光功率变化。这个例子摘自之前的一篇文章。

 

一个脚本有几个阶段

确实经常需要(或者只是更方便)制作一个单独的模拟脚本来处理多个放大阶段(甚至可能是种子激光器,例如锁模激光器)。

 

如何在一个脚本定义和处理不同的放大器阶段?

接下来的问题是,如何使用不同的stages的索引作为参数的函数来处理不同的stages。解决方案很简单:为了告诉RP Fiber Power 软件接下来会发生什么,您可以使用一个函数调用像set_device(2)——例如,光纤的定义相应的光学通道,或计算数据的检索,是指第二个设备,这可能是第二次放大级。

 

下面,我们向你您展示一些计算双级光纤放大器稳态的示例代码,其中信号从第一级到第二级,而一些从第二级的剩余泵浦光进入第一级(ASE被忽略)。假设已经定义了光纤及其光通道,则可以使用以下函数来计算稳态:

 

find_steady_state(P_s_in, P_p1, P_p2) :=  begin    global allow all;    var P_s_fw, P_p_bw, NoSteps;    NoSteps := 0;    set_device(1);      set_P_in(pump1_fw, P_p1);    set_P_in(signal1, P_s_in);    repeat         inc(NoSteps);      P_s_fw := P_out(signal1);      set_device(2);            set_P_in(pump2_bw, P_p2);      set_P_in(signal2, P_s_fw);                 P_p_bw := P_out(pump2_bw);                     { backward pump power left over by the second stage }      set_device(1);                   set_P_in(pump1_bw, P_p_bw);    until abs(P_s_fw - P_out(signal1)) < 0.01 mW;              NoSteps;  end


您看,即使那些没有看过手册的人也可以很容易地猜出代码的不同元素在做什么。在调用该函数时,您告诉它的信号输入功率和泵的两个阶段,第一阶段和函数返回找到稳态所需的迭代次数(可能通常是2)。此后,您可以检索任何输出,例如,显示两个阶段后的信号输出功率(3位有效数字和单位瓦):

 

calc find_steady_state(1 mW, 150 mW, 1600 mW)show "P_s1: ", (set_device(1); P_out(signal1)):d3:"W"show "P_s2: ", (set_device(2); P_out(signal2)):d3:"W"


创建一个图表也是没有问题的,例如,在给定泵功率的固定值下,将最终信号输出功率显示为信号输入功率的函数:

 

diagram 1: "Signal Output vs. Signal Input" x: 0, 20"signal input power (mW)", @xy: 0, 1500"signal output power (mW)", @y f: (find_steady_state(x * mW, 150 mW, 1600 mW);    set_device(2);    P_out(signal2) / mW),  color = blue


在超短脉冲放大的情况下也可以做类似的事情。您可以只创建一个开始脉冲(例如,给定参数的高斯脉冲,或从文件读取的脉冲,或从锁模激光模型在同一脚本中的稳态输出),然后通过不同的阶段发送。您可以用连续波计算来准备关于它的激光活性离子的激发状态的每个阶段(例如,根据信号的平均功率,计算为脉冲能量和脉冲重复率的乘积),或在打开恒定的泵浦功率(或任何其他泵浦功率的时间剖面)后模拟重复放大。您还可以定义一个函数,让它执行某些迭代步骤,直到达到稳定状态。这些只是例子-您可以做任何您想做的事情!

 

脚本与图形界面

其他一些产品(例如VPIphotonics)使用完全不同的方法来建模多个放大器级的系统。在那里,您交互式地在桌面放置一些放大器阶段的符号,并将它们与象征它们之间的光流的线连接起来。通过右键单击相应的符号并在获得的弹出式表单中输入数据,可以修改放大器级的详细信息。例如,进一步的工具可以帮助您制作图表。

 

乍一看,您可能认为这种GUI方法比编写带有如上所示元素的脚本更容易。其实,虽然这在最简单的情况下可能是正确的,但当您需要在研发工作中做更复杂的事情时,您很快就会发现这种方法固有的局限性。即使用户界面足够强大,例如允许您生成图,计算量显示为一个函数的输入参数,但您可能经常需要做更复杂的事情。想象一下,如果您需要进一步的数学处理计算数据——例如,在随机噪声的影响下存储随后的放大脉冲,并使用傅里叶变换和相关的东西(如应用窗口功能)来计算噪声频谱。即使软件足够好,可以将脉冲的相关参数存储在一个文件中,将所有的数据转移到其他软件仅仅进行数学处理也会很不方便。如果您可以在模拟脚本中完成所有操作,那么这是最简单的。

 

MATLAB接口可以解决这个问题吗?

顺便说一下,有一些软件包有一个接口,例如MATLAB,这样您就可以用MATLAB控制模型(例如自动改变一些参数),并在MATLAB中处理结果。这样就增加了很大的灵活性,但这是有代价的。首先,您需要有MATLAB许可证,并对其足够熟悉。其次,您必须查明如何确切地处理该接口。第三,与我们的RP Fiber Power软件相比,执行速度可能会相当慢。

 

其他人可能会考虑在MATLAB中完成所有的工作——这是另一个使用脚本进行计算的环境。但是,这意味着巨大的工作量,因为您将不得不执行许多复杂的光学和物理计算,而不是处理您的实际问题。

 

由于这些原因,我们决定在我们的RP Fiber Power 软件中使用脚本方法,它仍然可以与交互式表单结合,甚至可以与用户定义的表单结合。这为您提供了无与伦比的灵活性,而且使用起来也很好。