最近在开心群里讨论了如何提高望远镜分辨率的问题。在讨论过程中，我发现自己在自适应光学方面的基础相对薄弱，所以专门进行了一系列的调研和学习，也关注这个领域的最新进展。为了实现教学相长，我在这里把自己所学的知识尝试表达，教授出来，以倒逼自己更准确地理解。因此，我写了这篇文章，希望能把我最近学到的知识分享给大家。由于我在这个领域还是个初学者，文章中的内容可能不全面或不准确，也希望大家批评指正。

我们要讨论望远镜的分辨率时，除了基本的衍射和光学像差之外，一个关键且无法避免的核心因素就是大气的抖动。大气抖动是如何产生的呢？这主要是因为大气中的不同区域，其温度、湿度等因素会有所不同，导致它们的折射率也不相同。因此，整个大气并不像完美的玻璃/真空那样具有完全均匀的折射率，而是在不同区域有不同的折射率。同时，由于风的存在，这些不均匀的小气团还会不断移动，使得大气的折射率在空间和时间上都呈现出不均匀状态。这种不均匀的折射率会对成像产生影响，使得光线不再沿直线传播，而是在各种不同折射率的小气团中弯曲前进。这就导致我们观测到的星星会闪烁，或者拍摄的时候星星会随机地抖动。

那么如何衡量大气抖动的程度呢？最基本的衡量方法叫做Seeing Disc。它的意思是，如果你拍一张星星的照片，因为大气抖动的影响，星星在传感器上的成像会不断抖动。当成像时间较长时，星星的成像就会变成一个圆，这个圆的直径就是所谓的Seeing Disc。通过这个直径，我们就能反推出大气抖动的程度，从而衡量大气稳定度。

除此之外，还有两个重要的衡量标准。一个是所谓的r0，也就是一个口径的度量（诡异的是它是个直径而不是半径）。它的意思是，在当前的天气条件和地理位置下，如果望远镜的口径超过了这个直径，那么分辨率就不再会有提升。此时光斑的大小主要受到大气抖动而非望远镜口径的影响。这个直径有非常确切的公式可以计算，它取决于波长、大气稳定度和具体地点等因素。一般来说，R0的值在5厘米到20厘米之间。对于顶级的观测地点，R0可以达到20厘米，也就是说，可以支持没有像差的8寸镜子的观测。而对于海平面的典型观测地点，R0可能只有5厘米。在这种情况下，即使你使用200毫米的大镜子，也不会比50毫米的小镜子分辨率更好。另一个相关的时间衡量标准是一种频率，叫做Greenwood Frequency。它表示当拍摄时间超过或拍摄频率低于这个频率时，就会受到大气扰动的影响（高于这个频率的时候不是说没有扭曲，而是说扭曲相对稳定）。通常，这个频率在100Hz到1000Hz之间。

现在人们对大气抖动的理解已经相当透彻，数学建模也可以做得非常好。其中最典型的模型叫做克尔洛莫格洛夫（Kolmogorov）模型。这个模型的基本假设很简单，就是大气抖动只影响光的相位，而不影响光强。根据这个假设，我们可以对大气抖动进行模拟，例如生成一个随机数矩阵来模拟大气在不同区域对相位的影响，然后平移这个矩阵来模拟风。在实际建模中，为了简化计算，通常假设这个随机矩阵符合正态分布，尽管实际情况可能并非如此。

那么，大气如何影响光的相位呢？可以通过一个直观的想象来理解。从无穷远处传来的星光是平面波，就像一个整齐的横队，各个波在不同地方的离我们的距离都是相同的。但是，在经过大气扰动之后，这个横队变得扭曲，有的地方超前，有的地方落后。从局部来看，就好像传播方向发生了改变。以前所有的光都只向一个方向传播，现在在每个局部，传播方向变得扭来扭去。例如，左边的光比右边的超前了一点，在局部来看，就好像光是向右传播。反之亦然。对于成像来说，理想情况下所有的光线应该汇聚到一个点。但是，如果光线的方向出现偏差，那么成像后的光线会散落到不同的传感器上的不同位置，从而导致成像质量受到影响。为了解决这个问题，我们可以测量每一个小区域内光线的传播方向，以及它们相对于理想情况的超前或落后程度。通过这些信息，我们可以微调镜子的形状，以抵消或重塑光线的传播方向，使其回到理想状态。注意这里我们使用方向作为比喻，是为了帮助大家更好地理解这个概念。实际上，基于相位和波前进行计算是更加优雅的方法，而且已经有成熟的数学工具可以应用。

在理解整个数学模型之后，下一个直观的问题就是：如何知道光在不同位置的相位差异有多少呢？这可以使用波前传感器来进行测量。波前传感器非常简单，最典型的波前传感器就是一个小相机，前面有一个微透镜，在微透镜合焦的位置有一个传感器。这个传感器特别小，比如可能只有4×4个像素或者5×5个像素。基本原理是，如果光线是从上面传过来，这个小传感器成的像就会成在下面。如果光正好是垂直于传感器传过来，那成像就在像场的中心。因此，从这个成像的位置，我们就能反推入射光的方向。而如果我们有一排这样的传感器，知道每一个传感器的方向和入射光的方向，就可以反推相位的梯度。再对它做一个积分就可以反推相位了。

