amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
12
返回列表 发新帖
楼主: machao

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

[复制链接]
 楼主| 发表于 2010-9-28 17:45:14 | 显示全部楼层
回复【96楼】roseason
回复【89楼】cowboy   
-----------------------------------------------------------------------
这个方法貌似不错,不过17楼这么改的话,那些减小纹波的措施似乎都不好使用了。。
并且93楼的图也没有这么做,还真有点怀疑这个电路的性能。。。
-----------------------------------------------------------------------

17楼的图,只给出了一个简单的LPF,主要是考虑器件速度的影响。
93楼的图中采用了2级LPF,就是减小纹波的措施了。

纹波的频率是多少?首先最大的一个是PWM的频率,其次是PWM频率的高次偕波。另外,人的耳朵本身也是一个LPF,高过20K的频率就听不到了。

PWM当DAC使用,在马达控制驱动,无级调速、灯光控制已经非常成熟,马达,人的眼睛本身也是PLF,太快的变化根本就跟不上,50Hz的日光灯人眼已经分别不出变化了,100hz的灯或电视都算保护人眼了。

理论能帮助我们推导或想出处理的途径和办法,理论上的不失真都是有条件的,另外在实际应用中通常我们也做不出理论上的DD,如理想的PLF。所以应用考虑是否满足需要。

就是使用现成的DAC器件,你也得不到完全不失真的原信号。

实际上,就是从理论上讲,ADC后再DAC,你永远也得不到不失真的原始信号。这里根本不要用什么傅立叶的公式去推导的(在这里拿公式推导纯粹是唬人)。

ADC是从F(x)到F(n),从连续到离散,将模拟到数字。ADC的过程关键是2个离散的过程:时间离散和幅度离散,因为模拟信号是时间连续,和幅度连续的。

时间离散就是采样,根据采样定理,只要采样频率是信号最高频率的2倍,那么就能从离散的采样信号中无失真的恢复出原信号。但注意的是这是有条件的,首先要有理想的滤波器,其次这个采样定理没有考虑到采样值的幅度离散(采样定理还是建立在点的幅度是连续的,不失真基础上的,这个还不是数字化,只是数学上的时/频域变换而已)。实际上,就单单这个理想的滤波器的限制,在实际中就做不到不失真了。

再考虑采样值幅度上的离散,不管你用8位,还是16位,甚至24位,32位,离散的幅值总与实际的幅值有差别的。假如用8位的分辨率,大家都知道精度是1/256,那么当实际采样点的幅值不在这256个点上的话,它就只能向上或下边临近的点靠,这个误差就产生了。而且这个产生的误差在理论上也是根本没有办法去消除的,只能做某些“补偿”。

所以在ADC的过程中,得到的F(n)已经与F(t)有误差了,你怎么能指望DAC来消除呢?

在本贴中讨论的PWM做DAC,在理论上是绝对是站的住脚的,没有问题。问题只是在电路和方法上如何去很好的实现,原因也是理想的滤波器根本是没有的。

我在93楼给出插值的方法,将PWM频率提高到44K的4倍,然后把一个采样点重复连续放4次的做法,就是从另外的角度减小对滤波器性能要求的压力。

重采样和插值能提高精度,这个也是有理论基础的。真正的掌握理论,是对它的核心的理解,不是背公式。重采样就是对信号采取更高的采样频率,超过理论的2倍,比如4倍,8倍。在这里我把采样点重复放4次,这意味着采样频率是信号频率22K的8倍。

提高采样频率,增加量化级数,都是在工程上采用的手段,用于提高ADC、DAC的精度。但这就需要MCU的处理速度要提高,内存的资源要丰富。8位量化点,只需要一个字节,而16位的量化,一个量化点就需要2个字节,如果对样点还要做运算处理,加、减、乘、除,还要流畅的播放等等,对处理器的要求是现而易见的。一旦要做这些事情,那么8位的MCU困难就不少。
 楼主| 发表于 2010-9-28 18:11:28 | 显示全部楼层
哈哈,我好象在上研究生的课程。那就布置个作业吧。

根据【99楼】的kv2004,提到了A率或u率。

有哪位朋友能说说什么是A率或u率的概念吗?为什么要使用A率或u率?对于类似HI-FI的播放器,如MP3、WAVE什么的,有用A率或u率的吗?为什么?

============================================================
我专门会提出类似的问题。

记得今年年初,某中学请我指导他们的学生参加上海市未来工程师的一个比赛。我刚去,他们的校长就问我如何培训,我说从点亮一个LED开始。校长说,这个太简单了吧,我们学生现在都可以在10分钟内做出来。(他们有课外兴趣小组,也玩MCU,做的叫航标灯模型,不停的循环 软件延时一秒,控制一个I/O反转......)。

我说,这样吧,把你们的指导教师叫来,就这个点亮LED,我问几个问题,包括硬件、软件和系统方面的,如果他知道的话,就不用我培训了,马上走。

问题如下:
1。为什么LED要串个电阻?电阻的作用是什么,阻值有什么要求?如何计算和估计?
2。用AVR可以直接驱动LED,有的需要使用三极管,为什么?如果这个“航标灯”是220V的灯泡,电路应该如何设计?
3。你的“航标灯”亮一秒,暗一秒。这个一秒的精度是多少?如果求亮1000.001秒你能做到吗?你能做到的最高精度是多少豪秒或多少豪微秒?
4。闪烁点亮“航标灯”这个事情,占用了CPU的多少效率?你的CPU还能做其它事情吗?怎么做?
。。。。。。。

没问完,他们的指导老师说,专业,太专业。这个东西我们玩不了。
发表于 2010-9-28 19:03:48 | 显示全部楼层
向马老师学习!
发表于 2010-9-28 19:15:21 | 显示全部楼层
回复【100楼】machao
-----------------------------------------------------------------------

楼的图,只给出了一个简单的LPF,主要是考虑器件可速度的影响

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

呵呵,马老师应该是还没有完整地阅读13楼的文章吧?这个滤波器设计我觉得很巧哦。。。

其实马老师说的我也明白,因为我自己就用过不下10种方法做过PWM DAC,而且在这方面探索已经有多年了(现在正打算做一个3MHz的PWM功放,也许还会用硬件再做一个Tripath 的Digital Power Processing功放,不过载频会提高到数MHz,而不是TA2024的不到1MHz)

但是有些原则是不会变的,即一个如果连理论都能够证明是是错误的DD,怎么能指望实际能得出正确的结果呢?您说是吗?

如果是一个16位的DA,那么至少理论上这65536个取值,每一个输出的结果都是独立、唯一和准确的。

但17楼的例子,在我们已经忽略了电阻误差的情况下,仍然能够证明至少有254个点输出的电压是绝对不正确的,即两路PWM输出的占空比相同的情况下(除了0%和100%,即256种取值减去两个特例,剩下254个。。)

你觉得这样还能算是16位DA吗?

呵呵,不是我想抬杠,我只是觉得做技术这样的理论分析都能证明有错的DD,我是绝不会用到实际中的。。。
 楼主| 发表于 2010-9-28 19:34:16 | 显示全部楼层
回复【103楼】roseason
回复【100楼】machao  
-----------------------------------------------------------------------
楼的图,只给出了一个简单的lpf,主要是考虑器件可速度的影响
-----------------------------------------------------------------------
呵呵,马老师应该是还没有完整地阅读13楼的文章吧?这个滤波器设计我觉得很巧哦。。。
其实马老师说的我也明白,因为我自己就用过不下10种方法做过pwm dac,而且在这方面探索已经有多年了(现在正打算做一个3mhz的pwm功放,也许还会用硬件再做一个tripath 的digital power processing功放,不过载频会提高到数mhz,而不是ta2024的不到1mhz)
但是有些原则是不会变的,......
-----------------------------------------------------------------------

抱歉,我把你与【43楼】的ifree64搞混了。我的帖子主要是回答【43楼】ifree64,以及他后面总是问的PWM做DAC是否有理论基础的问题而做的解释。

你的问题与他不同,是如何将2个8位PWM 组合,作为16位的DAC使用的设计问题。
发表于 2010-9-28 19:40:35 | 显示全部楼层

(原文件名:au.JPG)
 楼主| 发表于 2010-9-28 19:47:40 | 显示全部楼层
楼上,能解释一下你下面右图是什么意思?横坐标是什么,纵坐标又代表什么?以及等于12位的具体含义吗?
发表于 2010-9-28 19:54:34 | 显示全部楼层
DF INSIDE?
发表于 2010-9-28 19:55:16 | 显示全部楼层
回复【106楼】machao  
-----------------------------------------------------------------------

好的,
横坐标是8位A/u率数据,经过{8位PWM->滤波....}之后的信号-------真实反映(线性的 对应)存储在单片机中的数据(8位的);
纵坐标是经过?电路还原成原声的信号;
约等于12位,是说,耳朵听起来像12位音质,(实际上是有差别的---小信号细腻,大信号粗糙),一般人耳朵听不出来(比如.我).
发表于 2010-9-28 19:58:25 | 显示全部楼层
machao,我觉得用PIC32那个例子已经可以说明问题了,所以DA部分应该没太大问题了。

不过PWM的精度问题和R2R网络比,那个精度可以更高些呢?
发表于 2010-9-28 20:14:37 | 显示全部楼层
mark
 楼主| 发表于 2010-9-28 20:48:08 | 显示全部楼层
回复【108楼】kv2004
回复【106楼】machao   
-----------------------------------------------------------------------
好的,
横坐标是8位a/u率数据,经过{8位pwm->滤波....}之后的信号-------真实反映(线性的 对应)存储在单片机中的数据(8位的);
纵坐标是经过?电路还原成原声的信号;
约等于12位,是说,耳朵听起来像12位音质,(实际上是有差别的---小信号细腻,大信号粗糙),一般人耳朵听不出来(比如.我).
-----------------------------------------------------------------------

不知道是我理解错误,还是你概念上有误。我给出一个简要的解释。

首先必要的条件是,你的采样数据本身就应该是通过A/U率的ADC获得的,如果是用线形ADC得到的数据,用A/U率的DAC是没有任何作用的,反而失真更严重。

如果你的数据本身是A/U率抽样数据,那么类似R-2R的电路就能实现A/U的DAC,只是各个位的电阻值(即权重)需要根据A/U计算,符合A/U率对应的每一个位的权。当然,此时就不能叫R-2R,R-2R是按8位线型DAC的权值得到的。

A/U率有专门的ADC和DAC芯片,比线形ADC/DAC要贵。主要应用与电话等语言数字通信(采用8位)时中使用。现在的MP3播放器大都采用线形ADC/DAC,16位bit,小信号也足够细腻了。
发表于 2010-9-28 21:20:25 | 显示全部楼层
【105楼】 kv2004 提及到的PWM数据,当然是经A/u律变换压缩后的数据,由于A/u律变换过程中采用了折线斜率进行变换,并不是平滑的曲线,所以解压缩时也必需是分段的折线来扩张。纯硬件电路很难过到这要求,要么线路很复杂。这种情况用MCU处理或FPGA处理更合适。
发表于 2010-9-28 21:39:51 | 显示全部楼层
大于12位采样录音->{CoolEdit/Goldwave/自编程序 等 转换->A率}-> 存储 ->单片机 ->不加任何特殊处理的DAC ->电路(?)->驱动->耳机

.
 楼主| 发表于 2010-9-28 21:45:54 | 显示全部楼层
回复【112楼】cowboy
【105楼】 kv2004 提及到的pwm数据,当然是经a/u律变换压缩后的数据,由于a/u律变换过程中采用了折线斜率进行变换,并不是平滑的曲线,所以解压缩时也必需是分段的折线来扩张。纯硬件电路很难过到这要求,要么线路很复杂。这种情况用mcu处理或fpga处理更合适。
-----------------------------------------------------------------------

a/u律ADC没有压缩,还是做ADC采样,不存在解压缩的问题,你用MCU或FPGA处理什么?将A/U律数据转换成线型数据,再通过线型DAC输出?

ADC/DAC不存在什么压缩问题,压缩是后续的问题,不要把问题混在一起。

理论上的A/U率ADC采样过程中,输入模拟电压与ADC数据输出值的关系,就是平滑的曲线。线型ADC输入模拟电压与ADC数据输出值的关系是45度直线。你所说的“平滑曲线”是指什么?

关键还是在于了解A/U律ADC的真正含义!
发表于 2010-9-28 21:49:54 | 显示全部楼层
虽然经过几段折线,但是毕竟只有256个状态,用电路做个曲线,小信号放的小些;大信号更大些,也应该能做到接近吧.而且两个参数不大一致的电路板,放出音来,一般人耳朵也不一定听的很准吧.
比PWM+电阻网络的好处是,1 数值小的输入一定能得到数值小的输出,2 信号连续,而PWM+电阻网络不一定能做好这两点吧.----其实也许是1点问题,就是电阻网络最小值和PWM最大值的比较的大小和比例问题.
---
改错字
发表于 2010-9-28 22:00:38 | 显示全部楼层
可能是我表达不清了,我说的压缩并不是通常数据上的压缩,是指声音的动态度压缩,而解压准确一点表达是扩张。A/u律的压缩据我所知是用13段或15段折线把12位数据变换成8位数据。我对G711音频压缩标准也是一知半解,用词不当闹笑话了:(
发表于 2010-9-28 22:20:10 | 显示全部楼层
回复【104楼】machao
-----------------------------------------------------------------------

呵呵。没事,原来是误会:)
发表于 2010-9-28 22:23:43 | 显示全部楼层
如果A/u-Law采样的数据要用LPCM输出或反之,才需要MCU处理。
发表于 2010-9-28 22:40:06 | 显示全部楼层
虽然经过几段折线,但是毕竟只有256个状态,用电路做个曲线,小信号放的小些;大信号更大些,也应该能做到接近吧.而且两个参数不大一致的电路板,放出音来,一般人耳朵也不一定听的很准吧.


