造一台软DAC
5932 99
[71 楼] laurel_lei [老坛泡菜]
09-9-7 22:43
原文由 sc37 发表
DAC一般是电流输出的,加个电阻把电流转换成电压,电阻噪声相当可观。即使做出来132 dB的信噪比又有什么意义?


所谓132DB是指在官方的DEMO板上测的指标,官方DEMO用的是有源IV,也就是用运放做的,IV用的是NE5534,差分转单端用的是LT1028,很有意思的搭配,SNR在这个电路上测的。
不是用无源IV,无源IV因为D/A内部保护电路的限制,输出电平太低。

[2009-09-07 23:01 补充如下]

对于电阻上的噪声,在给定条件下你可以计算一下,比如带宽20KHZ,电阻100欧,温度20度,波兹曼常数应该是1.38x10^-23。
我记得算热噪声只要知道这几项就可以了。
[70 楼] sc37 [泡菜]
09-9-7 22:34
DAC一般是电流输出的,加个电阻把电流转换成电压,电阻噪声相当可观。即使做出来132 dB的信噪比又有什么意义?
[69 楼] laurel_lei [老坛泡菜]
09-9-7 22:24
原文由 sc37 发表
这个很容易估算。假设信号幅度是1伏,为了得到120 dB的信噪比,音频范围内的总噪声必须小于1微伏。这可不是容易的事。


简单按120=20log10(Us/Un)算,正好是1uV,虽然比较难,但不一定做不到,目前SNR达到120dB或更高的D/A已经有好几款了,我用的PCM1794在MONO方式下,手册给的SNR是132dB,当时是最高的!
但实际RMAA之类的SNR应该是做FFT,并且对0-pi内每个频点噪声功率求和,作为总的噪声功率,信号用单点的信号功率。
[68 楼] sc37 [泡菜]
09-9-7 22:04
原文由 laurel_lei 发表

  关键问题不是可信不可信的问题,问题是如何测试,用什么仪器测试,测试环境是什么样的。117dB是PC音响爱好者在家用环境下对声卡的自环测试,软件是RMAA,D/A输出通过环回到A/D上,得到环路的信噪比,应该说这个指标还是很高的,假设测试的时候采样率为192KHZ,则信噪比可以表征在96KHZ带宽下的信噪比。
  dB本来就是 ......
这个很容易估算。假设信号幅度是1伏,为了得到120 dB的信噪比,音频范围内的总噪声必须小于1微伏。这可不是容易的事。
[67 楼] laurel_lei [老坛泡菜]
09-9-7 19:58
为了DIY这个sDAC,添购了不少东西,这个AKG242HD耳机就是其中之一
此外,还DIY了一个山寨版的莱曼耳放,耳放机箱和PCB从淘宝上买的。
[66 楼] laurel_lei [老坛泡菜]
09-9-7 19:53
感谢朋友们一起讨论,关注我的帖子,接下来我会不定期的再贴sDAC的设计原理和设计细节。
[65 楼] laurel_lei [老坛泡菜]
09-9-7 19:49
原文由 sc37 发表
用一个足够大的存储器,以一个频率读进,再以另一个频率独处。可以吗?


理论上可行,但实际操作上这个足够大的存储器要非常的大。另外还有受不了的延时。
[64 楼] laurel_lei [老坛泡菜]
09-9-7 19:48
原文由 sc37 发表
其实我想说得是,117dB的信噪比其实有些困难,但是加权下情有可原,对这些数不能照单全收。


  关键问题不是可信不可信的问题,问题是如何测试,用什么仪器测试,测试环境是什么样的。117dB是PC音响爱好者在家用环境下对声卡的自环测试,软件是RMAA,D/A输出通过环回到A/D上,得到环路的信噪比,应该说这个指标还是很高的,假设测试的时候采样率为192KHZ,则信噪比可以表征在96KHZ带宽下的信噪比。
  dB本来就是一个相比的结果,所以如果我都用RMAA,则对不同声卡自环的测试结果是有参考价值的。因为即使绝对精度不是很准,但是相对精度是准的。
