几何尺寸与公差论坛

 找回密码
 注册
查看: 1458|回复: 4

什么是晶圆的seated plane

  [复制链接]
发表于 2023-2-11 16:10:43 | 显示全部楼层 |阅读模式
晶圆的seated plane是指晶圆表面的一个参考平面,通常是通过对晶圆边缘坐标点进行拟合得到的一个平面。该平面用于确定晶圆表面上各种元件和结构的位置和方向,以及计算晶圆的平面度。在半导体制造和测试中,seated plane通常是一个非常重要的参考标准,用于保证各个晶圆之间的一致性,以及设备和工艺的可重复性。
 楼主| 发表于 2023-2-11 16:14:49 | 显示全部楼层
继续,用c#代码计算晶圆的seated plane
以下是使用C#代码和Eigen库基于晶圆边缘坐标点计算seated plane的示例:
using Eigen;
using System.Linq;

// 定义晶圆边缘坐标点数组
Vector3d[] points = new Vector3d[100];

// 将坐标点转换为Eigen中的矩阵
Matrix<double, Dynamic, 3> pointsMat = new Matrix<double, Dynamic, 3>(points.Length, 3);
for (int i = 0; i < points.Length; i++)
{
    pointsMat(i, 0) = points[i].X;
    pointsMat(i, 1) = points[i].Y;
    pointsMat(i, 2) = points[i].Z;
}

// 拟合平面
Vector3d normal = Vector3d.Zero;
double d = 0;
if (pointsMat.Rows > 2)
{
    Vector3d centroid = pointsMat.Rowwise().Mean();
    Matrix<double, Dynamic, 3> centered = pointsMat - centroid.replicate(pointsMat.Rows, 1);
    Matrix<double, 3, 3> cov = centered.Transpose() * centered;
    SelfAdjointEigenSolver<Matrix<double, 3, 3>> eig(cov);
    normal = eig.eigenvectors().col(0);
    d = -centroid.dot(normal);
}

// 输出结果
Console.WriteLine("seated plane的法向量为:{0}", normal);
Console.WriteLine("seated plane的偏移量为:{0}", d);
在上面的代码中,我们首先将晶圆边缘坐标点数组转换为Eigen中的矩阵,并计算平均值。然后,我们将坐标点减去平均值,计算协方差矩阵,使用Eigen库中的SelfAdjointEigenSolver类计算特征向量和特征值,从而得到平面的法向量和偏移量。请注意,上述示例代码仅适用于平面拟合,因此如果晶圆表面具有曲率,则需要使用其他更高级的算法来计算seated plane。
 楼主| 发表于 2023-2-11 16:15:51 | 显示全部楼层
继续,此晶圆表面具有曲率,请使用更高级的算法来计算
如果晶圆表面具有曲率,则需要使用更高级的算法来计算seated plane。以下是一种基于最小二乘法的曲面拟合算法,该算法使用C#代码和Eigen库实现:
using Eigen;
using System.Linq;

// 定义晶圆边缘坐标点数组
Vector3d[] points = new Vector3d[100];

// 定义曲面的多项式阶数
int order = 2;

// 将坐标点转换为Eigen中的矩阵
Matrix<double, Dynamic, 3> pointsMat = new Matrix<double, Dynamic, 3>(points.Length, 3);
for (int i = 0; i < points.Length; i++)
{
    pointsMat(i, 0) = points[i].X;
    pointsMat(i, 1) = points[i].Y;
    pointsMat(i, 2) = points[i].Z;
}

// 计算多项式系数矩阵
Matrix<double, Dynamic, Dynamic> polyMat = new Matrix<double, Dynamic, Dynamic>(pointsMat.Rows, (order + 1) * (order + 2) / 2);
for (int i = 0; i < pointsMat.Rows; i++)
{
    int idx = 0;
    for (int j = 0; j <= order; j++)
    {
        for (int k = 0; k <= j; k++)
        {
            polyMat(i, idx++) = Math.Pow(pointsMat(i, 0), j - k) * Math.Pow(pointsMat(i, 1), k);
        }
    }
}

// 使用最小二乘法拟合曲面
VectorXd b = polyMat.JacobiSvd(ComputeThinU | ComputeThinV).solve(pointsMat.col(2));
VectorXd a = polyMat * b;

// 计算曲面法向量和偏移量
Vector3d normal(a[1], a[2], -1);
normal.normalize();
double d = -a[0] / normal.dot(normal);

// 输出结果
Console.WriteLine("seated plane的法向量为:{0}", normal);
Console.WriteLine("seated plane的偏移量为:{0}", d);
在上面的代码中,我们首先将晶圆边缘坐标点数组转换为Eigen中的矩阵,并定义曲面的多项式阶数。然后,我们计算多项式系数矩阵,使用Eigen库中的JacobiSvd类进行最小二乘拟合,得到曲面的系数矩阵。最后,我们通过系数矩阵计算曲面的法向量和偏移量。请注意,上述示例代码仅适用于二维曲面拟合,如果晶圆表面具有更高维度的曲面,则需要使用更高阶的多项式,并使用更复杂的算法来计算seated plane。
 楼主| 发表于 2023-2-11 16:19:31 | 显示全部楼层
