搜索
bottom↓
回复: 38

LM3S9B96播放WAV I2S请教

[复制链接]

出0入0汤圆

发表于 2012-7-9 16:08:42 | 显示全部楼层 |阅读模式
本帖最后由 dudududu 于 2012-7-9 16:14 编辑

打算用IT的LM3S9B96做一个WAV播放器,现在的状态是MCU的I2S外设已调试通过,DMA功能也正常开启,能够正确输出虚拟的音频数据,下一步就是读取SD卡的WAV文件,然后I2S输出了;
有一个问题,就是看过网上WAV的文件格式解析,出去文件头,后面就是PCM数据,我是不是就直接将这些PCM数据按照规定的位宽和声道时序送给I2S输出就可以了,还是说需要对数据进行一些处理什么的,这里的PCM暂时只考虑未压缩的PCM;
因为在DAC芯片上看到,数据时带符号的,分正负,0x800000最小值,0x7FFFFF最大值,0x000000输出为0(中点),所以产生上面的疑问

本帖子中包含更多资源

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

x

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2012-7-12 08:25:20 | 显示全部楼层
沒有人搞过WMV的格式么?额看来还是要自己摸索啊

出0入0汤圆

发表于 2012-7-12 08:52:30 | 显示全部楼层
WAV不用做处理,可以直接送到DAC产生音频输出。因为PCM就是按照有符号数记录的。

出0入0汤圆

发表于 2012-7-12 09:47:54 | 显示全部楼层
想了解WAV头格式, 可以参考下边链接.
http://www.daubnet.com/en/file-format-riff
https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

出0入0汤圆

发表于 2012-7-12 10:23:26 | 显示全部楼层
当然,我一直得梦想是,用DSP处理一下,以获得自己喜欢的效果。可惜水平太菜……只是梦

出0入0汤圆

发表于 2012-7-13 17:58:57 | 显示全部楼层
DSP处理音效?

出0入0汤圆

 楼主| 发表于 2012-7-15 09:49:53 | 显示全部楼层
楼上两位,灰常感谢哈,
cheungman 给的链接看了下,全英文不过头文件网上资料也挺多,都了解的差不多了,关键就是后面的实体音频数据,说是PCM格式的,我的理解也是,读出来,就直接按照时序要求通过I2S丢给DAC,但是看LM3S9B96的TI例程,还做了些什么加减32768左右移位什么的,就把我搞糊涂了

出0入0汤圆

发表于 2012-7-15 11:22:48 来自手机 | 显示全部楼层
dudududu 发表于 2012-7-15 09:49
楼上两位,灰常感谢哈,
cheungman 给的链接看了下,全英文不过头文件网上资料也挺多, ...

移位可以做音量控制,但是会损失分辨率,不hifi

出0入0汤圆

 楼主| 发表于 2012-7-16 09:15:19 | 显示全部楼层
好吧,謝謝你的回答,我就按照原始数据试试,

出0入0汤圆

发表于 2012-7-16 09:20:59 | 显示全部楼层
windows媒体播放器抓轨的WAV文件,会多一些“chunk”出来,data chunk的位置不是固定的,软件要做相应搜索处理,否则你找不到data chunk。

出0入0汤圆

 楼主| 发表于 2012-7-16 16:47:20 | 显示全部楼层
了解,再次感谢!!

出0入0汤圆

发表于 2013-3-15 16:38:22 | 显示全部楼层
我现在调I2S接口的CODEC,我想验证DAC输出是否成功,我该怎么弄到“虚拟的音频数据”呢?

出0入0汤圆

 楼主| 发表于 2013-3-16 08:15:44 | 显示全部楼层
你可以自己做一个正弦波的数组,按照WAV的数据格式些就可以,不需要包含前面的各种chunk,直接些数据就好,
以24bitDAC为例输入I2S数据和输出模拟电压(电流)值的对应关系如下:
0x000000输出中点电压;0x7FFFFF输出正峰值,从0x000000到0x7FFFFF,输出线性增加;
0x800000输出负峰值,0xFFFFFF输出中点电压(略小一点点)从0x800000到0xFFFFFF,输出线性增加;

出0入0汤圆