[63 楼] laurel_lei [老坛泡菜]
09-9-7 19:43
原文由 sc37 发表
严格说,不对。热噪声也只是到一定频率而已,否则有无限功率,岂不天下大乱?

运放的噪声用每HZ的噪声功率密度表示,信噪比都是在一定带宽条件下测试,数字系统的信噪比是在频率范围0-2pi范围内,都是有范围的。
[62 楼] laurel_lei [老坛泡菜]
09-9-7 19:41
原文由 sc37 发表
这么说10Hz其实有些随意,慢的变化算飘移,快的算jitter。20Hz,50Hz也未尝不可。

JITTER的定义就是10HZ以上的变化
[61 楼] imareal [泡菜]
09-9-7 13:05
原文由 sc37 发表
用一个足够大的存储器,以一个频率读进,再以另一个频率独处。可以吗?

此法不可用于实时播放。如果Frd > Fwr,存储器空,音乐中断。如果Frd < Fwr,存储器满,无法读入,丢失音乐片段。
[60 楼] sc37 [泡菜]
09-9-7 06:49
原文由 laurel_lei 发表

  我也不是专业搞audio的,因此DAC上有我在的行业的一些烙印,没办法,每个领域都有自己的惯常思维习惯。
  线性插值可以提高镜像频率的,但是用不同的插值方法,镜像频率的功率是不同的,举个最简单的例子,根据采样率理论,当我输出的信号是由脉冲构成时,带内的功率和带外每个镜像具有同样的功率,而实际上D/A是带保持 ......
用一个足够大的存储器,以一个频率读进,再以另一个频率独处。可以吗?
[59 楼] sc37 [泡菜]
09-9-7 06:48
原文由 laurel_lei 发表

假设在频域上噪声的带宽无限宽,则信噪比会无限低。所以信噪比一定是指在一定频带内的信噪比。
其实我想说得是,117dB的信噪比其实有些困难,但是加权下情有可原,对这些数不能照单全收。
[58 楼] sc37 [泡菜]
09-9-7 06:45
原文由 laurel_lei 发表

假设在频域上噪声的带宽无限宽,则信噪比会无限低。所以信噪比一定是指在一定频带内的信噪比。
严格说,不对。热噪声也只是到一定频率而已,否则有无限功率,岂不天下大乱?
[57 楼] sc37 [泡菜]
09-9-7 06:43
原文由 laurel_lei 发表

一般10HZ以下的时钟变化作为时钟漂移,时钟漂移的后果带来的是音调的变化,但实际上由于漂移非常小,最多才几十个PPM,因此耳朵听不出来,(盒式磁带的带速变化可以达到3%以上,耳朵可以听到音调变化)
10HZ以上作为JITTER,分确定性和非确定性两种,这里要降低的是非确定性的JITTER,因此用一个非常窄带宽的锁相环+FIFO ......
这么说10Hz其实有些随意,慢的变化算飘移,快的算jitter。20Hz,50Hz也未尝不可。
[56 楼] imareal [泡菜]
09-9-7 00:53
原文由 laurel_lei 发表
异步数据则是FPGA中一个比较灾难性的问题,必须同步后才可用,否则就会出现建立/保持时间不满足引起的亚稳态,因为你用第二个时钟去采样第一个时钟域的数据的时候,是无法保证建立/保持时间的,由此带来一些比较麻烦的问题,一般这个异步是比较忌讳的东西。
sDAC为何时钟电路比较复杂?原因很简单,就是为了将本地时钟和输入时钟同步,避免这些亚稳态带来的问题。

你可能没有注意我说的Fs转换的工作原理,第二个时钟不是直接去采样第一个时钟域的数据,是从buffer中从容取出,计算时间上相应的值,作为第二个时钟域的数据,有几个时钟的延迟,没有建立/保持时间的问题。即使你在fpga中实现这种算法,也不难,只是现成的芯片很成熟了。
我说的不是FPGA的时序违规的情况,是太多的逻辑电路同时动作,尤其是FF,引起电源,地线的窜扰,也会影响模拟部分,EDA软件也无能为力。

