在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 14032|回复: 20

[求助] SDM 加Dither求教

[复制链接]
发表于 2014-8-16 10:29:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
在一个Mash 1-1-1结构上加dither,在低三bit加,好像没有看出spur的减小,蓝色为未加dither,红色为加dither,不知道哪里不对,求指教。
 楼主| 发表于 2014-8-16 10:30:29 | 显示全部楼层
回复 1# analogtracking
Snap1.jpg
 楼主| 发表于 2014-8-16 10:34:54 | 显示全部楼层
回复 2# analogtracking 直接将代码贴上来了,请多指教

clear
fs=26e6;  % sample clock
NumberSamples=2^12;
BusSize=28; %bits
Fraction=0.61; % usable 0 to 1
FractionInternal=2^BusSize*Fraction;
AccumulatorBits=28 ; %bits
AccumulatorSize=2^AccumulatorBits;
% adither=2^3/(2^AccumulatorBits);
% dither_array=FractionInternal*adither*randn(1,NumberSamples);
dither_array=zeros(1,NumberSamples);

C1(1:NumberSamples)=0;%Carry out of the first accumulator
C2(1:NumberSamples)=0;%Carry out of the 2nd accumulator
C3(1:NumberSamples)=0;%Carry out of the 3rd accumulator
U1(1:NumberSamples)=0;%output of the 1st accum
U2(1:NumberSamples)=0;%output of the 2nd accum
U3(1:NumberSamples)=0;%output of the 3rd accum

for index=2:NumberSamples
    U1(index)=FractionInternal+dither_array(index)+U1(index-1);  % adder model
    U2(index)=U1(index-1)+U2(index-1);
    U3(index)=U2(index-1)+U3(index-1);
    if U1(index)>AccumulatorSize
        C1(index)=1;
        U1(index)=U1(index)-AccumulatorSize;
    end
    if U2(index)>AccumulatorSize
        C2(index)=1;
        U2(index)=U2(index)-AccumulatorSize;
    end
    if U3(index)>AccumulatorSize
        C3(index)=1;
        U3(index)=U3(index)-AccumulatorSize;
    end
    Y1(index)=C2(index)+C3(index)-C3(index-1);% feedback from the 2nd & 3rd stage
    Yout(index)=C1(index)+Y1(index)-Y1(index-1);% output to the divider

end
MeanFrac=mean(Yout);
fprintf('\nMeanFracMASH= %1.4f\n',MeanFrac);
x_legend=fs/NumberSamples*linspace(0,NumberSamples-1,NumberSamples);
Yout_sp=20*log10(abs(fft(Yout)));
% plot(20*log10(abs(fft(Yout))));
semilogx(x_legend(1:NumberSamples/2),Yout_sp(1:NumberSamples/2),'b');
发表于 2014-8-16 21:36:19 | 显示全部楼层



呵呵,你把你的输入写成0.5,不加dither试试咯!
 楼主| 发表于 2014-8-18 11:12:11 | 显示全部楼层
回复 4# fuyibin

非常感谢fuyibin的指教,之前也考虑在特殊情况下看看,可惜没搞清楚fractional spur在哪?
上图是输入0.5时,红色为在LSB上加dither,蓝色为在MSB上加dither   
从这个图可以看出来如果在MSB上加dither的话fractional spur确实被打散了,通过时域看就更明显了,但是对应的是噪底抬升,这也是合理的。


上图是输入0.6时分别在MSB和LSB上加dither的结果
但是发现在MSB上并不能完全消掉fractional spur。
所以我的问题是:
1. 在LSB上加dither只能减小fractional spur,我们一般是在低LSB上加是否够用呢,比如在fractional pll里?
2. 0.6输入下MSB也不能完全消除,是否意味着对于任意输入而言,spur不能完全消除,只能减小,(0.5较为特殊)?还是说输入信号随机性不够亦或数据点数不足所致?
还请多多指教
发表于 2014-8-18 13:48:11 | 显示全部楼层


回复  fuyibin

非常感谢fuyibin的指教,之前也考虑在特殊情况下看看,可惜没搞清楚fractional spur在哪 ...
analogtracking 发表于 2014-8-18 11:12



看不到你发的图片,不过也可以猜到是什么
其实加dither是为了打断某些输入pattern在DSM 里的循环
由于对于数字设计是2进制的运算,在0.5,0.25,0.75,0.125,0.375,0.625等等输入上
二进制运算是由固定循环的,就是输出分频系数周期性的循环,0.5循环最短,可能每4个就循环一次0
会有很多这样输入值会让输出循环
如果输出pattern是循环的,那么就说明能量集中在某几个频点,就是spur
dither加入就是为了打断这些循环,其实只要加在最低位1bit就可以了,比如20bit的最低位
这一位的dither会累积在DSM的积分器,影响整数位的进位
 楼主| 发表于 2014-8-18 17:57:14 | 显示全部楼层
回复 6# fuyibin

0.5输入

0.5输入

0.5输入局部放大

0.5输入局部放大
 楼主| 发表于 2014-8-18 18:02:57 | 显示全部楼层
回复 7# analogtracking
再次感谢,不好意思上图不是很熟,那为什么我加了8bit的 dither,0.6的spur只是减小而没有完全消失,这个正常么?

0.6输入

0.6输入

0.6输入局部放大

0.6输入局部放大
发表于 2014-8-19 14:38:10 | 显示全部楼层
不会消失的,只会回到附近的平均值上,我认为目前的结果是正确的
 楼主| 发表于 2014-8-19 17:11:55 | 显示全部楼层
回复 9# xuriver2012

谢谢热情回答,, 只不过好像我这里只在LSB上加有点困难,较周围的噪底还是高不少!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-25 13:59 , Processed in 0.028483 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表