信号系统之数据压缩

1 数据压缩策略

表 27-1 显示了对数据压缩算法进行分类的两种不同方法。在(a)中,这些方法被归类为无损或有损(lossless or loss)。无损技术意味着恢复的数据文件与原始文件相同。这对于许多类型的数据是绝对必要的,例如:可执行代码、文字处理文件、表格数字等。此类信息不能放错哪怕是一点。相比之下,表示图像和其他采集信号的数据文件不必保持完美的状态以进行存储或传输。所有真实世界的测量都固有地包含一定量的噪声。如果对这些信号所做的更改类似于少量的额外噪声,则不会造成任何伤害。允许这种类型退化的压缩技术称为有损。这种区别很重要,因为有损技术在压缩方面比无损方法更有效。压缩比越高,添加到数据中的噪声就越多

通过万维网传输的图像是一个很好的例子,说明为什么数据压缩很重要。假设需要通过计算机的 33.6 kbps 调制解调器下载数字化彩色照片。如果图像未压缩(例如 TIFF 文件),它将包含大约 600KB 的数据。如果它已使用无损技术(例如在 GIF 格式中使用)进行压缩,则它大约是此大小的一半,即 300KB。如果使用了有损压缩(JPEG 文件),则约为 50KB。关键是,这三个等效文件的下载时间分别为 142秒、71秒和 12秒。这是一个很大的不同!JPEG 是数字化照片的最佳选择,而 GIF 用于绘制图像,例如具有大面积单一颜色的公司徽标。

表 27-1b 显示了对数据压缩方法进行分类的第二种方法。大多数数据压缩程序的运行方式是从原始文件中获取一组数据,以某种方式对其进行压缩,然后将压缩组写入输出文件。例如,此表中的一种技术是 CS&Q,它是粗采样和量化的缩写。假设正在压缩一个数字化的波形,例如已数字化为 12 位的音频信号。可能会从原始文件(24 位)中读取两个相邻的样本,完全丢弃其中一个样本,丢弃另一个样本中最低有效度的 4 位,然后将剩余的 8 位写入输出文件。在 24 位输入和 8 位输出的情况下,使用有损算法实现了 3:1 的压缩比。虽然这本身相当粗糙,但当与一种称为变换压缩的技术一起使用时,它非常有效。

表 27-1b 显示 CS&Q 是一种固定输入固定输出方案。也就是说,从输入文件中读取固定数量的位,并将较小的固定数量的位写入输出文件。其他压缩方法允许读取或写入可变数量的位。在浏览每种压缩方法的说明时,请返回此表以了解它如何适应此分类方案。为什么此表中没有列出 JPEG 和 MPEG?这些是结合了许多其他技术的复合算法。它们太复杂了,无法归类为这些简单的类别。

2 运行长度编码

数据文件通常包含连续多次重复的相同字符。例如,文本文件使用多个空格来分隔句子、缩进段落、格式化表格和图表等。数字化信号也可以具有相同值的运行,表明信号没有变化。例如,夜空的图像将包含代表黑色背景的字符或字符的长线。同样,数字化音乐的歌曲之间可能有很长的零。运行长度编码是压缩这些类型文件的简单方法。

图 27-1 说明了频繁运行零的数据序列的游程编码。每次在输入数据中遇到零时,都会将两个值写入输出文件。这些值中的第一个是零,这是一个标志,用于指示运行长度压缩正在开始。第二个值是运行中的零数。如果平均运行长度大于 2,则将进行压缩。另一方面,数据中的许多单个零会使编码文件比原始文件大。

已经开发了许多不同的运行长度方案。例如,可以将输入数据视为单个字节或表示更复杂内容(如浮点数)的字节组。游程长度编码只能用于其中一个字符(如上面的零)、多个字符或所有字符。

广义运行长度方案的一个很好的例子是为 Macintosh 用户创建的 PackBits。输入文件中的每个字节(8 位)都替换为压缩文件中的 9 位。添加的第九位被解释为数字的符号。也就是说,从输入文件读取的每个字符介于 0 到 255 之间,而写入编码文件的每个字符介于 -255 和 255 之间。要了解如何使用它,请考虑输入文件:1,2,3,4,2,2,2,2,4,以及由 PackBits 算法生成的压缩文件:1,2,3,4,2,-3,4。压缩程序只是将每个数字从输入文件传输到压缩文件,但运行除外:2,2,2,2。这在压缩文件中由两个数字表示:2,-3。第一个数字 (“2”) 表示运行由哪个字符组成。第二个数字 (“-3”) 表示运行中的字符数,通过取绝对值并加 1 找到。例如,4,-2 表示 4,4,4;21,-4 表示 21、21、21、21、21 等。

PackBits 的一个不便之处是,必须将 9 位重新格式化为计算机存储和传输中使用的标准 8 位字节。当输入被限制为 ASCII 文本时,可以对此方案进行有用的修改。如表 27-2 所示,每个 ASCII 字符通常存储为一个完整的字节(8 位),但实际上只使用其中的 7 位来标识字符。换言之,值 127 到 255 不具有任何标准化含义,也不需要存储或传输。这允许第八位指示是否正在进行运行长度编码。

3 霍夫曼编码

这种方法以 D.A. Huffman 的名字命名,他在 1950 年代开发了该程序。图 27-2 显示了大型 ASCII 文件中字节值的直方图。此文件的 96% 以上仅包含 31 个字符:小写字母、空格、逗号、句点和回车符。此观察结果可用于为此文件制定适当的压缩方案。首先,将为这 31 个常用字符中的每一个分配一个五位二进制代码:00000=“a”, 00001 “b”, 00010=“c” 等。这允许 96% 的文件大小减少 5/8。五个位代码中的最后一个 11111 将是一个标志,指示正在传输的字符不是 31 个常用字符之一。根据标准 ASCII 分配,文件中接下来的 8 位指示字符是什么。这导致输入文件中 4% 的字符需要 5+8=13 位。这个想法是为常用字符分配更少的位,并且很少使用字符更多位。在此示例中,每个原始字符所需的平均位数为:0.96×5+0.04×13=5.32。换句话说,整体压缩比为:8位/5.32位,或大约 1.5:1

霍夫曼编码将这个想法发挥到了极致。最常出现的字符,如空格和句点,可以分配少至一到两位。不常用的字符,如:!、@、#、$ 和 %,可能需要十几个或更多位。用数学术语来说,当每个字符使用的位数与字符出现概率的对数成正比时,就达到了最佳情况。

霍夫曼编码的一个特点是如何将可变长度代码打包在一起。想象一下,接收一个由 1 和 0 组成的串行数据流。如果每个字符都用 8 位表示,则可以通过断开 8 位块直接将一个字符与下一个字符分开。现在考虑一个霍夫曼编码的数据流,其中每个字符可以具有可变的位数。如何将一个角色与下一个角色区分开来? 答案在于正确选择霍夫曼码,以实现正确的分离。一个示例将说明其工作原理。

图 27-3 显示了简化的霍夫曼编码方案。字符 A 到 G 出现在原始数据流中,并显示概率。由于字符 A 是最常见的,将用一个位表示它,代码:1;下一个最常见的字符 B 接收两个位,代码:01。这一直持续到频率最低的字符 G,被分配了 6 位:000011。如下图所示,可变长度代码被分为 8 位组,这是计算机使用的标准。

当发生解压缩时,所有八个位组都端到端放置,以形成一个由 1 和 0 组成的长串行字符串。仔细查看图 27-3 的编码表,并注意每个代码如何由两部分组成:1 之前的多个 0,以及 1 之后的可选二进制代码。这允许将二进制数据流分成多个代码,而无需在代码之间使用分隔符或其他标记。解压程序查看 1 和 0 的流,直到形成有效的代码,然后重新开始寻找下一个字符。代码的形成方式确保了分离中不存在歧义。

