《Fundamentals of Computer Graphics》第十章 信号处理 总结
开篇在图形学中,我们通常会处理连续变量的函数,比如图像就是这样的例子。但是随着越来越深入地学习,会遇到更多这样的函数。连续函数的本质导致它们不能直接在计算机中被表示,我们只能用有限数量的比特位来表示它们。最好用之一的方法是用函数的采样(Sample)来表示连续函数,即储存函数在不同点的值,然后在需要的时候重建(Reconstruct)点之间的值。
你现在应该已经熟悉了使用二维像素网格来表示图像这一想法,这实际上就是个采样表示的例子。想象一张图像被数字相机拍摄,在相机的镜面上形成的图像是在图像平面上的位置的连续函数,相机会把连续函数转化为二维样本的网格。从数学上来说,相机把\(\mathbb{R}^2\)类型的函数转化到了\(\mathbf{C}\)即颜色样本的二维数组,或是把\(\mathbb{Z}^2\)类型的函数转化到了\(\mathbf{C}\)。
另外一个采样表示的例子是平板电脑,当使用触控笔在屏幕上移动时,笔头的位置是随时间连续变化的,但是平板只能在某个时间点测量位置,从而记录到一序列的二维位置。一个动作捕获(Motion Capture)系统做的也是相同的事,通过演员身上的特殊标记连续进行位置测量。上升一个维度到医用CT扫描仪,它会非侵入性地扫描人的身体内部,测量密度关于位置变化的函数,扫描仪输出的结果是三维密度网格。
这些例子虽然看起来不同,但是可以用相同的数学来解决。不论如何在一个或多个维度上的晶格(Lattice)点采样函数,在任何情况下都要能通过采样获得的样本重建原始的连续函数。
对于二维图像来说可能有像素就足够了,在相机离散化图像后就不需要考虑原来的连续函数。但是有时我们可能想让屏幕上的图像变大或者变小,特别是用到非整数缩放因子。结果发现最简单的用于实现的算法表现很差,会引入明显的视觉伪影也就是走样(Aliasing)。解释为什么走样发生以及理解该怎么避免这种现象需要采样理论背后的数学。最终得到的算法很简单,不过在它们背后的原理很重要,以及让它们表现良好的细节可能很微妙。
当然了在计算机中表示连续函数并不是图形学独有的,从数字音频到计算物理学的一些应用场景都有用到采样表示。图形学只是其中之一,用到了里面一些相关的算法和数学。这章将从使用一维数字音频的例子总结采样和重建开始,接着展示一或二维中为采样和重建奠基的基础数学和算法。最后将深入到频域中的细节,它们为这些算法的行为提供了很多见解。
数字音频:在一维中采样(Digital Audio: Sampling in 1D)
在音频记录中,麦克风会把在空气中以压力波存在的声音转换到随时间变化的电压,转换成的电信号必须被储存来让它能在后续的某个时间被回放。回放涉及到把储存的电信号发送给扬声器,接着扬声器把电信号转化为压力波。
记录音频信号的数字方法使用采样:一个模数转换器每秒测量几千次电压,生成的整数流能在任意媒介上储存。在回放的时候数据以恰当的速率被读取,被送到一个数模转换器。数模转换器根据输入的数字产生对应的电压,最终产生的电信号和声音输入时记录的电信号一致。下图大致展示了声音采样和重建的过程
事实证明,好的回放效果所需要的每秒采样数取决于我们要记录的声音的声调。可以良好地还原低音提琴和踢鼓的声音的采样率在回放短笛和铙钹时会产生怪异的声音,当使用更高的采样率时这种问题会消失。为了避免这些欠采样(Undersampling)伪影,数字音频记录器会对输入模数转换器的信号进行滤波,移除那些会导致问题的高频率信号。
另一种问题发生在输出这边,数模转换器产生的电压会在新样本输入时改变,直到下一个样本前都会保持不变,这样就产生了一种阶梯形的坐标图,这些阶梯的效果就好像噪音,会增加一种高频且依赖于信号的嗡嗡声。为了移除这种重建伪影,数字音频播放器会对数模转换器的输出进行滤波从而让波形变平滑。
采样伪影和走样(Sampling Artifacts and Aliasing)
相同类型的欠采样和重建伪影也会发生在图形学中的图像或其它被采样的信号中,而且解决方案是一样的即在采样前滤波和在重建后再次滤波。使用过低采样频率会产生问题的一个例子如下
上图展示了使用两个不同的采样频率采样正弦波,上面的为10.8样本每周期,下面的为1.2样本每周期。使用更高采样率得到的样本明显能更好地捕捉信号,使用更低采样率导致了无法很好地重建原信号,反而看起来更像一个低频率的正弦波。
一旦采样完成了就不知道快和慢的正弦波中哪个是原始信号,因此没有哪一种方法能恰当地在两种情况下重建信号,因为高频信号在“假装”是低频信号,这一现象被称为走样(Aliasing)。
当采样和重建有缺陷导致在令人惊讶的频率上出现伪影时,走样就会出现。在音频中,走样以额外的怪异音调出现。当一个铃以10KHz响动时,如果以8KHz的频率采样则会产生6KHz的奇怪音调。在图像中,走样以摩尔纹(Moiré patterns)的形式出现,这是采样网格和图像中的常规特征交互的结果。下图是个相关的例子
另一个在合成图像中走样的例子是熟悉的阶梯式直线,由上图的b图可见。这是一种小尺度特征,会在不同的尺度上产生伪影,对于浅斜率直线来说会产生非常长的阶梯。
采样和重建的基本的问题可以被简单地理解为特征太小了或太大了,但是这样的话有些更加量化的问题就更难回答,比如
[*]多高的采样率能保证好的效果?
[*]对于采样和重建来说要使用哪种合适的滤波方法呢?
[*]避免走样需要多少平滑度?
卷积(Convolution)
在我们讨论采样和重建的算法前,我们将首先了解它们基于的叫做卷积(Convolution)的数学概念。卷积是个简单的数学概念,它是用于采样、滤波、重建的算法的基础,此外它还是我们在这章中分析这些算法的基础。
卷积是作用于函数上的运算,它会取两个函数进行结合,然后得出一个新函数。在这里卷积算子为星号,对函数\(f\)和\(g\)施加卷积的结果为\(f \star g\),我们称\(f\)与\(g\)卷积,\(f \star g\)为卷积的结果。
卷积可以作用于连续函数或离散序列,而且不止能用于一维。我们首先从离散的一维情况开始,接着再到连续函数和二维还有三维的函数。为了定义方便,通常假设函数的定义域是无穷的。当然了在实际情况下通常会在一个地方停下,因此我们得用特殊的方法来处理端点情况。
移动的平均(Moving Average)
为了了解卷积的基本情况,考虑使用移动的平均来平滑一个一维函数,如下图所示
为了在任一点得到一个平滑的值,那么就得计算任意方向\(r\)距离内的函数平均值,距离\(r\)就是平滑操作的半径,它决定到底有多平滑。我们可以使用数学的方法来实现这个想法,如果要平滑一个连续函数\(g(x)\),平均意味着先求一个区间上的积分,接着再除以区间的长度
\
在另一方面如果我们平滑一个离散函数\(a\),平均意味着先求一定范围索引内的和,接着再除以数值的数量
\ = \frac{1}{2r+1} \sum_{j=i-r}^{i+r} a\]
这种移动的平均想法是卷积的精髓,不过再卷积中移动的平均是加权的。
离散卷积(Discrete Convolution)
我们将从卷积的最具体的例子开始,卷积一个离散序列\(a\)与另一个离散序列\(b\),卷积的结果为另一个离散序列\((a \star b)\)。过程就像使用移动的平均那样来平滑\(a\),但是这一次会使用\(b\)序列来给每个样本一个权重,而不是使用相同的权重。一个示例图如下所示
省略掉边界情况可以得到\((a \star b)\)为
\[(a \star b)=\sum_{j} a b \tag{1}\]
看到这里你可能会想这个公式为什么用的是\(b\)而不是\(b[-i+j]\)。在信号处理中,卷积可以表示成一个系统对输入信号的响应,这个时候\(b\)表示的是一个输入在发生\(k\)个单位时间后,这个输入对当前输出的影响因子,因此应该使用前者。只不过对于计算机图形来说,用到的大部分权重序列都是对称的,使用后者在很多时候也能得到正确的结果。
在计算机图形中,两个中的一个函数通常有有限的支持,这意味着只有在一个有限的区间内才是非\(0\)的。如果\(b\)有有限的支持且半径为\(r\),那么当\(|k|>r\)时\(b\)都会等于0。在这种情况下求和表达式可以写为
\[(a \star b) = \sum_{j=i-r}^{i+r} ab \tag{2}\]
用伪代码表达则为
卷积滤波器(Convolution Filters)
卷积非常重要,因为我们能使用它来实现滤波。回顾刚开始的那个移动的平均的例子,实际上可以把平滑操作理解为使用特定的序列进行卷积。当我们计算有限范围内的平均值时,实际上使用的是一个在范围内有相同值其它地方都为\(0\)的权重序列。这种在区间内有常量其它地方为\(0\)的滤波器叫方框滤波器(Box Filter)。对于一个有着半径\(r\)的方框滤波器来说,权重为\(1/(2r+1)\),因此
\= \begin{cases} \frac{1}{2r+1}, -r \leq k \leq r \\ 0, 其它情况 \end{cases}\]
就像这个例子一样,卷积滤波器通常都被设计来让它们的总和为\(1\),这样就不会影响信号的总体水平。对于滤波的简单例子来说,信号可以是阶跃函数(Step Function)
\ = \begin{cases} 1,i \geq 0 \\ 0,i
页:
[1]