如果从事音频类驱动软件,需要准备哪些基础,一篇文章总结完。
从分离件来看,音频包括扬声器、麦克风和核心板三部分;所以驱动软件的核心就是保证外部器件和核心板的连接,硬件接口常见的就是I2S和I2C,主要围绕Codec硬件处理音频;音频软件驱动框架常见的是tinyALSA,最后介绍了tinyals的测试驱动调试方法。
0、基础概念
扬声器模组作为音频的输出,实现声音的播放;
麦克风模组作为音频的输入,提供声音的输入;
核心板作为中转,既接收外界输入的声音,并进行数码处理,然后把处理的结果在以模拟声音的形式播放出来,从而完成一次循环。其中关键的处理就需要软件驱动来支撑实现。
音频处理能力集成到核心板嵌入式设备中,可以实现音频解码、音效处理、混音、语音压缩传输等多种功能。
音频的基础参数:
(1)音量:音量响度由振幅和人离声源的距离决定,振幅越大响度越大,人和声源的距离越小,响度越大。
(2)音调:音调高低由频率决定,频率越高音调越高,单位是赫兹(Hz)。
人耳听觉范围大致在20Hz~20000Hz,20Hz以下为次声波,20000Hz以上为超声波。
(3)音色:音色是由波形决定,波形可以直观表现音色。波形不同,音色就不同。
主观评价音频好坏主要看什么?
(1)清晰度:能准确地传达声音的细节和层次,让人耳能够清晰地分出不同的声音元素。
(2)纯净度:纯净度高的音频信号听起来无杂音。
(3)动态范围:能表示声音层次和细节的丰富程度,音频信号中也是通过最大声音和最小声音之间的差值表示。
分析音频信号的工具:
波形图和频率图可以直观表示音频信号的质量。
波形图,表示音频信号的时间变化和强弱分布;频率图,则表示音频信号的频率成分和能量分布。
1、音频输出-扬声器和耳机
音频输出就是放音的过程,把存储媒介上的记录的信息重放出声音的过程。
音频输出集成了音频播放和耳机播放两种形式。
Android系统设备中调用音频播放功能的地方有两大类:
一类是系统声音:比如音乐、闹铃、通知铃音、来电声音、系统声音、打电话等;另一类是三方软件音频。
音频播放的原理
耳机的工作原理:通过音圈在磁场中的振动产生声音,从而实现电声转换。
扬声器(喇叭)的工作原理:当交流音频电流通过扬声器的线圈时,音圈中产生相应的磁场。这个磁场与扬声器上自带的永磁体产生的磁场相互作用,使线圈在永磁体的磁场中振动。由于扬声器的振膜和线圈是连在一起的,振膜也会随之振动,从而产生与原音频信号波形相同的声音。
音频输出时的数据流向分析
内核调用file_operations的write函数,执行copy_from_user函数将音频数据拷贝到DMA缓冲区。启动DMA将数据搬移到I2S/PCM TX FIFO,然后通过I2C/PCM传送到CODEC编码译码器,在CODEC内部进行音频路由,然后经过DA数模转换以及音频放大器,或者进行左右声道选择,最终从扬声器播放出来。
2、音频输入-麦克风
音频输入技术,包含两个过程:录音技术、语音识别技术。
录音技术是通过麦克风把声音信号转化成音频电信号,并记录在存储介质上的技术。
语音识别技术是通过处理器识别和理解,把音频信号转变成对应文本或者命令的技术。目前主流的语音识别技术理论基础都是基于统计的模式识别。
音频输入的基本原理:
对着麦克风讲话时,声波引起麦克风内部的薄膜震动,薄膜通常与线圈固定在一起,因此线圈也随之运动。线圈在麦克风内部的磁场中运动,线圈会就会产生感应电流。再经过一个放大器电路,把微弱的电信号放大。
音频输入时的数据流向分析
模拟电信号经过滤波等处理后,再经过模数转换,就变成了数字信号。数字信号就可以通过嵌入式设备的接口连接到CODEC编码译码器,最后使用DMA就可以通过I2S把数据搬用到主控制器中进行处理和传输。
3、数字音频硬件接口
耳机通常使用3.5mm的同轴音频插头:插头从端部到根部依次是左声道、右声道、地线。
音频收音模块通过麦克风把声音信号转换成电信号,然后连接CODEC(多媒体数字信号编解码器)芯片进行编解码,最后通过I2S接口把处理后的音频数据传输给核心处理器。通过I2S接口保证了人机交互中音频输入输出数据控制的实现。
I2S是因为音频数据传输而产生一种总线,一般会把I2S控制器制作到SOC里面。
I2S接口是通过一对一的方式,实现发送和接收数据,用于数字音频信号在系统内的传输。
I2S接口包括四类引脚:串行数据线SDATA、串行时钟线SCLK、帧时钟线LRCK和主时钟MCLK。
串行数据是用补码表示的音频数据,帧时钟用“1”表示正在传输数据的是左声道,用“0”表示右声道。
PCM(脉冲编码调制)在数字音频接口中实现了在传输音频数据时,增加了PCM采样的环节。与IIS接口相比,PCM应用更加广泛。
根据应用场景,在使用麦克风等单声道数据时常用PCM接口,而在双声道数据时经常使用IIS接口。
以RK3399为例,内部就集成了三个I2S控制器,使用I2S1用于连接音频CODEC RT5640芯片。
4、Codec硬件
CODEC作用:
Codec负责音频信号的模拟/数字转换(A/D和D/A转换),以及音频信号的编码和解码。
它是声卡的核心组件,音频的播放和收音都要经过音频CODEC实现转换,决定了音频信号的质量和处理能力。
嵌入式音频处理技术通过使用专门设计的音频编解码器,确保了音频数据的实时传输和高质量呈现。
CODEC芯片的选择,决定了模拟音频输入输出质量的好坏,在音频加速器模块中,决定数字信号质量的好坏。
编解码芯片可以集成到片内,也可以在外部使用独立芯片。
以音频芯片CODEC ALC5640为例,ALC5640芯片使用i2c1接口的控制总线,数据传输通过i2s0接口。
耳机音频数据输出通过HPOUTL/HPOUTR引脚;
MIC(麦克风)音频输入,通过MIC_INP引脚;
SPK(扬声器)音频数据输出,通过四通道的SPK_L/SPK_R引脚。
5、音频驱动框架tinyALSA
音频声卡驱动程序是操作系统与声卡硬件之间的桥梁。它负责将操作系统的音频指令转换为声卡可以理解的信号,并将声卡的音频信号转换为操作系统可以处理的格式。
ALSA(Advanced Linux Sound Architecture)是Linux和android下的音频驱动架构,提供了一组内核驱动程序模块,并专门为简化应用程序的编写提供了相应的函数库。
架构特点:音频硬件接口丰富,接口统一,音频驱动容易编写,还支持一些录制、播放、混音等功能。
ASoC(ALSA System on Chip)是ALSA在嵌入式设备上的扩展,ASoC将音频系统进行模块化管理分为Machine、Platform和Codec三部分。
架构特点:针对嵌入式的音频驱动方案,可移植性好。
Linux 4.4的内核支持两种方式的音频声卡创建架构,一种是传统的machine driver,另一种是通用的 simple-card framework架构,架构代码目录是/kernel/sound/soc/generic/。
ALSA在内核驱动层实现了alsa-driver,在应用层实现了tinyalsa或者alsa-lib。
ALSA驱动包含ALSA核心层和音频硬件设备驱动,ALSA 核心层向上提供逻辑设备系统调用,向下驱动硬件设备。
通过使用ALSA架构,不仅隐藏了驱动层的实现细节,也简化了应用程序开发的难度。
Machine指本款机器的硬件,Platform指CPU端的DMA驱动,负责DMA数据传输,Codec是音频编解码驱动。
CPU DAI是CPU端I2s/Pcm音频接口驱动,完成CPU端音频接口的初始化。
Codec DAI则是Codec端I2s/Pcm音频接口驱动,完成Codec端音频接口的初始化。
ALSA的架构框架图如下。
以Android 7.1版本为例,使用的是tinyalsa作为ALSA内核的用户层音频接口,tinyalsa源码位于android源码目录的/external/tinyalsa/目录下,编译之后在设备的/system/bin/目录下会包含音频调试工具tinymix、tinyplay、tinycap等。
在人机交互控制终端上通过以下命令可以查看调试声卡,操作如下图所示:
6、驱动调试
语音交互设备调试常用用例如下:
ls /sys/kernel/debug/regmap/0-001c //查看i2c下寄存器的状态是否正常 |
---|
cat /proc/asound/cards //查看声卡状态 |
在音频调试中,可以移植测试程序到Android的/external/tinyalsa/目录,从而生成测试工具tinyplay、tinycap、tinymix。
Tinyplay用于Linux内核层实现语音播放,Tinycap用于Linux内核层实现录音测试。
【森哥谈成像技术】最近看到陆续写作有一些起色,除了把一些零碎的笔记内容整理好,把排版也好好搞起来。您点赞和支持,就是继续优化的动力。