노트 / 자료구조와 알고리즘
탐색과 룩업 테이블
정렬된 표에서 이진 탐색으로 빠르게 찾고, sin이나 센서 보정처럼 비싼 계산은 표로 미리 만들어 둡니다.
이진 탐색
정렬된 배열에서 가운데 값과 비교해 절반을 버리는 것을 반복합니다. 1024개 중 하나를 찾는 데 비교 10번이면 됩니다. 서미스터 저항값으로 온도를 찾는 표처럼 정렬된 보정 표에 잘 맞습니다.
룩업 테이블
FPU가 없는 MCU에서 sinf()는 수백 클럭이 걸립니다. 한 주기를 256칸으로 나눈 표를 미리 만들어 두면 배열 읽기 한 번으로 끝납니다.
static const int16_t sin_lut[256] = { 0, 804, 1608, /* ... */ };
int16_t s = sin_lut[angle >> 8]; // 16비트 각도의 상위 8비트로 인덱스
const를 붙여 RAM이 아니라 Flash에 둡니다.- 칸 사이 값이 필요하면 이웃한 두 칸을 선형 보간합니다.
- 표는 파이썬 스크립트로 생성해서 헤더 파일로 넣으면 실수가 없습니다.
어디에 쓰나
- BLDC 정현파 구동과 FOC의 sin/cos
- 서미스터, 열전대 같은 비선형 센서 보정
- LED 감마 보정, 모터 가감속 곡선
속도와 메모리를 맞바꾸는 대표적인 기법입니다. 표 크기와 필요한 정밀도를 같이 따져서 정합니다.