霍夫曼方法的更复杂版本称为算术编码(arithmetic encoding)。在此方案中,字符序列根据其出现的概率由单个代码表示。这具有更好的数据压缩率,例如 5-10%。运行长度编码后跟霍夫曼编码或算术编码也是一种常见策略。这些类型的算法非常复杂,通常留给数据压缩专家。

要实现霍夫曼编码或算术编码,压缩和解压缩算法必须就用于表示每个字符(或字符组)的二进制代码达成一致。这可以通过以下两种方式之一进行处理方式:

  • 最简单的方法是使用预定义的编码表,该编码表始终相同,而不管压缩的信息如何。
  • 更复杂的方案使用针对所使用的特定数据优化的编码。这要求编码表包含在压缩文件中,以供解压缩程序使用。

这两种方法都很常见。

4 增量编码

科学、工程和数学中,希腊字母 delta (Δ) 用于表示变量的变化。术语增量编码是将数据存储为连续样本(或字符)之间的差值,而不是直接存储样本本身。图 27-4 显示了如何执行此操作的示例。增量编码文件中的第一个值与原始数据中的第一个值相同。编码文件中的所有以下值都等于输入文件中的相应值与输入文件中的上一个值之间的差值(增量)

原始数据中的值平滑时,即相邻值之间通常只有很小的变化,则增量编码可用于数据压缩。ASCII 文本和可执行代码并非如此;但是,当文件表示信号时,这是很常见的。例如,图 27-5a 显示了一段音频信号,数字化为 8 位,每个样本在 -127 和 127 之间。图27-5b显示了该信号的增量编码版本。关键特征是 delta 编码信号的幅度低于原始信号。换言之,增量编码增加了每个样本值接近零的概率,并降低了它远非零的概率。这种不均匀的概率正是霍夫曼编码需要操作的东西。如果原始信号没有变化,或是直线变化,则增量编码将导致样本运行具有相同的值。这就是运行长度编码所需要的。相应地,delta 编码后跟 Huffman 和/或运行长度编码是压缩信号的常用策略。

增量编码中使用的思想可以扩展为一种更复杂的技术,称为线性预测编码(Linear Predictive Coding,LPC)。为了理解 LPC,假设输入信号的前 99 个样本已经编码,将对 100 个样本进行处理。然后根据前 99 个样本,样本 100 最可能的值是多少?在增量编码中,答案是样本 100 的最可能值与前一个值样本 99 相同。此预期值用作对示例 100 进行编码的引用。也就是说,样本和期望之间的差异被放置在编码文件中。LPC通过更好地猜测最可能的值来扩展这一点。这是通过查看最后几个样本来完成的,而不仅仅是最后一个样本。LPC 使用的算法类似于递归滤波器,利用了 z 变换和其他密集的数学技术。

5 LZW 压缩

LZW 压缩以其开发者 A.Lempel 和 J.Ziv 的名字命名,后来由 Terry A.Welch 进行了修改。由于其简单性和多功能性,它是通用数据压缩的最重要的技术。通常,可以期望 LZW 将文本、可执行代码和类似数据文件压缩到其原始大小的一半左右。LZW 在处理极其冗余的数据文件(例如表格数字、计算机源代码和采集的信号)时也表现良好。在这些情况下,压缩比通常为 5:1

LZW 压缩用于 GIF 图像文件,并在 TIFF 和 PostScript 中作为选项提供。LZW 压缩受美国专利号 4,558,302 的保护,该专利于1985年12月10日授予 Sperry Corporation(现为 Unisys Corporation)。

LZW 压缩使用代码表,如图 27-6 所示。常见的选择是在表中提供 4096 个条目。在这种情况下,LZW 编码的数据完全由 12 位代码组成,每个代码引用代码表中的一个条目。解压缩是通过从压缩文件中获取每个代码,并通过代码表进行翻译以查找它所代表的一个或多个字符来实现的。代码表中的代码 0-255 始终被分配用于表示输入文件中的单个字节。例如,如果仅使用前 256 个代码,则原始文件中的每个字节都将转换为 LZW 编码文件中的 12 位,从而使文件大小增加 50%。在解压缩期间,每个 12 位代码将通过代码表转换回单个字节。当然,这不是一个有用的情况。

