搜索
bottom↓
回复: 66

STM32 PWM 语音播放(原帖点赞顺丰包邮送Nucleo开发板)

  [复制链接]

出0入0汤圆

发表于 2016-6-13 23:24:20 | 显示全部楼层 |阅读模式
本帖最后由 Immortality 于 2016-6-14 13:02 编辑

先来看看音频是什么样子,这是一段音频数据的波形


下面是放大的局部图:


以一定的速度采样(ADC)这些波形进行存储,就是音频数据了,所以播放就是按原来采样的速率再用DAC输出对应的数据即可。
这里的音频有两个主要的参数,采样速率和采样位数:
采样速率:指1s中采样多少个数据点,比如1s种采集16000个点,那么采样率就是16KHz。采样速率越高,越能抓到频率较高的声音,比如CD的采样率就是44.1KHz,确保人耳能听到的声音都会被抓到。

采样位数:是指音频幅度最大值与最小值分为了多少阶,比如满幅度是3.3V,如果是8Bit位数,那么每一阶就是3.3V/256 = 12.89mv,采样位数越高,声音细节越好,所以采样速率和位数越高,声音还原越逼真,但存储的数据量也越大,一首三四分钟的歌曲,如果不采用编码按原始波形数据存储,数据量有好几十兆大小,这涉及到音频编码的问题,这里不展开讲了,有兴趣的同学可以找相关资料。

接下来看怎么播放,最简单的当然是把采样(ADC)的数据按原样输出(DAC)了。但我们有些芯片本身不带有DAC,所以只能用PWM代替DAC,PWM即脉冲宽度调制。这里只需要把DAC的幅度值转换成PWM的占空比即可,例如16KHz 8Bit的声音转换成16Khz 256阶占空比的PWM。但有一个问题,如果用16KHz的PWM播放语音,声音是可以播放,但有一个16Khz的谐波存在,这个声音会被人耳听到,所以需要更高频率的PWM,数据还是按照16Khz更新。
我这里使用32KHz的PWM,用16KHz 8Bit PCM格式的音频数据,8Bit的数据对应一个Byte,16KHz采样,1秒种占用存储空间就是16K Byte,因为F429有2M Byte的Flash存储空间,理论上可以存储2048K/16K = 128秒的音频。下面是用NucleoF429实现音频播放的具体过程:

一、配置PWM
1、用STM32CubeMx建立工程,配置两个定时器TIM1和TIM2,TIM用于PWM产生,TIM2用于16KHz数据更新,


TIM1选择PWM互补输出(单通道也可以),将PE8和PE9复用为PWMN和PWMP。
TIM1在APB2总线上,TIM2在APB1总线上


所以TIM1和TIM2的时钟频率分别为180M和90M,系统时钟用HSE输入的8MHz。


将TIM1设置为32KHz,即31.25us。8Bit占空比,一个LSB为31.25us / 256 = 0.1220703125us = 8.192MHz,TIM1 180M / 8.192M = 21.97265625,这里取整数22。所以实际的PWM频率为1/(180 / 22) *256 =  31.289us = 31.96KHz


TIM2 为90MHz,45分频后为2MHz即0.5us,周期125即62.5us = 16KHz。

NVIC开启TIM2中断。生成工程名和目录后生成Keil工程。

二、播放语音
1、先编译后,编写TIM中断服务程序。


完成后,开启TIM2中断和PWM,(PWM是互补输出,需要单独开启各个通道)


用逻辑分析仪测量输出波形。


如图所示,TIM1 PWM为31.96KHz,TIM2为62.5us即16KHz,结果正确。
接下来处理音频:
这里使用的音频是PCM格式,是未进行压缩编码的原始数据,可以直接给PWM输出。
音频处理的软件有许多,只要能把格式转为PCM即可,下面是我用Cool Edit这款软件做的音频格式转换。

选择菜单 文件-->批量转换


选择新的采样率和采样位数。


选择PCM格式。设置输出目录后运行批处理完成转换。


完成后的音频文件用WinHeX这个软件打开。

图中红框中的44个Byte为PCM格式的文件头信息,后面的的数据为音频数据,数据全选后利用WinHex的可选格式复制


将数据以C数组的形式导出,在工程目录下新建.h文件,将复制的文件粘帖到.H文件并在工程中Include进来,定义起始和结束地址,数组的大小即为文件结束地址,数组用const修饰,可以将数据存储到Flash中。

在TIM2中,以16KHz的速度更新PWM数据即可实现音频播放。

编译工程,下载到NucleoF429板子上,在PE8或PE9上接一个喇叭即可听到声音。

