AEGLOSLAB 제어공학 종합 핸드북

제3부 디지털 제어

3.2 샘플링·이산화

제3부 디지털 제어 · 실무 결정. 연속 설계(제1·2부)를 컴퓨터에 올릴 때 부딪치는 두 결정 — 얼마나 빨리 샘플링할까($T$), 연속 $G(s)$를 어떻게 이산 $G(z)$로 바꿀까(ZOH·Tustin) — 을 다룬다. 그리고 샘플링이 가져오는 가장 위험한 함정, 에일리어싱.

이 장을 마치면 대역폭에서 샘플링 주기를 합리적으로 정하고, 목적(플랜트냐 제어기냐)에 맞는 이산화 방법을 고르며, 2.5.7의 이산 PID가 어떤 변환의 결과인지 알아야 한다.

3.2.1 디지털 제어의 두 결정

3.1에서 디지털 제어기가 표본화→계산→홀드로 동작한다는 것을 봤다. 실무에서 답해야 할 것은 둘:

  1. 샘플링 주기 $T$ (= $1/fs$): 얼마나 자주 샘플링하나? (3.2.2·3.2.3)
  2. 이산화 방법: 연속 설계 $G(s)$·$C(s)$를 어떤 규칙으로 $G(z)$·$C(z)$로 바꾸나? (3.2.4~3.2.6)

둘 다 트레이드오프이며, 잘못 고르면 문제없던 연속 설계가 디지털에서 성능이 저하된다.

3.2.2 샘플링 정리와 에일리어싱

3.2.2.1 나이퀴스트-섀넌 정리

신호를 표본만으로 복원하려면 샘플링 주파수가 신호 최고 주파수의 2배보다 커야 한다:

$$f_s > 2\cdot f_{\max}$$ — 나이퀴스트 주파수 $f_N = f_s/2$

3.2.2.2 에일리어싱 — 고주파가 저주파로 나타남

f_N보다 높은 주파수 성분은 사라지지 않고 낮은 주파수로 접혀(fold) 들어온다. 표본만 보면 빠른 신호가 느린 가짜 신호로 보인다 — 영화에서 빠르게 도는 바퀴가 거꾸로·천천히 도는 것처럼 보이는 그 현상.

0.0 0.5 1.0 1.5 2.0 −1.0 −0.5 0.0 0.5 1.0 t [s] 참신호 9 Hz 표본 (fs=10 Hz) 겉보기 가짜 신호 ≈1 Hz
에일리어싱: 9Hz 신호를 10Hz로 표본화

높은 주파수 $f$는 $\vert f - \operatorname{round}(f/fs)\cdot fs\vert$로 접혀 [0, f_N] 안의 가짜 주파수로 나타난다. 예: $fs=10 \,\mathrm{Hz}$로 $f=9 \,\mathrm{Hz}$ 정현파를 표본화하면 round(9/10)=1이므로 $\vert9 - 1\cdot10\vert= 1 \,\mathrm{Hz}$의 가짜 신호로 보인다(위 그림) — 실제로는 9 Hz로 빠르게 진동하는데, 표본만 이어 그리면 약 1 Hz로 느리게 진동하는 신호처럼 나타난다.

3.2.2.3 안티에일리어싱 필터 — 표본화 전에, 하드웨어로

⚠️ 에일리어싱은 표본화된 뒤에는 되돌릴 수 없다. 한번 접혀 들어오면 실제와 가짜를 구분 못 한다. 그래서 ADC 앞단에 아날로그 저역통과 필터(차단 < f_N)를 둬 고주파를 물리적으로 감쇠시키고 표본화해야 한다. 소프트웨어 필터는 이미 늦다(표본화 후라 가짜가 섞임). 이 안티에일리어싱 필터는 코드가 아니라 실제 회로다 — 디지털 제어의 잊기 쉬운 하드웨어 요건.

3.2.2.3.1 필터 설계 감 — 차단 주파수·차수·그리고 대가가 따른다

