音频进阶学习二——模数和数模转换中的采样、量化和编码

news2024/12/24 0:00:17

文章目录

  • 前言
  • 一、频率
    • 连续时间信号的频率
    • 数字信号的频率
  • 二、模数转换过程
    • A/D转换三步
  • 三、采样
    • 确定采样频率
    • 数模转换中的插值
  • 四、量化
    • 量化过程
    • 量化误差
  • 五、编码
  • 总结


前言

所有软件的运行都得益于硬件上的突破,数字信号是从40年前就开始高速发展的领域。得益于硬件上从一开始的中规模集成电路,到大规模集成电路,再到现如今的超大规模集成电路,促进了功率更小,体积更小,速度更快,价格更便宜的数字计算机。

硬件上的突破使得计算机可以执行复杂的数字信号功能和任务,当然并不是说数字信号就是解决所有信号的解决方案,对于一些需要及时处理的例如:带宽等信号,这种就需要模拟信号或者光信号。

而声音是一种波,恰恰可以将这种波转换成数字信号在软件中进行处理。

本篇文章借鉴了《数字信号处理》、《离散时间信号处理》、《信号与系统》,如果有写错的地方,是笔者个人能力不足,没有理解透彻,恳请告知笔者。

|版本声明:山河君,未经博主允许,禁止转载

一、频率

为了更好的了解数模转换的原理,我们最好先了解一下信号频率的概念。

其实在音频基础学习一——声音的本质、术语与特性这篇文章中,有介绍过:
频率——一秒钟内振动质点完成的全振动的次数叫振动的频率,其单位为赫 ( H z ) 频率——一秒钟内振动质点完成的全振动的次数叫振动的频率,其单位为赫(Hz) 频率——一秒钟内振动质点完成的全振动的次数叫振动的频率,其单位为赫(Hz)

连续时间信号的频率

我们知道所有的信号都是由不同的波组成的,而通过傅里叶原理——所有的波形都可以拆解成不同的正弦波组成。声音当然也如此。

在音频基础学习二——声音的波形中,有举过最简单的正弦波数学公式
x a ( t ) = A cos ⁡ ( Ω t + θ ) x_a(t)= A \cos(\Omega t + \theta) xa(t)=Acos(Ωt+θ)

其中 A 是正弦波的幅度,也就是振幅, Ω 是弧度的频率,也就是 2 π f , θ 为相位 A是正弦波的幅度,也就是振幅,\Omega 是弧度的频率,也就是2\pi f, \theta为相位 A是正弦波的幅度,也就是振幅,Ω是弧度的频率,也就是2πf,θ为相位

例如一个正弦波图:
在这里插入图片描述

数字信号的频率

先复习一下:

上一篇文章音频进阶学习一——模拟信号和数字信号中,介绍了连续时间信号、离散时间信号、模拟信号、连续值信号、离散值信号以及数字信号。

而数字信号不仅要在自变量上(往往是时间),还要在一定范围内取值,也就是同时满足连续值信号和离散时间信号的特征。

在此也以一个正弦波举例,一个离散时间的正弦信号数学公式上为

x a ( n ) = A cos ⁡ ( Ω n + θ ) x_a(n)= A \cos(\Omega n + \theta) xa(n)=Acos(Ωn+θ)
此时n是一个整形变量,称为样本数,所以它的图形看起来是这样的:
在这里插入图片描述

二、模数转换过程

上篇文章说过,在实际应用中,我们感兴趣的信号大多是模拟信号,例如:声音、地震、生物、雷达、视频等。要通过数字方法处理模拟信号,需要先把模拟信号转换成数字形式,这一过程称为模数转换(A/D)

A/D转换三步

从概念上,A/D转换分为三步:

  • 采样:这是连续时间信号到离散时间信号的转换过程,通过对连续时间信号在离散时间点处取样本值获得。因此,如果x(t)是采样器的输人,那么输出是x(nT)≡x(n),其中7称为采样间隔。
  • 量化:这是离散时间连续值信号转换到离散时间离散值(数字)信号的转换过程。每个信号样本值是从可能值的有限集中选取的。未量化样本(n)和量化输出x(n)之间的差称为量化误差。
  • 编码:在编码过程中,每一个离散值x(n)由b位的二进制序列表示。

看到这里大家应该也就明白pcm数据中采样率,字节数是从何而来的了。

A/D转换图解如下:
在这里插入图片描述

三、采样

而模拟信号通过A/D转换成数字信号后,再由D/A转换成模拟信号,从而被听到、看到。如何保证它的精度呢?这个就需要对于一对连续的样本进行插值,从而保持零阶保持或者阶梯近似。

例如:
在这里插入图片描述
那么在A/D过程中如何确定采样的次数,在D/A过程中什么时候插入值呢?

确定采样频率

