STUDY_SEONMIN
DAY50 - 사운드 데이터 다루기2 본문
이번 글은 사운드 데이터를 다루는 방법으로 이런 것들이 있구나라고 소개하는 목적입니다. 정확한 내용은 직접 공부하여 추후에 재 업로드 하겠습니다.
정현파 조합
- 모든 신호는 주파수, 진폭, 위상이 다른 정현파(사인함수)들의 조합으로 나타낼 수 있습니다.
- 어떤 신호(소리)가 있을 때 해당 신호를 구성하는 여러 정현파들을 각각 분리해낼 수 있는데 이를 '푸리에 변환'이라고 합니다.
푸리에 변환
- 주기를 가지고 반복되는 모든 함수는 주파수와 진폭이 다른 복소지수함수의 합으로 나타낼 수 있습니다.
$$ y(t)=\sum_{k=-\infty}^\infty A_k \, \exp \left( i\cdot 2\pi\frac{k}{T} t \right) $$
$$ \text{k 는 주파수를 의미} $$
- 퓨리에 변환을 이용하면 어떤 주파수를 가진 함수가 해당 신호를 구성하고 있는지, 그 함수의 진폭은 얼마인지를 알아낼 수 있습니다.
$$ A_k = \frac{1}{T} \int_{-\frac{T}{2}}^\frac{T}{2} y(t) \ \exp \left( -i\cdot 2\pi \frac{k}{T} t \right) \ dt$$
이산 푸리에 변환
- 길이가 N인 이산시간 시계열 데이터가 있을 때, 그 시계열이 주기 N으로 반복된다고 가정하고 푸리에 변환을 하는 것입니다.
- 원래의 이산시간 시계열 데이터를 주파수와 진폭이 다른 N개의 함수의 합으로 나타냅니다.
$$ y_n = \frac{1}{N} \sum_{k=0}^{N-1} Y_k \cdot \exp \left( i\cdot 2\pi\frac{k}{N} n \right) $$
- 각 주파수에 해당하는 함수의 진폭은 다음과 같이 계산합니다.
$$ Y_k = \sum_{n=0}^{N-1} y_n \cdot \exp \left( -i\cdot 2\pi\frac{k}{N} n \right) $$
고속 푸리에 변환
- 아주 적은 계산량으로 이산 푸리에 변환을 하는 알고리즘을 의미합니다.
- 비록 길이가 $2^N$인 시계열에만 적용할 수 있다는 단점이 있지만 보통의 이산 푸리에 변환의 시간복잡도가 O($N^2$)인 것에 반해 고속 푸리에 변환은 O($N \log2 N$)으로 이산 푸리에 변환을 할 수 있습니다.
한 번 실제로 여러 정현파(사인함수)로 이루어진 신호를 만들고 푸리에 변환을 이용해 어떤 주파수를 가진 신호가 어떤 진폭을 갖는다고 나오는 지 확인해보겠습니다.
고속 푸리에 변환을 통해 결과를 살펴보면 실제로 우리가 만든 주파수인 697이나 1024 정도의 주파수의 진폭이 매우 크게 나오는 것을 볼 수 있습니다.
여기서 사실 다른 주파수는 사용하지 않았기 때문에 모두 0이 나와야 정확한 것인데 그렇지 않고 위와 같은 결과가 나오는 현상을 "깁스 현상"이라고 합니다.
이산 푸리에 변환에서 길이가 N인 시계열 데이터가 주기 N으로 반복된다고 가정한다고 하였는데 주기의 끝에 해당하는 시계열 데이터와 주기의 시작에 해당하는 시계열 데이터가 너무 다르게 되면 "깁스 현상"이 발생하게 됩니다.
스펙트럼
- 푸리에 변환처럼 어떤 신호로부터 그 신호를 이루고 있는 정현파들의 주파수를 알아내는 것입니다.
STFT
- 주파수의 특성이 시간에 따라 달라지는 사운드를 분석하기 위한 방법입니다.
- 시계열을 일정한 시간 구간으로 나누고 각 구간에 대해 스펙트럼을 구하는 방식으로 사운드를 분석합니다.
- 파이썬에서는 librosa 패키지를 이용해 STFT 분석이 가능합니다.
한 번 계이름 사운드를 STFT로 분석해보겠습니다.
계이름 사운드는 도, 도#, ..., 시, 높은도 형태로 총 13개의 주파수로 구성되어 있습니다.
이를 STFT 분석으로 살펴보면 정확하게 13개의 주파수가 나온 것을 볼 수 있으며 실제로 그 값도 약 260 ~ 520 까지로 실제 계이름들의 주파수가 잘 분석되었습니다.
'EDUCATION > DSS Online 6기' 카테고리의 다른 글
DAY52 - 분류 모형의 성능 평가 (0) | 2021.04.01 |
---|---|
DAY51 - 분류 모형 (0) | 2021.04.01 |
DAY50 - 사운드 데이터 다루기 (0) | 2021.03.31 |
DAY49 - 이미지 데이터 다루기2 (0) | 2021.03.25 |
DAY48 - 이미지 데이터 다루기 (0) | 2021.03.24 |