因此，这样的波前传感器在批量部署的情况下，可以得到非常精细的相位分布。这个东西有两种使用方法：一种是结合镜面的控制算法，我们可以对每一个地方的相位通过调整镜面的几何形状来进行精细的重塑，使得它们的方向变成我们想要的理想方向，从而纠正像差。另一种方法是数字的方法，根据不同的相位，通过傅里叶变换等算法，我们可以得到一个点扩散函数（PSF）。有了PSF，我们就可以做反卷积了。这种反卷积因为它的PSF是根据测量的结果精确计算出来的，而并非是根据神经网络等脑补的数学优化来猜出来，所以它的质量可以特别高。这种反卷积叫做Phase-Space Deconvolution。当我们在不同的位置都部署了波前传感器的时候，它甚至可以精确地测量出不同位置不同的PSF，因此可以精确地纠正像差或者是大气扰动。

因此，我们已经有了一个完整的数学模型，传感器和控制算法，所以就可以构建一个完整的工程系统了。这个系统被称为自适应光学，它的基本思想是使用一个波前传感器来测量大气当前的扰动情况所导致的相位差异，或者说光线传播方向的杂乱情况。然后利用这个测量来调整镜面的几何形状，以纠正或补偿大气扰动。我们前面提到的Greenwood频率一般在100赫兹到1000赫兹之间，因此自适应光学的频率也是很高的，一般在100赫兹的幅度上动态调整。但是，自适应光学也有自己的局限。因为这个波前传感器会遮挡主传感器，而且专业天文望远镜的视角也特别小。因此，一般来说，自适应光学系统会仅使用一个传感器，并且假设这个波前传感器所测量的波前是一个全局的波前，可以应用到整个成像平面上。这个假设有时候是不成立的。从经验上来看，一般来说，一个传感器局部测量出来的波前仅仅在40角秒左右的视场中会保证吻合。在视角超过40角秒之后，就无法完美地纠正大气的扰动，而会观察到一些偏差。这就是自适应光学的一些局限。

除此之外，自适应光学还面临着另一个问题，那就是它依赖于一个被称为导星的天体来作为波前传感器的测量对象。在许多小视角望远镜中，很难找到一颗足够亮的星来作为导星。在这种情况下，就需要利用人工被导星来帮助算法测量波前。例如，可以发射一束激光，让激光激发空气中的钠原子发光，从而在大气高层产生一个人工导星。

但是注意，自适应光学和主动光学是两个完全不同的概念。主动光学指的是，在望远镜越来越大的建造过程中，镜子本身的质量和重量可能会导致微小的形变。对于普通物体来说，这可能无关紧要，但考虑到[镜头的像差](/lens-chromatic-aberration.html)和光学特性，如何让五六米直径的镜子整个镜面上的形变局限在100纳米以下是一个极具挑战性的问题。主动光学针对这个问题提出了一种解决方法：在镜子的不同位置放置一些由电脑控制的支撑装置。这些支撑装置可以动态地调整力度，从而控制镜面的形状。它会以相对较低的频率（例如1赫兹）来测量镜面的形状，并进行动态调整，从而克服镜面自重的影响，使其在观测不同天区时仍能保持完美的面形。这就是主动光学。主动光学与自适应光学在目的和频率上都有很大的不同。

自适应光学所需的波前传感器有很多其他应用，其中一个应用是，如果我们将波前传感器铺满整个成像平面，它就形成了一个光场相机。光场相机拍摄的照片中，每个像素不仅记录了光的强度，还记录了光的方向。考虑到强度在传感器上是一个二维信息（X和Y两个维度），方向也是一个二维信息（U和V两个维度），因此光场相机本质上记录的是一个四维信息，比传统相机记录的信息要高很多。如果只提取亮度信息，它就退化成了普通相机。有了这样的四维信息后，我们可以实现很多额外的应用。一个应用是之前提到的对像差的精确纠正，另一个应用是可以先拍照再对焦。但光场相机的一个问题是，由于像素的一部分被波前传感器用来测量光的方向，因此它的分辨率通常比普通相机要低很多，这是工程上的权衡。

为了解决光场相机分辨率低的问题，清华大学的一个团队提出了一种新型传感器，叫做MetaSensor。MetaSensor的基本思想是通过抖动微透镜的方法来提高光场相机的分辨率，类似于现在数码相机流行的摇摇乐。通过改变相机和微透镜之间的相对关系，并结合drizzle算法，实现时间换空间，从而获得更高的空间分辨率。但这种方法有一个明显的问题：只适用于静态物体。对于动态物体，需要额外进行光流算法的纠正。总的来说，这个新型传感器通过空间上的抖动和Phase-Space Deconvolution反卷积，在时间上使用光流算法进行纠正，再结合神经网络进行超分辨率处理，可以实现高时间分辨率和高空间分辨率的成像方法。此外，它还可以纠正所有的像差，包括大气抖动。因此，通过大量高强度的计算，MetaSensor可以实现非常好的成像效果。

总的来说，这篇文章介绍了大气抖动的基本原理、衡量方法和数学模型。同时，也讲述了用于测量的传感器和修正方法，包括物理方法和数字方法。此外，文章还探讨了几个衍生应用，如自适应光学、主动光学、光场相机和meta传感器。希望这些内容能给大家带来一些启发。

<script async data-uid="49b08a3e73" src="https://yage-ai.kit.com/49b08a3e73/index.js"></script>
