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

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

相关推荐
To_OC6 小时前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
金銀銅鐵9 小时前
[Python] 扩展欧几里得算法
python·数学·算法
To_OC12 小时前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
To_OC1 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
05Kevin2 天前
lk每日冒险题--数据结构6.27
算法
To_OC2 天前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安2 天前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者2 天前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent