Linux音频-基本概念

文章目录

  • 机器声音的采集原理
  • 机器声音的播放原理
  • 音频相关基本概念
  • 计算机采集音频的模型
  • Linux系统音频框架
  • Linux音频框架的三类角色

Linux音频框架参考文章:Linux音频框架

机器声音的采集原理

声音是一种连续的信号,故其是一种模拟量。
录音设备可以捕获声音这种连续的信号,转化成相应的模拟量。
我们若要存储下声音,就要保存这些模拟量,但是通常我们会把这些模拟量转化成离散的数字信号,然后再保存下来。

模拟量转化成数字量的过程有个专业的名称:ADC(analog convert to digital)
百度上,ADC是模拟数字转换器(英语:Analog-to-digital converter)

机器声音的播放原理

捕获的声音用离散的数字量表示后,若我们播放这些声音,那么我们需要把这些数字量转化为模拟量后,我们就能听到这些声音了。

这个过程就是CDA,数字信号转模拟信号。

音频相关基本概念

在大致了解音频的采集和播放的原理后,这里了解一下音频相关的参数含义以及一些基本概念。

  • 样本长度(sample):
    一次采样得到的数据叫做样本,样本是记录音频数据最基本的单位,其长度常见的有8位,16位,24位,32位。
    如下图,下面使用4位的样本长度来记录声音的波形。可以推测得到,若样本长度越大,采集的声音波形也准确。
    在这里插入图片描述

  • 通道数(channel):
    就是声道数,该参数为1表示单声道,2则是立体声。

  • 桢(frame):
    桢记录了一个声音单元,其长度为样本长度与通道数的乘积。

  • 采样率(rate):
    钟采样的次数,该次数是针对而言。

  • 周期(period):
    音频设备一次处理所需要的桢数,对于音频设备的数据访问以及音频数据的存储,都是以此为单位。

  • 交错模式(interleaved):
    是一种音频数据的记录方式,在交错模式下,数据以连续桢的形式存放,即首先记录完桢1的左声道样本和右声道样本(假设为立体声格式),再开始桢2的记录。而在非交错模式下,首先记录的是一个周期内所有桢的左声道样本,再记录右声道样本,数据是以连续通道的方式存储。不过多数情况下,我们只需要使用交错模式就可以了。

计算机采集音频的模型

音频采集主要有三者:①音频输出及捕获设备,②codec编解码设备,③MCU带音频数据接口的单片机。如下图所示。img

①音频输出及捕获设备:扬声器、麦克风
扬声器负责根据输入的模拟量数据播放声音。
麦克风负责把声音转化成模拟量并输出。

②MCU:带音频数据接口的片上系统芯片(SOC)
platform可以理解成 带有 音频数据传输接口的 单片机。
platform可以输入和输出音频数字信号

③codec:数字信号模拟信号编解码器
codec有以下两个功能:
1.把platform通过音频数据传输接口输出的数字信号转化成模拟信号,传输给扬声器。
2.把麦克风的模拟信号转化成数字信号,通过音频数据传输接口传输给platform

Linux系统音频框架

Linux中使用的音频框架是ASOC(ALSA System on Chip)

ASOC的出现就是为了解决ALSA无法解决的问题。ALSA到底存在什么问题? 以及ASOC会以怎样的方式去解决ALSA存在的问题?

详细参考内核文档: kernel\documentation\sound\alsa\soc\Overview.txt

ALSA存在的问题:

  1. Codec驱动与SOC中断CPU耦合严重,这将导致代码重复,一个Codec驱动每个cpu上会出现不同的版本。

  2. 当音频事件发生时(插拔耳机,音箱)没有标准的方法通知用户,尤其在移动端此事件非常常见。

  3. 当播放/录制音频时,驱动会让整个codec处于上电状态,这样会在移动端非常浪费电量。同时也不支持改变采样频率/配置电流来节约功耗。

针对以上问题,提出了ASOC(ALSA System on Chip)来力争解决上述问题。解决方法如下:

  1. Codec代码独立,不再耦合与CPU,这样可以增加Codec代码重复利用。

  2. 在Codec和Soc之间通过简单的I2S/PCM音频接口通信,这样SOC和Codec只需要注册自己相关的接口到ASOC code即可。

  3. 动态的电源管理(Dynamic Audio Power Management)DAPM。DAPM始终将Codec自动设置在最低功耗状态运行。

  4. 消除pop音。控制各个widget上下电的顺序消除pop音。

  5. 添加平台相关的控制,运行平台添加控制设备到声卡。

