严格耦合波分析(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)