首页 > 评测 > 每个板子都能歌唱:嵌入式系统与音频处理(缘起)

每个板子都能歌唱:嵌入式系统与音频处理(缘起)

  • 作者:zhanzr
  • 来源:21ic
  • [导读]
  • 老司机带你打破音频高大上的神话

图片1.jpg

写在前面:

21ic打算携手资(tu)深(ding)直男癌晚期工程师zhanzr21,来给大家讲一讲嵌入式系统与音频处理的故事。

关于zhanzr21

曾经混迹于两岸三地,摸爬滚打在前端后端,搞过学术上过班。现在创业中,欢迎各种撩

点击链接加入群【嵌入式音频信号处理】:https://jq.qq.com/?_wv=1027&k=45wk8Ks

 

1. 本系列写作动机与目的

一半因为工作原因,一半因为个人兴趣,本文作者隔三岔五地要跟音频处理打交道.音频处理尤其是嵌入式系统上的音频处理在很长一段时间曾是作者工作中最有压力的一部分.原因在于其对于非计算机非数学专业经历的工程师(如作者)来讲, 涉及理论知识面广(比如压缩算法非常繁多),而实践中遇到问题非常难以调试. 所谓久病成医,在长期战斗中作者也算是总结了一定的心得.于是想试着写一点出来.写作的动机大致有两个: 一是为了分享自己心得,二是向高人请教. 在编辑的建议下,以系列文章的形式和大家讨论一下嵌入式系统的音频处理这个话题.

首先不得不提的是,这个标题"嵌入式系统与音频处理"也是折磨了我许久. 非常害怕标题不够准确, 故此先解释一番. 文章中的许多内容属于信号处理,软件算法优化方面,如频谱分析,时分复用,采样,IDCT. 但作者着重于它们在音频信号处理领域的应用. 标题的定语是"嵌入式系统", 但是读者很快就会发现文中将会出现"C++,Windows API, Python, Matlab"等不那么"嵌入式"的元素. 但这正是音频处理的特点, 一般来讲嵌入式系统只是最后代码运行的地方, 而分析, 处理, 传输, 设计音频则经常会涉及到上位机, 网络.

曾几何时, 数字音频处理一度是一般嵌入式系统高攀不起的应用. 但是随着硬件成本的下降与处理能力/容量的上升, 数字音频处理已经渐渐地成为了嵌入式系统的日常任务. 本文的目的是介绍与讨论如何在一般的嵌入式系统上进行数字音频处理. 专业的音频DSP,ASIC当然还是站在发展的前沿, 但是读完本系列的读者将会发现, 它们和一般嵌入式音频处理系统区别并不大.

2.计划覆盖范围

系列文章将采取连载的方式, 计划至少每周写一篇. 计划按照理论+实践结合的方式进行, 尽量多一些趣味性与可操作性的内容, 而避免纯理论的长篇大论. 讨论的范围包括数字音频信号的原理, 处理和基本的实践(播放,录制,压缩,传输). 大多数文章覆盖一个主题, 某些复杂一点的主题需要多篇文章. 文章中附带的实验代码/资源也会打包以供读者方便地做实验.

即使已经加了若干限定, 嵌入式系统的音频处理依旧是个很广泛的话题, 为了防止作者和读者被漫无边际的头绪所淹没, 这里打算把讨论的范围限定一下:

§ 音频信处理分为模拟部分和数字部分,本文除非必要,不涉及纯模拟部分(如AM广播原理,但会讨论各种放大器,因为D类放大器这种就属于数字领域).

§ 不涉及过于前沿的内容(事实上这也超出了作者的能力).

§ 已经不再普遍使用的技术也不予以讨论(不讨论爱迪生发明的留声机的基本原理,不讨论怎样使用电脑的主板扬声器播放音乐).

§ 不涉及音频的二次处理 (比如语音识别, 语音合成, 3D虚拟音效环境).

§ 有内置固件与算法的嵌入式芯片(如VS1003或者炬力的MP3主控之类)也不被讨论,本文涉及的嵌入式系统将是通用的MCU或者DSP都能构建的类型.

总而言之,本文将着重讨论一些音频处理中最基本, 必须了解的理论, 和最普遍的嵌入式系统的工程实践. 因此资深的音频发烧友有可能会觉得有点浅显, 这正是作者想要达到的效果.

如上所叙, 本文将采取理论与实践结合的方式展开描述. 这里也对要使用的工具, 平台做一点限定:

§ 软件代码方面在上位机以python和C/C++为主, 偶尔会插一点别的代码比如Matlab/Octave. 嵌入式平台使用C/C++/ASM.

§ 硬件平台方面以ARM Cortex M的处理器为主.板子尽量使用厂商的官方开发板(比如STM的Discovery板子).如果官方的板子不能满足需求,将会另外采购或者自制硬件以展示.

§ 工具方面尽量使用open source的和容易获取的,避免要另外安装或者编译的不常用的包.除了上述的python,C/C++编译器工具和Matlab/Octave之外,Audacity是使用比较多的辅助工具.

§ 将给出所有实验的源代码与硬件原理图,以及相应的工程.

[作者个人观点: 通用实验代码为何偏向于Python? 因为Python代码不需要编译连接的环节,在做需要频繁处理数据的实验时比C/C++更有效. 还不熟悉Python的工程师建议边阅读边打开python环境一起做实验.你会认可作者的观点. 除非用Python比较难以实现的功能,比如调用一些没有标准Library的系统函数,将会转向C/C++.]

[作者个人观点: 既然如此推崇Python,何不在嵌入式系统上也用Python? 作者认为Python的优势在于有很多可以立即使用的标准Library.嵌入式平台受限于资源,目前没有比较标准的Library集合. MicroPython这种目前还只停留在玩具与概念性的阶段的软件包,目前如果不能说是不切实际的话,至少是过于超前.]

[作者个人观点: 所谓的嵌入式系统指怎样的系统? 本文所指的嵌入式系统指那种没有外接存储器或者只有很少量的外接存储器,没有MMU,没有跟桌面系统类似OS的嵌入式系统.如ST公司的Discovery开发板,Nucleo开发板子,乃至于Arduino系列开发板都是本文所指的嵌入式系统的范例. Rasperry Pi这种跑标准Linux/Android的系统,如果非要被称之为嵌入式系统,也只能说是另一种嵌入式系统不在本文讨论范围之类.在这种嵌入式系统上进行数字音频处理的读者应该直接找一些Linux/Android系统上的教程来读,因为它们之间的区别很少.]

3. 面向的读者

文章面向的读者是嵌入式系统的程序员或者其他对这个主题感兴趣的人. 所需要的准备知识是基本的软件, 硬件, 数学的概念. 兴趣是最好的老师,读者如果对此方面的知识没有兴趣,将会发现这是一堆枯燥的文字与代码与几块暗淡的电路板.

搞技术的没有不喜欢音乐的, 即使不是每个人都每天听歌, 现代人每天都要使用大量的程序员在音频处理方面的工作成果(手机, 电脑, 广播, 公交车报站....). 所以作者相信这是一个有意思, 值得深入一点学习的话题. 当然作者水平有限,恳请大家多多包涵与反馈.

4.计划的目录

如前所述, 这个系列将以连载形式进行. 所以目录只是个大致的提纲, 标明一下整个系列所要包括的主题. 作者可能会根据各种情况(如读者反馈), 对某些章节进行一些顺序调整与扩展/缩减.

1. 声音的基本原理,数字音频处理系统的基本组成,并展示本系列主要使用的某些工具.本节实验: 用代码生成原始的音频数据,观察它们的形状,用工具播放他们,发挥你们的想象力进行调整.

2. 嵌入式系统的音频硬件基本配置,录制,播放,压缩. 本节实验以STM32F769Discovery开发版为例, 播放代码生成的原始音频与录制声音.

3. WAVE以及相似格式简析.生成Wav,解码Wav.本节实验:使用Windows API/Python播放wav文件.将电脑上已有wav传至开发板子进行播放.

4. 音频带宽,压缩,ITU的标准系列介绍,最流行的标准MP3介绍及理论.本节实验:开发板移植解码库并且播放MP3文件.

5. G711标准(A-Law,uLaw)介绍及其理论分析.本节实验:开发板上完成录制->A-Law存储->转u-Law->解码播放.中间文件可导出.

6. G726标准(ADPCM)介绍及其理论分析.本节实验:开发板上完成录制->ADPCM存储->解码播放. 中间文件可导出.

7. Speex/Vorbix介绍及其理论分析.本节实验:开发板上完成录制->Speex存储->解码播放. 中间文件可导出.

8. 数字滤波器的介绍及其理论分析,在Matlab的辅助下在开发板子上设计高通/低通滤波器.本节实验:录制一段音频,分别加上高通低通滤波器观察效果.

9. FFT变换与其用途简介.本节实验:做一个频谱同步显示功能.

10. BIQUAD滤波器与其用途简介.本节实验:做一个频谱效果调整器(Graphic Equalizer).

11. MP3简介与分析.本节实验:MP3解码的过程分析.

12. 扩展内容,USB音频传输简介.本节实验:用开发板做一个USB声卡.

13. 扩展内容,利用PC声卡制作信号发生器

14. 扩展内容,利用PC声卡制作示波器

15. 扩展内容,SPDIF标准及其简介.本节实验:做一个SPDIF音频传输Demo.

16. 扩展内容,广播音频简介以及DAB.本节实验:分析拆解DAB收音机.

17. 扩展内容,Shoutcast网络音频协议介绍以及实现.本节实验:开发板播放Shoutcast电台.

18. 扩展内容,最低成本的音频播放与录制硬件制作(Cortex M控制器 + MiC + PWM+可充电池+显示器+Flash).本节实验:音频播放录制硬件制作.

19. 扩展内容,情怀篇之一:PC音频硬件小史, 本节实验: 程序控制PC系统中的扬声器.

20. 扩展内容,情怀篇之二:NES系统音频硬件简介, 本节实验: 分析/Hack NES的APU模拟代码.

  • 本文系21ic原创,未经许可禁止转载!

网友评论