[imareal 编辑于 2009-09-07 01:00]
[55 楼] laurel_lei [老坛泡菜]
09-9-6 22:34
原文由 triplex 发表

如果不用线性插值,用别的方式插值效果如何? 比如用Cubic插值。


Cubic我不太了解,好像是图像处理中用的。不排除用在音频中也是可行的。
sDAC中也没有用线性插值,线性插值似乎在单片机中和控制上用的多些。
sDAC中插值用的是滤波器。
插值也是个比较好玩的东西,因为不同内插下方法下声音是略有区别的。
[54 楼] triplex [资深泡菜]
09-9-6 22:21
原文由 laurel_lei 发表

  我也不是专业搞audio的,因此DAC上有我在的行业的一些烙印,没办法,每个领域都有自己的惯常思维习惯。
  线性插值可以提高镜像频率的,但是用不同的插值方法,镜像频率的功率是不同的,举个最简单的例子,根据采样率理论,当我输出的信号是由脉冲构成时,带内的功率和带外每个镜像具有同样的功率,而实际上D/A是带保持 ......

如果不用线性插值,用别的方式插值效果如何? 比如用Cubic插值。
[53 楼] laurel_lei [老坛泡菜]
09-9-6 20:49
原文由 sc37 发表
通用硬件平台?很有意思啊?可以给那些发烧友产生一些斜坡信号练耳朵。


嘿嘿,你的想法不错,看看还能弄出什么花样来,用软件实现起来比硬件要方便的多。
sDAC在做硬件调试的时候,实现的第一个功能就是一个信号发生器。。。因为那个时候输入部分还没开始调试。只写了D/A一部分代码。
以后的以后,她才变成了一个DAC。。。
[52 楼] laurel_lei [老坛泡菜]
09-9-6 20:42
原文由 imareal 发表

我现在用玩家的眼光来看你的设计了,虽不是玩家,但也想看玩家玩。看样子我们是同行,但audio不是我的主业,很多东西我不太懂。我说的80DB不是结论,是经验之谈。
我总觉得即使是最简单的线性插值,也可以推高镜像频率。
另外一个FPGA中多个48bit的乘法器一起动做做一件事,按我的经验,简直是灾难,使得整个系统不稳定 ......

  我也不是专业搞audio的,因此DAC上有我在的行业的一些烙印,没办法,每个领域都有自己的惯常思维习惯。
  线性插值可以提高镜像频率的,但是用不同的插值方法,镜像频率的功率是不同的,举个最简单的例子,根据采样率理论,当我输出的信号是由脉冲构成时,带内的功率和带外每个镜像具有同样的功率,而实际上D/A是带保持的功能的,因此带外的功率按Sa函数的规律衰减,如果我用高的运算精度的FIR滤波器,则带外衰减可以超过100dB以上,这个很容易做到。
  FPGA的设计中,对于代码风格有很严格的要求,为的就是使得FPGA不会出现一些不应该有的时序违规的情况,在FPGA的综合和布线后,还需要做STA(静态时序分析),通过这些仿真的手段来保证建立/保持时间满足设计要求,这些都是很成熟的东西。如果STA有负的slack,则系统会出现不稳定情况,在FPGA的逻辑设计中,这些slack必须修掉,这样系统不会有任何不稳定的情况。这是通过EDA软件来保证的。
  异步数据则是FPGA中一个比较灾难性的问题,必须同步后才可用,否则就会出现建立/保持时间不满足引起的亚稳态,因为你用第二个时钟去采样第一个时钟域的数据的时候,是无法保证建立/保持时间的,由此带来一些比较麻烦的问题,一般这个异步是比较忌讳的东西。
  sDAC为何时钟电路比较复杂?原因很简单,就是为了将本地时钟和输入时钟同步,避免这些亚稳态带来的问题。

