文章目录
1. 二进制数据表达
1.1 二进制简介
1.2 用二进制表达文字
1.2.1 最开始的表达方式
1.2.2 通讯系统的编码和解码
1.2.3 集成电路
1.2.4 ASCII编码
1.2.5 GBK编码
1.2.6 Unicode编码
2. 用二进制表达图像
2.1 图片像素化
2.2 像素数字化
2.3 二值图像
2.4 灰度图像
2.5 彩色图像
2.6 图像文件的存储
3. 用二进制表达声音
3.1 采样
3.2 量化
3.3 频谱分析
3.4 时序频谱图
4. 用二进制表达视频
1. 二进制数据表达
1.1 二进制简介
二进制是一种数字表示法,它使用两个不同的数字符号,0和1,来表示数值。下面是一些二进制的基本概念:
- 位(bit)
不同于十进制中,每个位可以用0-9表示,二进制中每位都是0或1,每个二进制位我们称之为一个bit,可以表示两种状态。位一般用b代替,例如8b代表8个bit。
- 字节(byte)
8bit组成一个字节,总共可以表示2^8,256种状态。字节一般用B代替,例如8B一般表示8个字节。
- 其他计量单位(K,M,…)
K:表示2的十次方,例如,1KB就是1024B
M:表示2的20次方。例如:1MB就是1048576B
G:表示2的30次方。
T:表示2的40次方。
- 这里需要注意字母b的大小写,B代表字节,b代表位:就比如网速100Mbit,B=8bit,所以网速只能达到12.5M/s。
- 正负表示,计算机语言没有正负符号,也是用0和1表示,例如256的范围其实是-128 – 127.中间有一位就是符号位。
1.2 用二进制表达文字
1.2.1 最开始的表达方式
最开始使用不同位数的通讯系统来发出不同顺序的0和1。
1位通讯系统
- 系统描述:1位通讯系统可以发出2种不同的信号。
- 信号表示:这两种信号可以用0和1来表示。
- 二进制表示:在二进制系统中,这1位可以取两个值:0或1。
2位通讯系统
- 系统描述:2位通讯系统可以发出4种不同的信号。
- 信号表示:这四种信号可以通过两种不同的开关组合来表示。
- 二进制表示:在二进制系统中,这2位可以取四个不同的值:00、01、10、11。
3位通讯系统
- 系统描述:3位通讯系统可以发出8种不同的信号。
- 信号表示:这八种信号可以通过三种不同的开关组合来表示。
- 二进制表示:在二进制系统中,这3位可以取八个不同的值:000、001、010、011、100、101、110、111。
通过观察可以发现,使用二进制进行编码,每当位数增加1位,不同取值的数量就会翻倍。因此:
- 位数 (n):表示二进制数的位数(bit)。
- 结果数 = 2的n次方:表示可以有多少种不同的取值。
1.2.2 通讯系统的编码和解码
编码过程
假设有一个发件者想要传递一条消息:“天气很冷”。最开始为了传递这条消息,会用一种特定的编码方式,比如用一系列灯的闪烁来表示信息:
首先,发件者确定一个编码规则,例如:
- 闪一次表示字母“A”
- 闪两次表示字母“B”
- 闪三次表示字母“C”
依此类推
然后,他把“天气很冷”这句话转换成编码:
- “天” -> 闪五次(假设“天”对应第五个字母)
- “气” -> 闪七次(假设“气”对应第七个字母)
- “很” -> 闪八次(假设“很”对应第八个字母)
- “冷” -> 闪六次(假设“冷”对应第六个字母)
这样,“天气很冷”就被编码成了灯的闪烁信号:闪五次,闪七次,闪八次,闪六次。
解码过程
假设有一个接收者,他收到了一系列灯的闪烁信号,现在他需要把这些信号解码成原始信息:
接收者观察灯的闪烁,并记录下来:
- 闪五次
- 闪七次
- 闪八次
- 闪六次
然后,接收者根据相同的编码规则,将这些闪烁次数转换成相应的字母:
- 闪五次 -> “天”
- 闪七次 -> “气”
- 闪八次 -> “很”
- 闪六次 -> “冷”
最后,接收者将这些字母组合起来,得到了原始信息:“天气很冷”。
1.2.3 集成电路
整个人类计算机的迭代史可以总结为:把更多的表示信号的“灯”塞到超小的空间里。这种把电路塞到一个小芯片的技术叫做集成电路。
集成电路的构成
- 基础电路:基本电路,包括电池、开关和灯泡。
- 扩展到N个电路:如果把这个基础电路扩展成多个灯泡和开关组合,就可以形成复杂的电路系统。
- 集成电路:这些复杂的电路系统可以被集成到一个小芯片中,这就是集成电路。
现代计算机中的晶体管
现在,我们可以使用纳米级的晶体管。笔记本电脑中就有至少几十亿个的晶体管。这使得我们可以直接从中抽出一部分“灯”来输出信息。
1.2.4 ASCII编码
工程师们意识到有必要制定一种标准化的编码系统。这样,无论是哪个公司的计算机,使用的都是同一种编码规则,信息交流就可以变得更加顺畅。ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)应运而生。ASCII编码为每一个字符分配了一个唯一的二进制编码,确保所有系统都能使用相同的方法来表示和解读字符。
ASCII编码的特点
- 标准化:ASCII为128个字符分配了唯一的编码,包括字母、数字、标点符号和控制字符。
- 兼容性:ASCII编码使不同计算机系统之间的信息交换变得更加容易和可靠。
- 简洁性:由于使用7位二进制数来表示每个字符,ASCII编码简单且高效。
通过这种方式,无论信息是在什么系统中处理,都可以保证其一致性和准确性。
最初的ASCII编码表包含128个字符,使用了7个比特来表示这些字符(2^7 = 128)。这些字符分为两类:
控制字符
控制字符是用于控制设备的操作,这些字符通常不打印出来,而是用于指示某种操作。例如:
- 回车 (CR, Carriage Return)
- 换行 (LF, Line Feed)
- 制表符 (Tab)
可打印字符
可打印字符是可以在屏幕上显示或打印出来的字符,包括:
- 空格
- 标点符号,例如句号 (.), 逗号 (,), 感叹号 (!)
- 数字 (0-9)
- 大写字母 (A-Z)
- 小写字母 (a-z)
- 特殊字符,例如@, #, $, %, ^
- 图形符号,例如[, ], {, }, ^
ASCII编码表示例
为了进一步理解,让我们看一些常见字符的ASCII编码:
- 'A' 的 ASCII 编码是 65 (01000001)
- 'a' 的 ASCII 编码是 97 (01100001)
- '1' 的 ASCII 编码是 49 (00110001)
- 空格 (' ') 的 ASCII 编码是 32 (00100000)
1.2.5 GBK编码
随着计算机技术的发展,8个比特(1字节)的字符集对于中文这样常用字符接近7000个的语言来说是不够的。
延续之前的思路,这类问题可以通过增加bit来处理。因为byte已经作为基本存储单元,我们可以直接增加byte。于是,这个时候就有了GB2312编码。
- GB2312编码使用2个字节(共16bit)来表示一个字符。
- GB2312编码收录了6763个常用汉字和682个其它符号,基本涵盖了中国大陆印刷中文字符的需求。
GB2312扩展到GBK
- GBK(Guobiao Kuozhan,国家标准扩展)是GB2312的扩展版本,继续使用2个字节并加入了繁体字。
- GBK编码兼容GB2312,当对英文进行编码时仍然使用1个字节。
1.2.6 Unicode编码
在之前介绍的GBK等编码主要关注的是解决中文编码问题。然而,随着互联网和全球化的发展,字符编码的需求变得更加广泛和复杂,需要一种全球统一的编码标准来表示各种语言的字符。
Unicode的统一编码
Unicode旨在为全世界提供一个统一的编码,其具体实现包括UTF-8、UTF-16和UTF-32三种编码方式。
UTF-8
- 特点:使用1到4个字节表示一个字符。
- 优点:兼容ASCII编码,所有ASCII字符在UTF-8中依然使用单个字节表示,这使得UTF-8在网络传输和文件存储中非常高效。
- 用途:广泛用于网页、电子邮件和文件系统等。
UTF-16
- 特点:使用2个或4个字节表示一个字符。
- 优点:对常用字符使用2个字节表示,能够平衡存储空间和编码复杂性。
- 用途:广泛用于操作系统和编程语言的内部处理,如Windows和Java。
UTF-32
- 特点:始终使用4个字节表示一个字符。
- 优点:每个字符固定长度,便于快速随机访问字符。
- 用途:多用于需要高效字符访问的内部处理场景。
兼容性问题
- UTF-8与ASCII兼容:由于UTF-8对ASCII字符使用单字节表示,UTF-8编码的文本可以直接兼容和读取ASCII编码的文本。
- UTF-16与UTF-32不兼容:尽管它们都是Unicode的实现方式,但由于编码长度不同,UTF-16和UTF-32之间并不兼容,需要进行转换才能相互读取。
2. 用二进制表达图像
2.1 图片像素化
现实中的图片是连续的,但如果想用数字表示图像,就需要将一张完整的图像,横纵向分别切成很多份,从而拆成一个一个像素点(Pixel),每个像素点是一个色块,而横纵切分的份数,我们称之为分辨率。
- 分辨率:图像的分辨率是指图像在横向和纵向上的像素数量。例如,800x600的分辨率表示图像在横向有800个像素,纵向有600个像素,总共480000个像素。
- 比例:图像的比例是其宽高比,如4:3、16:9等。一个4:3比例的图像可能具有800x600、1024x768等分辨率。
分辨率越高,图像越清晰,因为高分辨率的图像包含更多的像素,可以更细致地描述图像细节。
- 800x600的分辨率适用于小尺寸显示设备。
- 1920x1080(全高清)适用于大尺寸显示设备。
- 3840x2160(4K超高清)则适用于超大尺寸显示设备。
2.2 像素数字化
像素的颜色表示
每个像素可以用红(Red)、绿(Green)、蓝(Blue)三原色(RGB)调配成任意颜色。每种原色的深浅可以用一个数字来表示:
- 8位颜色深度:每个颜色分量(R、G、B)用一个字节(0-255)表示,三个分量总共需要3个字节。这种方式可以表示 256×256×256=16777216种颜色。
- 16位颜色深度:每个颜色分量用两个字节(0-65535)表示,这样颜色的表示更加精细。
位深(Color Depth)
位深指的是每个颜色分量的位数。例如:
- 8位深:表示颜色范围是0-255。
- 16位深:表示颜色范围是0-65535。
位深越大,颜色的过渡越平滑,图像显示效果越好,颜色的细节越丰富。
色深与色阶
- 色阶:色阶指的是颜色的渐变层次。位深较低时,颜色之间的过渡不够平滑,可能出现明显的色阶(Banding)现象。
- 位深增加的效果:增加位深可以减少色阶现象,使颜色的过渡更加平滑。例如,从8位深提升到16位深,可以显著改善颜色的连续性。
位深与存储需求
- 8位深:每个像素需要3个字节存储。
- 16位深:每个像素需要6个字节存储。
- 32位深:通常指24位颜色加上8位透明度(Alpha),每个像素需要4个字节存储。
随着位深的增加,存储需求也增加,因此在实际应用中需要权衡图像质量与存储需求。
高动态范围(HDR)
HDR图像使用更高的位深(如10位或12位)来表示更大的亮度范围和更多的颜色细节。HDR图像可以提供更加逼真的视觉效果,尤其在高对比度场景下效果更佳。
2.3 二值图像
二值图像是一种特殊的数字图像,它的每个像素只有两种可能的取值:黑色和白色。在二值图像中,通常使用1表示白色,0表示黑色。
如图所示,这是一张5x5的黑白图片。我们用1表示白色,0表示黑色。
图像的像素化和二值化过程
- 像素化:将一张连续的图像横纵向分别切成很多小块,每个小块称为一个像素。通过增加分辨率(像素数量),可以提高图像的清晰度。
- 二值化:将每个像素的颜色转换为黑白两种状态。通常使用一个阈值将灰度图像中的每个像素转换为0或1。例如,灰度值大于某个阈值的像素点设为1(白色),小于阈值的设为0(黑色)。
2.4 灰度图像
灰度图像是一种介于二值图像和彩色图像之间的图像形式。在灰度图像中,每个像素用一个数值表示其亮度,这些数值通常范围为0到255(8位深度),对应从黑色到白色的不同灰度级别。
灰度图像的表示方法
在灰度图像中,每个像素的亮度值可以用一个8位(bit)的二进制数表示。具体的灰度级别如下:
- 数值0表示纯黑色。
- 数值255表示纯白色。
- 介于0和255之间的数值表示从纯黑到纯白的不同灰度。
例如:
- 二进制数
00000000
对应十进制数0,为纯黑色。 - 二进制数
11111111
对应十进制数255,为纯白色。 - 中间的值如
01111111
(127)表示中等灰度。
2.5 彩色图像
彩色图像通过多个颜色通道来表示每个像素的颜色。在RGB颜色空间中,使用红色(R)、绿色(G)、蓝色(B)三个通道来混合生成各种颜色。每个颜色通道的值范围为0,255,我们用这三个色彩通道的组合表示颜色。
RGB颜色表示法
- 红色通道(R):表示红色成分的强度,范围为0到255。
- 绿色通道(G):表示绿色成分的强度,范围为0到255。
- 蓝色通道(B):表示蓝色成分的强度,范围为0到255。每个通道都是8bit(1byte),一个像素点由三个通道组成占3byte。
- (0,0,0) 纯黑色
- (255,255,255) 纯白色
- (0,0,255) 蓝色
2.6 图像文件的存储
图像数据的二进制存储
图像在计算机中的存储方式是将其视作由许多小点(像素)构成的矩阵。这些点称为像素,每个像素都有自己的颜色。这些颜色通过RGB(红、绿、蓝)三色混合表示。
存储过程
- 颜色编码:每个像素的颜色可以由三个通道的数值组合表示。比如,RGB值为(51, 72, 85)的颜色表示其红色通道值为51,绿色通道值为72,蓝色通道值为85。
- 二进制存储:将这些RGB值转换为二进制并按顺序存储在文件中。
假设一个5x5的图像,每个像素的RGB值已知,存储过程如下:
- 每个像素的颜色用3个字节表示(每个通道1个字节)。
- 一个5x5的图像共25个像素,总共需要25x3=75个字节存储。
存储文件格式
计算机将这些像素矩阵的二进制编码保存到电脑中,就可以得到一个图片文件。这种存储方式显然要用更多的字节数量。因此,一个图片文件往往都是纯文本文件的数倍甚至几百倍。
图像文件的大小
由于图像文件包含大量的像素数据,每个像素用多个字节表示,因此图像文件通常比纯文本文件大很多。例如:
- 一个分辨率为1920x1080(全高清)的RGB图像,未压缩存储需要1920x1080x3=6,220,800字节(约6MB)。
- 经过JPEG压缩后,文件大小可以减少到几百KB到几MB,具体取决于压缩质量。
3. 用二进制表达声音
声音的数字化过程与图像的数字化过程非常类似,主要包括两个步骤:采样和量化。
3.1 采样
声音来自于物体的振动,是一种连续的波形。如果我们想用数字表达声音,首先需要将其离散化。这一过程称为采样。
采样率
- 定义:采样率是指每秒钟对声音进行采样的次数。
- 单位:赫兹(Hz),表示每秒采样的次数。
- 常用采样率:目前比较常用的采样率是44100Hz(CD音质)和48000Hz(专业音频和视频)。
采样过程
在采样过程中,我们将一段时间(例如1秒钟)的连续声波分成许多等份,并记录每一份的平均振幅。采样率越高,每秒钟的采样次数越多,记录的声音信息就越准确,信息丢失越少。
- 44100Hz:每秒钟采样44100次,常用于音乐CD。
- 48000Hz:每秒钟采样48000次,常用于数字视频和音频录制。
3.2 量化
每个采样点的振幅(高度)需要用一个数字表示。这个过程将连续的振幅值离散化,称为量化。
位深(Bit Depth)
- 定义:位深是指用于表示每个采样点振幅的二进制位数。
- 常用位深:目前常用的位深为16bit和24bit。
- 取值范围:
- 16bit:取值范围为0到65535。
- 24bit:取值范围为0到16777215。
量化过程
在量化过程中,每个采样点的振幅被转换为一个离散的整数值。例如:
- 对于16bit位深,振幅值被转换为0到65535之间的整数。
- 对于24bit位深,振幅值被转换为0到16777215之间的整数。
假设我们有一段声音波形,通过44100Hz采样率和16bit位深进行数字化处理。
-
采样:
- 将声音波形分为44100个等份(每秒钟)。
- 记录每个采样点的振幅值。
-
量化:
- 将每个采样点的振幅值转换为0到65535之间的整数。
例如,一个简单的声音波形在某一秒的部分采样点可能如下:
- 采样点1:振幅值32768(中间值)
- 采样点2:振幅值40000
- 采样点3:振幅值50000
- 采样点4:振幅值30000
- ...
这些采样点的振幅值被转换为二进制数据,存储在计算机中,形成数字音频文件。
3.3 频谱分析
频谱图是一种用于展示声音中不同频率成分的图表。它显示了每个频率分量的振幅(响度),常用于分析音频信号。
频谱图的结构
- 水平轴(X轴):表示频率,从左到右频率逐渐增高。
- 左侧:低频段,例如架子鼓、低音提琴等低音部。
- 右侧:高频段,例如吉他、小号等高音部。
- 垂直轴(Y轴):表示振幅(响度),柱子越高表示该频率段的声音越响。
频谱图的生成
-
采样和量化:
- 对声音信号进行采样,将连续的声波分成离散的采样点。
- 对每个采样点进行量化,用二进制数表示振幅。
-
傅里叶变换:
- 将时间域的声音信号转换为频域的频率成分。
- 快速傅里叶变换(FFT)是常用的算法,可以高效地计算频谱图。
-
绘制频谱图:
- 将不同频率段的振幅用柱状图表示,生成频谱图。
3.4 时序频谱图
时序频谱图是将频谱图按时间顺序排列形成的三维图像,用于展示音频信号随时间变化的频率成分。它结合了频率、振幅和时间三个维度的信息,能够全面地分析和可视化音频信号。
生成时序频谱图的过程
假设有一段音频信号,通过生成时序频谱图,可以全面了解其频率成分随时间的变化。
-
采样和量化:
- 对音频信号进行采样(例如44100Hz),将连续波形转换为离散的采样点。
- 对每个采样点进行量化(例如16位),用二进制数表示其振幅。
-
分帧处理和傅里叶变换:
- 将音频信号分成多个时间帧,对每帧进行快速傅里叶变换(FFT),生成频谱图。
-
时序排列:
- 按时间顺序排列每个时间帧的频谱图,形成时序频谱图。
4. 用二进制表达视频
视频是由一系列连续的图片(帧)和同步的声音组成的。通过快速播放这些帧,利用人类的视觉残留效应,我们可以看到流畅的运动图像。
视频的帧率
- 帧率(Frame Rate):每秒钟播放的帧数。常用帧率包括24fps(电影标准)、30fps(电视标准)和60fps(高帧率视频)。
- 帧率对流畅度的影响:帧率越高,视频越流畅。通常,24fps已经能够提供流畅的观看体验。
视频的时间轴
视频的每一帧按时间顺序排列,形成一个时间轴。声音也按时间顺序与帧同步播放。
视频的数字化过程
1. 采样与量化
- 图像采样:将视频中的每一帧图像进行采样,将每个像素的颜色用RGB值表示。
- 声音采样:将同步的声音波形进行采样,用数字表示其振幅。
2. 视频帧的存储
- 每一帧图像都是一张静态图片,由许多像素组成,每个像素的颜色用RGB值表示。
- 将这些帧按时间顺序排列,形成一个连续的视频文件。