amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 28983|回复: 190

如何实现一个最便宜的WAVE播放器------方案征询与讨论

[复制链接]
发表于 2010-9-25 11:16:41 | 显示全部楼层 |阅读模式
设计一个WAVE播放器,能流畅的播放44.1khz,16位,双通道CD音质的WAV文件。播放的WAV文件在DS/MMC卡上(挑战MP3播放器)。

基本要求为:
1。MCU通过SPI口读取DS/MMC卡上的文件
2。核心系统成本最优化,只需要一片MCU,和SD卡座(LPF、功放,卡,电源、按键、LED指示等不计成本,这些DD任何播放器都需要),采用PWM方式实现D/A转换,不需要外接D/A电路,成本控制在8元左右。


应用对象,公交报站,高档电梯,高档仪器设备的语音帮助提示.....
发表于 2010-9-25 11:21:07 | 显示全部楼层
http://elm-chan.org/works/sd8p/report.html
发表于 2010-9-25 11:25:04 | 显示全部楼层
PWM D/A有必要放44.1k 16-bit立体声WAVE么?
 楼主| 发表于 2010-9-25 12:34:25 | 显示全部楼层
回复【2楼】gzhuli 咕唧霖
pwm d/a有必要放44.1k 16-bit立体声wave么?
-----------------------------------------------------------------------
44.1k 8-bit 偶已经实现了,音质已经非常可以了


回复【1楼】 h2feo4 无机酸
-----------------------------------------------------------------------
偶的方案基本上就是按这个实现的。

========================================================================
这个方案中对16位HI-FI的处理采用两个8位PWM叠加的方式,总觉的不完善。。。。

所以放16位是个挑战,看有否更好的办法来实现。。。。我也在思考中。。。。其它都没有问题了。

顺便提一句,M051提供的FS参考代码中,就包含了那个FatFs,我用的是Petit FatFs
 楼主| 发表于 2010-9-25 12:41:31 | 显示全部楼层
如果用16位的PWM实现44K的DA,那么定时器时钟要达到2884M!
而用8位PWM实现44K的DA,定时器时钟只要达到12M就可以了,这个很容易实现的。
所以要另外考虑的。
发表于 2010-9-25 12:54:08 | 显示全部楼层
16位啊,还是DAC方便些吧。
PT8211/TM8211之类的音频DAC可以实现立体声16位192K采样速率,192K采样速率时定时器时钟只要达到18.4MHz就可以了。
价格:0.5元,未必比PWM差。
只不过,这些东西是I2S接口的,需要用SPI模拟一下了。
发表于 2010-9-25 13:04:37 | 显示全部楼层
如果对音质要求不高,山寨厂的ASIC方案应该是具性价比的,
发表于 2010-9-25 13:15:16 | 显示全部楼层
mark
发表于 2010-9-25 13:31:13 | 显示全部楼层
mark
发表于 2010-9-25 13:36:03 | 显示全部楼层
最近WAVE播放器有点火呢。
 楼主| 发表于 2010-9-25 13:53:43 | 显示全部楼层
楼上的“头像”很有特色,一看就是电子高手。

WAVE播放器东西不多,但涉及的技术要求不低,操作SD卡、掌握文件系统,实现AD转换,还要能流畅播放。够认真学一段时间的。
发表于 2010-9-25 13:58:35 | 显示全部楼层
我本来想用STM32做个了,但是DA是12位的,芯片又贵,所以也没激_情了
发表于 2010-9-25 14:02:07 | 显示全部楼层
我看这个重任交给M051怎么样
发表于 2010-9-25 14:02:09 | 显示全部楼层
回复【11楼】kdtcf 春风
我本来想用stm32做个了,但是da是12位的,芯片又贵,所以也没激_情了
-----------------------------------------------------------------------

STM32有I2S,直接带个CS4344就搞定了。
发表于 2010-9-25 14:05:39 | 显示全部楼层
回复【10楼】machao
-----------------------------------------------------------------------

头像是在网上看到的,那是什么高手,连低手都算不上。
马老师进攻M051了呀,期待大作。
发表于 2010-9-25 14:07:36 | 显示全部楼层
回复【13楼】 gzhuli 咕唧霖

stm32有i2s,直接带个cs4344就搞定了。
-----------------------------------------------------------------------

CSA4334我有啊,哪天试一下,用最贱的STM32搭配CS4334,我看肯定行,虽然成本高了点,可是这可是CD一级的音质啊,而且录音用电脑录制,随意加混响和各种效果,随意剪辑随意拼接。
发表于 2010-9-25 14:07:43 | 显示全部楼层
回复【4楼】machao  
如果用16位的pwm实现44k的da,那么定时器时钟要达到2884m!

-----------------------------------------------------------------------

对于固定的时钟,PWM的精度和载频是“矛盾”的,这是个非常头疼的问题

(马老师说的两个PWM叠加,得到的应该是9位精度,而不是16位。。)

有哪位大侠有解决或者“缓解”这种矛盾的方案吗?

非常期待。。。
发表于 2010-9-25 14:23:23 | 显示全部楼层
回复【16楼】roseason
-----------------------------------------------------------------------

两个8位PWM叠加可以得到16位精度的,这里有篇文章讲怎么用2个8位PWM实现16位DAC:点击此处下载 ourdev_585525XSR3YE.pdf(文件大小:259K) (原文件名:93004di.pdf)


文章截图 (原文件名:1.png)
发表于 2010-9-25 14:32:25 | 显示全部楼层
回复【17楼】gzhuli  咕唧霖
-----------------------------------------------------------------------

谢谢!留着怀疑,回去研究一下。。。
发表于 2010-9-25 14:48:44 | 显示全部楼层
回复【楼主位】machao

应用对象,公交报站,高档电梯,高档仪器设备的语音帮助提示.....

-----------------------------------------------------------------------

用在语音提示的场合,没必要这么高的音质吧
发表于 2010-9-25 14:51:25 | 显示全部楼层
回复【18楼】roseason
回复【17楼】gzhuli  咕唧霖
-----------------------------------------------------------------------
谢谢!留着怀疑,回去研究一下。。。
-----------------------------------------------------------------------

其实原理很简单,一个3.92k电阻,一个1M电阻,两个电阻的阻值相差约255倍,理论上叠加起来就有16位分辨率了。
那篇文章搞那么多东西,主要是为了减少HC04内阻影响,并且要减小稳定时间,降低纹波,达到真正的16位精度。
这个电路是火星探测器用的,NASA对元件选型有限制(可靠性、抗辐射等),不能用普通的16位DAC,所以作者才出此“下”策。
发表于 2010-9-25 15:17:39 | 显示全部楼层
匪夷所思
发表于 2010-9-25 15:24:35 | 显示全部楼层
回复【20楼】gzhuli  咕唧霖

其实原理很简单,一个3.92k电阻,一个1m电阻,两个电阻的阻值相差约255倍,理论上叠加起来就有16位分辨率了。
那篇文章搞那么多东西,主要是为了减少hc04内阻影响,并且要减小稳定时间,降低纹波,达到真正的16位精度。
这个电路是火星探测器用的,nasa对元件选型有限制(可靠性、抗辐射等),不能用普通的16位dac,所以作者才出此“下”策。
-----------------------------------------------------------------------

你说的我都看懂了,可是问题不在这啊,我仍然觉得他这个电路是有问题的!

你看啊,假设两路PWM都输出50%的占空比,那么这个电路的输出电压应该是精确的50%Vref,但此时的的寄存器值可不是FFFF的50%哦。。。

不知道是不是我哪里还理解错了,希望你解释一下。。
发表于 2010-9-25 16:07:22 | 显示全部楼层
mark
发表于 2010-9-25 16:11:59 | 显示全部楼层
PWM0 -> HighByte(Data) = (5/256)N  \
                                     (+) -->
PWM1 -> LOWByte(Data) = (5/65536)N /

如果有DA的话,用1个PWM来补足DA的位数也是有的。
我见过有用12bit DA得到12个bit,然后PWM生成剩下的4个bit。

先例是PCM67, 10bit DA + 1bit PWM 。
发表于 2010-9-25 16:36:08 | 显示全部楼层
看看
发表于 2010-9-25 16:43:02 | 显示全部楼层
回复【22楼】roseason
你说的我都看懂了,可是问题不在这啊,我仍然觉得他这个电路是有问题的!
你看啊,假设两路pwm都输出50%的占空比,那么这个电路的输出电压应该是精确的50%vref,但此时的的寄存器值可不是ffff的50%哦。。。
不知道是不是我哪里还理解错了,希望你解释一......
-----------------------------------------------------------------------

两路PWM都输出50%占空比,输出的不是50%VREF啊,之所以那个电阻比例是1/255而不是1/256,就是因为一个PWM输出50%(0x7F),一个输出100%(0xFF),才是50%VREF。文章里面有写公式:输出 = VREF * (PWM0 + 255 * PWM1) / 256



回复【24楼】90999 张耀扬
-----------------------------------------------------------------------

PHILIPS当初提出的CD方案就是14位DAC + PWM成16位的,当时不叫PWM,叫dithering。DAC原型都做出来了,后来被SONY毙了。
发表于 2010-9-25 16:44:31 | 显示全部楼层
回复【24楼】90999 张耀扬
-----------------------------------------------------------------------

呵呵,楼上可以假设,高8位寄存器和低8位寄存器的值都是8F,即16位的8F8F,这时候的输出应为(8F8F/FFFF)*5Vref=32639/65536*5=2.4901V


但是此时电路的输出却是2.5V(不是“约等于”哦。。),这个你做何解释呢?
发表于 2010-9-25 16:52:01 | 显示全部楼层
回复【26楼】gzhuli  咕唧霖
-----------------------------------------------------------------------

两路PWM都输出50%占空比,输出的不是50%VREF啊
-----------------------------------------------------------------------
见下图


(原文件名:2.jpg)
当这两个非门同时输出50%占空比的方波的时候,你觉得R2和R6的取值会影响输出电压吗?
发表于 2010-9-25 17:14:13 | 显示全部楼层
强悍
发表于 2010-9-25 18:28:02 | 显示全部楼层
回复【28楼】roseason
-----------------------------------------------------------------------

嗯,有道理,还得想想。
发表于 2010-9-25 20:56:50 | 显示全部楼层
PWM0 -> HighByte(8F) = (5/256)143  \
                                     (+) -->  [5*143( 257/256) ]/256 = 2.80387878V
PWM1 -> LOWByte(8F) = (5/65536)143 /


16bit DA = (5*8F8F)/65536 = 2.80387878V


"(8F8F/FFFF)*5Vref=32639/65536*5=2.4901V ? "

不是8F8F , 32639 = 7F7F 。
发表于 2010-9-25 20:57:53 | 显示全部楼层
有点混乱,谁解释下27楼。
发表于 2010-9-25 21:06:51 | 显示全部楼层
回复【31楼】90999 张耀扬
-----------------------------------------------------------------------

对,是7F7F,不是8F8F,把27楼的8F全换成7F就行了,其它的不变
发表于 2010-9-25 21:08:13 | 显示全部楼层
最佳方案是ARM7+IIS DAC
成本与开发难度的可行性并存。
发表于 2010-9-25 21:11:24 | 显示全部楼层
如果PWM DAC的两个输出电阻接到一个运放积分器上,那么公式是成立的,像28楼那样看来确实是不行的。
发表于 2010-9-25 21:12:26 | 显示全部楼层
回复【34楼】fsclub 绿林好汉
最佳方案是arm7+iis dac
成本与开发难度的可行性并存。
-----------------------------------------------------------------------

没有8块钱的ARM7吧。
发表于 2010-9-25 21:12:27 | 显示全部楼层
回复【30楼】gzhuli 咕唧霖
回复【28楼】roseason  
-----------------------------------------------------------------------
嗯,有道理,还得想想。
-----------------------------------------------------------------------

哈哈。。我在想,美国佬用这个“16位DA”去搞火星探测器。。是否真有其事啊??
发表于 2010-9-25 21:20:23 | 显示全部楼层
我还看到过别的文章,也是用类似的方法合成两个8位PWM成16位的,是个音频播放器,一下找不着了。
发表于 2010-9-25 21:21:37 | 显示全部楼层
回复【36楼】gzhuli 咕唧霖
回复【34楼】fsclub 绿林好汉
最佳方案是arm7+iis dac  
成本与开发难度的可行性并存。
-----------------------------------------------------------------------
没有8块钱的arm7吧。
-----------------------------------------------------------------------