Linux音频框架的三类角色

ASOC音频架构为了实现上述的新feature,ASOC将嵌入式音频系统分为三大类可重复使用的驱动程序: Platform, Machine, Codec。

Codec类: Codec即编解码芯片的驱动,此Codec驱动是和平台无关,包含的功能有: 音频的控制接口,音频读写IO接口,以及DAPM的定义等。如果需要的话,此Codec类可以在BT,FM,MODEM模块中不做修改的使用。因此Codec就是一个可重复使用的模块,同一个Codec在不同的SOC中可以使用。

Platform类: 可以理解为某款SOC平台,平台驱动中包括音频DMA引擎驱动数字接口驱动(I2S, AC97, PCM)以及该平台相关的任何音频DSP驱动。同样此Platform也可以重用,在不同的Machine中可以直接重复使用。

Machine类: Machine可以理解为是一个桥梁,用于在Codec和Platform之间建立联系。此Machine指定了该机器使用那个Platform,那个Codec,最终会通过Machine建立两者之间的联系。

在软件上可以抽象如下图:
在这里插入图片描述
ASOC数据结构
在分析整个ASOC的过程中,出现了众多的数据结构,在此先理清重要的数据结构的关系。如下图:
在这里插入图片描述
可以看到Machine是连接Codec和Platform之间的桥梁,因此首先要分析Machine部分,在下节分析Machine部分。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

gRPC之gateway集成swagger

1、gateway集成swagger 1、为了简化实战过程,gRPC-Gateway暴露的服务并未使用https,而是http,但是swagger-ui提供的调用服 务却是https的,因此要在proto文件中指定swagger以http调用服务,指定的时候会用到文件 prot…

蓝桥杯 Java k倍区间

前缀和的一个神奇算法,这道题暴力是遍历前缀和的差,也就是遍历所有区间和看他是不是能不能正好除尽k 这道题的技巧是将所有前缀和和k求余 按照求余的结果放在一个数组中 那么余数为0的前缀和a一定满足要求([0,a]) 余数相同的两两…

搭建SNMP服务器

要搭建SNMP服务器,您可以按照以下步骤进行操作: 选择合适的操作系统:您可以选择在Windows、Linux或其他操作系统上搭建SNMP服务器。不同的操作系统有不同的安装和配置方法。 安装SNMP软件:根据您选择的操作系统,安装相…

vue3 code format bug

