1.概述

大多数微控制器上播放音频都是采用DAC进行输出,因为微控制器上都不会去带CODEC编解码芯片,但是DAC不是每个芯片都会存在,如果没有DAC,那又该怎么办呢?于是PWM就成了一个不错的选择。因为一般的微控制器板子都会有PWM,这样的设计大大简化了语音设计的门槛。其原理就是PWM可以变成一个DAC,然后进行语音信号的输出,经过功率放大器,经过喇叭,则可以将数字信号变成声音信号正常输出了。

2.声音原理

学过物理知识的都知道,声音其实是一种波,通过空气振动等弹性介质传递到人的耳朵里引起耳膜震动,牵动大脑的听视觉神经,经过大脑处理后,就会产生听觉。

人能够分辨的声音的频段为最低20Hz到最高20KHz。中学物理就学过,声音的三特征是:音调、响度和音色,响度是由声源振动的幅度决定的,振幅越大,响度越大;音调的高低和振动的频率有关,频率越高,音调越高;音色不同,波的特征也不同。

既然声音是一种波形,波则有两个特征:频率和振幅。对于单片机来说,表述这两个概念则需要一定的技巧,频率是单片机本来就具有的特性,可以通过时钟产生特定频率的信号,对于振幅,数字信号0与1该如何表述呢?可以通过位宽深度来进行表述,比如8位的位宽深度则可以表达的量化数据为0-256之间的数据,对于数字信号,声音数据也有采样的位宽,所以这个也可以用单片机描述,DAC则可以用来做这个,结合定时器产生特定的频率从而让机器发出声音。

3.DAC产生声音的原理是什么

要想真正理解DAC是如何工作的,必须首先了解什么是模拟信号,模拟信号是一个不断变化的电压,它可以完美的表达不断变化的声波。麦克风可以将传入的声音转换为代表声音的模拟电信号,这些电信号通过扬声器将模拟电信号转换成原始声音。

那么该如何记录这些模拟信号呢?很早的时候,人们就想出了将模拟信号存储为唱片上的凹槽。通过指针的来回移动从而表达出声音的电模拟信号。随着时间的推移,将这种凹槽早已变成和数字信号存储在了硬盘或者各种磁带中,而这些0或者1则表示音频信号的信息。

对于声音信号,光盘可以存储每秒为44100次的16位深度量化二进制数据(16bit/44kHz)。于是在进行DAC输出的时候,我们也可同样采用16位宽的DAC进行采样,然后以44kHz的频率将声音信号转化出来,这对于MCU上去操作DAC并非难事,只需要启用一个16位宽的DAC和一个定时器即可,定时器用于控制声音输出的频率,如采样率位44.1KHz,则按照该时钟频率输出即可。

4.PWM又是如何实现的DAC的

在理解上述原理之后,我们来理解一下PWM,以及PWM是如何进行工作的。

PWM(Pulse Width Modulation)最简单的理解就是MCU内部有个定时器,定时器特定的时间内将GPIO的电平翻转一下。对于翻转的时间间隔的比例就是占空比,而持续这两个过程则可以算为一个周期。这种是对于数字信号的描述,我们转变一下思维,从模拟信号的角度去理解pwm。

则可以看到上面的图示了,在一个周期内,其占空比决定了平均电压值,红色的线表示平均电压。对于一个周期内的数据,我们可以进行量化,其量化的方式为首先设定(0~5v)之间的电压用(0-256表示),此时就可以有8位分辨率(2^8=256)。由于每个量化点都可以表示一个电压,而电压又直接和PWM的一个周期的占空比直接相关,所以可以得到占空比和量化点的关系。同样的16位量化数据则表现的更为精确。但是如果量化的数据越大,则PWM频率越低(计数的时间变长),这是PWM的基本权衡。执行的越快,精度就越低。这里比较关键,但需要好好理解,随着PWM频率的不断提升,其占空比的选择就不再那么随意了,精度会大大的降低。

5.PWM的频率与底噪的关系

