홈으로 돌아가기

Linux ALSA용 AGC: 구현 및 설정

이 기사는 Linux ALSA의 VoIP 시스템에서 볼륨 정규화를 위한 AGC 구현을 설명합니다. speex, FFmpeg dynaudnorm 플러그인 및 커스텀 C++20 코드를 비교합니다. CPU +3%에서 400ms 지연 시간을 달성했습니다.

작동 중인 AGC: VoIP를 위한 speex에서 C++20으로
Advertisement 728x90

임베디드 시스템을 위한 자동 게인 제어: Linux ALSA 구현

AGC(자동 게인 제어) 알고리즘은 오디오 신호 레벨을 실시간으로 정규화하여 수동 조정을 없앱니다. ALSA를 사용하는 Linux 통신 시스템에서 다양한 소스의 불균일한 볼륨 문제를 해결합니다. 이 구현은 S16_LE 포맷, 8000Hz, 모노, 최대 500ms 지연, CPU 사용률 3% 미만을 목표로 합니다.

목표는 전체 파일 평균 없이 짧은 음성 전송을 처리하는 것입니다. 테스트는 주관적 기준(음성 명료도)과 객관적 기준(다이내믹 레인지 감소)을 포함합니다.

기존 솔루션 분석: AI와 플러그인

Nvidia의 studiovoice 모델은 볼륨 정규화와 노이즈 억제를 하지만 48kHz에서 8kHz로 리샘플링이 필요해 지연이 발생합니다. 의존성 때문에 로컬 사용이 불가능합니다.

Google AdInline article slot

ALSA speex 플러그인(speexdsp 기반)은 agc onagc_level(1–32768)으로 활성화됩니다. /etc/asound.conf 설정:

pcm.agc_pcm {
  type speex
  agc on
  agc_level 23400
  slave.pcm "dev_out"
}

pcm.test_agc {
  type plug
  slave.pcm agc_pcm
}

테스트: arecord -D dev_in | aplay -D test_agc. 문제: 초기 페이드아웃, 언더런으로 인한 "크랙링", 비공개 framesfilter_length. 평가: 통과.

FFmpeg dynaudnorm: 알고리즘 분석

dynaudnorm 필터는 완벽한 선택: ffmpeg -f alsa -i dev_in -filter:a "dynaudnorm=f=20:g=33:m=100:c=1" output.wav.

Google AdInline article slot

파라미터:

  • f=20 — 짧은 전송을 위한 20ms 프레임;
  • g=33 — 가우시안 스무딩(지연과 부드러움 균형);
  • m=100 — 최대 게인(볼륨 레벨 연동);
  • c=1 — DC 보정(간섭 오프셋 제거).

알고리즘:

  • 크기 F의 입력 프레임;
  • DC 보정;
  • 피크 검출;
  • 게인 계수 계산;
  • 스무딩을 위한 가우시안 필터;
  • 게인 적용 및 출력.

이 필터는 노이즈를 억제하지 않습니다. 대안: FFmpeg의 afftdn, anlmdn, arnndn, 또는 ALSA의 rnnoise(RNN 기반).

Google AdInline article slot

맞춤형 C++20 구현

Python/Jupyter 프로토타입은 실시간 처리를 시뮬레이션: 전체 파일 로드 없이 20ms 버퍼. 오실로스코프 뷰로 다이내믹 레인지 압축 확인.

최종: C++20의 AutomaticGainControlGaussianFilter 클래스. 프로젝트 구조:

  • libagc — 정적 라이브러리;
  • agc_pipe — 파이프 유틸리티;
  • ALSA 플러그인 libasound_module_pcm_agc.so.

agc_pipe 옵션:

허용 옵션:

-h [ --help ] 도움말 출력

-m [ --msec ] arg (=20) 프레임 길이(밀리초)

-c [ --channel ] arg (=1) 필터링 채널 수

-r [ --rate ] arg (=8000) 샘플 레이트

-f [ --filter ] arg (=13) 가우시안 필터 크기

-p [ --peak ] arg (=0.950000) 최대 피크 값

-g [ --gain ] arg (=100) 최대 게인 값

-v [ --verbose ] 상세 로그 활성화

테스트: arecord -D <input> -f S16_LE -t raw | ./agc_pipe -f 7 -g 99 | aplay -D <output> -f S16_LE -t raw.

성능: 단일 소스에서 CPU +3%, ~400ms 지연(FrameLenMs=20, FilterSize=13). 안전성을 위해 std::span 사용.

주요 요약

  • AGC는 음성 명료도를 해치지 않고 다이내믹 레인지를 줄임;
  • DC 보정은 하드웨어 아티팩트를 제거하는 필수;
  • 가우시안 필터링으로 부드러운 전환과 클리핑 최소화;
  • C++20 OOP 구현은 FFmpeg보다 유지보수성과 확장성 우수;
  • 임베디드 VoIP에 이상적: 낮은 CPU 부하, 최소 지연.

— Editorial Team

Advertisement 728x90

다음 읽기