发表于 2013-5-29 09:14:28 | 显示全部楼层
dudududu 发表于 2013-3-16 08:15
你可以自己做一个正弦波的数组,按照WAV的数据格式些就可以,不需要包含前面的各种chunk,直接些数据就好, ...

我最近也在做I2S播放WAV音频这个,我是把WAV文件格式的PCM码提取出来放入数组烧入程序,不知道是不是我的配置有没有问题,始终是滴这样的声音,根本不是我要的声音。wav文件的相关参数是单声道,采样频率是8KHz。不知道你把声音是如何调出来的?

出0入0汤圆

 楼主| 发表于 2013-5-30 19:00:02 | 显示全部楼层
zj5566.77 发表于 2013-5-29 09:14
我最近也在做I2S播放WAV音频这个,我是把WAV文件格式的PCM码提取出来放入数组烧入程序,不知道是不是我的 ...

如果是播放WAV文件的话,也是根据问价前面的数据判断找到PCM数据流的开始位置,然后就按顺序把数据读出来,丢给I2S外设,输出给DAC就可以了,和你这个流程一样的,如果一直是滴声,那是不是你提取的音频流数据太短,或者提取过程有问题,在这之前,首先要确保你的I2S外设调试好了,DAC配置正确

出0入0汤圆

发表于 2013-6-1 12:45:35 | 显示全部楼层
dudududu 发表于 2013-5-30 19:00
如果是播放WAV文件的话,也是根据问价前面的数据判断找到PCM数据流的开始位置,然后就按顺序把数据读出来 ...

感谢您的回复,提取音频流数,不知您是怎么操作的?能否告知一二。。我是按照定时中断发送的。在1ms时间内发送16个字节,1ms内产生16个中断,发送字节。不知道这样对不对。

出0入0汤圆

发表于 2013-6-1 13:49:17 | 显示全部楼层
dudududu 发表于 2013-5-30 19:00
如果是播放WAV文件的话,也是根据问价前面的数据判断找到PCM数据流的开始位置,然后就按顺序把数据读出来 ...

你的东东搞得如何了?

出0入0汤圆

 楼主| 发表于 2013-6-2 13:43:11 | 显示全部楼层
mowin 发表于 2013-6-1 13:49
你的东东搞得如何了?

哎,没搞了,9B96有点费电,不适合便携,并且也停产了,郁闷;
现在在学习STM32F4,看看能不能玩得转吧,这个比9b96省电一些,I2S质量也好一点,但是到现在为止,F4的SDIO和I2S外设都还没有搞定

出0入0汤圆

 楼主| 发表于 2013-6-2 13:48:30 | 显示全部楼层
zj5566.77 发表于 2013-6-1 12:45
感谢您的回复,提取音频流数,不知您是怎么操作的?能否告知一二。。我是按照定时中断发送的。在1ms时间 ...

看你的描述,你是自己有中断和定时器在模拟数字音频接口???
我用的是新片的I2S外设,然后数据的话,就是从WAV文件里面读出来直接就用了,严格一点将,在读取到WAV数据后,开始的一部分数据是需要分析解析的,里面包含了采样率、位宽和PCM数据开始的位置等等,不过如果是44100采样率16bit的文件,也可以跨过这一步,直接就把文件送给I2S输出,前面的文件头很小,也就几十个字节,有可能开始会有瞬间的噪声,无伤大雅,或者直接跳过第一个扇区,从第二个扇区开始输出,因为一般的歌曲刚开始都会有一段时间的静音,因为是16bit所以左右声道的数据刚好是一个扇区一个扇区对齐的。

出0入0汤圆

发表于 2013-6-2 23:14:55 | 显示全部楼层
dudududu 发表于 2013-6-2 13:48
看你的描述,你是自己有中断和定时器在模拟数字音频接口???
我用的是新片的I2S外设,然后数据的话,就 ...

您说的直接送I2S口是怎么回事,I2S口数据发送不是也有格式要求的。您是不是读取多少数据就送给I2S口多少数据?以8kHz采样频率的WAV文件,每次送给I2S口的数据量是多少呢?

出0入0汤圆

 楼主| 发表于 2013-6-3 11:23:38 | 显示全部楼层
zj5566.77 发表于 2013-6-2 23:14
您说的直接送I2S口是怎么回事,I2S口数据发送不是也有格式要求的。您是不是读取多少数据就送给I2S口多少 ...

