向量

表示

通常用箭头表示$\vec a$或者$\overrightarrow{AB}$,或者黑体$\boldsymbol a$;

  • 没有绝对的开始位置,$\overrightarrow {AB}=B-A$;
  • 具有长度$\mid\mid \vec a\mid\mid$;
  • 具有方向,可以用其单位向量表示:$\hat a=\frac{\vec a}{\mid\mid \vec a\mid\mid}$

通常我们表示单位向量的过程也称为正则化(normalization);

向量也可以在坐标系上用两个正交的向量表示,进而表示成一列形成坐标:
$$
\boldsymbol A =\left( \begin{array}{c} x\y \end{array}\right)\
\boldsymbol A^\top =\left(\begin{array}{c} x&y \end{array}\right)\
\mid\mid \boldsymbol A\mid\mid= \sqrt{x^2+y^2}
$$

加法

向量的加法遵循三角形法则和平行四边形法则

image-20241204223826342

点乘

点乘(dot product)可以描述向量之间的方向的相似性,投影运算
$$
\vec a \cdot \vec b = \mid\mid \vec a\mid\mid \mid\mid \vec b\mid\mid \cos \theta
$$
两个向量的夹角余弦为
$$
\cos \theta =\frac{\vec a \cdot \vec b}{\mid\mid \vec a\mid\mid \mid\mid \vec b\mid\mid} =\hat a\cdot \hat b
$$
夹角$\theta\in [0,\pi)$为
$$
\theta =\arccos(\hat a\cdot \hat b)
$$
点乘满足交换律,结合律
$$
\vec a \cdot \vec b = \vec b \cdot \vec a\
\vec a \cdot (\vec b + \vec c)= \vec a \cdot \vec b + \vec a \cdot \vec c\
(k\vec a) \cdot \vec b = \vec a \cdot (k\vec b) = k(\vec a \cdot \vec b)
$$
在二维空间中
$$
\vec a \cdot \vec b = \left( \begin{array}{c} x_a\y_a \end{array}\right)\cdot \left( \begin{array}{c} x_b\y_b \end{array}\right) = x_ax_b + y_a y_b\
$$
在三维空间中
$$
\vec a \cdot \vec b = \left( \begin{array}{c} x_a\y_a\z_a \end{array}\right)\cdot \left( \begin{array}{c} x_b\y_b\z_b \end{array}\right) = x_ax_b + y_a y_b + z_az_b\
$$
投影(projection)在图形学上是很常见的运算,投影$\vec b_\perp $和$\vec a$同向;
$$
\vec b_\perp = \hat a \cdot \vec b\
\mid\mid \vec b_\perp\mid\mid = \mid\mid\vec b\mid\mid \cos \theta
$$
image-20241204225414860

通过投影还可以进行向量的正交分解
$$
\vec b-\vec b_\perp , \vec b_\perp
$$
向量点乘的正负可以决定向量是同向(forward)还是反向的(backforward);

image-20241204230111439

叉乘

两个向量的叉乘的结果均垂直于两个向量,其方向遵循右手螺旋定则(right-hand rule),可以建立三维直角坐标系;

image-20241204230156438

满足
$$
\mid\mid \vec a \times \vec b \mid\mid = \mid\mid \vec a \mid\mid \mid\mid \vec b\mid \mid \sin \varphi
$$
这里夹角$\varphi \in (-\frac{\pi}{2}, \frac{\pi}{2}]$,表示旋转角;

向量叉乘仍然满足结合律和分配律,不满足交换律
$$
\vec a \times \vec b = -\vec a \times \vec b \
\vec a \times (\vec b + \vec c)= \vec a \times \vec b + \vec a \times \vec c\
(k\vec a)\times \vec b = k(\vec a \times \vec b)\
\vec a\times\vec a = \vec 0
$$
代数上,叉乘如下结果
$$
\vec a \times \vec b = \left(
\begin{array}{c}
y_az_b-y_bz_z\
z_ax_b-x_az_b\
x_ay_b-y_ax_b
\end{array}\right)\
=\left(
\begin{array}{c}
0& -z_a& y_a\
z_a& 0& -x_a\
-y_a& x_a& 0
\end{array}\right)\left(
\begin{array}{c}
x_b\
y_b\
z_b
\end{array}\right)
$$
在二维空间中计算结果看起来是一个数(结果是它的模)
$$
\vec a \times \vec b = x_ay_b-y_ax_b
$$
平面上的叉乘一般用于判断左右,以及判断内外

判断向量$\vec b$在向量$\vec a$的左侧的充要条件
$$
\vec a\times \vec b >0
$$
判断点在三角形内部的充要条件
$$
\overrightarrow {AB} \times \overrightarrow {AP} >0\
\overrightarrow {BC} \times \overrightarrow {BP} >0\
\overrightarrow {CA} \times \overrightarrow {CP} >0\
$$
image-20241204231225956

结果为0一般考虑为corner case;

利用叉乘可以定义一个右手系
$$
\mid\mid \hat i\mid\mid = \mid\mid \hat j\mid\mid =\mid\mid\hat k\mid\mid =1\
\hat i\cdot \hat j =0 \
\hat k = \hat i\times \hat j
$$
对于任意一个向量$\vec p$,有
$$
\vec p = (\vec p\cdot \hat i)\hat i + (\vec p\cdot \hat j)\hat j +(\vec p\cdot \hat k)\hat k
$$

矩阵

对于一个$m\times n$矩阵,即有$m$行$n$列;

加法是平凡的:对应元素相乘;

矩阵的乘法:对于一个$m\times p$ 的矩阵$\boldsymbol A$和$p\times n$的矩阵$\boldsymbol B$,相乘结果$\boldsymbol C$为
$$
\boldsymbol C_{ij} = \sum_{k = 1} ^ p \boldsymbol{A}{ik} \boldsymbol{B}{kj}
$$
矩阵乘法不满足任何交换律,满足结合律和分配律
$$
(\boldsymbol A \boldsymbol B) \boldsymbol C = \boldsymbol A (\boldsymbol B \boldsymbol C)\
(\boldsymbol A + \boldsymbol B) \boldsymbol C = \boldsymbol A \boldsymbol C + \boldsymbol B \boldsymbol C\
\boldsymbol C (\boldsymbol A + \boldsymbol B)= \boldsymbol C \boldsymbol A + \boldsymbol C \boldsymbol B

$$
矩阵乘法转置满足
$$
(AB)^\top = B^\top A^\top
$$
矩阵乘法常常用于向量的线性变换,向量通常视为列数为1的矩阵,这里$A^*$称作dual matrix;
$$
\vec a \cdot \vec b = \vec a ^\top \vec b = \left( \begin{array}{c} x_a&y_a&z_a \end{array}\right) \left( \begin{array}{c} x_b\y_b\z_b \end{array}\right) \

\vec a \times \vec b
=A^* \vec b = \left(
\begin{array}{c}
0& -z_a& y_a\
z_a& 0& -x_a\
-y_a& x_a& 0
\end{array}\right)\left(
\begin{array}{c}
x_b\
y_b\
z_b
\end{array}\right)
$$
若矩阵$\boldsymbol A$满秩,则存在逆$\boldsymbol A^{-1}$,这里$$\boldsymbol A \boldsymbol A^{-1} = I$$

2D Transforms

Transform in Scale

对于二维平面上的一个点$(x,y)$, 将向量变换成原来的$s$倍,只需要左乘缩放矩阵
$$
\left( \begin{array}{c} x’\y’ \end{array}\right) = \left( \begin{array}{c} s& 0\0& s \end{array}\right) \left( \begin{array}{c} x\y \end{array}\right)
$$
非均匀缩放:如果对坐标轴上缩放不同比例,只需调整为
$$
\left( \begin{array}{c} x’\y’ \end{array}\right) = \left( \begin{array}{c} s_x& 0\0& s_y \end{array}\right) \left( \begin{array}{c} x\y \end{array}\right)\
$$
关于$y$轴的镜像
$$
\left( \begin{array}{c} x’\y’ \end{array}\right) = \left( \begin{array}{c} -1& 0\0& 1 \end{array}\right) \left( \begin{array}{c} x\y \end{array}\right)\
$$
Shear Matrix:

竖直方向上移动为0,水平方向的移动$0\to y=0, a\to y=1$;
$$
\left( \begin{array}{c} x’\y’ \end{array}\right) = \left( \begin{array}{c} 1& a\0& 1 \end{array}\right) \left( \begin{array}{c} x\y \end{array}\right)\
$$
效果如下

image-20241205114854529

Transform: Rotate

旋转默认绕原点逆时针旋转

旋转矩阵如下:
$$
\boldsymbol R_\theta =\left( \begin{array}{c} \cos\theta & -\sin\theta \\sin\theta& \cos\theta \end{array}\right)
$$

不难观察到$\boldsymbol R_\theta^\top = \boldsymbol R_{-\theta}$,换句话说旋转矩阵是正交矩阵;

对于一般的旋转矩阵也有旋转矩阵的逆即为其转置

旋转效果如下:

image-20241205115452455

Liner Transforms

对于线性变换
$$
\begin{cases}
x’=ax+by\
y’=cx+dy
\end{cases}
$$
我们只需要左乘一个相同维度的矩阵$\boldsymbol M$
$$
\vec x’=\boldsymbol M \vec x, \boldsymbol M=\left(\begin{array}{c} a&b\c&d\end{array}\right)
$$
为进一步描述平移变换,只需要进一步加上平移量
$$
\vec x’ = \vec x+\vec t, \vec t = \left(\begin{array}{c} t_x\t_y\end{array}\right)
$$
为进一步描述仿射变换(Affine Transform)
$$
\vec x’=\boldsymbol M \vec x+\vec t
$$
但是这个就不属于线性变化的范畴了,为此我们引入齐次坐标,基于向量的平移不变性,增加一个维度;

一个理解是

vector + vector = vector
point - point = vector
point + vector = point
point + point = ?

在齐次坐标下,将三维点看作二维向量
$$
\left(\begin{array}{c}
x’\
y’\
w’
\end{array}\right)
{\rm \ is \ 2D\ point\ }
\left(\begin{array}{c}
x/w\
y/w\
1\end{array}\right),w\neq 0
$$
那么在齐次坐标的观点下,点+点的结果是线段的中点

平移变换可以表示如下
$$
\left(\begin{array}{c}
x’\
y’\
w’
\end{array}\right) = \left(\begin{array}{c}
1&0&t_x\
0&1&t_y\
0&0&1
\end{array}\right)
\left(\begin{array}{c}
x\
y\
1\end{array}\right)
$$
仿射变换可以表示如下
$$
\left(\begin{array}{c}
x’\
y’\
w’
\end{array}\right) = \left(\begin{array}{c}
a&b&t_x\
c&d&t_y\
0&0&1
\end{array}\right)
\left(\begin{array}{c}
x\
y\
1\end{array}\right)
$$

Affine Transformation

在齐次坐标下,这些特殊的仿射变换可以左乘如下矩阵,表达如下:

缩放Scale
$$
\boldsymbol S(s_x,s_y)= \left(\begin{array}{c}
s_x&0&0\
0&s_y&0\
0&0&1
\end{array}\right)
$$
旋转Rotate
$$
\boldsymbol R(\theta) =
\left(\begin{array}{c}
\cos \theta&-\sin\theta&0\
\sin\theta&\cos\theta&0\
0&0&1
\end{array}\right)
$$
平移Translation
$$
\bold T (t_x,t_y) =
\left(\begin{array}{c}
1&0&t_x\
0&1&t_y\
0&0&1
\end{array}\right)
$$

Inverse Transform

在数学上,逆变换等价于左乘变换矩阵的逆矩阵;

image-20241205122455101

Composite Transform

复杂的变换可以通过简单的变换相乘得到;

乘法的顺序很重要,因为矩阵乘法不满足交换律;

image-20241205122656009

image-20241205122756461

对于仿射变换矩阵$A_1,A_2,\cdots, $从右到左运用以下矩阵,根据结合律,可以先将所有矩阵合成为一个最终矩阵;
$$
\boldsymbol A_n\cdot \cdots \boldsymbol A_2 \cdot\boldsymbol A_1\cdot \left(\begin{array}{c}x\y\1\end{array}\right) = \boldsymbol M \vec v
$$
反过来也可以将复杂矩阵进行分解,下图是沿任意点旋转的过程

image-20241205123342624

Transform in 3D

试图引入齐次坐标

3D Point = $(x,y,z,1)^\top$

3D vector = $(x, y, z, 0)^\top$

几乎和2D版本同理,仿射变换如下:
$$
\left(\begin{array}{c}
x’\
y’\
w’\
1
\end{array}\right) = \left(\begin{array}{c}
a&b&c&t_x\
d&e&f&t_y\
g&h&i&t_z\
0&0&0&1
\end{array}\right)
\left(\begin{array}{c}
x\
y\
z\
1\end{array}\right)
$$
具体来说,

缩放变换
$$
\boldsymbol S(s_x,s_y,s_z)= \left(\begin{array}{c}
s_x&0&0&0\
0&s_y&0&0\
0&0&s_z&0\
0&0&0&1
\end{array}\right)
$$
平移变换
$$
\boldsymbol T(t_x,t_y,t_z)=
\left(\begin{array}{c}
1&0&0&t_x\
0&1&0&t_y\
0&0&1&t_z\
0&0&0&1
\end{array}\right)
$$
旋转变换(分别从x,y,z轴旋转),注意轮换对称性
$$
\boldsymbol R_x(\theta) =
\left(\begin{array}{c}
1&0&0&0\
0&\cos\theta&-\sin\theta&0\
0&\sin\theta&\cos\theta&0\
0&0&0&1
\end{array}\right)\
\boldsymbol R_y(\theta) =
\left(\begin{array}{c}
\cos\theta&0&\sin\theta&0\
0&1&0&0\
-\sin\theta&0&\cos\theta&0\
0&0&0&1
\end{array}\right)\
\boldsymbol R_z(\theta) =
\left(\begin{array}{c}
\cos\theta&-\sin\theta&0&0\
\sin\theta&\cos\theta&0&0\
0&0&1&0\
0&0&0&1
\end{array}\right)
$$
对于任意旋转,写成三个欧拉角对应的绕轴旋转
$$
\boldsymbol R_{xyz}(\alpha, \beta,\gamma)=\boldsymbol R_x(\alpha)\boldsymbol R_y(\beta)\boldsymbol R_z(\gamma)
$$
对于一个旋转轴$\mathbf n$和一个旋转角$\alpha$,这条旋转轴默认过原点,以下是Rodrigues旋转公式
$$
\boldsymbol R(\mathbf{n}, \alpha) = \cos \alpha I + (1-\cos\alpha) \mathbf{n}\mathbf{n}^\top + \sin\alpha
\left(\begin{array}{c}
0&-n_z&n_y\
n_z&0&-n_x\
-n_y&n_x&0
\end{array}\right)
$$
对于将三维模型转化成二维图片,应该经过如下mvp变换

  • model transformation
  • view transformation
  • projection transformation

视图变换

相机应该有如下属性,如下图所示

  • position $\vec e$

  • gaze direction $\hat g$

  • up direction $\hat t$

image-20241206142540343

在观察相机和背景进行着相同的相对运动时,得出的视图可能完全一样,我们约定相机永远在原点,沿着z轴看,头顶为y轴,这是相机的标准位置;

将任意摆放的相机平移到标准位置,需要经历以下步骤,那么这些步骤相乘对应的逆矩阵就是视图矩阵$\boldsymbol M_{view}$;

  • 将$\vec e$平移到原点
  • 旋转$\hat t$和y轴正方向同向
  • 旋转$(\hat g \times \hat t)$和x轴正方向同向

由此写出视图矩阵$\boldsymbol M_{view} = R_{view}T_{view}$
$$
T_{view} =
\left(\begin{array}{c}
1&0&0&-x_e\
0&1&0&-y_e\
0&0&1&-z_e\
0&0&0&1
\end{array}\right)
$$
思考$R_{view}$的逆,即将$(0,1,0,0)^\top$旋转到$\hat t$,将$(1,0,0,0)$旋转到$\hat g\times \hat t$,结合旋转矩阵的逆等于其转置,如下
$$
R_{view}^{-1} =
\left(\begin{array}{c}
x_{\hat g\times \hat t } & x_{\hat t} & x_{-\hat g} & 0\
y_{\hat g\times \hat t } & y_{\hat t} & y_{-\hat g} & 0\
z_{\hat g\times \hat t } & z_{\hat t} & z_{-\hat g} & 0\
0 & 0& 0 & 1
\end{array}\right )\

R_{view} =
\left(\begin{array}{c}
x_{\hat g\times \hat t } & y_{\hat g\times \hat t } &z_{\hat g\times \hat t } & 0\
x_{\hat t}& y_{\hat t} & z_{\hat t} & 0\
x_{-\hat g} & y_{-\hat g} & z_{-\hat g} & 0\
0 & 0& 0 & 1
\end{array}\right )
$$
相机和物品应该要运用相同的视图矩阵,所以模型变换和视图变换其实相同,也统称为魔模型视图变换;
$$
\boldsymbol M =
\left(\begin{array}{c}
x_{\hat g\times \hat t } & y_{\hat g\times \hat t } &z_{\hat g\times \hat t } & 0\
x_{\hat t}& y_{\hat t} & z_{\hat t} & 0\
x_{-\hat g} & y_{-\hat g} & z_{-\hat g} & 0\
0 & 0& 0 & 1
\end{array}\right )
\left(\begin{array}{c}
1&0&0&-x_e\
0&1&0&-y_e\
0&0&1&-z_e\
0&0&0&1
\end{array}\right)
$$

投影变换

投影变换分为

  • 正交投影Orthographic projection:常用于工程制图,相机在无限远处
  • 透视投影Perspective projection:常用于美术,有近大远小的成像原理

image-20241206145750325

Orthographic Projection

一般来说,我们将空间中方体$[l,r]\times [b,t]\times [f,n]$,可以映射为标准立方体(canonical cube)$[-1,1]^3$,这需要先进行平移再缩放即可,如下:
$$
\boldsymbol M_{o} =
\left(\begin{array}{c}
\frac{2}{r-l}&0&0&0\
0&\frac{2}{t-b}&0&0\
0&0&\frac{2}{n-f}&0\
0&0&0&1
\end{array}\right)
\left(\begin{array}{c}
1&0&0&-\frac{r+l}{2}\
0&1&0&-\frac{t+b}{2}\
0&0&1&-\frac{n+f}{2}\
0&0&0&1
\end{array}\right)
$$
Perspective Projection

对于透视变换,我们划归成正交投影变换问题:也就是规定一个近平面Near clip plane和一个远平面Far clip plane,其中两个面中心被相机正对着,满足以下性质

  • 运用矩阵后,近平面上点保持不动
  • 运用矩阵后,远平面上的点分量z保持不变
  • 运用矩阵后,原平面中心点保持不变

这样我们将两个面上的物品大小变得完全一样,可以直接运用正交投影变换,也就是
$$
\boldsymbol M_{p}=\boldsymbol M_{o} \boldsymbol M_{p\to o}
$$
image-20241206155742667

以下是变换矩阵$\boldsymbol M_{p\to o}$的推导:

对于空间任意一个点$(x,y,z,1)^\top$,和透视点和近平面满足某种相似三角形的特性,假设这个点被映射到近平面上的点$(x’,y’,z’,1)^\top$
$$
x’=\frac{n}{z}x,y’=\frac{n}{z}y
$$
在齐次坐标的假设下,这个点等价于$(nx,ny,*,z)^\top$;

变换矩阵应该具有如此形式,才能满足$\boldsymbol M_{p\to o} (x,y,z,1)^\top = (nx,ny,*,z)^\top$
$$
\left(\begin{array}{c}
n & 0 & 0 & 0\
0 & n & 0 & 0\

  • & * & * & *\
    0 & 0 & 1 & 0
    \end{array}\right)
    $$
    结合近平面方程和远平面方程,我们有
    $$
    \left(\begin{array}{c}
    n & 0 & 0 & 0\
    0 & n & 0 & 0\
  • & * & * & *\
    0 & 0 & 1 & 0
    \end{array}\right)
    \left(\begin{array}{c}
    0\
    0\
    f\
    1
    \end{array}\right)=
    \left(\begin{array}{c}
    0\
    0\
    f^2\
    f
    \end{array}\right)\

\left(\begin{array}{c}
n & 0 & 0 & 0\
0 & n & 0 & 0\

  • & * & * & *\
    0 & 0 & 1 & 0
    \end{array}\right)
    \left(\begin{array}{c}
    x\
    y\
    n\
    1
    \end{array}\right)=
    \left(\begin{array}{c}
    nx\
    ny\
    n^2\
    n
    \end{array}\right)
    $$
    最终透视变换的矩阵如下:
    $$
    \boldsymbol M_{p}=\boldsymbol M_{o} \left(\begin{array}{c}
    n & 0 & 0 & 0\
    0 & n & 0 & 0\
    0 & 0 & n+f & -nf\
    0 & 0 & 1 & 0
    \end{array}\right)
    $$
    思考:可以注意到,对于近平面和原平面之间的点,运用$M_{p\to o}$后$z$值变得更大也就是更靠近远平面了,数学上来说$n+f-\frac{nf}{z}>z,n< z< f$;

Shading

Visibility

绘画算法:从远到近将物体画在屏幕上,近处的物体覆盖远处的对应的图层;

将模型三角光栅化,考虑对三角形按照距离屏幕的深度排序,复杂度为$O(N\log N)$,但是可能存在相互覆盖的环;

引入Z-Buffer(深度缓存):

  • 为每一个像素保存当前的最小深度;
  • 同时维护两个缓存:帧缓存保存颜色值,深度缓存保存深度

算法如下:

1
2
3
4
5
6
7
8
9
Initialize depth buffer to ∞ 
During rasterization:
for (each triangle T)
for (each sample (x,y,z) in T)
if (z < zbuffer[x,y]) // closest sample so far
framebuffer[x,y] = rgb; // update color
zbuffer[x,y] = z; // update depth
else
; // do nothing, this sample is occluded

image-20241209194451115

假设每个三角形平均覆盖常数个像素,则该算法复杂度为$O(N)$;也就是该算法并不是基于排序的,假设每个三角不会在同一个像素用相同的深度,那么这个算法其实和三角形深度无关的;

Z-Buffer算法是目前最重要的可见性算法,已经在所有的GPU在硬件上实现;缺点是处理不了透明物体;

Blinn-Phong Reflectance Model

在绘画上,使用平行光线或者色块,引入图像的明暗和色彩;

在图形学上,着色指对物品应用某一种材质的过程;

最简单的着色模型是Blinn-Phong Reflectance Model;

观察下图有如下要素

  • Specular highlights: 高光,一般光线照射到光滑的地方,发生接近于镜面反射的效应;

  • Diffuse reflection: 漫反射,一般光线照射到粗糙的地方,其所有查看方向的表面颜色都相同

    image-20241209201146308

  • Ambient lighting:环境照明,物体接收到了间接的环境反射光,一般认为是常量;

image-20241209200203752

建立局部着色模型(Shading in Local)的输入:给定物体表面上一点Shading Point,考察光照照射在该点的输出,不考虑阴影(Shadow)

  • Viewer direction: 观察者看到物体的方向$\hat v$
  • Surface normal:物体表面切面法线向量$\hat n$
  • Light direction:光线方向$\hat l$
  • Surface parameters:物体表面属性,比如颜色,亮度

Diffuse Term

物理上来说,在物体单位面积上,考虑接受到光线能量应该正比于$\cos \theta =\hat l\cdot \hat n$;

image-20241209202325421

这是符合直觉的;

  • 物体被光照直射,理应接收更多光;
  • 物体和光照同向就几乎没有光照射上;

对于一种点光源,光线的能量在某一个时刻集中在一个球壳上(波动性);
$$
I_r\cdot 4\pi r^2=C
$$
考虑能量守恒,光线传播越远,能量衰减(light failoff)越多,用光照强度(intensity)定义能量;
$$
I_r=\frac{I_1}{r^2}
$$
由此建立漫反射模型
$$
L_d = k_d(\frac{I}{r^2})\max(0,\hat n\cdot \hat l)
$$

  • $L_d$:某方向上的漫反射光diffusely reflected light;
  • $k_d$:扩散系数diffuse soefficient,该点可能吸收一部分光而存在损耗,可以表示成三通道RGB值,就可以定义该点反射出来的颜色;
  • $\max(0,\hat n\cdot \hat l)$:不考虑光线从物体下面穿过,不考虑物体透明和折射

对于漫反射来说,不管从任何方向来看看起来都是一样,上式与$\hat v$无关,这说明此模型的合理性;

Specular Term

对于高光项,如果光线照射在比较光滑的物体,那么高光反射的光线应该类似于镜面反射,可以用其半程向量和法线接近描述;

Blinn-Phong模型定义半程向量
$$
\hat h = {\rm bisector}(\hat v, \hat l)=\frac{\hat v+\hat l}{\mid\mid\hat v+\hat l\mid\mid}
$$
类似定义高光项
$$
L_s = k_s(\frac{I}{r^2})\max(0, \hat n\cdot \hat h)^p
$$

  • $L_s$:镜面反射光specularly reflected light
  • $k_s$:亮度系数specular coefficient,相对于漫反射项来说很小
  • $p$:为解决余弦项容忍度过高的问题,一般取128,提高幂次以符合经验:偏离高光光线一点点就基本看不到了;

image-20241210183253418

Ambient Term

大胆假设环境中任意一点接收到环境光基本为常量,环境光着色不依赖于任何其他事物,真实世界可能未必这样;

添加常量颜色以考虑忽略的照明并填充黑色阴影,保证没有地方是完全黑的;
$$
L_a = k_aI_a
$$

  • $L_a$:反射环境光 reflected ambient light
  • $k_a$:环境光系数 ambient coefficient

模型输出为三项相加
$$
\begin{aligned}
L&=L_a + L_d + L_s\
&= k_aI_a + k_d(\frac{I}{r^2})\max(0,\hat n\cdot \hat l) + k_s(\frac{I}{r^2})\max(0, \hat n\cdot \hat h)^p
\end{aligned}
$$

Shading Frequency

对于光栅化的图像,可以按照每个三角形面,顶点,和像素为单位进行着色,它们的着色频率并不相同;

Flat Shading:每一个三角形面对应一个法向量,在光滑面上效果不好;

Gouraud Shading:跨三角形的顶点进行插值着色,每个三角形顶点对应一个法线

Phong Shading:在每个三角形上插值法线向量 ,计算每个像素的完整着色模型

以下是三个方法的对比图

image-20241210185959408

对于光栅化的图形,顶点对应的法线可以用其关联的所有三角形法线平均
$$
\hat N_v= \frac{\sum_{i} \hat N_i}{\mid\mid \sum_i \hat N_i\mid\mid}
$$
image-20241210190324268

Real Time Rendering

Pipline如下

image-20241210190526505

Texture Map

我们希望在物体表面上的不同位置的点定义不同属性,观察到任何三维物体的表面是二维的,反过来我们也可以把一张二维图贴在三维物体的表面,我们把这张二维图称为纹理;

对于纹理图上任意一个点,定义uv坐标系,每一个三角形的顶点对应纹理上的一个坐标$(u,v)$;

image-20241210194556777

一个看起来舒服的纹理,应该看起来上下左右无缝衔接,因为纹理可以被物体重复多次,比如tiled texture;

Barycentric Coordinates

在三角形内部进行插值的工具是重心坐标,重心坐标可以表示三角形内部的一个顶点,从而在三角形内部实现平滑过渡,常常用于纹理坐标,颜色,法向量的计算;

对于三角形$\triangle ABC$, 在三角形内部的任意一点,可以表示为三个顶点坐标的线性组合
$$
(x,y)=\alpha A+\beta B + \gamma C\
\alpha + \beta + \gamma =1
$$
若点在三角形内,还需满足三个系数非负;若无限制条件,表示点在三角形所在平面内;

image-20241212202923346

进一步,定义有向面积$A_A,A_B,A_C$,定义三角形面积$S_{\triangle ABC}$
$$
\alpha = \frac{A_A}{S_{\triangle ABC}},\beta = \frac{A_B}{S_{\triangle ABC}},\gamma = \frac{A_C}{S_{\triangle ABC}}
$$
用叉乘可以如下展开
$$
\alpha = \frac{(y-y_B)(x_C-x_B)-(x-x_B)(y_C-y_B)}{(y_A-y_B)(x_C-x_B)-(x_A-x_B)(y_C-y_B)}\
\beta = \frac{(y-y_C)(x_A-x_C)-(x-x_C)(y_A-y_C)}{(y_B-y_C)(x_A-x_C)-(x_B-x_C)(y_A-y_C)}\
\gamma = \frac{(y-y_A)(x_B-x_A)-(x-x_A)(y_B-y_A)}{(y_C-y_A)(x_B-x_A)-(x_C-x_A)(y_B-y_A)}\
$$
特别的,三角形的重心坐标为$\frac13 A+\frac13B+\frac13C$;

基于任意一点,可以利用重心坐标,根据顶点的属性值,插值成三角形内部的属性值
$$
V=\alpha V_A+\beta V_B + \gamma V_C
$$
image-20241212203915791

但是在投影变换下,重心坐标不保证发生变化,应该在投影之前计算三维空间下的重心坐标,插值之后再做投影变换;

Texture Mapping

基本思路为:对每个光栅化屏幕的采样点(通常为像素的中心),计算对应的纹理的坐标,在纹理上采样,设置样本点的纹理颜色;

像素在纹理上的采样对应的称为纹理元素(texel);

在实际应用时,针对不同场景,往往还要作如下优化:

Bilinear Interpolation

image-20241212205128667

假设像素对应的纹理坐标对应红点,我们考虑周围四个像素进行插值;

定义一维上的线段上的插值
$$
{\rm lerp}(x,v_0,v_1)=v_0 + x(v_1-v_0)
$$
考虑水平偏移$s$和垂直偏移$t$,可以在水平方向和垂直方向各做插值
$$
u_0 = {\rm lerp}(s,u_{00},u_{10})\
u_1 = {\rm lerp}(s,u_{01},u_{11})\
f(x,y) = {\rm lerp} (t,u_0,u_1)
$$
若取16个纹理格子的方法称作Bicubic,对比如下,解决纹理分辨率过低的问题;

image-20241212205708866

Mipmap

对于纹理分辨率过大的情况,可能出现锯齿和摩尔纹的问题;

image-20241212205906862

假设像素对应灰色的四边形,其中心为蓝点,在分辨率相对过大的情况下,可能像素覆盖了许多纹素,仅靠中心点的纹素难以描述整个像素的纹理信息,需要解决在纹理走样上的问题;

image-20241212210254529

抛弃采样的思路,我们尝试解决一类范围查询问题:给定平面上的一块像素区域,获得覆盖纹素的平均值;

引入Mipmap,快速地解决正方形的近似范围查询;

预处理纹理图像,生成$2\times 2$的卷积图像作为下一层,直到得到单个纹素,带来的额外空间开销为原来的$\frac13$;

image-20241212211136030

利用Mipmap我们只需要关注像素对应的区域在Mipmap的哪一层即可,对于任意一个像素块,可以映射到纹理上的某一区域;

image-20241212212116827

考虑像素中心和其邻居中心的距离为一个像素块长度,那么这个区域也近似为一个映射长度$L$的正方形;

image-20241212212234652

image-20241212212336567

映射长度计算如下:
$$
L=\max \left(\sqrt{(\frac{du}{dx})^2+(\frac{dv}{dx})^2},\sqrt{(\frac{du}{dy})^2+(\frac{dv}{dx})^2} \right)
$$
这个近似正方形的纹理平均值所在层数为
$$
D=\log_2 L
$$
在这一层像素对应的区域就近似于该层的一个纹素;

这样的计算代价可能是纹理映射变化不连续,我们考虑下层$\lfloor \log_2L \rfloor$和上一层$\lceil \log_2L \rceil$,进一步作三线性插值(Trilinear Interpolation);

image-20241212213314450

Anisotropic Filtering

使用Mipmap可能会在远处出现过度模糊的问题,可能是近似成正方形区域带来细节丢失严重的问题;

image-20241212213843252

通过各向异性过滤可以缓解Mipmap的问题;

image-20241212213856884

预计算Ripmaps 和总面积表,可以查找轴对齐的矩形区域 ,但是对角线足迹仍然是一个问题,而且带来的开销是原来的3倍;

image-20241212214340625

EWA filtering

通过多次查询,将不规则区域分成若干圆形;

  • 计算加权平均;
  • 仍然维护Mipmap 层次结构;
  • 可以处理不规则的足迹;

image-20241212214424929

Application

在现代GPU中,纹理可以看作一块内存+内存上的范围查询,可以将数据引入片段计算,这实际上是一些物理模型应用的上层抽象;

  • 环境光Environment lighting
  • 存储微观几何体Store microgeometry
  • 程序纹理Procedural textures
  • 实体建模Solid modeling
  • 体积渲染Volume rendering

Environment Lighting

我们需要将纹理描述环境光时,会生成一种环境贴图的特殊纹理,用于描述不同方向的光照信息;

一般认为环境光线来自无穷远处,也就是说,用环境光描述的环境贴图没有深度意义;

我们可以将环境贴图记录在一个球面上,再将球面展开(类似于地球仪和世界地图),称作Spherical Map;

但是Spherical Map潜在问题是靠近极点的位置可能发生扭曲;

一个改进是利用Cube Map,将光照信息存储在一个立方体上,将立方体展开得到6个图片;

对应关系如下:

image-20241226211043946

Store Height/normal

可以用纹理描述物体表面上的凹凸高度变化,生成凹凸/法线贴图(Bump/Normal mapping),用于虚拟物体的表面几何性质(Fake the detailed geometry);

将设没有贴图时物体表面为黑线,黄色的曲线为凹凸贴图记录的高度信息,我们需要根据两个信息重新计算切线和梯度;

image-20241226211905433

通过旋转坐标系的办法,我们假设没有贴图表面上一点的法向量为$(0,0,1)$;

对于贴图上切线,用某个因子衡量贴图对表面的影响程度,对梯度用如下差分作出近似;
$$
\frac{dp}{du}=c_1(h(u+1)-h(u))\
\frac{dp}{dv}=c_2(h(v+1)-h(v))
$$
经过贴图修正过后的法线应该是
$$
\hat n = (-\frac{dp}{du},-\frac{dp}{dv}, 1).{\rm normalized()}
$$
一个更加现代的方法是位移贴图Displacement mapping,实际改变光栅三角形的顶点位置,对比如下,可以看到在边缘处凹凸贴图的Fake之处,它没有改变几何体的形状;

image-20241226213536647

效果更好带来如下代价:模型需要足够细致,使得光栅采样的频率高于纹理变换的频率;

3D Procedural Noise + Solid Modeling + Volumn Rendering

纹理也可以记录一些三维信息,用噪声描述;

image-20241226214350077

Rasterization

Screen

对于一个宽高为width, height的屏幕来说,从一个视点来看可以形成一个视锥:

定义一个宽高比
$$
{\rm Aspect Ratio }=\frac{\rm width}{\rm height}
$$
以及一个垂直视角 Vertical Field of View(fovY):连接屏幕宽的中点,和视点形成的夹角;

同理定义水平可视角度;

image-20241207172656304

形式化来说
$$
\tan\frac{\rm fovY}{2}=\frac{t}{|n|}\
{\rm AspectRatio} =\frac{r}{t}
$$
image-20241207173113298

将屏幕(screen)抽象出如下要素

  • 一个由像素(pixel)构成的二维数组
  • 数组的大小称为分辨率(resolution)
  • 屏幕是典型的光栅成像设备

光栅化定义为将物品画在屏幕上的过程;

像素可以理解为一个颜色不变的小方块

如果我们需要将标准立方体一个面$[-1,1]^2$上的物品视图变换到$[0,\rm width]\times[0,height]$上,只需左乘以下矩阵
$$
\boldsymbol M_{view} =\left( \begin{array}{c}
{\rm width}/2 & 0 & 0 & {\rm width}/2\
0 & {\rm height/2}& 0 & {\rm height/2}\
0 & 0 & 1 & 0\
0 & 9 & 0 & 1
\end{array} \right)
$$

Sampleing

三角形有诸多性质,包括任意多边形可以进行三角剖分,三角形一定是平面图,边界和内部容易用叉积判断,重心坐标插值简单;

三角光栅化就是考虑像素中心和三角形的位置关系‘

光栅化的最简单办法:采样(sampling)

采样可如下形式化定义:

1
for(int x = 0; x<xmax; ++x) output[x] = f(x);

采样的对象很多,包括一维的时间,二维的面积,方向,三维的体积;

对于屏幕内的任意一点(x,y),定义采样

函数以判断点是否在三角形内
$$
\rm inside(t,x,y) = \begin{cases}\rm
1&\rm Point(x,y)\ in\ Triangle\ t\
0&\rm Otherwise
\end{cases}
$$
那么采样过程可以理解为扫描整个屏幕上的像素点

1
2
3
for (int x = 0; x < xmax; ++x) 
for (int y = 0; y < ymax; ++y)
image[x][y] = inside(tri, x + 0.5, y + 0.5);

image-20241207185400978

显然没有必要遍历整个屏幕,我们只需要考虑三角形的包围盒即可;

Sampling Artifacts

很显然,如果采样率过低,或者分辨率过低,就会产生锯齿(Jagies)问题,或者走样(Aliasing)现象;

假如说对一张图片,去掉一半的行,或者对着屏幕拍照,可能会有摩尔纹(Moire);

高速旋转的车轮可能看上去是倒转的(Wagon wheel effect);

抽象出这些现象的原因:信号变化太快但是采样太慢,用信号与系统的观点来看就是实际信号频率大于采样频率;

Blurring(Pre-Filtering) Before Sampling 是一个常见的反走样的技巧(Antialiasing idea);

但是反之(先采样再模糊)效果不好;

image-20241208144930773

DSP

在频域分析中,我们常用Fourier级数展开将几乎任意一种函数写成频率,振幅不同的波叠加
$$
f(x)=\frac{a_0}{2}+\sum_{n=1}^{\infty}a_n\cos n\omega x+b_n\sin n\omega x
$$

  • 直流分量:$\frac{a_0}{2}=\frac{1}{T}\int_{-T/2}^{T/2}f(x)dx$

  • 傅里叶系数:
    $$
    a_n=\frac{2}{T}\int_{-T/2}^{T/2}{f(x)\cos(n\omega x)dx}\
    b_n=\frac{2}{T}\int_{-T/2}^{T/2}{f(x)\sin(n\omega x)dx}
    $$

将周期信号$f(t)$推广成有限时间的非周期信号,也即时域从周期转化为非周期时,频域从离散的转化为连续的:原始的Fourier变换(FT)及其逆变换,其作用可以将函数从时域变换成频域;
$$
F(\omega)=\int_{-\infty}^{\infty}f(t)e^{-i\omega x}dx\
f(x)=\frac{1}{2\pi}\int_{-\infty}^{\infty}F(\omega)e^{i\omega x}d\omega
$$
我们分离出这些信号波,并用同一种方法采样,如下图

image-20241208150318558

可以看到,如果采样频率很低,跟不上信号本身的频率,那么采样就难以恢复出原来的信号;

image-20241208150436078

同样的采样函数,采样完全不同的信号函数得出一样的结果,仅凭结果无法区分两个信号,这样的现象称为走样(aliases);

对于一张图像来说,我们常用如下的2DFT,先要将图像转化成灰度图,然后将这张图片看作上下左右循环重复的大图;

2DFT将原始的灰度图像$I(x,y)$,转化成其频域图$F(u,v)$
$$
F(u,v)=\int_{-\infty}^{\infty}\int_{-\infty}^{\infty}f(x,y)e^{-i2\pi(ux+vy)}dxdy\
f(x,y)=\frac{1}{2\pi}\int_{-\infty}^{\infty}\int_{-\infty}^{\infty}F(u,v)e^{i2\pi (ux+vy)}dxdy
$$
在图像的边界涉及重复图像的切换,所以变化应该很明显,频域图蕴含信息较多,因此需要中心化;

中心的区域定义为高频区,信息较多;对于非中心的区域为低频区,信息较少;

以下是一张图及其对应频域图(频谱)

image-20241208153535998

Filtering

滤波的含义是对于删去函数频域上特定频率大小的子波;

我们对图像作高通滤波(High-pass filter),保留频率高的信号,得到图像的轮廓,轮廓蕴含的信息较多,这也是符合直觉的;

image-20241208153740024

反之,我们将图片通过一个低通滤波器,得到其模糊图像,也就是边界的概念几乎消失;

image-20241208153829837

某种观点上看,滤波(Filtering)=卷积(convolution)=平均(averaging);

image-20241208154307669

Convolution Theorem

空间域中的卷积等于频域中的乘法,反之亦然;

可以看到,对一张图像,我们先作2DFT将图像转化成其频谱,对频谱应用卷积核,其本质为是将某一像素的频率用周围像素的加权平均代替,形成新的频谱,这就完成了滤波过程,将新的频谱应用2DIFT,得到滤波处理后的图像,表现为原图像的模糊;

image-20241208155056788

不同卷积核的滤波效果:

  • 更大的卷积核,对应更大范围的像素平均代替原来像素,更新后像素差异变小,处理后图像越模糊,对应低通滤波
  • 更小的卷积核对应高通滤波

对于采样的过程可数学形式化如下:

将连续信号$f(x)$采样,采样时间点间隔为$T_s$,冲击序列为
$$
\delta_s(x)=\sum_{n=-\infty}^{\infty}\delta(x-nT_s)
$$
取样信号为
$$
f_s(x)=\sum_{n=-\infty}^{\infty}f(x)\delta(x-nT_s)
$$
其频谱密度为
$$
F_s(\omega)=\int_{-\infty}^{\infty}f_s(x)e^{-i\omega x}dx\
=\sum_{n=-\infty}^{\infty}\int_{-\infty}^{\infty}f(x)\delta(x-nT_s)e^{-i\omega x}dx\
=\sum_{n=-\infty}^{\infty}f(nT_s)e^{-i\omega nT_s}
$$
image-20241208160358803

时域上的卷积等价于频域上的乘积,理解上图发现:采样本质上是对频域内容的重复;

我们在频域上重新理解走样,假设原本的信号频谱,每$F_s$重复一次;

若采样速度过慢,反映在频谱上重复越频繁,重复间隔变小,就会出现不同频率成分的混合,发生走样现象;

image-20241208160720284

Antialiasing idea

Increase Sampling Rate

提高显示器的分辨率,或者传感器的采样率是终极解决办法,从根本上避免频谱重叠问题;

但是受限于实际条件无法更换,或者成本高昂,可能无法做到;

Pre-blur before Sampling

先对图像/信号的高频信息通过低通滤波器删除掉,也即对图像/信号变模糊,再以原本稀疏的采样率采样,处理后的信号/图像的频率间隔变窄,采样重复也不会发生重叠现象;

image-20241208161738648

image-20241208161753146

模糊操作先前提到,本质上是应用卷积核;

在光栅化三角形时,经过模糊后,定义像素内平均值inside(t,x,y)为三角形覆盖像素的面积

模糊效果如下

image-20241208161850156

Multiple Sampling Anti Aliasing(MSAA)

多重采样抗锯齿(MSAA)算法是对上述算法的近似,是一种在计算机图形学中广泛使用的抗锯齿技术。它主要用于解决图形渲染时产生的边缘锯齿问题,使得图像边界更加平滑,更加贴近真实视觉效果。

思想:通过对像素内的多个位置进行采样并平均其值,来近似像素框滤镜的效果

  1. 在每个像素中采集 NxN 样本

    image-20241208162707054

  2. 平均每个像素“内部”的 NxN 样本

    image-20241208162721846

  3. 对每个涉及像素,用tradeoff值替代,而不是二元值0-1

    image-20241208162841499

缺点是计算开销大,一般可能采用更先进的算法,比如复用邻近像素

其他抗锯齿方案:

  • TXAA(Temporal Anti-Aliasing):TXAA 是一种基于时间的抗锯齿技术,通过在多个帧之间进行颜色混合来消除锯齿。它结合了空间和时间上的信息,效果更好,但实现复杂且性能开销较大
  • FXAA(Fast Approximate AA):采样无关算法,是图像后期处理消除锯齿

Super resolution / super sampling

  • From low resolution to high resolution
  • Essentially still “not enough samples” problem
  • DLSS (Deep Learning Super Sampling)

Ways to Represent Geometry

有两种办法表示几何体:隐式表示(Implicit)和显式表示(Explicit);

隐式表示包括:algebraic surface,level sets,distance functions,一般告知集合体表面上点满足的特定关系,一般写作
$$
f(x,y,z)=0
$$
这样的表示很容易判定点是否在几何体的内外,不过可能存在采样困难的问题;

显式表示包括:point cloud,polygon mesh,subdivision, NURBS,可以用如下参数映射的办法
$$
f:\R^2\to \R^3 ;(u,v)\to(x,y,z)
$$
没有最佳的表示办法,只能根据需要选取合适的表示方法;

第一章:数据通信、数据网络和因特网

1.1 现代企业的数据通信和网络构成

1.1.1 趋势

  • 通信量的上升
  • 新服务的发展
  • 技术的进步

1.1.2 数据传输和网络容量需求

高速局域网的出现

网络处理的数据量不断上升,数据传送的可接受延迟必须变小

企业广域网需求

由集中式数据处理模式迭代到高速广域网的建立;

数字电器

大大增加了网络运载的图像和视频的通信量

1.1.3 融合

使用网际协议基于分组的传输

1.2 通信模型

要素:源点、发送器、传输系统、接收器、终点

1.3 数据通信

1.3.1 数据通信模型

image-20231211162001737

1.3.2 信息的传输

企业关注传输媒体的选择,引人注目的是光纤传输和无线传输;

通过复用和压缩提高传输效率;

传输和传输媒体

双绞线、同轴电缆、光缆、地面微波、卫星微波

通信技术

编码

传输效率

复用和压缩

1.4 网络

局域网(LAN):世界上最普遍的网络类型之一,

简单介绍各种类型的网络:

1.4.1 广域网

广域网的建立采用下列技术

  • 电路交换:两点建立专用的通信路径
  • 分组交换:数据以小的分组发送出去
  • 帧中继:采用变长的帧,高数据率和低误码率
  • ATM(异步传输方式):采用固定长度且较短的信元,拓展电路交换技术

1.4.2 局域网

范围小、相连设备属于同一组织、数据率高

1.4.3 无线网络

移动性、安装配置的简易性;

1.5 因特网

1.5.1 因特网起源

由DARPA开发,基础是TCP/IP协议族

1.5.2 要素

  • 主机
  • 网络
  • 路由器:连接网络

运行方式如下:源点将数据拆分成IP分组,每个分组包含IP地址,每个分组携带IP地址途径一连串的路由器和网络,到达目的点

1.5.3 因特网的体系结构
  • 交换局
  • 用户驻地设备
  • 因特网服务提供者
  • 网络接入点
  • 网络服务提供者
  • 网络接入点
  • 网络服务提供者
  • 汇接点

第二章:协议体系结构、TCP/IP和基于互联网的应用程序

2.1 协议体系结构的必要性

协议作为规则的集合,构成栈结构

协议要素:语法、语义、定时关系

2.2 简单的协议结构

通信任务划分为3个层次:网络接入层、运输层、应用层;

应用程序在计算机内部也有唯一的地址:端口;

  • 运输层为数据加上运输首部,内容是协议控制信息,形成协议数据单元(PDU),这个过程成为封装,PDU也称为报文段;
  • 网络层接受来自运输层的报文段,网络接入协议(NAP)为报文段加入一个网络接入首部,形成分组;

2.3 TCP/IP协议体系结构

2.3.1 TCP/IP各层

  • 物理层
  • 数据链路层
  • 网际层
  • 运输层
  • 应用层

image-20231211170457277

2.3.2 TCP和IP的操作

  • 主机A上端口3关联的进程将报文向下递交给TCP,告知发送主机B的端口2,报文增加控制信息(TCP首部)形成TCP报文段
  • TCP向下递交报文给IP,告知发送给主机B,增加IP首部形成IP报文段
  • IP将报文向下递交给网络接入层,告知发送给路由器J,增加网络层首部形成分组或者帧、

2.3.3 TCP和UDP

  • TCP为应用程序之间的数据传送形成可靠的连接;
  • UDP不保证交付的正确性,不维护到达时的顺序,不管是否有重复到达,面向无连接;
  • SNMP(简单网络管理协议)使用了UDP

image-20231211212035244

2.3.4 IP和IPv6

  • IP首部格式最小长度为20字,IPv6首部格式最小为40字
  • IPv6由IETF发布,人们对更多地址有需求

image-20231211212053143

2.3.5 协议接口

  • TCP/IP协议族每一层都与他的邻层直接交互操作;

  • 有些应用并没有每一层都用到,调用任意一层的服务是允许的;

2.4 协议体系结构的内部标准化

2.4.1 标准和协议层

每一层所要求的标准化工作的三个关键元素;协议规约、服务定义、寻址

2.4.2 服务原语和参数

发放N实体向另一系统的对等N实体传送数据:

  • 源点N实体请求调用他的N-1实体,参数是传输的数据和终点地址
  • N-1实体准备一个(N-1)PDU发送到对等N-1实体
  • 终点的N-1实体把数据交付给终点适当的N实体,参数为数据和源点地址
  • 若要求确认,终点的N实体向N-1实体发送响应
  • N-1实体用(N-1)PDU运送这个确认
  • 以证实的服务原语交付给N实体

image-20231211214228519

2.5 传统的基于因特网的应用程序

  • 简单邮件传输协议(SMTP)
  • 文件传送协议(FTP)
  • 安全外壳(SSH)

2.6 多媒体

2.6.1 媒体类型

  • 文本
  • 音频
  • 图像
  • 视频

2.6.2 多媒体应用

流视频、流音频等

2.7 套接字编程

2.7.1 套接字

一个应用程序可以有多个套接字地址,每个端口对应一个套接字

2.7.2 套接字接口调用

……

第三章:数据传输

3.1 概念与术语

3.1.1 传输术语

  • 导向媒体、非导向媒体
  • 直连链路、点对点、多点
  • 单工、半双工、全双工

3.1.2 频率、频谱和带宽

  • 模拟信号、数字信号

  • 周期信号

  • 峰值振幅、频率、相位、周期、波长

  • 频域、基频、谐频

    一般的,信号频率越大的成分的强度迅速减小,但不为零

  • 绝对带宽、有效带宽(带宽)

  • 直流成分

  • 对于频率为$f$的01方波,每个脉冲持续时间为$\frac{1}{2f}$,数据率为$2f$,对于振幅为A的方波径傅里叶变换表达式如下

    $s(t)=A\times \frac{4}{\pi}\times \sum_{k=1,k\equiv 1mod2}^{\infty}\frac{sin(2\pi fkt)}{k}$

    任何数字波形都有无限的绝对带宽,但是将它作为一个信号在某个媒体上传输,媒体将限制信号的带宽(传输带宽越高,成本越高)

  • 信号的数据率越高,其有效带宽越宽

3.2 模拟和数字数据传输

3.2.1 模拟数据与数字数据

模拟数据:音频等

数字数据:文本、字符串等

视频既可以用连续信号传输,也可以存储为数字文件格式

3.2.2 模拟信号和数字信号

音频带宽:300~3400Hz

视频带宽:0~4MHz

二进制数据:取决于波形

3.2.3 模拟传输和数字传输

模拟传输:包括放大器来克服衰减,但可能导致失真

数字传输:通过转发器,每隔一段短距离恢复原来的数字信号

数字传输的优势:

  • 数字技术
  • 数据完整性
  • 容量利用率
  • 安全保密
  • 综合性

3.2.4 异步传输和同步传输

  • 异步传输:拒绝无中断的长比特流
  • 同步传输:发送器和接收器建立独立的时钟路线以确保时钟同步,短距离表现良好,长距离有可能时钟脉冲会受到损伤

3.3 传输损伤

3.3.1 衰减

对于电磁波,频率越高衰减越严重,采取均衡衰减技术;

相对衰减值$N_f=-10lg(\frac{P_f}{P_{1000}})$;

3.3.2 时延

靠近中心频率的地方传播速度快,两侧较慢,因此信号的不同频率成分到达接收器的时间不同;

3.3.3 噪声

传输性能的主要制约因素:噪声

分类:热噪声、互调噪声、串扰、冲击噪声…

3.4 信道容量

信道容量:信道能达到的最大数据传输速率

3.4.1 奈奎斯特带宽

无噪声、信道带宽为B,可承受的最大信号率为2B

限制来源于码间串扰;

对于多电平信号,$C=2Blog_2M$;

3.4.2 香农容量公式

噪声的存在会破坏一个或多个比特,数据率增加,比特率变短,给定噪声模式会影响更多比特;

$SNR_{db}=10lg\frac{P_s}{P_n}$,SNR越高,表明信号质量越高;

在高斯白噪声影响下,信道无误码容量公式$C=Blog_2(1+SNR)$;

频谱效率$\frac{C}{B}=log_2(1+SNR)$;在SNR<1时几乎线性,在SNR>1时平缓上升;

信噪比低于0dB,影响信道容量的主要因素是噪声;高于0dB,则取决于信号的设计;

3.4.3 表达式 $ {E_b}/{N_0}$

T为温度,$T_b$为发送一比特的时间,S是信号功率,R为数据率;

$E_b=ST_b=S/R$;

$\frac{E_b}{N_0}=\frac{S/R}{N_0}=\frac{S}{kTR}=\frac{S}{N}\frac{B}{R}=\frac{B}{C}(2^{C/B}-1)$;

$(\frac{E_b}{N_0}){dB}=S{dbW}-10lgR+228.6dbW-10lgT$;

第四章:传输媒体

传输媒体:发送器和接收器之间的物理通道;

4.1 导向媒体

4.1.1 双绞线

最常用的传输媒体;

廉价方便;

应用:电话网,楼层之间的通信;

可用于模拟传输和数字传输;

在传输距离、带宽和数据率限制较大;

EIA发布ANSI/EIA/TIA-568标准;

  • 无屏蔽双绞线UTP

​ 可作为普通的话音级电话线,绞距越小,支持的传输速率越高,造价越贵;

​ 在电磁场干扰下显得脆弱;

  • 屏蔽的双绞线STP

    价格更贵,可应用于有干扰源的环境

4.1.2 同轴电缆

应用:电视传播,长途电话传播,计算机系统之间的短距离连接,局域网;

可用于模拟传输和数字传输;

相对双绞线可应用在频率更高,数据率更快的环境中;

4.1.3 光纤

由光纤丝和光缆组成;

应用:军事,局域网,长途干线、市区干线、农用交换干线、用户环路;

优势:容量更大,体积小重量轻,衰减小,隔绝电磁场,转发器间隔更远;

  • 多模突变:适合短距离,传输性能好;
  • 多模渐变:中心较高的折射率,应用于局域网;

4.2 无线传输

4.2.1 天线

最简单的天线:各向同性天线(全向天线);

抛物面发射天线:应用于地面微波和卫星应用;

天线增益

$G_{dB}=10lg(\frac{P_{参考}}{P_{定向}})$;

$G=\frac{4\pi A_e}{\lambda^2}=\frac{4\pi f^2A_e}{c^2}$

抛物线天线物理面积为A,有效面积为0.56A;

4.2.2 地面微波

应用:长途电信服务,蜂窝系统;

损耗:$L=10lg(\frac{4\pi d^2}{\lambda^2})^2$

4.2.3 卫星微波

卫星从上行频段接受传输信号,从下行频段发送出去,这些频段简称转发器;

应用:电视广播,长途电话传输,专用商业网络,全球定位;

最佳频率范围1~10GHz;

4.2.4 广播无线电

损伤的主要来源是多径;

4.2.5 红外线

无法穿透墙体

4.3 无线传播

4.3.1 地波传输

应用:调幅无线电广播

4.3.2 天线传播

信号经过电离层反射会地球;

4.3.3 视距传播

沿地表弯曲,比光学视距略远;

中间无障碍物情况下,$d_{km}=3.57\sqrt{Kh_{m}}$;

视距传播的两根天线的高度为$3.57(\sqrt{Kh_1}+\sqrt{Kh_2}),K=\frac{4}{3}$;

4.4 视距传输

4.4.1 自由空间损耗

卫星通信的主要损耗方式;

对于理想化的全向天线来说,$\frac{P_t}{P_f}=\frac{(4\pi d)^2}{\lambda^2}=\frac{(4\pi fd)^2}{c^2}$

$L_{dB}=-20lg\lambda_m+20lgd_m+21.98dB$

$L_{dB}=20lgf_{Hz}+20lgd_m-147.56dB$

对于其它类型的天线,必须考虑天线增益G(或者有效面积A)

$\frac{P_t}{P_f}=\frac{(4\pi d)^2}{G_rG_t\lambda^2}=\frac{(cd)^2}{f^2A_rA_t}$

4.4.2 大气吸收

降雨频繁地区应该使用路径较短或者较低的频段;

4.4.3 多径

经障碍物反射产生多个副本,时延各不相同;

4.4.4 折射

无线电波经大气传播会发生弯曲的现象;

第五章:信号编码技术

5.1 数字数据 数字信号

  • 数据率:发送一个比特所需要的时间;
  • 调制速率:信号电平改变的速率;
  • 可以利用编码机制来提高传输性能,下面是不同机制的评估方式:
    • 信号频谱
    • 时钟同步
    • 差错检测
    • 信号干扰和抗噪声度
    • 费用和复杂性

5.1.1 不归零码(NRZ)

  • 无电压表示二进制0,正电平表示二级制1
  • 负电平表示二进制0,正电平表示二进制1(不归零电平)
  • 不归零1制(NRZI):有跳变表示1,无跳变表示0;属于差分编码

NRZ容易实现,能有效利用带宽;但有直流成分,且缺乏同步能力;

5.1.2 多电平二进制

  • 双极性AMI

    正负脉冲表示1,零电平表示0;

    直流分量为0,有检错手段,接受电路简单

  • 伪三进制

    交替的正负脉冲表示0,零电平表示1;

    直流分量为0,有检错手段,接受电路简单

数据率较高时引入扰码;

5.1.3 双相位

曼彻斯特编码:从低到高跳变表示1,从高到低跳变表示0;

差分曼彻斯特编码:比特中央位置提供定时关系,周期起始没有跳变表示1,有跳变表示0;

优点:同步、、无直流成分、有差错检测

缺点:所需求的带宽大

5.1.4 调制率

调制率是信号元生成的速率;

比如曼彻斯特编码数据率为$\frac{1}{T_b}$,调制率为$\frac{2}{T_b}$;

5.1.5 扰码技术

双相位技术很少运用于远距离因为他们要求更高的信号传输速率;

  • 双极性8零替换B8ZSimage-20231212231623827

  • 高密度双极性3零 HDB3

image-20231212231721060

5.2 数字数据 模拟信号

5.2.1 振幅键控ASK

5.2.2 频移键控FSK

5.2.3 相移键控

5.2.4 性能

5.3 模拟数据 数字信号

解码器将模拟信号转换成可传输的数字信号,或者将数字信号恢复成原来的模拟数据

5.3.1 脉码调制

基础:采样原理

原始信号带宽为B,脉幅调制(PAM)样本采集速率为2B,每个$\frac{1}{2B}$s采集一次;

使用量化PAM脉冲来恢复原有信号,仅仅发生近似,不能完全恢复;

使用同一的量化过程,但是对输入的模拟信号进行压扩,可减少失真;

5.3.2 增量调制

DM实现简单,并且数据率相同情况下比脉码调制有功耗的信噪比

5.3.3 性能

第六章:差错检测和纠正

6.1 差错类型

  • 单比特差错
  • 突发性差错

6.2 差错检测

  • 一个无比特差错帧的到达概率随帧的长度增加而减小;
  • 差错检验码有其他传输比特计算得到;

6.3 奇偶校验

6.3.1 奇偶校验比特

  • 每7个比特的IRA字符附加奇偶校验比特;
  • 奇校验用于异步传输,偶校验用于同步传输;
  • 偶数比特错误不能检测到;

6.3.2 二维奇偶校验

可以纠正一个比特的错误;检测某一行(列)偶数个差错的发生;

构成矩形的四个差错无法检测出来;

6.4 因特网校验和

  • 无符号二进制八位整数相加
  • 循环进位
  • 补充端到端的差错检测(假定数据链路层使用CRC这这样的强大的差错检测码)

6.5 循环冗余检测

6.5.1 模二除法

给定k位比特块D,生成n-k位帧检测序列F(FCS),形成要发送的n位帧T;

n-k+1位长的预定比特序列P,我们希望T/P没有余数;

$T=2^{n-k}D+F$;

采用异或除法;

6.5 2 多项式

P(X)=q(x) 或P(x)=(x+1)q(x),q(x)为本原多项式;

6.5 3 数字逻辑

6.6 前向纠错

FEC编码器将k比特数据块映射为更长的n比特码字,经过传输后可能会产生与源码字相似的比特串,再经过FEC解码器还原;

  • 无差错
  • 可检测,可纠正的差错
  • 可检测,不能纠正的差错
  • 不能检测的差错

6.6.1 块码原理

增加冗余位、比较汉明距离;

原则:对于接受到的非法码字,选择与它汉明距离最近的合法码字

对于$(n,k)$块码,有$2^n$可能码字,有$2^k$合法码字,

冗余度为$\frac{n-k}{k}$;

编码率为$\frac{k}{n}$;

映射的码字中最短的汉明距离设为$d$,

能保证纠正所有小于等于$t$比特差错的编码,要有$2t+1\le d$;

保证纠正所有小于等于$t-1$比特差错,检测出t比特差错的编码,要有$2t\le d$

每个码字可保证被纠正的差错数位$t=[\frac{d-1}{2}]$

每个码字可保证被检测的差错数位$t=d-1$

第七章:数据链路控制协议

数据链路控制的要求与目标:

  • 帧同步
  • 流量控制
  • 差错控制
  • 寻址
  • 控制信息和数据在同一个链路上
  • 链路管理

7.1 流量控制

传输时间:将帧传到媒体所需的时间,与帧的长度成正比;

传播时间:一个比特由源点到终点所需要的时间;

在接受之前,每个帧都会受到任意不等量的时延;

7.1.1 停止等待流量控制

源实体传输一个帧,目的实体接收到后会返回一个确认帧;源点发送下一个帧之前必须等待,直到接收到下一个帧;

源点把大块的数据分割成较小的数据块,并用很多个帧来传输这些数据块;

帧的长度为$L_{bit}$数据的链路长度$B_{bit}$,链路的数据率$R_{bps}$,链路的长度$d_m$,传播速度$v_{m/s}$,有$B=R\frac{d}{v}$;

传输时间取归一化值1,传播时延$a=\frac{B}{L}$;

数据率很高,或者发送接收方相距很远,停止等待协议提供的链路效率不高;

7.1.2 滑动窗口流量控制

  • B为W帧分配了缓存,因此能一次接受W帧,允许A在无确认情况下发送W帧;
  • B返回带有序号的确认帧,表明B确认接受序号之前的帧,A可以发送序号之后的帧;
  • A维护允许发送的序号列表,B维护准备接受的序号列表
  • 对于k比特长的字段,最大窗口大小为$2^k-1$,实际窗口值可以不必等于最大可能值;
  • 滑动窗口协议允许接受发发送”接受未就绪“的RNR帧,确认前面帧已接受但是不接受后面的帧,这时需要接收方重新发送一个确认帧来开启滑动窗口;
  • 对于两个方向的传输,常常应用捎带技术,

7.2 差错控制

可能存在的两种类型的差错,需要使用自动重传请求:

  • 帧丢失
  • 帧损伤

7.2.1 停止等待ARQ

基于停止等待流量控制;

  • 检测到数据帧损伤:终点丢弃该帧不返回确认帧,源点内置计时器,计时器超时重传;
  • 检测到确认损伤:交替标记确认帧未ACK0和ACK1,ACK0表示接收到1帧,准备接受0帧

优势:简单易行,缺点:低效

采用滑动窗口机制称作连续ARQ;

7.2.2 返回N ARQ

基于滑动窗口流量控制;

  1. 帧损伤:接收到的帧i无效,B简单丢弃帧i;
    • A继续发送帧(i+1),B发觉次序不对返回一个REJ i,A重传帧i以及后面帧;
    • A没有继续发送,B未接收到任何帧,不返回RR和REJ,A计时器超时,先传一个RR帧要求B发送RR响应帧表明希望接受到的帧,A接收到RR响应帧后重传帧i;
  2. RR损伤:B接收到帧i,返回一个RR(i+1);
    • RR(i+1)丢失,A接收到下一帧的RR并在计时器超时前到达;
    • 若未到达,A返回一个RR要求B响应自己的命令(内置P比特计时器),重复数次,重复次数到达阈值,A启动复位;
  3. REJ损伤:B未接收到任何帧,不返回RR和REJ,A计时器超时,先传一个RR帧要求B发送RR响应帧表明希望接受到的帧,A接收到RR响应帧后重传帧i;

7.2.3 选择拒绝ARQ

重传的只有否认的帧和超时的帧,否认称为SREJ;

需要维护一个足够大的缓存已保存SREJ后的帧;

应用于卫星链路;

对于k比特信号,未来避免发送窗口和接收窗口出现重叠,最大窗口值限制在$2^{k-1}$;

7.3 高级数据链路控制(HDLC)

7.3.1 基本特点

站点:主站、从站、混合站

链路设置:非平衡、平衡

数据传送方式:正常响应(NRM),异步平衡(ABM)、异步响应(ARM);

7.3.2 帧结构

首部:标志(8bit),地址(8bit+),控制(8bit or 16bit)

尾部:FCS(16bit or 32bit),标志(8bit);

7.3.3 运行方式

HDLC要求两个站点交换I帧、S帧和U帧;

初始化

通知进行初始化;指出请求(NRM,ABM,ARM),指出使用3bit还是7bit

接受返回UA帧,拒绝返回DM帧

数据传送

拆链

对于拆链帧DISC,对方必须用UA帧回答;

第八章:复用

  • 数据率越高,传输设备性价比越高;
  • 大部分通信设备对自身要求达到的数据率相对不太高;

数据链路的容量应当被共享;

8.1 频分复用

8.1.1 特点

  • 传输媒体的有效带宽超出被传输信号要求的带宽和,可以使用FDM
  • 每个被调制的信号都会具有各自载波频率为中心的一定的带宽(信道)
  • 媒体上传输的混合信号是模拟的,每个信号调制到相应的副载波上后叠加形成复合基带,符合信号经过一个整体调制到载波信号上,解调后,通过各个带通滤波器解调恢复成原始信号;
  • 需要注意串扰问题和交调噪声;

8.1.2 模拟载波系统

8.1.3 波分复用

不同频率的多路光纤在同一光纤上传输时,才能充分利用光纤;

8.2 同步时分复用

8.2.1 特点

8.2.2 TDM链路控制

8.2.3 数字载波系统

8.2.4 SONET/SDH

8.3 电缆调解调制器

8.4 非对称数字用户线路

8.4.1 ADSL设计

8.4.2 离散多音调

8.4.3 带宽接入设计

8.5 xDSL

8.5.1 高数据率数字用户路线HDSL

8.5.2 单线数字用户路线SDSL

8.5.3 甚高数据率数字用户路线VDSL

8.6 多信道接入

8.6.1 频分双工FDD

8.6.2 时分双工TDD

8.6.3 频分多址FDMA

8.6.4 时分多址

第九章:广域网技术和协议

广域网设计的传统方式:电路交换和分组交换;

9.1 交换式通信网

数据从一个结点进入网络后,经过由一个结点到另一个结点的交换,最后传到目的地;

结点和结点之间的链路通常式点对点的专线;

9.2 电路交换网络

过程:

  • 电路建立
  • 数据传送
  • 电路断连

特点:

连接的通路式数据开始传输前建立的;

交换效率可能很低;

信道容量专用;

透明度高;

公用电信网络组成:用户,用户环路,交换局,中继线;

9.3 电路交换的概念

数字交换机:

  • 网络接口
  • 控制单元

当两个站点之间的所有通路都正在使用无法建立连接的时候就发生了阻塞;

9.3.1 空分交换

信号通路和信号通路从物理上分隔开的交换机;

纵横交换机:价格高,一个交叉点损坏导致相连线路设备无法使用,利用率低;

多级交换机:交叉点少提高了利用率,可靠性,可能被阻塞;

9.3.2 时分交换

独立的数据块(时隙)由控制逻辑控制,言输入端到输出端为数据选择路由并传递它们;

9.3.3 时隙交换

基础:时隙交换机制TSI;

以便建立全双工的连接,传入某一时隙的数据被存储起来,直到下一周期数据通过正确的信道被发送出去,引入时延;

TSI帧尾每个信道提供时隙,必须考虑线路的容量;

信道数目越多,所经历的平均时延越大;

9.3.4 时间复用交换

TMS交换机由数字选择器实现,信道的分配由时隙计数器存储器提供;

减少阻塞可建立多级机制;

9.4 软交换体系结构

属于电路交换;

通过专门软件将计算机变成智能电话交换机;

  • 媒体网关MG;

  • 媒体网关控制器MGC;

9.5 分组交换原理

  • 分组长度上限值:1000字节;
  • 过长则分割成报文序列,每个保温包括部分数据和一些控制信息;
  • 控制信息使得分组在网络中能按一定路由前进;

优点:效率高,数据率转换,更方便处理拥塞,有优先级别;

9.5.1 交换技术

  • 数据报:分组独立,分组不一定按相同路由到达,由终点重新排序;省略呼叫建立过程;
  • 虚电路:发送分组之前,建立特定路由,双方分组按相同路由穿过网络,这条电路可以被共享;分组传递更快;

9.5.2 分组大小

控制信息位于首部,包含3个字节;

更多的分组导致时延的增加

9.5.3 外部网络接口

虚电路服务使得任意用户之间可以建立(外部)虚电路逻辑连接

9.5.4 电路交换和分组交换对比

短报文数据报分组交换更快,长报文分组交换可能更出色;

电路交换服务式透明的;

image-20231214091535807

9.6 异步传输方式

ATM是一种交换和复用的技术,采用信元(小的固定长度的分组),保证时延变化小和打包时延小;

多协议标记交换(MPLS)是二层的面向连接的分组交换协议;

9.6.1 ATM逻辑连接

VCC虚通路连接是ATM网络中基本的交换单元,交换速率可变,全双工,长度固定的信元流;

优势:

  • 简化了网络体系结构;
  • 增强了网络性能和可靠性;
  • 减少了处理过程并缩短连接建立时间
  • 增强了网络服务:对端用户可见;

特性:

  • 服务质量Qos
  • 交换和半永久的需通路连接;
  • 通信量参数协商和使用监控;

9.6.2 ATM信元

有5个字节首部和48个字节信息字段组成;·

image-20231214092623103

第十章:蜂窝无线网络

10.1 蜂窝网络的概念

10.1.1 蜂窝网络的概念

image-20231214093330124

频率重用

两个相同使用频率之间的蜂窝必须相隔N个蜂窝,$N=I^2+J^2+IJ,D/R=\sqrt{3N}$;

增大容量

增加新信道,频率借用,蜂窝分裂,蜂窝扇区化,微蜂窝

10.1.2 蜂窝系统的操作

中心位置包括基站,基站包括天线,控制器和收发器;

10.1.3 移动无线电传播效应

  • 信号强度
  • 衰落:Hata模型

10.1.4 移动环境中的衰落

多径传播

信号的发射,衍射和散射

多径传播效应

信号带来的时延和码间干扰(ISI)

衰落的类型

快衰落、慢衰落

差错补偿机制

前向纠错,自适应均衡,分集

10.2 四代蜂窝网络

10.2.1 第一代

1G:高级电话服务系统AMPS

10.2.2 第二代

2G:支持数字业务信道,加密,差错检测和纠正,信道接入

10.2.3 第三代

3G:提供高速无线通信;

主导技术:CDMA

10.2.4 第四代

4G:基于完全IP分组交换网络

10.3 LTE-Advanced

10.3.1 LTE-Advanced体系结构

  • 中继
  • 演进型分组核心网EPC
  • 毫微微蜂窝

10.3.2 LTE-Advanced传输特性

  • 正交频分复用OFDM
  • 多输入多输出MIMO

DHCP协议学习笔记

一、基本概念

定义:动态主机配置协议(Dynamic Host Configuration Protocol)

  • 应用层协议(UDP 67/68端口)
  • 自动为网络设备分配IP地址及其他配置参数

核心功能

  1. IP地址动态分配
    • 从地址池自动分配临时IP(租约机制)
  2. 配置参数传递
    • 子网掩码、默认网关、DNS服务器等
  3. 地址回收与重用
    • 租约到期后自动回收未续约的IP

二、工作原理

1. 四步交互流程(DORA过程)

1
2
3
4
5
sequenceDiagram
客户端->>DHCP服务器: DHCP Discover(广播)
DHCP服务器->>客户端: DHCP Offer(单播)
客户端->>DHCP服务器: DHCP Request(广播)
DHCP服务器->>客户端: DHCP Ack(单播)

2. 报文类型

报文类型 方向 作用
DHCP Discover 客户端→服务器 寻找可用DHCP服务器
DHCP Offer 服务器→客户端 提供IP配置提案
DHCP Request 客户端→服务器 确认接受配置
DHCP Ack/Nak 服务器→客户端 最终确认/拒绝分配

三、关键技术特性

1. 租约管理

  • 租约时长:默认8天(可配置)
  • 续租流程
    1. T1时间(50%租期):单播续租原IP
    2. T2时间(87.5%租期):广播请求新服务器
    3. 到期后释放IP并重启DORA过程

2. 地址池类型

类型 特点 适用场景
动态分配 临时IP,租期结束后回收 普通用户设备
静态绑定 MAC-IP固定映射 服务器/打印机
自动分配 长期保留首次分配的IP 移动设备优化体验

四、安全注意事项

⚠️ 常见攻击

  1. DHCP饥饿攻击:伪造大量请求耗尽地址池
  2. 恶意服务器注入:伪造DHCP服务器分配错误配置

🛡️ 防护措施

1
2
3
# 交换机端口安全配置(Cisco示例)
switch(config-if)# ip dhcp snooping
switch(config-if)# ip dhcp snooping limit rate 10

五、实践命令

1. Windows客户端操作

1
2
3
4
5
6
7
8
# 释放IP地址
ipconfig /release

# 重新获取IP
ipconfig /renew

# 查看完整租约信息
ipconfig /all | findstr "Lease"

2. Linux服务器配置(isc-dhcp-server)

1
2
3
4
5
6
7
8
# 配置文件示例(/etc/dhcp/dhcpd.conf)
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.1;
option domain-name-servers 8.8.8.8;
default-lease-time 86400; # 24小时
max-lease-time 172800; # 48小时
}

计算机组成原理

第一章:计算机系统概述

冯诺依曼结构

  • 存储器(MU) :存储指令和数据;
  • 输入单元(IU):接收输入信号;
  • 输出单元(OU):发送输出信号;
  • 算数逻辑单元(ALU):执行算数逻辑操作;
  • 控制单元(CU):产生各部件的控制信号;

CPU

  • 封装了CU,ALU与寄存器;
  • 通过控制总线、地址总线和数据总线进行互联;
  • 寄存器位于CPU内部,保持和CU、ALU同频,因而速度快于外部存储器;

存储器

  • 随机访问寄存器(RAM):易失性寄存器,访问速度较快但断电内容消失;
  • 只读寄存器(ROM):非易失性寄存器,常用于初始化启动指令;
  • 采用“Cache-主存-磁盘”的三级存储结构;

I/O接口与总线

与外界进行信息交互;

计算机性能初步

  • CPU时间不包括程序输入输出时间或者运行其他程序的时间,表示程序在CPU上执行的时间(小于程序的响应时间);

  • 缩短程序的响应时间能增加吞吐率,反之不一定(可以增加处理器的个数);

  • CPU使用晶振产生的时钟信号来驱动或者定时;

  • CPU时间=程序时钟周期时间$\times$周期数

    周期数=对应指令集花费的周期数
    $CPU(Pro)=\sum_{A\in Pro}{CPI(A)\times num(A)}$

  • 性能比表示两个计算机的性能差异;

​ $\frac{性能_A}{性能_B}= \frac{CPU(B)}{CPU(A)}$

  • SPEC:实用基准测试程序集

    基于现有应用程序的一套标准化源代码作为基准的测试程序集;
    方便对计算机性能的比较;

    设置一个参考计算机,对于每一个参考程序,对所有的计算机均可计算出性能比,对于各个程序的性能比取几何平均值$\sqrt[n]{\prod_{i=1}^{n}SPECratio_i}$即可算出总体性能比;

性能的改进

  • 提高并行的层次

    • 系统级:使用多处理器
    • 指令级:流水线
    • 操作级:并行加法器,组相连cache,流水级功能部件
  • 局部性原理(经验性质的原理)

    • 时间局部性:最近访问过的项目可能近期内再次被使用
    • 空间局部性:最近访问过的数据地址附近可能会再次使用
    • 注重经常性事件:Amdahl定律
      $ Speedup(A)=\frac {改进A前时间}{改进A后时间}$
      $ F(A)=A在程序运行的时间在程序Pro中所占比例$
      $ Speedup(Pro)=\frac{1}{1-F(A)+\frac{F(A)}{Speedup(A)}}$
      $ Speedup(Pro)<\frac{1}{1-F(A)}$,这说明性能提高的瓶颈在于改进比例;
      $ Speedup(Pro)$越大,改进越优秀;

第二章:计算机的数值与编码

补码

  • 对于一个r位数d,对应补码为$f(d)=\begin{cases} &\text d ,d>0;\ &\text (2^r-1)-|d|+1 ,d>0;\end{cases} $;
  • 对于正数而言,补码等于本身,对于负数而言,补码等于其绝对值的反码加1;
  • 已知补码,若最高位为0,表示正数,原码等于补码;若最高位为1,原码为补码减1后取反得到的正数的相反数;
  • 补码表示的范围是$[100..0,011..1]$,也即$[-2^{n-1},2^{n-1}-1]$;
  • 转化为更高位的数:符号拓展&零拓展
    • 符号拓展:在最高位前面增加相应的符号位(正0负1),适用于有符号数;
    • 零拓展:在最高位前面增加0,适用于无符号数;
  • 溢出:符号位相反两数相加不会溢出;溢出位交给异常处理;
  • 乘除法基于加减法和移位运算实现;
  • 移位
    • 左移:右端补0;
    • 右移:
      • 逻辑右移:左端补0;
      • 算数右移:左端补符号位;
  • 逻辑与、或、非、异或:实现某些位的变化;

浮点数的规格化

  • 二进制浮点数算数标准 IEEE-754 约定了小数点的位置
  • 浮点数$(-1)^s\times (1.M_2)\times 2^E$ 分别为 符号位(1位) 阶码(8位/32位 或者 11位/64位) 尾数(23位/32位 或者 52位/64位) ,也即$[s][E+2^{n-1}-1][M_2]$;
  • 小数点左边的数不必储存,约定始终为1
  • 尾数按小数部分的真值进行存储
  • 指数真实值需要加上固定偏移量$2^{n-1}-1$进行存储,$n$为阶码字段位数(即一般为127或1023)
  • 阶码不能全0不能全1(属于保留数字,无穷或者无效数字)

浮点数的加减

  • 对阶操作
    小数点位置对齐(阶码相等),小阶向大阶看看齐,隐藏位右移
  • 尾数运算
    增加隐藏位,进行加减运算
  • 规格化处理
    重新转化为一个规格化浮点数

实例:

对于13位二进制数(1位符号位,5位阶码,7位尾数)$x=1.0110011\times2^9,y=1.1101101\times2^7$,计算$x+y$;

过程:

阶码的固定偏移量为$2^4-1=15$;因而$x$的阶码表示为24(11000),$y$的阶码表示为22(10110);

$x$的编码为$[0][11000][0110011]$,$y$的编码为$[0][10110][1101101]$;

将$y$阶码向$x$对齐,隐藏位右移得$[0][11000][0111011]$;

尾数相加$01.0110011+00.0111011=01.1101110$,得$x+y=[0][11000][1101110]=1.1101110\times2^9$;这已经是一个规格数了;

浮点数的乘除

  • 阶码定点加减
  • 尾数乘除
  • 规格化处理

字符的表示

  • 二进制编码
  • 美国信息交换标准码(ASCII): 表示现代英文和符号,但是过于有限
  • 统一码(Unicode) :每个符号要用两个或多个字节表示,但存在浪费,十六进制表示
  • UTF-8 :变长的编码方式,用1-4个字节表示符号,二进制表示

第三章:计算机芯片的数字电路基础

  • 输入输出逻辑关系:与/或/非
  • 多输入端和一个输出端
  • 利于封装组合和模块化不关心内部电路实现
  • 输入变化存在延迟时间(基于晶体管等电气特性)

逻辑代数基础

Axioms

  1. If $x\neq 0$, $x=1$ ;if $x\neq1$, $x=1$
  2. If $x=0$ , $\overline{x}=1$ ;if $x=1$ ,$\overline{x}=0$
  3. $0 \cdot 0=0,0 \cdot 1=0, 1\cdot 0=0,1\cdot 1=1 $
  4. $0+0=0,1+0=1,0+1=1$,$1+1=1$

Notices

  • $1+A=1$
  • $A+A=A$
  • $A+BC=(A+B)\cdot (A+C)$
  • $\overline{A+B}=\overline{A}\cdot \overline{B}$
  • $A+\overline{A}B=A+B$
  • $A+AB=A$
  • $AB+\overline{A}C+BCDEF=AB+\overline{A}C$

反演定理

与运算和或运算置换,取反运算不变,变量取反,计算顺序不变,得到反演逻辑式;
两相等逻辑式的反演逻辑式相等;

对偶定理

与、或运算置换,0、1置换,得到对偶式;
两相等逻辑表达式的对偶式相等;

最大项之积和最小项之和

最小项编码依据是真值为1;

最大项编码依据是真值为0;

标准形式:
$F=\sum_{}{m(i_1,i_2,…,i_k)}=\prod_{}{M(j_1,j_2,…,j_t)}$

反复利用$B=(A+\overline {A})B$, $A+BC=(A+B)(A+C)$即可;

在$Carnot$ 图中,每个格子进行$0~2^n-1$的编码,相邻两个格子编码$Haming$距离为1(换言之,构成一个Gray码),用尽量少的框去框尽可能多的1,方便得到更简单的逻辑电路图

利用标准形式可以判断两个逻辑函数是否相等,即逻辑函数相等那么他们的标准形式等价

逻辑序列

CMOS逻辑

  • 3.5~5V:高态

  • 1.5~3.5V:未定义逻辑电平

  • 0~1.5V:低态

  • NMOS和PMOS晶体管共用形成CMOS逻辑

    • 对于NMOS,$V_{gs}=0V$断开,$V_{gs}=5V$导通;

      image-20231024232258414

    • 对于PMOS,$V_{gs}=0V$断开,$V_{gs}=-5V$导通;

      image-20231024232343077

非门

仅用了一个NMOS管和一个PMOS管;

image-20231024232819276

与非门、与门

用了k个NMOS管和k个PMOS管(k为输入端口数目,最多输入端为6个),下图是k=2的CMOS电路:

image-20231024233404303

通过级联一个非门可以得到与门,尽量能使用与非运算表示的逻辑不用与运算的道理就在此处;

或非门

将与非门中NMOS与PMOS互换可以得到或非门,类似的实例不再展示(最多输入端为4个):

同样级联一个非门可以得到或门;

静态电气特性

$V_{OHmin}$:输出为高态时的最小输出电压,一般为VCC-0.1V;

$V_{OLmax}$:输出为低态时的最大输出电压,一般为地+0.1V;

$V_{IHmin}$:保证能被识别为高态的最小输入电压,一般为VCC的70%;

$V_{ILmax}$:保证能被识别为低态的最大输入电压,一般为VCC的30%;

image-20231024234337257

进行级联时应该满足相应大小关系;

不用的输入端不允许悬空不接;

动态电器特性

  1. 转换时间

    上升时间$t_r$和下降时间$t_f$图示,近似等于器件电阻和负载电容的乘积;

    启示:尽可能使的信号驱动的输入端最少以减少负载电容;

    image-20231026105142094

  2. 传播延迟

    输入信号变化到输出信号变化所需时间;

    $t_p=t_{pLH}+t_{pHL}$;

    启示:尽可能使电路简单化以降低传播延迟;

    image-20231026101525221

  3. 动态功耗

    电路处于非稳态时,MOS部分导通产生的漏电流带来功耗,是总功耗的主要部分;

    $P_D=(C_{PD}+C_L)V_{CC}\times f$ ;

Verilog

第四章:计算机芯片的基本电路组成

组合逻辑电路

注意与非门、或非门比较简单,注意转化为与非和或非的组合;

Multiplex多路选择器

最简单的多路选择器(Multiplexer)是1位二选一多路器。

当输入S为高电平时,输入Y的值为输入A1的值;

当输入S为低电平时,输入Y的值为输入A0的值;
$$
Y=\overline{S}A_0+SA_1=\overline{\overline{\overline{S}A_0}\cdot \overline{SA_1}}
$$

1
2
3
4
5
6
7
8
9
10
11
module MUX2X1(
input A0,
input A1,
input S,
output Y
);
not i0(S_n,S);
nand i1(A0S,A_0,S);
nand i2(A1S,A_1,S_n);
nand i3(Y,A0S,A1S);
endmodule

对于32位二选一选择器功能描述风格代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
module MUX2X32(A_0,A_1,S,Y);
input[31:0] A_0,A_1;
input[0:0] S;
output[31:0] Y;

function[31:0] select;
input[31:0] A,B;
input[0:0] S;
case(S)
1'b1:select=A;
1'b0:select=B;
endcase
endfunction

assign Y=select(A_1,A_0,S);
endmodule

module MUX2X32(A_0,A_1,S,Y);
input[31:0] A_0,A_1;
input[0:0] S;
output[31:0] Y;

assign Y=S==1'b0?A_0:A_1;
endmodule

也可以用门级电路实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
module MUX2X32(
input[31:0]A_0,
input[31:0]A_1,
input[0:0]S,
output[31:0]Y
);
MUX2X1 i0(
.A_0(A_0[0]),
.A_1(A_1[0]),
.S(S),
.Y(Y[0])
);
MUX2X1 i1(
.A_0(A_0[1]),
.A_1(A_1[1]),
.S(S),
.Y(Y[1])
);
...//篇幅略长,但好像没找到别的办法了?
MUX2X1 i31(
.A_0(A_0[31]),
.A_1(A_1[31]),
.S(S),
.Y(Y[31])
);
endmodule

对于32位四选一选择器实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
module MUX2X32(A_0,A_1,A_2,A_3,S,Y);
input[31:0] A_0,A_1,A_2,A_3;
input[1:0] S;
output[31:0] Y;

function[31:0] select;
input[31:0] A,B,C,D;
input[0:0] S;
case(S)
2'b00:select=A;
2'b01:select=B;
2'b10:select=C;
2'b11:select=D;
endcase
endfunction

assign Y=select(A_0,A_1,A_2,A_3,S);
endmodule

Decode译码器

$n-2^n$二进制译码器,其n个输入端信号形成一个n位的二进制数值,其$2^n$个输出端中对应序号的输出端为高电平输出,其余$2^n-1$个输出端输出低电平信号;

带使能端En的译码器真值表如下

$En$ $I_1$ $I_0$ $Y_0$ $Y_1$ $Y_2$ $Y_3$
0 x x 0 0 0 0
1 0 0 1 0 0 0
1 0 1 0 1 0 0
1 1 0 0 0 1 0
1 1 1 0 0 0 1

image-20231026112149809

image-20231026112209039

DEC2T4E门级电路实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
module DEC2T4E(I0,I1,En,Y0,Y1,Y2,Y3);
input I0,I1,En;
output Y0,Y1,Y2,Y3;

not i0(I0_n,I0);
not i1(I1_n,I1);
not i2(En_n,En);

nor i3(YY0,I0,I1,En_n);
nor i4(YY1,I0,I1_n,En_n);
nor i5(YY2,I0_n,I1,En_n);
nor i6(YY3,I0_n,I1_n,En_n);
endmodule

DEC5T32E实现如下;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
module DEC5T32E(I,En,Y);
input[4:0] I;
input En;
output[31:0] Y;

function[31:0] dec;
input[4:0] I;
input En;

if(En)
begin
case(I)
5'b0_0000 : dec = 32'b0000_0000_0000_0000_0000_0000_0000_0001 ;
5'b0_0001 : dec = 32'b0000_0000_0000_0000_0000_0000_0000_0010 ;
5'b0_0010 : dec = 32'b0000_0000_0000_0000_0000_0000_0000_0100 ;
5'b0_0011 : dec = 32'b0000_0000_0000_0000_0000_0000_0000_1000 ;
5'b0_0100 : dec = 32'b0000_0000_0000_0000_0000_0000_0001_0000 ;
5'b0_0101 : dec = 32'b0000_0000_0000_0000_0000_0000_0010_0000 ;
5'b0_0110 : dec = 32'b0000_0000_0000_0000_0000_0000_0100_0000 ;
5'b0_0111 : dec = 32'b0000_0000_0000_0000_0000_0000_1000_0000 ;
5'b0_1000 : dec = 32'b0000_0000_0000_0000_0000_0001_0000_0000 ;
5'b0_1001 : dec = 32'b0000_0000_0000_0000_0000_0010_0000_0000 ;
5'b0_1010 : dec = 32'b0000_0000_0000_0000_0000_0100_0000_0000 ;
5'b0_1011 : dec = 32'b0000_0000_0000_0000_0000_1000_0000_0000 ;
5'b0_1100 : dec = 32'b0000_0000_0000_0000_0001_0000_0000_0000 ;
5'b0_1101 : dec = 32'b0000_0000_0000_0000_0010_0000_0000_0000 ;
5'b0_1110 : dec = 32'b0000_0000_0000_0000_0100_0000_0000_0000 ;
5'b0_1111 : dec = 32'b0000_0000_0000_0000_1000_0000_0000_0000 ;
5'b1_0000 : dec = 32'b0000_0000_0000_0001_0000_0000_0000_0000 ;
5'b1_0001 : dec = 32'b0000_0000_0000_0010_0000_0000_0000_0000 ;
5'b1_0010 : dec = 32'b0000_0000_0000_0100_0000_0000_0000_0000 ;
5'b1_0011 : dec = 32'b0000_0000_0000_1000_0000_0000_0000_0000 ;
5'b1_0100 : dec = 32'b0000_0000_0001_0000_0000_0000_0000_0000 ;
5'b1_0101 : dec = 32'b0000_0000_0010_0000_0000_0000_0000_0000 ;
5'b1_0110 : dec = 32'b0000_0000_0100_0000_0000_0000_0000_0000 ;
5'b1_0111 : dec = 32'b0000_0000_1000_0000_0000_0000_0000_0000 ;
5'b1_1000 : dec = 32'b0000_0001_0000_0000_0000_0000_0000_0000 ;
5'b1_1001 : dec = 32'b0000_0010_0000_0000_0000_0000_0000_0000 ;
5'b1_1010 : dec = 32'b0000_0100_0000_0000_0000_0000_0000_0000 ;
5'b1_1011 : dec = 32'b0000_1000_0000_0000_0000_0000_0000_0000 ;
5'b1_1100 : dec = 32'b0001_0000_0000_0000_0000_0000_0000_0000 ;
5'b1_1101 : dec = 32'b0010_0000_0000_0000_0000_0000_0000_0000 ;
5'b1_1110 : dec = 32'b0100_0000_0000_0000_0000_0000_0000_0000 ;
5'b1_1111 : dec = 32'b1000_0000_0000_0000_0000_0000_0000_0000 ;
default : dec = 32'b0000_0000_0000_0000_0000_0000_0000_0000 ;
endcase
end
else dec = 32'b0000_0000_0000_0000_0000_0000_0000_0000 ;
endfunction

assign Y=dec(I,En);
endmodule

Encode编码器

将输入信号的每一个高、低电平信号编制成其对应的二进制编码;

如果出现多个输入高电平时,编码器产生最高优先级的输入端对应的编号。我们把这样的编码器叫做优先级编码器;

优先级编码器还需要一个额外的输出端IDLE来标识当前的输入信号是否为全0;

$ I_7$ $I_6$ $I_5$ $I_4$ $I_3$ $ I_2$ $ I_1 $ $ I_0 $ $ Y_2 $ $ Y_1 $ $ Y_0 $ $Idle$
1 x x x x x x x 1 1 1 0
0 1 x x x x x x 1 1 0 0
0 0 1 x x x x x 1 0 1 0
0 0 0 1 x x x x 1 0 0 0
0 0 0 0 1 x x x 0 1 1 0
0 0 0 0 0 1 x x 0 1 0 0
0 0 0 0 0 0 1 x 0 0 1 0
0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 1

ENC8T3I实现如下(尚未验证):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
module ENC8T3I(
input [7:0] I,
output [2:0] Y,
output [0:0] Idle
);
if(I[7]) begin Y=3'b111; Idel=1'b0; end
else if(I[6]) begin assign Y=3'b110; assign Idel=1'b0; end
else if(I[5]) begin assign Y=3'b101; assign Idel=1'b0; end
else if(I[4]) begin assign Y=3'b100; assign Idel=1'b0; end
else if(I[3]) begin assign Y=3'b011; assign Idel=1'b0; end
else if(I[2]) begin assign Y=3'b010; assign Idel=1'b0; end
else if(I[1]) begin assign Y=3'b001; assign Idel=1'b0; end
else if(I[0]) begin assign Y=3'b000; assign Idel=1'b0; end
else begin assign Y=3'b000; assign Idel=1'b0; end

endmodule

Adder 加法器

如果能通过逻辑电路直接得出全加器每一位的进位信号就无需从最低位向最高位逐级传递进位信号了,这样的加法器叫做超前进位(Carry Lookahead)加法器;

图源

四位超前进位加法器门级电路实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
module CLA_4(
input[3:0] X,
input[3:0] Y,
input[0:0] Cin,
output[3:0] S,
output[0:0] Cout
);
wire[3:0] P=X|Y;
wire[3:0] G=X&Y;
wire[3:0] Gn=~G;

and i1(P0Gn0,P[0],Gn[0]);
xor(S[0],P0Gn0,Cin);
nand(P0Cin0,P[0],Cin);
nand(Cout0,Gn[0],P0Cin0);

and(P1Gn1,P[1],Gn[1]);
xor(S[1],P1Gn1,Cout0);
nand(P1P0Cin0,P[1],P[0],Cin);
nand(P1G0,P[1],G[0]);
nand(Cout1,Gn[1],P1G0,P1P0Cin0);

and(P2Gn2,P[2],Gn[2]);
xor(S[2],P2Gn2,Cout1);
nand(P2P1P0Cin0,P[2],P[1],P[0],Cin);
nand(P2P1G0,P[2],P[1],G[0]);
nand(P2G1,P[2],G[1]);
nand(Cout2,Gn[2],P2G1,P2P1G0,P2P1P0Cin0);

and(P3Gn3,P[3],Gn[3]);
xor(S[3],P3Gn3,Cout2);
nand(P3P2P1P0Cin0,P[3],P[2],P[1],P[0],Cin);
nand(P3P2P1G0,P[3],P[2],P[1],G[0]);
nand(P3P2G1,P[3],P[2],G[1]);
nand(P3G2,P[3],G[2]);
nand(Cout,Gn[3],P3G2,P3P2G1,P3P2P1G0,P3P2P1P0Cin0);

endmodule

16位组间串行进位加法器实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
module CLA_16 (X, Y, Cin, S, Cout);
input [15:0] X, Y;
input Cin;
output [15:0] S;
output Cout;
wire Cout0, Cout1, Cout2;
CLA_4 add0 (X[3:0], Y[3:0], CIN, S[3:0], Cout0);
CLA_4 add1 (X[7:4], Y[7:4], Cout0, S[7:4], Cout1);
CLA_4 add2 (X[11:8], Y[11:8], Cout1, S[11:8], Cout2);
CLA_4 add3 (X[15:12], Y[15:12], Cout2, S[15:12], Cout);
endmodule

32位组间串行进位加法器实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
module CLA_32 (X, Y, Cin, S, Cout);
input [31:0] X, Y;
input Cin;
output [31:0] S;
output Cout;
wire Cout0, Cout1, Cout2,Cout3, Cout4, Cout5,Cout6, Cout;

CLA_4 add0 (X[3:0], Y[3:0], CIN, S[3:0], Cout0);
CLA_4 add1 (X[7:4], Y[7:4], Cout0, S[7:4], Cout1);
CLA_4 add2 (X[11:8], Y[11:8], Cout1, S[11:8], Cout2);
CLA_4 add3 (X[15:12], Y[15:12], Cout2, S[15:12], Cout3);
CLA_4 add4 (X[19:16], Y[19:16], Cout3, S[19:16], Cout4);
CLA_4 add5 (X[23:20], Y[23:20], Cout4, S[23:20], Cout5);
CLA_4 add6 (X[27:24], Y[27:24], Cout5, S[27:24], Cout6);
CLA_4 add7 (X[31:28], Y[31:28], Cout6, S[31:28], Cout);

endmodule

Adder-Subtracter加减器

利用加法器可实现减法运算;

可在串行进位加法器的基础上对其中一个输入向量的每个位信号增加了一个异或门,实现:

当输入信号Sub为低电平时,完成加法运算,当输入信号Sub为高电平时,完成减法运算;

image-20231026123543859

16位组间串行进位加减器实现如下:

1
2
3
4
5
6
7
8
module ADDSUB_16 (X, Y, Sub, S, Cout);
input [15:0] X, Y;
input Sub;
output [15:0] S;
output Cout;
CLA_16 adder0 (X, Y^{16{Sub}}, Sub, S, Cout);
endmodule

32位组间串行进位加减器实现如下:

1
2
3
4
5
6
7
module ADDSUB_32 (X, Y, Sub, S, Cout);
input [31:0] X, Y;
input Sub;
output [31:0] S;
output Cout;
CLA_32 adder0 (X, Y^{32{Sub}}, Sub, S, Cout);
endmodule

Shifter 移位器

  • X是32位移位前的输入信号;Sh是32位移位后的输出信号;

  • 输入Sa表示移位位数,5位宽(移位位数为0~31位);

  • 输入Arith为高电平表示进行算术移位,为低电平表示进行逻辑移位;

  • 输入Right为高电平表示向右移位,为低电平表示向左移位;

    image-20231026232851309

  • 根据输入移位二进制表示,将移位器分成5级,分别进行移位16,8,4,2,1位;

(未测试)32位移位器的粗略实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
module SHIFTER_32 (X, Sa, Arith, Right, Sh);
input [31:0] X;
input [4:0] Sa;
input Arith, Right;
output [31:0] Sh;
wire [31:0] T4, S4, T3, S3, T2, S2, T1, S1, T0;
wire a = X[31] & Arith;
wire [15:0] e = {16{a}};
parameter z = 16'b0;
wire [31:0] L1u, L1d, L2u, L2d, L3u, L3d, L4u, L4d, L5u, L5d;
assign L1u = {X[15:0] ,z};
assign L1d = {e, X[31:16] };
MUX2X32 M1l (L1u, L1d, Right, T4);
MUX2X32 M1r (X, T4, Sa[4], S4);
//完成第1级多路器实现

endmodule

Comparator 比较器

按位异或结果每一位都是0说明相同,输出高电平;否则不同,输出低电平;

image-20231026233710687

image-20231026233724350

(未测试)CPT4的基本实现

1
2
3
4
5
6
7
8
9
10
module CPT4 (A, B, Y);
input [3:0] A, B;
output Y;
xor i0 (D0, A[0], B[0]);
xor i1 (D1, A[1], B[1]);
xor i2 (D2, A[2], B[2]);
xor i3 (D3, A[3], B[3]);
nor i4 (Y, D0, D1, D2, D3);
endmodule

Extender 数据拓展器

有两种方式:符号拓展,零拓展;

数据扩展模块需要一个数据输入端、一个扩展方式选择端和一个数据输出端;

image-20231027093832127

(未测试)16位数拓展32位数具体实现;

1
2
3
4
5
6
7
8
9
10
11
12
module EXT16T32 (X, Se, Y);
input [15:0] X;
input B;
output Y;
wire [31:0] E0, E1;
wire [15:0] e = {16{X[15]}};
parameter z = 16ˊb0;
assign E0 = {z, X};
assign E1 = {e, X};
MUX2X32 i(E0, E1, Se, Y);
endmodule

时序逻辑电路

D锁存器

image-20231027094316742

D En Q Qn
1 1 1 0
0 1 0 1
X 0 维持不变 维持不变

D锁存器不会出现其输出Q和Qn同时为高电平的情况,从而也就避免了当D锁存器关闭时其输出进入不可预知状态

具体实现(未测试)

1
2
3
4
5
6
7
8
9
10
11
12
module D_Latch (D, En, Q, Qn);
input D, En;
output Q, Qn;
wire Sn, Rn, Dn;
not i0 (Dn, D);
nand i1 (Sn, D, En);
nand i2 (Rn, En, Dn);
nand i3 (Q, Sn, Qn);
nand i4 (Qn, Q, Rn);
//这两行代码实现的是Sn-Rn锁存器
endmodule

D触发器

在计算机芯片内部,我们往往需要通过输入的时钟边沿信号(时钟的上升沿或下降沿)去控制D锁存器的开闭,把这种用时钟边沿控制D锁存器中存储内容的元件叫做D触发器;

用两个D锁存器和两个非门构成了一个上升沿触发式D触发器;

image-20231027094702910

D Clk Q Qn
1 上升沿 1 0
0 上升沿 0 1
X 0 维持不变 维持不变
X 1 维持不变 维持不变

具体实现(未测试)

1
2
3
4
5
6
7
8
9
10
11
module D_FF (D, Clk, Q, Qn);
input D, Clk;
output Q, Qn;
wire Clkn, Q0, Qn0;
not i0 (Clkn, Clk);
D_Latch d0 (D, Clkn, Q0, Qn0);
//主锁存器
D_Latch d1 (Q0, Clk, Q, Qn);
//从锁存器
endmodule

带使能端和清零端的上升沿式D触发器

image-20231027094948639

D Clk En Clrn Q Qn
1 上升沿 1 1 1 0
0 上升沿 1 1 0 1
X X 0 1 维持不变 维持不变
X 上升沿 X 0 0 1

32位通用寄存器

image-20231027095212431

1
2
3
4
5
6
7
8
9
10
module D_FFEC32 (D, Clk, En, Clrn, Q, Qn);
input [31:0 ] D;
input Clk, En, Clrn;
output [31:0] Q, Qn;
D_FFEC d0 (D[0], Clk, En, Clrn, Q[0], Qn);
D_FFEC d1 (D[1], Clk, En, Clrn, Q[1], Qn);

D_FFEC d31 (D[31], Clk, En, Clrn, Q[31], Qn);
endmodule



基于Multisim的方波-三角波-正弦波-锯齿波函数发生器电子电路仿真项目设计

author: 谢卿云 计算机科学与工程学院(网络安全学院) 计算机科学与技术(“互联网+”复合型精英人才双学位培养计划)专业 2022010910017
date:26th,June,2023

摘要

函数信号发生器是在电子电路设计领域和设备检测领域应用极广,本项目利用基础的电子电路元件(电阻,电容,电位器,理想开关,直流稳压电源,运算放大器,二极管,稳压管等),通过对信号发生的基本原理与结构进行 了分析,设计了简易的方波-三角波-正弦波-锯齿波函数信号发生器:由各个直流稳压电源提供运算放大器的供电电压,利用文氏正弦型振荡电路产生正弦波,滞回比较器和同相比例放大器产生方波,在此基础上,利用积分放大器产生三角波以及利用电位器和二极管产生了锯齿波;本实验的全部结果均由软件Multisim14.2仿真完成。

关键词:文氏正弦型振荡电路,滞回比较器,积分放大器,Multisim14.2。

Abstract:

Function signal generator is widely used in the field of electronic circuit design and equipment detection. This project uses basic electronic circuit components (resistors, capacitors, potentiometers, ideal switches, DC regulated power supplies, operational amplifiers, diodes, regulated tubes, etc.) to analyze the basic principle and structure of signal generation. A simple square-wave-triangular-sine-wave-sawtooth function signal generator is designed: the power supply voltage of the operational amplifier is provided by each DC voltage regulator, sinusoidal oscillation circuit is used to generate sinusoidal wave, hysteresis comparator and multiplication amplifier to generate square wave, and on this basis, triangular wave is generated by integrating amplifier and sawtooth wave is generated by potentiometer and diode. All the results of this experiment were simulated by Multisim14.2 software.

Key words: sinusoidal oscillation circuit, hysteresis comparator, integrated amplifier, Multisim14.2.

目录

第一章:前言、课程设计任务与要求

第二章:电路设计原理

2.1 正弦波产生电路工作原理

2.2 方波产生电路工作原理

2.3 三角波产生电路工作原理

2.4 锯齿波产生电路工作原理

第三章:Multisim仿真项目实验数据与方法记录

3.1 正弦波发生实验数据与方法

3.2 方波发生实验数据与方法

3.3 三角波发生实验数据与方法

3.4 锯齿波发生实验数据与方法

第四章: 总结与体会

第一章:前言、课程设计任务与要求

函数信号发生器是一种信号发生装置,能产生某些特定的周期性时间函数波形信号,频率范围可从几个微赫到几十兆赫。除供通信、仪表和自动控制系统测试用外,还广泛用于其他非电测量领域,现代工业生产的函数发生器多采用集成电路。为进一步掌握电路基本理论与增强实验实践能力,本项目采用由集成运算放大器等分立式元件共同组成简易的方波-正弦波-三角波-锯齿波。

通过对电路分析与电子电路课程的学习,以及在电子电路实验的实践操作中,本设计应达到的 任务与要求为:

  • 输出波形频率范围为0.02Hz~20kHz且连续可调;
  • 正弦波幅值为±2V;
  • 方波幅值为2V,占空比可调;
  • 三角波峰-峰值为2V;
  • 锯齿波峰-峰值为2V;
  • 设计电路所需的直流电源可用实验室电源。

第二章:电路设计原理

2.1 正弦波产生电路工作原理

正弦波产生电路是一种振荡模型,满足巴克豪森稳定性准则:电子振荡器系统信号由输入到输出再反馈到输入的相差为360°,且增益为1,为振荡器振荡的必要条件。我们注意到电路启动时具有频率丰富的热白噪声,我们如果在放大电路中引入正反馈调节,在所有频率的信号都得到放大,在通过滤波相关的元件筛选出针对特定频率的信号,与原来同相位的信号叠加,重新输入至放大器中往复,最终形成振荡的信号。因此,一个正弦产生电路一般包括:放大电路,正反馈网络,选频网络,非线性环节。

2.1.1 产生正弦振荡的条件:
  • 以热白噪声作为输入信号,要求输出频率一定且可调、一定幅值的信号;

  • 引入的正反馈调节且振荡频率可控;

  • 在产生稳定的振荡后,要求电路输出量自维持,也即:
    $$
    \dot{A}\dot{F}=1\Longleftrightarrow \left | \dot{A}\dot{F} \right | =1,\varphi _{A}+\varphi _{F}=2n\pi
    $$
    其中,前者被称为幅值平衡条件,后者被称为相位平衡条件;

  • 信号幅值有从小到大直至稳幅的变化过程,必须满足起振条件,也即:
    $$
    \left | \dot{A}\dot{F} \right | >1
    $$

2.1.2 基本组成部分及其作用
  1. 放大电路:放大幅值;
  2. 正反馈网络:满足相位平衡条件;
  3. 选频网络:具有变化的电位器,确定保证产生正弦振荡的信号;
  4. 非线性环节:稳幅;
  5. 同向比例放大电路:使得幅值达到要求。
2.1.3 文氏桥正弦型振荡电路及分析

用同相比例运算电路作放大电路,以RC串并联网络为选频网络和正反馈网络、并引入电压串联负反馈,两个网络构成桥路,一对顶点作为输出电压,一对顶点作为放大电路的净输入电压,就构成文氏桥振荡器。如图2.1.3.1所示:

[^]: 图2.1.3.1 文氏桥正弦型振荡电路图

$$
{\dot{U} {+}} =\frac{R//\frac{1}{j\omega C} }{R+\frac{1}{j\omega C}+R//\frac{1}{j\omega C} } \dot{U}{o}

=\frac{\dot{U}_{o}}{3+j(\omega RC-\frac{1}{\omega RC} )}
$$

$$
\dot{U} {-} =\frac{R{1} \dot{U} {o} }{R{1}+R_{F}}
$$

$$
\dot{A}\dot{F}=1\ \Longleftrightarrow \ 3+j(\omega RC-\frac{1}{\omega RC} )=\frac{R_{1}+R_{F}}{R_{1}}
\Longleftrightarrow \ \omega =\frac{1}{RC},R_{F}=2R_{1}
$$

2.2 方波产生电路工作原理

方波是一种典型的非正弦波,它有且只有高电平和低电平两个值,是数字逻辑信号的重要的部分,要求两种状态的相互自动转化,输出的信号必须以某种方式反馈于它的输入,以某种周期进行交替变化,电路中必须要有相应的延迟环节,因而使用滞回比较器和RC回路自充放电作为延迟环节来模拟方波信号的发生。

2.2.1 产生方波的条件
  • 集成运算工作在非线性区;

  • 正反馈调节;

  • 输出电压限幅。

2.2.2 基本组成部分及作用
  1. 滞回比较电路:正反馈;

  2. 一阶RC回路:延迟环节,进行电压的跳变;

  3. 调节占空比环节:调节占空比。

2.2.3 滞回比较器电路及分析

输入电压和输出电压之间的反馈完成,依赖于电容的充放电过程,如图2.2.3.1

[^]: 图2.2.3.1 滞回比较器电路图

$$
when \ U_{o}=U_{Z} ,U_{+}=\frac{R_{1}}{R_{1}+R_{2}}U_{o},\ C \ is \ incharging
$$

$$
\
until \ U_{C} =U_{-}>U_{+},U_{o}=-U_{Z}
$$

$$
when \ incharging,U_{C}=U_{Z}-\frac{2R_{1}+R_{2}}{R_{1}+R_{2}}e^{-\frac{t}{RC}}
$$

$$
until \ U_{C}=\frac{R_{1}}{R_{1}+R_{2}}U_{Z},jump,t=2R_{3}Cln(1+\frac{2R_{1}}{R_{2}})
$$

$$
changing \ R_{3},\ then \ chaging \ duty\ ratio.
$$

2.3 三角波产生电路工作原理

从数学关系不难看出,将方波函数按照区间积分可以得到三角波函数,因此只需要在方波产生的电路基础上串联一个积分运放器。

2.3.1 基本组成部分及作用
  1. 方波产生电路;
  2. 积分放大器;
  3. 调频环节。
2.3.2 串联分析

注意电阻调频电阻R1的位置与Uo相连,如图2.3.2.1所示:

[^]: 图2.3.2.1 三角波发生电路基本框架

2.4 锯齿波产生电路工作原理

锯齿波是更为一般的三角波,我们只需要改变三角波的占空比即可得到锯齿波。

2.4.1 基本组成部分及作用
  1. 三角波产生电路;
  2. 调节占空比环节。
2.4.2 基本组成电路

注意调节占空比环节的接法,如图2.4.2.1所示:

第三章:Multisim仿真项目实验数据与方法记录

3.1 正弦波发生实验数据和方法

完整的仿真电路图如图3.1.1所示

[^]: 图3.1.1 正弦发生仿真电路图

其中,闭合开关,先将R4调节100%,以满足起振条件,观察到XSC2变化至稳幅状态,再调回R4至40%不变,可以观察到XSC1即为满足条件的正弦信号,调节R1,R6可以更改信号频率,更改R2可以更改信号幅值,仿真数据如图3.1.2所示

[^]: 图3.1.2 正弦波

3.2 方波发生实验数据与方法

完整的仿真电路图如图3.2.1所示

[^]: 图3.2.1 方波仿真电路图

滑动S2,S4所在的电位器,可以调节方波占空比,实验数据如图3.2.2所示:

[^]: 图3.2.2 方波

3.3 三角波发生实验数据与方法

完整的仿真电路图如图3.3.1所示

[^]: 图3.3.1 三角波仿真电路图

调节合适R17和外接电源电压的值可以得到符合要求的三角波,如图3.3.2所示:

[^]: 图3.3.2 三角波

3.4 锯齿波发生实验数据与方法

完整的仿真电路图如3.4.1所示

[^]: 图3.4.1 锯齿波仿真电路图

调节S1,S4所在电位器可以改变占空比,实验数据如图3.4.2所示:

[^]: 图3.4.2 锯齿波

第四章:总结与体会

  • 通过本次仿真实验,我对软件Multisim有了更深层次的认识,掌握熟练运用并搭建合适的模型解决实际问题的能力,也希望仿真技术能为以后的学习工作带来更多遍利;
  • 通过对掌握的理论知识加上仿真实验带来的实践思考,我对电子电路学科有了进一步的了解,系统地总结了一部分知识,对将来信息学科的学习大有裨益;
  • 通过对文字排版和内容规划,我对markdown这一语言有了更加熟练的应用;
  • 但本次仿真项目仍然存在部分遗憾的情况:比如改变三角波中R17右端的位置至R3右端,则不能得出令人满意的仿真结果,具体原因有待进一步的考察。
0%