[ESP8266/ESP32]FireBeetle 直接放声(DAC篇) 精华

5175浏览
查看: 5175|回复: 3

[ESP8266/ESP32] FireBeetle 直接放声(DAC篇)

[复制链接]
本帖最后由 zoologist 于 2021-4-6 21:13 编辑

声音,是物体振动产生的,通常情况下通过空气将震动传递到耳朵我们就能听到了声音。常见的喇叭就是一种将电能转换为机械能的器件。
FireBeetle 核心是 ESP32-WROOM-32D, 主控频率高达240Mhz,Flash Rom 16MB。这里介绍一种直接通过它来播放声音的方法。用这种方法可以直接通过喇叭来播放音乐,但是因为 ESP32 输出功率有限,直接推动喇叭产生的声音很小。为此,这里使用“Gravity:带功放喇叭模块”来实现更大的声音输出。
FireBeetle 直接放声(DAC篇)图1
基本原理是将数据存储在 FireBeetle Flash上,然后通过 ESP32 DAC直接输出之。
具体步骤如下:
第一步,将音乐转化为8位单声道。我是用 Golden Wave ,将罗大佑的 “恋曲1990.mp3“转为8000Hz 8 BitsWav 格式。
FireBeetle 直接放声(DAC篇)图2
Golden Wave 打开音频文件
FireBeetle 直接放声(DAC篇)图3FireBeetle 直接放声(DAC篇)图4
这里重新采样为8000Hz
FireBeetle 直接放声(DAC篇)图5
保存为8Bits单声道
FireBeetle 直接放声(DAC篇)图6
[img=623,328][/img]
重新加载处理后的 8000Hzm 8Bits Wave 音频数据
第二步,使用Bin2C将这个 Wav 生成C 语言的头文件。命令如下:
bin2c.exe -o audio.h 19908bits.wav
实际上数据中包含了 wav的文件头,但是因为数据量不大,对播放几乎没有影响,所以这里也没有额外处理。
FireBeetle 直接放声(DAC篇)图7
[img=624,179][/img]
这样,我们就有了这个歌曲的数据。特别需要注意的有下面两点:
1.     需要设置编译模式为  3MB APP/9MB FATFS 模式
FireBeetle 直接放声(DAC篇)图8
[img=624,234][/img]
2.     原始的 Wav 最好不要超过2.7MB(2,831,155.2Bytes, 0x2B3333Bytes),否则会超过最大程序的限制。这次我使用的 WAV 是 2,527,766 字节的,编译后结果如下:
Sketch uses 2746845 bytes (87%) of program storage space.Maximum is 3145728 bytes.
Global variables use 15372 bytes (4%) of dynamic memory,leaving 312308 bytes for local variables. Maximum is 327680 bytes.

第三步,我们需要一些基本的测试。首先,编写一个循环,使用dacwrite() 输出数值,输出2000000次花费了11102ms,也就是说一次 dac 输出需要花费0.005551ms。前面提到使用的Wav采样率是 8000Hz。这样一个周期是 1/8000=0.125ms 因此,为了重建一个声音,我们需要 0.125/0.005551=22.5184 dacwrite
第四步,编写代码:

  1. #include "audio\SoundData.h"
  2. void setup() {
  3. }
  4. void loop() {
  5.   for (unsigned int i=0;i<2527766;i++) {
  6.     for (int j=0;j<21;j++) dacWrite(25,WarOfWorldsWav[i]);
  7.   }
  8. }
复制代码
我们将音频数据放在audio目录下的SoundData.h文件中,这样每次Arduino打开ino 文件的时候并不会一起打开音频数据,否则因为音频数据很大,会耽误很多时间,有时候甚至会导致Arduino编译器崩溃。另外,和前面提到的22 dacwrite 不同,代码使用的是21次,因为for循环有一些开销,所以实际测量下来22次有一点点慢。
第五步,Gravity:带功放喇叭模块,上面有3个线,VCCGND 连接到 FireBeetle上,信号输入Pin连接到 FireBeetle D2 (IO25)
下载代码后即可播放出音乐了。
很明显,上述方法足够简单,能够存储2.7*1024*1024/8000=354秒的音频。在要求不高的场合下完全能够满足要求。

FireBeetle 直接放声(DAC篇)图9





zoologist  高级技匠
 楼主|

发表于 2021-4-6 21:14:05

工作的视频

回复

使用道具 举报

zoologist  高级技匠
 楼主|

发表于 2021-4-6 21:17:46

8 Bits WAV歌曲
下载附件19908bits.zip

完整的代码
下载附件8BitsWavDAC.zip
回复

使用道具 举报

佩恩1  见习技师

发表于 2021-7-7 16:26:51

这个音质惨不忍睹,基本只能尝尝鲜,做一些简单音效交互效果还可以
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail