본문 바로가기
[ 디지털 신호처리 ]

[ 디지털 신호처리 ] Audio Signal Processing | cepstrum, MFCC

by 불주먹고양이 2023. 11. 10.

인하대학교 김병형 교수님의 '디지털 신호처리' 수업을 바탕으로 정리한 글입니다.

 

1. Cepstrum analysis

출처 : https://en.wikipedia.org/wiki/Cepstrum

 

1) Spectrum

Time waveform을 고속푸리에변환 (FFT, Fast Fourier Transform)하여 만든 Spectrum은 다음과 같은 특징을 가진다.

  1. 시간 영역 신호를 구성하는 주파수들과 그 강도를 보여준다.
    스펙트럼 상의 특정 위치가 주파수 성분이며, 주파수 성분의 높이는 해당 주파수 성분의 강도를 나타낸다.
  2. 스펙트럼은 신호의 대역폭을 보여준다.
    신호가 포함하고 있는 저주파부터 고주파까지의 분포를 확인할 수 있다.
  3. 주파수 대역 특성을 알 수 있다.
    예를 들어 낮은 주파수에 강도가 높은 성분이 있으면 저음이 강한 신호라고 할 수 있다.
  4. harmonics와 기본 주파수를 알 수 있다.
    스펙트럼을 통해 음성 신호의 기본 주파수와 그 배수인 하모닉을 알 수 있다.  신호의 음색(timbre)을 분석하는 데 중요하다.

이처럼 Spectrum이 음성 신호 분석을 위해 제공하는 정보가 많지만, 값의 범위가 일정하지 않다는 단점이 있다.

 

 

2) Log Spectrum

Spectrum에 log 함수를 해준 것이다. 다음과 같은 특징을 가진다.

  1. 크기가 균일하게 시각화가 된, 분석이 가능한 형태이다.
  2. 스펙트럼 특징의 청각적 중요성을 평가하는 데 사용될 수 있는, 귀의 민감도에 근사된 값이다.

왼쪽 - Spectrum, 오른쪽 - log Spectrum

 

이러한 특징을 가지는 Log Spectrum에 IFFT (역 푸리에 변환)을 한 것이 Cepstrum이다.

 

 

3) Cepstrum

음성은 기본 주파수 ($f0$)와 harmonics로 이루어져 있다.

  • 기본 주파수 ($f0$) : 정현파 요소 중 가장 작은 주파수
  • harmonics : 기본 주파수의 정수배
  • formant : 소리가 공명되는 특정 주파수

Cepstrum을 통해서 기본 주파수를 구하고, 이를 통해 기본 주파수의 정수배인 harmonics를 분리할 수 있다.

 

왼쪽 - Log Spectrum, 오른쪽 - Cepstrum

Quefrency는 frequency의 frequency로 신호의 주기적인 성분들이 얼마나 자주 반복되는지를 나타내는 척도이다.

 

오른쪽의 Cepstrum에서 튀어나와 있는 부분 (약 7ms)이 기본 주파수이다.

$F = \frac{1}{T}$

$T = 7ms = 0.007s$

$F = \frac{1}{0.007} = 143Hz = 0.143kHz$

 

기본 주파수 0.143kHZ의 정수배마다 harmoice peak가 일어난다는 뜻이다. 왼쪽 그래프에서 log spectrum의 peak가 1kHz 안에서 7번씩 발생했음을 확인할 수 있다.

 

즉, Cepstrum은 spectrum에서의 harmonic peak 간의 간격을 구하기 위한 방법이며, harmonic peak 간의 간격은 기본 주파수 ($f0$)가 된다. 주파수대역 간의 변동을 특성화해준다고 할 수 있다. 

이러한 이유로 spectrum 상에서의 feature extraction이 아닌 cepstrum 상에서의 feature extraction을 수행하는 것이다.

 

 

 

 

2. MFCC (Mel-Frequency Cepstral Coefficient)

음성 신호 처리 과정을 보면, waveform에 FFT (Fast Fourier Transform)을 취해서 Spectrum을 만들었다. 이 Spectrum에 'Mel Filter Bank'라는 필터를 통과시키는데 이에 대해 알아본다.

 

1) Mel Filter Bank

Mel Filter는 인간의 청각 특성을 반영한 주파수 처리 방법이다.

  • 낮은 주파수 (< 1000Hz) : 주파수 변화에 민감
    • 세밀한 주파수 성분 구분
    • Linear하게 변환
  • 높은 주파수 (> 1000Hz) : 주파수 변화에 덜 민감
    • 덜 세밀한 주파수 성분 구분
    • Log Scale로 변환

출처 : https://hyunlee103.tistory.com/46

예를 들어서, 사람들은 5000Hz와 8000Hz를 들어도 실제 3000Hz의 주파수 차이가 난다는 것을 인지하지 못한다.

따라서, 1000Hz까지는 Linear하게 변환하고 그 이후로 Mel Scale Triangular Filter를 만들어서 곱해주는 방식으로 신호를 변환해준다.

출처 : https://siggigue.github.io/pyfilterbank/melbank.html

 

여러 개의 Mel Filter 집합을 의미하는 Mel Filter Bank는 각각의 Mel 필터가 특정한 주파수 범위를 커버할 수 있게 한다.

 

 

2) MFCC (Mel-Frequency Cepstral Coefficient)

Mel Filter Bank를 통과한 신호를 계산하고 log를 취한 후, 이를 다시 푸리에 변환하여 MFCC와 같은 특징 벡터룰 생성한다.

결국 MFCC는 불필요한 정보는 버리고 음성의 중요한 특징만 남긴 피처이다.

데이터를 벡터화 한다는 것은 곧, 머신러닝 또는 딥러닝을 적용할 수 있다는 의미이다. 

 

 

3) MFCC 추출 과정 정리

  1. 음성 신호를 Frame 별 (주로 20ms ~ 40ms)로 나누어서 FFT를 적용하고, Spectrum을 구한다.
  2. Spectrum에 Mel Filter Bank를 적용하여 Mel Spectrum을 구한다.
  3. Mel Spectrum에 Cepstral 분석을 적용하여 MFCC를 구한다.
    • Cepstral 분석 과정 = log + IFFT

 

출처 : https://brightwon.tistory.com/11