打印

MSP430+znFAT文件系统+SD卡+TLC5615(DAC或PWM) 实现 wav音频播放

[复制链接]
9577|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
znmcu|  楼主 | 2012-9-3 00:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 znmcu 于 2012-9-3 08:53 编辑

============================================
振南的znFAT   单片机上的FAT32文件系统
关注znFAT   加入QQ106889506
============================================
源代码下载: 430.zip (562.41 KB)
znFAT移植与应用手册: znFAT移植与使用手册.pdf (285.28 KB)
============================================
实验演示视频:
   1http://v.youku.com/v_show/id_XNDQ2MDczNTYw.html
   2http://v.youku.com/v_show/id_XNDQ2MDcyMDM2.html
   3http://v.youku.com/v_show/id_XNDQ2MDcwMTY4.html
============================================

wav文件,想必很多人都很熟悉,它被称为“波形文件”,用于存储音频数据。Wav这种音频格式记录的就是原始的声波信号的采样电压(PCM),因此我们可以把它的数据直接送到DAC,就可以播放出声音,而不需要任何的解码。

wav文件的缺点是数据量比较大,这是因为它的数据没有经过压缩处理(其实有些wav文件也是经过压缩的,压缩算法是ADPCM,不过它的压缩强度比较弱,远比不上像MP3WMA那样的高强度压缩算法)。
这里我们就使用
MSP430 单片机来作一个wav音频播放实验,DAC芯片使用TLC5615430单片机的型号为F149,它没有片内DACF16X的芯片有)。wav文件的存储我们使用SD卡。


如何从SD卡中读取WAV文件?这将涉及FAT32文件系统的相关内容。要正确的读到文件的数据,我们就必须遵循FAT32文件系统的格式协议。FAT32文件系统是比较复杂的,在编程实现上难度是很大的。振南长期研究和编写的znFAT,其实就是在实现对FAT32文件系统的各种文件操作。通过它,可以轻松完成对文件数据的读取
文件数据的读取其实是此实验的一大重点,也是难点。除此之外的工作其实就比较简单了,直接把读到的数据“扔”给TLC5615即可
把数据送给TLC5615还原为电压,进而拟合出声音信号。这里有一个问题!一个是采样频率、另一个是采样精度。采样频率是指每秒对原始声波信号的采样次数,比如一个wav文件的采样率为16kHz,即每次采样16000次。我们在将数据送给DAC芯片TLC5615时,自然也要按照这个频率,否则声音将或快或慢,造成失真。很显然,声音采样频率越高,wav文件的数据量也就越大。另一方面,采样精度也影响着数据量的大小,采样精度其实就是在对原始声音信号进行采样时所使用的ADC的位数,比如8位、16位、24位等。当然,这个位数越高,数据量就越大,同时声音的质量也就越高。综上所述,如果一个wav采样频率高,同时采样精度也高,那么它可能就是一个具有高保真音质的文件了。
我们希望我们的“wav音频播放器”可以放出最好的声音,究其实质是对原始声音信号还原的能力较强。这就需要一个音频质量较高的wav文件,这样一个问题又产生了:“wav的数据量如果比较大的话,我们实际读取文件数据的速度能不能跟得上?


MSP430单片机是以超低功耗著称的,但在一定程度上它是以牺牲主频和速度为代价的!这注定了,在MSP430单片机上,我们可能达不到太高的数据读取速度。采用IO模拟SPI驱动SD卡,8M的晶振,实际测得的数据读取速度为25KB/S。在这种情况下,我们只能酌情降低一些wav文件的质量。我们采用4KHz的采样率、8位采样精度,单声道。这样的音频质量可能不会太好,但起码能有一个差不多的声音出来。我们这也只是一个测试性的实验!
实际,如果你想作出高质量的声音,就请换用更高性能的CPU,更好的DAC,当然还有高质量的wav文件。
现在的问题又出现了:“到哪里去获取4K采样率、8位精度的单声道的wav音频文件呢?”我们可以使用cooledit软件来进行转换。