LPC2101/2/3,所说1-1.5 USD


特点:
1、MCU: LPC2103 16/32 位ARM7TDMI-S 处理器,极小型LQFP48 封装; 8kB 的片内静态RAM,32kB 的片内Flash 程序存储器,128 位宽的接口/加速器使其实现了70MHz 的高速操作; 10 位的A/D 转换器含有8 个模拟输入; 2 个32 位的定时器/外部事件计数器,具有7 路捕获和7 路比较通道; 2 个16 位的定时器/外部事件计数器,具有3 路捕获和7 路比较通道; 2 个UART(16C550),2 个快速I2C 总线(400kbits/s)以及带缓冲和可变数据长度功能的SPI 和SSP; 向量中断控制器,可配置优先级和向量地址; 多达32 个可承受5V 的通用I/O 口; 高达13 个边沿或电平有效的外部中断管脚。
发表于 2010-9-25 21:24:33 | 显示全部楼层
回复【38楼】gzhuli 咕唧霖
-----------------------------------------------------------------------

希望有一篇是我能看懂的,我一直在寻找这样的方法,但苦于一直没找到,自己也没想到什么好的办法。。。
发表于 2010-9-25 21:36:38 | 显示全部楼层
PHILIPS当初提出的CD方案就是14位DAC + PWM成16位的,当时不叫PWM,叫dithering。DAC原型都做出来了,后来被SONY毙了。


这个那里有资料?
发表于 2010-9-25 21:53:09 | 显示全部楼层
mark 17楼
发表于 2010-9-25 22:14:15 | 显示全部楼层
回复【4楼】machao  
如果用16位的pwm实现44k的da,那么定时器时钟要达到2884m!
而用8位pwm实现44k的da,定时器时钟只要达到12m就可以了,这个很容易实现的。
所以要另外考虑的。
-----------------------------------------------------------------------

刚开始对这个结论有点疑问,后来一想,原来是如此得到的:

8位PWM实现44K的DA,44000*256 = 11264000,约为12M
16位PWM实现44K的DA,44000*65536=2883584000,约为2884M

用PWM实现8位精度的DA,x/256的占空比的信号经过LPF后和x/256的模拟电压值有多大的差别?
而且对于一个44K采样率的信号,采样值最坏情况下每个采样点的值都会不同,用PWM来模拟DA,
意味着每256个定时器时钟周期都要改变一次占空比,这样的PWM信号在多大程度上能等同于一个DA的效果?

有没有一些理论分析呢?还是就是觉得它可以当作那个DA?
发表于 2010-9-25 22:46:34 | 显示全部楼层
还是学习,看高手们论道....
发表于 2010-9-25 22:59:58 | 显示全部楼层
to  41楼今年无线电的第九期上就有讲到,只是不太详细~~~
发表于 2010-9-25 23:24:22 | 显示全部楼层
记号下。。。也做一个看看
发表于 2010-9-25 23:27:27 | 显示全部楼层
mark
发表于 2010-9-25 23:30:48 | 显示全部楼层
mark
发表于 2010-9-25 23:40:26 | 显示全部楼层
占位
发表于 2010-9-26 06:25:50 | 显示全部楼层
我觉得既然是高级电梯等等,还是把成本适度放开,也可以搞个TDA1543吧.(TDA1543貌似比TDA1305便宜而且评价也不错,而且更小,资料也多).
如果用MO51代替,用最低端的应该够用,据说只要5块,那么加上个TDA1543也就几块。总成本在10块左右,但声音应该比PWM方式好相当的多。

两个8位的PWM我觉得也不是太好,要求不高的地方才可以用用。关键是你怎么保证那256倍的电阻精度和稳定度?用我们一般所谓的1%电阻?那也可能差上 256/100=2倍啊。我觉得这个TINY的播放器还称不上HIFI.我现在做的一款WAV播放器用的是STM32f103RB, FATFS,TDA1305,音质已经能拍死千把块的MP3,我都不敢称HIFI.我的播放器代码量20KByte,如果只要单纯的播放功能还能精简.这个TDA1305 DAC 内部的DA虽然只有5位精度,但是他有高达128倍的超采样数字滤波器,声音很有1bit DAC的特点,有几个名器CD DAC采用的就是这颗TDA1305."法国MICROMEGA STAGE 6 CD 用的就是TDA1305,马兰士 CD-16D,剑桥 DAC3,甚至瑞士studer的D系列CD机里居然有一款D732用的是这个芯片,那可是个参考级别的机器啊!"
我做的这个应该不是最便宜的,也不是音质最好的,但是我觉得是最具性价比的.如果只算CPU+DAC, STM32f103RB大概25块左右,(其实MCU可以用更便宜的),TDA1305也不过10块左右,拆机的更便宜.倒是那对输出电容比较贵,15块.

手机拍摄,低清图奉献。开机检查SD卡,屏幕右上角被碰坏了


(原文件名:1.jpg)
LOGO


(原文件名:2.jpg)
文件选择,还有一个界面是文件夹选择,图略


(原文件名:3.jpg)
播放文件界面,第一行为文件夹,第二行为播放的文件名,其他的一看便知.底行蓝色的DIR表示当前循环模式为文件夹循环


(原文件名:4.jpg)

开发板和DAC板拼装制作,对外观要求高的朋友请绕过
DAC模拟部分直接聚合物电池供电,套用某大侠的话,直接拍死千把块的MP3,踢飞山寨机


(原文件名:5.jpg)
发表于 2010-9-26 09:27:34 | 显示全部楼层
先关注一下,最近也在做这个,但一直想不出如何用PWM实现16bit播放
发表于 2010-9-26 09:44:05 | 显示全部楼层
我也要弄!!!!
发表于 2010-9-26 10:01:55 | 显示全部楼层
R-2R网络与PWM结合?
 楼主| 发表于 2010-9-26 15:55:32 | 显示全部楼层
回复【53楼】sharpufo 风生水起月皎白
r-2r网络与pwm结合?
-----------------------------------------------------------------------