[laurel_lei 编辑于 2009-09-06 20:44]
[51 楼] laurel_lei [老坛泡菜]
09-9-6 20:29
原文由 sc37 发表
各种各样的加权相当于在噪声上加了滤波器,因此无中生有地“改善”信噪比,比裸的信噪比肯定好。这些加权不能说没有意义,因为它们模拟人耳的响应。谈到“A加权的”信噪比,一定不要忘了前提。

如果没有加权,一个50欧电阻在音频带宽里的热噪声都有可能使117dB成为不可能。


假设在频域上噪声的带宽无限宽,则信噪比会无限低。所以信噪比一定是指在一定频带内的信噪比。
[50 楼] laurel_lei [老坛泡菜]
09-9-6 20:28
原文由 sc37 发表
10Hz怎么得打出来的?

一般10HZ以下的时钟变化作为时钟漂移,时钟漂移的后果带来的是音调的变化,但实际上由于漂移非常小,最多才几十个PPM,因此耳朵听不出来,(盒式磁带的带速变化可以达到3%以上,耳朵可以听到音调变化)
10HZ以上作为JITTER,分确定性和非确定性两种,这里要降低的是非确定性的JITTER,因此用一个非常窄带宽的锁相环+FIFO可以保证在远端的相位噪声完全由本地时钟自身的性能决定。选择一个JITTER较低的本地时钟很重要。发烧友往往对晶振是几个PPM的指标比较关心,但实际上PPM和JITTER没有直接关系。

[laurel_lei 编辑于 2009-09-06 20:30]
[49 楼] imareal [泡菜]
09-9-6 15:25
原文由 laurel_lei 发表
看的出老兄应该是电子行业里做的。
  你说的“引起问题不是与取样相干的频率,而是不相干的”没错,只是没听懂我的意思或者我没说清楚,在信噪比的计算中,因为真正的信噪比算起来比较麻烦,所以有时候用信噪谐波比SINAD来代替SNR,计算起来比较方便点,因为信号功率只计算一个点频,实际SINAD会比SNR略低,也就是说相 ......

我现在用玩家的眼光来看你的设计了,虽不是玩家,但也想看玩家玩。看样子我们是同行,但audio不是我的主业,很多东西我不太懂。我说的80DB不是结论,是经验之谈。
我总觉得即使是最简单的线性插值,也可以推高镜像频率。
另外一个FPGA中多个48bit的乘法器一起动做做一件事,按我的经验,简直是灾难,使得整个系统不稳定,甚至产生误差,频率低可能没事,高了就一团糟,取决于fpga本身的性能。从这个角度说,还是简单点好。

“对于异步采样率转换,实现上存在两个异频异相的时钟域,问题出在第一个时钟域向第二个时钟域传输数据的时候,会引起亚稳态等严重的问题,这个对于要求高的音频(普通语音传输可以容忍数据错误,但HIFI不可容忍)这个是完全不可接受的。如果我用FPGA去做异步采样率转换,那问题就更复杂。”

我不太明白第一个时钟域向第二个时钟域传输数据的时候,为什么会引起亚稳态等严重的问题。我所知道的这种芯片的原理是再取样,两个时钟域之间没有数据的直接传输。相当于第一个时钟域的数值送到D/A, 再送到A/D, 用第二个时钟再取样,没有数据错误的顾虑。当然不是真正的D/A, A/D, 没有模拟环节,全部数字化,第一个时钟域的数值送到buffer,再用第二个时钟重新计算与其相应的数值。这中间要用硬件插值滤波,有一套算法。就是为HIFI设计的,其转换精度绝对不比插值运算低(根本就是插值)。所以我认为与其用DDS去提取多种格式输入信号的时钟,不如只取它们的值,不管它们载体,使其适应自己的载体(载体指时钟频率说的)。
我真的不信发烧友能听出差别,一般仪器都测不出差别。从实际效果和硬件资源的占用,都很不错。如果是我,一定会这样搞。
当然想换个玩法,另当别论,DDS也很好玩。