之前我们了解到,任何模拟信号都可以看作不同振幅、频率和相位的正弦信号的和,最终从数学上得到公式为:
在这里插入图片描述
对于语音信号中最重要的频率范围(即语音的主要频带)通常集中在 300 Hz 到 3400 Hz 之间。根据采样定理,要无失真地捕捉频率为 f m a x f_{max} fmax的信号,采样频率 应该至少为 2 × f m a x 2×f_{max} 2×fmax。因此,语音信号常用的采样频率有 8 kHz(电话通信)、16 kHz、22.05 kHz、44.1 kHz(CD质量)等。

这就是采样率的由来。

数模转换中的插值

根据采样定理:如果包含在某个模拟信号 x a ( t ) x_a(t) xa(t)中的最高频率是 F   m a x   = B F~max~ = B F max =B,而信号以采样率 F s > 2 F   m a x   = 2 B F_s>2F~max~ = 2B Fs>2F max =2B采样,那么 x(t)可以从样本值准确恢复,插值函数为:
g ( t ) = sin ⁡ 2 π B t 2 π B t g(t)= \frac{\sin 2 \pi Bt}{2\pi Bt} g(t)=2πBtsin2πBt

例如:
在这里插入图片描述

四、量化

量化过程

上文说过,在D/A过程中,数字信号将转换回模拟信号,并且要达到零阶保持或者阶梯近似的状态,那么就需要A/D过程中取值时要达到一定的精度。

通过把每个样本值表示为一个有限(而不是无限)的数字,将一个离散时间连续幅度信号转换成数字信号的过程,称为量化。

值得注意的是:取值量化过程并不是直接通过数学公式直接取模拟信号的值,而是保持阶梯取值,如同下图:
在这里插入图片描述
其中:

  • 黑点是量化取值
  • 白点是实际值
  • 黑点和白点一一对应
  • 两个黑点之间的距离称之为量化步长或者分辨率

量化误差

从这里就可以看出取值量化过程中存在量化误差,也叫做量化噪声,存在误差是因为需要对于量化的值进行四舍五入的保留有效数字。

比如,现在量化的精度是0.1,而下图有量化的点在0.6和0.7之间
在这里插入图片描述
四舍五入的标准:
在这里插入图片描述

五、编码

在一个 A/D转换器中的编码过程为每一个量化级别赋予一个唯一的二进制数。如果有L级那么我们至少需要L个不同的二进制数。如果字长为bit位,那么我们可以生成 2 b 2^b 2b个不同的二进制数。

因此有 2 b ≥ L 2^b≥L 2bL,或者等价有b≥bL。商业上可用的 AD转换器可以是bit=16位或更小的有限精度。一般来说,采样率越高及量化越精细,设备就越昂贵。


总结

由于知识储量和工作原因,很长一段时间没有写过关于音频的博客了,后面希望能够有充分的时间和大家一样多多提升自己,并能够分享自己整理觉得有意义的东西。

如果对您有所帮助,请帮忙点个赞吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2044045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】深度强化学习–RL的基本概念、经典场景以及算法分类

引言 深度强化学习(Deep Reinforcement Learning, DRL)是机器学习的一个分支,它结合了深度学习(Deep Learning)和强化学习(Reinforcement Learning, RL)的技术 文章目录 引言一、深度强化学习–…

为什么 React 的函数组件每次渲染执行两次

1.这是 React18 才新增的特性。 2.仅在开发模式("development")下,且使用了严格模式("Strict Mode")下会触发。 生产环境("production")模式下和原来一样,仅执行一次。 在 React 中,当你看到某些代码执行了多…

整合Rocketmq实现审批流消息推送