↑请问这个有什么意义? 既然是M0去做,那么直读直出就好了,还要做处理那M051那里处理得过来? 现在又不是要压缩数据节约空间,根本就不需要这种处理。


比PWM+电阻网络的好处是,1 数值小的输入一定能得到数值小的输出,2 信号连续,而PWM+电阻网络不一定能做好这两点吧.
----其实也许是1点问题,就是电阻网络最小值和PWM最大值的比较的大小和比例问题.



↑完全没有问题,R2R网络做高8bit还是可以做的蛮高精度的,再加上8bitPWM生成低8位。问题是异类的两者如何同步,如果是2个同类分别处理高低8位就不会有太大问题。
发表于 2010-9-28 23:14:01 | 显示全部楼层
回复【119楼】90999  张耀扬
-----------------------------------------------------------------------

我[113]楼已经说过了,不做任何特殊处理-8位的
我想:PWM+电阻网络应该还是有点问题的:
市面上便宜的电阻都是10%的.电阻不会很准.
那么PWM部分线性和电阻网络部分不一定能配合好.
-----------------
另:
以前试验过A率PCM用查表法,得到10位,8K(8.192M晶震),还有8位,22.0xxK,和48K,(12M晶振).音乐格式都是用COOLEDIT转的.好像感觉是用22.xxxK 8位,放音乐就足够好听了,但是不能放说话音,说话音的话,48K 8位采样率,也没有11.0xxK 16位的好听.--有些场合的语音,放出来噪音大.而那个8k 10位的因为采样低,好像也不好听.
还有COOLEDIT 把16位转成8位时,有一个转换选项,加入一定噪音,目的估计还是提升8位的效果,好像试过很多组合,没有一个能同时适应音乐和说话--都不太满意.
发表于 2010-9-28 23:36:43 | 显示全部楼层
回复【17楼】gzhuli 咕唧霖
回复【16楼】roseason  
-----------------------------------------------------------------------
两个8位pwm叠加可以得到16位精度的,这里有篇文章讲怎么用2个8位pwm实现16位dac:点击此处下载  (原文件名:93004di.pdf)  


文章截图 (原文件名:1.png)
-----------------------------------------------------------------------

看了下英文的解释,还是没弄懂下面问题,请教一下
1: R4 R5 R7 C8 加入这部分电路,为什么稳定时间就会减小呢?
2: R1 是如何减少反向器内阻影响的.
 楼主| 发表于 2010-9-29 00:18:35 | 显示全部楼层
总结以下A/U律是问题。

首先,对于数字语音(不是音乐)采用线型8位ADC采样+DAC还原,人们还是感到不能满足(这也就是我本贴提出做16位的播放器原因之一)。

那么为什么不使用12位或更高的16位呢?1。通道太窄。2。有些浪费。因此在语音通信中一个采样点的数据还是采用8位,但不是使用线型ADC,而是对数型的A/U律ADC。

对数型ADC就是对采样点的幅值的离散,不是将256点均匀间隔分布,而是越小信号的地方,分布的间隔越密,越大信号的地方,分布间隔越大。这个是符合人耳的听力另一个特点(与频率无关的分辨律特性)。当人们在安静的背景下,能听到一根针掉在地上,而在嘈杂的环境中,声音强度差一倍,我们并不能区别的出。所以声音的响度通常是用分贝做单位,它实际就是将声音强度(幅值)对数化的表示。

A/U律实际是采用损失大信号的准确度来弥补和增加小信号的不失真。

早期,都是通过比较贵的,专用的8位A/U律芯片做编解码器实现。后来DSP芯片出来,人们开始用DSP来做处理。

用专用的8位A/U律芯片做编解码器实现比较简单,数据本身就是8位,省下的就是传输和保存了。

用DSP处理的方法,通常是先采用12位或更高16位的线型ADC对信号采样(8K),然后在DSP中对这个采样信号再进行A/U律的转换,转换采用与对数曲线近似的13段折线,将12bit值转换成8bit值,这个转换包含了2个意义:1、数据压缩(12bit变成8bit);2、压限(压制大信号变化幅度)。这个数据压缩实际就是让大信号失真大些换来的。只不过人耳不容易察觉到而已。

现在再看回放:
1。将8位的A/U律数据在DSP中做反变换,回到12bit的值,然后用普通12位的DAC放出。
2。使用8位的A/U律解码器,当然这个解码器要有扩展的功能,用于弥补压限的失真。

这些DD只是在数字语音通信中使用,而在其它数字音频中通常是不用的。因为16位的ADC和DAC效果已经远远好于8位的A/U律了,而且不需要繁复的变换,电路上也容易实现。
发表于 2010-9-29 08:11:28 | 显示全部楼层
用PWM实现CD级的音频输出在业界是以很成熟的方案了。
SAMSUNG在几年前就推出商用及的蕊片。PIC32也有PWM输出音频的应用。
不多说请看图:



