比较器噪声仿真方法


前言

 比较器噪声的分析一直是ADC设计无法绕过的话题,例如SDM SAR等等。常规的比较器有两种,一种是带预放大器pre amp的,一种是动态latch或者加一个动态的放大器。显然,如果是前者,由于预放大器的倍数一般较高,所以比较器的噪声就是预放大器的噪声,按照运放的噪声分析方法即可;
 如果是后者,可以进行这样简单的考虑:由于动态latch的噪声主要来源于电荷泄放过程,因此计算latch输入对管的等效输入噪声电压即可。但是,如果需要更精确的分析,最好还是打开ADE L的transient noise,进行行为级的仿真。

一、简单的概率问题

 现在盒子里有100个球,60白,40黑。有放回的取20次,问:取到k个白球的概率是?
 答:
 每次取出白球的概率是0.6。20次中取到k次的可能情况有 C 20 k C_{20}^k C20k种,而每种情况发生的概率都是 0. 6 k × 0. 4 ( 1 − k ) 0.6^k\times0.4^{(1-k)} 0.6k×0.4(1k),所以“取到k个白球”的概率是:
C 20 k × 0. 6 k × 0. 4 ( 1 − k ) . C_{20}^k\times0.6^k\times0.4^{(1-k)}. C20k×0.6k×0.4(1k).
 如果这个推论不错,则k=0,1,2,…20的概率之和为1,下面这段matlab代码可以证明:

prob_k=zeros(21,1);%0~20
for i=1:21
    k=i-1;
    times=nchoosek(20,k);
    prob_k(i)=power(0.6,k)*power(0.4,(20-k))*times;
end
figure;plot(prob_k);
sum(prob_k)

 这个取球问题在后面比较器噪声计算时要用到。

二、噪声情况下的比较器

 比较器的热噪声电压一般认为服从正态分布,正态分布的标准差σ即为比较器的噪声。让比较器进行100次比较,假如比较器的输入电压为0,可以预见到100次结果中有约50次结果为1,约50次结果为0,无论比较器的噪声电压是多少。
 但是,假如比较器的输入电压为0.3(无单位,是一个归一化值),此时比较器的噪声电压对100次的比较结果将有很大影响。如果噪声小至0.01,那么100次比较结果大部分都会是1。如果比较器噪声增加到了0.1,可以预见结果为1的次数会变少;
 如果比较器噪声继续增加,结果为1的次数会更少。如果比较器噪声非常大,那么0.3的输入电压将被完全淹没在噪声里无法分辨,输出结果又回到了“约50次为1,约50次为0”的情况。
 由以上的分析,直观上,输入一个不为0的电压,100次比较结果中“1”的次数k和比较器的噪声σ是有关系的。
 从数学上分析,首先分析比较器的行为模型。由于比较器的噪声电压是服从正态分布的钟形曲线的,定义其为pdf(x),其中x为噪声电压值。标准正态分布(标准差σ=1,均值μ=0)的pdf如下图所示。


标准正态分布的cdf
 当输入为0.3时,只要热噪声小于0.3,比较器结果就为高,所以,每次比较结果为“1”的概率是pdf(x)从-∞到0.3的积分值,概率论中有一个函数cdf用来表达这个积分结果,记为cdf(0.3).标准正态分布的cdf如下图所示,近似为S型。

标准正态分布的cdf

三、基于最大似然估计的理论推导

 显然,cdf不但是x的函数,也是σ的函数,现在记其为cdf(σ,x)。对于一个固定的输入vin0,如果能求解出cdf的表达式cdf(σ,vin0),其统计意义为:
 标准差为σ的正态分布下,样本小于vin0的累积概率;
 其电路意义为:
 噪声为σ的比较器,在输入电压为vin0的情况下,比较结果为“1”的概率。
 那么,假设100次比较过程,比较结果为“1”的次数为k次。这就是一个上述的取球问题。“100次比较,结果为1的次数为k”的概率:
P k = C 100 k × c d f ( σ , v i n 0 ) k × ( 1 − c d f ( σ , v i n 0 ) ) ( 100 − k ) . P_k=C_{100}^k\times cdf(\sigma,vin_0)^k\times (1-cdf(\sigma,vin_0))^{(100-k)}. Pk=C100k×cdf(σ,vin0)k×(1cdf(σ,vin0))(100k).
 注意,这个表达式中k是已知的(通过spectre+噪声仿真得到),vin0是已知的,未知数是σ,所以 P k P_k Pk是μ的函数 P k ( σ ) P_k(σ) Pk(σ).
 最大似然估计的基本思想是,系统中某个参量m会影响事件A的发生概率,记A发生的概率为P(m)。现在A事件已经发生,求出使得P(m)最大的m值,即可作为对m参量的估计值。
 那么,按照前面的分析,“结果为#1#的次数为k”的概率Pk是噪声σ的函数,我们只需要分析一组σ对应的 P k ( σ ) P_k(σ) Pk(σ),找出其中最大值所对应的σ,即可作为比较器噪声的估计值。

四、代码实现

 由于pdf(概率分布函数)积分得到cdf(累积概率分布函数)较困难,所以一般cdf是被计算出来了一张表,matlab中,
 cdfx=normcdf(x,0,1)即代表pdf从-∞积分到x的值。
 按照上一小节中的描述进行matlab实现略复杂,因此采用一种更简单的思路来做。
 假设比较器噪声σ为1,这里实际上进行了归一化操作。我们已知100次比较结果有k次结果为1,在这个基础上,假设输入为vin_normal(归一化的vin),对于不同的vin_normal,出现k次结果为1的概率Pk(vin_normal)都是不同的,且可以容易地由前面的公式得出。找到其中使得Pk(vin_normal)最大的值,即得到了归一化的输入vin_normal.
 实际上,我们要求的量是噪声,定义为sigma_real。这里存在着简单的缩放关系:
s i g m a _ r e a l / v i n _ r e a l = s i g m a _ n o r m a l / v i n _ n o r m a l , sigma\_real/vin\_real=sigma\_normal/vin\_normal, sigma_real/vin_real=sigma_normal/vin_normal
 其中sigma_normal是1,vin_normal通过对Pk(vin_normal)的最大似然估计求出,vin_real是电路中比较器的实际输入电压,则:
s i g m a _ r e a l = v i n _ r e a l / v i n _ n o r m a l . sigma\_real=vin\_real/vin\_normal. sigma_real=vin_real/vin_normal.
 具体代码如下:

clear;
close all;
format long;
vin_real=0.5; %未归一化的输入电压单位是LSB
sigma_normal=1;%归一化的噪声sigma值
comp_total=100;
comp_k1=60;% 100次出现了80次结果为1
x=-3:0.001:3;
cdfx=normcdf(x,0,1);
index0=find(x==0);
index_max=max(size(x));
prob_pool=zeros(index_max,1); %记录0~8输入下“100次出k次1”的概率
% times=nchoosek(comp_total,comp_k1);%100次出k次1”的可能情况
times=1;% 由于prob_pool里都乘以了同一个系数,所以不乘也罢
for i=1:1:index_max
    % 100次出k次1,等效为:噪声有k次小于x(i),(100-k)次大于x(i)
    prob1=cdfx(i);
    prob2=1-cdfx(i);
    prob_pool(i)=power(prob1,comp_k1)*...
        power(prob2,(comp_total-comp_k1))*times;
end
[~,max_posi]=max(prob_pool);
vin_normal=x(max_posi);
% 由于实际vin的输入为0.5LSB,sigma_real/sigma_normal=vin_real/vin_normal
sigma_real=vin_real/vin_normal*sigma_normal;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值