文章目录
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值表示。
- 将这些帧按时间顺序排列,形成一个连续的视频文件。