有具体的参考吗?
发表于 2010-9-26 21:52:42 | 显示全部楼层
回复【54楼】machao
回复【53楼】sharpufo 风生水起月皎白
r-2r网络与pwm结合?
-----------------------------------------------------------------------
有具体的参考吗?
-----------------------------------------------------------------------
只是一时“突发奇想”,马老师可以忽略。
具体说其实就是楼上朋友说n位DAC+PWM,只不过DAC不是外置的而是使用IO口加r-2r网络实现。就是8位r-2r DAC+8位PWM。
不过觉得这个也是对电阻有要求,其实可能不一定比双8位PWM好。请忽略.

我还是觉得用廉价的IIS DAC应该会更好.
发表于 2010-9-26 22:09:14 | 显示全部楼层
马老师,您好.
我觉得这个课题用来练手是相当不错的.
不过涉及到您说的几个应用领域,是不是不具备商用价值?
首先这些语音提示场合并不需要立体声,用SD卡也是个成本.
市场上的通用语音芯片挂颗串行FLASH足以胜任,不是吗?
 楼主| 发表于 2010-9-27 00:35:00 | 显示全部楼层
楼上:

1。高级旅行大巴,除了报到站提示,还要放音乐,还要放景点介绍。小的FLASH能放多少东西?大容量的FLASH价格不就是SD卡的价格吗?(20元就可以买到512M的MMC卡了)

2。你设计用多大的FLASH?大了可能浪费,小了可能不够用,因为放多少东西在不同的应用中是不一样的,总不能平凡换FLASH吧。用SD卡方案,就不比考虑这么多了。根据需要插个合适容量的卡就行了。

3。把录制好的东西放到FLASH中,恐怕一般人员做不到的吧。是换FLASH芯片还是,增加一个USB口(增加成本和难度)?而录制声音文件,并把文件拷贝到SD卡中,在PC上就能完成,一般人都会。插到播放器中就可以了。

4。通用的语音芯片也要5-6元,而且放出的声音质量一般。你可以网上查一下,那些做语音芯片的公司,提供的高质量方案通常就是MP3。语音芯片是给一般的玩具等低档产品使用的。我用过类似的DD,6KHZ,80秒的芯片要5元,6KHZ,只是一般的人讲话。它最高能放25KHZ的音乐,但已经只能是15秒了。

其实,我提的东西,即是非常合适练手,同时也非常具有应用价值的。掌握了操作SD卡,文件系统的应用,不仅仅是放语音用,其它地方也是会用到的。
 楼主| 发表于 2010-9-27 01:02:49 | 显示全部楼层
回复【43楼】ifree64
回复【4楼】machao   
如果用16位的pwm实现44k的da,那么定时器时钟要达到2884m!
而用8位pwm实现44k的da,定时器时钟只要达到12m就可以了,这个很容易实现的。
所以要另外考虑的。
-----------------------------------------------------------------------
刚开始对这个结论有点疑问,后来一想,原来是如此得到的:
8位pwm实现44k的da,44000*256 = 11264000,约为12m
16位pwm实现44k的da,44000*65536=2883584000,约为2884m
用pwm实现8位精度的da,x/256的占空比的信号经过lpf后和x/256的模拟电压值有多大的差别?
而且对于一个44k采样率的信号,采样值最坏情况下每个采样点的值都会不同,用pwm来模拟da,
......
有没有一些理论分析呢?还是就是觉得它可以当作那个DA?
-----------------------------------------------------------------------

理论就是采样定理。

下面看点介绍的DD

PWM Audio Theory

Audio samples are converted to a train of ON and OFF pulses. The average ON period of each pulse is proportional to the amplitude of the audio sample being played at that point in time. The PWM frequency, i.e. the total pulse period of ON plus OFF time, must be greater than the sampling rate of the audio being played. The output will then consist of a train of pulses where the average output voltage over the period is a function of the amplitude & frequency of the audio being played. This output signal contains unwanted noise from the PWM frequency and its harmonics. This noise can either be ignored because it is outside of the human hearing range, or it can be minimized by use of a low pass filter (integration).

History

In 1981, IBM released the IBM PC. It had a single, cheap internal speaker for audio, but to keep costs low, there was no DAC. The hardware would allow for applying power to the speaker on or off, but nothing in between.

Programmers found they could program the PC's Programmable Interval Timer (PIT) chip to drive the PC Speaker with varying pulse widths. Unfortunately, the PIT chip was only clocked at 1.2MHz. If the PWM frequency was set to 22KHz, this gave only 54 different output levels (1,193.182KHz / 22KHz = 54). If a PWM frequency of 11KHz is used, 108 possible output levels can be achieved (1,193.182KHz / 11KHz = 108), but this puts the unwanted PWM pulse frequency well into the human ear's audible frequency range, producing an undesirable 11KHz squeal on top of the audio.

Standard 8-bit audio has 256 different output levels (2 ^ 8 = 256), so playing audio on the PC Speaker had to be scaled down to the lower resolution. This made the sound quality fairly poor, but still recognizable.

More information about programming the PC's internal speaker using the PIT chip can be found here: Programming the PC Speaker.

Also during this period, some folks wired together a pile of resistors to their PC's Parallel Port to produce an 8-bit Binary Weighted DAC. This type of DAC used a specially designed resistor voltage divider network to produce the analog output. The resulting audio using this hardware could in theory be significantly better than the PWM PC Speaker method, but in practice it was difficult to get exact resistor values to make this solution work very well. Plus, not all parallel ports behaved properly either (some have internal pull-up/down resistors, etc).

High Speed Microcontrollers

Today's microcontrollers provide significantly better hardware. For example, the PIC24HJ64GP206 from Microchip provides 8 PWM pins, clocked at up to 40MHz. If a PWM frequency of 78KHz is used, each PWM output would be capable of producing 512 different output levels (40,000KHz / 78KHz = 512), or in other words, 9 bits of resolution. 10-bit resolution could be achieved, but this would limit the playback frequency to 39KHz.

What would it take to get to 16-bit resolution? Unfortunately, using the PWM technique by itself would require a clock rate of over 2.89GHz to achieve 16-bits of resolution. 2.89GHz divided by a PWM frequency of 44.1KHz allows for 16-bit resolution (2890137.6KHz / 44.1KHz = 65536). Few devices other than highly advanced microprocessors from Intel or AMD can operate at these frequencies. Obviously, using PWM alone is not going to be a feasible solution with today's equipment.
发表于 2010-9-27 03:07:27 | 显示全部楼层
sharpufo,STM32的DMA如何实现不间断发送?我用LPC的,切换DMA-RAM时候总有停顿(示波器看)
发表于 2010-9-27 06:53:59 | 显示全部楼层
对LPC不是很熟悉,还没用过。
我并没有使用DMA,STM32f103RB也没有IIS接口.我使用SPI接口模拟,做丛机,16位模式,IIS(其实是TDA1305的16位模式,不是严格意义上的IIS)的BCK,LRCK和MCK信号和SPI的CS信号由ATMEGA48产生(314Forever朋友介绍的方法),STM32f103在SPI的接收中断中喂数据给TDA1305(准备下次SPI传输的数据,这个中断必须拥有最高的优先权),开了4个1KB的缓冲区。
跑72M很流畅,从不断流,我测试了下,读文件速度能达到400kb多,(这个速度与SD卡也有关系).
如果有断流界面有提示,72M从不断流.当把速度降到32M时,就有可能发生断流了。
发表于 2010-9-27 11:44:17 | 显示全部楼层
回复【58楼】machao
-----------------------------------------------------------------------

谢谢您提供的资料,但这些资料仍然不能解开我的疑惑。

不知道是不是我在43楼提出的问题表达得不够清楚,您提供的资料以及您的项目结果说明的
PWM用在DA是行得通的,并没有给出理论的分析。
我把我的疑惑说得更清楚一些:

1、采样定理:
设x(t)是一个带限信号,其最高频率成分为fm , 则用采样频率 fs >= 2fm对x(t)采样,我们能
从样本值x_p(t)中无失真的还原出原信号x(t);

2、DA+低通还原原信号
若x[n]是满足采样定理采样量化后的序列,将x[n]通过DA后,得到的信号时采样样本值的零阶保持
信号,该信号经过提供滤掉高频成分后,就是原信号x(t)。

3、PWM的平均电压
对于PWM周期为T, 脉冲宽度为t的PWM信号,其平均电压V=Vcc*t/T
因此,调节PWM的脉冲宽度t,即调节了平均电压V,所以可以将PWM波用作DA转换。

4、用PWM波来还原x(t)

这一步是我主要疑惑的地方。
对于每一个样本值x[n],如果按照前面的公式(256*44100=11289600),这意味着每一个PWM周期都要
改变PWM的脉冲宽度t,但我的理解是幅值Vcc占空比为t/T的PWM信号在一个较长的时间(多长?)内作用效果等效
于一个电压为t/T*Vcc信号,那么仅仅一个PWM周期占空比为t/T,还能如此等效吗?能的理论依据是什么?

5、需要怎样的低通?
上面一步通过实践来看,好像是可行的。好了那么对低通滤波器的要求是怎样的呢?
x(t)的fm=20K,采样频率为fs=44.1K,那么就用一个上限截止频率>44.1Khz的低通吗?
发表于 2010-9-27 12:03:37 | 显示全部楼层
回复【61楼】ifree64  
-----------------------------------------------------------------------

PWM低通滤波器的原则是:1)能有效滤除载频信号fosc,即截止频率要低于44.1KHz
                       2)能让音频信号顺利通过,即截止频率应高于20KHz
 楼主| 发表于 2010-9-27 19:44:40 | 显示全部楼层
4、用PWM波来还原x(t)

这一步是我主要疑惑的地方。
对于每一个样本值x[n],如果按照前面的公式(256*44100=11289600),这意味着每一个PWM周期都要
改变PWM的脉冲宽度t,但我的理解是幅值Vcc占空比为t/T的PWM信号在一个较长的时间(多长?)内作用效果等效
于一个电压为t/T*Vcc信号,那么仅仅一个PWM周期占空比为t/T,还能如此等效吗?能的理论依据是什么?
============================================================================================================

单单PWM不能成为DAC的它只是一个占空比不同的脉冲序列波。当PWM波通过一个积分器,积分器的输出才是模拟信号。这个积分器即起到平均的作用,也就是低通滤波器了,因为高频部分经过积分平均,变平滑了。通常讲用PWM做DAC,基本不提这个积分器,是因为这是个“常识”,所以就不提了,但并不意味不要这个积分器。

由于理想的低通滤波器在实际中是没有的,所以输出的信号中还是会有PWM本身和_谐波频率的成分,由于这个频率人的耳朵听不到,所以可以不管它,或再使用滤波器减小。

一个最简单的积分器就是传一个电阻到电容,(电容另一端对地),2者的值决定了积分时间常数。积分器的时间常数(就是你问的“多长”)的确定需要根据PWM的频率来定。太长和太短都不行。

这些在模拟电路以及数字信号处理的课程里面都有具体的介绍,有理论基础,有计算公式。还有各种有源的滤波器的电路,当然有源的效果比无源的要好的多,电路不同,计算的方法也不同,只是你没有掌握理解。

对于44.1K的PWM,楼上已经给出了参考的低通滤波器的截止频率在22K--44K之间。

对于HI-FI的音频,模拟的频率定义在20--20K之间,所以数字音频的CD音质定为44.1K,它是模拟频率最高22K的2倍,所以符合采样定理的。如果你能设计出一个理想的低通滤波器,22K以上通过率为0,22K以下通过率为1,44K的PWM通过这样的滤波器后就能无失真的还原模拟信号。

以上是不考虑幅度量化的问题,如果考虑幅度发量化问题,任何的AD+DA都做不到完全的不失真的。
发表于 2010-9-27 20:36:50 | 显示全部楼层
回复【63楼】machao
4、用pwm波来还原x(t)  
这一步是我主要疑惑的地方。  
对于每一个样本值x[n],如果按照前面的公式(256*44100=11289600),这意味着每一个pwm周期都要  
改变pwm的脉冲宽度t,但我的理解是幅值vcc占空比为t/t的pwm信号在一个较长的时间(多长?)内作用效果等效  
于一个电压为t/t*vcc信号,那么仅仅一个pwm周期占空比为t/t,还能如此等效吗?能的理论依据是什么?  
============================================================================================================
单单pwm不能成为dac的它只是一个占空比不同的脉冲序列波。当pwm波通过一个积分器,积分器的输出才是模拟信号。这个积分器即起到平均的作用,也就是低通滤波器了,因为......
-----------------------------------------------------------------------

