이번 포스트에서는 소리의 파형을 분석하기 위해 사용되는 기법인 푸리에 변환과 특징 추출값으로 사용되는 MFCC의 개념에 대해서 알아보겠습니다.

1. 소리는 주파수의 합산

Piano in Waveform

 

위의 이미지는 실제 피아노 소리 파일을 파형(waveform) 형태로 시각화 한 것입니다. 간단한 피아노 소리이지만 매우 복잡한 파형을 그리고 있는 것을 볼 수 있는데요. 사실 우리가 흔히 들을 수 있는 이러한 “소리"라는 것은 각기 다른 단일 주파수를 가진 무수히 많은 정현파(sinewave)가 합산되어 형성된 것입니다. 제 경우에는 처음에 이해가 잘 되지 않았는데, 이런 시각화들이 많은 도움이 되었습니다. 직관적인 이해가 되시나요?

 

2. Fourier Transform

무수히 많은 정현파의 모음이 “소리"를 구성한다는 것은 이해를 했습니다. 하지만 이와 반대로 “소리"를 분석하기 위해서는 복잡한 소리(complex sound)가 어떠한 단일주파수들로 이루어져있는지를 분해(decompose)해봐야겠죠. 이를 위해 원본 소리에 행하는 작업을 푸리에변환(Fourier transform) 이라고 합니다. 다른 말로는 푸리에변환을 통해서 어떤 정현파가 얼마나 원본 소리를 구성하는지 파악할 수 있습니다.

2.1. Spectrum

파형의 형태를 띄는 원본에 푸리에 변환을 적용하여 산출되는 결과물은 **스펙트럼(spectrum)**입니다. 스펙트럼이란, 각 주파수의 정도를 시각화하여 보이는 기법입니다. 아래 그림은 파형에 푸리에변환 기법 중 하나인 FFT(Fast Fourier Transform)을 적용한 결과를 보여주고 있는데요, 스펙트럼에서 X축은 0~12000 가량의 주파수이고, Y축은 각 주파수의 진폭(amplitude) 또는 그 정도(magnitude)를 나타냅니다.

푸리에 변환을 통해서 파형이 스펙트럼으로 표현될 때 주목해야하는 점은, 파형은 시간의 흐름에 따라 변화하는 time-domain의 성질을 띄는 반면, 스펙트럼은 각 frequency마다 그 정도가 달라지는 frequency-domain의 성질을 띈다는 것입니다. 아래 그림의 스펙트럼에서는 전체 9초 가량의 시간대에 대한 주파수와 진폭을 모두 보여주고 있습니다. 즉, 스펙트럼에는 시간의 흐름에 따른 정보는 유실되는 것이죠.

푸리에변환의 결과 예시

2.2. STFT

**STFT(Short-Time Fourier Transform)**는 푸리에변환의 한계를 보완하는 기법입니다. STFT는 전체 길이보다는 짧은 어떠한 시간 간격(window)을 설정한 후, 이 간격을 시간의 흐름에 따라 움직여가며(slide) 복수의 변환을 행하여, 시간의 흐름에 따른 주파수 정보를 얻습니다. 쉽게 말해, 9초의 소리가 있다면, 1초 간격으로 쪼갠 후 1초 간격으로, 푸리에변환을 하는 식인 것이죠. STFT의 산출물은 주파수, 진폭과 더불어 시간의 정보도 포함된 스펙토그램(spectogram)입니다. 아래의 스펙토그램 시각화에서 X축은 시간, Y축은 주파수, 그리고 주파수의 정도가 데시벨(색깔)로 표현되었습니다.

STFT의 동작 예시

 

3. Mel Frequency Cepstral Coefficient (MFCC)

실제 소리나 음성을 분석할 때는 푸리에 변환만을 하지 않고, 그로부터 차원울 축소하고 분석에 용이한 특징을 추출하는 과정(Feature Extraction)을 거칩니다. 특히 오디오 신호 처리 분야에서 많이 사용되는 소리 데이터의 특징값(Feature)으로는 MFCC가 있습니다.(MFCC의 세부적인 내용과 구하는 방법은 다른 포스트에서 따로 다루도록 하겠습니다) MFCC는 갖가지 신호가 합쳐 생성된 “소리"가 가지는 고유한 특징을 추출한 값이라는 장점이 있습니다. MFCC를 이해하기 위해서 멜-스펙토그램캡스트럼 분석에 대해서 짚고 가겠습니다.

