搜索
bottom↓
回复: 17

读取STM32中的Flash音频数据并播放

[复制链接]

出0入10汤圆

发表于 2015-9-20 21:46:26 | 显示全部楼层 |阅读模式
本帖最后由 10xjzheng 于 2015-9-20 21:51 编辑

之前有人说我的一个帖子是炫耀帖,也谈不上炫耀,也就是这里交流的气氛很好,给大家看看,有什么可炫耀的。我能放源码的一定会放,不放可能是公司的限制等原因,但是我有时间的情况下也一定会讲下思路,其实讲下思路有时候也是够了。这个帖子也不会放源码,只是稍微简单讲下思路,有什么问题下面提问就好了。
首先上视频,播放音频,是一段音乐前面的鸟声,旁边的大叔居然以为我养了什么鸟在叫,哈哈。里面还有我上上个帖子跟网友借的逻辑分析仪,非常感谢!
http://v.youku.com/v_show/id_XMTM0MDc0NTY2MA==.html
做这个实验的原因是因为领导叫我搞下mp3实验做下解码测试,由于SD卡模块还没有到,就先做后面PCM->DAC部分,DAC的芯片用的是PCM1770。先写好当然是要好好测试下啦,反正也挺好玩的。
我首先用winhex软件提取WAV文件中的pcm数据,WAV是原始的,未经压缩的音频文件,文件头说明了采样率,左右声道等,后面的全都是PCM数据,所以只要提取出来播放就好了。
歌曲名字:Bandari - 寂静之声 - 班得瑞