(原文件名:1.JPG)


(原文件名:2.JPG)


(原文件名:3.JPG)


(原文件名:4.JPG)
发表于 2010-9-29 08:40:29 | 显示全部楼层
楼上的显然对PWM了解的还不多。。

支持24bit 96KHz Sampling Rates的输入,和能还原24bit 96KHz Sampling Rates的信号完全不是一回事

TI的TAS5088A也一样号称支持24bit 192KHz Sampling Rates的IIS输入,但是它的PWM载频只有384KHz。。

想用384KHz的PWM载频去还原24bit 192KHz Sampling Rates的音频信号。。简直是天方夜谭。。。
发表于 2010-9-29 08:57:26 | 显示全部楼层
回复【124楼】roseason  
楼上的显然对pwm了解的还不多。。

支持24bit 96khz sampling rates的输入,和能还原24bit 96khz sampling rates的信号完全不是一回事

ti的tas5088a也一样号称支持24bit 192khz sampling rates的iis输入,但是它的pwm载频只有384khz。。

想用384khz的pwm载频去还原24bit 192khz sampling rates的音频信号。。简直是天方夜谭。。。

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


还原15-16bit的音频信号还是可以的。450KHZ以上的载频明显会导致芯片成本上升。
发表于 2010-9-29 09:46:20 | 显示全部楼层
回复【124楼】 roseason
-------------------------
请问是那只眼看到我有说“支持24bit 96KHz Sampling Rates的输入,和能还原24bit 96KHz Sampling Rates的信号完全是一回事 ”

我是只回复【122楼】==》(这也就是我本贴提出做16位的播放器原因之一)。
发表于 2010-9-29 10:01:40 | 显示全部楼层
回复【123楼】piccode
-----------------------------------------------------------------------

Sigma Delta调制和这里说的PWM调制完全是两回事。
发表于 2010-9-29 10:03:53 | 显示全部楼层
设计一个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元左右。
---------------------------------------------------------------
就成本来说,用PWM比DAC有绝对的优势,并且也能输出“CD 级”音质输出。放44.1khz,16位,双通道CD音质搂主方案可行。
发表于 2010-9-29 12:16:53 | 显示全部楼层
mark~
发表于 2010-9-29 14:18:41 | 显示全部楼层
前面有网友说两个PWM占空比相同时得到的输出不是需要的结果,下面是我的分析,
如果可将PWM输出等效为DAC的话,那么不存在前面说的问题,我分析错了吗?

(原文件名:IMG_1820.jpg)

修改:
但V1=V2时,又确实有Vo=(255V1+V2)/256=v1=v2的结果。
又改:
哦,错了,我们需要的是 Vo = (256*D1+D2)/65536 Vref,而上面是Vo=(255*D1+D2)/65536 Vref
发表于 2010-9-29 14:40:01 | 显示全部楼层
既然上面的分析已经找到错在哪里了。那么在后面用一个加法电路,得到一个

Vo2=Vo+1/256*V1

的信号是否就理论上解决了问题?
发表于 2010-9-29 14:48:55 | 显示全部楼层
回复【130楼】ifree64
如果可将pwm输出等效为dac的话,那么不存在前面说的问题,我分析错了吗?
-----------------------------------------------------------------------

问题是不能将PWM输出等效为DAC,只有经过低通后才能等效为DAC,然而上面提到的理论都是在低通前合成的。
假设前提否定了,后面的推算就全部不成立了。

实际上,V1/V2只有0或Vref两个值,是通过占空比来实现0-Vref之间细分,所以出现一个问题就是V1 = V2时,两个电阻并联,Vo还是等于V1或V2,而不是V1 + 1/256 V2。

不过,节点的电流是可以并联合成的,将你的等式中的V换成I,就成立了。所以两个PWM用比例电阻合成更高精度,还需要一个I-V变换电路。
发表于 2010-9-29 15:22:45 | 显示全部楼层
回复【132楼】gzhuli 咕唧霖
-----------------------------------------------------------------------

我后面发现问题所在了,即便是DAC,用那两个电阻也得不到正确的结果。
因为我们需要的是Vo = VREF * (256*D1+D2)/65536 , 而上面电路的到的结果是
Vo = VREF * (255*D1+D2)/65536而且,通过改变R1、R2的比例也是无法得到需要
的结果的,所以不是在V1=V2时不行,而是所有的V1、V2得到的都不是需要的结果。

我分析中将PWM等效为DAC没有提到滤波是为了简化问题,因为我觉得这个问题在本质上
是如何将两个8位DAC叠加得到一个16位DAC的问题。
发表于 2010-9-29 16:04:34 | 显示全部楼层
回复【130楼】ifree64  
前面有网友说两个pwm占空比相同时得到的输出不是需要的结果,下面是我的分析,
如果可将pwm输出等效为dac的话,那么不存在前面说的问题,我分析错了吗?

 (原文件名:img_1820.jpg) 

修改:
但v1=v2时,又确实有vo=(255v1+v2)/256=v1=v2的结果。
又改:
哦,错了,我们需要的是 vo = (256*d1+d2)/65536 vref,而上面是vo=(255*d1+d2)/65536 vref
-----------------------------------------------------------------------

哥们你 R1=255R2 ?  


vo = vref*(256*d1+d2)/(2^16) ←正确

最开始我已经在24楼说过了,看来大家都只关注LZ的发言了,那我就划水了.........
发表于 2010-9-29 17:27:38 | 显示全部楼层
回复【134楼】90999  张耀扬
-----------------------------------------------------------------------
哥们你 r1=255r2 ?  

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

事实上,设 R2 = xR1,有
Vo = (xD1+D2)/((1+x)256)*Vref
如果要凑分母,x取255,要凑分子x取256,但不管如何都得不到正确的结果。


其实我们想要的不过就是 Vo=V1+V2/256这样一个结果,用一个加法电路不就行了吗?
发表于 2010-9-29 19:55:10 | 显示全部楼层
Vo = (xD1+D2)/((1+x)256)

   = Vref * (xD1+D2) / (256+256x) <-没错啊


2^8 = 256 != 255 !

问题是你为什么要取 x取255 ?
发表于 2010-9-29 21:33:32 | 显示全部楼层
x取255,则分母是 (1+x)*256=(1+255)*256=2^16
发表于 2010-10-11 17:24:52 | 显示全部楼层
http://bbs.mydigit.cn/read.php?tid=193645&page=1
数码之家好像有个比较简单的,用51做的
 楼主| 发表于 2010-10-11 19:43:58 | 显示全部楼层
这个方案不能实现放16位的WAV文件。
发表于 2010-11-13 19:09:26 | 显示全部楼层
回复【27楼】roseason
回复【24楼】90999 张耀扬  
-----------------------------------------------------------------------  
呵呵,楼上可以假设,高8位寄存器和低8位寄存器的值都是8f,即16位的8f8f,这时候的输出应为(8f8f/ffff)*5vref=32639/65536*5=2.4901v  
但是此时电路的输出却是2.5v(不是“约等于”哦。。),这个你做何解释呢?
-----------------------------------------------------------------------

我觉得这里这个问题的来源是关于PWM的满幅度输出是不是100%,即0x00到0xff输出的占空比是多少。一般0x00,都是输出0%,而0xff呢,是255/256还是100%?
即0xff的输出是[100%]还是[255/256],如果是100%则不存在这个问题,因为PWM无法输出精确的50%,0x7f对应的不是精确的50%,而是127/255。
如果0xff的输出是[255/256],那么0x8080对应的才是50% ,而0xffff对应的最大值也不是100%,而是稍微小于100%,即不是5V
发表于 2010-11-13 21:02:10 | 显示全部楼层
赞成马老师的观点,用PWM作为DAC,本身成本低,还容易实现直接数字功放级,效率也比较高。
发表于 2010-11-20 13:19:56 | 显示全部楼层
mark下
发表于 2010-11-20 13:41:17 | 显示全部楼层
回复【140楼】sharpufo  风生水起月皎白


我觉得这里这个问题的来源是关于PWM的满幅度输出是不是100%,即0x00到0xff输出的占空比是多少。一般0x00,都是输出0%,而0xff呢,是255/256还是100%?
即0xff的输出是[100%]还是[255/256],如果是100%则不存在这个问题,因为PWM无法输出精确的50%,0x7f对应的不是精确的50%,而是127/255。
如果0xff的输出是[255/256],那么0x8080对应的才是50% ,而0xffff对应的最大值也不是100%,而是稍微小于100%,即不是5V
-----------------------------------------------------------------------

不知道你们为什么取分母是255。0-255一共256个,那么0= 0%,128=50%,255=99%。有0为何还需要100%? 100%-0% = 1。
当有2个PWM的时候,A负责高八位,B负责低八位,这就可以了。
发表于 2010-11-20 14:18:08 | 显示全部楼层
mark
发表于 2010-11-24 17:14:49 | 显示全部楼层
mark
发表于 2010-11-24 18:03:01 | 显示全部楼层
不做实际产品的人根本不知道性价比的重要



3块钱IC, OTP,  42M DSP 内核, DAC双通道,带  DAC—PWM AMP,直推喇叭