3.1. Mel-Spectogram & Mel-scale

MFCC를 설명하기 전에 멜-스펙토그램(Mel-Spectogram)에 대해서 간단히 알아보겠습니다. 멜스펙토그램이란, 사람의 달팽이관의 특성을 반영한 Mel-scale을 적용한 스펙토그램 표현법입니다. 달팽이관은 저주파 대역을 감지하는 구간이 조밀하고, 고주파 대역을 감지하는 구간은 넓게 이루어져 있습니다. 따라서 저주파 대역에 의미 있는 정보가 집중되어 있으며, 인간의 청각은 저주파 대역에서 더 민감하게 반응을 한다는 점을 반영하여, 주파수의 대역에 차등적으로 중요도를 적용하는 Mel-scale이 제안 되었습니다.

$$ \text{Mel}(f) = 2595 \log_{10} \left(1+ \frac{f}{700}\right) $$

3.2. Cepstral Analysis

캡스트럼 분석(Cepstral Analysis)이란, 스펙토그램으로부터 소리의 대표적인 특징을 추출하는 기법입니다. 소리가 큰 진폭으로 진동할 때, 이를 공명(resonance)라고 합니다. 예를 들어 성대가 떨림으로 인해서 어떠한 소리가 최초로 생성될 때, 이를 공명이라고 하죠. 스펙트럼에서 공명은 뾰족한 봉우리(peak)로 표현이 되고, 이 봉우리들을 포먼트(formant)라고 합니다. 우리가 듣는 소리의 대표적인 특징이 스펙토그램의 포먼트로 표현된다는 것이죠. 따라서 캡스트럼 분석은 아래의 그림처럼 스펙토그램으로부터 포먼트를 찾아서 분리하는 기법입니다. (Spectral 에서 spec을 뒤집으면 Cepstral 이 되는 것은 우연일까요?)

캡스트럼은 스펙트럼에 역푸리에변환(IFT: Inverse Fourier Transform)을 취하여 구합니다.

Cepstral Analysis (https://brightwon.tistory.com/11)

3.3. MFCC 구하기

MFCC를 구하는 과정은 다음과 같습니다.

  1. 주어진 신호(오디오 데이터)를 일정한 간격(window)로 나누어 푸리에변환을 적용하여 스펙토그램을 구한다.
  2. 스펙토그램의 제곱(파워 스펙토그램)에 Mel-scale을 기반으로 필터뱅크(Filter banks)를 구성하고 필터뱅크에 로그 변환을 수행한다. 이렇게 하면 Mel-scale에 따라 나누어진 구간 별로 분포한 정보를 확보한다.
  3. 주어진 Log Mel-spectogram에 역푸리에 변환을 적용하여 Cepstrum을 구한다.
  4. MFCC는 이렇게 구한 결과의 진폭(amplitude)이다.

3.4. MFCC의 의미

MFCC를 구하기 위해 적용된 기법과 과정에 대해 알아보니 머리가 조금 아프네요(…) 하지만 그 의미를 되새겨보자면 다음과 같이 요약할 수 있을 것 같습니다.

MFCC는 무수히 많은 단일주파수로 복잡하게 구성된 소리로부터 (1)사람의 청각이 예민하게 반응하는 정보를 강조하고 (2)소리의 대표적인 부분만을 취사 선택한 피처(feature)이다.

 

4. 세줄 … 아니 쓰다 보니 네줄 요약

  1. 소리는 무수히 많은 단일주파수의 합산으로 이루어져있다.
  2. 푸리에변환을 소리가 어느 주파수로 이루어져 있는지 분해할 수 있다.
  3. 푸리에변환만 수행하면 시간의 정보가 유실되므로 STFT를 적용한다.
  4. MFCC는 소리를 분석하는데 많이 사용되는 피쳐로, 인간의 청각에 유의미한 주파수대역을 강조하고, 소리의 대표적인 특징을 추출한 값이다.

이번 포스트에서는 푸리에변환과 MFCC의 개념에 대해서 간단히 알아보았습니다. 다음에는 파이썬으로 직접 소리 데이터를 읽고 처리하는 과정에 대해 정리해보겠습니다.

 

5. Reference