vue code format bug vue客户端代码格式化缺陷,为了方便阅读和维护,对代码格式化发现这个缺陷 vue.global.min.3.2.26.js var Vuefunction(r){"use strict";function e(e,t){const nObject.create(null);var re.split(",");for(le…

QCC 音频输入输出

QCC 音频输入输出 QCC蓝牙芯片(QCC3040 QCC3083 QCC3084 QCC5181 等等)支持DAC、I2S、SPDIF输出,AUX、I2S、SPDIF、A2DP 输入 蓝牙音频输入,模拟输出是最常见的方式。 也可以再此基础上动态切换输入方式。 输入方式切换参考 sta…

有哪些适用于 Windows 的PDF 阅读器?免费 PDF 阅读器清单

探索适用于 Windows 10 和 11 的最佳 PDF 阅读器 适用于 Windows 10 和 Windows 11 的最佳 PDF 阅读器让您可以在台式计算机上查看和共享文档。 最好的PDF 编辑器和免费的 PDF 编辑器配备了先进的工具,可以跨不同的操作系统工作。但是,当您只需要查看和…

《从零开始大模型开发与微调 :基于PyTorch与ChatGLM》简介

内 容 简 介 大模型是深度学习自然语言处理皇冠上的一颗明珠,也是当前AI和NLP研究与产业中最重要的方向之一。本书使用PyTorch 2.0作为学习大模型的基本框架,以ChatGLM为例详细讲解大模型的基本理论、算法、程序实现、应用实战以及微调技术,…

启动1000万个虚拟线程需要多少时间?需要多少平台线程?

之前,在Java新特性专栏中,我们简单介绍了Java 21正式发布的虚拟线程。 昨天,正好看到一个讲解此内容的视频,非常不错,所以DD这里给大家翻译好了,感兴趣的可以看看。可以进一步了解虚拟线程。 什么是虚拟线…

什么是Docker CLI

Docker CLI(命令行界面)是一个工具,允许用户通过命令行或终端与Docker进行交互。Docker是一个开源平台,用于开发、运送和运行应用程序。Docker使用容器化技术来打包应用程序及其依赖项,以确保在不同环境中的一致性和隔…

配置Sentinel 控制台

1.遇到的问题 服务网关 | RuoYi 最近调试若依的微服务版本需要用到Sentinel这个组件,若依内部继承了这个组件连上即用。 Sentinel是阿里巴巴开源的限流器熔断器,并且带有可视化操作界面。 在日常开发中,限流功能时常被使用,用…

Python UI自动化 —— pytest常用运行参数解析、pytest执行顺序解析

pytest常用Console参数: -v 用于显示每个测试函数的执行结果-q 只显示整体测试结果-s 用于显示测试函数中print()函数输出-x 在第一个错误或失败的测试中立即退出-m 只运行带有装饰器配置的测试用例-k 通过表达式运行指定的测试用例-h 帮助 首先来看什么参数都没加…

微信小程序实现文章内容详情

方案一、使用微信小程序官方提供的webview 前提已经在微信公众平台开发管理配置好了安全域名即: 方案二、把网页转成pdf直接展示 前提已经在微信公众平台开发管理配置好了安全域名即: 实现思路是发起网络请求拿到pdf下载地址,然后wx.download…

深度学习模型笔记

加载和保存模型参数 保存模型参数 net MLP() # 此处省略训练过程,在训练之后,保存模型参数 # 保存字典格式的模型参数,模型参数名 torch.save(net.state_dict(), mlp.params) 加载模型参数 clone MLP() # 加载模型参数 clone.load_state…

【C++】Map和Set -- 详解

一、关联式容器 在初阶阶段,我们已经接触过 STL 中的部分容器,比如:vector、list、deque、forward_list(C11)等,这些容器统称为 序列式容器 ,因为其底层为线性序列的数据结构,里面存…

计算机视觉实战项目3(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数等)

车辆跟踪及测距 该项目一个基于深度学习和目标跟踪算法的项目,主要用于实现视频中的目标检测和跟踪。该项目使用了 YOLOv5目标检测算法和 DeepSORT 目标跟踪算法,以及一些辅助工具和库,可以帮助用户快速地在本地或者云端上实现视频目标检测和…

双向电平电压转换器TXS0102DCTR应用电路设计

1、TXS0102简介 TXS0102DCTR是一个2位双向电压电平转换器,主要用途是与数据I/O(例如I2C或1-wire)上的开漏驱动器连接(其中数据是双向的且无可用的控制信号),在混合电压系统之间建立数字开关兼容性。它使用…

保存 uboot图像配置

一. 简介 本文学习如何保存经过图像配置,与加载 自己的配置文件。 之前几篇文章学习了:uboot 经过图形化配置 dns 命令功能。地址如下: uboot通过图像化界面配置 dns命令-CSDN博客 uboot通过图像化界面配置 dns命令验证-CSDN博客 二. 保…

【C++基础入门】42.C++中同名覆盖引发的问题

一、父子间的赋值兼容 子类对象可以当作父类对象使用&#xff08;兼容性) 子类对象可以直接赋值给父类对象子类对象可以直接赋值给父类对象父类指针可以直接指向子类对象父类引用可以直接引用子类对象 下面看一个子类对象兼容性的代码&#xff1a; #include <iostream>…

大模型在数据分析场景下的能力评测

“你们能对接国产大模型吗&#xff1f;” “开源的 LLaMA 能用吗&#xff0c;中文支持怎么样&#xff1f;” “私有化部署和在线服务哪个更合适&#xff1f;” 自 7 月 14 日发布 AI 数智助理 Kyligence Copilot 后&#xff0c;我们收到了很多类似上面的咨询&#xff0c;尤其…

如何处理单据保存/审核时提示:“更新即时库存时,基本单位数量与辅单位数量为一正一负,即时库存更新不成功

文章目录 如何处理单据保存/审核时提示:“更新即时库存时,基本单位数量与辅单位数量为一正一负,即时库存更新不成功问题描述前提问题分析&#xff1a;解决方案 如何处理单据保存/审核时提示:“更新即时库存时,基本单位数量与辅单位数量为一正一负,即时库存更新不成功 问题描述…