摘要
这篇文章简单记录了我对音频技术开发调研的一些过程和收获,包括音频开发涉及的哪些知识。
更新记录
- 2024-04-12 增加了嵌入式开发的一些基础知识,第三章的基础知识
- 2024-04-16 增加嵌入式学习的资料介绍和我最初对音频驱动开发感兴趣的场景
- 2024-04-17 介绍了树莓派,声卡等硬件东西,介绍了智能芯片
第一章 向大模型和搜索引擎请教
什么是音频驱动开发
如果我问清华大模型,什么是音频驱动开发,它告诉我如下:
音频驱动开发是指为硬件设备编写软件驱动程序,以便操作系统能够与音频硬件设备通信并控制它。这通常涉及到低级别的硬件接口和操作系统内核的深入理解。音频驱动开发可能包括以下几个方面:
-
了解音频硬件:
- 音频接口(如I2S、PCM、AC'97等)
- 编解码器(如DAC和ADC)
- 音频处理芯片(如DSP)
- 硬件特性(如采样率、位深度、通道数等)
-
熟悉操作系统和内核:
- Linux内核的音频子系统(如ALSA、OSS)
- Windows的音频驱动模型(如WDM、KMDF)
- 其他操作系统(如macOS、Android)的音频驱动架构
-
编写内核级代码:
- 使用C语言编写内核模块
- 管理硬件资源(如中断、I/O端口、内存)
- 实现内核API和回调函数
-
实现音频协议和接口:
- 实现音频数据传输协议(如I2S、USB Audio等)
- 实现控制接口(如MIDI、GPIO等)
-
调试和测试:
- 使用调试工具(如JTAG、内核调试器)
- 编写单元测试和集成测试
- 性能优化和稳定性测试
-
遵守开发规范和标准:
- 遵守硬件和软件的标准(如USB Audio、PCIe等)
- 遵守安全和质量标准(如FCC、CE等)
-
文档和用户手册:
- 编写技术文档和用户手册
- 提供API文档和示例代码
-
社区和协作:
- 参与开源社区(如Linux内核邮件列表)
- 与硬件和软件团队合作 音频驱动开发的工具和资源可能包括:
-
开发工具:
- 集成开发环境(IDE) :如Visual Studio、Eclipse等。
- 代码版本控制系统:如Git、SVN等。
- 硬件调试器:如JTAG、逻辑分析仪等。
- 操作系统文档:如Linux内核文档、Windows Driver Kit(WDK)等。
- 音频硬件数据手册:提供硬件规格和编程接口。 由于音频驱动开发通常涉及到硬件和操作系统的底层细节,因此它需要深入的专业知识和经验。如果你是初学者,建议从学习操作系统原理、硬件接口和C语言编程开始。随着时间的推移,你可以通过实际项目和实践来提高你的技能。
然后我接着问有哪些有趣的初学者项目?
大模型就开始胡说八道了。具体露馅是我追问其中一个项目的源代码地址是哪里?它说不上来,并且解释了自己是在胡说。所以,再插一句话, 目前大模型并不真的懂知识,只是善于生成流畅的文本而已。
随后它在最后一个回答下面给了几个提示问题,其中一个是 ”我可以在哪些平台上进行音频驱动开发?“
答案是: 音频驱动开发通常是在操作系统的内核级别进行的,因此你需要具备相应的开发环境和工具。以下是一些常见的平台,在这些平台上你可以进行音频驱动开发:
-
Linux:
- Linux内核是开源的,提供了丰富的音频子系统,如ALSA(Advanced Linux Sound Architecture)。
- 你可以在多种Linux发行版上进行开发,如Ubuntu、Fedora、CentOS等。
- 你可以从Linux内核源代码树中获取ALSA和其他音频相关模块的源代码,并在此基础上进行开发。
-
Windows:
- Windows操作系统提供了WDM(Windows Driver Model)和KMDF(Kernel Mode Driver Framework)等驱动开发框架。
- 你需要安装Windows Driver Kit(WDK)和相应的开发工具,如Visual Studio。
- 你可以为Windows开发音频驱动,支持各种硬件和音频接口。
-
macOS:
- macOS的音频子系统是基于Core Audio的,它提供了丰富的API和框架。
- 你需要使用Xcode和相应的开发工具来开发macOS的音频驱动。
- 你可以为macOS开发音频驱动,支持各种硬件和音频接口。
-
Android:
- Android操作系统是基于Linux内核的,它有自己的音频子系统。
- 你需要使用Android Studio和相应的开发工具来开发Android的音频驱动。
- 你可以为Android开发音频驱动,支持各种硬件和音频接口。
-
iOS:
- iOS是苹果公司开发的操作系统,它也有自己的音频子系统。
- 你需要使用Xcode和相应的开发工具来开发iOS的音频驱动。
- 你可以为iOS开发音频驱动,支持各种硬件和音频接口。
-
嵌入式系统:
- 对于嵌入式系统,如Arduino、Raspberry Pi等,你可能需要直接操作硬件。
- 你可以使用相应的开发环境,如Arduino IDE或Raspberry Pi的命令行工具,来开发音频驱动。 音频驱动开发通常需要深入了解操作系统内核、硬件接口和音频协议。在开始开发之前,建议你先学习相关的操作系统原理、硬件接口知识和编程语言(如C或C++)。此外,参与开源项目、阅读相关的文档和论坛,以及与经验丰富的开发者交流,都是提高音频驱动开发技能的好方法。
关于上面的东西,我觉得有待鉴定,但是可以作为一个基础的东西来参考。
我之前还在知乎上看了一篇帖子,[参考1.1], 音频驱动开发的工作内容,这篇帖子给出了回答。音频驱动开发工程师的工作就是:
1 音频技术知识
2 数学和信号处理,
3 音频编码技术和解码技术,音频标准。
关于声音的畅想
我喜欢研究声音,有一个东西很吸引我的眼球,就是如何使用程序识别人类的声音,把声音变成指令。
经常看一些视频,可以进行音色替换,英译中等操作,我觉得这些都很有意思。
现在有很多语音助手,比如Siri, 天猫精灵,小爱同学等,比如各种汽车上搭载的语音助手。
相关工作
在参考[1.2]中,慕课网上架了一个288人民币的教程,我想花钱省时间,但是我有感觉,历来这种课程都像割韭菜。
参考
[1.1] 建议做音频开发工程师吗?超干货 - 知乎 (zhihu.com)
[1.2] 音视频基础知识+音视频开发入门-慕课网实战 (imooc.com)
第二章 Github寻宝
大模型上和搜索引擎上逛了一圈,没有什么收货。
B站上看了一个视频,里面有人讲到一本书,提到了一本书 linux device driver。
然而,在Github上找到一个教程[2.1], 感觉写的比较有意思。
音频技术概念
在 信噪比(Signal-to-noise ratio,SNR,S/N,讯噪比),指信号与噪声的比例,用于比较所需信号的强度与背景噪声的强度,以分贝(dB)为单位。
什么是噪音?这个东西是比较模糊的。上面这句话没有很好的讲清楚[2.3]。
声音上的基础概念[2.6], 包括频率,振幅,音色等。
ffmpeg
FFmpeg是一个开源的多媒体处理工具集,它包括了一系列的命令行工具和库,用于音频和视频的编解码、格式转换、流处理和录制等。FFmpeg的名称是“Fast Forward Mpeg”的缩写,但随着时间的推移,它的功能已经远远超出了最初的范围。 FFmpeg的主要特点包括:
- 多平台支持:FFmpeg可以在多个操作系统上运行,包括Linux、Windows、macOS等。
- 广泛的支持:FFmpeg支持多种音频和视频格式,包括MP3、AAC、AVI、MP4、FLV、MPEG、WAV、OGG等。
- 编解码器支持:FFmpeg集成了多种编解码器,可以用于压缩和解压缩音频和视频数据。
- 网络流媒体支持:FFmpeg支持多种网络流媒体协议,如RTMP、HLS、DASH等。
- 音频和视频处理:FFmpeg可以用于音频和视频的裁剪、合并、重采样、滤波等操作。
- 屏幕录制和摄像头捕捉:FFmpeg可以用于录制屏幕活动或从摄像头捕捉视频。
- 音频和视频传输:FFmpeg可以用于将音频和视频数据传输到不同的设备和网络。 FFmpeg是一个强大的工具,广泛应用于媒体处理、视频编辑、直播流媒体、自动化工作流程等领域。它可以通过命令行界面使用,也可以通过编程接口(如libavformat、libavcodec等)集成到其他应用程序中。
MPEG是一个组织,同时也是一系列数字音频和视频压缩技术的统称。
-
MPEG组织: MPEG是一个国际标准化组织,其全称为Moving Picture Experts Group。这个组织负责制定数字音频和视频编码的标准,以确保数字媒体内容的压缩、传输和播放。MPEG标准通常以MPEG-1、MPEG-2、MPEG-4等命名,每个标准都定义了不同的压缩算法和传输协议。
-
MPEG技术: MPEG技术是指由MPEG组织制定的一系列数字音频和视频压缩技术。这些技术包括:
- MPEG-1:定义了视频和音频的压缩标准,主要用于VCD(Video CD)和CD-i(Compact Disc Interactive)。
- MPEG-2:主要用于数字电视(DVB)、DVD和数字卫星电视广播。
- MPEG-4:定义了多媒体应用和服务的框架,包括音频、视频和流媒体等。
- MPEG-21:是一个框架,旨在实现数字内容在全球范围内的无缝使用。
- MPEG-4 AVC(H.264):是一种视频压缩标准,用于高清视频的传输和存储。
- MPEG-H HEVC(H.265):是MPEG-4 AVC的后续标准,提供更高的压缩效率和更低的比特率。 MPEG技术在现代数字媒体领域中扮演着至关重要的角色,广泛应用于视频会议、在线视频、移动通信和数字广播等领域。
相关工作
在[2.1]中,CoderMJLee写了一个教程,并且指向了一个系列的教程[2.2]博客,虽然[2.1]和[2.2]中,博客已经停更了,但是最开始的部分还是比较有用的,同时我们也需要知道,很多人只能陪你走一段路。
在[2.3]中,介绍了PCM的资料,Pulse Code Modulation,具体讲述了PCM方案是怎么表达声音的,包括采样,量化,编码的三个步骤,也介绍了编码和解码的大致设计内容,有损和无损的概念,常见的编码格式和对应的文件格式。本文作为一个介绍性的文章,比较形象生动,并且在PCM部分生动的介绍了其原理,能够很好的帮助初学者理解声音表达的基本方法。
[2.4]介绍了ffmpeg3个命令行工具 ffmpeg编解码、ffprobe查看文件信息、ffplay播放命令 ,以及使用ffmpeg命令进行录音的简单时间。,编程录音的基本流程。
[2.5]介绍了如何编写程序进行录音的过程,文中呈现了一部分代码。
参考
[2.1] CoderMJLee/audio-video-dev-tutorial: 简单易懂的音视频开发教程 (github.com)
[2.2] 秒懂音视频开发 - 随笔分类(第2页) - M了个J - 博客园 (cnblogs.com)
[2.3] 【秒懂音视频开发】03_重识音频 - M了个J - 博客园 (cnblogs.com)
[2.4] 【秒懂音视频开发】07音频录制01命令行 - M了个J - 博客园 (cnblogs.com)
[2.5] 【秒懂音视频开发】08音频录制02编程 - M了个J - 博客园 (cnblogs.com)
[2.6] 【秒懂音视频开发】02_重识声音 - M了个J - 博客园 (cnblogs.com)
第三章 科普
最近在读朋友的一篇博客[3.1],sys 下设备模型相关目录结构和其在代码中的对应 - 知乎 (zhihu.com),里面有很多东西可以值得科普一下。
SPI
SPI,serial peripheral interface, 序列化周边接口。
在嵌入式系统中,SPI(Serial Peripheral Interface)是一种常用的通信协议,用于在微控制器和外围设备之间进行数据交换。SPI是一种高速的、全双工的、同步的通信协议,通常用于短距离通信。
SPI接口使用四根信号线:
- SCLK(Serial Clock):串行时钟线,由主设备(通常是微控制器)提供,用于同步数据传输。
- MOSI(Master Out Slave In):主设备输出/从设备输入线,数据由主设备发送到从设备。
- MISO(Master In Slave Out):主设备输入/从设备输出线,数据由从设备发送到主设备。
- SS/CS(Slave Select/Chip Select):从设备选择线,由主设备控制,用于选择要通信的从设备。在多个从设备的情况下,每个从设备都有一个独立的SS线。
SPI通信通常由主设备控制,主设备通过提供时钟信号来控制数据的传输速率。在数据传输过程中,数据是一位一位地传送的,通常是在SCLK的上升沿或下降沿进行数据的采样和移位。
SPI协议由于其简单性和高速性,在嵌入式系统中被广泛应用于各种场合,比如与传感器、闪存、显示屏、ADC/DAC等外围设备进行通信。
所谓的铁三角
在Linux操作系统中,"bus device driver铁三角"是指Linux内核中用于管理硬件设备的三个核心组件:bus driver(总线驱动)、device driver(设备驱动)和kernel(内核)。这个概念体现了Linux设备模型的基本结构,确保了硬件设备的有效管理和操作。
- Bus Driver(总线驱动) :总线驱动负责管理连接到特定总线类型(如PCI、USB、I2C、SPI等)的所有设备。它处理设备枚举、设备电源管理、设备插拔事件、地址分配等任务。总线驱动还负责在设备和对应的设备驱动之间建立通信。
- Device Driver(设备驱动) :设备驱动是为特定硬件设备实现的一个软件模块,它提供了与设备交互的接口。设备驱动负责实现操作硬件所需的具体功能,如发送和接收数据、配置设备参数、处理设备中断等。每个设备通常都需要一个对应的设备驱动。
- Kernel(内核) :Linux内核是操作系统的核心,它提供了设备驱动和总线驱动运行的环境。内核负责管理系统的资源,如内存、CPU、中断等,并提供了一组API和服务,使得设备驱动和总线驱动能够正常工作。内核还负责调度和同步对硬件的访问。
这三个组件共同构成了Linux内核中的硬件设备管理框架。当硬件设备连接到系统时,总线驱动识别并枚举设备,内核为设备分配资源,并为设备查找或加载合适的设备驱动。设备驱动一旦加载,就可以与硬件设备进行交互,提供用户空间应用程序与硬件之间的接口。这个模型确保了Linux系统可以灵活地支持各种硬件设备,而无需对内核进行修改。
probe阶段
在嵌入式领域,尤其是在使用Linux操作系统的嵌入式系统中,"probe"阶段通常指的是设备驱动加载过程中的一个步骤。在这个阶段,设备驱动会尝试探测(probe)它所负责的硬件设备是否存在,并初始化必要的硬件资源和软件状态,以便能够正确地与硬件设备进行通信。 probe阶段的主要任务包括:
- 设备检测:驱动程序会检查指定的硬件设备是否真的存在,并确认其兼容性。
- 资源分配:驱动程序会为设备分配所需的资源,如内存、I/O端口、中断等。
- 硬件初始化:驱动程序可能会对硬件设备进行一些基本的配置,以确保其处于一个已知的状态。
- 数据结构设置:驱动程序会设置内部数据结构,用于管理设备和驱动程序的交互。
- 注册设备:驱动程序可能会在内核中注册一个新的设备,这样用户空间的程序就可以与设备进行交互。 在Linux内核中,设备驱动通常会实现一个
probe函数,当驱动与相应的硬件设备匹配时,内核会调用这个函数。如果probe成功,设备就可以使用了;如果probe失败,驱动可能会卸载或者报告错误。 下面是一个简化的设备驱动probe函数的示例:
static int device_probe(struct device *dev)
{
// 检查设备是否兼容
if (!dev->of_node || !of_device_is_compatible(dev->of_node, "vendor,device"))
return -ENODEV;
// 分配和初始化资源
// ...
// 初始化硬件
// ...
// 设置内部数据结构
// ...
// 注册设备
// ...
return 0; // 成功
}
在probe阶段,驱动程序会尽可能早地检测和报告任何可能的问题,确保设备能够正确地集成到系统中。
sys目录简介
在Linux操作系统中,/sys目录是一个虚拟文件系统,它提供了内核的运行时状态信息,包括设备树、驱动参数、系统总线和其他内核对象的详细信息。这个目录是通过sysfs实现的,sysfs是Linux内核中的一个组件,它将内核数据结构暴露给用户空间,使得用户可以通过标准的文件系统接口来访问这些信息。 /sys目录的结构大致如下:
- /sys/devices:这个目录包含了系统中的所有设备,按照设备树的结构组织。每个设备都有一个对应的子目录,包含了关于该设备的属性和链接。
- /sys/bus:这个目录包含了系统中所有总线类型(如pci、usb、i2c、spi等),每个总线类型都有自己的子目录,包含了与该总线相关的设备和驱动信息。
- /sys/class:这个目录按照设备的功能分类组织设备,如net(网络设备)、block(块设备)、graphics(图形设备)等。
- /sys/fs:这个目录包含了文件系统相关的信息,如挂载的文件系统、文件系统的类型和配置等。
- /sys/kernel:这个目录提供了内核的配置参数和状态信息,如模块加载情况、调度器设置、系统限制等。
- /sys/module:这个目录包含了系统中加载的内核模块的信息,每个模块都有自己的子目录,包含了模块的参数、依赖关系和状态等。
- /sys/power:这个目录提供了系统电源管理的接口,如休眠状态、电源状态等。
- /sys/devices/system:这个目录包含了系统范围内的设备,如cpu、memory、firmware等。
- /sys/dev:这个目录包含了按照字符设备和块设备的主次设备号组织的设备符号链接。
- /sys/kernel/mm:这个目录包含了内存管理的信息,如内存节点、交换空间等。
- /sys/kernel/mm/hugepages:这个目录包含了关于巨页(huge pages)的配置和状态信息。 这些目录和文件提供了对内核状态的只读访问,但某些文件也可以被写入,以改变内核的配置或控制某些操作。例如,可以通过写入
/sys/class/backlight/acpi_video0/brightness文件来改变屏幕的亮度。/sys目录是Linux系统管理和调试的宝贵资源,它允许管理员和开发者查看和操作系统的内部状态,而无需直接与内核代码交互。
c语言的内核宏
看到一段代码, 对其中一个关键字不太理解,就是 __init
// drivers/base/init.c
void __init driver_init(void) {
/* These are the core pieces */
devtmpfs_init();
/* 详见 sys/devices */
devices_init();
/* 详见 sys/bus */
buses_init();
/* 详见 sys/class */
classes_init();
firmware_init();
hypervisor_init();
/* These are also core pieces, but must come after the
* core core pieces.
*/
/* 详见 sys/bus/platform */
platform_bus_init();
system_bus_init();
cpu_dev_init();
memory_dev_init();
}
在Linux内核的C语言代码中,__init是一个特殊的宏,它用于标记一个函数或变量仅在初始化阶段使用。当内核启动时,会调用标记为 __init的函数来执行初始化任务,一旦初始化完成,这些函数就不再需要了,因为它们不会被再次调用。 使用 __init宏的好处是,在内核初始化完成后,这些初始化函数占用的内存可以被释放,从而节省资源。在内核编译时,__init函数会被放到一个特殊的段(.init.text段)中,这个段在初始化完成后会被释放。 __init宏的定义通常位于内核的头文件中,例如 include/linux/init.h。它确保了标记的函数在链接时被正确地放置在初始化段中。 例如:
#include <linux/init.h>
#include <linux/module.h>
void __init driver_init(void)
{
// 初始化代码
}
module_init(driver_init);
在上面的例子中,driver_init函数被标记为 __init,这意味着它将在内核初始化阶段被调用,并且在初始化完成后,它的内存可以被回收。module_init(driver_init);这行代码告诉内核,在加载模块时调用 driver_init函数进行初始化。 类似的,还有其他用于标记不同阶段的宏,如 __exit用于标记在模块卸载时调用的函数,__initdata用于标记仅在初始化阶段使用的数据等。
/sys/bus/platform
在Linux操作系统的 /sys文件系统中,/sys/bus/platform目录提供了与平台设备总线相关的信息。平台总线是一种特殊的总线类型,它用于连接那些不直接属于标准总线类型(如PCI、USB、I2C、SPI等)的设备。这些设备通常是在主板上的直接连接,如南桥芯片组管理的设备,或者是在某些嵌入式系统中的定制硬件。 /sys/bus/platform目录下的结构和内容通常包括:
- 设备目录:每个连接到平台总线的设备都有一个对应的目录,这些目录通常以设备的名称命名。在这些设备目录中,你可以找到与设备相关的属性文件,如设备属性、电源管理信息、状态等。
- 设备驱动:平台设备的驱动通常会在这个目录下有对应的子目录,这些子目录包含了驱动的属性和链接。
- 属性文件:这些文件提供了设备的各种属性信息,如设备的中断、电源状态、资源使用情况等。
- uevent文件:这个文件包含了设备的事件信息,当设备的状态发生变化时,内核会产生相应的事件,这些事件可以通过
uevent文件来查询。 - 设备链接触发器:在某些情况下,设备可能会通过平台总线来触发其他总线的设备链接触发器(device tree triggers),这通常用于初始化和配置硬件。 平台设备通常在内核启动的早期阶段被枚举和配置,它们可能是系统启动过程中最先被识别和初始化的设备之一。
/sys/bus/platform目录允许系统管理员和开发者查看和操作这些设备,以及它们的驱动程序。 例如,你可能会在/sys/bus/platform目录下看到如下内容:
/sys/bus/platform/
├── devices
│ ├── platform
│ │ ├── 3f205011.pcie
│ │ ├── 3f205012.pcie
│ │ ├── 3f205013.pcie
│ │ ├── 3f804000.i2c
│ │ ├── 3f804000.i2c2
│ │ ├── 3f804000.spi
│ │ ├── 3f804000.spi2
│ │ ├── 3f804000.uart
│ │ ├── 3f804000.uart2
│ │ ├── 3f804000.uart3
│ │ ├── 3f804000.uart4
│ │ └── 3f804000.watchdog
│ └── platform
└── drivers
├── leds-gpio
├── m25p80
├── mmcblk
├── mmcbl
声卡和声音芯片
声卡(Sound Card)和声音芯片(Audio Chip)不是完全相同的概念,但它们在功能上是相关的,并且有时候会被用来指代相同类型的硬件。下面是它们的定义和区别:
声卡(Sound Card):
- 声卡通常是指一块插在计算机主板扩展槽(如PCIe、PCI或USB接口)中的独立硬件板卡。
- 它提供了音频输入输出的功能,包括模拟到数字(ADC)和数字到模拟(DAC)的转换能力。
- 声卡通常具备更多的音频处理功能,如支持多声道输出、内置音效处理、硬件加速的音频混音等。
- 它们可以提供比主板集成音频解决方案更高质量的音频性能,适用于专业音频制作、游戏和多媒体应用。
声音芯片(Audio Chip):
- 声音芯片是一种集成的电路芯片,通常被集成在计算机主板上,也称为集成声卡或板载音频。
- 它提供了基本的音频输入输出功能,包括ADC和DAC转换,以及基本的音效处理能力。
- 声音芯片的设计通常是为了满足一般用户的日常使用需求,如上网、听音乐、看视频等,而不是专业的音频制作。
- 它们通常成本较低,便于制造商集成到主板上,为用户提供方便的音频解决方案。 总结来说,声卡和声音芯片都用于处理音频信号,但声卡是独立的扩展卡,而声音芯片是主板上的集成组件。声卡通常提供更高级的音频功能和更好的音质,而声音芯片则提供基本的音频功能,适合大多数普通用户的使用需求。
声音芯片通常需要与喇叭(扬声器)或其他音频输出设备配合使用,以便将数字信号转换为人们可以听到的声音。声音芯片内部通常包含数字到模拟转换器(DAC),它将数字音频信号转换为模拟信号。这个模拟信号随后需要通过喇叭或其他音频输出设备播放出来。
在简单的电子设备中,如手机、电脑或便携式音乐播放器,声音芯片的输出可以直接连接到内置的喇叭。而在更复杂的音频系统中,如家庭影院或专业音响系统,声音芯片的输出可能会先通过一个放大器来增强信号,然后再连接到外部喇叭或耳机。
总之,声音芯片负责处理和转换音频信号,而喇叭则负责将音频信号转换为声音,两者需要协同工作才能实现音频的播放。
声卡是什么
声卡(Sound Card)和专门处理声音的软件(如数字音频工作站DAW、音频编辑软件等)在音频处理中扮演着不同的角色,它们之间的区别主要体现在硬件与软件的功能和作用上。 声卡:
- 硬件设备:声卡是计算机的一个物理硬件组件,通常是一块插入到主板PCIe、PCI或USB插槽的卡片,或者是一个外接设备。
- 信号转换:声卡的主要功能是将模拟音频信号转换为数字信号(ADC),或将数字信号转换为模拟信号(DAC),以及提供音频输入输出的接口。
- 音频接口:提供麦克风、线性输入、耳机、扬声器等接口,以及可能的数字接口(如S/PDIF)。
- 实时处理:部分声卡具备硬件加速的音效处理能力,如实时混音、回声、均衡等。
- 独立性能:声卡可以独立于计算机的处理能力运行,减少CPU的负担。 专门处理声音的软件:
- 软件程序:这类软件是安装在计算机上的程序,用于录制、编辑、混音、制作和播放音频。
- 处理功能:软件提供了广泛的音频处理功能,如剪辑、拼接、效果添加、多轨混音、母带处理等。
- 编辑能力:用户可以通过软件对音频进行非常细致的编辑,如调整音高、节奏、时间拉伸等。
- 插件支持:大多数声音处理软件支持各种音频效果插件,如VST、AU等,以提供更多的音效处理选项。
- 依赖CPU:音频处理软件的运行依赖于计算机的CPU,特别是在处理高分辨率的音频项目时。 总结来说,声卡是负责音频信号的输入输出和初步处理的硬件设备,而专门处理声音的软件则是在计算机内部对音频数据进行深度编辑和制作的软件工具。两者通常需要配合使用,以实现从音频录制到最终成品的全过程。
声音的编解码
声音编码和解码可以发生在不同的地方,具体取决于音频处理的上下文和技术细节。以下是几种常见的编码和解码发生的位置:
-
声卡(Sound Card) :
- 编码:当声卡接收来自麦克风或线路输入的模拟声音信号时,内置的模拟-to-数字转换器(ADC)会将这些模拟信号转换为数字信号,这个过程称为编码。
- 解码:当声卡需要输出数字音频到扬声器或其他模拟设备时,内置的数字-to-模拟转换器(DAC)会将数字信号转换回模拟信号,这个过程称为解码。
-
软件应用程序:
- 编码和解码:许多音频编辑软件、播放器和其他音频处理应用程序都能够在软件层面进行音频编码和解码。例如,当你在软件中保存音频文件时,软件可能会使用特定的音频编码格式(如MP3、AAC、WAV等)对音频数据进行编码。同样,播放音频文件时,软件需要将这些编码的数据解码回原始的音频信号。
-
网络传输:
- 编码:在网络传输音频数据时,例如在VoIP(Voice over Internet Protocol)通话或流媒体服务中,音频数据通常会在发送端被编码成适合网络传输的格式,以减少带宽使用和提高传输效率。
- 解码:在接收端,音频数据被解码以供用户听取,这个过程通常由网络应用程序或设备(如智能手机、电脑等)上的软件自动完成。
-
专用硬件:
- 编码和解码:在某些专业音频设备中,例如数字信号处理器(DSP)或专门的音频处理单元,音频编码和解码可能在专门的硬件内部进行,以提供高质量的音频处理效果和减少延迟。 总的来说,声音编码和解码可以在硬件(如声卡)或软件(如音频处理程序)中进行,具体取决于应用场景和技术需求。在音频从录制到播放的整个过程中,编码和解码可能在不同阶段发生多次。
智能芯片
智能芯片,通常指的是集成了微处理器、存储器、输入输出接口和其他电子组件的半导体芯片,它能够执行复杂的计算和处理任务。这种芯片广泛应用于各种电子设备中,如智能手机、计算机、家用电器、汽车和其他嵌入式系统。 智能芯片的特点包括:
- 集成度:智能芯片通常具有非常高的集成度,能够在很小的尺寸上容纳大量的电子组件。
- 计算能力:智能芯片包含一个或多个处理器核心,能够执行复杂的计算任务,处理大量的数据。
- 节能:许多智能芯片设计注重能效,能够在执行任务的同时保持低功耗。
- 连接性:智能芯片通常支持多种通信协议和接口,如Wi-Fi、蓝牙、NFC等,以实现设备间的互联和数据交换。
- 存储能力:智能芯片内部集成了存储器,包括随机存取存储器(RAM)和只读存储器(ROM),用于存储运行时的数据和程序代码。
- 适应性:智能芯片可以根据不同的应用场景进行编程和配置,具有很高的灵活性。 智能芯片的应用范围非常广泛,从简单的传感器控制到复杂的机器学习任务,都能见到智能芯片的身影。随着物联网(IoT)和人工智能技术的发展,智能芯片在数据分析和决策方面的作用变得越来越重要。
智能芯片和普通芯片的主要区别在于它们的复杂性和功能性。智能芯片通常指的是集成了微处理器、存储器、输入输出接口等电子组件,能够执行复杂计算和处理任务的半导体芯片。而普通芯片可能只包含特定的功能,如传感器、驱动器或存储器等。 以下是智能芯片与普通芯片的一些具体区别:
- 集成度:智能芯片通常具有更高的集成度,意味着它们在单个芯片上集成了更多的功能。普通芯片可能只包含一个或几个特定的功能。
- 计算能力:智能芯片包含微处理器核心,能够执行复杂的计算任务。普通芯片可能没有或只具有有限的计算能力。
- 功能多样性:智能芯片通常能够执行多种任务,如数据处理、通信、控制等。普通芯片的功能则更为单一。
- 编程能力:智能芯片可以通过编程来定制其功能和行为,而普通芯片通常是固定的,不可编程。
- 应用范围:智能芯片广泛应用于需要处理大量数据和复杂任务的场景,如智能手机、计算机、物联网设备等。普通芯片则更多用于实现特定的功能,如电源管理、显示驱动等。 总的来说,智能芯片是一种更为复杂和功能强大的半导体器件,它们能够执行更多的任务,具有更高的灵活性和适应性。而普通芯片则更专注于实现特定的功能。随着技术的发展,智能芯片的应用范围将越来越广泛,成为各种电子设备的重要组成部分。
参考
[3.1] sys 下设备模型相关目录结构和其在代码中的对应 - 知乎 (zhihu.com)
[3.2] Linux 内核:设备驱动模型(1)sysfs与kobject基类 - schips - 博客园 (cnblogs.com)
第四章 嵌入式学习资料
场景
Hi,Siri, 半夜中突然醒了。
Siri缓缓的被欢迎了,我问了一个问题,Siri勉强说出了答案,我又准备问Siri, 它不吱声了,原来每次问他问题,必须要加上,“Hey Siri”。好蠢的设计。
我又叫,“打开卧室灯”,这个是另外一个工具,我买的一个离线语音控制灯头,它非常的笨,每次要喊几遍才能被激活,非常的迟钝。
为什么不自己做一个?这就是我突然冒出来的想法。
现在小米智能音箱,Alexa等智能音箱,还有亚马逊的Echo等等,都在发展。
做一个语音控制的操作系统。就像我和师弟说的一样,但是先做一个东西出来能用,这个就很关键!
小米音响背后的技术是什么?
一本好书
嵌入式系统之道,这本书真的还挺有意思的。
硬件玩具树莓派
树莓派(Raspberry Pi)是一款英国的微型单板计算机,由树莓派基金会开发,旨在促进在学校中教授基础计算机科学。自2012年首次推出以来,树莓派因其低成本、便携性和可编程性而广受欢迎,不仅在教育领域,也在业余爱好者、创客和工业应用中得到了广泛应用。 树莓派的特点包括:
- 小型化:树莓派的主板尺寸小,便于携带和集成到各种项目和设备中。
- 可扩展性:提供多个GPIO(通用输入输出)引脚,允许用户连接各种传感器、电机和其他电子组件。
- 兼容性:运行Linux操作系统,支持多种编程语言,如Python、C++和Java,便于学习和开发。
- 多功能性:可以作为常规计算机使用,如浏览网页、办公、媒体播放等,也可以作为专门的主机用于机器人、智能家居、网络服务器等多种应用。
- 社区支持:拥有庞大的在线社区和资源,用户可以轻松获取教程、项目想法和技术支持。 树莓派有多款不同的型号,每个型号在处理能力、内存大小、接口类型等方面都有所不同。例如,较新的树莓派4模型提供更高的性能和更多的内存选项,而树莓派Pico则是一款更小、成本更低的微控制器,适用于简单的嵌入式项目。 树莓派的普及促进了计算机科学和电子工程的学习和实践,成为了全球范围内教育和创新的重要工具。
实用的硬件
一个使用的硬件,包括声控开关,比如声音控制灯具的打开。
相关工作
在参考 4.1 中,介绍了一些学习嵌入式的推荐书籍。包括《深入理解LINUX网络内幕》,《嵌入式C语言自我修养》等等。是一个不错的链接,对于初学者阶段,我个人理解是完全足够了。
在参考4.2 中,作者讲了树莓派怎么玩,但是很明明显,作者没有后续了,只是简单的了解了一下当前的大致情况,投石问路罢了。
在4.3中,介绍了嵌入式系统开发之道。
参考
4.1 嵌入式软件开发-书籍推荐 - IOT物联网小镇 - 博客园 (cnblogs.com)
4.2 树莓派pico-01-环境搭建 - 掘金 (juejin.cn)
4.3 嵌入式系统开发之道 书籍介绍
全局参考
0.1
总结
这两章只是一个开始,我希望能走的更远。