LZW 方法通过使用代码 256 到 4095 来表示字节序列来实现压缩。例如,代码 523 可以表示三个字节的序列:231 124 234。每次压缩算法在输入文件中遇到此序列时,代码 523 都会放置在编码文件中。在解压缩过程中,代码 523 通过代码表进行转换,以重新创建真正的 3 字节序列。分配给单个代码的序列越长,重复序列的频率越高,实现的压缩就越高。

虽然这是一种简单的方法,但有两个主要障碍需要克服:

  • (1)如何确定代码表中应该有哪些序列
  • (2)如何为解压缩程序提供与压缩程序相同的代码表。

LZW算法巧妙地解决了这两个问题。

当 LZW 程序开始对文件进行编码时,代码表仅包含前 256 个条目,表的其余部分为空。这意味着进入压缩文件的第一个代码只是输入文件中被转换为 12 位的单个字节。随着编码的继续,LZW 算法识别数据中的重复序列,并将它们添加到代码表中第二次遇到序列时开始压缩。关键点是,输入文件中的序列在作为单个字符(代码 0 到 255)放入压缩文件之前不会添加到代码表中。这很重要,因为它允许解压缩程序直接从压缩数据中重建代码表,而不必单独传输代码表。

图 27-7 显示了 LZW 压缩的流程图。表 27-3 提供了由 45 个字节组成的示例输入文件(ASCII 文本字符串)的分步详细信息:the/rain/in/Spain/falls/mainly/on/the/plain。当LZW 算法从输入文件中读取字符“a”时,它读取值:01100001(97 以 8 位表示),其中 97 是 ASCII 中的“a”。当它将字符“a”写入编码文件时,它写:000001100001(97 以 12 位表示)。

压缩算法使用两个变量:CHAR 和 STRING:

  • 变量 CHAR 包含单个字符,即介于 0 和 255 之间的单个字节值。
  • 变量 STRING 是一个可变长度的字符串,即由一个或多个字符组成的组,每个字符都是一个字节。

在图 27-7 的框 1 中,程序首先从输入文件中获取第一个字节,并将其放在变量 STRING 中。表 27-3 在第 1 行中显示了此操作。接下来是输入文件中每个额外字节的算法循环,在流程图中由框 8 控制。每次从输入文件(框 2)读取一个字节时,它都会存储在变量 CHAR 中。然后搜索数据表,以确定是否已经为两个变量 STRING+CHAR 的串联分配了代码(框 3)。

如果在代码表中找不到匹配项,则执行三个操作,如框 4、5 和 6 所示。在框 4 中,与变量 STRING 内容相对应的 12 位代码被写入压缩文件。在框 5 中,在表中为串联 STRING+CHAR 创建一个新代码。在框 6 中,变量 STRING 采用变量 CHAR 的值。表 27-3 中的第 2 行至第 10 行显示了示例文件的前 10 个字节的这些操作的示例。

当在代码表中找到匹配项时(框 3),STRING+CHAR 的串联存储在变量 STRING 中,不执行任何其他操作(框 7)。也就是说,如果在表中找到匹配序列,则在确定表中是否还有更长的匹配序列之前,不应执行任何操作。第 11 行显示了一个示例,其中序列 STRING+CHAR=in 被标识为表中已具有代码。在第 12 行中,输入文件中的下一个字符 / 被添加到序列中,并在代码表中搜索:in/。由于此较长的序列不在表中,因此程序将其添加到表中,输出表中较短序列的代码(代码 262),然后重新开始搜索以字符 / 开头的序列。此事件流将一直持续到输入文件中不再有字符为止。程序用与写入压缩文件的 STRING 的当前值相对应的代码包装(如图 27-7 的框 9 和表 27-3 的第 45 行所示)。

