本文简单介绍了ADC的动态指标,以及计算动态指标的Matlab代码
更新:包含了全部指标
目录:(2023.7.11更新)
ADC常用指标分类
静态性能:微分非线性:DNL
积分非线性:INL
仿真测试DNL:Code Density
等效输入噪声:NRI
动态性能:信噪比:SNR
有效位数:ENOB
无杂散动态范围:SFDR
总谐波失真:THD
信噪失真比:SNDR
模拟输入带宽:AIBW
有效分辨带宽:ERBW
THD+N
综合品质因子:FoM
目录
等效输入噪声:(Noise referred to input,NRI)
有效位数:ENOB,effective number of bit
无杂散动态范围:SFDR,spur free dynamic range
总谐波失真:THD,total harmonic distortion
信噪失真比:SNDR,signal-to-noise-and-distortion ratio
有效分辨带宽:Effective Resolution Bandwidth
无杂散动态范围SFDR(Spurious Free Dynamic Range)
New Version:
(简略)详细的“静态参数”描述看前面的文章
ADC常用指标分类:
- 功能指标:
采样速度、数据位宽、分辨率、单端or差分、架构、功耗、输入范围、供电模式or参考电压、封装、应用场景、等 - 静态性能指标:
DNL、INL、Offset、Gain Error、单调性、无丢码、等效输入噪声、等 - 动态性能指标:
SNR、SFDR、ENOB、SNDR、THD、THD+N、等
LSB = VFS/2^N,其中VFS:voltage full scale
差分结构不是一定就比单端好。eg:有些sensor就是传来一个【0~VREF】的单端信号,如果用差分机构的话,需要另加一个单端to差分电路,并且相同位数下,差分结构的分辨率更大(单端VFS=VREF,差分VFS=2VREF),差分的输入范围是【-VREF~+VREF】,浪费了一半的范围。
静态性能
微分非线性:DNL
实际步长和理性步长(1LSB)之间的最大差值。通常用LSB为单位表征。当 DNL = -1LSB 时,丢码。
积分非线性:INL
实际量化输出与理性量化输出的最大差值。通常用LSB为单位表征。INL是DNL的累加。
对于DNL主要取决于电容的匹配,除了校准很难通过其他方法改善。校准本质还是校准电容的匹配误差。
对于INL主要是在MSB反转的时候(code翻转最多的时候),除了通过校准,也可以改变电路结构来改善。
INL在中间值的时候最大,因为同时翻转的电容多,误差源多。
仿真测试DNL:(码密度法)(code density)
——7.11目前还没学习到code density代码
输入一个满量程的ramp波,ADC会对该ramp量化n次,然后ADC有2^N-1个step,那我ideal每个code出现的次数一定是 【 n/(2^N-1) 】,即数据量除以code数。用 【(real - ideal) / ideal】就得到DNL。
INL就是DNL的累加。
以上是仿真的方法,但是测试中,产生一个ramp并不容易,所以用sin波。但是思想差不多,不同的是每个code出现的概率不相等了,通过数学推导可以得到,当然程序是现成的。澡盆曲线。
既然如此,为什么不用sin做仿真呢,这样仿真测试共用一套代码就可以了?
因为在sin slope大的地方,出现code的概率自然小,为了保证all code appear,需要的数据量就很大,仿真时间非常长。
一般静态性能和动态性能要分开测试:
想要静态性能好,那就不需要满量程输入,这样就会导致一些code不会出现,从而动态性能分析的时候,不能覆盖所有的code。
关于采样点数:
频谱上,half 谱线间隔:(Fs/2)/Numpt,点数越多,谱线间隔越密,插值出波形越好看,然后FFT出来的噪底能低一点(实际的量化噪声不变)。(总的噪声能量不变,点数越多,分散在各个点的幅值越低)。但是仿真时间越长。
等效输入噪声:(Noise referred to input,NRI)
输入一个DC值,理想情况输出就是一个code,由于有noise,可能出现其他code,测试多次,应该符合高斯分布。
动态性能
信噪比:SNR,signal-to-noise ratio
基频信号的能量与奈奎斯特频率以下除了直流和谐波以外的所有频谱分量的总能量之和(即噪声功率)的比值,单位为dB。
量化噪声能量: 信号能量:
加上over sample后,有个sample gain项:
有效位数:ENOB,effective number of bit
一般 SNR 随 fin 显著下降,THD显著上升。
无杂散动态范围:SFDR,spur free dynamic range
基频信号功率和最大杂散信号功率之比。单位为dB
ADC频谱图,差分抑制偶次谐波,因此最大的谐波分量是三次谐波。至于谐波的位置,是因为频谱混叠。
总谐波失真:THD,total harmonic distortion
全部谐波分量功率和基频信号功率之比。单位为dB
信噪失真比:SNDR,signal-to-noise-and-distortion ratio
输入信号功率与奈奎斯特频率以下的噪声和谐波分量(不包括直流分量)的功率和之比,其单位为dB
模拟输入带宽:Analog Input Bandwidth
在保持输入信号幅度不变的情况下,模数转换器的输出幅度会随着输入信号频率上升而下降。模拟输入带宽指的是模数转换器的输出幅度比低频输入下输出的满量程(Full Scale)下降3dB时的频率,其单位为Hz。
有效分辨带宽:Effective Resolution Bandwidth
有效分辨带宽指的是相对于低频输入时的信噪失真比(SNDR),其信噪失真比下降3dB时对应的输入信号频率。
THD+N
一定要指定带宽。当带宽为FS/2时候,THD+N等价于SNDR
综合品质因子:Figure of Merit
为了能够衡量具有不同精度、速度的模数转换器的能效水平,国际上给出了一个结合了速度、精度、功耗等多方面综合考虑的参数一品质因子(Figure of Merit)。利用品质因子可以表征模数转换器的功耗效率,其单位为pJ/cov-step。针对不同的要求,品质因子可以有多种不同的定义方式。
Old Version:
量化误差
量化步进:1LSB = VFS / 2^N 。
满量程VFS:(-0.5LSB ~ 2^N-1)LSB
量化误差 = ADC输出 - ADC模拟输入
以N=3为例:VFS = -0.5LSB ~ 7.5LSB
量化误差范围:[-0.5 , 0.5] LSB
量化噪声功率计算
假设输入信号为一个斜率足够小的斜坡信号,最大幅度为VFS
如何计算量化噪声的RMS值?
■ 假设输入信号摆幅远大于LSB
■ 假设输入信号不是直流信号
■ 假设信号不限幅
量化噪声:
信噪比SNDR
ADC SNDR Matlab计算
■ SNR = 6.02*N + 1.76
N = 8,SNR = 50 dB;
N = 10,SNR = 61.68 dB;
N = 12,SNR =74 dB;
N = 14,SNR = 85.84 dB;
N = 16,SNR = 98 dB;
N = 20,SNR = 122 dB;
在Demo Codel中,信号周期数M=37为质数,建议读者可以尝试M取偶数,比如M=32,看看DFT效果,并尝试去解释该种现象。
(完整代码咸鱼同名搜我)
clear;clc;
N = 1024;
M = 37;
fin = 1e6;
fs = N*fin/M;
Ts = 1/fs;
% Missing Code
LSB = 2/2^10;
vin = sin(2*pi*fin*t);
% Missing Codes
figure(1);
plot(t,vin);
s = fft(vin);
s = abs(s) + 1e-6;
s_dB = 20*log10(s);
% Missing Code
figure(2);
% Missing Code
plot(1:N/2,s_dB);
% 计算SNR
% Missing Code
power_sig = s(sig_bin);
power_noise = sum(s) - power_sig;
snr = 10*log10(power_sig/power_noise)
动态范围DR (Dynamic Range)
ADC能够线性处理的最大信号和最小信号之间的比值。
无杂散动态范围SFDR(Spurious Free Dynamic Range)
信号 和 最大的谐波 的功率之比 取dB
SDR & THD
THD = 所有的谐波加起来和信号的功率之比,不考虑噪声仅考虑非线性。