严格耦合波分析计算光栅衍射效率算法

严格耦合波分析(RCWA,又称傅里叶模态法 FMM)计算光栅衍射效率算法。


一、RCWA 算法核心流程

RCWA 将光栅结构沿 z 轴切片,对每一层进行傅里叶展开:

复制代码
1. 构造介电常数/折射率傅里叶级数 ε(x,y) → [ε]
2. 求解本征方程:([Kx]^2 + [Ky]^2 - ω²μ0[ε]) * E = 0
3. 计算特征向量(模式场)与特征值(传播常数)
4. 利用 S 矩阵(散射矩阵)连接各层,避免数值发散
5. 计算透射/反射端口的 Poynting 矢量 → 衍射效率

二、关键数学模型

1、傅里叶展开

对于周期为 Λ\LambdaΛ 的光栅,介电常数展开为:
ε(x)=∑m=−MMεmejmKx,K=2πΛ \varepsilon(x) = \sum_{m=-M}^{M} \varepsilon_m e^{j m K x}, \quad K = \frac{2\pi}{\Lambda} ε(x)=m=−M∑MεmejmKx,K=Λ2π

2、本征方程

([Kx][Kx]+[Ky][Ky]−ω2μ0[ε])E=0 \left( [K_x][K_x] + [K_y][K_y] - \omega^2 \mu_0 [\varepsilon] \right) \mathbf{E} = 0 ([Kx][Kx]+[Ky][Ky]−ω2μ0[ε])E=0

其中 [ε][\varepsilon][ε] 是 Toeplitz 矩阵


三、MATLAB 核心代码实现

1、 傅里叶级数构造

matlab 复制代码
function [eps_conv] = fourier_epsilon(eps_r, M)
% 计算介电常数的傅里叶卷积矩阵
% eps_r: 实空间折射率分布 (Nx x Ny)
% M: 截断阶数 (-M to M)

[Nx, Ny] = size(eps_r);
eps_conv = zeros(2*M+1, 2*M+1);

% 傅里叶变换
eps_fft = fftshift(fft2(eps_r));

% 填充卷积矩阵 (Toeplitz)
for row = -M:M
    for col = -M:M
        eps_conv(row+M+1, col+M+1) = eps_fft(row+Nx/2+1, col+Ny/2+1);
    end
end
eps_conv = eps_conv / (Nx * Ny); % 归一化
end

2、本征模求解

matlab 复制代码
function [kx, Ey] = solve_modes(lambda, epsilon_mat, M, theta)
% 求解光栅层的本征模
% lambda: 波长
% epsilon_mat: 介电常数傅里叶矩阵
% theta: 入射角

k0 = 2 * pi / lambda;
kx_inc = k0 * sin(theta); % 入射波矢x分量

% 构建波矢矩阵 Kx
Kx = diag(kx_inc + (0:M) * 2*pi/lambda);

% 本征方程: (Kx^2 - k0^2 * epsilon) * E = 0
A = Kx^2 - k0^2 * epsilon_mat;

% 求解广义特征值
[eig_vec, eig_val] = eig(A);
kx = sqrt(diag(eig_val)); % 传播常数
Ey = eig_vec;            % 模式场分布
end

3、S 矩阵算法

matlab 复制代码
function [R, T] = s_matrix_propagation(layers, k0, kx_list)
% S矩阵法连接多层结构
% layers: 每层参数结构体
% k0: 真空波数
% kx_list: 各阶衍射波矢

% 初始化 S 矩阵
S11 = zeros(length(kx_list));
S12 = eye(length(kx_list));
S21 = eye(length(kx_list));
S22 = zeros(length(kx_list));

for i = 1:length(layers)
    layer = layers(i);
    
    % 计算单层传输矩阵 F
    F = exp(1j * layer.kz * layer.thickness);
    
    % 更新 S 矩阵 (递归公式)
    % ... (此处省略具体矩阵运算,保持简洁)
end

% 提取反射率 R 和透射率 T
R = abs(S11).^2;
T = abs(S21).^2;
end

四、1D 光栅衍射效率计算

matlab 复制代码
%% 1. 参数设置
lambda = 1550e-9;      % 波长 (nm)
period = 800e-9;       % 光栅周期 (nm)
duty_cycle = 0.5;      % 占空比
n_sub = 1.45;          % 衬底折射率
n_air = 1.0;          % 空气折射率
M = 5;                % 傅里叶阶数 (通常 5~15)

%% 2. 构建光栅折射率分布
Nx = 1024;
x = linspace(0, period, Nx);
eps_r = ones(1, Nx) * n_air^2;
eps_r(x < duty_cycle*period) = n_sub^2;

%% 3. 傅里叶展开
eps_mat = fourier_epsilon(eps_r, M);

%% 4. 求解本征模
theta = 0; % 正入射
[kx, modes] = solve_modes(lambda, eps_mat, M, theta);

%% 5. 计算衍射效率
% 0阶透射效率 (TE偏振)
eff_0th = abs(modes(1,1))^2 * real(kx(1)) / (k0 * cos(theta));

fprintf('0阶衍射效率: %.2f%%\n', eff_0th * 100);

参考代码 严格耦合波分析 www.youwenfan.com/contentcsu/63879.html

五、收敛性与工程经验

参数 建议值 影响
傅里叶阶数 M 5 ~ 15 M 太小 → 精度低;M 太大 → 数值不稳定
介电常数反演 使用 Li 反演 普通傅里叶级数在金属/介质界面误差极大
S 矩阵 必须使用 避免厚光栅的指数发散
网格分辨率 > 10 pts/period 确保傅里叶变换精度

Li 反演公式(必选)

对于磁场 H\mathbf{H}H,应使用:
1ε(x)=∑m(1ε)mejmKx \frac{1}{\varepsilon(x)} = \sum_{m} \left(\frac{1}{\varepsilon}\right)_m e^{jmKx} ε(x)1=m∑(ε1)mejmKx

而非直接对 ε\varepsilonε 展开。


六、支持的光栅类型

1D 光栅 (矩形、正弦、倾斜)
2D 光栅 (十字交叉、二维周期)
各向异性材料 (液晶、钙钛矿)
多层堆叠光栅
锥形衍射(Conical Mounting)

相关推荐
可编程芯片开发1 小时前
基于双Qlearning强化学习的温差发电系统电压动态补偿算法matlab仿真
算法·matlab·双qlearning强化学习·电压动态补偿·温差发电系统
Java成神之路-1 小时前
【LeetCode 刷题笔记】69.x 的平方根 | 二分查找经典刷题题解
算法·leetcode
灵智实验室1 小时前
PX4状态估计技术EKF2详解(一):EKF2 开篇——从分离到统一
算法·无人机·px 4
小智老师PMP1 小时前
六月PMP晚启动急救|现在开始,每天2-3小时,稳冲一次上岸(附可直接照搬计划)
算法·软件工程·求职招聘·产品经理·敏捷流程
tankeven2 小时前
动态规划专题(11):区间动态规划之三角剖分问题
c++·算法·动态规划
joshchen2152 小时前
强化学习基础(赵世钰)第一章
人工智能·深度学习·算法·机器学习·强化学习
小此方2 小时前
Re:从零开始的 C++ STL篇(十二)深度解析哈希函数设计、负载因子调节与两种冲突处理策略
c++·算法·哈希算法
xuhaoyu_cpp_java2 小时前
单调栈(算法)
java·数据结构·经验分享·笔记·学习·算法
诙_3 小时前
C++数据结构--排序算法
数据结构·算法·排序算法