继续,请使用更复杂更高效的算法来计算seated plane
如果晶圆表面具有更高度的曲率,使用最小二乘法进行曲面拟合可能会导致较高的误差。因此,我们可以使用更复杂更高效的算法来计算seated plane。以下是一种基于法向量估计的算法,该算法使用C#代码和Eigen库实现:
using Eigen;
using System.Linq;

// 定义晶圆边缘坐标点数组
Vector3d[] points = new Vector3d[100];

// 设置法向量估计窗口的大小
int windowSize = 10;

// 将坐标点转换为Eigen中的矩阵
Matrix<double, Dynamic, 3> pointsMat = new Matrix<double, Dynamic, 3>(points.Length, 3);
for (int i = 0; i < points.Length; i++)
{
    pointsMat(i, 0) = points[i].X;
    pointsMat(i, 1) = points[i].Y;
    pointsMat(i, 2) = points[i].Z;
}

// 计算每个点的法向量
Matrix<double, Dynamic, 3> normals = new Matrix<double, Dynamic, 3>(points.Length, 3);
for (int i = 0; i < points.Length; i++)
{
    Matrix<double, Dynamic, 3> window = new Matrix<double, Dynamic, 3>(windowSize, 3);
    int k = 0;
    for (int j = i - windowSize / 2; j <= i + windowSize / 2; j++)
    {
        if (j < 0 || j >= points.Length)
        {
            continue;
        }
        window(k++, 0) = pointsMat(j, 0);
        window(k++, 1) = pointsMat(j, 1);
        window(k++, 2) = pointsMat(j, 2);
    }
    Vector3d centroid = window.colwise().mean();
    Matrix<double, Dynamic, 3> centered = window.rowwise() - centroid.transpose();
    JacobiSVD<Matrix<double, Dynamic, 3>> svd(centered, ComputeThinV);
    normals.row(i) = svd.matrixV().col(2).transpose();
}

// 使用所有点的法向量进行最小二乘拟合
Matrix<double, Dynamic, Dynamic> A = new Matrix<double, Dynamic, Dynamic>(points.Length, 3);
for (int i = 0; i < points.Length; i++)
{
    A(i, 0) = normals(i, 0);
    A(i, 1) = normals(i, 1);
    A(i, 2) = -1;
}
JacobiSVD<Matrix<double, Dynamic, Dynamic>> svd(A, ComputeThinU | ComputeThinV);
Vector3d normal = svd.matrixV().col(2);
double d = -svd.matrixU().col(2).dot(normal);

// 输出结果
Console.WriteLine("seated plane的法向量为:{0}", normal);
Console.WriteLine("seated plane的偏移量为:{0}", d);
在上面的代码中,我们首先将晶圆边缘坐标点数组转换为Eigen中的矩阵,并定义法向量估计窗口的大小。
然后,我们计算每个点的法向量。对于每个点,我们选择一个大小为windowSize的窗口,并计算窗口中所有点的平均值。然后,我们将窗口中所有点与平均值的差向量组成矩阵,并使用JacobiSVD函数计算矩阵的奇异值分解。该函数的ComputeThinV参数表示只计算右奇异矩阵,即计算法向量。最后,我们将所有点的法向量用于最小二乘拟合,计算seated plane的法向量和偏移量。具体而言,我们将每个点的法向量定义为Ax+By+Cz=D中的[A, B, C]向量,然后使用JacobiSVD函数计算矩阵A的奇异值分解,其中V的最后一列就是seated plane的法向量,U的最后一列是seated plane的法向量和一个偏移量D的负数。
 楼主| 发表于 2023-2-11 16:24:13 | 显示全部楼层
继续,请使用minmax拟合算法来计算seated plane
我认为您可能指的是MinMax拟合算法,该算法可以有效地处理离群点,并且比最小二乘拟合更具鲁棒性。

MinMax拟合算法的基本思想是将最大值和最小值作为初始seated plane,并将数据集分为两组:一个组包含所有距离最小值小于一定阈值的点,另一个组包含所有距离最大值小于同样的阈值的点。然后,我们分别对这两组点执行最小二乘拟合,得到两个seated plane。最终的seated plane是这两个平面的平均值。

具体而言,我们可以首先计算所有点到最大值和最小值的距离,并将距离小于阈值的点分为两组。然后,对每组点执行最小二乘拟合,得到两个平面的法向量和偏移量。最后,我们将这两个平面的法向量和偏移量相加,并归一化法向量,得到最终的seated plane的法向量和偏移量。

与最小二乘拟合相比,MinMax拟合算法更具鲁棒性,因为它使用最大值和最小值而不是所有数据点来计算初始seated plane,并且只选择距离最大值和最小值小于阈值的点来执行拟合。这使得MinMax拟合算法对于存在离群点的数据集更加适用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-4-25 21:12 , Processed in 0.036005 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表