LZW解压缩算法的流程图如图27-8所示。从压缩文件中读取每个代码,并与代码表进行比较以提供翻译。当以这种方式处理每个代码时,代码表将更新,以便它不断与压缩期间使用的代码表匹配。然而,减压程序有一个小并发症。某些数据组合会导致解压缩算法接收其代码表中尚不存在的代码。这种意外情况在方框4、5和6中处理。

最基本的 LZW 程序只需要几十行代码。真正的难点在于代码表的高效管理。暴力破解方法会导致大量内存需求和缓慢的程序执行。商业 LZW 程序中使用了几个技巧来提高其性能。例如,内存问题之所以出现,是因为事先不知道每个代码的每个字符串将有多长。大多数 LZW 程序通过利用代码表的冗余特性来处理此问题。例如,查看表 27-3 中的第 29 行,其中代码 278 定义为 ainl。代码 278 可以存储为:code 269+l,而不是存储这四个字节,其中代码 269 之前在第 17 行中被定义为 ain。同样,代码 269 将存储为:代码 261 + n,其中代码 261 之前在第 7 行中被定义为 ai。这种模式始终成立:每个代码都可以表示为一个以前的代码加上一个新字符

压缩算法的执行时间通过搜索代码表来限制,以确定是否存在匹配项。打个比方,想象一下,想看看一个朋友的名字是否列在电话簿中。问题是,拥有的唯一目录是按电话号码排列的,而不是按字母顺序排列的。这需要一页接一页地搜索,试图找到所需的名称。这种低效的情况与搜索所有 4096 代码以查找与特定字符串匹配的情况完全相同。答案是:组织代码表,以便要查找的内容告诉您在哪里查找(例如部分按字母顺序排列的电话簿)。换句话说,不要将 4096 代码分配给内存中的顺序位置。相反,根据将存储在那里的序列将内存分成几个部分。例如,假设想确定序列:code 329+x,是否在代码表中。代码表应进行组织,以便“x”指示从哪里开始查找。这种类型的代码表管理有许多方案,它们可能会变得非常复杂。

6 JPEG(变换压缩)

变换压缩的最好例子体现在流行的 JPEG 图像编码标准中。JPEG 以其起源 Joint Photographers Experts Group 命名。将描述 JPEG 的操作,以说明有损压缩的工作原理。

已经讨论了一种简单的有损数据压缩、粗采样和量化方法(表 27-1 中的 CS&Q)。这涉及减少每个样本的位数或完全丢弃一些样本。这两种方法都具有预期的效果:数据文件变小,但会牺牲信号质量。这些简单的方法效果不佳。

变换压缩基于一个简单的前提:当信号通过傅里叶(或其他)变换时,生成的数据值在信息承载作用上将不再相等。特别是,信号的低频分量比高频分量更重要。从高频分量中去除 50% 的位可能只去除 5% 的编码信息。

如图 27-9 所示,JPEG 压缩首先将图像分解为 8×8 像素组。完整的JPEG算法可以接受每个像素的广泛比特范围,包括使用颜色信息。在此示例中,每个像素都是一个字节,灰度值介于 0 和 255 之间。这些 8×8 像素组在压缩过程中独立处理。也就是说,每个组最初由 64 个字节表示。转换和删除数据后,每个组由 2 到 20 个字节表示。在解压缩期间,对 2 到 20 个字节进行逆变换,以创建原始 8×8 组的近似值。然后将这些近似组拟合在一起以形成未压缩的图像。为什么使用 8×8 像素组而不是 16×16 像素组?8×8 分组基于集成电路技术在制定标准时可以处理的最大尺寸。 无论如何,8×8 尺寸效果很好,将来可能会也可能不会改变。

已经研究了许多不同的转换来压缩数据,其中一些是专门为此目的而发明的。例如,Karhunen-Loeve变换提供了最佳的压缩比,但很难实现。傅里叶变换易于使用,但不能提供足够的压缩。经过激烈的竞争,获胜者是傅里叶变换的亲戚,即离散余弦变换(Discrete Cosine Transform,DCT)。