文章目录 Docker 部署 RocketMQ拉取 RocketMQ 镜像创建容器共享网络 部署NameServer创建目录并授予权限拷贝启动脚本启动容器NameServer 部署Broker Proxy创建挂载文件夹并授权创建broker.cnf文件拷贝启动脚本启动容器Broker 部署RocketMQ控制台(rocketmq-dashboar…

12、springboot3 vue3开发平台-前端-记住我功能实现

文章目录 1. 前端用户信息保存2. 登录页面添加3. 后端实现 1. 前端用户信息保存 使用pinia持久化保存用户名密码 src/stores/remember-me.js // 定义 store import { defineStore } from "pinia" import {reactive} from vueexport const useRememberMeStore defi…

求职Leetcode算法题(7)

1.搜索旋转排序数组 这道题要求时间复杂度为o(log n),那么第一时间想到的就是二分法,二分法有个前提条件是在有序数组下,我们发现在这个数组中存在两部分是有序的,所以我们只需要对前半部分和后半部分分别…

element ——tree组件懒加载数据、自定义label、修改高亮样式、回显点击状态

需求 整体宽高占一屏,超出滚动条tree组件点击懒加载每一级数据,一共三级三级节点前加icon,标识是否已学习点击高亮显示背景图横向超出省略显示或者横向滚动条纵向超出纵向滚动条修改其字体和间距☆☆☆☆☆从别的页面跳入回显三级点击状态 …

netsh int tcp show global查看TCP参数

TCP 全局参数 接收方缩放状态 : enabled 接收窗口自动调节级别 : normal 加载项拥塞控制提供程序 : default ECN 功能 : disabled RFC 1323 时间戳 : allowed 初始 RTO : 1000 接收段合并状态 : enabled 非 Sack Rtt 复原 : disabled 最大 SYN 重新传输次数 : 4 快速打开 : en…

CrowdTransfer:在AIoT社区中实现众包知识迁移

这篇论文的标题是《CrowdTransfer: Enabling Crowd Knowledge Transfer in AIoT Community》,由 Yan Liu, Bin Guo, Nuo Li, Yasan Ding, Zhouyangzi Zhang, 和 Zhiwen Yu 等作者共同撰写,发表在《IEEE Communications Surveys & Tutorials》上。以下…

springboot航班进出港管理系统--论文源码调试讲解

第2章 开发环境与技术 本章节对开发航班进出港管理系统管理系统需要搭建的开发环境,还有航班进出港管理系统管理系统开发中使用的编程技术等进行阐述。 2.1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始的诞生&#xff…

网络协议--TCP/IP协议栈--三握和四挥

文章目录 网络设备交换机交换机的工作原理 路由器路由器工作原理 TCP/IP协议栈TCP/IP四层模型TCP/IP通信过程TCP特性TCP包头结构源端口、目标端口序列号(seq)确认号(小ack)标记位 TCP协议端口号端口号分类ssh服务nc工具抓包 socket套接字端口占用 三次握手Wireshark抓包tcpdump…

构建完美人工智能工程师培养计划

一、理论基础构建 1. 数学与统计学基础:作为AI的基石,扎实的数学与统计学知识不可或缺。培养计划应涵盖高等数学、线性代数、概率论与数理统计、优化理论等课程,为学员打下坚实的理论基础。 2. 计算机科学基础:包括数据结构、算…

DLT645-2007通信协议---读取解析智能电表数据

一、DLT645-2007通讯协议 DLT645-2007是中国电力行业规定的一种智能电表通信协议,主要用于电能表与数据采集设备之间的通信。DLT645-2007协议定义了电能表与数据采集设备之间的数据格式、通信方式、命令集等内容,用于实现电能表数据的采集、传输和管理。…

SpringBoot整合Liquibase

1、是什么? Liquibase官网 Liquibase是一个开源的数据库管理工具,可以帮助开发人员管理和跟踪数据库变更。它可以与各种关系型数据库和NoSQL数据库一起使用,并提供多种数据库任务自动化功能,例如数据库迁移、版本控制和监控。Li…

盲盒抽奖源码

介绍: 功能上还可以,商品和盲盒可以在你程序里添加,设置概率等!! 新盲盒星球抽奖商城手机网站源码 随机开箱抢购 代码有点大,三百多M。 教程搭建很简单,基本10分钟搭建一套,可一个服务器搭建多套,只要你…

【时时三省】(C语言基础)模拟实现字符串相关函数

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 模拟实现库函数:strcpy 示例: const修饰指针 示例: const 修饰变量,这个变量为常变量,不能被修改,但本质上还是变量 正常num=20是改不了它…

招聘管理型岗位,HR会考察候选人的哪些方面?

团队管理能力 团队管理能力可以说是管理型岗位最基本的要求,只有具备优秀的团队管理能力,才能够带领团队实现组织目标,提高团队凝聚力,而想要考察一个人是否具备团队管理能力,就要通过多方面来测试。可以先了解一下候…

CSS笔记总结:第五天(HTML+CSS笔记完结)

Xmind鸟瞰图: 简单文字总结: css知识总结: 元素的显示与隐藏: 1.通过display隐藏元素 不保留位置 2.通过visibility 隐藏元素 保留位置 3.overflow 溢出隐藏 鼠标样式cursor: 1.defauly小白 2.p…

走进 keepalived:解析高可用架构背后的关键技术

一、什么是keepalived Keepalived 是一个用于实现服务器高可用性(High Availability,简称 HA)的软件。 简单来说,它的主要作用是检测服务器的状态,并在主服务器出现故障时,自动将服务切换到备份服务器上&…

SVN权限控制解析

一、基础数据说明 1. 代码目录存在多级 2. 角色存在多级 二、规则说明 结合例子讲规则 1、多级文件夹 a. 继承与覆盖 【文件夹层级】: Repositories/BS_Projects/科顺 BS_Projects包含了多个项目,每个项目是一个文件夹,比如“科顺”是其…

分布式事务Seata保证审批状态一致性

文章目录 下载安装Seata创建对应数据库修改application.yml相应配置启动SeataPmHub 实战——添加任务事务管理业务库添加undo_log 表对应服务加上对应的seata依赖Nacos 配置文件 pmhub-project-dev.yml 添加 seata 配置:接口添加 GlobalTransactional 注解涉及数据表…