实现的主要代码(znFATwav文件数据送给DAC的实现采用znFAT的数据重定向功能,而非通过缓存中转方式)。


int main(void)
{
//IO设置

UART_Init();

znFAT_Select_Device(0,&Init_Args); //选择设备

res=znFAT_Init(); //文件系统初始化

//输出文件系统相关信息

if(!znFAT_Open_File(&fileinfo,"/test.wav",0,1)) //打开wav文件
{
  //输出文件相关信息
  
  znFAT_ReadDataX(&fileinfo,0,fileinfo.File_Size); //数据读取,通过重定向直接送向TLC5615
}

znFAT_Close_File(&fileinfo);

znFAT_Flush_FS();

return 0;
}
硬件实验平台:





相关帖子

沙发
dong_abc| | 2012-9-3 00:15 | 只看该作者
半夜发贴,顶一下。

使用特权

评论回复
板凳
znmcu|  楼主 | 2012-9-3 00:36 | 只看该作者
呵,现在不发,就得等明天晚上再发了。白天忙,没时间发。

使用特权

评论回复
地板
znmcu|  楼主 | 2012-9-3 00:54 | 只看该作者
各种流行cpu内核的znfat文件系统应用实例。

使用特权

评论回复
5
yiwanfuweng| | 2012-9-3 22:24 | 只看该作者
顶起来!! 默默支持!! zn:@

使用特权

评论回复
6
yiwanfuweng| | 2012-9-3 22:24 | 只看该作者
顶起来!! 默默支持!! zn:@

使用特权

评论回复
7
zhongfushun| | 2012-9-10 19:32 | 只看该作者
支持ZN

使用特权

评论回复
8
永远的不知| | 2012-9-17 12:31 | 只看该作者
好dd,楼主转一份到TI MCU版块吧。

使用特权

评论回复
9
yewuyi| | 2012-9-17 14:03 | 只看该作者
在BBS里面老是发这样类似的主题帖很有玩吗?

很有意思吗?

难道真的以为巡查员会不停的迁就你?

使用特权

评论回复
10
yewuyi| | 2012-9-17 14:05 | 只看该作者

使用特权

评论回复
11
张颖豪01| | 2012-11-17 20:38 | 只看该作者
哈哈,学习了

使用特权

评论回复
12
zhhbncwu| | 2012-11-19 10:12 | 只看该作者
楼主专注于znFAT文件系统+SD卡得应用开发

使用特权

评论回复
13
cthan| | 2013-1-18 11:20 | 只看该作者
学习了  不知道LZ有没ADPCM方面的知识能共享的啊:)

使用特权

评论回复
14
眼不见心不烦| | 2013-1-29 14:43 | 只看该作者
LZ你的IAR版本是多少的 我用5.20的打不开工程

使用特权

评论回复
15
wawb359| | 2013-5-16 19:50 | 只看该作者
好东西,能有电路图就更好了

使用特权

评论回复
16
wxd7026| | 2013-5-30 10:44 | 只看该作者
我在论坛里无意间看到楼主 小弟也在做一个把430f149的ad数据存到sd卡中的设计 各种没成功 看到楼主就是看到了希望 您那个avr存ad数据的程序怎么能移植到f149里面呢  跪求啊

使用特权

评论回复
17
木小瓷0512| | 2013-6-22 01:50 | 只看该作者
   学习了   

使用特权

评论回复
18
wangjie1986| | 2013-8-9 17:00 | 只看该作者
感谢楼主分享

使用特权

评论回复
19
w521791| | 2013-8-18 07:09 | 只看该作者
很好的代码

使用特权

评论回复
20
ayumiymk| | 2013-8-29 11:28 | 只看该作者
这个zn是个人?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:振南的znFAT -- 单片机上上的FAT32文件系统 www.znmcu.cn

4474

主题

5195

帖子

33

粉丝