(原文件名:H61.JPG)
发表于 2010-11-24 19:57:28 | 显示全部楼层
留个名先
发表于 2010-12-1 11:07:03 | 显示全部楼层
站位
发表于 2010-12-1 12:23:24 | 显示全部楼层
mark
发表于 2010-12-1 12:46:35 | 显示全部楼层
好东西,记号一个。
发表于 2010-12-1 13:47:32 | 显示全部楼层
不错的东东,mark一下。
 楼主| 发表于 2010-12-1 17:17:31 | 显示全部楼层
回复【146楼】icecoli
不做实际产品的人根本不知道性价比的重要
3块钱ic, otp,  42m dsp 内核, dac双通道,带  dac—pwm amp,直推喇叭


(原文件名:h61.jpg)
引用图片

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

这块芯片我用过,已经有几个产品上用了。不过只是“用”,没有从低层开发,是二次开发的使用。国内有N家小公司靠这片芯片吃饭,但是做的东西不怎样,根本没有发挥此芯片的真正的性能,语音质量不行。

这个芯片有2路16位的DAC的确不错,可是使用上有以下的不足:

1。由于芯片的储存量不是“海量”,所以必须使用压缩格式的WAVE文件,才能保证所谓40秒、80秒的存储量。以下就是由这个关键点造成的。

2。国内的开发人员,实际对压缩和解压的算法并没有深入的研究,算法的实现通常有问题。
3。要在PC上对WAV文件做压缩处理,然后再写到芯片,而且是一次性的。这对于需要更换语音的应用就不方便了。更换语音就以为者原来的系统扔掉。
4。芯片在放语音于前需要做“解压”工作,这个对这块芯片实际是很难做好的,当采样频率比较高,比如22K以上,解压的时间已经跟不上放音的需要了。而22K只是广播级的语音质量
5。合成器只能放点标准的MIDI音乐,PC上做的扩展的midi音乐,在它上面是不能放的。另外人的声音、歌曲等MINI是做不出的,只能做些音乐。

    由于以上几点,尽管这块芯片便宜,但是输出的音质和音乐效果有限,所以只能在什么玩具、电饭锅等低挡应用中使用。稍微高挡的应用(比如公交车车上的报站器---既能报站,还能放各种广告、背静音乐、音频数据需要方便的更换)就不适合了。

    您没有看我LZ位的要求:是达到 44.1k 16位的音质。单靠这块芯片有点危险。

    另外的可能性是使用这块芯片读SD卡,利用它本身的2路16位DAC,是可以做到LZ位的要求的,但要考虑软件空间是否能放下文件系统,以及R芯片内RAM的大小。但我没有找到国内提供开发工具的代理。【146楼】icecoli,你能提供点信息,或提供开发的工具和资料,我可以购买一套玩玩。
发表于 2010-12-9 18:37:05 | 显示全部楼层
mark

一直以为pwm和sigma delta是一回事 1bit dac
 楼主| 发表于 2010-12-29 02:35:20 | 显示全部楼层
本方案已经比较完美的实现了,见http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4476051&bbs_page_no=1&bbs_id=1003
发表于 2010-12-29 08:24:13 | 显示全部楼层
好贴
发表于 2011-2-16 22:34:07 | 显示全部楼层
呵呵,不错,正在用STM8来做。
发表于 2011-6-18 21:11:41 | 显示全部楼层
马克之
发表于 2011-7-16 15:19:42 | 显示全部楼层
强帖,顶起
发表于 2011-7-16 22:26:48 | 显示全部楼层
mark
发表于 2011-7-16 23:11:03 | 显示全部楼层
mark..
发表于 2011-8-3 11:01:23 | 显示全部楼层
已经实现了SD卡上FAT文件系播放BMP图片的功能,下个目标是放WAV音乐,但一直在考虑的问题是怎么保证数据不断流,因为我试过将SD卡读写和文件系统做最大的优化读一个扇区也要花1.38ms,这样怎么保证44.1k 8-bit 的速率?
发表于 2011-8-3 11:24:09 | 显示全部楼层
回复【161楼】cocotan_2009
已经实现了sd卡上fat文件系播放bmp图片的功能,下个目标是放wav音乐,但一直在考虑的问题是怎么保证数据不断流,因为我试过将sd卡读写和文件系统做最大的优化读一个扇区也要花1.38ms,这样怎么保证44.1k 8-bit 的速率?
-----------------------------------------------------------------------