首先还是要谢谢马老师您耐心的解答, 但我不知道你是不是没有真的理解我提出的问题,
而将问题转变成关于积分器、滤波器的知识。我自信自己即便是再笨,一个R一个C,构成一个一阶的低通滤波
还是懂的。



很遗憾的是,电脑上画图来表示我的想法(疑惑)有点难,不过我还是想再请教一下:

一个周期的PWM信号,用傅里叶级数表示,有一个幅度等于该PWM信号的占空比的直流分量;
用低通滤波器滤掉一次谐波以上的谐波分量,只剩下直流量,这就是我们需要的,此时它相当于一个DAC。
但,当每个周期都要改变PWM的占空比时,这个PWM已经不再是一个周期信号,这时还相当于一个DAC吗?



设x[n]为x(t)采样、量化后的数字序列;那么

1) 用DA来输出该信号,我们得到的实际是一个x(t)采样的样本值的零阶保持的信号,
这个信号本身就可以很粗糙地表示原来的x(t),经过一个适当的低通后,可以更好的逼近x(t)。

2) 用PWM输出该信号,滤波前,输出的是一个在每个PWM周期中占空比等于x[n]的信号
这个信号的频谱包含了x(t)的频谱吗?使得经过低通滤波去掉不需要的高频的频谱后,
得到的信号的频谱和x(t)的频谱相同或相似,因此是“同一个”信号。我想要的是这个的理论依据。
在上面的第1种方法中,采样定理已经理论化地分析了采样样本的频谱中包含了x(t)的频谱,
只要没有频谱混叠就可以从样本中还原出原信号。

