音频模块的介绍

一、术语总结

1.HIFI 级
  “HIFI”一词通常指高保真音频(High-Fidelity Audio),是指尽可能保持音频信号的原始质量,让听众感受到最真实的音乐表现。因此,“HIFI级”通常指具有高保真音频性能的产品或设备,例如高保真耳机、音响设备、音频处理器等。

  在智能音箱、智能音响等智能家居设备中,也经常使用“HIFI级”来形容其音频性能。这些设备通常具有高质量的音频解码器、音频放大器、高保真扬声器等音频元件,能够提供更加真实、清晰、细腻的音乐表现,带给用户更好的听觉体验。

2.支持最高 192K 24BIT 的音频播放
  “支持最高 192K 24BIT 的音频播放”通常指音频设备或软件可以播放采样率为192kHz、位深度为24 bit的音频文件或流。其中,“采样率”指音频信号每秒钟采样的次数,即采样频率,常用的采样率包括44.1kHz、48kHz、96kHz、192kHz等;而“位深度”指每个采样点的量化位数,即采样精度,常用的位深度包括16 bit、24 bit、32 bit等。

3.立体声的声道数
  立体声是一种常见的声音录制和播放方式,使用两个声道来传递左右声道的声音信号。因此,立体声的声道数为2,分别对应左声道和右声道。

  在音频处理中,立体声可以提供更加真实、立体的音效体验,使得听众可以感受到更加逼真的音乐表现。同时,立体声也可以用于区分不同声源的位置和方向,例如在影视制作中,可以通过立体声的录制和处理,来实现对话、环境声、音效等音频元素的区分和定位,从而提升影视作品的视听体验。

  需要注意的是,在处理立体声音频时,需要对左声道和右声道进行相应的处理和调整,以保证两个声道之间的平衡和协调。同时,在播放立体声音频时,也需要使用支持立体声播放的设备和软件,以获得最佳的音频效果。

4.我们播放的音频支持:16 位和 24 位,立体声,所以每个取样为 4/6 个字节,低字节在前,高字节在后。
  在音频处理中,采样深度表示每个采样点的量化位数,采样深度越高,表示每个采样点可以表达的音频细节和动态范围也越大,因此音频质量也可以更高。立体声表示音频信号采用了两个声道进行录制或播放,通常用于模拟现实场景中的立体声效果。

  每个取样数据占用4/6个字节,这是由于16位采样深度的音频每个采样点占用2个字节,而24位采样深度的音频每个采样点占用3个字节,因此每个立体声采样点占用的字节数为4或6个字节。在存储这些采样点时,采用小端序的方式将低字节存储在前面,高字节存储在后面,以保证音频数据的正确解析和播放。

5.立体声差分输入
  立体声差分输入是指在音频电路中采用差分信号传输方式,通过两个信号线分别传输左右声道的差分信号,从而实现立体声的音频输入。

  在差分信号传输中,每个信号线传输的是相对于共同参考点的电压差值,而不是单独的信号电压值。在立体声差分输入中,左声道和右声道的差分信号分别通过两个信号线传输,其中一个信号线传输左声道信号与参考点之间的电压差值,另一个信号线则传输右声道信号与参考点之间的电压差值。通过解码差分信号,可以还原出左声道和右声道的原始音频信号。

  相对于单端输入,立体声差分输入可以提供更好的抗干扰能力和信噪比,从而提高音频输入的质量和稳定性。同时,立体声差分输入也可以用于一些专业音频设备和高保真音响系统中,以提供更加真实、立体的音效体验。

  需要注意的是,在使用立体声差分输入时,需要使用支持差分输入的音频设备,并正确连接差分输入的信号线和参考点。同时,在处理和解码差分信号时,也需要使用相应的差分信号处理电路,以保证音频输入的正确性和质量。

