TrotVote
[IT 심층 분석]

카메라 자동 초점(AF) 알고리즘의 위상차 검출 연산 지연 문제와 병렬 처리 전략

김민준 · IT 시스템 엔지니어|
위상차 자동 초점 방식은 스마트폰부터 전문가용 미러리스 라인업까지 널리 사용되는 빠르고 정확한 포커싱 기술이지만 소프트웨어로 이를 뒷받침하는 과정은 지독하게 험난합니다. 이번 개발 프로젝트에서는 특정 기종에서 카메라 애플리케이션을 구동할 때 포커스 링이 자리를 잡지 못하고 이리저리 진동하며 초점을 맞추는 데 무려 체감상 1.5초 이상이 소요되는 소위 포커스 헌팅 현상이 불거졌습니다. 이 이슈는 주로 조도가 낮은 저조도 환경이 아닌 대낮의 직사광선 아래 극명한 대비를 가진 피사체를 마주할 때 빈번하게 나타났는데 이것은 센서의 빛 부족 문제가 아니라 전적으로 신호 데이터 자체를 분석하는 애플리케이션 연산 지연에서 기인함을 시사했습니다. 우선 하드웨어 센서에서 출력해주는 위상차 픽셀들의 원본 데이터 값을 헥사 덤프로 추출해 분석했습니다. 센서 칩셋 자체는 한 프레임이 생성될 때마다 정상적으로 위상 차이의 벡터 값을 도출해 호스트에 인터럽트로 알리고 있었으나 이를 수신한 메인 프로세서가 초점 거리를 계산하고 렌즈 구동 모터(VCM)에 명령을 하달하는 제어 루프에서 엄청난 병목이 생겼습니다. 프로파일러를 물려 함수 단위 호출 지점을 찍어보니 위상 필드의 노이즈를 상쇄하기 위한 복잡한 공간 필터링 알고리즘이 메인 스레드를 꽉 잡고 놓아주지 않고 있었습니다. 단일 코어의 클럭 스피드만으로는 방대한 배열 데이터를 다항식 스플라인 곡선으로 적합시키는 과정을 제시간에 마무리할 수 없었지요. 연산 지연 자체를 해소하려면 코어 루프 최적화가 필수적입니다. 저는 병렬 컴퓨팅 기법을 적극 활용하기 위해 파이프라인의 벡터화 연산을 도입했습니다. ARM 환경에 맞추어 NEON 인트린직(Intrinsics) 명령어를 동원해 데이터 배열 4개를 SIMD(Single Instruction Multiple Data) 구조로 묶어 단 하나의 클럭 사이클로 처리하도록 어셈블리 수준의 C언어 코드 최적화를 감행했습니다. 덤으로 분기 예측(Branch Prediction) 실패로 인한 파이프라인 플러시 현상을 극소화하기 위해 이프문이나 루프 분기문을 최대한 언롤링하고 데이터 종속성이 없는 형태로 루프를 전면 해체해버렸습니다. 단지 수학 연산의 재배치만으로도 해당 모듈의 처리 속도는 기존 대비 무려 세 배 이상 폭발적으로 뛰어올랐습니다. 더불어 폐쇄 루프 제어계(Closed-loop Control System)인 렌즈 모터 드라이버의 PID 계수도 재건축해야만 했습니다. 연산은 빨라졌으나 명령이 지연되던 예전 과거의 속도에 맞춰진 PID 계수로는 목표 초점 거리에 도달할 때 진동이 발생하는 오버슈트 현상이 그대로 나타났기 때문입니다. 미분 게인 값을 세밀하게 하향 조정하고 적분기 초기화 타이밍을 재설정함으로써 구동 모터가 스무스하게 최단 거리로 브레이크를 거는 완벽한 커브를 완성해 내었습니다. 최종 빌드에서 포커싱 타임은 불과 0.3초 미만으로 단축되었고 고대비 상황에서의 초점 헌팅 현상은 그림자도 남지 않고 소거되었습니다. 이 과정은 결국 임베디드 성능은 단순한 연산 최적화뿐만 아니라 액추에이터의 응답 동역학까지 통제해야 완벽에 다가설 수 있음을 깨우쳐주었습니다.