본문 바로가기

ios

[iOS] dB 말고 dBFS

1.dB와 dBFS 차이

1. dB(데시벨)

  • 음향/전기 등에서 사용하는 무차원적 단위
  • 데시벨은 어떤 수치 x에 대해 10* logX한 값이다.
  • 사람은 보통 log적으로 소리를 듣는다.
  • 작은 소리 변화에 민감하고 큰소리 변화에는 둔감하다.

  • 데시벨은 비례적이다.
  • 10dB와 20dB의 차이와 20dB와 30dB의 차이가 동일하게 10 dB이다.
  • 그런데 dB는 10*logX로 계산하기 때문에 전압의 차이가 각각 90v와 900v이다.
    • 10dB == 10v
    • 20dB == 100v
    • 30dB == 1000v
  • 인간의 청력도 비례적이기 때문에 데시벨을 사용한다.

 

2. dBFS

  • 디지털 오디오 시스템에서 사용하는 단위이며, 디지털 신호의 최대 크기에 대한 상대적인 값입니다.
  • dB VS dBFS
    • dB : 아날로그 소리 크기에 대해서 다룹니다.
    • dBFS : 디지털 신호를 다룬다.
  • dBFS의 최대값은 항상 0dBFS이다.
  • dBFS가 최대값일 때 가장 찢어지는 현상인 클리핑이 발생한다.
  • 최소 값은 해당 기기의 디지털 오디오 시스템이 지원하는 비트 깊이에 따라 달라집니다.
  • 비트 깊이가 높을 수록 더 작은 신호도 표현이 가능해져 최소 dBFS가 더 낮아집니다.
  • 비트에 따른 dBPS 범위
    • 16비트 오디오 : 최대 0dBFS, 최소 -96 dBFS
    • 24비트 오디오 : 최대 0 dBFS, 최소 -144 dBFS
    • 32비트 오디오 : 최대 0 dBFS, 최소 - 192 dBFS(이론적, 실제로는 잘 사용되지 않음)

 

2. 아이폰이 dBFS를 사용하는 이유

  • AVRecorder로 사람 목소리 같은 아날로그 신호를 아이폰 내에서 디지털 신호로 사용해야하기 때문이다.
  • 그래서 아이폰에서는 디지털 신호를 다루는 dBFS를 사용한다.

 

3. 아날로그 신호를 dBFS로 변환하는 과정

  1. 아날로그 신호가 입력된다.
  2. ADC(Analog Digital Converter)변환을 거친다.
  3. 변환된 디지털 신호로 dBFS 단위로 측정한다.
  4. 이 값을 가지고 출력한다.

 

4. dBFS를 dB로 보여주는 방법

  • 우리가 생각하는 데시벨은 dB보다는 dB SPL에 가깝다.
  • dB SPL은 소리의 압력 레벨을 나타내는 절대적인 값이다.
  • 소리의 압력을 기준 소리 압력과 비교해서 절대적으로 나타내는 것이다.
  • dB SPL은 아날로그 신호의 소리 강도를 측정하는 데 쓰인다.

출처 : https://xerathcoder.tistory.com/314#dB?_dBFS?_%EA%B7%B8%EA%B2%8C_%EB%AD%94%EB%8D%B0?

 

 

  • 사람이 표준적으로 듣기에 귀가 아픈 수준인 0dBFS에 대해 94dB SPL이라 정햇다.
  • 공연장, 공장 소음 == 114db SPL
  • dB SPL의 공식

let db = self.audioRecorder.averagePower(forChannel: 0)
self.decibels = self.convertToDecibels(db)

AVRecorder에서 측정한 dBFS 값을 넘겨 받는 법

 

private func convertToDecibels(_ dbFS: Float) -> Float {
    let referenceLevel: Float = 94.0
    let dbSPL = referenceLevel + 20 * log10(pow(10, dbFS / 20))
    return max(min(max(dbSPL, 0.0), 94.0), 0)
}
  • max(dbSPL, 0.0): 계산된 dbSPL이 0보다 작을 경우 0으로 설정합니다. 이는 음압 레벨이 음수일 수 없기 때문입니다.
  • min(..., 94.0): 이후 값이 94.0을 초과할 수 없도록 제한합니다. 이는 일반적으로 사용되는 기준 레벨로, 특정 시스템이나 환경에 따라 다를 수 있습니다.
  • max(..., 0): 최종적으로 값이 0보다 작지 않도록 보장합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처

https://xerathcoder.tistory.com/314#dB?_dBFS?_%EA%B7%B8%EA%B2%8C_%EB%AD%94%EB%8D%B0?