计算机基础(8)——音频数字化(模电与数电)
💗计算机基础系列文章💗
- 👉🍀计算机基础(1)——计算机的发展史🍀
- 👉🍀计算机基础(2)——冯诺依曼体系结构🍀
- 👉🍀计算机基础(3)——计算机的系统组成🍀
- 👉🍀计算机基础(4)——操作系统概述🍀
- 👉🍀计算机基础(5)——进制与进制转换🍀
- 👉🍀计算机基础(6)——编码与解码🍀
- 👉🍀计算机基础(7)——数字图像技术🍀
- 👉🍀计算机基础(8)——音频数字化(模电与数电)🍀
- 👉🍀计算机基础(9)——原码、补码、反码🍀
- 👉🍀计算机基础(10)——编程语言与跨平台🍀
音频的编码与解码
二进制转换音频的过程也叫音频数字化,其过程较为复杂,是模拟声音信号转变为数字信号再由数字信号转换为模拟信号的一个技术实现,其过程涉及到声音的采集,转换为模拟信号,采样、量化等。了解音频数字化之前我们先了解一些关于声音的一些前置知识,
1.1 声波
我们知道声音是以声波的形式在空气中传播的,声波是声音的物理表现形式,它是由物体振动产生的能量传播方式。当物体振动时,它会激发周围介质(如空气、液体或固体)中的分子或原子振动,这些振动随后以波的形式传播开来。
一段声波中包含有声音的频率、振幅、音色等声音元素,通过声波我们可以将声音这一抽象概念通过数据的形式表现出来。声波的采集就是原声音的采集,通过麦克风、话筒等录音设备就可以采集到一段声音的声波。
例如我们通过声波来反映一段声音的频率、振幅、音色等信息。
(1)通过声波的频率反映声音音调,频率低音调低,频率高音调高。
(2)通过声波的振幅反映声音响度,振幅大响度大,振幅小响度小。
(3)通过声波的规律性反映声音音色,一般来说具有规律性的声波听起来悦耳,反之为噪音。
1.2 模拟信号
当录音设备采集到声波数据后将会以电信号的方式模拟出声波信号,声波被电信号模拟出来的信号就是声音模拟信号,这种模拟信号是对声波的一种电子化表示,以便在音响设备中再现出类似原始声波的效果。
模拟信号是连续变化的,模拟信号的最大特点是随着时间连续变化的值,它可以包含无限数量的可能幅度值。
我们可以把模拟信号模拟声波的过程看作是汽车的仪表盘模拟汽车行驶速度的过程,当驾驶员深踩一脚油门时,汽车会迅速提高行驶速度,然而汽车仪表盘的数据并不是从0km/h直接变成80km/h,虽然这个变化的时间很短,但也是从0km/h连续变化到80km/h,期间汽车仪表盘指针肯定指向过10、11.7、12.785、20.491、38.4、69.8、78等这样的数据。同理,当声波的频率忽高忽低,振幅忽大忽小时模拟信号也会随着时间连续不间断的模拟出声波频率的高低以及振幅的大小。
例如汽车行驶速度的通过仪表盘来模拟,如图所示。
通过观察曲线图我们可以看到,取任意一个时间点都可以获取到这个时间点所对应的速度值,通过声音模拟信号模拟声波的变化也类似于这样。如图所示,当通过模拟信号将声波信息模拟出来后,取任意一个时间点所对应的声波幅度数值也能取出来,这就是模拟信号的最大特点——随着时间连续变化的值。
类似于模拟信号的变化还有水银温度计的变化,当我们把水银温度计放置在10°的水温环境下时突然加了一些温水进去,使得水温一下子骤升至50°,然而水银温度计的数值肯定经过了20°、32.7°、39.1°、45.8°等数值,并不是从10°直接变成到50°,而是随着时间的变化温度上数值从10°增加至50°(虽然这个时间可能非常短)。
1.3 数字信号
数字信号是模拟信号的数字化,它是一系列离散的电脉冲(信号),可以利用其某一瞬间的状态来表示具体的数据。数字信号与模拟信号最大的不同点在于模拟信号是随着时间连续变化的值,它可以去任意时间点上的数据。而数字信号则是离散的数值,即取某几个瞬间的状态来表示具体的数据,数字信号包含的是有限数量的可能幅度值。
如图所示,数字信号来模拟声波时,只有某个具体的时间点才会有对应的声波数据,而不是和模拟信号那样任意的时间点上都能查询到对应的声波数据。
数字信号只有某几个时间点上才能有对应的数据,这些时间点并不是连续的,这意味着某些时间上的数据会缺失,将数字信号的这些时间点连接起来可以大致还原模拟信号。
如果将模拟信号看着是汽车上的仪表盘、水银温度计,那么数字信号就可以看做是电动车上面的数字仪表盘和电子温度枪。
不管是数字仪表盘还是电子温度枪,这些设备的数值和时间都是离散的。以电动车的数字仪表盘举例,例如我们骑电动车时突然深拧加速,假设速度从0提速到了40km/h,那么电子仪表盘上的速度很有可能就从10km/h变化到25km/h再变化到34km/h,最后变化到40km/h,在电子仪表盘模拟电动车行驶速度的变化时,只显示了(模拟了)25、34、40这些数值,而25~34
以及34~40
之间的数据都不会被显示(模拟)。
那为什么有了模拟信号还要转换为数字信号呢?因为数字信号相对比模拟信号存在有很多优点,如下:
(1)数字信号抗干扰性强:数字信号在传输和处理过程中可以通过纠错码等技术来提高抗干扰能力,相比之下,模拟信号在传输和处理过程中容易受到噪声和干扰的影响,导致信号失真或丢失。
(2)数字信号的可编程性:数字信号可以通过编程进行处理和操作,例如滤波、压缩、加密等,这使得数字信号在处理和存储方面更加灵活和方便。
(3)数字信号的可复制性:数字信号可以通过复制和传输进行无损的复制和传递,而模拟信号在复制和传输过程中可能会产生失真或损失。
(4)数字信号便于存储和传输:数字信号以二进制数的形式表示,便于计算机进行存储和传输。同时,数字信号可以进行压缩处理,以节省存储空间和提高传输效率。
(5)数字信号便于加密和解密:数字信号可以通过加密算法进行加密处理,以保护信号的安全性和隐私性。而模拟信号则难以实现加密和解密操作。
数字信号相对模拟具有许多优势,使其在现代通信中占据主导地位。
1.4 音频数字化
所谓音频数字化就是把模拟信号如何具体的转换为数字信号,其过程分为采样、量化、编码等。
1.4.1 采样
(1)采样:将连续的模拟声音信号转换为一系列离散的采样点的过程,采样点随后由模拟数字转换器(ADC)转换为数字信号,以便计算机或其他数字设备进行处理、存储、传输和播放。每秒钟对声波幅度值样本的采样次数称为采样频率,单位为HZ,声音的质量受采样频率的影响。
如图所示,在一段模拟信号中,我们对其根据指定时间进行采样,我们可以发现采样的频率越高,与模拟信号越接近,声音还原程度越高,数据量也越大。
1.4.2 量化
(2)量化:将幅度上连续取值(模拟量)的每一个样本转换为离散值(数字量)表示的过程,它实现了在幅度轴上对信号的数字化。通过量化,音频信号被转换为一系列的数字值,这些数字值可以精确地表示原始音频信号的幅度,如图所示。
通过对比不同的量化等级,我们可以发现量化等级越高量化值的精度也越高,更高的量化等级意味着更多的量化值可以用来表示音频样本,就能够更好的还原音频。
计算机底层是以二进制存储的,因此我们需要将量化值转换为二进制。在声音量化过程中,我们使用量化位数来表示量化值所需要的二进制位数,例如在量化等级为4的情况下使用两位二进制数就可以表示量化值,因此它的量化位数就是2bit,量化等级为8的量化位数就是3bit,如图所示。
然而,需要注意的是,量化位数的提高虽然能够提升音质,但也会导致音频文件的数据量增大。因为每个音频样本都需要用更多的二进制位来表示,所以音频文件的存储空间会相应增加。例如,一个16bit的音频文件在数据量上会是8bit音频文件的两倍。
1.4.3 编码
(3)编码
声音通过采样、量化过后就成为了010101的二进制数,编码决定了这些二进制数如何存储,有的编码规则的存储效率非常高,同样一段的音频可以使用非常少的空间将其存储,有的编码规则则更加注重与音频的质量,但可能会花费更多的空间来存储。
不同的编码方式就被分成了不同类型的音频文件类型,常见的音频文件有:
- WAV(Waveform Audio File Format)格式:WAV是一种无损音频格式,音质非常好,因为是无损的,保留了原始音频的所有信息。常用于多媒体开发的中间文件、保存音乐和音效素材。由于WAV是无损压缩,因此文件体积相对较大。
- MP3(MPEG Audio Layer III):MP3是一种有损音频格式,广泛应用于音乐、广播、电视等领域,具有较高的压缩比和较好的音质。音质在128Kbit/s以上表现还不错,但相较于无损格式有所损失。适合需要较小文件体积,且对音质要求不太苛刻的场合,如网络音乐下载、移动设备存储等。
- AAC(Advanced Audio Coding):ACC是一种高压缩比的音频压缩算法,它的压缩比要远超过较老的音频压缩算法,如AC-3、MP3等。适用于需要较高音质,同时文件体积也要相对较小的场合,如在线音乐流媒体、手机铃声等。
相关文章:

计算机基础(8)——音频数字化(模电与数电)
💗计算机基础系列文章💗 👉🍀计算机基础(1)——计算机的发展史🍀👉🍀计算机基础(2)——冯诺依曼体系结构🍀👉ἴ…...

手搓单链表(无哨兵位)(C语言)
目录 SLT.h SLT.c SLTtest.c 测试示例 单链表优劣分析 SLT.h #pragma once#include <stdio.h> #include <assert.h> #include <stdlib.h>typedef int SLTDataType;typedef struct SListNode {SLTDataType data;struct SListNode* next; }SLTNode;//打印…...
代码随想录算法训练营第18天|二叉树
513. 找树左下角的值 最左边的结点的特性 1.只能是叶子结点, 2.必须考虑是最底层,所以要考虑树的深度 3.同样的深度考虑左子树 考虑迭代法,层序遍历 递归优点难搞的 /*** Definition for a binary tree node.* function TreeNode(val, left, righ…...

使用tftpd更新开发板内核
我们升级内核可以通过原厂提供的升级软件来进行,比如瑞芯微的RKDevTool.exe,只不过这种方式必须通过指定的OTG升级口,还得借助按键进入loader模式后才可以。 其实还可以利用一些通用的工具来进行升级,比如tftpd工具。 下载地址p…...

MySQL数据库整体知识点简述
目录 第一章:数据库系统概述 第二章:信息与数据模型 第3章 关系模型与关系规范化理论 第四章——数据库设计方法 第六-七章——MySQL存储引擎与数据库操作管理 第九章——索引 第10章——视图 第11章——MySQL存储过程与函数 第12章——MySQL 触…...

深入理解MySQL索引下推优化
在MySQL中,索引的使用对于查询性能至关重要。然而,即使有合适的索引,有时查询性能仍然不尽如人意。索引下推(Index Condition Pushdown,ICP)是一项能够进一步优化查询性能的技术。本文将详细讲解索引下推的…...

论文降重技巧:AI工具如何助力论文原创性提升?
论文降重一直是困扰各界毕业生的“拦路虎”,还不容易熬过修改的苦,又要迎来降重的痛。 其实想要给论文降重达标,我有一些独家秘诀。话不多说直接上干货! 1、同义词改写(针对整段整句重复) 这是最靠谱也是…...

el-date-picker的使用,及解决切换type时面板样式错乱问题
这里选择器的类型可以选择日月年和时间范围,根据类型不同,el-date-picker的面板也展示不同,但是会出现el-date-picker错位,或者面板位置和层级等问题。 源代码: <el-selectv-model"dateType"placeholder&…...
Flutter 中的 ToggleButtonsTheme 小部件:全面指南
Flutter 中的 ToggleButtonsTheme 小部件:全面指南 Flutter,作为由 Google 开发的跨平台 UI 框架,为开发者提供了丰富的组件来构建现代化的应用程序。ToggleButtons 是 Material Design 组件库中的一个组件,它允许用户从一组选项…...

新手教程之使用LLaMa-Factory微调LLaMa3
文章目录 为什么要用LLaMa-Factory什么是LLaMa-FactoryLLaMa-Factory环境搭建微调LLaMA3参考博文 为什么要用LLaMa-Factory 如果你尝试过微调大模型,你就会知道,大模型的环境配置是非常繁琐的,需要安装大量的第三方库和依赖,甚至…...
Java函数笔记
1. Statement.executeQuery 和 Statement.executeUpdate 作用: 用于执行SQL查询和更新操作。 问题: 容易导致SQL注入攻击。 解决方法: 使用PreparedStatement进行参数化查询。 // 不安全的做法 Statement stmt connection.createStat…...

Maven实战: 从工程创建自定义archetype
在上一节中(创建自定义archetype)我们手动创建了一个项目模板,经过5步能创建出一个项目模板,如果我有一个现成的项目,想用这个项目作为模板来生成其他项目呢?Maven提供了基于项目生成archetype模板的能力,我们分3步来讲…...

初识JAVA中的包装类,时间复杂度及空间复杂度
目录: 一.包装类 二.时间复杂度 三.空间复杂度 一.包装类: 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java 给每个基本类型都对应了一个包装类型。 1 基本数据类型和对应的包装类 &am…...

RapidMiner如何利用Hugging Face中的模型实现更有趣的事
RapidMiner Studio最新发布的功能更新,重点是嵌入Hugging Face和Open AI,Hugging face中含有大量的可用模型,包含翻译、总结、文本生成等等强大的模型,Open AI更不必说了,生成界的鼻祖。那么今天主要介绍一下RapidMine…...
Vue3 自定义Hooks函数的封装
1、如何理解vue3中的自定义hooks 在Vue 3中,自定义hooks允许开发者封装和重用逻辑代码。自定义hooks是使用Composition API时创建的函数,这些函数可以包含任意的组合逻辑,并且可以在多个组件之间共享。 自定义hooks通常遵循这样的命名约定&…...
python的DataFrame和Series
Series、DataFrame 创建 pd.Series() pd.DataFrame() # 字典{列名:[值1,值2],} [[]] [()] numpy Pandas的底层的数据结构,就是numpy的数组 ndarray 常用属性 shape (行数,) (行数,列数) values → ndarray index 索引名 siz…...

ARP欺骗的原理与详细步骤
ARP是什么: 我还记得在计算机网络课程当中,学过ARP协议,ARP是地址转换协议,是链路层的协议,是硬件与上层之间的接口,同时对上层提供服务。在局域网中主机与主机之间不能直接通过IP地址进行通信,…...

25、DHCP FTP
DHCP 动态主机配置协议 DHCP定义: 服务器配置好了地址池 192.168.233.10 192.168.233.20 客户端从地址池当中随机获取一个ip地址,ip地址会发生变化,使用服务端提供的ip地址,时间限制,重启之后也会更换。 DHCP优点&a…...
spark学习记录-spark基础概念
背景需求 公司有项目需要将大容量数据进行迁移,经过讨论,采用spark框架进行同步、转换、解析、入库。故此,这里学习spark的一些基本的概念知识。 Apache Spark 是一个开源的大数据处理框架,可以用于高效地处理和分析大规模的数据…...
BGP数据包+工作过程
BGP数据包 基于 TCP的179端口工作;故BGP协议中所有的数据包均需要在tcp 会话建立后; 基于TCP的会话来进行传输及可靠性的保障; 首先通过TCP的三次握手来寻找到邻居; Open 仅负责邻居关系的建立,正常进收发一次即可;携带route-id; Keepli…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...