"필터를 둬라"는 것만으로는 설계를 못 한다. 실무 감:

  • 차단 주파수: 이상적 브릭월(brick-wall) 필터는 없다 — 실제 아날로그 필터는 차단 이후에도 서서히 감쇠한다. 그래서 차단을 f_N에 너무 가깝게 두지 말고 $fs$의 대략 0.4배 이하(≈ $0.8\cdot f_N$) 로 여유를 둬 롤오프 구간이 f_N을 넘기기 전에 충분히 감쇠하도록 한다. 여유 폭은 필터 차수·요구 감쇠량에 따라 조정.
  • 차수: 1차 RC 하나로는 감쇠가 −20 dB/decade로 완만해 f_N 근처 성분이 충분히 감쇠되지 않는다. 실무에서는 보통 2차 이상(예: 2차 RC 종속연결, Sallen-Key, 2~4차 Butterworth/Bessel)을 써 −40 dB/decade 이상의 롤오프를 확보한다. 차수가 높을수록 차단 근처 감쇠는 가파르지만 회로·부품 수·위상 지연이 늘어난다.
  • 대가가 따른다 — 위상 여유를 줄인다: 이 필터도 실제 극을 가진 동특성이라 위상 지연을 더한다. 필터 차단이 낮을수록(또는 차수가 높을수록) 제어 대역 안쪽까지 위상을 낮춰 폐루프 위상 여유를 줄인다(2.4.5). 즉 "에일리어싱을 확실히 막으려 차단을 낮추고 차수를 높이면 안정 여유가 준다"는 트레이드오프가 실재한다 — 차단은 제어 대역폭보다는 충분히 높게, f_N보다는 충분히 낮게 설정해 그 사이에서 균형을 찾는다.

3.2.3 샘플링 주기 선정

복원이 목적이면 $2\times$로 충분하지만, 제어는 훨씬 빠르게 샘플링해야 한다(여유·외란 대응·부드러운 구동).

경험칙:

  • 폐루프 대역폭의 10~30배 샘플링: $fs \approx(10\sim30)\cdot f_B$, 또는 $\omega s \approx(20\sim40)\cdot\omega_B$.
  • 또는 상승시간당 10~20 표본: $T \approx T_r/(10\sim20)$.

예: 폐루프 대역폭 f_B=2 Hz → $fs \approx20\sim60 \,\mathrm{Hz}$ → $T \approx17\sim50 \,\mathrm{ms}$.

$T$가 너무 크면(느린 샘플링)$T$가 너무 작으면(빠른 샘플링)
ZOH 지연↑ → 위상 여유↓ → 불안정 위험CPU·전력 부담↑
에일리어싱·외란 놓침미분이 잡음 증폭(작은 $T$로 나눔, 2.5.6.2)
거친 구동(계단 큼)수치 정밀도 문제(극이 $z=1$ 근처에 밀집)

균형점: 보통 상승시간당 10표본 안팎이 무난한 출발. 빠를수록 연속 설계에 가까워지지만 대가가 따른다(3.2.9).

3.2.4 이산화 방법 — G(s) → G(z)

연속 전달함수를 이산으로 바꾸는 규칙은 여럿이고, 목적에 따라 고른다.

3.2.4.1 ZOH 등가 (계단응답 일치) — 플랜트에 표준

ZOH로 구동되는 실제 플랜트를 정확히 나타낸다. 표본 시점에서 계단응답이 연속과 일치한다.

$$G_{\mathrm{zoh}}(z) = (1 - z^{-1})\cdot\mathcal{Z}\{\, G(s)/s \,\}$$

극은 s→z=e^{sT}로 정확히 매핑(3.1.7). 플랜트 이산화의 기본. (영점은 다르게 옮겨가며, 때로 표본화로 비최소위상 영점이 새로 생기기도 함 — 주의.)

3.2.4.2 Tustin(쌍일차/사다리꼴) — 제어기에 표준

적분을 사다리꼴로 근사한 변환. 연속 설계 제어기를 이산화할 때 가장 많이 쓴다.

$$s \leftarrow (2/T)\cdot(z-1)/(z+1)$$

장점: 좌반평면 전체 → 단위원 안으로 정확히 매핑(안정성 보존!), 연속의 $j\omega$축 전체가 단위원에 대응. 단점: 주파수 왜곡(3.2.5).