以上用的音频采样是16K 8Bit,要想提高音质,提高采样和Bit数即可,音量可以用外接三极管或功放放大,音频数据也可以用ADC采集后存储到SPI Flash后播放,实现录音回放。
附件是Source Code


以上文字来自于 ARM中文社区,因为之前收到赠送的NucleoF429,目前我也在送出一块NucleoL053R开发板,有兴趣的可以到这个帖子看看:
NucleoF429基础应用:PWM语音播放 (+点赞拿Nucleo开发板)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-6-14 07:30:26 来自手机 | 显示全部楼层
恩不错,见过这种方式播放音频,楼主板子打算送我吗

出0入0汤圆

发表于 2016-6-14 07:39:33 来自手机 | 显示全部楼层
我也点赞 露珠有两块板子是吧

出0入0汤圆

发表于 2016-6-14 07:56:41 来自手机 | 显示全部楼层
楼主肯定有第三块板子!

出0入0汤圆

发表于 2016-6-14 08:38:28 | 显示全部楼层
自己有STM32的工程板都可以按照楼主的例子实现,16K8bit音源好的话,很好听没有杂音。

出0入0汤圆

发表于 2016-6-14 08:42:53 | 显示全部楼层
点个赞吧,第五第六块板子也有吧

出0入0汤圆

发表于 2016-6-14 08:46:06 | 显示全部楼层
不知道后继的板子有不?

出0入0汤圆

 楼主| 发表于 2016-6-14 08:50:17 来自手机 | 显示全部楼层
myxiaonia 发表于 2016-6-14 07:30
恩不错,见过这种方式播放音频,楼主板子打算送我吗

要去原贴看看帖子后面的说明,点个赞就有机会!人少,中的几率大

出0入0汤圆

 楼主| 发表于 2016-6-14 08:52:58 来自手机 | 显示全部楼层
sunplus 发表于 2016-6-14 07:39
我也点赞 露珠有两块板子是吧

我有5块不同不同型号的nucleo板子,拿出来送一块,按原贴的要求点个赞就行

出5入8汤圆

发表于 2016-6-14 08:57:54 | 显示全部楼层
长见识了   收块开发板去

出0入0汤圆

 楼主| 发表于 2016-6-14 09:04:35 来自手机 | 显示全部楼层
TANG2016 发表于 2016-6-14 08:38
自己有STM32的工程板都可以按照楼主的例子实现,16K8bit音源好的话,很好听没有杂音。 ...

16K 8bit语音基本算正常,资源够的话可以提高位数,要是在PWM中断中更新数据,使用一个中断就够了。

出0入0汤圆

 楼主| 发表于 2016-6-14 09:09:52 来自手机 | 显示全部楼层
YS126 发表于 2016-6-14 07:56
楼主肯定有第三块板子!

我写这个demo的NucleoF429板子就是ARM中文社区送的,已经送过我两块了,有兴趣的童鞋可以注册一个账号(现在给我点赞,15中午我也送NucleoL053的板子),后面还会有东西送的。

出0入0汤圆

 楼主| 发表于 2016-6-14 09:12:31 来自手机 | 显示全部楼层
wt3333 发表于 2016-6-14 08:57
长见识了   收块开发板去

哈哈哈,感谢!机会很多,已经送过我两块了…

出0入0汤圆

 楼主| 发表于 2016-6-14 09:14:48 来自手机 | 显示全部楼层
大米饭 发表于 2016-6-14 08:42
点个赞吧,第五第六块板子也有吧

现在是我个人送,点个赞就行…

出0入0汤圆

发表于 2016-6-14 09:23:28 | 显示全部楼层
我也来点赞 送我一个吧,很期待呀

出0入0汤圆

 楼主| 发表于 2016-6-14 09:32:02 | 显示全部楼层
ywlzh 发表于 2016-6-14 09:23
我也来点赞 送我一个吧,很期待呀

要到原帖下面看看说明点赞才有机会哒。。可能需要注册一个ARM中文社区的账号。这是原帖:https://community.arm.com/commun ... 0%E5%8F%91%E6%9D%BF

出0入4汤圆

发表于 2016-6-14 09:38:10 | 显示全部楼层
STM32 PWM 语音播放

出50入0汤圆

发表于 2016-6-14 09:40:12 | 显示全部楼层
标记一下,回头照着做一下试试

出0入0汤圆

 楼主| 发表于 2016-6-14 09:57:45 | 显示全部楼层
billtian 发表于 2016-6-14 09:38
STM32 PWM 语音播放

