4. 标量衍射理论:惠更斯-菲涅尔原理、菲涅尔衍射、夫琅禾费衍射
好,咱们今天聊聊衍射。说实话,衍射这东西,我刚开始学的时候也觉得挺玄乎的。光不是直线传播吗?怎么绕过去了?
嗯,别急。咱们一步步来。先从一个最朴素的想法说起——惠更斯-菲涅尔原理。
4.1 惠更斯-菲涅尔原理:光是怎么“绕”过去的?
惠更斯当年提了个想法:波前上的每一点,都可以看作一个新的点波源。这些次级波源发出的球面波,叠加起来就形成了新的波前。
菲涅尔后来补了一刀:这些次级波不是随便叠加的,它们之间会干涉。说白了,就是每个点发出的波,振幅和相位都要考虑进去。
我个人习惯把这个原理理解成“光的接力赛”。波前上的每个点都在“接力”传播光波。你想想看,如果只有直线传播,那光遇到障碍物就彻底没戏了。但有了这个接力机制,光就能“绕”到障碍物后面去。
核心公式(惠更斯-菲涅尔衍射积分):
U(P) = (1/jλ) ∬Σ U₀(Q) * [exp(jkr) / r] * cosθ dS
其中:
- U(P) —— 观察点P的复振幅
- U₀(Q) —— 衍射屏上Q点的复振幅
- r —— Q到P的距离
- cosθ —— 倾斜因子(菲涅尔加的)
- λ —— 波长,k = 2π/λ
我在项目中遇到过一个问题:用这个公式直接算衍射,积分太难解了。尤其是遇到复杂孔径,算到怀疑人生。后来我才明白,实际工程中没人硬解这个积分,都是做近似。
避坑指南:我曾经以为倾斜因子cosθ可以随便忽略。结果有一次算小角度衍射,误差大到离谱。记住:倾斜因子在近场衍射中不能丢,远场才能近似为1。
4.2 菲涅尔衍射:近场的“温柔”近似
菲涅尔衍射,说白了就是“近场衍射”。它做了个近似:把球面波近似成抛物面波。
为什么会这样?因为当观察屏离衍射屏不太远时,r的表达式可以展开成泰勒级数,只保留到二次项。这样积分就好解多了。
菲涅尔衍射公式:
U(x,y) = [exp(jkz) / (jλz)] * exp[jk(x²+y²)/(2z)]
* ∬ U₀(ξ,η) * exp[jk(ξ²+η²)/(2z)]
* exp[-j2π(xξ+yη)/(λz)] dξ dη
你仔细看这个式子,它其实是个卷积形式。我习惯把它看成:输入是U₀,系统是自由空间传播,输出是U。这个系统的“冲激响应”就是那个二次相位因子。
| 参数 | 物理意义 | 工程经验 |
|---|---|---|
| z | 传播距离 | z > a²/λ 时考虑菲涅尔区(a为孔径尺寸) |
| λ | 波长 | 可见光常用532nm(绿光)或633nm(红光) |
| 二次相位因子 | 球面波近似 | 决定了衍射图样的“弯曲”程度 |
注意:菲涅尔近似成立的条件是:z³ >> (π/4λ) * (x²+y²)²。如果距离太近,这个近似就失效了,得用严格的瑞利-索末菲积分。
4.3 夫琅禾费衍射:远场的“爽快”近似
夫琅禾费衍射,就是“远场衍射”。它比菲涅尔更狠——直接把二次相位因子也扔了。
你想想看,当观察屏离得足够远时,那个二次相位因子exp[jk(ξ²+η²)/(2z)] ≈ 1。为什么?因为z太大了,相位变化可以忽略。
夫琅禾费衍射公式:
U(x,y) = [exp(jkz) / (jλz)] * exp[jk(x²+y²)/(2z)]
* ∬ U₀(ξ,η) * exp[-j2π(xξ+yη)/(λz)] dξ dη
看出来了吗?这其实就是个傅里叶变换!
我个人觉得,夫琅禾费衍射是光学里最优雅的东西之一。它把物理光学和信号处理完美地结合在了一起。你只要对孔径函数做傅里叶变换,就能得到远场衍射图样。
工程应用口诀:
- 单缝衍射 → sinc函数(傅里叶变换对)
- 圆孔衍射 → 艾里斑(贝塞尔函数)
- 光栅衍射 → 梳状函数卷积
我记得有一次做激光光束整形,需要把高斯光束变成平顶光束。用的就是夫琅禾费衍射原理——在傅里叶面上放一个相位板,反演一下就能得到想要的分布。嗯,这招在工程上很实用。
4.4 三种衍射的对比与选择
咱们用一张SVG图来总结一下这三种衍射的关系:
这张图把三者的关系理得很清楚。从惠更斯-菲涅尔原理出发,根据距离的不同,可以走向两个分支:近场用菲涅尔近似,远场用夫琅禾费近似。
实际工程中怎么选?我有个简单的判断方法:
- 如果观察屏距离z > 10 * a²/λ,直接上夫琅禾费(a是孔径尺寸)
- 如果z在a²/λ到10*a²/λ之间,用菲涅尔
- 如果z < a²/λ,别偷懒,老老实实用严格积分
小技巧:用激光笔照一张CD光盘,墙上出现的彩虹条纹就是夫琅禾费衍射。你离墙越远,条纹越清晰。这就是远场近似的物理体现。
4.5 代码实战:用Python模拟夫琅禾费衍射
光说不练假把式。咱们写段代码,模拟一下单缝的夫琅禾费衍射。
import numpy as np
import matplotlib.pyplot as plt
# 参数设置
wavelength = 532e-9 # 绿光,单位米
slit_width = 100e-6 # 缝宽,100微米
z = 1.0 # 观察距离,1米
# 观察屏坐标
x = np.linspace(-0.05, 0.05, 1000) # 范围±5cm
# 夫琅禾费衍射:单缝 → sinc函数
# 强度分布 I = I0 * sinc²(π * a * x / (λ * z))
a = slit_width
k = 2 * np.pi / wavelength
# 计算sinc函数
alpha = np.pi * a * x / (wavelength * z)
intensity = (np.sinc(alpha / np.pi)) ** 2 # numpy的sinc是归一化的
# 归一化
intensity = intensity / np.max(intensity)
# 绘图
plt.figure(figsize=(10, 4))
plt.plot(x * 1000, intensity, 'b-', linewidth=2)
plt.xlabel('x (mm)')
plt.ylabel('归一化强度')
plt.title('单缝夫琅禾费衍射(缝宽100μm,波长532nm)')
plt.grid(True, alpha=0.3)
plt.xlim(-10, 10)
plt.show()
这段代码跑出来,你会看到典型的sinc²分布。中间的主瓣最亮,两边是逐渐衰减的旁瓣。主瓣宽度大约是2λz/a,这个公式我记了十年——因为做光学设计时天天要用。
关键结论:
- 缝越窄,衍射越明显(主瓣越宽)
- 波长越长,衍射越明显
- 距离越远,衍射图样越大
好了,衍射理论就聊到这儿。记住一句话:衍射的本质是波的叠加,近场看二次相位,远场看傅里叶变换。下次你看到激光穿过小孔在墙上投出同心圆环,就知道那是艾里斑——圆孔的夫琅禾费衍射。
公众号:蓝海资料掘金营,微信deep3321