[imareal 编辑于 2009-09-06 15:35]
[48 楼] sc37 [泡菜]
09-9-6 14:50
通用硬件平台?很有意思啊?可以给那些发烧友产生一些斜坡信号练耳朵。
[47 楼] sc37 [泡菜]
09-9-6 14:36
原文由 laurel_lei 发表

  信噪比这个指标,指的是信号功率与噪声功率之比,一般用单频信号测试,在单频信号的频点功率与谐波功率(或者不计谐波功率)除以频带内的噪声功率,因此信噪比是与频带有关的值,单单说信噪比没有意义,音频里用A记权比较多一点,因此你说的80dB的信噪比我不知道是怎么推算出来的,请明示一下。举个例子,E-MU的1212M ......
各种各样的加权相当于在噪声上加了滤波器,因此无中生有地“改善”信噪比,比裸的信噪比肯定好。这些加权不能说没有意义,因为它们模拟人耳的响应。谈到“A加权的”信噪比,一定不要忘了前提。

如果没有加权,一个50欧电阻在音频带宽里的热噪声都有可能使117dB成为不可能。
[46 楼] sc37 [泡菜]
09-9-6 14:27
原文由 laurel_lei 发表

此外,sDAC为了尽可能减小JITTER,DDS锁频环的环路滤波器的带宽要求非常窄,要在10HZ以下,普通的模拟锁相环不好做。
不过现在根据实测音源的情况,以后准备改用其他方案,不过成本又上去了。
10Hz怎么得打出来的?
[45 楼] laurel_lei [老坛泡菜]
09-9-6 14:01
imareal你说的:不过最好的设计,是最简单的设计,应该是每个设计师的座右铭。只是不适用于玩家。玩家玩的是趣味,兴奋的是探索。

这个很赞同,sDAC的最早的想法,就是想做一台和普通的DAC不同的东西,同时作为一个通用的硬件平台,可以实现其他硬件方式下不容易实现的一些功能。

[laurel_lei 编辑于 2009-09-06 14:02]
[44 楼] laurel_lei [老坛泡菜]
09-9-6 13:48
原文由 imareal 发表

我说的80db是比较简单的测试,不很严格,总之给我的印象是数字部分的干扰很难避免。引起问题不是与取样相干的频率,而是不相干的。所以我觉得数字部分越简单越好。如果你有最后的结果,请公布一下,也让我有个新的概念。
16X的内插有多大意义?内插不能等于超采,因为没有新的信息,只是推算出来,只是平滑一点而已。如果 ......


看的出老兄应该是电子行业里做的。
  你说的“引起问题不是与取样相干的频率,而是不相干的”没错,只是没听懂我的意思或者我没说清楚,在信噪比的计算中,因为真正的信噪比算起来比较麻烦,所以有时候用信噪谐波比SINAD来代替SNR,计算起来比较方便点,因为信号功率只计算一个点频,实际SINAD会比SNR略低,也就是说相关的谐波和不相关的噪声均作为噪声处理。
  80dB的要求对多层板来说确实不高,这个板子是4层,如果要进一步提高,可以用6层,信号走内层。以前我做过高速数据采集的项目(多通道高速A/D采样),实测的SINAD可以推翻你的结论,当然,那个成本和这个没有可比性。
  对于异步采样率转换,实现上存在两个异频异相的时钟域,问题出在第一个时钟域向第二个时钟域传输数据的时候,会引起亚稳态等严重的问题,这个对于要求高的音频(普通语音传输可以容忍数据错误,但HIFI不可容忍)这个是完全不可接受的。如果我用FPGA去做异步采样率转换,那问题就更复杂。
  超采样和内插当然是不一样的,不过这里是个文字游戏,之前超采样我的理解仅限于CD机上标的多少X的超采样,搞了半天原来超采样就是行业里的过采样嘛,过采样的概念在A/D中用的比较多,在CD机上不过是个文字游戏。用在D/A上虽然没错,但是混淆视听,不是个专业名词。
  CD机或者音响里的所谓超采样率的意思就是内插率,超采样同样不增加新的信息。可能你理解的内插就是线性插值或者sinx/x插值,但实际信号处理中,不是那么做的。内插是靠FIR滤波器实现的。内插不增加新的信息,而是为了把镜像频率推到更高的频率上,减小模拟低通滤波器的设计难度。2X和16X的计算误差没有直接关系,而有关系的是数据截断误差。sDAC数据处理精度是48bit。
  采样率转换和没转换的效果,我只在别人的一块比较好的声卡上比较过(应该是非AC97的)进行转换可以点击一个按钮选择,在场的都认为没有进行转换的声音好些。你如果有条件的话也可以比较下。