音频设备有个参数叫信噪比,是信号与噪声的比例,模拟信号必然会产生噪声。越好的设备信噪比越大,也就是需要非常大的增益才能听得到底噪。

信噪比(Signal-to-noise ratio,缩写为 SNR 或 S/N),也称作信杂比讯杂比

通常PWM发出的声音无法去除掉这一点,但这些声音有时候会变得有趣,比如红白机8bit游戏音乐。

确切的说,如果要提升音质,那么可以采用16位数据。有着如下的公式说明:

SNR(dB)=(Bit Depth)*6.02dB + 1.76dB)

也就是说,如果要获得更好的声音效果,可以有两种办法,第一种是降低PWM的频率,也就是上一章节解释的那样,想要获得更大的深度,则必须降低PWM的频率。第二种则是增加PWM的数量。根据奈奎斯特采样定理,PWM的最高频率至少是声音最高频率(20Khz)的两倍。

上图描述了采样频率和PWM数量以及位宽深度的关系。如果增加PWM的数量,则可以提升采样的精度,比如在不改变PWM的频率下可以改变其位宽深度。

6.PWM音乐曲目解析

我曾经看到过一篇很有意思的文章,就是讲了pwm然后用无源蜂鸣器做个播放器的播放《你笑起来真好看》这个曲目,我觉得很有意思。我的上述分析虽然不是完全的可以结合上这个原理,但是至少可以帮助理解一下乐理知识。在音乐中,节奏和节拍两者相辅相成,构成音乐的骨架。使用PWM直接给无源蜂鸣器供电,当高电平时,无源蜂鸣器响,低电平时不响。然后给定音乐的节拍让其响或者不响,则可以演奏出乐曲出来,而人发出的声音却比这个要复杂许多,高低变化的声音,声调的变化要展示出来,是非常有难度的事情。

7.后续

本文分析了声音通过PWM或者DAC产生的一些原理和过程,其中比较关键的是PWM从模拟信号的角度上来看,其占空比的变化也可以变成电压信号。从而通过类似于DAC的原理,此时加上定时器,按照声音特定的频率去播放,则可以输出声音了。当然,本文至少从原理上说明这个方案是可行的,更多的细节和更多的技术实现还在是要继续进行探索,后面会研究多个PWM如何提升声音信噪比以及带来的副作用是那些,也会去用MCU的视角去理解更多乐理知识。

1.从嵌入式角度分析“可解释性”对人工智能的影响!

2.【MCU】寄存器、标准库、HAL库、LL库,这么多库!你叫我怎么选?

3.用Linux开发嵌入式项目拢共分几步?

4.程序本身如何知道自身大小?这是鸡生蛋还是蛋生鸡的问题!

5.国产集成开发环境助力国产RISC-V打破国外巨头在芯片技术上的垄断

6.做嵌入式开发时,你是怎么实现LCD显示的?

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