重要的是我在送开发板啊。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2016-6-14 10:28:38 | 显示全部楼层
事实上只要有定时器,能做到32KHz 8Bit的PWM,即使使用IO也能播放语音,比这两个参数还要小也能播放,只是声音会比较差。。

出0入0汤圆

 楼主| 发表于 2016-6-14 11:28:26 | 显示全部楼层
还有一个就是语音数据的存储,一般都有ADPCM压缩,解码相对简单一些,不压缩的话,数据量比较大,一般MCU放不了多少东西,除非是语音IC,内部有大容量的存储空间,否则只能外接存储器了,比如SPI Flash。。

出0入0汤圆

发表于 2016-6-14 12:35:38 | 显示全部楼层
arm官网的帐号 在这个网站不能用啊 赶紧注册一个

出0入0汤圆

 楼主| 发表于 2016-6-14 12:44:37 | 显示全部楼层
myxiaonia 发表于 2016-6-14 12:35
arm官网的帐号 在这个网站不能用啊 赶紧注册一个

这个是ARM社区账号,应该不通用,不过这个社区的服务器在国外,访问有点慢,可以注册一个,只需要邮箱就行了。除了我送的这个开发板,平时社区都有东西送的。。

出0入0汤圆

发表于 2016-6-14 16:03:07 | 显示全部楼层
请问直接驱动喇叭声音有多大?

出0入0汤圆

发表于 2016-6-14 16:11:17 | 显示全部楼层
音质如何啊?

出0入0汤圆

 楼主| 发表于 2016-6-14 16:50:39 | 显示全部楼层
nanfang2000 发表于 2016-6-14 16:03
请问直接驱动喇叭声音有多大?

不怎么大,但能听到,一是IO的驱动能力,二是音频要经过处理去掉直流分量,要不动态范围小声音大不了。。

出0入0汤圆

 楼主| 发表于 2016-6-14 16:53:01 | 显示全部楼层

16KHz 8Bit应该算普通,播一些语音提示啊儿童歌曲之类的还行,音乐就不能用这个了。。

出0入0汤圆

发表于 2016-6-14 17:04:45 | 显示全部楼层
这个音质如何

出0入0汤圆

 楼主| 发表于 2016-6-14 17:32:11 | 显示全部楼层

你楼上有回复。。

出0入0汤圆

发表于 2016-6-14 17:46:08 | 显示全部楼层
本帖最后由 LK9286 于 2016-6-14 17:48 编辑


要送板子?

出0入0汤圆

发表于 2016-6-14 18:25:53 | 显示全部楼层
楼主肯定有很多板子

出0入0汤圆

发表于 2016-6-14 21:09:53 来自手机 | 显示全部楼层
赞,排队等板子

出0入0汤圆

发表于 2016-6-14 21:16:13 | 显示全部楼层
赞         能做到44.1k   16bi就不错了

出0入8汤圆

发表于 2016-6-14 21:36:21 | 显示全部楼层
讲得不错,楼主利害

出0入0汤圆

 楼主| 发表于 2016-6-14 22:04:02 来自手机 | 显示全部楼层
LK9286 发表于 2016-6-14 17:46
要送板子?

帖子后面有一个链接,你看看那个帖子最后的说明,注册一个账号点个赞就有机会,人不多,几率很大,顺丰包邮哒

出0入0汤圆

 楼主| 发表于 2016-6-14 22:05:15 来自手机 | 显示全部楼层
appleboy 发表于 2016-6-14 21:09
赞,排队等板子

你要到原贴按要求点个赞就有抽奖资格了…

出0入0汤圆

 楼主| 发表于 2016-6-14 22:07:46 来自手机 | 显示全部楼层
leijiayou 发表于 2016-6-14 21:16
赞         能做到44.1k   16bi就不错了

只要你的MCU速度够快就行…

出0入0汤圆

发表于 2016-6-14 22:55:53 | 显示全部楼层
很新鲜,这样就不用语音芯片了

出0入0汤圆

 楼主| 发表于 2016-6-14 23:01:36 | 显示全部楼层
farmerzhangdl 发表于 2016-6-14 22:55
很新鲜,这样就不用语音芯片了

用PWM播放语音的IC确实占了不少。。另外原帖有开发板送哦。。

出0入0汤圆

发表于 2016-6-15 14:06:51 | 显示全部楼层
好了楼主现在获奖了,你的板子打算送给谁呢

出0入0汤圆

 楼主| 发表于 2016-6-15 16:42:54 | 显示全部楼层
myxiaonia 发表于 2016-6-15 14:06
好了楼主现在获奖了,你的板子打算送给谁呢

哈哈哈,谢谢!愿望达成,现在在写GPIO做触摸按键的Demo,写完一起发。