3.2.4.3 오일러·정합 극영점

  • 전진 오일러 s←(z−1)/T: 가장 단순하지만 안정한 연속계를 불안정 이산계로 만들 수 있다(극이 단위원 밖으로) — 위험, 작은 $T$에서만.
  • 후진 오일러 s←(z−1)/(Tz): 항상 안정 보존(감쇠를 약간 더함). 구현이 간단해 PID에 자주 쓴다(3.2.6).
  • 정합 극영점(MPZ) z=e^{sT}: 극·영점을 직접 매핑. 직관적.

3.2.4.4 비교 표

방법치환/공식안정성 보존주 용도
ZOH(1−z⁻¹)𝒵{G/s}예 (e^{sT})플랜트 (계단응답 일치)
Tustins←(2/T)(z−1)/(z+1)예제어기 (주파수 왜곡 주의)
전진 오일러s←(z−1)/T아니오단순·위험
후진 오일러s←(z−1)/(Tz)예간단한 PID 구현
정합 극영점z=e^{sT}예극·영점 직접 매핑

3.2.5 Tustin의 주파수 왜곡과 prewarp

Tustin은 연속의 무한 주파수축($\omega: 0\to\infty$)을 유한한 단위원 둘레로 사상하므로, 주파수가 비선형으로 압축된다. 연속 주파수 $\omega_a$와 이산이 보는 주파수 $\omega_d$의 관계:

$$\omega_a = (2/T)\cdot\tan(\omega_d\cdot T/2)$$

저주파에서는 $\omega_a\approx\omega_d$(거의 일치)지만 f_N 근처에서 크게 휜다. 그래서 공진·교차주파수처럼 중요한 한 주파수 ω*를 정확히 맞추려면 prewarping을 쓴다: $2/T$ 대신 ω*/tan(ω*T/2)로 치환해 그 주파수에서 왜곡을 0으로 만든다. (대역폭이 f_N보다 충분히 낮으면 prewarp 없이도 무방.)

3.2.6 PID 이산화 — 2.5.7의 본질

2.5.7의 이산 PID 코드는 사실 후진 오일러(직사각 적분)의 결과다. 연속 $C(s)=K_p+K_i/s+K_d s$를 항별로 이산화:

  • 적분: $I[k] = I[k-1] + K_i\cdot e[k]\cdot T$ (후진/직사각 적분 — 누적)
  • 미분: $D[k] = K_d\cdot(e[k] - e[k-1]) / T$ (후진 차분) → 필터 추가 (2.5.6.2)
  • $u[k] = K_p\cdot e[k] + I[k] + D[k]$

2.5.7이 I += Ki*e*dt를 쓴 것이 바로 이 적분 이산화다. 미분은 2.5.7에서 이미 필터가 적용된 형태로 구현됐다 — st.d = (st.d + N*Kd*(st.y_prev - y)) / (1 + N*dt)가 바로 위 후진차분에 2.5.6.2의 필터를 추가한 결과다(대수적으로 정리하면 $D[k]=(T_f\cdot D[k-1]-K_d\cdot(y[k]-y[k-1]))/(T_f+T)$, $T_f=1/N$와 동치 — 3.3.4). 즉 2.5의 실무 PID는 후진 오일러 이산화였다. Tustin으로 적분하면 사다리꼴($(e[k]+e[k-1])/2\cdot T$)이 되어 약간 더 정확하다.

3.2.7 두 작업 흐름 — 설계 후 이산화 vs 이산 직접 설계

  • ① 설계 후 이산화(emulation): 연속(제1·2부)으로 설계하고 Tustin으로 $C(z)$를 얻는다. $T$가 충분히 빠르면(대역폭의 20배↑) 연속 직관을 그대로 쓸 수 있어 편리하다. 가장 흔한 실무 경로.
  • ② 이산 직접 설계: 플랜트를 ZOH로 $G(z)$화한 뒤 z-평면에서 직접 설계(근궤적·극배치 모두 z에서 성립). $T$의 여유가 적거나 지연이 크면 이쪽이 정확하다 — 이산 효과를 처음부터 반영하므로.

