搜索
bottom↓
回复: 21

请教一个问题:我做了一个WAV播放器,但是大约每3秒有一次爆音

[复制链接]

出0入0汤圆

发表于 2009-7-16 22:57:23 | 显示全部楼层 |阅读模式
耽误大家时间看一下我的问题


我做了一个WAV播放器,但是大约每3秒有一次爆音

结果发现是:

44100 x3 =132300        (采样率是44100,3秒就是132300个周期)

8x(512/4)x128 = 131072  (每簇8个族,每个FAT表扇区有512个簇的记录,每扇区512个字节,1个周期发送4个字节)

差不多就是读下一个FAT表的扇区 的时候发生爆音,应该归结为

该间隙需要读取FAT表,读取数据扇区 2次通过SPI对SD卡做数据交换造成的。



大家有什么高招? 敬请高手指条路子~~~~~~

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

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

出0入0汤圆

发表于 2009-7-16 23:39:11 | 显示全部楼层
用CMD18读长块~~
哈.不过卡的内容要有顺序~..

出0入0汤圆

发表于 2009-7-17 00:54:55 | 显示全部楼层
中间加缓冲

出0入0汤圆

发表于 2009-7-18 11:40:12 | 显示全部楼层
电路怎么架构的,说来听听.
读SD卡可分两步走,先发读卡命令,运行到等SD返回FE的响应令牌,进入数据时相时,别死等,去送WAV的数据,送一阵子,回过来检查SD卡状态,肯定返回FE了,这时候,直接读数据.

出0入0汤圆

 楼主| 发表于 2009-7-30 08:27:43 | 显示全部楼层
先读取 2k数据给 DMA-SRAM-1(1k),DMA-SRAM-2(1k), DMA先吧DMA-SRAM-1发送给I2S接口,完成后S=1,接着发送DMA-SRAM-2(1k) (乒乓模式)。

主程序
循环{

if S=1 {
读取1K数据给非工作状态的DMA-SRAM,必要时候查询FAT1表得到下一个簇的位置(爆音),假如读到是0FFFFFFF则跳出停止
//实时显示时间(爆音),每86次S=1,则输出一次时间计算(猛爆音)
s=0
}
其他按钮(播放,停止,进1,退1,暂停)

}

出0入0汤圆

发表于 2009-7-30 11:40:03 | 显示全部楼层
先拿掉一些无关的操作,比如显示时间,让MCU全速专心播放WAV试试.
MCU加速试试.超外频或倍频.

出0入0汤圆

 楼主| 发表于 2009-7-30 16:35:40 | 显示全部楼层
测试直读SD卡扇区播放(一周期读两次扇区)没有爆音,而应用FAT系统(一周期读三次扇区)有爆音。

考虑到SPI最大只能跑10MHZ,不知是否太慢了?

出0入0汤圆

发表于 2009-7-30 17:33:05 | 显示全部楼层
写个简单的程序测一下MCU经过文件系统读取SD卡上文件的速度,如果有200KB/s以上的速度就肯定不会卡,理论上讲10MHz的SPI绝对够用。

出0入0汤圆

 楼主| 发表于 2009-7-31 17:22:42 | 显示全部楼层
找到问题了,

假如 连续读取  扇区A A+1 A+2 那么速度> 333kB/s

读取的扇区号差别太大,那么速度<120kB/s

有办法解决么~

出0入0汤圆

发表于 2009-8-1 10:59:19 | 显示全部楼层
有办法,播放之前先建索引表.把一个文件系统中连续的数据扇区记下起始扇区号+长度.弄个10个表项就差不多了.全新格式化的SD卡是连续的,只占一个表项,有碎片的通常3-5个,如果一个文件的数据体被分配到不连续的10个区间以上.那只能建议用户进行磁盘碎片整理了.
有索引表的文件读,速度等同于A,A++.......无需读FAT表定位下一簇的操作.

楼主能把硬件平台讲讲吗,应该是个带I2S的高档单片机+I2S接口的Music enCode架构吧.

出0入0汤圆

发表于 2009-8-1 11:16:26 | 显示全部楼层
【14楼】 90999
假如 连续读取  扇区A A+1 A+2 那么速度> 333kB/s
读取的扇区号差别太大,那么速度<120kB/s

如果是这样,这文件系统效率也太低了吧。试试那种FAT表和数据各自独立使用buffer的程序,带I2S接口又带DMA的MCU应该不差这512Byte的RAM。

出0入0汤圆

 楼主| 发表于 2009-8-1 16:19:38 | 显示全部楼层
平台是 DSPIC33

DMA-SRAM有2K,我都分配给I2S喂数据了~~~~实际上,1K就足够做乒乓了~~~

每次喂1个扇区给乒,然后乓给I2S喂数据~

所有代码都是自己写的~~~

虽然我知道C30有FAT库,第三方的有FATFS,不过我不懂C的,只能用简单的BASIC拼凑一个简单的播放器。



314forever ,我看过你的 SPI转I2S接口文章,里面关于这种方法挑DAC的说法,实际上是DAC对不同I2S接口的支持有差异

一般人为认定标准的是BCK=64FS的,这个标准几乎所有DAC都可以支持,非标准的有BCK=48FS的(支持16bit,24bit),BCK=

32FS(仅支持16bit),而且所使用的MCK也有对应差异,BCK=64FS的,MCK可以支持64(部分)-96(部分)-128-256-384

(部分)-512-768(部分)这些奇数偶数倍的,而BCK=48FS 的,MCK需要96-192-384这种奇数倍,而BCK=32FS的,MCK需要

128-256-512这种偶数倍的,而且不同的DAC都不同~~~~

出0入0汤圆

 楼主| 发表于 2009-8-2 08:44:26 | 显示全部楼层
好~解决了,具体是

1次读取1K数据,DMA 1K 1k(共2k) 分别作乒乓,按照FAT32的4K一簇读取数据

第0次 读取0,1扇,第1次 读取2,3,6扇,第2次 读取4,5,7扇,第4次 读取FAT扇,并计算下一簇开始位置,MEMCPY,6扇,7扇

A.弥补了 SD随机读取性能不高的缺点
B.SPI只要要达到15Mbps以上
C.暂时只针对4K簇,如果是8K簇,16K簇 32K簇,只要在 第-3次 之前添加就好~~~~
PS : 因为SD v1 基本不会有人买到完全的8G卡(最多7.8G这样), 也没有必要使用8k簇~~

出0入0汤圆

发表于 2009-8-2 11:33:56 | 显示全部楼层
哈哈,解决了就好,能放44.1K采样,16位立体声的WAV文件吗?码
流在1Mbps以上.

出0入0汤圆

 楼主| 发表于 2009-8-3 18:39:24 | 显示全部楼层
可以的,但是SPI-SD接口我还是不太熟悉,写得很垃圾,否则可以直接上16bit 96khz,但是24bit就不行~考虑到单单提高采样率没有多少效果,说以还是限定到16-44。

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

本版积分规则

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

GMT+8, 2024-5-12 12:11

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

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