MATLAB仿真TMM计算光学薄膜与一维光子晶体透射谱、反射谱
MATLAB仿真传输矩阵法(TMM)计算光学薄膜/一维光子晶体的透射谱/反射谱 可定制s波,p波,增透膜,高反膜,随入射角变化等。
传输矩阵法这玩意儿在光学薄膜设计里就像炒菜时的锅铲,虽然不起眼但没它真不行。今天咱们用MATLAB整点活,手把手教你怎么玩转多层膜系的透反射谱计算。先别急着掏公式,咱直接上代码更实在。
先来点基础设定:
lambda = 400:800; % 波长范围400-800nm
theta = 30; % 入射角
polarization = 's'; % 偏振类型
n = [1.0, 2.35, 1.38, 1.52]; % 介质折射率序列
thickness = [0, 100, 200, 0]; % 各层厚度(nm)
这个n数组里首尾是入射和出射介质,中间才是真正的膜层。厚度为0表示半无限介质,这设计挺巧妙吧?

核心在传输矩阵计算,咱们拆开看:
function M = TMM_layer(n, d, lambda, theta, pol)
k0 = 2*pi./lambda;
theta = deg2rad(theta);
n_eff = n.*sqrt(1 - (n(1)*sin(theta)/n).^2); % 有效折射率
delta = k0 .* n_eff * d;
if pol == 's'
m = [cos(delta), 1i*sin(delta)/n_eff;
1i*n_eff.*sin(delta), cos(delta)];
else % p偏振
m = [cos(delta), 1i*sin(delta)/(n_eff.*n);
1i*n_eff.*n.*sin(delta), cos(delta)];
end
end
这里有个小trick:用矩阵分块直接构建传输矩阵,比逐个元素赋值优雅多了。注意p波处理时多乘的那个n,这可是边界条件决定的,手滑写错的话反射谱会亲妈都不认识。
整个系统的传输矩阵是各层矩阵连乘:
M_total = eye(2);
for layer = 2:length(n)-1
M_layer = TMM_layer(n(layer), thickness(layer), lambda, theta, polarization);
M_total = M_total * M_layer;
end
这个循环从第二层开始到倒数第二层结束,完美避开首尾的半无限介质层。矩阵连乘顺序别搞反了,光学传输是右乘链式结构,跟穿衣服顺序一样从里到外。
MATLAB仿真传输矩阵法(TMM)计算光学薄膜/一维光子晶体的透射谱/反射谱 可定制s波,p波,增透膜,高反膜,随入射角变化等。

最后算反射率透射率:
Y_in = n(1)*cos(theta);
Y_out = n(end)*sqrt(1 - (n(1)*sin(theta)/n(end))^2);
r = (M_total(2,1) - Y_out*M_total(1,1) + Y_in*(Y_out*M_total(2,2) - M_total(1,2))) / ...
(M_total(2,1) + Y_out*M_total(1,1) + Y_in*(Y_out*M_total(2,2) + M_total(1,2)));
R = abs(r).^2;
T = 1 - R;
这堆分式看着头疼?其实本质就是电磁场连续性条件的矩阵版。注意Yin/Yout的处理,不同偏振要对应不同的波阻抗表达式。
举个实战栗子——做个13层的TiO2/SiO2高反膜:
n_high = 2.35; % TiO2
n_low = 1.46; % SiO2
n_stack = [1.0, repmat([n_high, n_low],1,6), n_high, 1.52];
thickness_stack = [0, 100*ones(1,13), 0];
% 跑计算
[R, T] = TMM_calculate(n_stack, thickness_stack, 0, 's');
% 画图
plot(lambda, R, 'r', lambda, T, 'b');
看到550nm附近反射率飙到99%以上没?这就是光子禁带的威力。如果换成增透膜结构,把高低折射率顺序倒过来,立马变透射率95%+。
想要玩入射角扫描?套个循环就完事:
angles = 0:80;
spectra = zeros(length(angles), length(lambda));
for i = 1:length(angles)
[R, ~] = TMM_calculate(n_stack, thickness_stack, angles(i), 'p');
spectra(i,:) = R;
end
surf(lambda, angles, spectra); % 三维彩图走起
这出来的彩虹色图谱,专业点的叫法是角度分辨反射谱。p偏振在布鲁斯特角附近会出个反射率凹陷,这是判别偏振态的活标本。

代码里藏着几个坑得提醒:
- 波长别用linspace,直接冒号运算符更高效
- 有效折射率计算要带n(1)的平方项,很多人漏这个导致大角度算崩
- 矩阵乘法用MATLAB原生*号,别手贱写for循环乘——效率差十倍不止
最后甩个冷知识:TMM算光子晶体时,记得把结构周期数设到20层以上,否则禁带特征不明显。但层数超过50之后计算量会指数爆炸,这时候得换FDTD之类的时域算法了。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)