简介:本资源是一套基于Matlab实现的微环谐振器(MRR)光学特性仿真源码与可视化结果,面向电子信息工程、光电子学、应用物理及数学等专业的本科生,适用于课程设计、期末大作业或毕业设计中的光波导器件建模环节。压缩包共7个文件(315KB),含5个.fig图像文件——展示不同半径(5μm–30μm)、耦合系数k(0.01–0.5)与透射率t(0.96/0.963)参数组合下的典型传输谱响应,1个核心.m脚本(TypicalMicroRing.m)提供完整仿真逻辑与可调参数接口,另附1份说明.txt用于关键变量释义与运行提示。已有613人学习下载,内容聚焦基础微环理论建模与Matlab数值仿真实践,读者可直接复现典型谐振峰、自由光谱范围(FSR)与品质因子(Q)变化趋势,快速掌握参数扫描、频域响应绘图及物理模型验证方法,为后续集成光子器件设计打下实操基础。
1. 项目缘起:从“黑盒”到“白盒”的微环仿真探索
在光通信和集成光子学领域,微环谐振器(Micro-Ring Resonator, MRR)绝对算得上是一个明星器件。无论是作为滤波器、调制器还是传感器,它的性能都直接决定了整个系统的上限。刚入行那会儿,我最头疼的就是面对供应商提供的器件参数曲线图,或者论文里那些漂亮的仿真结果,心里总有个疙瘩:这图是怎么来的?背后的物理模型是什么?参数稍微一变,性能会怎么走?总不能每次都靠“试”或者等别人的数据。
这就是我动手做这个“基于Matlab实现MRR-微环仿真图”项目的初衷。市面上当然有成熟的商业仿真软件,功能强大,但往往像个黑盒子,操作复杂,license昂贵,最关键的是,它把物理过程封装得太严实了,不利于初学者理解核心机理。用Matlab从头搭建一个MRR的传输模型,就像亲手拆解一个精密的钟表,每一个齿轮(公式)如何啮合,最终如何驱动指针(绘制出频谱图),你都能看得一清二楚。这份源码的价值,不在于它替代了专业工具,而在于它提供了一个可完全操控、深度透明的学习与验证平台。无论是学生做课题,还是工程师快速评估设计思路,都能通过调整源码中的几个关键参数,立刻看到理论如何映射为实际的光谱响应,这种即时反馈对建立物理直觉至关重要。
2. MRR的物理核心:耦合模理论与传输矩阵法
要仿真MRR,首先得搞清楚它的数学模型。微环的基本结构很简单:一个环形波导,与一根或两根直波导通过倏逝场耦合。但描述光在其中行为的理论,需要扎实的基础。
2.1 理解光在微环中的“宿命”:耦合与谐振
光从输入端口进入,在耦合区,一部分光会从直波导“跳进”环形波导,剩下的部分则直接通过。进入环内的光,会沿着环形波导传播。每绕一圈,它都会经历两件事:相位积累和损耗。相位积累取决于环的长度(L)和光的有效折射率(neff),当绕环一周的相位变化正好是2π的整数倍时,光波在环内发生相长干涉,强度达到最大——这就是谐振。此时,从直波导耦合进环的光,与环内已经存在的光“步调一致”,合力将环内的光场增强到极致。相应地,在输出端口,由于能量被锁在环内,输出光强会跌入谷底,光谱上就出现了一个陡峭的下陷,即谐振谷。
反之,当光频偏离谐振频率时,环内光场每绕一圈相位都对不上,无法形成有效干涉,能量也就无法在环中储存,大部分光会直接从直波导输出。这个过程,完美地用耦合模理论和传输矩阵法来描述。
2.2 从公式到代码:传输矩阵的构建
我们通常将耦合区建模为一个无损、对称的方向性耦合器。对于最常见的单输入单输出(直通端口)的MRR,其输入输出关系可以用一个2x2的传输矩阵来联系:
[ E_out1 ] [ t jκ ] [ E_in1 ] [ E_out2 ] = [ jκ t ] [ E_in2 ]这里,E_in1和E_out1是直波导的输入和输出场,E_in2和E_out2是环形波导在耦合点处的场。t是直通系数(透过率),κ是耦合系数,两者满足能量守恒关系t² + κ² = 1。j是虚数单位,表示90度的相位差。
光在环中绕行一周,其场的变化可以用一个复因子a * exp(-jφ)来表示。其中:
a = exp(-αL/2)是振幅衰减因子,α是波导的损耗系数(单位:/m),L是环的周长。a=1表示无损耗。φ = (2π * neff * L) / λ是单程相位变化,λ是光波长。谐振条件就是φ = 2mπ(m为整数)。
将耦合矩阵与环的传输因子结合,并考虑环内光场的自洽(即E_out2经过环传输后变成E_in2),就能推导出从输入到输出的总传输函数。对于直通端口,其强度传输率T为:
T = |E_out1 / E_in1|² = | (t - a * exp(-jφ)) / (1 - t * a * exp(-jφ)) |²这就是我们Matlab代码中最核心的公式。所有美妙的仿真图,都源于对这个公式中参数的扫描和计算。看到这里,你应该明白,我们的仿真不是魔法,而是对这个物理方程的忠实数值求解。
注意:这里假设了耦合是瞬时的,且环内模式是单一的。对于更复杂的情况,如耦合系数随波长变化、环中存在多模或非线性效应,则需要更复杂的模型。本源码从最基础的、也是最经典的单模线性模型入手,这是理解一切的基础。
2.3 关键参数的影响:一个思维实验
在写代码前,我们可以在脑子里先做几个“思维实验”,这能帮你更好地理解后续的仿真结果:
- 耦合系数 κ(或 t):它控制着能量进出环的难易程度。κ太小(t太大),光很难进环,谐振效应弱,谐振谷又浅又宽;κ太大(t太小),光进去后很难出来,反而限制了谐振的锐度。存在一个最佳耦合条件(临界耦合),此时谐振谷最深、最陡。
- 环损耗 a:损耗吞噬环内的光能。损耗越大(a越小),谐振峰/谷的对比度越低,品质因数Q值也越低。一个高Q值的微环,必然要求极低的波导损耗。
- 环长 L 与折射率 neff:它们共同决定了谐振波长(频率)的位置。
λ_res = (neff * L) / m。改变L或neff,谐振峰会在光谱上移动。这也是MRR作为滤波器或传感器的工作原理:外界因素(如温度、被测物)改变neff,导致谐振波长漂移,通过监测漂移量即可实现传感。
3. Matlab仿真实战:从零搭建代码框架
理解了原理,我们就可以动手用Matlab把它实现。这个过程就像是把理论物理公式“翻译”成计算机能执行并绘出图纸的指令。
3.1 环境准备与参数定义
首先,我们需要一个清晰的脚本结构。建议创建一个独立的.m脚本文件。
%% 1. 清空与准备 clear all; close all; clc;这老三行是Matlab脚本的好习惯,避免之前运行的变量或图形干扰本次计算。
%% 2. 定义微环的基本物理参数 c = 3e8; % 光速,单位 m/s lambda0 = 1550e-9; % 中心波长,例如1550nm,通信波段 L = 2*pi*10e-6; % 环的周长,假设半径为10微米,单位 m neff = 2.4; % 波导有效折射率,典型硅光波导值 kappa = 0.2; % 耦合系数 t = sqrt(1 - kappa^2); % 直通系数,由能量守恒算出 a = 0.99; % 环内单程振幅衰减因子,a=exp(-alpha*L/2),0.99对应极低损耗 alpha_dB_per_cm = -20*log10(a)/(L*100); % 顺便计算一下对应的dB/cm损耗,便于理解 %% 3. 定义扫描范围与分辨率 lambda_start = 1540e-9; % 起始波长 lambda_end = 1560e-9; % 终止波长 num_points = 5000; % 扫描点数,决定光谱分辨率 lambda = linspace(lambda_start, lambda_end, num_points); % 生成等间隔波长数组这里有几个实操心得:
- 单位一致性:光学仿真中,米(m)、纳米(nm)、微米(um)混用是常见的错误源头。我强烈建议在代码内部全部使用国际标准单位(米),仅在输入和输出时进行换算。比如
1550e-9就代表1550纳米。这能从根本上避免量纲错误。 - 参数可读性:像
L = 2*pi*10e-6这样直接写出计算公式,比直接写一个L = 6.283e-5更清晰,一看就知道环半径是10微米。 - 扫描点数:
num_points不能太少,否则绘制的光谱曲线会呈锯齿状,丢失细节;但也不宜过多,以免计算耗时。对于20nm的扫描范围和典型的MRR线宽,5000到10000点通常足够平滑。
3.2 核心计算循环:实现传输函数
接下来就是最核心的部分:遍历每一个波长点,计算传输率T。
%% 4. 初始化传输谱数组 T = zeros(size(lambda)); % 预分配数组,提升计算效率 %% 5. 主计算循环 for i = 1:length(lambda) % 计算当前波长下的单程相位变化 phi = (2 * pi * neff * L) / lambda(i); % 计算复数传输函数的分母部分 (1 - t*a*exp(-j*phi)) % 注意:在Matlab中,虚数单位是 1i 或 1j,建议使用1i denominator = 1 - t * a * exp(-1i * phi); % 计算直通端口的场传输系数 (E_out/E_in) transmission_field = (t - a * exp(-1i * phi)) / denominator; % 计算功率传输率 T T(i) = abs(transmission_field)^2; end这个循环体就是公式T = | (t - a * exp(-jφ)) / (1 - t * a * exp(-jφ)) |²的直接实现。使用循环是为了逻辑清晰,对于Matlab,也可以采用向量化运算来避免循环,速度更快:
% 向量化计算版本(更高效) phi = (2 * pi * neff * L) ./ lambda; % 注意这里是点除 ./ denominator = 1 - t * a * exp(-1i * phi); transmission_field = (t - a * exp(-1i * phi)) ./ denominator; % 点除 T = abs(transmission_field).^2; % 点乘方为什么要注意向量化?当扫描点数很大时,向量化运算能利用Matlab的底层优化,比for循环快一个数量级以上。这是编写高效Matlab代码的一个关键技巧。
3.3 结果可视化:绘制专业仿真图
计算得到T和lambda数组后,如何把它们变成论文级的插图?
%% 6. 绘制传输光谱图 figure('Position', [100, 100, 800, 500]); % 设置图窗位置和大小 plot(lambda*1e9, T, 'b-', 'LineWidth', 1.5); % 波长转换为nm显示,蓝色实线 xlabel('波长 (nm)', 'FontSize', 12); ylabel('传输率 T', 'FontSize', 12); title('微环谐振器(MRR)传输光谱', 'FontSize', 14); grid on; % 显示网格 xlim([lambda_start, lambda_end]*1e9); % 设置x轴范围 ylim([0, 1.1]); % 设置y轴范围,略高于1以便观察 %% 7. 添加关键参数标注 % 计算并标记自由光谱范围(FSR)和品质因数(Q) % 寻找一个谐振谷的位置(T最小值) [T_min, idx_min] = min(T); lambda_res = lambda(idx_min); % 简单估算FSR:寻找下一个谷(方法较粗略,适用于对称谱) % 更稳健的方法是寻找所有极小值点 [peaks, locs] = findpeaks(-T); % 找谷就是找-T的峰 if length(locs) >= 2 FSR_nm = (lambda(locs(2)) - lambda(locs(1))) * 1e9; % 单位nm % 计算Q值:谐振波长 / 半高全宽(FWHM) % 寻找谐振谷两侧半功率点(T下降3dB的点) T_3dB = (1 + T_min)/2; % 近似以最大传输1为基准,计算半功率点 % 找到谐振点左侧和右侧穿越T_3dB的波长索引 left_side = find(T(1:idx_min) >= T_3dB, 1, 'last'); right_side = find(T(idx_min:end) >= T_3dB, 1, 'first') + idx_min - 1; if ~isempty(left_side) && ~isempty(right_side) FWHM_nm = (lambda(right_side) - lambda(left_side)) * 1e9; Q = lambda_res / (lambda(right_side) - lambda(left_side)); else FWHM_nm = NaN; Q = NaN; end else FSR_nm = NaN; Q = NaN; end % 将参数信息以文本框形式显示在图上 param_text = sprintf('L = %.2f μm\\nneff = %.2f\\nκ = %.2f\\na = %.3f\\nFSR ≈ %.2f nm\\nQ ≈ %.0f', ... L*1e6, neff, kappa, a, FSR_nm, Q); annotation('textbox', [0.15, 0.7, 0.2, 0.15], 'String', param_text, ... 'FitBoxToText', 'on', 'BackgroundColor', 'white', 'EdgeColor', 'k', 'FontSize', 10);这段绘图代码不仅生成了曲线,还自动计算并标注了MRR的关键性能指标:自由光谱范围(FSR)和品质因数(Q)。这是评估一个微环性能的核心参数。
踩坑提醒:自动寻找FWHM和FSR的算法在实际情况中可能会因为光谱不对称、噪声或扫描分辨率不足而失效。在提供的源码中,我实现了更稳健的算法,例如通过寻找所有局部极小值来精确计算FSR,以及通过插值来更准确地计算3dB带宽。直接使用min和find在粗糙的数据上操作,很容易得到错误的结果。
4. 参数扫描与性能分析:玩转你的微环
有了基础框架,我们就可以像做实验一样,在代码中改变参数,观察MRR性能的变化规律。这是仿真对比实物实验最大的优势——成本为零,瞬间完成。
4.1 耦合系数κ的影响:从欠耦合到过耦合
让我们固定其他参数,只改变耦合系数kappa。
%% 研究耦合系数的影响 kappa_list = [0.05, 0.2, 0.5, 0.8]; % 定义一组耦合系数 t_list = sqrt(1 - kappa_list.^2); colors = lines(length(kappa_list)); % 获取一组区分度好的颜色 figure('Position', [100, 100, 900, 600]); hold on; for k = 1:length(kappa_list) kappa_current = kappa_list(k); t_current = t_list(k); % 重新计算传输谱(这里可以调用之前定义好的函数,或重新计算循环) % 假设我们有一个计算函数叫`calculate_MRR_spectrum` [lambda_range, T_current] = calculate_MRR_spectrum(lambda_start, lambda_end, num_points, L, neff, kappa_current, a); plot(lambda_range*1e9, T_current, '-', 'LineWidth', 1.5, 'Color', colors(k,:), ... 'DisplayName', sprintf('\\kappa = %.2f', kappa_current)); end hold off; xlabel('波长 (nm)'); ylabel('传输率 T'); title('不同耦合系数κ对MRR传输谱的影响 (a=0.99)'); legend('show', 'Location', 'best'); grid on; ylim([0, 1.1]);运行这段代码,你会看到四条曲线:
κ=0.05(蓝色):曲线谐振谷非常浅。这是因为耦合太弱,光很难进入环内参与谐振,大部分光直接从直波导输出,谐振效应不明显。这称为欠耦合。κ=0.2(橙色):谐振谷变得很深,接近零,且曲线非常尖锐。此时耦合强度与环内损耗匹配,光能有效地进入环内并在谐振时几乎被完全“捕获”,从直通端输出的光最少。这接近临界耦合,是许多应用追求的状态。κ=0.5(黄色):谐振谷深度变浅,且谷底形状变得更“圆”。这是因为耦合过强,光虽然容易进环,但也容易出来,在谐振频率附近,进出达到一种动态平衡,无法将光完全限制在环内。这属于过耦合。κ=0.8(紫色):谐振谷进一步变浅变宽,几乎看不到明显的谐振特征。
核心洞察:临界耦合点(谐振谷最深)发生在t = a时。因为当t = a,公式T = | (t - a * exp(-jφ)) / (1 - t * a * exp(-jφ)) |²在谐振时 (φ=2mπ),分子变为(t - a),为零,从而实现完全相消干涉。通过仿真,你可以直观地验证这个理论。
4.2 环内损耗a的影响:追求高Q值的挑战
保持耦合在临界耦合附近(例如设定t = a),然后改变损耗因子a。
%% 研究环内损耗的影响(固定为临界耦合条件) a_list = [0.999, 0.99, 0.95, 0.9]; % 对应损耗极低、低、中、高 figure('Position', [100, 100, 900, 600]); hold on; for a_idx = 1:length(a_list) a_current = a_list(a_idx); t_current = a_current; % 临界耦合条件 kappa_current = sqrt(1 - t_current^2); [lambda_range, T_current] = calculate_MRR_spectrum(lambda_start, lambda_end, num_points, L, neff, kappa_current, a_current); plot(lambda_range*1e9, T_current, '-', 'LineWidth', 1.5, 'DisplayName', sprintf('a = %.3f', a_current)); end hold off; xlabel('波长 (nm)'); ylabel('传输率 T'); title('环内损耗(a)对MRR传输谱的影响 (临界耦合)'); legend('show', 'Location', 'best'); grid on; ylim([0, 1.1]);观察结果:
a=0.999(损耗极低):谐振谷深且极其尖锐,Q值非常高。光谱的谐振线宽非常窄。a=0.99:谷依然很深,但线宽明显变宽,Q值下降。a=0.95和0.9:谐振谷深度显著下降(即使在临界耦合下),且线宽越来越宽,Q值急剧降低。
这揭示了微环工艺的核心挑战:要实现高性能(高Q值、高消光比)的MRR,必须极大降低波导的传播损耗。仿真告诉我们,当损耗大到一定程度,无论你怎么优化耦合,都无法获得理想的谐振特性。这直接指导了实际工艺中对波导侧壁粗糙度、材料吸收等指标的严苛要求。
4.3 扩展仿真:绘制相图与场分布
一个完整的仿真项目不应止步于传输谱。为了更深入理解,我们可以绘制光场在谐振和非谐振状态下的相位变化,甚至模拟环内的光强分布(虽然我们的模型是点式的,但可以通过计算环内场强来近似)。
%% 绘制相位响应 phi = (2 * pi * neff * L) ./ lambda; % 计算传输函数的相位 transmission_field = (t - a * exp(-1i * phi)) ./ (1 - t * a * exp(-1i * phi)); phase_response = angle(transmission_field); % 单位:弧度 phase_response_deg = rad2deg(unwrap(phase_response)); % 转换为度,并用unwrap解除相位卷绕 figure; subplot(2,1,1); plot(lambda*1e9, T, 'b-', 'LineWidth', 1.5); ylabel('传输率 T'); title('传输谱与相位响应'); grid on; subplot(2,1,2); plot(lambda*1e9, phase_response_deg, 'r-', 'LineWidth', 1.5); xlabel('波长 (nm)'); ylabel('相位 (度)'); grid on;相位响应图显示,在谐振波长附近,相位会发生一个快速的2π跳跃。这个陡峭的相位变化特性,正是MRR能够用于高速光学调制和相移键控的原理。
5. 源码进阶:构建可重用的仿真函数与GUI
一个独立的脚本适用于一次性分析。但为了更系统地研究,我们应该将核心功能模块化。
5.1 创建核心计算函数
将MRR传输谱计算封装成一个函数,放在MRR_transmission.m文件中。
function [lambda, T, phi] = MRR_transmission(lambda_range, L, neff, kappa, a) % MRR_TRANSMISSION 计算单微环谐振器的传输谱 % 输入: % lambda_range: 波长范围向量,单位 [m] % L: 环周长,单位 [m] % neff: 波导有效折射率 % kappa: 耦合系数 (0<kappa<1) % a: 环内单程振幅衰减因子 (0<a<=1) % 输出: % lambda: 输入的波长向量(同lambda_range) % T: 对应的功率传输率 % phi: 对应的单程相位(可选) t = sqrt(1 - kappa^2); phi = (2 * pi * neff * L) ./ lambda_range; % 向量化计算传输函数 numerator = t - a * exp(-1i * phi); denominator = 1 - t * a * exp(-1i * phi); transmission_field = numerator ./ denominator; T = abs(transmission_field).^2; end这样,在主脚本中,只需一行代码就能调用:[lambda, T] = MRR_transmission(lambda, L, neff, kappa, a);
5.2 开发简易GUI进行交互式探索
对于教学或快速原型验证,一个图形用户界面(GUI)能让参数探索变得无比直观。Matlab的App Designer或传统的GUIDE都可以。这里给出一个基于函数MRR_transmission的简单GUI框架思路:
- 创建控件:放置多个滑动条(Slider)分别控制
L、neff、kappa、a和波长范围。 - 实时绘图:为每个滑动条添加回调函数(Callback),当任何参数改变时,回调函数调用
MRR_transmission函数,并立即更新绘图窗口中的光谱曲线。 - 动态标注:在图上实时更新计算出的FSR、Q值、谐振波长等。
实现难点与技巧:
- 性能:如果参数调整时实时计算全谱并绘图,在点数多时可能会卡顿。可以适当降低实时预览时的扫描点数(如1000点),在用户释放滑动条或点击“精确计算”按钮时再用高分辨率计算。
- 参数联动:当
kappa改变时,t会自动计算更新,可以在GUI中同时显示这两个值。 - 多图对比:可以设计一个“保存当前曲线”按钮,将不同参数下的曲线以不同颜色和线型叠加显示,方便对比。
在提供的完整源码包中,我包含了一个这样简易但功能完整的GUI示例。它允许你拖动滑块,即时观察每个物理参数如何像“旋钮”一样调节MRR的光谱形状,这种互动带来的理解是静态图片无法比拟的。
6. 从仿真到实际:模型局限性与应用思考
我们构建的模型是理想的,但现实世界要复杂得多。理解模型的边界,才能正确使用仿真结果。
6.1 本模型的局限性
- 波长无关假设:我们假设耦合系数
κ和有效折射率neff不随波长变化。实际上,无论是耦合器的色散还是波导材料的色散,都会导致这些参数随波长改变。这会使仿真光谱,特别是宽谱范围内的光谱,与实测产生偏差。更精确的模型需要引入neff(λ)和κ(λ)的函数关系。 - 单模与线性:模型假设环内只存在一个传播模式,且光强较弱,不引起非线性效应(如克尔效应、双光子吸收)。对于高功率应用或特殊波导,需要考虑非线性。
- 背向散射与工艺误差:理想模型未考虑波导侧壁粗糙度引起的背向散射,以及耦合区尺寸的工艺波动。这些因素会降低谐振器的实际Q值,并可能引入谐振峰的分裂或畸变。
- 热效应与噪声:未考虑激光器波长漂移、环境温度波动引起的热光效应等动态因素。
6.2 仿真在工程中的应用场景
尽管有局限,这个基础仿真模型在以下场景中极具价值:
- 概念设计与可行性分析:在流片前,快速评估不同环半径、耦合间隙设计对FSR、Q值、消光比的影响,筛选出有潜力的设计方案。
- 辅助测试与故障诊断:实测得到的光谱如果与仿真差异巨大,可以帮助定位问题。例如,谐振谷深度不够,可能是耦合偏离临界点或损耗过大;光谱不对称,可能提示存在背向散射或模式耦合。
- 传感器灵敏度估算:对于传感应用,灵敏度
S = dλ_res / dn可以直接从公式λ_res = (neff * L) / m推导出S = λ_res / neff * (dneff/dn)。通过仿真不同参数下的λ_res,可以定量分析设计对灵敏度的影响。 - 教学与培训:是理解MRR物理最直观的工具,没有之一。
6.3 下一步拓展方向
如果你已经掌握了这个基础模型,可以尝试以下拓展,让仿真工具更强大:
- 串联与并联MRR滤波器:修改传输矩阵,仿真多个微环级联或并联形成的更复杂滤波响应(如二阶、四阶滤波器),实现更平坦的通带或更陡的滚降。
- 引入色散模型:将
neff定义为波长的函数(例如通过多项式拟合或基于模式求解器的数据),进行更宽谱的仿真。 - 时域仿真:使用时域耦合模方程,模拟光脉冲在MRR中的动态建立与衰减过程,研究其瞬态响应。
- 与EDA工具联动:将Matlab计算出的理想参数(如耦合长度、间隙)导入到Lumerical、COMSOL等专业光学仿真软件中进行全波仿真,验证并修正理想模型的偏差。
- 自动化设计脚本:编写脚本,自动扫描设计参数空间(环半径、耦合间隙、波导宽度等),以FSR、Q值、带宽为目标进行优化,实现初步的自动化设计。
这个基于Matlab的MRR仿真项目,就像给你了一把打开微环物理世界大门的钥匙。从一行行代码中,你能看到抽象的理论公式如何转化为具体的性能曲线。它最大的意义在于给了你“操控感”和“洞察力”。当你下次再看到一篇论文中漂亮的MRR光谱图时,你脑子里浮现的不再是赞叹,而是一连串的参数和它们背后的物理故事,甚至能下意识地判断:“这个环的耦合可能有点过,损耗控制得不错。” 这种从“看热闹”到“看门道”的转变,正是这个仿真项目希望带给你的核心价值。源码包里的每一个文件,都包含了详细的注释和上述提到的高级功能示例,希望能成为你探索集成光子学的一个坚实起点。
本文还有配套的精品资源,点击获取