正如傅里叶变换使用正弦波和余弦波来表示信号一样,DCT 仅使用余弦波。DCT 有几个版本,它们的数学略有不同。作为一个版本的示例,假设一个 129 点信号,从样本 0 运行到样本 128。现在,通过复制样本 1 到 127 并将它们添加为样本 255 到 130,使其成为 256 点信号,即:0、1、2、…、127、128、127、…、2、1。 对这个 256 点信号进行傅里叶变换得到 129 个点的频谱,分布在 0 到 128 之间。由于时域信号被迫对称,因此频谱的虚部将由所有零组成。换句话说,从129点的时域信号开始,到129点的频谱结束,每个点的幅度都是余弦波的幅度。

当 DCT 对 8×8 组进行时,它会产生 8×8 的频谱。换句话说,64 个数字被更改为 64 个其他数字。所有这些价值观都是真实的;这里没有复杂的数学。就像在傅里叶分析中一样,频谱中的每个值都是基函数的振幅。图 27-10 显示了 8×8 DCT 中使用的 64 个基函数中的 6 个,具体取决于振幅在频谱中的位置。8×8 DCT 基函数由下式给出:

低频位于频谱的左上角,而高频位于右下角。DC 分量位于 [0,0],即最左上角的值。[0,1] 的基函数是余弦波在一个方向上的半个周期,在另一个方向上是一个常数值。[1,0] 的基函数类似,只是旋转了 90°。

DCT 通过将 8×8 像素组与每个基函数相关联来计算频谱。也就是说,通过将适当的基函数乘以 8×8 像素组,然后对乘积求和来找到每个光谱值。然后需要两次调整才能完成 DCT 计算(就像傅里叶变换一样)。首先,将第 0 行和第 0 列中的 15 个光谱值除以 2。其次,将频谱中的所有 64 个值除以 16。逆 DCT 的计算方法是将频谱中的每个振幅分配给适当的基函数,并求和以重新创建空间域。无需额外的步骤。这些概念与傅里叶分析中的概念完全相同,只是基函数不同。

图 27-11 说明了标识的三个 8×8 组的 JPEG 编码。

如图 27-9 所示。左列,图a,b和c,显示了原始像素值。图d、e和f的中心列显示了这些基团的DCT光谱。

图 27-11 右列,图 g,h 和 i,显示了减少用于表示频谱中每个分量的位数的效果。例如,(g)是通过将(d)中的每个样本截断为10位,取逆DCT,然后从原始图像中减去重建的图像而形成的。同样,(h)和(i)是通过将光谱中的每个样本分别截断为8位和5位而形成的。正如预期的那样,随着用于表示数据的位数减少,重建中的误差会增加。作为此位截断的示例,中心列中显示的频谱用每个频谱值 8 位表示,DC 分量排列为 0 到 255,其他值排列为 -127 到 127。

压缩频域的第二种方法是丢弃 64 个频谱值中的一些。如图27-11所示,几乎所有信号都包含在低频分量中。这意味着可以消除最高频率的分量,而只对信号进行少量的降级。图 27-12 显示了删除各种数量的高频分量时发生的图像失真的示例。本例中使用的 8×8 组是图 27-10 的眼睛图像。图(d)显示了使用所有64个光谱值的正确重建。其余图显示了使用指示数量的最低频率系数进行重建。如(c)所示,即使去除四分之三的最高频率分量,在重建过程中也很少产生误差。更好的是,确实发生的错误看起来非常像随机噪声。