我原本以为这是一个好问题,没想到成了无知,当然我对PWM在这方面的认识确实无知,但我也实在没有发现对PWM
应用比较全面介绍的资料,我看过的单片机方面的书都只是聊聊数语介绍了下如何得到PWM,然后说PWM在电机控制等
领域用处广泛一句话而已:(
发表于 2010-9-27 20:45:40 | 显示全部楼层
回复【63楼】machao
============================================================================================================
单单pwm不能成为dac的它只是一个占空比不同的脉冲序列波。当pwm波通过一个积分器,积分器的输出才是模拟信号。这个积分器即起到平均的作用,也就是低通滤波器了,因为......
-----------------------------------------------------------------------
我的疑惑在于:直觉上觉得只有一个PWM周期中占空比等于样本值,下一个PWM周期占空比又等于下一个样本值,积分器能把信号平均到与样本值相同(相近)效果的模拟信号吗?
总感觉一个样本值需要PWM信号用多个PWM周期的时间来逼近,PWM一个周期就可以“平均”出一个样本值,总觉得不可思议。
发表于 2010-9-27 21:04:49 | 显示全部楼层
mark先,不错~~
发表于 2010-9-27 21:13:27 | 显示全部楼层
回复【53楼】sharpufo 风生水起月皎白
r-2r网络与pwm结合?
-----------------------------------------------------------------------

呵呵,我的想法和你一致。R-2R网络用作高8位DA,PWM输出低8位与之混合,原则上可行。实际上精度与线性度取决于R-2R网络电阻的匹配精度。
发表于 2010-9-27 21:23:32 | 显示全部楼层
这个要mark
 楼主| 发表于 2010-9-27 22:09:19 | 显示全部楼层
回复【65楼】ifree64
回复【63楼】machao  
============================================================================================================  
单单pwm不能成为dac的它只是一个占空比不同的脉冲序列波。当pwm波通过一个积分器,积分器的输出才是模拟信号。这个积分器即起到平均的作用,也就是低通滤波器了,因为......
-----------------------------------------------------------------------
我的疑惑在于:直觉上觉得只有一个pwm周期中占空比等于样本值,下一个pwm周期占空比又等于下一个样本值,积分器能把信号平均到与样本值相同(相近)效果的模拟信号吗?
总感觉一个样本值需要pwm信号用多个pwm周期的时间来......
-----------------------------------------------------------------------

理论上能得到相同模拟信号。
下面2篇文章不知道是否够理论了,都用了傅里叶级数在理论上进行分析。
点击此处下载 ourdev_586093XB001G.pdf(文件大小:317K) (原文件名:Using a PWM Timer as a Digital to Analogue Converter.pdf)
点击此处下载 ourdev_586094RQ1B8X.pdf(文件大小:188K) (原文件名:pwm-dac.pdf)
发表于 2010-9-27 22:49:42 | 显示全部楼层
如果不是做HIFI,12bit DA一般已满足大部分场合的要求,一般人甚至难以区分与16bit声音之间的区别,除非用高级的播放设备。当然拥有金耳朵的人除外,毕竟这是少数。

上面提及的PWM+R2R 示意图:

(原文件名:未命名.PNG)
发表于 2010-9-27 23:06:53 | 显示全部楼层
回复【70楼】cowboy
-----------------------------------------------------------------------

这个D8-D15要用开漏输出吧?
发表于 2010-9-27 23:25:23 | 显示全部楼层
回复【71楼】gzhuli 咕唧霖
-----------------------------------------------------------------------
不应开漏吧,只是普通的R-2R电路,输出最好是rail to rail
发表于 2010-9-27 23:26:18 | 显示全部楼层
回复【70楼】cowboy  
-----------------------------------------------------------------------

mark

电话好像就是12位的吧,对面的说话和音乐已经可以接受了,尤其,比8位的说话声好听多了.
电阻精度,影响有多大?
发表于 2010-9-27 23:36:56 | 显示全部楼层
回复【73楼】kv2004
-----------------------------------------------------------------------
我晕,电话话音只有8位(固定电话),而且采样率只有8KHz,根本不适合播放音乐。
手机的话音质量更差(目前的,以后难说),声音经过高度压缩。设计目标只是能分清说什么,不引起岐义。

电阻精度有多大影响我没有细想,估计电阻精度与DAC精度相当。也就是说0.1%的电阻能达到10位左右,猜的,不知是否正确。
发表于 2010-9-27 23:45:23 | 显示全部楼层
回复【72楼】cowboy
-----------------------------------------------------------------------

是的,你用R-2R做高8位,我考虑错了。
发表于 2010-9-27 23:49:10 | 显示全部楼层
回复【74楼】cowboy  
-----------------------------------------------------------------------

电话是8位,但是是8位A率或u率,大约相当于12位吧.
发表于 2010-9-27 23:59:41 | 显示全部楼层
回复【76楼】kv2004
-----------------------------------------------------------------------
哦,是的,我忘了还有A率或u率的简易压缩,不过效果跟真正的12位仍有很大差距。

PS:似乎跑题了,要讨论开新帖好一点。这里还是讨论WAVE播放器的实现方式为妥。
发表于 2010-9-28 00:03:32 | 显示全部楼层
电话语音采样率8k
发表于 2010-9-28 00:05:47 | 显示全部楼层
回复【69楼】machao  

理论上能得到相同模拟信号。
下面2篇文章不知道是否够理论了,都用了傅里叶级数在理论上进行分析。
点击此处下载 ourdev_586093XB001G.pdf(文件大小:317K) (原文件名:Using a PWM Timer as a Digital to Analogue Converter.pdf)  
点击此处下载 ourdev_586094RQ1B8X.pdf(文件大小:188K) (原文件名:pwm-dac.pdf)
-----------------------------------------------------------------------
谢谢提供的资料,其中秦健所写论文,我之前也搜索到看过了。
两篇文章的理论分析部分都只是分析了作为周期信号时的PWM的情况。
而对于每个PWM“周期”都需要改变占空比的信号,(已经不再是周期信号了)没有作出分析。

所以可能是这样一种情况:大家都在实践中把PWM当作DAC来用了,而且实践也给出了可接受的效果;
不过对于这样做的内在理论根据就没有仔细地深究了?
 楼主| 发表于 2010-9-28 00:53:32 | 显示全部楼层
回复【70楼】cowboy
如果不是做hifi,12bit da一般已满足大部分场合的要求,一般人甚至难以区分与16bit声音之间的区别,除非用高级的播放设备。当然拥有金耳朵的人除外,毕竟这是少数。
上面提及的pwm+r2r 示意图:


(原文件名:未命名.png)
引用图片

-----------------------------------------------------------------------

在网上查找这篇文章看看,更加简单。

Resistor/Pulse Width Modulation DAC
发表于 2010-9-28 01:19:44 | 显示全部楼层
马老师也是夜猫子呵呵。两个8位PWM,输出用1:256的电阻混合,确实可以达到相同目的,似乎前面已有网友提及。
需要考虑的是,两个PWM输出的阻抗特征,由于两者带负载相差256倍,两个PWM输出电压很难一致,且大多IO输出特征是非线性,这些都带来一定的影响。如何向16位靠近,仍需花点心思。
发表于 2010-9-28 01:36:22 | 显示全部楼层
like this :http://www.k9spud.com/traxmod/pwmdac.php
发表于 2010-9-28 01:45:32 | 显示全部楼层
回复【81楼】cowboy
马老师也是夜猫子呵呵。两个8位pwm,输出用1:256的电阻混合,确实可以达到相同目的,似乎前面已有网友提及。
需要考虑的是,两个pwm输出的阻抗特征,由于两者带负载相差256倍,两个pwm输出电压很难一致,且大多io输出特征是非线性,这些都带来一定的影响。如何向16位靠近,仍需花点心思。
-----------------------------------------------------------------------

能否解释一下28楼的状况:两个PWM同时输出50%占空比,合成后依然是50%?
发表于 2010-9-28 08:14:31 | 显示全部楼层
回复【77楼】cowboy  
-----------------------------------------------------------------------

如果有简单的电路能实现A/u率,也很好听啊,存储空间还省一半.
发表于 2010-9-28 08:47:40 | 显示全部楼层
回复【82楼】90999  张耀扬
like this :http://www.k9spud.com/traxmod/pwmdac.php
-----------------------------------------------------------------------

这篇文章前半部分是正确的,但是下面是有问题的,因为它仍然没有解决28楼的疑问,只要两路PWM输出相同的占空比,那这个“DA”得到的就不是16位的精度


(原文件名:1.jpg)
发表于 2010-9-28 08:53:39 | 显示全部楼层
引用图片【70楼】cowboy  
-----------------------------------------------------------------------

(原文件名:未命名.PNG)

PWM似乎不能这样用的吧?你这里似乎把PWM当成一个理想的“DA”了,不经过滤波的PWM是不能这样接的,但是经过滤波的PWM还原的模拟信号是有相移的,有了相移的信号和高八位的R-2R叠加,出来的数据就不对了吧?
发表于 2010-9-28 09:04:52 | 显示全部楼层
make!
发表于 2010-9-28 09:19:57 | 显示全部楼层
回复【79楼】ifree64  
回复【69楼】machao  
 
理论上能得到相同模拟信号。 
下面2篇文章不知道是否够理论了,都用了傅里叶级数在理论上进行分析。 
点击此处下载 ourdev_586093xb001g.pdf(文件大小:317k) (原文件名:using a pwm timer as a digital to analogue converter.pdf)  
点击此处下载 ourdev_586094rq1b8x.pdf(文件大小:188k) (原文件名:pwm-dac.pdf)
-----------------------------------------------------------------------
谢谢提供的资料,其中秦健所写论文,我之前也搜索到看过了。
两篇文章的理论分析部分都只是分析了作为周期信号时的pwm的......
-----------------------------------------------------------------------

我同意你的观点,理论上来说一个周期PWM要还原信号需要滤波器响应无限快,R-C网络不可能做到。但音频信号有个特点就是信号不会跳变(或者说高次谐波很少)这样R-C网络就可以在一个周期内近似的还原原信号了(高次谐波已经被扔掉了)。(缺乏理论支持,不知到这样考虑对不对)
发表于 2010-9-28 09:23:43 | 显示全部楼层
回复【83楼】gzhuli 咕唧霖
-----------------------------------------------------------------------


引用图片【28楼】roseason
-----------------------------------------------------------------------

(原文件名:2.jpg)


首先把图中的R3去掉,只用R2、R6叠加,当两路PWM都是50%占空比且同步时,很明显输出为Vref * 50%.
这时PWM1、PWM2的数据均应该为0x80,即16bit源数据为0x8080,但我们期望的输出电压50%时,对应源数据应为0x8000,这显然与我们预期的不一致。
产生这种误差的原因,是由于两路信号经电阻的叠加是基于电压叠加,而这里应采用电流叠加,这个电流是指输出对地的电流。
至于电流叠加的实现方式,一般采用运放作叠加器,运放的反相输入端构成虚地,两路信号经电阻引入反相输入端,则运放输出电压正比于两电流之和,从而解决上述矛盾。
一般基于R-2R型的DAC,输出也是采用这种叠加方式。
发表于 2010-9-28 09:38:29 | 显示全部楼层
回复【86楼】roseason
-----------------------------------------------------------------------
你把PWM输出信号变换到频域分析,在低于1/2的PWM频率以下的区域,频谱和PMW的调制信号应该是一致。
低通滤波,就是把高于1/2PWM频率以上的带外信号滤除。当然,由于没有理想的矩形滤波器,这个LPF的效果也最终影响了输出信号的还原度。
当PWM频率远大于源信号的最高频率时,LPF也容易得到较好的效果。
我图中的低8位PWM输出有电容C3作简单的一阶RC低通滤波,运放中也有C1用二次滤波,要求不很高的场合,应该还凑合。
发表于 2010-9-28 09:39:24 | 显示全部楼层
回复【70楼】cowboy
如果不是做hifi,12bit da一般已满足大部分场合的要求,一般人甚至难以区分与16bit声音之间的区别,除非用高级的播放设备。当然拥有金耳朵的人除外,毕竟这是少数。

-----------------------------------------------------------------------
12bit和16bit差别还是比较大的,用稍微好那么一点的耳机就能分辨出来,用我做的这个播放器做过实验,耳机PX200,当播放8bit时,声音已经有点惨,播放12bit时还撮合,但是少了非常多的细节,那些细小的敲击乐器声音已经严重变形甚至听不见,唱歌的口气已经变味了.
当然12bit用来播放广播还是可以的。
发表于 2010-9-28 09:52:43 | 显示全部楼层
我们公司是做电梯的,国内最大的电梯控制柜生产商。

语音报站器绝对不需要这么低的成本要求啊。
 楼主| 发表于 2010-9-28 12:00:44 | 显示全部楼层
回复【81楼】cowboy
马老师也是夜猫子呵呵。两个8位pwm,输出用1:256的电阻混合,确实可以达到相同目的,似乎前面已有网友提及。
需要考虑的是,两个pwm输出的阻抗特征,由于两者带负载相差256倍,两个pwm输出电压很难一致,且大多io输出特征是非线性,这些都带来一定的影响。如何向16位靠近,仍需花点心思。
-----------------------------------------------------------------------

哈,这个到底不是用在太空的东西,已经有朋友说了,12BIT已经非常好了,那么这个方案能作到14bit,或者说“接近”16BIT,对于这个应用的需求也就够了。

这篇文章的作者实际也按这个做了播放器,它后面的电路如下:


(原文件名:未标题-1 拷贝.jpg)

为了做到“接近”16bit,除了从电路本身考虑(电阻的精度、I/O的影响、滤波器的效果等),软件上也是可以想办法的,二者综合考虑,效果会好,实现也更容易。

针对播放44.1Khz,16bit的声音样本,当系统时钟允许的范围内,可以“过采样/插值”的方式提高精度。

简单的说,提高PWM的频率,考虑PWM的频率是44K的2倍、4倍,也就是说对于一个44K的样点,重复放2次,4次。

计算以下,44.1k*4 = 176.4K,176.4 * 256 = 45.2M。如果所使用的MCU可以工作在50M的话,那么就可以了。

让PWM的周期为176.4k,4个pwm波重复一个44.1k的样本,PWM的频率提高了,那么低通的效果就会好的多(频率越低的低通,电路上越难做到)。上图中实际有2级的LPF,前一级考虑80k,后一级考虑30K,那么22K的模拟输出应该效果更好的(44.1K采样对应模拟为22.05k),成本也不增加多少。

老外有许多好的设计,但也不是完美的,我们应该认真分析,吸取好的地方,改善其不足。

=============================================================================
到此,实际上我的方案已经露出水面了。硬件上一片合适的MCU,加一个SD卡座,输出为上图所视。

这里主要的成本就在合适的MCU上。实际上很早这个方案就在我的脑子里了,但我找不到合适的8位MCU,AVR算不错了,但做这个DD,还是不能完全满足速度、资源和控制性能上的要求。

最先也是考虑STM32的。最近看到5元的M051,它内部有22M时钟,带PLL,可以最高跑50M,具备4对8位同步互补PWM(本例中互补不需要,能方便的实现同步就可以了),其它的资源也比AVR丰富,那么应该是最佳的选择。

只所以本贴与推荐学习M051的贴同步发出,就是想说明我为什么鼓励大家要多学习点东西。现在的要求越来越高,但成本还要同以前的相同,要求高,就会出现用8位MCU尴尬的情况,那么就可以考虑基本相同价位32位的MCU。拿此方案做例子吧。

如果阿莫愿意,把这个作为网站上 学习使用M051(当然用STM32或其它MCU也是可以的)的开源项目,让有兴趣并愿意尝试的朋友可以玩(现在该还我一个公道,挑阿莫上山了,哈哈)。
发表于 2010-9-28 13:05:34 | 显示全部楼层
mark PWM to DA  


以后用得上!
发表于 2010-9-28 13:27:51 | 显示全部楼层
这个应该 置 cool 了!


mark  pwm to DA
发表于 2010-9-28 13:59:23 | 显示全部楼层
回复【89楼】cowboy  
-----------------------------------------------------------------------

这个方法貌似不错,不过17楼这么改的话,那些减小纹波的措施似乎都不好使用了。。

并且93楼的图也没有这么做,还真有点怀疑这个电路的性能。。。
发表于 2010-9-28 14:08:40 | 显示全部楼层
mark,学习
发表于 2010-9-28 15:19:42 | 显示全部楼层
回复【15楼】kdtcf  春风
-----------------------------------------------------------------------

最贱的stm32没有I2S
发表于 2010-9-28 15:41:18 | 显示全部楼层
用电路实现A率或u率的转换,有这种电路吗-------------尽量简单一点的......
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-8-19 21:08

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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