[laurel_lei 编辑于 2009-09-06 13:48]
[43 楼] imareal [泡菜]
09-9-6 13:04
原文由 laurel_lei 发表
  信噪比这个指标,指的是信号功率与噪声功率之比,一般用单频信号测试,在单频信号的频点功率与谐波功率(或者不计谐波功率)除以频带内的噪声功率,因此信噪比是与频带有关的值,单单说信噪比没有意义,音频里用A记权比较多一点,因此你说的80dB的信噪比我不知道是怎么推算出来的,请明示一下。举个例子,E-MU的1212M ......

我说的80db是比较简单的测试,不很严格,总之给我的印象是数字部分的干扰很难避免。引起问题不是与取样相干的频率,而是不相干的。所以我觉得数字部分越简单越好。如果你有最后的结果,请公布一下,也让我有个新的概念。
16X的内插有多大意义?内插不能等于超采,因为没有新的信息,只是推算出来,只是平滑一点而已。如果为简化D/A后的滤波器考虑,2X就差不多了。16X引起的计算误差应该考虑,这么多数字电路一起动作,引起的电磁干扰得不偿失。只是我的疑问,没有仔细求证,提出商榷。
实际在数字电路中,异步意味着系统稳定性的下降,不错,但具体到你这个电路,我不同意这样说。用采样率转换后,全部系统只用一个频率,不需PLL,不需DDS, 又没有要和什么系统同步的数字输出,只是和输入不同步而已,应该是最稳定的。
玩声卡的都认为经过采样率转换的声音不如不转的,惭愧,我没有对比过,我只是看这类芯片的指标,也都是-117db(THD+N),想不出烧友怎样能感觉出来。
"再补充一下,DAC的D/A用的是PCM1794/1794,旁路了D/A内部的内插滤波器,用外部滤波器方式信噪比比内部滤波器略高,用FPGA做滤波器的最好玩的地方,在于可以随心所欲的调整滤波器的参数,不同参数下,声音是有点不同的。" --如果这么说,我就完全理解你搞这么复杂的设计的原因了,如果一开始就说,我就不会提出这么多疑问了。

[imareal 编辑于 2009-09-06 13:14]

[2009-09-06 13:20 补充如下]

不过最好的设计,是最简单的设计,应该是每个设计师的座右铭。只是不适用于玩家。玩家玩的是趣味,兴奋的是探索。
等你的结果。
[42 楼] laurel_lei [老坛泡菜]
09-9-6 11:50
原文由 imareal 发表

我的意见是根据你的板子的布局看,这么多数字电路陪伴高精度D/A电路,很难做到80db以上的信噪比。也许你有好办法也说不定,我只是存疑而已。
对于比如一个48k取样频率的音频信号,数字滤波器到底要滤掉什么呢?请比较详细的说明一下。
如果能完成同样的功能,简单自然好于复杂的。依我看,只要一片取样频率转换芯片加一 ......


再补充一下,DAC的D/A用的是PCM1794/1794,旁路了D/A内部的内插滤波器,用外部滤波器方式信噪比比内部滤波器略高,用FPGA做滤波器的最好玩的地方,在于可以随心所欲的调整滤波器的参数,不同参数下,声音是有点不同的。