권장(견해): 여유가 있으면 ①로 시작하되, $T$의 여유가 적거나 성능이 안 나오면 ②로. 어느 쪽이든 이산화 후 반드시 이산 폐루프로 재검증하라 — 연속에서 안정이어도 이산화·지연으로 불안정해질 수 있다.

3.2.8 도구로 — c2d 방법 비교

# discretize.py — 같은 연속계를 여러 방법으로 이산화
import control as ct
Gs = ct.tf([1], [1, 1])               # 1/(s+1)
T = 0.2
for m in ['zoh', 'tustin', 'euler', 'backward_diff']:
    try:
        Gd = ct.c2d(Gs, T, method=m)
        print(m, "poles:", ct.poles(Gd))
    except Exception as e:
        print(m, "—", e)
# 제어기 이산화: ct.c2d(C, T, 'tustin'),  prewarp: method='tustin', prewarp_frequency=w*

방법마다 극 위치·응답이 미묘하게 다름을 확인하라. $T$를 키워 가며 어느 방법이 먼저 불안정해지는지 보는 것도 좋은 실험이다. (메서드명·동작은 버전마다 다를 수 있음 — 여러분 환경에서 확인, ✅ control 0.10.2 검증됨; 재현 권장.)

3.2.9 정직 — 빠른 샘플링이 문제를 은닉한다

  • 이산화는 근사다(ZOH의 계단응답 일치 같은 특수 경우 제외). 방법·$T$에 따라 극·영점이 옮겨가니, 연속에서 좋았다고 이산에서 좋으리라는 보장은 없다 — 재검증 필수.
  • 에일리어싱은 비가역: 안티에일리어싱은 표본화 전 아날로그 하드웨어여야 한다(3.2.2.3). 코드로는 못 고친다.
  • 빠른 $T$는 만병통치가 아니다: 문제를 은닉하지만 CPU·잡음·수치 비용이 따른다. 극이 $z=1$ 근처에 밀집하면 계수 민감도·반올림 오차가 커진다. "충분히 빠르되 과하지 않게."
  • 지연을 잊지 말 것: 계산 시간·ZOH가 더하는 지연은 위상 여유를 줄인다(2.4) — 이산 모델에 z^{−1} 지연으로 명시해 검증하라.

3.2.12 비정수 배 지연 — 지연이 T의 정수배가 아닐 때

위 "지연을 잊지 말 것"에서 계산·구동 지연 $L$을 z^{−1}로 명시하라고 했는데, 실제로 $L$이 정확히 $T$의 정수배인 경우는 드물다. 예: $T=10 \,\mathrm{ms}$인데 계산·통신에 $L=3 \,\mathrm{ms}$가 걸리면, $L/T=0.3$ — 표본 0.3개 분량의 지연이라 정수 개의 z^{−1}로 정확히 나누어떨어지지 않는다. 흔히 쓰는 두 처리법:

  1. 올림(단순·보수적): $L$을 ⌈L/T⌉표본으로 올림해 모델링. 위 예라면 ⌈0.3⌉=1표본 지연으로 취급 — 실제(0.3표본)보다 최대 한 표본($T$)만큼 더 큰 지연을 가정하는 셈이다. 구현이 간단(정수 개의 지연 버퍼)하고 안전 쪽으로 치우치지만, 위상 여유를 필요 이상 줄일 수 있다(2.4.5) — $T$가 크거나 여유가 적으면 손해가 커진다.
  2. 분수 지연 모델링(정밀): 정수부 ⌊L/T⌋표본은 z^{−1}을 그대로 쓰고, 남은 소수부 $\Delta=L/T-\lfloor L/T\rfloor$($0<\Delta<1$)는 1차 Padé류 올패스 근사로 표현한다. 지연 $\Delta$표본에 대해:

$$a_1 = (1 - \Delta) / (1 + \Delta)$$

$$z^{-\Delta} \approx (a_1 + z^{-1}) / (1 + a_1\cdot z^{-1})$$

