본문 바로가기
코딩취미/프로그램 지식

아날로그-디지털 변환기의 INL과 DNL 완전 정복

by 브링블링 2025. 3. 28.
반응형

아날로그-디지털 변환기의 INL과 DNL 완전 정복

아날로그-디지털 변환기(ADC)나 디지털-아날로그 변환기(DAC)의 성능을 평가할 때 가장 중요한 요소 중 하나는 **선형성(Linearality)**입니다. 이때 등장하는 두 가지 핵심 지표가 바로 **DNL (Differential Non-Linearity)**과 **INL (Integral Non-Linearity)**입니다. INL과 DNL은 단순한 숫자가 아닌, ADC의 정밀도와 신뢰성을 결정짓는 핵심 지표입니다. 이번 포스트에서는 INL과 DNL의 개념부터 계산 방법, 그리고 파이썬으로 직접 구현하는 예제를 정리했습니다.


✅ DNL (Differential Non-Linearity)

✔️ 정의

DNL은 **이상적인 LSB(step size)**와 실제 코드 간 전압 차이의 차이를 나타냅니다.
한 코드에서 다음 코드로 넘어갈 때 전압 변화가 얼마나 불균일한가를 측정하죠.

📐 공식

  • ViV_i: i번째 코드의 실제 전압
  • Ideal LSB: 이상적인 1 LSB 

❗ 중요한 의미

  • DNL > 0: 이상보다 간격이 큼 → 코드 폭이 넓음
  • DNL < 0: 이상보다 간격이 작음 → 코드 폭이 좁음
  • DNL < -1: Missing Code 발생 가능성 있음

■ DNL 반영

  • DNL = 0: 이상적 계량와 같은 값
  • DNL > 0: 전역 계량이 가볍다
  • DNL < 0: 계량이 짧다
  • DNL < -1: Missing Code 가능성 있음

✅ INL (Integral Non-Linearity)

✔️ 정의

INL은 각 코드에서의 실제 전압이, 이상적인 직선 응답에서 얼마나 벗어나는지를 나타냅니다.
즉, 전체 변환기의 선형성 품질을 평가하는 데 사용됩니다.

📐 공식

  • ViV_i: i번째 코드의 실제 전압
  • Videal_i: i번째 코드의 이상적 전압

■ INL 반영

  • INL = 0: 가장 이상적인 선사선에 붙여 있다
  • INL 반영이 크면 귀여로도 경험의 오차가 큰 경우

📊 예제 데이터로 계산해보기

Full Scale: 2.56V  
Resolution: 8bit (256 codes)  
Ideal LSB = 2.56 / 256 = 0.01V
코드 실제 전압 (V)
0 0.0000
1 0.0095
2 0.0196
3 0.0297

DNL 계산

INL 계산

반응형

🐍 파이썬 코드로 구현하기

import numpy as np

def calc_dnl_inl(actual_voltages, v_ref=2.56, n_bits=8):
    ideal_lsb = v_ref / (2**n_bits)
    ideal_voltages = np.arange(len(actual_voltages)) * ideal_lsb
    
    # DNL: 실제 코드 간 간격 vs 이상적 간격
    dnl = np.diff(actual_voltages) / ideal_lsb - 1
    dnl = np.append(dnl, np.nan)  # 마지막 DNL은 없음

    # INL: 실제 vs 이상적 누적 차이
    inl = (actual_voltages - ideal_voltages) / ideal_lsb
    
    return dnl, inl

🤔 자주 묻는 질문 (FAQ)

Q1. DNL을 DataMean / (Main 1LSB × Ideal LSB) - 1로 계산해도 되나요?

이런 방식은 일반적인 DNL 계산법은 아니며,
특정 조건에서 상대적 DNL이나 보정된 기준을 사용할 때 사용될 수 있습니다.

하지만 일반적으로는 아래의 정의가 표준입니다:

따라서, 어떤 의미로 Main 1LSB와 DataMean이 정의되었는지 문맥에 따라 해석이 필요합니다.

반응형