6.MSB和LSB
  MSB是英文“Most Significant Bit”的缩写,意为“最高有效位”。在数字电路和计算机科学中,MSB通常用于描述二进制数中的最高位(即最左侧的位),它的权值是二进制数中最大的,因此也被称为“最高位”。LSB是英文“Least Significant Bit”的缩写,意为“最低有效位”。在数字电路和计算机科学中,LSB通常用于描述二进制数中的最低位(即最右侧的位),它的权值是二进制数中最小的,因此也被称为“最低位”。

  在数字信号处理中,MSB也常用于描述数据的精度。例如,一个16位的数字信号,它的最高有效位表示信号的符号位,而其余的15位表示信号的幅值,因此可以表示的最大绝对值为2的15次方。LSB也常用于描述数据的精度。例如,一个16位的数字信号,它的最低有效位表示信号的最小单位,其余的15位表示信号的幅值,因此可以表示的最小绝对值为2的负15次方。

  需要注意的是,在计算机和数字信号处理中,MSB和LSB的顺序取决于采用的字节顺序(Endianness)和位顺序(Bit ordering),在不同的系统和协议中可能存在不同的表示方式。

7.DMA传输
  DMA是“直接内存访问”的缩写,是一种高效的数据传输方式,可用于将数据从设备(如硬盘驱动器)传输到内存中,或将数据从内存传输到设备中,而无需CPU的干预。这种数据传输方式比使用CPU进行传输更快,因为DMA可以减少CPU的负载,让CPU有更多的时间来处理其他任务。

  在DMA传输中,DMA控制器会接管CPU的控制,它决定了数据的传输方式、传输的数据量以及数据的传输方向。CPU只需要设置DMA控制器的寄存器来指定数据传输的参数,然后就可以让DMA控制器自动完成数据传输。这种传输方式可以减少CPU的干预,从而提高系统的性能和效率。

  总之,DMA是一种高效的数据传输方式,可以减少CPU的干预,提高系统的性能和效率。它在许多设备和系统中被广泛使用,包括硬盘驱动器、网络接口卡、音频和视频设备等。

二、WAV 简介

  WAV 即 WAVE 文件,WAV 是计算机领域最常用的数字化声音文件格式之一,它是微软专门为 Windows 系统定义的波形文件格式(Waveform Audio),由于其扩展名为"*.wav"。它符合RIFF(Resource Interchange File Format)文件规范,用于保存 Windows 平台的音频信息资源,被Windows 平台及其应用程序所广泛支持,该格式也支持 MSADPCM,CCITT A LAW 等多种压缩运算法,支持多种音频数字,取样频率和声道,标准格式化的 WAV 文件和 CD 格式一样,也是 44.1K 的取样频率,16 位量化数字,因此在声音文件质量和 CD 相差无几!

  WAV 一般采用线性 PCM(脉冲编码调制)编码。WAV 文件是由若干个 Chunk 组成的。按照在文件中的出现位置包括:RIFF WAVE Chunk、Format Chunk、 Fact Chunk(可选)和 Data Chunk。每个 Chunk 由块标识符、数据大小和数据三部分组成,如下图所示:
在这里插入图片描述
  对于一个基本的 WAVE 文件而言,以下三种 Chunk 是必不可少的:文件中第一个 Chunk 是RIFF Chunk,然后是 FMT Chunk,最后是 Data Chunk。对于其他的 Chunk,顺序没有严格的限制。使用 WAVE 文件的应用程序必须具有读取以上三种 chunk 信息的能力,如果程序想要复制WAVE 文件,必须拷贝文件中所有的 chunk。

PCM只包含 3 个 Chunk,我们看一下它的文件构成,如图 55.1.2。
在这里插入图片描述
  不同的 Chunk 有不同的长度,编码文件时,按照 Chunk 的字节和位序排列好之后写入文件头,加上 wav 的后缀,就可以生成一个能被正确解析的 wav 文件了,对于 PCM 结构,我们只需要把获取到的音频数据填充到 Data Chunk 中即可。

  首先,我们来看看 RIFF 块(RIFF WAVE Chunk),该块以“RIFF”作为标示,紧跟 wav 文件大小(该大小是 wav 文件的总大小-8),然后数据段为“WAVE”,表示是 wav 文件。RIFF 块的 Chunk 结构如下:

typedef __PACKED_STRUCT
{
 uint32_t ChunkID; /* chunk id;这里固定为"RIFF",即 0X46464952 */
 uint32_t ChunkSize ; /* 集合大小;文件总大小-8 */
 uint32_t Format; /* 格式;WAVE,即 0X45564157 */
}ChunkRIFF; /* RIFF 块 */

  接着,我们看看 Format 块(Format Chunk),该块以“fmt”作为标示(注意有个空格!),一般情况下,该段的大小为 16 个字节,但是有些软件生成的 wav 格式,该部分可能有 18 个字节,含有 2 个字节的附加信息。Format 块的 Chunk 结构如下:

typedef __PACKED_STRUCT
{
 uint32_t ChunkID; /* chunk id;这里固定为"fmt ",即 0X20746D66 */
 uint32_t ChunkSize ; /* 子集合大小(不包括 ID 和 Size);这里为:20. */
 uint16_t AudioFormat; /* 音频格式;0X01,表示线性 PCM;0X11 表示 IMA ADPCM */
 uint16_t NumOfChannels; /* 通道数量;1,表示单声道;2,表示双声道; */
 uint32_t SampleRate; /* 采样率;0X1F40,表示 8Khz */
 uint32_t ByteRate; /* /字节速率; */
 uint16_t BlockAlign; /* 块对齐(字节); */
  uint16_t BitsPerSample; /* 单个采样数据大小;4 位 ADPCM,设置为 4 */
// uint16_t ByteExtraData; /* 附加的数据字节;2 个; 线性 PCM,没有这个参数 */
}ChunkFMT; /* fmt 块 */

  接下来,我们再看看 Fact 块(Fact Chunk),该块为可选块,以“fact”作为标示,不是每个 WAV 文件都有,在非 PCM 格式的文件中,一般会在Format 结构后面加入一个 Fact 块,该块 Chunk 结构如下:

typedef __PACKED_STRUCT 
{
 uint32_t ChunkID; /* chunk id;这里固定为"fact",即 0X74636166; */
 uint32_t ChunkSize; /* 子集合大小(不包括 ID 和 Size);这里为:4. */
 uint32_t NumOfSamples; /* 采样的数量; */
}ChunkFACT; /* fact 块 */

  DataFactSize 是这个 Chunk 中最重要的数据,如果这是某种压缩格式的声音文件,那么从这里就可以知道他解压缩后的大小。对于解压时的计算会有很大的好处!

  最后,我们来看看数据块(Data Chunk),该块是真正保存 wav 数据的地方,以“data”作为该 Chunk 的标示,然后是数据的大小。数据块的 Chunk 结构如下:

typedef __PACKED_STRUCT
{
 uint32_t ChunkID; /* chunk id;这里固定为"data",即 0X5453494C */
 uint32_t ChunkSize ; /* 子集合大小(不包括 ID 和 Size) */
}ChunkDATA; /* data 块 */

  ChunkSize 后紧接着就是 wav 数据。根据 Format Chunk 中的声道数以及采样 bit 数,wav 数据的 bit 位置可以分成如表 55.1.1.1 所示的几种形式:
在这里插入图片描述

三、知识总结

1.SAI主从模式
  工作在主模式的 SAI子模块循环发送数据 0X0000,给 ES8388,以产生 LRCK、SCLK 和 MCLK 等信号,工作在从模式的 SAI 子模块,则接收来自 ES8388 的 ADC 数据(ASDOUT),并保存到 TF 卡,实现录音。

四、代码分析

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值