额,这个问题难住我了
我不知道你用的什么芯片,有没有I2S接口,要是有的话,调试通了用起来应该很方便的;
通常我们会这么做,先要确保I2S接口能够跑起来,设置正确,然后开辟两块缓存,缓存的大小根据需要而定,单片机资源多的话,可以适当大一些,比如4096字节,也就是一个完整的簇,资源少的话(主要指RAM小)就512字节,刚好一个扇区;
缓存好了,就开始从SD卡读数据,放到第一个缓存里面,放满了,就可以把这个缓存的数据送给I2S外设,同时从SD卡读下一组数据放到第二个缓存,放满了就等待第一个缓存的数据被I2S调用完毕,然后交换地址,继续从SD卡读数据放到第一个缓存,而I2S从第二个缓存读数据,这就是乒乓模式,这里有一个前提,就是要确保你从SD卡读取数据的速度要比I2S调用数据的速度快,且快很多,不然数据就会断流,然后要么I2S停止了,要么出来的声音断断续续有噪音什么的;而且,最要是单片机有DMA这个东东,那就方便很多;
要是没有DMA,应该就要自己用定时器来一步一步的写读数据和输出数据,这个就很蛋疼的,但是也是可以办到的,坛子里有高手干过,用2051就能播放SD卡里面的WAV文件,大神额

出0入0汤圆

发表于 2013-6-3 11:55:35 来自手机 | 显示全部楼层
dudududu 发表于 2013-6-2 13:43:11

哎,没搞了,9B96有点费电,不适合便携,并且也停产了,郁闷;
现在在学习STM32F4,看看能不能玩得转吧,这个比9b96省电一些,I2S质量也好一点,但是到现在为止,F4的SDIO和I2S外设

我在玩LPC1768。刚弄好程序框架,已经可以出声,DAC暂时用伟良的TDA1541,如果你有兴趣,我可以把资料整理上来。另:NXP的I2S外设比ST的NC设计好多了,而且寄存器简洁而好用,这点,比ATMEL还好。建议你试试

出0入0汤圆

 楼主| 发表于 2013-6-3 17:33:14 | 显示全部楼层
mowin 发表于 2013-6-3 11:55
我在玩LPC1768。刚弄好程序框架,已经可以出声,DAC暂时用伟良的TDA1541,如果你有兴趣,我可以把资料整 ...

这个好啊,但是我只有一个LPC4357的开发板,就是KEIL出品的那个大板子,真心玩不转啊

出0入0汤圆

发表于 2013-6-3 18:09:37 | 显示全部楼层

先上源码。其他资料稍后。(原理图还没整理出来,目前是用杜邦线飞线测试的,开发板用这个,此处非广告,我与卖家无任何关系。LCD是320×240的,ILI9320,很有意思,用的是SPI接口。)

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2013-6-3 18:35:36 | 显示全部楼层
dudududu 发表于 2013-6-3 17:33
这个好啊,但是我只有一个LPC4357的开发板,就是KEIL出品的那个大板子,真心玩不转啊 ...

我刚才放狗搜了一下你那个板子,靠,好板啊!
没什么玩不转的,你把它当普通的M4玩,如果不用他的DSP,就当它是M3好了,我估计主要外设的使用方法跟LPC1768这类M3差不多的。同一家的MCU,外设是很相似的

出0入0汤圆

 楼主| 发表于 2013-6-3 18:53:07 | 显示全部楼层
本帖最后由 dudududu 于 2013-6-3 19:02 编辑
mowin 发表于 2013-6-3 18:35
我刚才放狗搜了一下你那个板子,靠,好板啊!
没什么玩不转的,你把它当普通的M4玩,如果不用他的DSP, ...


板子是很牛叉,不过芯片很贵的说,而且是BGA封装,搞起来了后面自己开板还是个麻烦事,恩,有时间了还是要好好玩玩的,你的资料先收下了,感激不尽啊
另外,我知道LM3S9B96的I2S其实质量不咋地,jitter在3个ns规格,STM32F4的话,jitter标称为<±200ps,不知道NXP的I2S质量怎样,数据手册里面好像灭有找到

出0入0汤圆

发表于 2013-6-3 19:40:32 | 显示全部楼层
从机模式啊,大哥,外部提供BCK/WS,同步传输哪有JITTER?

