比较器输入噪声的仿真方法
- 前言
- 一、简单的概率问题
- 二、噪声情况下的比较器
- 三、基于最大似然估计的理论推导
- 四、代码实现
前言
比较器噪声的分析一直是ADC设计无法绕过的话题,例如SDM SAR等等。常规的比较器有两种,一种是带预放大器pre amp的,一种是动态latch或者加一个动态的放大器。显然,如果是前者,由于预放大器的倍数一般较高,所以比较器的噪声就是预放大器的噪声,按照运放的噪声分析方法即可;
如果是后者,可以进行这样简单的考虑:由于动态latch的噪声主要来源于电荷泄放过程,因此计算latch输入对管的等效输入噪声电压即可。但是,如果需要更精确的分析,最好还是打开ADE L的transient noise,进行行为级的仿真。
一、简单的概率问题
现在盒子里有100个球,60白,40黑。有放回的取20次,问:取到k个白球的概率是?
答:
每次取出白球的概率是0.6。20次中取到k次的可能情况有种,而每种情况发生的概率都是
,所以“取到k个白球”的概率是:
如果这个推论不错,则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”的概率:
注意,这个表达式中k是已知的(通过spectre+噪声仿真得到),vin0是已知的,未知数是σ,所以是μ的函数
.
最大似然估计的基本思想是,系统中某个参量m会影响事件A的发生概率,记A发生的概率为P(m)。现在A事件已经发生,求出使得P(m)最大的m值,即可作为对m参量的估计值。,找出其中最大值所对应的σ,即可作为比较器噪声的估计值。
四、代码实现
由于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。这里存在着简单的缩放关系:
其中sigma_normal是1,vin_normal通过对Pk(vin_normal)的最大似然估计求出,vin_real是电路中比较器的实际输入电压,则:
具体代码如下:
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;