没有ADC的MCU如何实现音频播放?相关推荐

  1. DAC+DMA+TIM实现音频播放问题记录

    目录 1. 概述 2. 音频采样率 2.1 定时器触发周期 2.2 音频文件的格式 3. DAC的左对齐和右对齐 3.1 为什么要使用左对齐 3.2 左对齐数据的读写 3.3 音频数据的使用 3.3. ...

  2. 第38章 I2S—音频播放与录音输入—零死角玩转STM32-F429系列

    第38章     I2S-音频播放与录音输入 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...

  3. STM32 USB AUDIO 基础篇①——通过STM32CubeMX生成USB Speaker音频播放Demo(史上最简单)

    文章目录 一.硬件原理 二.STM32CubeMX配置 2.1 RCC 2.2 SYS 2.3 I2C1 2.4 USART1 2.5 USB_OTG_FS 2.6 I2S2 2.7 USB_DEVI ...

  4. 基于STM32F103C8T6片内Flash的音频播放(DAC通道)

    基于STM32F103C8T6片内Flash的音频播放(DAC通道) 一.STM32的DAC通道介绍 1.DAC 简介 2.STM32中的DAC主要特点 3.DAC 功能框图剖析 4.DAC配置 二. ...

  5. 嵌入式平台音频播放器设计(基础篇)

    一.目的 相信不少同学都见过以前那种很小的MP3播放器(暴露年龄),高级一点的还带一个小的单色液晶屏,想必理工科男都想自己设计一款这样的一款播放器. 那么如何才能设计实现一个简单的音乐播放器呢? 本文 ...

  6. java 3gpp转mp3_Android音频以及音频播放器开发实例

    Android 系统支持三种不同来源的音频播放: 1)本地资源 存储在应用程序中的资源,例如存储在 RAW 文件夹下的媒体文件,只能被当前应用程序访问. 2)外部资源 存储在文件系统中的标准媒体文件, ...

  7. android 自定义音乐圆形进度条,Android自定义View实现音频播放圆形进度条

    本篇文章介绍自定义View配合属性动画来实现如下的效果 实现思路如下: 根据播放按钮的图片大小计算出圆形进度条的大小 根据音频的时间长度计算出圆形进度条绘制的弧度 通过Handler刷新界面来更新圆形 ...

  8. 小程序音频播放报10001 解决方案 errCode:10001, errMsg:errCode:602,err:error,not found param

    音频播放有两种方式: 第一种: innerAudioContext.src = audioSrc;innerAudioContext.play(); 第二种: innerAudioContext.au ...

  9. androidwakelock_Android音频播放时wakelock的实现

    音频播放时 wakelock 的实现 作者 :Macro Liu 功能描述 : 当播放音乐时,按电源键只需要进入 early suspend, 以保持音乐播放状态. 实现方法 : 在上层和内核都加 w ...

  10. python ffmpeg 视频转图片 视频转音频 播放音频 多张图片+音频转视频 多个视频合成一个视频 改变视频播放速度

    文章目录 视频转图片 视频转音频 播放音频 图片+音频 转 视频 多个视频合成一个视频 改变视频播放速度 视频转图片 #!/usr/bin/env python # -*- encoding: utf ...

最新文章

  1. HashSet中的add()方法( 三 )(详尽版)
  2. 十年后,这款优秀的工具终于给出了不开源的原因
  3. Netty和RPC框架线程模型分析
  4. 转-eclipse管理多个workspace
  5. reciprocity
  6. ajaxfileupload带参数上传文件
  7. WebSocket客户端连接成功后,返回的socket里有用的字段
  8. 圆桌对话:云时代下,企业运维面临的挑战与机遇
  9. Spring官方都说废掉GuavaCache用Caffeine,你还不换?
  10. SUMO与各类软件的联合仿真方法
  11. 可视化基础讲解之色彩搭配!
  12. 触目惊心的互联网流量劫持
  13. Python获取当前时间
  14. s3c2440汇编语言,S3C2440-裸机篇-03 | GPIO的使用(点亮LED、按键检测)
  15. dat image 微信_电脑微信image文件夹下的dat文件怎么打开?
  16. 服务器删除安装的系统教程,服务器安装系统教程
  17. javascript判断元素是否已经focus
  18. 【社招和校招】格灵深瞳合肥研发中心计算机视觉算法岗招聘
  19. 码农的跑步里程碑5000公里
  20. Shell脚本(一)

热门文章

  1. w ndows10图标,Windows10系统图标怎样提取
  2. 基于Visual C++2010与windows SDK fo windows7开发windows7平台的tabletpc应用(1)-手写数学公式输入
  3. 台式计算机驱动程序未被安装,Win10提示该设备的驱动程序未被安装。(代码28)
  4. Vuex 的简单模拟、了解Vuex
  5. 速达服务器应用程序错误,速达软件错误集锦及解决方法
  6. tftpd-hpa使用完全教程
  7. 【有利可图网】PS实战系列:PS制作人像印章效果
  8. Http状态代码指示
  9. 【Revit二次开发】族
  10. 点击链接时直接在网页中打开word文档