스펙트럼 평탄도(Spectral Flatness)란? AI에서 소리의 주파수 세기가 고른 정도를 숫자로 요약하는 방법
TL;DR
스펙트럼 평탄도는 한 소리 구간의 주파수별 파워가 얼마나 고르게 퍼졌는지 기하평균과 산술평균의 비로 요약한 특징입니다. 일부 성분에 몰리면 낮고 고르게 분포하면 1에 가까워집니다.[2][3] 잡음과 닮은 정도를 살피는 단서이지만 잡음일 확률이나 음질 점수는 아닙니다. 입력의 제곱 여부·분석 대역·0 처리와 무음을 함께 확인합니다.
핵심 3줄 요약
- 핵심 1
평균 두 가지를 나눕니다. 주파수별 파워의 기하평균을 산술평균으로 나눠 고른 정도를 읽습니다. - 핵심 2
주파수 위치와는 다릅니다. 스펙트럼 중심이 평균 위치라면 평탄도는 성분별 세기의 고름을 요약합니다. - 핵심 3
무음과 바닥값을 따로 봅니다. 작은 값을 올려 계산하는 구현에서는 완전 무음도 1에 가까운 결과가 나올 수 있습니다.
이 글에서 다룰 내용
- 스펙트럼 평탄도의 한 문장 정의
- 두 주파수 칸으로 보는 평균과 비율
- 파워·로그·평균의 작동 순서
- librosa의 제곱·바닥값·창·출력 축
- 스펙트럼 중심·STFT·영교차율과의 차이
- 소리 특징의 사용처와 실전 체크리스트
- 무음·대역 선택·잡음 판정의 주의점
스펙트럼 평탄도를 한 문장으로 정의하면 무엇인가요?
스펙트럼 평탄도는 선택한 주파수 칸들의 음이 아닌 파워를 기하평균한 값을 같은 칸들의 산술평균으로 나눈 수치입니다.
영문명은 Spectral Flatness이며 스펙트럴 플랫니스라고도 부릅니다. 여기서는 파워 스펙트럼을 기준으로 설명합니다. Essentia의 일반 Flatness는 입력 배열 자체의 두 평균 비를 구하므로 입력 스펙트럼의 종류도 함께 확인합니다.[2][3]
양수 값들이 모두 같으면 두 평균이 같아 비율은 1입니다. 일부 값만 크고 나머지가 작으면 기하평균이 상대적으로 작아집니다. 전체가 0인 경우를 제외한 이상적인 비율은 0부터 1 사이이며 단위는 없습니다. 0.6을 600Hz나 잡음 확률 60%로 읽지 않습니다.[3][4]
한 줄 정리: 스펙트럼 평탄도는 정한 주파수 칸 사이의 세기 분포를 압축합니다. 실제 소리의 이름이나 말의 내용은 이 숫자에 들어 있지 않습니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 한 구간의 주파수 두 칸에서 파워
[5,5]
를 얻었다고 가정해 보겠습니다. 실제 녹음 대신 원리를 확인하려고 만든 배열입니다. 두 값을 더해 2로 나눈 산술평균은 5이고 곱한 값의 제곱근인 기하평균도 5입니다. 평탄도는
5/5=1
입니다.
파워가
[1,9]
이면 산술평균은 여전히 5지만 기하평균은 3입니다. 따라서
3/5=0.6
입니다. 두 예시의 총파워는 같아도 한쪽 칸에 몰린 정도가 달라 평탄도가 달라집니다. 순서만 뒤집은
[9,1]
도 비율은 0.6입니다.
두 값을 모두 열 배 한
[10,90]
은 기하평균 30, 산술평균 50으로 다시 0.6입니다. 바닥값이나 잘림이 개입하지 않는 조건에서는 모든 파워에 같은 양수 배율을 곱해도 비율이 유지됩니다. 크기 자체를 재는 음량 지표로 쓰지 않는 이유입니다.
그런데
[1,3]
을 파워로 간주해 바로 계산하면 약 0.8660입니다. 이 배열이 실제로는 진폭 크기라서 제곱해야 했다면 파워
[1,9]
의 0.6을 써야 합니다. 반대로 이미 파워인
[1,9]
를 또 제곱하면
[1,81]
이 되어 약 0.2195로 내려갑니다.
위 숫자는 Python 표준 라이브러리로 평균·로그·제곱근을 직접 계산해 확인했습니다. librosa·Essentia·SciPy의 함수를 실행하거나 오디오 분류 성능을 측정한 결과는 아닙니다. 두 칸 예시가 실제 녹음의 모든 주파수 분포를 재현하지도 않습니다.
쉬운 예시: 같은 양을 두 칸에 고르게 담았는지 한 칸에 몰아 담았는지를 비교합니다. 어느 칸이 낮은 주파수인지는 이 비율 계산에 직접 들어가지 않습니다.
왜 AI에서 스펙트럼 평탄도가 중요한가요?
주파수 분포의 다른 면을 살핍니다
librosa와 OpenAE는 높은 평탄도를 백색잡음과 비슷한 스펙트럼의 단서로 설명합니다.[1][3] 평균 주파수 위치만으로는 보이지 않는 집중 정도를 함께 볼 때 검토합니다. 좁은 성분과 넓게 퍼진 성분의 차이를 살피되 높고 낮음 자체에 좋고 나쁨을 붙이지 않습니다.
특징 계산과 모델 판정을 나눕니다
짧은 구간별 평탄도 곡선을 다른 특징과 함께 AI 입력 후보로 비교할 수 있습니다. 이는 활용 설계의 예시입니다. 평탄도를 계산하는 함수는 화자·기계 상태·배경음 종류를 학습해 정답 라벨을 돌려주는 분류기가 아닙니다. 특징이 일정하게 계산되는지와 실제 판정 오류가 줄었는지는 별도로 평가합니다.
스펙트럼 평탄도는 어떤 순서로 작동하나요?
1. 같은 조건의 주파수 칸을 준비합니다
파형에서 시작한다면 짧은 시간 구간마다 스펙트럼을 구하고 파워를 만듭니다. 여기서 단시간 푸리에 변환(STFT)은 여러 시간·주파수 성분을 만드는 단계입니다. 평탄도는 그중 선택한 한 구간의 여러 칸을 수치 하나로 줄입니다.[1][3]
2. 로그 평균으로 기하평균을 구합니다
양수 파워들의 자연로그를 구해 평균낸 뒤 지수함수를 적용하면 기하평균이 됩니다. SciPy의
gmean
문서도 같은 관계를 설명합니다.[4] 많은 작은 값을 곧바로 모두 곱하는 대신 로그 영역에서 계산하는 이유는 수치의 지나친 작아짐이나 커짐을 줄이려는 데 있습니다.[3]
3. 산술평균으로 나누고 구간별 값을 남깁니다
같은 주파수 칸의 파워를 더해 칸 수로 나눈 산술평균으로 앞의 결과를 나눕니다.[2][3] 기하평균과 산술평균이 서로 다른 대역을 보면 같은 정의가 아닙니다. 시간 구간마다 계산한 값을 순서대로 보관하고, 파일 대표값으로 줄이는 일은 그다음에 정합니다.
실전 팁: 파형·파워 스펙트럼·구간별 평탄도·무음 표시를 함께 남기세요. 값 하나만 보관하면 낮은 음량의 잡음 구간과 실제 대상 구간을 나중에 구별하기 어렵습니다.
주요 설정과 결과는 어떻게 읽나요?
크기 입력과 파워 입력의 제곱 여부를 맞춥니다
librosa 0.11.0의
spectral_flatness
는 스펙트럼 크기를 받는 S 입력과 지수인 power를 구분합니다. 공식 예시에서 진폭 크기를 넣는 기본 경로는
power=2.0
이고 이미 파워를 만든 경로는
power=1.0
입니다. 함수 이름만 보고 파워를 두 번 제곱하지 않습니다.[1]
amin은 더하기가 아니라 최솟값 제한입니다
확인한 구현은 먼저 입력을 power만큼 거듭제곱한 뒤
max(amin, 값)
으로 각 칸의 최솟값을 제한합니다. 기본
amin=1e-10
은 모든 칸에 같은 숫자를 더하는 방식이 아닙니다. 그 결과에 로그를 취하며 복소수나 음수인 스펙트럼 입력은 거부합니다.[5]
모든 파워가 0이라면 이 구현에서는 모든 칸이 같은 바닥값이 되어 비율이 1에 가까워집니다. 이는 백색잡음을 실제로 관측했다는 뜻이 아닙니다. 완전 무음의 원래 식은 분모도 0이므로 그대로 정의되지 않습니다. OpenAE의 설명용 코드 역시 전체가 0인 입력을 일반적인 유효 측정으로 해석할 근거가 되지는 않습니다.[3][5]
창 길이·이동 간격과 시간 위치를 구분합니다
샘플링 주파수 16,000Hz에서 창 길이 400표본은 25ms, 이동 간격 160표본은 10ms입니다. 이 숫자는 시간 해석용 예시이며 권장값이 아닙니다. 창을 바꾸면 한 번에 보는 소리가 달라지고 이동 간격을 바꾸면 곡선의 시간 간격이 달라집니다.
librosa의
center=True
는 프레임 중심이 해당 시간 위치에 오도록 양끝을 채우며 기본 패딩은 0입니다.
center=False
는 그 위치에서 프레임을 시작합니다.[1] 가장자리 구간을 원본 내부 구간과 똑같이 읽기 전에 채워진 값이 섞였는지 확인합니다.
주파수·시간·채널 축을 따로 남깁니다
확인한 librosa 구현은 끝에서 두 번째인 주파수 축을 평균내고 해당 축의 길이를 1로 유지합니다. 시간 축은 남으므로 출력의 끝 두 축은
(1,t)
입니다.[5] 두 채널의 파워를 먼저 합친 결과와 채널별 평탄도를 평균낸 결과는 일반적으로 다릅니다. 반환 모양만 보고 모두 평탄화하지 않습니다.
스펙트럼 평탄도와 헷갈리는 용어는 무엇이 다른가요?
스펙트럼 중심·대역폭과의 차이
스펙트럼 중심은 세기로 가중한 주파수의 평균 위치를 구합니다. 평탄도는 주파수 칸들의 세기를 두 평균의 비로 비교합니다. 위치가 같은 분포라도 고른 정도는 다를 수 있습니다. 대역폭 역시 중심에서 떨어진 정도를 재므로 평탄도의 별칭이 아닙니다.
이를 보려고 500·1,000·1,500Hz 세 칸에 파워
[1,1,1]
과
[0.1,2.8,0.1]
을 놓았습니다. 파워로 가중한 중심은 둘 다 1,000Hz지만 평탄도는 각각 1과 약 0.3037입니다. 이 값도 Python으로 직접 검산한 설명용 예시입니다.
영교차율·STFT·MFCC와의 차이
영교차율은 시간 파형의 부호 변화를 셉니다. 평탄도는 주파수별 세기의 분포를 봅니다. STFT는 변환 표현이고 MFCC는 멜 대역과 로그·코사인 변환으로 얻는 계수 묶음입니다. 출력이 모두 숫자라는 이유로 같은 단서라고 보지 않습니다.
잡음 확률·음질 점수와의 차이
평탄도는 잡음 라벨로 보정한 확률이 아닙니다. 높은 비율만 보고 녹음을 버리거나 음성 구간을 삭제하는 규칙은 따로 검증해야 합니다. 음성 활동 감지나 잡음 분류 모델은 실제 정답과 오류 기준이 필요한 후속 작업입니다. 작은 바닥 잡음과 필요한 넓은 대역의 소리를 함께 들어 봅니다.
비교 정리: 중심은 평균 주파수 위치, 평탄도는 칸별 세기의 고름, 영교차율은 파형의 부호 변화를 요약합니다. 분류 결과와 품질 판정은 별도로 확인합니다.
실전에서는 어디에 쓰이나요?
소리 구간의 분포 변화를 점검합니다
같은 녹음에서 특정 구간만 분포가 달라졌는지 살펴보고 원래 파형·스펙트럼과 나란히 확인하는 용도로 검토합니다. 필터 적용 전후의 평탄도도 비교할 수 있지만 필터가 없앤 것이 잡음인지 필요한 성분인지는 원본과 작업 목적에 따라 판단합니다.
오디오 AI의 작은 특징 후보를 비교합니다
구간별 값이나 미리 정한 집계값을 다른 특징과 함께 모델에 넣는 비교 실험을 설계할 수 있습니다. 평탄도가 있는 경우와 없는 경우를 같은 분할에서 평가합니다. 이 글은 모델을 학습하거나 정확도 개선을 측정하지 않았으며 실제로 유용한지는 녹음 조건과 목표 작업에 달려 있습니다.
스펙트럼 평탄도를 적용할 때 어떤 순서로 확인하나요?
1. 입력 표현과 분석 범위를 고정합니다
원본 샘플링 주파수·채널·전처리와 선택할 주파수 칸을 적습니다. 진폭 크기인지 파워인지, 전체 대역인지 일부 대역인지 표시합니다. 계산 대역을 좁히거나 0에 가까운 칸을 제외하면 값이 달라지므로 분자와 분모에 같은 선택 규칙을 적용합니다.
2. 작은 배열과 무음을 먼저 시험합니다
같은 값 두 개, 한쪽만 큰 배열, 0이 섞인 배열과 전부 0인 배열을 각각 확인합니다. 입력 배율을 바꾼 결과도 비교합니다. 바닥값보다 작아진 칸이 있다면 이상적인 배율 불변성이 그대로 유지되지 않을 수 있습니다. 도구가 예외를 내는지 숫자를 내는지도 기록합니다.[2][5]
3. 시간별 곡선과 최종 오류를 함께 봅니다
무음을 포함할지 정하고 짧은 구간의 순서를 유지한 채 곡선을 확인합니다. 같은 원본 녹음의 조각이 학습과 평가 양쪽에 섞이지 않도록 분리합니다. 실제 업무에서는 잘못 지운 음성·놓친 이상 소리 같은 오류를 따로 세고 설정 선택에 쓰지 않은 녹음에서도 평가합니다.
체크리스트: 파워 여부, 제곱 지수, 바닥값, 분석 대역, 창과 이동 간격, 채널별 곡선, 무음 표시 및 실제 작업 오류가 함께 남아 있는지 확인하세요.
사용할 때 무엇을 주의해야 하나요?
첫째, 무음의 높은 값을 잡음 확정으로 읽지 않습니다. 바닥값을 적용한 동일한 0 배열은 1에 가까워질 수 있습니다. 소리 에너지나 파형 크기로 무음 여부를 별도 표시하고 평탄도 계산이 가능했다는 사실과 의미 있는 소리가 있었다는 사실을 구분합니다.[5]
둘째, 로그 표시용 배열을 그대로 넣지 않습니다. 기하평균 계산 내부에서 로그를 쓰는 것과 dB 스펙트럼을 입력하는 것은 다릅니다. 음수가 없는 dB 배열도 원래 파워와 같은 비율을 보장하지 않습니다. 입력 계약이 요구하는 선형 크기나 파워로 돌아가 확인합니다.[3][4]
셋째, 분석 대역과 칸 수를 바꾸어 직접 비교하지 않습니다. 전체 주파수를 본 값과 관심 대역만 본 값은 서로 다른 질문에 답합니다. 주파수 칸의 순서를 바꾸는 것과 칸을 제외하는 것도 다릅니다. 입력 범위가 바뀌면 작은 칸들이 기하평균에 주는 영향도 달라집니다.
넷째, 한 숫자로 원래 스펙트럼을 복원하지 않습니다. 두 칸의 순서를 바꿔도 평탄도는 같다는 예시처럼 서로 다른 소리가 같은 요약값을 만들 수 있습니다. 파일 전체 평균까지 내면 변화 시점도 잃습니다. 원본과 구간별 값을 보존하고 판정 규칙은 정답 자료에서 확인합니다.
주의: 평탄도는 정한 표현과 범위에서의 분포 특징입니다. 잡음 제거 성공·음성 여부·음질·고장 원인을 이 값 하나로 확정하지 않습니다.
자주 묻는 질문
Q1. 평탄도가 1이면 반드시 백색잡음인가요?
선택한 칸들의 파워가 같으면 이상적인 비율은 1입니다. 무음도 바닥값 처리 뒤에는 비슷한 숫자가 나올 수 있습니다. 백색잡음인지 확정하는 검정이나 소리의 의미 판정으로 읽지 않습니다.[3][5]
Q2. 평탄도가 0.6이면 잡음이 60%인가요?
아닙니다. 기하평균을 산술평균으로 나눈 비입니다. 앞 예시에서는 파워 1과 9로 0.6이 나왔을 뿐 잡음 정답 비율을 계산한 적이 없습니다.
Q3. 볼륨을 키우면 평탄도도 커지나요?
모든 파워에 같은 양수 배율을 곱하고 바닥값·잘림이 개입하지 않으면 두 평균의 배율이 상쇄됩니다. 실제 녹음에서 잡음이나 포화까지 바뀌었다면 그 조건을 따로 확인합니다.
Q4. 이미 파워를 구했으면 기본 power를 써도 되나요?
librosa 공식 예시는 파워 스펙트럼을 S로 넣을 때
power=1.0
을 사용합니다. 기본 2를 그대로 두면 한 번 더 제곱하므로 입력을 만든 단계부터 확인합니다.[1]
Q5. 0인 칸을 빼면 같은 계산인가요?
아닙니다. 칸을 빼면 계산 범위와 평균의 분모가 바뀝니다. 일부 0이 있는 배열의 원래 비율과 바닥값으로 제한한 비율도 다릅니다. 완전 무음은 별도의 상태로 다룹니다.[3][5]
Q6. 스펙트럼 중심이 같으면 평탄도도 같나요?
그렇지 않습니다. 세 칸 예시처럼 평균 위치가 같아도 세기가 가운데에 몰린 정도가 다를 수 있습니다. 위치와 고름을 나눠 읽고 원래 스펙트럼을 함께 봅니다.
출처
마무리
스펙트럼 평탄도는 주파수별 파워의 기하평균과 산술평균을 비교해 고른 정도를 요약합니다. 주파수의 평균 위치·소리 크기·잡음 확률과 구별하고, 입력이 크기인지 파워인지 및 0을 어떻게 다루는지 확인하면 숫자의 의미가 분명해집니다.
처음에는 두 칸 예시와 완전 무음을 먼저 계산해 보세요. 실제 녹음에서는 제곱·바닥값·대역·창·채널 조건을 맞추고 구간별 곡선을 남깁니다. 그다음 실제 분류나 탐지의 오류를 비교하면 특징 계산의 일치와 업무에 맞는 결과를 구별하기 쉽습니다.