出0入0汤圆

发表于 2013-6-3 20:20:56 | 显示全部楼层
不错。

出0入0汤圆

 楼主| 发表于 2013-6-3 21:09:35 | 显示全部楼层
mowin 发表于 2013-6-3 19:40
从机模式啊,大哥,外部提供BCK/WS,同步传输哪有JITTER?

哦哦,搞STM32时间长了,把这茬给忘记了,面壁去

出0入0汤圆

发表于 2013-6-3 23:54:10 | 显示全部楼层
mowin 发表于 2013-6-3 11:55
我在玩LPC1768。刚弄好程序框架,已经可以出声,DAC暂时用伟良的TDA1541,如果你有兴趣,我可以把资料整 ...

去TB查了下1541,竟然要30块一片,吓到了。。

出0入0汤圆

发表于 2013-6-3 23:59:17 | 显示全部楼层
mowin 发表于 2013-6-3 19:40
从机模式啊,大哥,外部提供BCK/WS,同步传输哪有JITTER?

请教一下,NXP的I2S接口中TX_SCK,TX_WS,TX_SDA,TX_MCLK哪些是必须要接的,我只需要放音就行了,目前接的是欧胜的WM8750

出0入0汤圆

发表于 2013-6-4 09:21:39 | 显示全部楼层
SNOOKER 发表于 2013-6-3 23:59
请教一下,NXP的I2S接口中TX_SCK,TX_WS,TX_SDA,TX_MCLK哪些是必须要接的,我只需要放音就行了,目前接的 ...

我看了规格书,对于WM8750只放音,TX_BCK/WS/SDA/MCLK都是必须的。

有一点,BCK/WS/SDA无论神马DAC都是必须的。如果有数字滤波器,就需要MCLK。
多比特R-2R DAC像TDA1541/TDA1543/AD1865/PCM63/PCM1702/PCM1704这些,不加数字滤波器时,没有MCLK也能工作。玩法很多,包括很多人都推崇的non-oversampling + unfiltered,比较有趣,适合折腾用。现代dac通常是sigma-delta调制器,而且通常内置数字滤波器,MCLK是必须的。

出0入0汤圆

发表于 2013-6-4 09:24:08 | 显示全部楼层
本帖最后由 mowin 于 2013-6-4 09:36 编辑

这是老外折腾DAC的一篇文档,供各位参考,不一定直接能用上,但是方法和一些理念可以借鉴

这是网站http://tech.juaneda.com/en/projects/digitaldecoder.html

编辑:增加图片

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2013-6-4 19:26:21 | 显示全部楼层
mowin 发表于 2013-6-4 09:21
我看了规格书,对于WM8750只放音,TX_BCK/WS/SDA/MCLK都是必须的。

有一点,BCK/WS/SDA无论神马DAC都是 ...

多谢热心大侠指点

出0入0汤圆

 楼主| 发表于 2013-6-5 08:29:34 | 显示全部楼层
mowin 发表于 2013-6-4 09:24
这是老外折腾DAC的一篇文档,供各位参考,不一定直接能用上,但是方法和一些理念可以借鉴

这是网站http:// ...

他妹的,这老外太能折腾了!!

出0入0汤圆

发表于 2013-6-5 10:08:28 | 显示全部楼层
我觉得他的无负反馈I/V变换电路很不错,准备效仿。

出0入0汤圆

 楼主| 发表于 2013-6-5 12:59:13 | 显示全部楼层
mowin 发表于 2013-6-5 10:08
我觉得他的无负反馈I/V变换电路很不错,准备效仿。

在哪儿??链接里面我怎么没有看到呢??

出0入0汤圆

发表于 2013-6-5 13:43:01 | 显示全部楼层
dudududu 发表于 2013-6-5 12:59
在哪儿??链接里面我怎么没有看到呢??

PDF文件里面最后。

出0入0汤圆

发表于 2013-6-12 09:36:49 | 显示全部楼层
本帖最后由 xieyudi 于 2013-6-12 09:41 编辑

找"data"字段, 后面跟了32位小端整数代表data chunk的长度, 从那之后就是PCM数据了.

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

本版积分规则

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

GMT+8, 2024-5-15 06:43

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

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