PWM实现语音播放原理

采用PWM进行播放语音原理

  • 1.概述

  • 2.声音原理

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

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

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

  • 6.PWM音乐曲目解析

  • 7.后续

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的视角去理解更多乐理知识。

推荐阅读:

    专辑|Linux文章汇总

    专辑|程序人生

    专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在web.config里注册HttpModule

<add name"随便命名" type"HttpModule命名空间加类名,dll文件名" /> 转载于:https://www.cnblogs.com/tinsuki/archive/2007/09/10/888276.html

51单片机——SPI

单片机——SPI总线 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 UART、 I2C 和 SPI 是单片机系统中最常用的三种通信协议。 1、初步介绍 SPI 是一种高速的、全双工、同步通信总线&#xff0c;标准的 SPI 也仅仅使用 4 个引脚&#xff0c;常用于单片…

CTF 这个看起来有点简单

这个看起来有点简单分值&#xff1a;10 来源&#xff1a; 西普学院难度&#xff1a;易 很明显。过年过节不送礼&#xff0c;送礼就送这个 格式&#xff1a; 解题链接&#xff1a; http://ctf5.shiyanbar.com/8/index.php?id1 解法&#xff1a; 1.手工注入 id1 id1 and 11 id…

操作系统,你搞定了没?

#书籍赠送操作系统一直是比较难学的知识&#xff0c;要学好操作系统的相关内容&#xff0c;需要对硬件、软件、宏观、微观、有非常深刻的理解&#xff0c;而能找到一本讲解比较好的书籍也是非常难得的&#xff0c;恰好&#xff0c;最近有出版社的朋友推荐了这样的一本书籍&…

自学python前戏

为什么需要学python&#xff1f; 一直有这个打算&#xff0c;但总是没有下决心开始。 听说python语言结构简洁优美&#xff0c;功能性强大&#xff0c;可移植性高&#xff0c;各大网站都在用python开发。学习python的想法再一次涌上心头。未来10年到底哪种语言会独领风骚&#…

webcast(利用sharepoint Designer 定制 Office SharePoint Server 2007)学习笔记

讲 师:侯钟雷 微软特约讲师 北京易学育通科技发展有限公司时 间:90 分钟 下载地址:下载地址(需先注册,不过很快)讲座内容&#xff1a;SharePoint Designer是原Frontpage网页工具的演进版本&#xff0c;除了保持了原有强大的功能外&#xff0c;更增加了对SharePoint技术的…

C++ 的几个for 循环,范围for语句

我认为做嵌入式开发也需要学习C开发&#xff0c;可能我们学习的不只是一种编程语言&#xff0c;而是一种编程思想&#xff0c;C相对于C语言来说&#xff0c;会需要更多的想象力&#xff0c;原因就是C的特点太多了。不过&#xff0c;我们可以通过学习C的知识&#xff0c;来掌握面…

51单片机——多功能电子钟

单片机——多功能电子钟 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 实现的功能有&#xff1a;走 时、校时、闹钟、温度、遥控这几个功能。要想实现这几个功能&#xff0c;其中走时所需要的就是时 钟芯片&#xff0c;即 DS1302&#xff1b;时间需要…

用数学运算实现数据无损压缩的算法

用数学运算实现数据无损压缩的算法<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />(An arithmetic On Lossless Data-Compress By Mathematical Operation)王春海1 魏玉冬2&#xff08;[1]河北经贸大学信息技术学院 2河北经贸…

dubbo的监控中心

监控中心实际上就是一个web工程。 是dubbo官方给我们提供的一个war包。 只需要部署在Tomcat中就可以了。 推荐把监控中心与注册中心部署在一台服务器上&#xff0c;这样可以不需要任何配置。 部署完成后直接启动Tomcat就可以使用。 注&#xff1a;tail -f logs/catalina.out即可…

​我敢说,这是最全的常用设计模式汇总

今天&#xff0c;想跟大家聊聊代码能力的提升。想起我刚入行那会&#xff0c;怀抱满腔激情&#xff0c;到处学热门框架&#xff0c;但实际上受限于公司体量和业务逻辑&#xff0c;其实往往用不上&#xff0c;时间久了&#xff0c;不用就忘记了&#xff0c;于是在日复一日的工作…

嵌入式高手之路

嵌入式高手之路 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 第一部分&#xff1a;LINUX平台搭建与环境熟悉 了解Linux系统&#xff1b;区分各种版本的Linux系统&#xff0c;以便于拓展 Linux视野。 1、Linux 简介&#xff1b; 2、Linux 系统的主要…

Meterpreter Guide

转载&#xff1a;http://wooyun.jozxing.cc/static/drops/tips-10146.html 0x01 入门篇(生成与接收) 功能介绍 msfpayload和msfencode已经被时代淘汰了现在都转为msfvenom了 msfvenom命令行选项如下&#xff1a;Options:-p, --payload payload> 指定需要使用的…

跟老肖聊天

今天跟一个创业的朋友老肖聊天&#xff0c;聊完之后有点沉重老肖是我的朋友&#xff0c;我讲的都是基于真实的内容&#xff0c;如果觉得我是吹牛或者过分如何&#xff0c;可以绕道&#xff0c;也请嘴下留情。老肖因为公司不景气&#xff0c;这两天出去面试&#xff0c;面试了三…

SSM中(Spring-SpringMVC-Mybatis)(一:概念)

一&#xff1a;Spring&#xff1a; 参照我的另一篇博客&#xff1a; http://www.cnblogs.com/GH0522/p/8127530.html 二:SpringMVC: 流程图&#xff1a; SpringMVC接口解释 DispatcherServlet&#xff1a; Spring提供的前端控制器&#xff0c;所有的请求都有经过它来统一分…

关于VISIO工具栏、菜单栏消失的解决办法

关于VISIO工具栏、菜单栏消失的解决办法1、打开注册表编辑器。2、VISIO 2000HKEY_CURRENT_USER\Software\Visio\Visio2000\Toolbars删除上述键值&#xff0c;再启动VISIO 2000就可以看到工具栏和菜单栏了。3、VISIO 2002HKEY_CURRENT_USER\Software\Microsoft\Visio\Toolbars删…

嵌入式软件书籍

嵌入式书籍推荐 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 Linux基础 1、《Linux与Unix Shell 编程指南》 C语言基础    1、《C Primer Plus&#xff0c;5th Edition》【美】Stephen Prata着    2、《The C Programming Language, 2nd Ed…

C语言函数库

sqrt() - C函数 C库函数 double sqrt(double x) 返回x的平方根。 声明 下面是函数sqrt()声明。 double sqrt(double x) 参数 x -- 这是浮点值。 返回值 这个函数返回x的平方根。 例子 下面的例子演示了如何使用sqrt()函数。 #include <stdio.h> #include <math.h>…

C++实现一个栈

我们先说下栈的知识&#xff0c;先看下我们之前写的文章栈&#xff0c;C语言实现如何自己实现一个栈堆和栈的区别&#xff08;转过无数次的文章&#xff09;这是一个栈这是我们把数据入栈的操作这是数据出栈的操作之前僚机号里面发了一个用C实现的栈文章&#xff0c;比较简单&a…

ApiController得到服务器端绝对路径

System.Web.Hosting.HostingEnvironment.MapPath("路径"); MSDN资料 将虚拟路径映射到服务器上的物理路径。 命名空间&#xff1a; System.Web.Hosting程序集&#xff1a; System.Web&#xff08;在 System.Web.dll 中&#xff09; 语法 public static string Map…