FDTD 光栅耦合器 转换效率计算
最近在折腾光栅耦合器的仿真,发现转换效率计算这块儿总是容易踩坑。今天咱们就手把手撸个简易版FDTD(有限差分时域法)流程,重点看看怎么从时域数据里把转换效率榨出来。先上段Python伪代码热热身:
period = 1.55e-6 # 光栅周期
duty_cycle = 0.5 # 占空比
n_teeth = 20 # 光栅齿数
搞过硅光的小伙伴都知道,占空比这个参数贼敏感。上次我把0.5手滑写成0.6,结果耦合效率直接腰斩。所以代码里最好加个参数校验:
assert 0 < duty_cycle < 1, "占空比必须介于0到1之间,你丫想搞事情?"
在FDTD里监测功率流,得在合适的位置摆power monitor。举个栗子,我们要监测入射波导和输出波导的功率:
# 设置监视器
source_power = setup_source_monitor()
output_monitor = setup_output_monitor(z_position=10e-6)
重点来了——怎么从时域信号里提取有效功率?新手容易直接取瞬时值,这绝对扑街。正确的姿势是做傅里叶变换:
# 转换效率计算核心代码
freq, source_spectrum = fft(source_power)
_, output_spectrum = fft(output_monitor)
# 找到目标波长对应的频点
target_idx = np.argmin(np.abs(freq - c / 1.55e-6))
eta = np.abs(output_spectrum[target_idx])**2 / np.abs(source_spectrum[target_idx])**2
print(f"转换效率:{eta*100:.1f}%")
这里有个坑要注意:FFT后的频谱是复数,直接取模平方才是功率。有次我忘记取模,算出来效率超过100%,当场表演牛顿的棺材板按不住。
网格划分也是大问题。光栅边缘用默认网格大概率翻车,得手动加密:
# 光栅区域网格加密
mesh = fdtd.Mesh()
mesh.add_slab((0, period*duty_cycle), material='Si', dx=5e-9)
mesh.add_slab((period*duty_cycle, period), material='SiO2', dx=5e-9)
见过最狠的案例是:有人把网格从20nm加密到2nm,效率曲线突然出现个尖峰——原来是之前没采到倏逝波的高频分量。
最后给个实战小技巧:跑完时域仿真后,把电场分布导出做成动图。肉眼观察波导模式的形成过程,比死磕数据表格直观多了。特别是当看到光脉冲在光栅齿间反复横跳,最后乖乖钻进波导时——这酸爽,谁试谁知道。
(代码示例基于Python环境,实际FDTD实现可能需要使用Meep/Lumerical等专业工具,文中参数取值仅作示意)

1万+

被折叠的 条评论
为什么被折叠?