如果是8b/44.1k, 2通道的wav, 保证不断流, 播放速率要大于44.1*8*2/8=88.2B/ms, 读一个扇区要1.38ms, 即读文件速度是512B/1.38ms=371B/ms, 读文件速度大于播放速率, 够了. 播放16b/44.1k, 2通道的wav也完全没问题.
发表于 2011-8-3 12:02:08 | 显示全部楼层
我这段时间也在琢磨这个PWM变DA的方法,关注一下
发表于 2011-8-3 12:10:13 | 显示全部楼层
mark~
发表于 2011-8-3 12:29:28 | 显示全部楼层
mark
发表于 2011-8-3 12:38:25 | 显示全部楼层
o
发表于 2011-8-5 17:40:28 | 显示全部楼层
回复【162楼】cheungman
-----------------------------------------------------------------------
谢谢你的指正,我今天做出来了,音质还不错。开始想法有误,我一直以为要读完一个扇区512B再去播放,放完了再去读,这样计算的话中间要停1.38ms肯定不行。当时也考虑过开辟一段FIFO一边读一边放,利用中断来更新PWM数据,但又担心中断会冲乱SD卡的操作时序,以为SD卡在读扇区的时候不能被打断。呵呵!!!其实这是错误,的因为和SD卡连结的SPI总线是工作在主机模式下,也就是说在读的过程中被打断了也没关系,进入中断程序后SPI的CLK也是停止的,等忙完了中断回到原来的位置继续读并不能受引响。不过现在我只是播放8BIT 22K的WAV文件,我试了44K但效果差不多,我想主要是PWM的基频有限,20M主频/256=78K左右,基频还不到44K的两倍。再说1.38ms是只读一个扇的时间,不包括文件系所花费的时间。
发表于 2011-9-2 23:52:19 | 显示全部楼层
mark
发表于 2011-10-11 08:56:50 | 显示全部楼层
回复【167楼】cocotan_2009
-----------------------------------------------------------------------

512b是MP3
发表于 2011-12-4 14:45:04 | 显示全部楼层
学习!
发表于 2011-12-24 09:12:14 | 显示全部楼层
学习一下
发表于 2012-1-5 11:58:06 | 显示全部楼层
mark
发表于 2012-1-5 12:34:06 | 显示全部楼层
mark,以后再来
发表于 2012-1-5 19:13:21 | 显示全部楼层
mark
发表于 2012-1-25 14:27:19 | 显示全部楼层
回复【楼主位】machao
-----------------------------------------------------------------------
马老师请教您个问题,您写的这段话我不太理解重复3-4次这样输出的电压是不是比例不对了啊?

代码充分发挥AVR的性能,尽量提高PWM波的频率(8000000/256
= 31.25KHz),采用将一个数字音频采样点重复3-4次(多次PWM产生同一个音频点)的方
发表于 2012-2-4 11:06:15 | 显示全部楼层
看看我的插卡音箱,我告诉你用3元成本实现的方法。
发表于 2012-2-18 11:47:18 | 显示全部楼层
回复【楼主位】machao
-----------------------------------------------------------------------

马老师:
我尝试用adc 对声卡输出音频8位采样再用pwm回放但是噪声较大(PWM 播放片内8位wav数据没有噪声),请问应该对输入做怎样的处理。
发表于 2012-2-22 00:19:47 | 显示全部楼层
mark!!!
发表于 2012-10-19 06:00:01 | 显示全部楼层
machao 发表于 2010-9-27 01:02
回复【43楼】ifree64
回复【4楼】machao   
如果用16位的pwm实现44k的da,那么定时器时钟要达到2884m!

谢谢,这份英文资料很有用
 楼主| 发表于 2012-10-19 21:09:26 | 显示全部楼层
32位MCU的价格和性能越来越好,可惜真正会玩的,并且是玩的好的朋友越来越少。悲哀!
发表于 2012-12-12 16:57:44 | 显示全部楼层
膜拜学习了,pwm&da
发表于 2013-6-17 10:30:32 | 显示全部楼层
单声道还行,两个声道就更麻烦了。
发表于 2013-7-4 08:37:07 | 显示全部楼层
学习了!
 楼主| 发表于 2013-7-6 00:18:28 | 显示全部楼层
sqmm 发表于 2013-6-17 10:30
单声道还行,两个声道就更麻烦了。

AVR的话,M128肯定可以实现。51架构的MCU,STC,10月推出的芯片也可以实现。STM32、M051肯定可以。
基本条件为:有4路8位PWM输出,带SPI硬件接口。系统时钟工作在44100*256 = 11.2896M。SPI的时钟在5M以上。
发表于 2014-5-7 07:00:16 来自手机 | 显示全部楼层
好帖                                    
发表于 2014-5-7 08:29:06 | 显示全部楼层
mark.......
发表于 2015-8-9 23:32:33 | 显示全部楼层

膜拜学习了,pwm&da
发表于 2015-8-12 01:03:26 | 显示全部楼层
这个要mark
发表于 2018-5-25 12:01:01 | 显示全部楼层
谢谢!留着怀疑,回去研究一下。。。
发表于 2019-4-12 12:00:38 | 显示全部楼层
又是一座古坟贴
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2019-9-15 18:56

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

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

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