JPEG 是一个很好的例子,说明如何将几种数据压缩方案组合在一起以提高效率。以下步骤概述了整个 JPEG 过程

  • 首先,将图像分为 8×8 组
  • 其次,对每组进行 DCT
  • 第三,每个 8×8 频谱通过上述方法进行压缩:减少比特数并消除一些成分。这发生在一个步骤中,由量化表控制。图 27-13 显示了量化表的两个示例。频谱中的每个值除以量化表中的匹配值,并将结果四舍五入到最接近的整数。例如,量化表的左上角值为 1,导致 DC 值保持不变。相比之下,(a) 中的右下角条目是 16,这意味着原来的 -127 到 127 范围缩小到只有 -7 到 7。换言之,该值的精度已从 8 位降低到 4 位。在更极端的情况下,(b)中的右下角条目为256,完全消除了光谱值。
  • 在JPEG编码的第四步中,修改后的光谱从8×8阵列转换为线性序列。此步骤使用图 27-14 所示的蛇形图案,将所有高频分量放在线性序列的末端。这会将消除的组分中的零分组到长运行中。
  • 第五步通过游程长度编码压缩这些零运行
  • 在第六步中,序列通过霍夫曼编码或算术编码进行编码,以形成最终的压缩文件。

当运行JPEG压缩程序时,可以选择压缩量以及由此导致的图像质量损失。图 27-15 显示了高压缩比导致的图像失真类型。在显示 45:1 压缩比的情况下,8×8 组中的每一组仅由大约 12 位表示。仔细观察这张图片可以发现,在某种程度上表示了六个最低频率的基函数。

为什么 DCT 在图像压缩方面优于傅里叶变换?主要原因是DCT具有半周期基函数,即S[0,1]和S[1,0]。如图 27-10 所示,它们从阵列的一侧缓缓倾斜到另一侧。相比之下,傅里叶变换中的最低频率形成一个完整的周期。图像几乎总是包含亮度在某个区域逐渐变化的区域。使用与此基本模式匹配的基函数可以更好地压缩。

7 MPEG

MPEG是一种用于数字视频序列的压缩标准,例如用于计算机视频和数字电视网络。此外,MPEG还提供了与视频相关的音轨的压缩。这个名字来自于它的创始组织——电影专家组。该技术的未来是将压缩和解压缩算法直接编码到集成电路中。MPEG的潜力是巨大的。想象一下,成千上万的视频频道通过一根光纤传输到你的家里。这是21世纪的关键技术。

除了降低数据速率之外,MPEG还有几个重要的特性。电影可以向前或向后播放,并在正常或快速速度。所编码的信息是随机存取的,也就是说,序列中的任何单个帧都可以很容易地显示为静止图像。这与使电影可编辑有关,这意味着电影中的短片段只能参考其本身进行编码,而不是整个序列。MPEG被设计成对错误具有鲁棒性。最不想看到的就是一个比特的错误导致电影的中断。

MPEG使用的方法可以分为两种类型的压缩:帧内压缩和帧间压缩。帧内压缩意味着组成视频序列的单个帧被编码,就好像它们是普通的静止图像一样。这种压缩是使用JPEG标准进行的,只有一些变化。在MPEG术语中,以这种方式编码的帧称为内编码或I-picture

视频序列中的大多数像素从一帧到下一帧变化很小。除非相机在移动,否则大部分图像都是由几十帧内保持不变的背景组成的。MPEG利用了这一点,采用了一种复杂的增量编码形式来压缩帧之间的冗余信息。在将其中一个帧压缩为i图像后,MPEG将后续的帧编码为预测编码或p图像。也就是说,只有自i图以来发生变化的像素才包含在p图中。

虽然这两种压缩方案构成了MPEG的主干,但实际实现要比这里描述的复杂得多。例如,p图像可以引用已移位的i图像,考虑到图像序列中对象的运动。也有双向预测编码或b图片。这些都引用了之前和未来的i图。这可以处理图像中在许多帧中逐渐变化的区域。单个帧也可以乱序存储在压缩数据中,以方便I、P和b图像的正确排序。颜色和声音的加入使这一切变得更加复杂。

与MPEG相关的主要失真发生在图像的大部分快速变化时。实际上,需要大量的信息来跟上快速变化的场景。如果数据速率是固定的,当从一个场景切换到下一个场景时,观众会注意到“块状”模式。在同时传输多个视频频道的网络中,例如有线电视,这可以最小化。在一个视频通道中,支持快速变化场景所需的突发信息与其他通道中相对静态场景的适度需求相平均。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值