오디오 샘플링

Android 5.0(Lollipop)부터 오디오 리샘플러는 완전히 Kaiser 창-싱크(Kaiser windowed-sinc) 함수에서 파생된 FIR 필터를 기반으로 합니다. Kaiser 창-싱크 함수에서 제공하는 속성은 다음과 같습니다.

  • 설계 매개변수(저지 대역 리플, 전이 대역폭, 차단 주파수, 필터 길이)를 간단하게 계산할 수 있습니다.
  • 전체 에너지 대비 저지 대역 에너지를 감소하는 데 거의 최적화되어 있습니다.

Kaiser 창 함수 및 이 함수와 Prolate Spheroidal 창 함수의 최적화 조건 및 관계에 관한 자세한 내용은 P.P. Vaidyanathan, Multirate Systems and Filter Banks 50페이지를 참조하세요.

설계 매개변수는 내부 품질 결과와 원하는 샘플링 비율을 기반으로 자동 계산됩니다. 설계 매개변수에 따라 창-싱크 필터가 생성됩니다. 음악용으로 사용하는 경우 44.1kHz에서 48kHz 및 그 반대로 리샘플링하는 리샘플러가 임의의 주파수 변환에 사용할 때보다 뛰어난 품질로 생성됩니다.

오디오 리샘플러는 향상된 품질을 제공할 뿐만 아니라 이러한 품질을 훨씬 빠르게 실현할 수 있습니다. 하지만 리샘플러로 인해 소량의 통과 대역 리플 및 앨리어싱 고조파 노이즈가 발생하고 전이 대역에서 일부 고주파수가 손실될 수 있으므로 불필요한 사용을 자제하시기 바랍니다.

샘플링 및 리샘플링 권장사항

이 섹션에서는 샘플링 레이트와 관련된 문제를 방지할 수 있도록 몇 가지 권장사항을 설명합니다.

기기에 적합한 샘플링 레이트 선택

일반적으로 기기에 적합한 샘플링 레이트로 44.1kHz 또는 48kHz를 선택하는 것이 가장 좋습니다. 48kHz보다 높은 샘플링 레이트를 사용하면 파일을 재생하는 데 반드시 리샘플러를 사용해야 하기 때문에 일반적으로 품질이 저하됩니다.

간단한 리샘플링 비율(고정 다상 대 보간된 다상) 사용

리샘플러는 다음 모드 중 하나에서 작동합니다.

  • 고정 다상 모드. 각 다상의 필터 계수가 미리 계산됩니다.
  • 보간된 다상 모드. 미리 계산된 다상 중 가장 근접한 두 개를 사용하여 각 다상의 필터 계수를 보간해야 합니다.

입력 속도 및 출력 속도 비율, L/M(최대 공약수를 취함)에서 M이 256 미만일 때 리샘플러는 고정 다상 모드에서 가장 빠릅니다. 예를 들어 44,100에서 48,000으로 변환하는 경우 L = 147, M = 160입니다.

고정 다상 모드에서 샘플링 레이트는 잠겨 있기 때문에 변경되지 않습니다. 보간된 다상 모드에서 이 샘플링 레이트는 근사치입니다. 48kHz 기기에서 재생할 때 샘플링 레이트 드리프트는 일반적으로 몇 시간당 샘플 한 개입니다. 근사 오차는 내부 수정 오실레이터, 열 드리프트 또는 잡음(보통 수십 ppm)으로 인한 주파수 오차보다 훨씬 작기 때문에 걱정할 사항은 아닙니다.

48kHz 기기에서 재생할 때 AudioTrack을 통해 다른 샘플링 레이트 및 비율이 허용되어도 24kHz(1:2) 및 32kHz(2:3) 같은 단순비 샘플링 레이트를 선택하세요.

다운샘플링 대신 업샘플링을 사용하여 샘플링 레이트 변경

샘플링 레이트는 필요에 따라 변경할 수 있습니다. 변경 시 세분성은 각 샘플이 아니라 내부 버퍼링(보통 수백 개의 샘플)을 기반으로 합니다. 이러한 세분성은 이펙트에도 사용할 수 있습니다.

다운샘플링 시 샘플링 레이트를 급격하게 변경하지 마세요. 오디오 트랙을 생성한 후 샘플링 레이트를 변경할 때 원래 레이트와의 차이가 약 5~10%이면 다운샘플링 시 앨리어싱을 제대로 억제하기 위해 필터 재연산을 트리거할 수 있습니다. 이 과정에서 컴퓨팅 리소스를 사용하고 필터가 실시간으로 교체되면 딸깍 소리가 날 수 있습니다.

다운샘플링을 6:1 이하로 제한