경계 확인: $\Delta=0$이면 $a1=1$이라 위 식이 1(지연 없음), $\Delta=1$이면 $a1=0$이라 z^{−1}(정확히 한 표본 지연)로 정확히 일치한다. 대가는 구현·해석이 한 단계 복잡해진다는 것(추가 극 하나).

실무 기준: $L$이 $T$의 10~20% 이하로 작으면 대개 ①(올림)로 충분하다. $L$이 표본 주기의 상당 부분(수십 %)을 차지해 위상 여유 손실이 무시 못 할 수준이면 ②로 정밀하게 반영하거나, 애초에 $T$를 줄여 $L/T$ 자체를 작게 만드는 쪽을 먼저 검토하라.

3.2.10 정리 — 그리고 다음 장

  • 디지털 제어의 두 결정: $T$ 선정(대역폭의 10~30배, 상승시간당 10~20표본)과 이산화 방법.
  • 에일리어싱은 f_N=fs/2 위 성분이 저주파로 나타나는 비가역 현상 — 아날로그 안티에일리어싱 필터로 표본화 전에 막는다(3.2.2).
  • 이산화: 플랜트는 ZOH(계단응답 일치), 제어기는 Tustin(안정성 보존, 주파수 왜곡은 prewarp로). 오일러는 단순하나 전진형은 위험(3.2.4). 2.5의 실무 PID는 후진 오일러 이산화였다(3.2.6).
  • 흐름은 "설계 후 이산화" 또는 "이산 직접 설계"이며, 어느 쪽이든 이산 폐루프로 재검증한다(3.2.7·3.2.9).

다음 3.3에서는 이 모두를 모아 디지털 PID를 실제로 구현한다 — 실시간 루프, 고정·부동소수점 주의, 그리고 제7부 ROS2로 가는 다리. 제3부를 마무리한다.

3.2.11 연습·생각해 볼 것

  1. 에일리어싱 계산. $fs=100 \,\mathrm{Hz}$로 샘플링할 때 나이퀴스트 주파수는? $120 \,\mathrm{Hz}$ 정현파를 이 속도로 표본화하면 몇 Hz의 가짜 신호로 보이나(|f−fs|)? 어떻게 막나? (3.2.2)
  2. 주기 선정. 폐루프 상승시간이 $T_r=0.5 \,\mathrm{s}$인 시스템에 권장 샘플링 주기 범위를 구하라. 대역폭으로도(가정해) 교차검증하라. (3.2.3)
  3. 방법 고르기. 다음에 어떤 이산화가 적절한가: ⓐ ZOH로 구동되는 DC모터 플랜트 모델, ⓑ 연속 설계한 Lead 보상기, ⓒ 잡음 적고 단순 구현이 필요한 PID. (3.2.4)
  4. 전진 오일러 위험. 안정한 $1/(s+1)$을 전진 오일러로 $T=3$에 이산화하면 극이 어디로 가나($z=1+sT$ 대입)? |z|<1인가? 이것이 왜 문제인가? (3.2.4.3)
  5. PID의 본질. 2.5.7의 I += Ki*e*dt가 어떤 이산화(적분)에 해당하는지, 그리고 st.d = (st.d + N*Kd*(st.y_prev - y)) / (1 + N*dt)가 2.5.6.2의 필터된 미분을 어떻게 이산화한 것인지 3.2.6으로 설명하라. Tustin 적분이면 식이 어떻게 바뀌나?
  6. 워크플로. "연속으로 설계 후 Tustin 이산화"가 잘 통하려면 $T$에 대한 어떤 조건이 필요한가? 그 조건이 안 맞으면 어떤 흐름으로 바꿔야 하나? (3.2.7)
  7. (손으로) discretize.py로 $1/(s+1)$을 $T=0.1, 0.5, 1.0, 3.0$에서 여러 방법으로 이산화해, 어느 방법이 어느 $T$에서 먼저 단위원을 벗어나는지(불안정) 확인하라. (검증 필요 — 3.2.4.3)

막히면 "플랜트는 ZOH, 제어기는 Tustin, 에일리어싱은 표본화 전에 막아라" 세 마디로 돌아가라.