论坛风格切换切换到宽版
  • 6934阅读
  • 52回复

做了个MiniDDS,但是杂散大得吓死人了 [复制链接]

上一主题 下一主题
离线小比尔/5
发帖
2582
只看该作者 20楼 发表于: 2008-07-18
'
感谢两位的解答!
主要可能是我对dds的相位步进还不太理解,按照上面的程序看似乎是把Δφ作为地址增量,加上零点值,然后作为正弦样表的地址,查出对应地址的8bit数据,再通过dac输出。可是相位步进值有那么多,很快就会超过512,这剩下的值是不是就循环调用正弦样表了?这样的话又怎么能保证出来的正弦波周期和我要求的输出频率周期相等呢?
'

是这样的:
f(t)=sin(ωt+φ)
在这里暂时设φ=0,那么对于正弦函数来说,f(t)=sin(ωt)=sin(ωt+2π),此时t∈[0,2π)
而程序里,累计相位值的作用,就相当于这个t,它是对[0,2π]区间内的pow(2,24)=16777216等分,也就是对时间的离散化。
再设f(φ)=sin(φ),φ=ωt
则φ=2πft
Δφ=2πfΔt
而Δt即为采样周期ts
Δφ/2π=fts
设n=pow(2,24)=16777216等分,则
Δφ/2π·n=nfts
就得到了相位步进值
步进值与累计值的比值就等于此时的φ/2π
累计值每16777216为一个周期,相位每2π为一个周期
所以忽然发现前面写16777215是错的,小学的数学忘了过关……
离线小比尔/5
发帖
2582
只看该作者 21楼 发表于: 2008-07-18
'
我有点明白了,这个是不是和测量高频的频率计的方法是相似的?
'
不是。频率计要简单得多。
它是把正弦信号整形成方波,然后对方波进行计数得到的。
或者对频谱进行快速傅立叶变换,算出能谱中幅值最大的谱线频率,一般就是正弦信号的频率
离线alchemier
发帖
69
只看该作者 22楼 发表于: 2008-07-18
[quote=小比尔/5]是这样的:
f(t)=sin(ωt+φ)
在这里暂时设φ=0,那么对于正弦函数来说,f(t)=sin(ωt)=sin(ωt+2π),此时t∈[0,2π)
而程序里,累计相位值的作用,就相当于这个t,它是对[0,2π]区间内的pow(2,24)=16777216等分,也就是对时间的离散化。
再设f(φ)=sin(φ),φ=ωt
则φ=2πft
Δφ=2πfΔt
而Δt即为采样周期ts
Δφ/2π=fts
设n=pow(2,24)=16777216等分,则
Δφ/2π·n=nfts
就得到了相位步进值
步进值与累计值的比值就等于此时的φ/2π
累计值每16777216为一个周期,相位每2π为一个周期
所以忽然发现前面写16777215是错的,小学的数学忘了过关…… [/quote]


看着有点晕
容我再慢慢消化消化
离线alchemier
发帖
69
只看该作者 23楼 发表于: 2008-07-18
[quote=小比尔/5]不是。频率计要简单得多。
它是把正弦信号整形成方波,然后对方波进行计数得到的。
或者对频谱进行快速傅立叶变换,算出能谱中幅值最大的谱线频率,一般就是正弦信号的频率[/quote]

我说的不是这个意思,是指的用低的采样频率获得高频率值的那种方法,比如用100mhz的时钟测量1ghz的频率。
离线小比尔/5
发帖
2582
只看该作者 24楼 发表于: 2008-07-18
'
我说的不是这个意思,是指的用低的采样频率获得高频率值的那种方法,比如用100mhz的时钟测量1ghz的频率。
'

那个是带通采样法
离线一异
发帖
868
只看该作者 25楼 发表于: 2008-07-19
'
感谢两位的解答!
主要可能是我对dds的相位步进还不太理解,按照上面的程序看似乎是把Δφ作为地址增量,加上零点值,然后作为正弦样表的地址,查出对应地址的8bit数据,再通过dac输出。可是相位步进值有那么多,很快就会超过512,这剩下的值是不是就循环调用正弦样表了?这样的话又怎么能保证出来的正弦波周期和我要求的输出频率周期相等呢?
'

你不妨想想用pcm录音的过程,以及回防的过程。
比如,对于固定的48ksps的采样频率,8位adc。分别计算一下对1khz,10khz正弦波进行采样,看看采样值都是拿一些,再回头想想dds就明白了。
离线小比尔/5
发帖
2582
只看该作者 26楼 发表于: 2008-07-19
我贴张图。
横轴是采样点位置,纵轴是采样值。
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线alchemier
发帖
69
只看该作者 27楼 发表于: 2008-07-19
这么说吧,当我要求的频率对应的Δφ值为512的2^n次方倍的时候,是不是每次读出来的值都一样?
离线小比尔/5
发帖
2582
只看该作者 28楼 发表于: 2008-07-19
不明白你的意思,不过,有个频谱混叠的问题:
比如说,当采样频率为100khz,你输出的信号为1khz时,和输出199khz、201khz……时,所需要的采样点是完全一样的。
所以,如果你需要1khz,就做低通滤波;需要199khz,就做带通滤波。
这就是为什么能以低采样频率采高频信号的原因。
离线alchemier
发帖
69
只看该作者 29楼 发表于: 2008-07-20
想明白了,就是说当输出频率高的时候,就是从512个点里面相隔Δφ个点选择一个点输出,输出频率低的时候就是512个点的每个值都对应Δφ/512个点(也就是说有这么多个相邻的点输出值都是一样的),而输出波形在滤波前都是如下图这样的:


这样在不同频率下的台阶宽度是不一样的,滤波器很难做,因此谐波不好控制,也就是说的杂散大。
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线小比尔/5
发帖
2582
只看该作者 30楼 发表于: 2008-07-20
'
想明白了,就是说当输出频率高的时候,就是从512个点里面相隔Δφ个点选择一个点输出,输出频率低的时候就是512个点的每个值都对应Δφ/512个点(也就是说有这么多个相邻的点输出值都是一样的),而输出波形在滤波前都是如下图这样的:

这样在不同频率下的台阶宽度是不一样的,滤波器很难做,因此谐波不好控制,也就是说的杂散大。
'

没错,就是这样的。但是台阶所造成的,一般不是谐波,而是量化噪声,它类似白噪声,而不是那么明显的离散谱线。
谐波是由其它不理想的东西造成的。
离线代洪波
发帖
4809
只看该作者 31楼 发表于: 2008-07-20
请教小比尔一个问题:传统使用dds是把da输出经过低通或者带通直接去接收机,这样的缺点是杂散太多,并且不好滤波,那么是否可以用ad9851自带的电压比较器变成方波再用倍频程滤波器滤掉谐波,那么杂散就不见了?对信号本身的相位抖动有没有什么影响?
离线小比尔/5
发帖
2582
只看该作者 32楼 发表于: 2008-07-20
[quote=代洪波]请教小比尔一个问题:传统使用dds是把da输出经过低通或者带通直接去接收机,这样的缺点是杂散太多,并且不好滤波,那么是否可以用ad9851自带的电压比较器变成方波再用倍频程滤波器滤掉谐波,那么杂散就不见了?对信号本身的相位抖动有没有什么影响?[/quote]

请教不敢当,我也在想类似的问题。
对于d/a线性不良引起的杂散,这种方法是没问题的。
但是对抖动,就不清楚了。
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线MF35_
发帖
179
只看该作者 33楼 发表于: 2008-07-20
'
有一点不太明白,正弦样表一共才512点,而相位分辨率为24位,16.8m个点,理论上说应该用至少16.8m个样点的正弦表才能达到理想的正弦输出效果,那么用512个样点的根据是什么?采用dds的方法,谐波的产生随频率的增加而增加是必然的,只有增加每个周期的采样点数才能弥补这个缺陷,是不是这个道理?
'


使用512个点的正弦表,是因为输出da是8位的,只能输出256个值,而一个正弦波周期内,同样的值会出现2次,所以正弦表的点数只要达到256*2=512,就可以描述da输出一个正弦波周期时可能出现的所有值,正弦表的点数是由输出da决定的,与相位分辨率没有关系。
离线一异
发帖
868
只看该作者 34楼 发表于: 2008-07-20
[quote=小比尔/5]没错,就是这样的。但是台阶所造成的,一般不是谐波,而是量化噪声,它类似白噪声,而不是那么明显的离散谱线。
谐波是由其它不理想的东西造成的。[/quote]

在dds中,数据的截断误差造成的噪声是和基频相关的,而不是白噪声,这也是dds输出的频谱不纯的重要原因。
这个问题可以通过将从存储器得到的数据加上一个1bit白噪声(比如伪随即序列的频谱接近白噪声)来改善。
离线一异
发帖
868
只看该作者 35楼 发表于: 2008-07-20
[quote=代洪波]请教小比尔一个问题:传统使用dds是把da输出经过低通或者带通直接去接收机,这样的缺点是杂散太多,并且不好滤波,那么是否可以用ad9851自带的电压比较器变成方波再用倍频程滤波器滤掉谐波,那么杂散就不见了?对信号本身的相位抖动有没有什么影响?[/quote]

如果采用带通滤波器,或者根据输出信号的频率来选择低通滤波器,那么可以从dds输出信号中得到比较纯净的频谱。
但依靠正形成方波来解决这个问题肯定是行不通的,杂散信号实际上仍然会叠加在方波上,这是通过影响方波的边沿位置来实现的,实际上也就使你担心的相位抖动。
当然,通过正形成方波之后再滤波,信号频谱肯定会和以前不同,但我们并不能保证这种改变是有益的。事实上,采用根据输出信号切换低通滤波器的截止频率,应当更有希望得到更好的频谱。
离线代洪波
发帖
4809
只看该作者 36楼 发表于: 2008-07-21
[quote=一异]如果采用带通滤波器,或者根据输出信号的频率来选择低通滤波器,那么可以从dds输出信号中得到比较纯净的频谱。
但依靠正形成方波来解决这个问题肯定是行不通的,杂散信号实际上仍然会叠加在方波上,这是通过影响方波的边沿位置来实现的,实际上也就使你担心的相位抖动。
当然,通过正形成方波之后再滤波,信号频谱肯定会和以前不同,但我们并不能保证这种改变是有益的。事实上,采用根据输出信号切换低通滤波器的截止频率,应当更有希望得到更好的频谱。[/quote]
继续探讨!这样说来变成方波以后再转换成正弦波有点画蛇添足的味道,这个主义完全是我的一些想法,具体我还没有去实验它!如果依你说的改变不同的低通滤波器来改善杂散我想效果肯定有所改善,特别是那些比输出频率高的部分可以得到有效的滤除,但是带内的却无能为力了!并且需要很多的滤波器,在频率范围很宽的时候!
离线alchemier
发帖
69
只看该作者 37楼 发表于: 2008-07-21
[quote=代洪波]继续探讨!这样说来变成方波以后再转换成正弦波有点画蛇添足的味道,这个主义完全是我的一些想法,具体我还没有去实验它!如果依你说的改变不同的低通滤波器来改善杂散我想效果肯定有所改善,特别是那些比输出频率高的部分可以得到有效的滤除,但是带内的却无能为力了!并且需要很多的滤波器,在频率范围很宽的时候![/quote]

你说的那种变成方波的方式我理解就是pwm的调制方式吧,这样的确是多此一举啊,而且方波的谐波分量是无穷多个,会把dds输出的本来就含有谐波的准正弦波变得更不准了吧。
离线alchemier
发帖
69
只看该作者 38楼 发表于: 2008-07-21
能输出不含谐波的正弦波是dds的理想状态,然而由于离散采样的原理,dds输出的总是台阶形状的准正弦波,但是如果采样的点越密集,输出的波形就越接近理想的正弦波。
设想如果在最高频率输出的时候也能保证每个周期有512个样点,而随着频率的降低,样点也逐步增加,也就是说每次送d/a输出的时间间隔是一样的,随着周期的变长,输出的样点也变多,那么就可以保证输出正弦波的台阶宽度是相等的,因此谐波分量的变化范围就很小,滤波平滑的效果就很好,这也是我前面说的采用16.8m个样点表的原因(样本幅度可以用16bit或者24bit表示)。
但是这样的方法资源消耗很大,并且如果输出最高频率很高100m时,最低时钟频率就要51.2ghz(保证最少每周期512样点的话),这是无法实现的,所以就要做个折中考虑,在样本数与时钟频率还有存储器资源之间做个平衡。需要做一些实验。
离线一异
发帖
868
只看该作者 39楼 发表于: 2008-07-21
'
能输出不含谐波的正弦波是dds的理想状态,然而由于离散采样的原理,dds输出的总是台阶形状的准正弦波,但是如果采样的点越密集,输出的波形就越接近理想的正弦波。
设想如果在最高频率输出的时候也能保证每个周期有512个样点,而随着频率的降低,样点也逐步增加,也就是说每次送d/a输出的时间间隔是一样的,随着周期的变长,输出的样点也变多,那么就可以保证输出正弦波的台阶宽度是相等的,因此谐波分量的变化范围就很小,滤波平滑的效果就很好,这也是我前面说的采用16.8m个样点表的原因(样本幅度可以用16bit或者24bit表示)。
但是这样的方法资源消耗很大,并且如果输出最高频率很高100m时,最低时钟频率就要51.2ghz(保证最少每周期512样点的话),这是无法实现的,所以就要做个折中考虑,在样本数与时钟频率还有存储器资源之间做个平衡。需要做一些实验。
'

看来你还是没看明白啊!存储器的单元并不是越多越好,这受限于dac的字长。
dds实际上可以看成通过计算算出pcm编码信号在每一个时刻的采样值,然后将这个数字通过dac输出。
因此,dds系统的性能极限和pcm实际上是一样的,pcm编码调制最重要的参数有两个:采样频率和字长。你所说的实际上只考虑了脉冲调制,而没有考虑编码问题。由于有限的字长,编码的时候必然会出现截断误差。
实际上dds的缺点主要就是由于编码字长受限所造成的。如果改换成理想的脉冲调制,那么只要有一个足够好的固定滤波器,dds就能输出接近理想的信号。