出0入0汤圆

 楼主| 发表于 2016-6-22 15:13:29 | 显示全部楼层
myxiaonia 发表于 2016-6-15 14:06
好了楼主现在获奖了,你的板子打算送给谁呢

GPIO 做Touch Key
好了,帖子发了,明天抽奖。。我的四轴明天到。。感谢!

出0入0汤圆

发表于 2016-6-22 17:18:36 | 显示全部楼层
赞                                 

出0入0汤圆

发表于 2016-6-22 17:22:05 | 显示全部楼层
必须点赞,拿板子。

出0入0汤圆

发表于 2016-6-22 22:11:27 | 显示全部楼层
Immortality 发表于 2016-6-22 15:13
GPIO 做Touch Key
好了,帖子发了,明天抽奖。。我的四轴明天到。。感谢!
...

你的抽奖有意思,,,
不过你的帖子也挺有意思啊

出0入0汤圆

发表于 2016-6-22 22:31:13 | 显示全部楼层
好东西,mark

出0入0汤圆

发表于 2016-11-1 22:29:42 | 显示全部楼层
请教个问题,最近也是在做PWM用喇叭推声音,直接推22khz左右的PCM数据,后面加一个截止频率8khz的低通来处理谐波问题。
但是在使用中发现8bit数据声音还不错,16bit情况下基本上全是噪声,只能隐约感觉有人声,很奇怪。因为原理上都是一样的,都是换算成PWM占空比,
只不过一个 /256,一个 /65536,不明白为什么会有这么大区别,不知道lz有没有碰到过?

出0入0汤圆

发表于 2016-11-2 08:39:22 | 显示全部楼层
点个赞  
不知道录音时间和数组大小的关系是怎么样呢?采样率对录音质量和数组大小的关系又是怎么样呢?
不过这个确实有实用价值!!

出0入0汤圆

发表于 2016-11-3 19:05:55 来自手机 | 显示全部楼层
赞,留名。。

出0入0汤圆

发表于 2016-11-4 12:53:51 | 显示全部楼层
这样就可以省掉语音芯片了

出0入4汤圆

发表于 2016-11-4 12:58:40 | 显示全部楼层
这个厉害,学习了。多谢楼主

出0入0汤圆

发表于 2016-11-5 23:49:07 | 显示全部楼层
谢谢分享。

出0入0汤圆

发表于 2016-11-6 12:40:36 | 显示全部楼层
解释很详细,学习

出0入0汤圆

发表于 2016-11-7 08:56:35 | 显示全部楼层

必须点赞,拿板子

出0入0汤圆

发表于 2016-11-7 09:37:06 | 显示全部楼层
有点意思。

出0入0汤圆

发表于 2016-11-7 09:42:08 | 显示全部楼层
我在自主的1788主板上,以da模式播放过类似的音频;
是将mp3数据转换为PCM数据,存储在fat32文件中,实现后台播放,8bit数据音质一般,不过还算清晰。

出0入0汤圆

发表于 2016-11-7 12:25:39 | 显示全部楼层
果断收藏,资料很有用。

出0入0汤圆

发表于 2017-2-16 18:33:27 | 显示全部楼层
不错,刚好用到

出870入263汤圆

发表于 2017-2-17 10:23:15 | 显示全部楼层
16K的中断太耗费CPU资源了吧!设置占空比完全可以用DMA实现,不要用中断了。

出0入0汤圆

发表于 2017-7-10 12:29:04 | 显示全部楼层
STM32 pwm  语音播放,谢谢分享~

出0入0汤圆

发表于 2017-8-15 14:35:55 | 显示全部楼层
楼主,你好,你的Cool Edit是哪个版本的啊,我网上下载的 CoolEditPro2.1 没有 批量转换这个菜单啊,可以上传一份吗

出0入0汤圆

发表于 2017-8-15 14:44:35 | 显示全部楼层
找到“批量处理”了,谢谢

出0入0汤圆

发表于 2018-4-24 18:18:09 | 显示全部楼层
cool,学习了。

出0入0汤圆

发表于 2018-4-24 18:42:05 | 显示全部楼层
PWM 语音播放

出0入0汤圆

发表于 2018-4-24 18:45:05 来自手机 | 显示全部楼层
必须点赞PWM语音播放。

出20入0汤圆

发表于 2019-3-17 22:08:02 | 显示全部楼层
楼主介绍的真详细,最近打算做语音方面的项目,收下了,谢谢。

出0入0汤圆

发表于 2021-3-15 14:27:13 | 显示全部楼层
谢谢楼主。这里定时器用一个,然后再用上DMA应该也可以吧。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 02:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表