일반적으로 다운샘플링은 하드웨어 기기 요구사항에 따라 트리거됩니다. 다운샘플링에 샘플링 레이트 변환기를 사용할 때는 앨리어싱을 제대로 억제할 수 있도록 다운샘플링 비율을 6:1 이하로 제한하세요(예: 비율이 48,000:8,000보다 큰 다운샘플링은 허용되지 않음). 필터 길이는 다운샘플링 비율에 맞게 조정되지만 필터 길이가 과도하게 증가하지 않도록 하기 위해 다운샘플링 비율이 높아질수록 전이 대역폭을 줄입니다. 업샘플링에서는 이러한 앨리어싱 문제를 걱정할 필요가 없습니다. 오디오 파이프라인의 일부 항목들이 2:1을 넘는 다운샘플링을 방지할 수 있습니다.

지연 시간이 우려된다면 리샘플링하지 않기

리샘플링하면 트랙이 FastMixer 경로에 있을 수 없습니다. 즉, 일반 믹서 경로에서 더 큰 버퍼가 추가로 발생하여 지연 시간이 훨씬 길어집니다. 게다가 리샘플러의 필터 길이로 인한 암시적 지연이 발생합니다. 이 시간은 일반적으로 약 1밀리초 이하로, 일반 믹서 경로의 추가 버퍼링(보통 20밀리초)만큼 길지 않습니다.

부동 소수점 오디오 사용

부동 소수점 숫자를 사용하여 오디오 데이터를 표시하면 고성능 오디오 애플리케이션에서 오디오 품질을 크게 향상할 수 있습니다. 부동 소수점을 사용하면 다음과 같은 이점이 있습니다.

  • 더 넓은 동적 범위
  • 동적 범위 전체에서 정확도 유지
  • 중간 계산 및 과도 상태 중 클리핑을 최소화할 수 있는 충분한 헤드룸

부동 소수점은 오디오 품질을 향상시킬 수 있지만 몇 가지 단점도 있습니다.

  • 부동 소수점 숫자는 더 많은 메모리를 사용합니다.
  • 부동 소수점 연산은 예기치 못한 속성을 사용합니다. 예를 들면, 덧셈은 결합 법칙이 아닙니다.
  • 부동 소수점 계산은 반올림 또는 숫자상으로 불안정한 알고리즘 때문에 산술적 정밀도가 떨어질 수 있습니다.
  • 부동 소수점을 효과적으로 사용하려면 정확하고 재현 가능한 결과를 도출할 방법을 폭넓게 이해하고 있어야 합니다.

예전에 부동 소수점은 사용이 불가능하고 느리다고 알려져 있었습니다. 보급형 및 삽입된 프로세서에서는 여전히 이러한 문제가 있습니다. 하지만 최신 휴대기기의 프로세서는 성능이 정수와 유사하거나 일부 경우에는 더 빠른 하드웨어 부동 소수점을 사용하고 있습니다. 또한 최신 CPU에서는 성능을 더 향상할 수 있는 SIMD(Single instruction, multiple data)를 지원합니다.

부동 소수점 오디오 권장사항

다음은 부동 소수점 계산과 관련된 문제를 방지하는 데 도움이 되는 권장사항입니다.

  • 필터 계수 계산과 같이 자주 실행하지 않는 계산에 배정밀도 부동 소수점을 사용합니다.
  • 작업 순서에 주의해야 합니다.
  • 중간 값에 명시적 변수를 선언합니다.
  • 원하는 대로 괄호를 사용합니다.
  • NaN 또는 무한대 결과를 얻으면 바이너리 검색을 사용하여 결과가 지정된 위치를 검색합니다.

부동 소수점 오디오의 경우 오디오 형식 인코딩 AudioFormat.ENCODING_PCM_FLOAT는 AudioTrack 데이터 형식을 지정하는 ENCODING_PCM_16_BIT 또는 ENCODING_PCM_8_BIT와 유사하게 사용됩니다. 오버로드된 관련 메서드 AudioTrack.write()는 부동 배열에서 데이터를 가져와서 전달합니다.

Kotlin

fun write(
        audioData: FloatArray,
        offsetInFloats: Int,
        sizeInFloats: Int,
        writeMode: Int
): Int

Java

public int write(float[] audioData,
        int offsetInFloats,
        int sizeInFloats,
        int writeMode)

추가 정보

이 섹션에는 샘플링 및 부동 소수점에 대한 추가 리소스가 표시되어 있습니다.

샘플링

샘플링 레이트

리샘플링

높은 비트 심도 및 kHz 관련 논란

부동 소수점

다음은 부동 소수점 오디오를 이해하는 데 유용한 위키백과 페이지입니다.

다음은 컴퓨터 시스템 설계자에게 직접적인 영향을 미치는 부동 소수점 특성에 관한 정보를 제공하는 문서입니다.