然后未经压缩的数据量是很大的,一首歌双声道的要30多M,我的数据全部放在stm32的flash里面,flash才512K,所以算下来也就几s的声音。
我就是定义了一个常量数组,MDK编译器将其放到了Flash。
  1. const unsigned char SoundData[TOTAL_SOUND_DATA] = {
  2.         0x00, 0x20, 0x55, 0x02, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
  3.         0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4.         0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
  5.         0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
  6.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
  7.         0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
  8.         0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00...
复制代码

看到这里有些坛友不知道会不会不寒而栗,难道几百KByte的数据我都是手动加上逗号的,500*1024=50w个啊!!一开始我也是有点醉的!但是WinHex的作者很人性化啊,膜拜,他的复制菜单里面有个选项是可以选复制成C代码的。

然后调PCM1770,通过IIS-DMA传输音频数据,还有一个三线接口进行控制,大家去看手册就知道了。IIS传输给DAC芯片之后,通过功放然后输送到喇叭即可。
下面留下一个问题,我在想可不可以用STM32内部的DAC进行数模转化?应该是可以的,不过精度下降了,因为音频数据大多是16位的,而STM32的DAC只有12位好像,不知道有没有记错。
另外,我的一个跟音频相关的信号(IIS的主时钟,采样频率的256倍)大概是12M,如果接上逻辑分析仪就不会有噪音,不然就会有,然后我用手碰那个管脚也不会有噪音,拿开就会可能是什么原因?

本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2015-9-20 23:07:35 来自手机 | 显示全部楼层
传说中的沙发。谢谢楼主分享。

出0入0汤圆

发表于 2015-9-21 08:35:51 | 显示全部楼层
为什么双声道的文件更大,我的认为是,两个喇叭,并在一起,就是双声道。

出0入10汤圆

 楼主| 发表于 2015-9-21 08:42:19 | 显示全部楼层
沉默胜过白金 发表于 2015-9-21 08:35
为什么双声道的文件更大,我的认为是,两个喇叭,并在一起,就是双声道。 ...

一个声道采集一路数据!两个声道就两路

出0入0汤圆

发表于 2015-9-21 09:17:04 | 显示全部楼层
10xjzheng 发表于 2015-9-21 08:42
一个声道采集一路数据!两个声道就两路

为什么不是只采一路,把两个喇叭接在一起。这样还可以节省大约一半的空间。

出0入10汤圆

 楼主| 发表于 2015-9-21 09:31:08 | 显示全部楼层
沉默胜过白金 发表于 2015-9-21 09:17
为什么不是只采一路,把两个喇叭接在一起。这样还可以节省大约一半的空间。 ...

你知道什么叫立体声吗?

出0入0汤圆

发表于 2015-9-21 09:58:36 | 显示全部楼层
HxD更好用,DAC你是用哪颗

出0入10汤圆

 楼主| 发表于 2015-9-21 10:00:24 | 显示全部楼层
sanger 发表于 2015-9-21 09:58
HxD更好用,DAC你是用哪颗

PCM1770,有空还想用下STM32内部的DAC试试

出0入0汤圆

发表于 2015-9-21 10:03:21 | 显示全部楼层
10xjzheng 发表于 2015-9-21 09:31
你知道什么叫立体声吗?

不知道,,,你厉害,你解释下呗。。。

出0入10汤圆

 楼主| 发表于 2015-9-21 10:05:03 | 显示全部楼层
沉默胜过白金 发表于 2015-9-21 10:03
不知道,,,你厉害,你解释下呗。。。

这也不是厉害,自己好好百度下。

出0入0汤圆

发表于 2015-9-21 10:09:20 | 显示全部楼层
10xjzheng 发表于 2015-9-21 10:05
这也不是厉害,自己好好百度下。

。。。真是大师级人物,点到为止。谢谢。

出0入0汤圆

发表于 2015-9-21 13:05:00 | 显示全部楼层
额,我最近也在32播WAV我用的是32自带的DAC好像还不错
另外wav转数组我找到一个比较好用的软件共享下

本帖子中包含更多资源

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

x

出0入10汤圆

 楼主| 发表于 2015-9-21 14:56:25 | 显示全部楼层
小Simon 发表于 2015-9-21 13:05
额,我最近也在32播WAV我用的是32自带的DAC好像还不错
另外wav转数组我找到一个比较好用的软件共享下
...


谢谢分享!有空我也用下32的DAC,一个12位,一个16位。你是买的功放模块吗?有推荐吗?

出0入0汤圆

发表于 2015-9-22 09:35:01 | 显示全部楼层
10xjzheng 发表于 2015-9-21 14:56
谢谢分享!有空我也用下32的DAC,一个12位,一个16位。你是买的功放模块吗?有推荐吗? ...

我只播两句话,对音质没什么要求所以用的8位的,功放也是随便搭了个lm386,哈哈

出0入0汤圆

发表于 2015-9-22 11:58:14 来自手机 | 显示全部楼层
8位DAC应付语音够好了。STM32F103C8外面接个R2R就行。

出0入0汤圆

发表于 2015-9-22 12:19:48 | 显示全部楼层
我以前做过ADPCM编码,8k*8bit,压缩后人声还可以。

出0入10汤圆

 楼主| 发表于 2015-9-22 15:18:10 | 显示全部楼层
小Simon 发表于 2015-9-22 09:35
我只播两句话,对音质没什么要求所以用的8位的,功放也是随便搭了个lm386,哈哈 ...

嗯嗯,8bit少很多数据,可以参考!

出0入10汤圆

 楼主| 发表于 2015-9-22 15:23:10 | 显示全部楼层
zhiwei 发表于 2015-9-22 12:19
我以前做过ADPCM编码,8k*8bit,压缩后人声还可以。

百度一下ADPCM:
ADPCM是通过两个相邻采样计算出预测值, 再将预测值与下一个采样之差与预先设定的比例因子表中相近的那个因子作运算, 得到一个相比原始数据小很多的结果并储存, 这个结果以多少位保存可以事先设定, 设定得较小如4bit或8bit就可达成很高的压缩比, 因为体积计算公式里每次采样的保存位被大大减小,播放时再以逆运算重建波形.
但预测值与下一个采样之差, 与比例因子的运算结果无法保证不会溢出事先设定的保存位. 一旦发生这样的情况, 计算值就会被裁剪记录为保存位的最大值或最小值, 这样就产生了不可逆的误差, 也就无法100%重建原始的数据了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-28 19:36

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

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