直方图统计法计算ADC DNL和INL的方法

Differential nonlinearity (DNL) and Integral nonlinearity (INL)定义

如图,DNL(差分非线性)误差指的是任意一个输出台阶的宽度与1 LSB理想台阶宽度之间的偏差;INL(积分非线性)误差指的是实际输出相较于全量程传输函数的最大偏差,实际全量程的传输函数需要补偿ADC本身的Gain Error和offset。

DNL用公式可以定义为:

DNL(k)=Vx(k+1)−Vx(K)LSB,0≤k≤2N−1

其中LSB为:

LSB=VFSR2N=2∗Vref2N

此时的DNL则为:

DNL=MAX[DNL(k)]

INL用公式就可定义为:

INL(k)=Vx(k+1)−Vx(k)|TransferfunctionLSB输入RAMP波情况

在测试上可以通过统计直方图的方式进行。以概率论的论的角度来说,在大样本量的情况下如果ADC的DNL为0,那么按照统计直方图方式来统计这些大样本量的数据,其结果是每个台阶所对应的统计直方图命中数(hits)是相等的。实际情况下DNL不可能为0,那么台阶宽度较小的其对应的统计直方图hits数相对于均值就少,反之则数量则多,示意图如下:

在输入信号为一个如下的Ramp波的时候,ADC的输出code进行大样本量统计的时候是符合前面提及的统计直方图的。

此时就可以计算DNL为:

DNL(k)=H(k)mean[H]−1INL(k)=∑i=0kDNL(i)输入sine波情况

输入RAMP波时,ADC的输出是均匀分布的,而输入Sine波的时候其输出分布不再是均匀的,如下为sine波信号的概率密度分布函数(PDF):

p(V)=1πA2−V2其中A为输入信号摆幅,如图为一个理想sine波概率密度分布曲线:

生成一个sine波信号,按照8bit位宽(共计2**8个台阶)直方图统计这个输入信号可以得到sine波信号的PDF基本符合这个情况如下:

按照2^8台阶数统计sine波输入信号直方图统计得到2^8个bins对应的直方图数据

CodeCounts=Hist(SineWaveSampled,Bins=28)

因为分布不在符合前面的均匀分布,所以就需要按照其规律把这个直方图“拟合”成一个均匀分布。按照如下几步就可以得到基于sine波输入的INL和DNL。

step1.求取直方图累积

对前面求得的直方图CodeCounts进行直方图累积:

cumsum(k)=∑i=0kCodeCounts(i)

累积直方图之后可以发现最后一个code counts的结果是整个数据的采样样本量总数:

这部分理解,可以将连续的sine波看做成一个从-π/2 ~ π/2 的重复,所以整个累积过程可以看做如下:

step2.Sine to Ramp

这一步就是要把基于sine波的累积直方图(Cumsum Curve)转换为Ramp,Ramp是从-FSR/2 到FSR/2 逐渐爬升的。示意如图:

当前每个code_i对应的V_i可以按照如下求得:

V(i)=−FSR/2∗Cos(πCumsum(i)N)其中N为总的样本量个数。

关于这部分理解:我们前面将这个累积统计的区间归一化到了-π/2 ~ π/2 ,那么整个样本量可以看做π,即如图为一个半径r=FSR/2的半圆。每个code台阶所对应的θi和当前累积的样本量与总样本的占比有关,随意此时的θi则为:

θi=πCumsum(i)N

按照余弦的关系Cos(θi) = Vi / (FSR/2),所以得Vi为:

Vi=−12FSR∗cos(θi)=−12FSR∗cos(πCumsum(i)N)然后就可以得到sin2ramp结果如下:

step3.计算DNL和INL

DNL(k)=V(k+1)−V(k)−1DNL=MAX[DNL(k)]

INL(k)=∑i=0kDNL(i)INL=MAX[INL(k)]

置信区间、样本量和误差

根据中心极限定理可知,随机样本量为n的多次采样,其均值标准化后其分布收敛于正态分布:

CI=X¯±Z∗σ(n)其中:

  • CI = the confidence interval(置信区间)
  • X̄ = the population mean
  • Z* = the critical value of the z-distribution(临界值)
  • σ = the population standard deviation
  • √n = the square root of the population size

不同置信区间对应的Z值如下:

置信区间(%)Z
801.282
851.440
901.645
951.960
992.576
99.52.807
99.93.291

假设此时一个位数为12的ADC,要求的DNL误差为0.01LSB,在输入sine波情况下,假设要求测试的置信度为95%,那么此时最低要求的样本量则为:

Nsamples=Z2∗σ2/e2=(1.96)2∗π/(0.01)2∗(212−1)

以上,本文是对于maxim官网中对于输入sine波求dnl和inl的方法解析,仅供参考交流,欢迎指正。原文:Histogram Testing Determines DNL and INL Errors (stg-maximintegrated.com)

### 回答1: ADC是模数转换器中最常用的电路之一,对于需要将模拟信号转换为数字信号的应用,如数据采集、仪器控制等,都需要使用ADC进行模数转换。DNL(差分非线性度)和INL(积分非线性度)是评估ADC性能的重要指标,下面将对计算DNLINL的代码进行介绍。 DNL计算代码如下: ``` n = 12 # 量化位数 Vfs = 5.0 # 满量程电压 LSB = Vfs / (2 ** n) # 最小量化步进 d = [] # 存放输入数据 for i in range(2 ** n): d.append((i + 0.5) * LSB) # 输入数据为等间距分布的电压 v = [] # 存放ADC输出电压 for i in range(2 ** n): v.append(adc(d[i])) # 执行ADC转换,获取输出电压 DNL = [] # 存放DNL值 for i in range(2 ** (n-1)): DNL.append((v[i+1]-v[i])/LSB-1) # 计算差分非线性度值 ``` INL计算代码如下: ``` L = [-Vfs / 2] # 左端点为-Vfs/2 for i in range(2 ** n - 1): L.append(L[-1] + LSB) # 生成量化电平序列 v = [] # 存放ADC输出电压 for i in range(2 ** n): v.append(adc(L[i])) # 执行ADC转换,获取输出电压 INL = [] # 存放INL值 for i in range(2 ** n): INL.append((v[i] - (i * LSB + L[0])) / LSB) # 计算积分非线性度值 ``` 以上两段代码可以根据实际情况进行修改,其中`adc`为执行ADC转换的函数,可以根据具体的ADC芯片选择相应的驱动库进行编写。需要注意的是,在应用中,通常需要进行多次采样来获取稳定的DNLINL值,因此需要将以上代码放置在循环中进行多次执行。 ### 回答2: ADC(模数转换器)是一种电子设备,能够将模拟信号转换成数字信号。其中,DNL(差分非线性度)和INL(积分非线性度)是评估ADC质量的两个重要指标。 计算DNL的代码如下: 1.设定参考电压(Vref) 2.设定动态范围(Vmax和Vmin) 3.将Vref按照量化位数divider进行等分(Vstep = Vref / 2^divider) 4.将输入电压逐渐增加,用计算机记录下每个量化电平对应的数字值 5.计算输出的数字信号与理论值的差值,即为DNLDNL = |(数字信号输出 - 理论值)/ Vstep - 1|) 计算INL的代码如下: 1.按照DNL方法获取所有量化电平对应的数字值 2.按照这些数字值的顺序计算它们与理论值的差值,这就是INL 3.如果INL的最大值超过了1 LSB,说明ADC的质量可能存在问题 需要注意的是,以上代码仅适用于基础的ADC单元,实际应用中可能需要考虑更多的因素并进行修改。 ### 回答3: ADC(模数转换器)是将连续信号转换为数字信号的重要电子元件,也是模拟电路和数字电路之间的重要接口。在ADC中,数字化误差是一个不可避免的问题,其中最常见的误差包括DNL(差分非线性度)和INL(积分非线性度)。下面我们将介绍如何计算ADCDNLINLDNLADC输出码之间的差异。DNL计算公式如下: DNL = (V_i - V_{i-1} - 1) / LSB 其中,V_i是量化器在第i个码上的输出电压,V_{i-1}是第i-1个码的输出电压,而LSB则是最低有效位的大小。 INLADC输出码值和理想输出直线之间的误差,也可视为ADC输出值的累计误差。INL计算公式如下: INL = (V_i - V_d) / LSB - i 其中,V_i是量化器在第i个码上的输出电压,而V_d则是理想输出直线在第i个码上的电压值,i为第i个码。该公式中,INL的单位为LSB。 计算DNLINL的步骤如下: 首先,将ADC输出的数字信号转换为模拟信号,并将其测量。将测量结果与ADC量化器的数字输出值一一对应,并标记每个输入电压对应的ADC输出值。 接下来,使用上述公式来计算DNLINL。可以使用MATLAB、Python等软件来计算,但需要使用自己的数字输入值和相应的电源,以便获得准确的结果。 总之,DNLINL是衡量ADC性能的重要指标,它们的计算可以帮助我们了解ADC的精度和线性度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值