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

严格耦合波分析(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、本征方程

(KxKx+KyKy−ω2μ0ε)E=0 \left( K_xK_x + K_yK_y - \omega^2 \mu_0 \\varepsilon \right) \mathbf{E} = 0 (KxKx+KyKy−ω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)

相关推荐
玖玥拾2 小时前
LeetCode 125 验证回文串
算法·leetcode
Asize8 小时前
146. LRU 缓存
算法
Asize8 小时前
543. 二叉树的直径
算法
lemon_sjdk9 小时前
ObjectProperty
java·开发语言·算法
Zentceh9 小时前
AI-ISP在夜视机芯中的应用:从传统ISP到PixelClean全彩夜视的进化
人工智能·科技·算法·计算机视觉·车载系统·视频·智能硬件
xier_ran9 小时前
【infra之路】AWQ 详解:激活感知权重保护,让 W4A16 量化精度超越 GPTQ
线性代数·算法·机器学习·量化·infra
亦皓ai10 小时前
AI时代后端工程(二):AI把代码写得越来越快,我却越来越不敢让它直接开工了
人工智能·算法·机器学习·搜索引擎·transformer
玖玥拾11 小时前
LeetCode 392 判断子序列
笔记·算法·leetcode
重生之后端学习12 小时前
239. 滑动窗口最大值[困难]✅
java·数据结构·算法·leetcode·职场和发展
fpcc13 小时前
算法和数据结构—动态规划法
数据结构·算法·动态规划