관리 메뉴

사과하는 제라스

[AVFoundation 공부] dB가 아니라 dBFS라구요? 본문

제라스의 Swift 공부/AVFoundation 공부

[AVFoundation 공부] dB가 아니라 dBFS라구요?

Xerath(제라스) 2024. 9. 9. 01:52

목차

    728x90
    반응형

    서론

    안녕하세요~! 개발자 제라스입니다! 👋🏻 🤖 👋🏻

     

    앞으로 AVFoundation 관련한 포스팅을 해보고자 합니다!

    혹시나 너무 잘 아시는 분들이라면 언제든 댓글로 조언 부탁드립니다~!! 

    그럼 오늘은 무슨 내용이냐??🤷🏻‍♂️🤷🏻‍♂️

    'dB?? 데시벨이구나 그래'🙆🏻‍♂️🙆🏻‍♂️

    '근데 dBFS는 뭐냐???'🤷🏻‍♂️🤷🏻‍♂️🤷🏻‍♂️🤷🏻‍♂️🤷🏻‍♂️

     

    dB은 데시벨 맞습니다!

    dBFS는 이와 비슷한 것인데 차차 풀어보죠 ㅎㅎ

     

    제 회고를 종종 보시는 분들은 제가 최근에

    Apple Developer Academy@POSTECH에서 '올라잇'이란 앱을 개발했었다는 걸 아실 텐데요~~

    여기서 쓰였던 개념들입니다!

     

    그럼 dB와 dBFS 그리고 그 외의 다른 것들을 포함한 개념

    dBFS를 dB로 보정하는 과정에 대한 설명을 해보겠습니다!

     

    그으으으럼 시작해봅시다~~!! 🚀 🚀

    dB? dBFS? 그게 뭔데?

    일단 dB부터~~

    dB는 데시벨이라고 읽죠??

    이 친구는  '음향/전기 등에서 사용하는 무차원적인 단위'입니다.

     

    데시벨은 어떤 수치 x에 대해 10*logx한 값입니다.

    근데 사람은 보통 log적으로 소리를 들어요!

     

    작은 소리의 변화엔 민감하고, 큰 소리의 변화에는 둔감한...! 딱 로그 함수 느낌이죠!

    로그 함수 그래프

    그리고 이런 성향이 또 영향을 미치는 부분이 '비례적 효과'입니다.

    우리는 10dB과 20dB의 차이와 20dB과 30dB의 차이가 동일하게 10dB이죠?

     

    근데 아까 말씀드린것처럼 dB은 10*logx로 계산하기 때문에 

    10dB을 내기 위해서 10v,

    20dB을 내기 위해서 100v,

    30dB을 내기 위해서 1000v

     

    그럼 전압의 차이는 90v와 900v입니다.

     

    엥?????? 그럼 완전 큰 차이 아님??

    근데 문제는 아까 말한 것처럼 사람도 log적으로 소리를 인지해요..ㅋㅋㅋ

    그렇기에 둘의 차이를 비슷하게 느낀다는 겁니다...!

     

    이러한 특성이 있기에 우리는 dB을 씁니다.

     

    출처: https://m.blog.naver.com/PostView.naver?blogId=bernardo92&logNo=221353656159&navType=by&view=img_9

     

    이 표를 보시면 10dB은 0dB의 2배, 20dB은 10dB의 2배, 30dB은 20dB의 2배

    이런 식으로 이들 사이의 차이가 10dB로 동일하면 사람이 느끼는 음량도 동일한 배수로 커집니다.

     

    그럼 dBFS는 무엇이냐...?

    dBFS는 디지털 오디오 시스템에서 사용하는 단위로, 디지털 신호의 최대 크기에 대한 상대적인 값입니다.

    즉, 아날로그의 소리 크기에 대해서 다루는 둘 값 사이의 비율을 표현하는 dB과는 달리 dBFS는 디지털 신호를 다룹니다.

     

    그리고 dBFS는 일단 최대 값은 항상 0dBFS입니다.

    이때가 가장 찢어지는 소리가 나는 현상인 클리핑이 발생해요!

     

    반면, 최소 값은 해당 기기의 디지털 오디오 시스템이 지원하는 비트 깊이에 따라 달라집니다.

    비트 깊이가 높을수록 더 작은 신호도 표현이 가능해져서 최소 dBFS가 더 낮아집니다.

     

    이때, dBFS의 범위는

    • 16비트 오디오: 최대 0 dBFS, 최소 -96 dBFS
    • 24비트 오디오: 최대 0 dBFS, 최소 -144 dBFS
    • 32비트 오디오: 최대 0 dBFS, 최소 -192 dBFS (이론적으로, 실제로는 잘 사용되지 않음)

    이렇게 나뉩니다.

    근데, 열심히 아이폰 15Pro의 비트 오디오를 찾아보니 24비트 이상인 것 같더라구요??

    (최신 아이폰 기종들은 대부분 24bit를 제공한다고 함다 ㅎㅎㅎ)

     

    https://www.0db.co.kr/REVIEW_0DB/3387727

     

    애플 아이폰15Pro, C타입 단자 성능은? - 영디비

    C타입 탑재로 기대가 컸던 아이폰 15! 저는 아이폰 15 Pro를 구매해서 테스트해봤습니다. 그런데 C타입이면 성능이 비슷하게 나와야 하는거 아닌가요? 이거 왜 이러지??? 측정 장비 및 조건테스트

    www.0db.co.kr

     


    특히, 이렇게 테스트를 거친 곳을 찾았는데,

    출처: https://www.0db.co.kr/REVIEW_0DB/3387727

    위처럼 Apple type-C 오디오 잭, 시오 DAC, 지텔라2, G5 등등 (저는 이게 뭔지 모릅니다 ㅋㅋㅋㅋㅋㅋㅋㅋ)

    측정한 결과 Ch1, Ch2 모두 저 정도가 나오는데...!

     

    98dB 이하면 16bit, 98dB 초과면 24bit 정도라고 합니다.

    즉, 넉넉히 24bit는 된다는 거죠...!

     

    그렇기에 아이폰15 pro에서 측정하는 dBFS의 최소 값은 대략... -144 ~ -192 사이로 볼 수 있습니다.

    라는 예측이 딱 들어맞게...!

    공식문서에서 averagePower라는 dBFS 측정 함수의 범위가 -160~0dBFS라고 나와있습니다 ㅎㅎ

     

    즉, 우리는 편의상 보통 dB이라는 어떤 두 소리의 상대적인 신호 크기 측정 단위를 쓰는데,

    아이폰은 디지털 신호인 dBFS를 통해 최대 가능한 신호 크기를 기준으로 상대적인 신호의 크기를 나타냅니다.

    왜 아이폰(디바이스)은 dBFS를 쓸까?

    이유는 간단해요...!!

     

    제가 이번에 만들었던 올라잇이라는 앱은

    유저의 목소리(아날로그 신호)를 AVRecorder로 받아오거든요??

     

    이때 받아오는 소리들을 디지털 기기인 아이폰은 디지털 값으로 처리를 해야하잖아요??

    이걸 그대로 아날로그로 쓸 순 없으니...!! 안 그러씀까~~~??

     

    그래서 들어오는 신호들을 디지털 기준에 맞추게 되고,

    결국 이걸 나타내는 단위로 디지털 신호 단위인 dBFS를 사용하는 거죠!

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

    이 과정은 크게 4단계로 나눌 수 있어요.

     

    제일 먼저, 우리가 말을 하면 그 소리 즉, 1. 아날로그 신호가 입력됩니다.

     

    그 다음엔 2. ADC 변환을 거칩니다. 즉, 아이폰 내부에서 Analog 신호를 Digital로 변환하는 Converter(변환기)를 통해 변환을 합니다.

    이때 사용되는게 샘플링이랑 양자화라고 하는데...이것도 전 잘 몰라요 ㅠㅠㅠ

     

    이후, 디지털 신호로 변환된 걸 가지고 3. dBFS 단위로 측정을 합니다.

     

    마지막으론 4. 이 값을 가지고 출력을 하는 거죠.

     

    그럼 dBFS만 알려주는 아이폰...! 어떻게 dB로 보여줄 건데? (feat. dB SPL)

    사실 그거 아시나요...?

    우리가 생각하는 데시벨...!

    이거는 사실 dB보다는 dB SPL에 가깝다는 거요...!

     

    허걱쓰... 으에엥...??

    dB SPL이 뭔데??????????????

     

    얘는 소리의 압력 레벨을 나타내는 절대적인 값이에요!

    소리의 압력을 기준 소리 압력과 비교해서(절대적으로) 나타내는 겁니다.

     

    그리고 이 친구는 아날로그 신호(사람 목소리 포함)의 소리 강도를 측정하는 데에 사용돼요.

    이때 0 dB SPL은 인간이 들을 수 있는 최소한의 소리인데, 거어어어어의 못 듣습니다.

     

    그럼 지피티 형님게 여쭤본 dB과 dB SPL을 비교한 표는 다음과 같습니다.

     

    그렇기에 올라잇에서는 사실 dB라고는 하지만 더 정확히는 dB SPL을 가지고 dB값을 보여줬습니다!

    그래, 그럼 dBFS를 dB SPL로 어떻게 변환하는데??

    이게 중요하죠 ㅎㅎ

    찾다보니 국제 표준 IEC 60942에서는 마이크로폰 소리 압력 측정을 위한 기준으로 94dB SPL을 설정했어요!

    즉, 사람이 표준적으로 듣기에 귀가 상당히 아픈 수준인 0dBFS에 대해서 94dB SPL정도라고 정해둔 거죠.

     

    사실 하나 더 114dB SPL도 정의해놨던데,

    이건 고음압 레벨 즉, 공연장, 공장 소음, 비행기 엔진 소리 같은 환경에서의 측정 레벨입니다.

    그렇기에 이땐 0dBFS에 대해 114db SPL로 설정해두고 해야죠.

     

    좋아...그래...

    말이 너무 길어...ㅠㅠㅠㅠ

     

    그래유 그래유 ㅠㅠㅠ 이제 진짜 들어가봅시다!!!

     

    dBSPL은 다음과 같은 식으로 나오거든요??

     

    그럼 먼저, 

    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)
    }

     

    아까 공식을 반영하면 위에처럼 써볼 수 있어요...!

     

    여기서 잠깐!

    마지막 줄에 min, max 처리를 왜 함???

     

    유저 입장에서 dB이란 것에 대해서 -값이 나오는 것에 대해서 어색함을 느낄 거 같고,

    최댓값은 94이기에 딱 그에 맞게 안정적으로 제한을 두기 위해 해두었습니다.

     

    근데...막상 재보면 좀 소리가 높아요...!!

    어떻게 아는데??

     

     

    이렇게 Sound Meter라는 앱을 참고하면서 정도를 같이 파악했거든요~~

     

    그래서!!

    찾다보니 dB(A)라는 애가 있더라구요?!?!

    얘는 소리의 크기 뿐만 아니라 인간의 청각적 특성도 고려한 단위라고 합니다.

     

    즉, 인간이 주파수에 따라 민감도가 생기는데 이 대역의 소리를 조금 더 강조하는 방식으로,

    주파수에 따른 가중치를 주는 거죠...!

     

    그 주파수를 남자(85Hz ~ 180Hz), 여자(165Hz ~ 255Hz) 정도이기에

    올라잇에서는 평균을 내서 171.25Hz에서 가중치 -12.3dB SPL정도를 하게 되었습니다!

     

    그러고나니 Sound Meter라는 앱과 상당히 비슷한 수치들을 띄게 되었습니다 ㅎㅎ

    '올라잇' 화면캡쳐

    마무리

    후... 이 정도면 제가 숭실대 소리박사인지 싶을 정도네요 ㅋㅋㅋㅋㅋㅋㅋ

    물론 완전 엉성할 수도, 부족한 부분도 많겠지만 제 실력 상 이 정도까지 학습을 한게 최선이었던 거 같습니다 ㅠㅠㅠ

     

    그래도 뭔가 얼핏 알고만 있던 청각 신호 세상에서 잠시라도 헤엄쳐본🏊🏻‍♂️🏊🏻‍♂️🏊🏻‍♂️

    그런 수중 제라스였습니다 ㅋㅋㅋ

     

    뭔가 직접적인 AVFoundation 요소라기보다는 주변 지식에 가깝단 생각이 문득 드네요 😅😅

    AVRecorder에 대한 setting 요소들을 학습하고 이를 반영해서 받아온 dBFS를 가공하는 과정 정도로 볼 수 있겠슴다 흐흐흫

     

    다음에는 더 재밌는 AVFoundation 학습 요소를 가져와보겠습니다!

    긴 글 봐주셔서 감사합니다 : -D

    참고

    https://m.blog.naver.com/PostView.naver?blogId=bernardo92&logNo=221353656159&navType=by

     

    dB? dBspl ?

    아날로그 신호는 세기나 강도가 연속적으로 변하는 신호입니다. 반면 디지털 신호는 연속적으로 보이...

    blog.naver.com

     

     

    https://www.0db.co.kr/REVIEW_0DB/3387727

     

    애플 아이폰15Pro, C타입 단자 성능은? - 영디비

    C타입 탑재로 기대가 컸던 아이폰 15! 저는 아이폰 15 Pro를 구매해서 테스트해봤습니다. 그런데 C타입이면 성능이 비슷하게 나와야 하는거 아닌가요? 이거 왜 이러지??? 측정 장비 및 조건테스트

    www.0db.co.kr

     

    https://www.reddit.com/r/audioengineering/comments/11gpina/dbspl_vs_dbfs/

     

    From the audioengineering community on Reddit

    Explore this post and more from the audioengineering community

    www.reddit.com

     

    https://newsight.tistory.com/360

     

    Decibel과 SPL(Sound Pressure Level)

    Decibel과 Sound Pressure Level(SPL)우선 벨은 단순히 P2과 P1의 비율에 log_10을 취한 것으로 두 값의 상대적인 비율을 나타내는 값이다. 보통 분자인 P2는 output signal을 의미하고, P1은 input signal을 의미한다.

    newsight.tistory.com

     

    http://audio-probe.com/documentation/db%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80/

     

    dB(decibel) 란 무엇인가? (dBV, dBu, dBSPL, dBFS)

    Digital Techniques, Artisans' Finesse.

    audio-probe.com

     


    아직 꼬꼬마 개발자입니다.

    더 나은 설명이나 코드가 있다면 언제든 환영입니다.

    적극적인 조언과 피드백 부탁드립니다!

     

    그럼 오늘도 개발 가득한 하루되세요!

    - Xerath -

    🤖🤖🤖🤖🤖🤖🤖

    728x90
    반응형