论坛风格切换切换到宽版
  • 18205阅读
  • 212回复

方波的采样定理和DDS的问题 [复制链接]

上一主题 下一主题
离线alchemier
发帖
69
只看该作者 80楼 发表于: 2008-08-04
[quote=一异]这就对了!
对于16bit的累加器,4382对应的输出频率理论上应当是:10.698,242,187,5 mhz。估计你在32bit累加器的仿真过程中用了一个更接近10.7 mhz的近似值。
我猜想,两个不同的累加器输出的信号差异应当主要是由于这点微小的频率差异引起的。如果你在32bit 累加器的方针试验中,采用与16bit同样的频率,那么两者的输出是完全一样的,当然频谱也不会有任何差异。
你不妨尝试一下,稍微修改一下频率,频谱应当会有所变化。

再次申明:我不认为相位累加器的字长会导致相位抖动,只会影响频率分辨率。在你这个例子当中,实际上并没有得到10.7 mhz的精确频率,这正是由于有限的频率分辨率。
[/quote]

这个我同意。只是前面我说的相位抖动时是因为样表里面的样点数与相位增量不是整数倍数而引起的,这个抖动的周期是相位增量和样点数的最小公倍数。而不是单纯由相位累加器的位数决定的。
离线小比尔/5
发帖
2582
只看该作者 81楼 发表于: 2008-08-04
'
我觉得你把样表的样点数和每个样点的幅度也就是dac的位数搞混了。
'
见程序截图。

正弦表样点数∝地址线位数
dac精度∝dac位数
离线alchemier
发帖
69
只看该作者 82楼 发表于: 2008-08-04
[quote=小比尔/5]见程序截图。

正弦表样点数∝地址线位数
dac精度∝dac位数[/quote]

是我吧你那段话的意思理解错了。
离线alchemier
发帖
69
只看该作者 83楼 发表于: 2008-08-04
可能有一些名词容易搞混,从而引起概念搞混,我准备重新再描述一遍dds的原理,整理一下思路,请高手指教。
离线小比尔/5
发帖
2582
只看该作者 84楼 发表于: 2008-08-04
'
可能有一些名词容易搞混,从而引起概念搞混,我准备重新再描述一遍dds的原理,整理一下思路,请高手指教。
'

大概是因为大家看问题的角度不同吧,因为我的模型是从硬件来的,所以有些东西就拿硬件来做类比。另外有些名词也不知道用什么比较好,就随便写了。

像我最初做了硬件,然后用虚拟仪器测量结果,bd1es引出了仿真,大家一起写程序,一异说到了改进结构。我觉得这个讨论挺好的。
离线bd1es
发帖
2096
只看该作者 85楼 发表于: 2008-08-04
[quote=小比尔/5]大概是因为大家看问题的角度不同吧,因为我的模型是从硬件来的,所以有些东西就拿硬件来做类比。另外有些名词也不知道用什么比较好,就随便写了。

像我最初做了硬件,然后用虚拟仪器测量结果,bd1es引出了仿真,大家一起写程序,一异说到了改进结构。我觉得这个讨论挺好的。 [/quote]

是的。说实话起初我玩dds的时候以为这东西挺简单的,不就是个加法器嘛。可是后来做了avr的dds后大失所望,不知道信号为什么那么乱。后来搂主提问方波dds,我也简单阐述了dds的原理,但还是说不清方波dds与正弦波dds过零比较再形成方波,这之间到底差别多少,于是就想起了仿真。一仿不得了,发现所谓方波dds根本不能用,现在更严格说应该是1bit dds

但我还是没搞清avr dds为什么信号质量不佳。直到这两天进一步仿真才知道是波表质量太差造成的,那个波表是256字节乘8位的,连40db的信噪比都没有,自然觉得乱了。这个avr dds的案例应该还能在网上查到,是一个叫j什么什么的老外做的。程序是汇编的,dds累加器字长24比特,波表深度256字节。他写了正弦、斜波、三角波和方波的波表。那个方波的波表是我们批判最严重的一个。有兴趣的上网找找。

现在觉得dds仍然是简单的,它只有3个参量:累加器字长、波表寻址字长和波表输出字长,3个整数而已!可是把这3个整数组合起来,结果可是太出乎意料了。竟然有那么多的不知道,很有意思。大概这就是仿真的魅力吧, 。特别是大家一起的时候更好玩,颇有点儿指点江山的意思。(这话是盗版的 :d )

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

继续仿真昨天一异说的问题。又出乎意料:
1、16位dds,不管相位增量取什么值,输出都是一样的纯净;
2、32位dds,只有相位增量与16位dds等效时,输出才与16位一样纯,否则噪声增加。

说明什么问题?mainstreet的观点正确,波表越完整dds输出质量越高!

因为32位dds的相位增量与16位等效时,32位dds等效于16位的,于是他拥有完整的波表。而稍微把预制数拉偏后,这个“完整波表就不存在了”,于是出现截断问题,噪声增加。参见第3图,是不是有加矩形窗的嫌疑?

图1:16位dds,预制数8321
图2:32位dds,预制数8321*65536
图3:32位dds,预制数8321*65536+111
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线bd1es
发帖
2096
只看该作者 86楼 发表于: 2008-08-04
'
这个我同意。只是前面我说的相位抖动时是因为样表里面的样点数与相位增量不是整数倍数而引起的,这个抖动的周期是相位增量和样点数的最小公倍数。而不是单纯由相位累加器的位数决定的。
'

对,我们所能做出来的实用dds都有这种抖动。除非是dds的累加器很短,短到它可能拥有完整波表时不存在抖动问题,比如上面的16位dds。
离线一异
发帖
868
只看该作者 87楼 发表于: 2008-08-05
这里还需要考虑一个问题:对于32bit累加器,我们可能需要对更长的数据进行富利叶变换才能得到正确的结果,和实际电路不一样,对于仿真这儿可能实际上也有一个截断误差的问题。
这是我的猜想,否则无法解释32bit累加器和16bit累加器的误差。

我不认同所谓完整波表的说法,因为对于给定的dac字长,波表长度超过所需要的最大长度之后,增加的波表项都是重复的,不会对输出质量做出任何贡献。
离线一异
发帖
868
只看该作者 88楼 发表于: 2008-08-05
对于16bit的波表字长(dac字长),波表的理论大小应当是65535*π是理论上所需要的最恰当的波表大小。从理论上来说更大的波表示没有好处的,如果相位累加器是按照65535*π的整数倍运行,那么无论相位增加的步长是多少,查表的和按照相位累加器的寻址范围大小相同的波表得到的数据总是相同的,这在数学上时可以证明的——当然,这样的相位累加器实际上不可行的。

考虑到实际应用中,相位累加器对波表的要求,波表大小应当是2的n次幂,所以波表尺寸应当取65536*4=262,144(256k)。
在考虑到4不是π的整倍数,这会导致附加的截断误差,所以最好在256k的基础上适当的再增加一些,比如取1m个表项,或者2m。
当然,如果继续增加波表的尺寸应当还是有好处的,但得到的改善是肯定是很有限的,有兴趣的话你们可以继续用仿真来证实或者否定。
离线一异
发帖
868
只看该作者 89楼 发表于: 2008-08-05
'
对,我们所能做出来的实用dds都有这种抖动。除非是dds的累加器很短,短到它可能拥有完整波表时不存在抖动问题,比如上面的16位dds。 [表情]
'

我注意到:你在仿真的时候用了65536点的fft,这对于16bit累加起来说,正好是完整的一个周期,不会有附加的误差。但对于32bit累加起来说就不是这样了。
如果要用4g个点的fft大概是不可能的,不放再尝试一下其他的字长,比如20bit累加器,用65536点fft和1048576点fft又没有区别。或者将就16bit累加器的数据,做一下16384点的fft,看看是不是会出现32bit累加器输出类似的问题。
离线bd1es
发帖
2096
只看该作者 90楼 发表于: 2008-08-05
[quote=一异]我注意到:你在仿真的时候用了65536点的fft,这对于16bit累加起来说,正好是完整的一个周期,不会有附加的误差。但对于32bit累加起来说就不是这样了。
如果要用4g个点的fft大概是不可能的,不放再尝试一下其他的字长,比如20bit累加器,用65536点fft和1048576点fft又没有区别。或者将就16bit累加器的数据,做一下16384点的fft,看看是不是会出现32bit累加器输出类似的问题。[/quote]

是这样的吗?我猜您是想说fft的谱泄漏问题,可是请您再仔细看看程序吧。俗话说好脑筋不如烂笔头,动手试试就知道了。

fft只是在分析64k样点的序列而已,而分析精度只与序列本身有关,与是谁生成的无关。请您再仔细想想。
离线bd1es
发帖
2096
只看该作者 91楼 发表于: 2008-08-05
[quote=一异]对于16bit的波表字长(dac字长),波表的理论大小应当是65535*π是理论上所需要的最恰当的波表大小。从理论上来说更大的波表示没有好处的,如果相位累加器是按照65535*π的整数倍运行,那么无论相位增加的步长是多少,查表的和按照相位累加器的寻址范围大小相同的波表得到的数据总是相同的,这在数学上时可以证明的——当然,这样的相位累加器实际上不可行的。

考虑到实际应用中,相位累加器对波表的要求,波表大小应当是2的n次幂,所以波表尺寸应当取65536*4=262,144(256k)。
在考虑到4不是π的整倍数,这会导致附加的截断误差,所以最好在256k的基础上适当的再增加一些,比如取1m个表项,或者2m。
当然,如果继续增加波表的尺寸应当还是有好处的,但得到的改善是肯定是很有限的,有兴趣的话你们可以继续用仿真来证实或者否定。[/quote]

与您观点类似,但我觉得毫无疑问波表的长度是越大越好的,波表的字长也是越大越好,用浮点数更好,理论上就是这样吧。而工程上就要考虑做多大,做成什么形态最经济,当然是在满足给定指标的情况下,这是工程师常用的折中准则。

而如何确定折中方案呢?计算机仿真是上选,
离线一异
发帖
868
只看该作者 92楼 发表于: 2008-08-05
'
是这样的吗?我猜您是想说fft的谱泄漏问题,可是请您再仔细看看程序吧。俗话说好脑筋不如烂笔头,动手试试就知道了。 [表情]
fft只是在分析64k样点的序列而已,而分析精度只与序列本身有关,与是谁生成的无关。请您再仔细想想。
'

我这里没有仿真软件,也没用过,所以如果方便你就按照我的意见试试吧。
不要说不可能,虽然这只是我的直觉。但前面已经有几次看起来不可能的,结果我不是没说错吗?
离线alchemier
发帖
69
只看该作者 93楼 发表于: 2008-08-05
做了个dds仿真程序,输出一下波形看看,这个应该能说清楚一些问题。为了更易理解,采用了与上面讨论同样的时钟频率和输出频率。可以看出,在输出频率较高时,样表的长度与高度增加均没有什么作用。
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线alchemier
发帖
69
只看该作者 94楼 发表于: 2008-08-05
而如果把输出频率降低,也就是每周期的输出点数增加到一定程度以上(在本例中是160/0.625=256),则就可看出大样表的优势来了。见下图:(这里样表的长度和高度位数都取一样的值)
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线alchemier
发帖
69
只看该作者 95楼 发表于: 2008-08-05
而不同输出频率下的波形比较区别很明显:
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线bd1es
发帖
2096
只看该作者 96楼 发表于: 2008-08-05
[quote=一异]我这里没有仿真软件,也没用过,所以如果方便你就按照我的意见试试吧。
不要说不可能,虽然这只是我的直觉。但前面已经有几次看起来不可能的,结果我不是没说错吗?[/quote]

您的每次讲话都有对的一部分。我肯定的也是那一部分,并已经尽量用仿真去验证了,目的是尽可能去支持您的观点。另一方面我这么做也是为了避免打嘴仗,用有限的篇幅来呈现有用的东西给大家评价。

比如,您真的认为“10进制”dds是好的选择吗?可是数论告诉我们2进制和10进制是等价的,而工程实践告诉我们在物理世界里十进制不能有效利用位宽,所以实际上计算机或者数字化领域都选择2进制,这是明智的。至于能否取到所谓整数的频率跃进,那要看我们需要的精度是怎样的,满足要求即可,超越亦无意义。

可是这次您连fft的频率分辨率都搞错了,要我如何证实呢?见上面的图3,dds主信号的旁瓣已经扩展到将近全图的10%了,您却认为需要长度4g的fft,是不是不合逻辑了?而且我告诉您了,您认为16位dds输出65536点刚好一个周期,这个观点也是不对的,况且fft分析又与dds无关,这些都是风马牛不相及的事情。别的都不谈了,仅就我们展示的图片尺寸来说,65536 fft也是早就超了,再扩实在是啥意义都没有。

还是上图证实吧,昨天那个带扩展的序列,下面分别是1024、4096、16384、65536和262144 fft的图片:

我看要是不嫌难看的话,1024个样点就够了,因为那边带扩展是相当宽了。
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线一异
发帖
868
只看该作者 97楼 发表于: 2008-08-05
'
您的每次讲话都有对的一部分。我肯定的也是那一部分,并已经尽量用仿真去验证了,目的是尽可能去支持您的观点。另一方面我这么做也是为了避免打嘴仗,用有限的篇幅来呈现有用的东西给大家评价。
比如,您真的认为“10进制”dds是好的选择吗?可是数论告诉我们2进制和10进制是等价的,而工程实践告诉我们在物理世界里十进制不能有效利用位宽,所以实际上计算机或者数字化领域都选择2进制,这是明智的。至于能否取到所谓整数的频率跃进,那要看我们需要的精度是怎样的,满足要求即可,超越亦无意义。
可是这次您连fft的频率分辨率都搞错了,要我如何证实呢?见上面的图3,dds主信号的旁瓣已经扩展到将近全图的10%了,您却认为需要长度4g的fft,是不是不合逻辑了?而且我告诉您了,您认为16位dds输出65536点刚好一个周期,这个观点也是不对的,况且fft分析又与dds无关,这些都是风马牛不相及的事情。别的都不谈了,仅就我们展示的图片尺寸来说,65536 fft也是早就超了,再扩实在是啥意义都没有。
还是上图证实吧,昨天那个带扩展的序列,下面分别是1024、4096、16384、65536和262144 fft的图片:
我看要是不嫌难看的话,1024个样点就够了,因为那边带扩展是相当宽了。
'

老实话:我是软件出身,电子也是业余学的,理论基础并不扎实,更不是信号处理方面的专家,有说错的地方也不奇怪。fft程序我也做过,具体的算法早忘了,毕竟平常不用。

我看了你的最新仿真结果,很遗憾都是32bit dds的,我的意思是用较少点位的fft来计算16bit dds,看看是否有类似84楼第三张图那样的频谱扩展现象。如果有,那么32bit dds的这种现象很可能就是由于fft处理引起的虚假频谱。

谢谢!

十进制dds是另一个问题,我是觉得除非用特别定制的晶体,晶体的频率包含2的n次方,否则我们实际上得不到我们要的频率,只能得到一个近似的频率,虽然可能误差不大,但毕竟感觉不好。而用十进制dds的话,这个问题就好办得多。
至于位宽利用率的问题,如果直接用bcd十进制的确很糟糕,但我们可以采用另外一个办法:比如32bit累加器的累加范围改成0~3,999,999,999,相对于二进制累加器的范围0~4,294,967,295,实际上只浪费了7.4%,这点浪费应当是可以接受的。
离线bd1es
发帖
2096
只看该作者 98楼 发表于: 2008-08-05
唉,真是太不相信fft了。没关系,明天我按您的要求做16位的,环境在单位,现在做不了。

还有十进制dds,想法不错,不管有没有用也是挺创意的。不过这可能在硬件上付出代价的,搞不好会影响工作速度,:)。
离线一异
发帖
868
只看该作者 99楼 发表于: 2008-08-05
在我印象中,fft实际上从理论上讲就是有误差的,原因就在于fft处理的数据量是有限的。