멜 스펙트로 그램 이해

Gradiom의 이미지

당신이 나와 같은 사람이라면 멜 스펙트로 그램을 이해하려고 노력하는 것은 쉬운 일이 아닙니다. 당신은 다른 기사로 이끌 기 위해서만 기사를 읽었습니다. 그리고 다른… 그리고 다른… 계속해서 계속됩니다. 이 짧은 글이 혼란의 일부를 명확히하고 멜 스펙트로 그램을 처음부터 설명하기를 바랍니다.

신호

신호는 시간에 따라 일정한 양의 변화량이다. 오디오의 경우 변하는 양은 기압입니다. 이 정보를 어떻게 디지털 방식으로 캡처합니까? 시간이 지남에 따라 공기압 샘플을 채취 할 수 있습니다. 데이터를 샘플링하는 속도는 다양 할 수 있지만 가장 일반적으로 44.1kHz 또는 초당 44,100 개 샘플입니다. 우리가 캡처 한 것은 신호에 대한 파형 이며 컴퓨터 소프트웨어로 해석, 수정 및 분석 할 수 있습니다.

import librosa
import librosa.display
import matplotlib.pyplot as plt
y, sr = librosa.load('./example_data/blues.00000.wav')
plt.plot(y);
plt.title('Signal');
plt.xlabel('Time (samples)');
plt.ylabel('Amplitude');

푸리에 변환

오디오 신호는 여러 개의 단일 주파수 음파로 구성됩니다. 시간이 지남에 따라 신호 샘플을 수집 할 때 결과 진폭 만 캡처합니다. 푸리에 변환은 우리가 각각의 주파수의 주파수의 진폭으로 신호를 분해 할 수있는 수학 식이다. 즉, 시간 도메인의 신호를 주파수 도메인으로 변환합니다. 그 결과를 스펙트럼 이라고합니다 .

Aavos International의 이미지

이는 모든 신호가 원래 신호에 합산되는 사인파 및 코사인 파 세트로 분해 될 수 있기 때문에 가능합니다. 이것은 푸리에의 정리 로 알려진 놀라운 정리입니다. 이 정리가 사실 인 이유에 대한 좋은 직관을 원한다면 여기를 클릭 하십시오 . 여기에서 더 많은 것을 배우고 싶다면 푸리에 변환에 대한 3Blue1Brown의 경이로운 비디오도 있습니다 .

(FFT) 고속 푸리에 변환이 효율적으로 푸리에 변환을 계산할 수있는 알고리즘이다. 신호 처리에 널리 사용됩니다. 이 알고리즘을 예제 오디오의 창 세그먼트에 사용하겠습니다.

import numpy as np
n_fft = 2048
ft = np.abs(librosa.stft(y[:n_fft], hop_length = n_fft+1))
plt.plot(ft);
plt.title('Spectrum');
plt.xlabel('Frequency Bin');
plt.ylabel('Amplitude');

고속 푸리에 변환은 신호의 주파수 성분을 분석 할 수있는 강력한 도구입니다. 그러나 신호의 주파수 성분이 시간에 따라 변하면 어떻게 될까요? 음악 및 음성과 같은 대부분의 오디오 신호에 해당합니다. 이러한 신호를 비 주기적 신호라고합니다. 시간이 지남에 따라 달라지는 이러한 신호의 스펙트럼을 나타내는 방법이 필요합니다. "이봐, 신호의 여러 창 세그먼트에서 FFT를 수행하여 여러 스펙트럼을 계산할 수 없습니까?"라고 생각할 수 있습니다. 예! 이것이 정확히 수행되는 작업이며이를 단시간 푸리에 변환 이라고합니다 . FFT는 신호의 겹치는 윈도우 세그먼트에서 계산되며 스펙트로 그램 이라고하는 것을 얻습니다 . 와! 받아 들일 것이 많습니다. 여기에서 많은 일이 벌어지고 있습니다. 좋은 비주얼이 필요합니다.

MathWorks의 이미지

스펙트로 그램은 서로의 위에 쌓인 FFT 묶음으로 생각할 수 있습니다. 신호의 크기 또는 진폭을 시각적으로 표현하는 방법입니다. 시간이 지남에 따라 다른 주파수에서 달라지기 때문입니다. 스펙트로 그램을 계산할 때 뒤에서 진행되는 몇 가지 추가 세부 사항이 있습니다. y 축은 로그 스케일로 변환되고 색상 차원은 데시벨로 변환됩니다 (이를 진폭의 로그 스케일로 생각할 수 있음). 인간은 매우 작고 집중된 주파수 및 진폭 범위 만 인식 할 수 있기 때문입니다.

spec = np.abs(librosa.stft(y, hop_length=512))
spec = librosa.amplitude_to_db(spec, ref=np.max)
librosa.display.specshow(spec, sr=sr, x_axis='time', y_axis='log');
plt.colorbar(format='%+2.0f dB');
plt.title('Spectrogram');

멜 스케일

연구에 따르면 인간은 선형 척도로 주파수를 인식하지 못합니다. 우리는 높은 주파수보다 낮은 주파수의 차이를 더 잘 감지합니다. 예를 들어 500Hz와 1000Hz 사이의 차이를 쉽게 구분할 수 있지만 두 쌍 사이의 거리가 동일하더라도 10,000Hz와 10,500Hz 사이의 차이는 거의 구분할 수 없습니다.

1937 년에 Stevens, Volkmann 및 Newmann은 음정의 동일한 거리가 청취자에게 똑같이 먼 거리에서 들리도록 음조 단위를 제안했습니다. 이것을 멜 스케일 이라고합니다 . 우리는 주파수를 수학적 연산을 수행하여 멜 스케일로 변환합니다.

Simon Fraser University의 이미지

멜 스펙트로 그램

MEL 스펙트로는 주파수가 멜 스케일로 변환되는 스펙트로 그램이다. 알아요? 누가 생각했을까요? 놀라운 점은 멜 스펙트로 그램을 이해하기 위해 모든 정신 체조를 거친 후 단 몇 줄의 코드로만 구현할 수 있다는 것입니다.

mel_spect = librosa.feature.melspectrogram(y=y, sr=sr, n_fft=2048, hop_length=1024)
mel_spect = librosa.power_to_db(spect, ref=np.max)
librosa.display.specshow(mel_spect, y_axis='mel', fmax=8000, x_axis='time');
plt.title('Mel Spectrogram');
plt.colorbar(format='%+2.0f dB');

특히 저와 같은 신호 처리를 처음 접하는 경우 수집해야 할 많은 정보였습니다. 그러나이 게시물에 설명 된 개념을 계속 검토하고 벽의 모서리를 쳐다 보며 충분한 시간을 보내면 이해하기 시작할 것입니다! 우리가 한 일을 간단히 살펴 보겠습니다.

  1. 오디오 신호 를 디지털 방식으로 표현하기 위해 시간 경과에 따른 기압 샘플을 수집했습니다.
  2. 고속 푸리에 변환을 사용하여 시간 영역에서 주파수 영역으로 오디오 신호를 매핑했으며, 오디오 신호의 겹치는 윈도우 세그먼트에서이를 수행했습니다.
  3. y 축 (주파수)을 로그 스케일로 변환하고 색상 차원 (진폭)을 데시벨로 변환하여 스펙트로 그램 을 형성했습니다 .
  4. 우리 는 멜 스펙트로 그램 을 형성하기 위해 y 축 (주파수)을 멜 스케일 에 매핑했습니다 .

이 주제의 멋진 응용 프로그램을 보려면 멜 스펙트로 그램을 사용하여 노래 장르를 예측하는 컨볼 루션 신경망을 훈련시키는 음악 장르 분류에 대한 저의 게시물을 확인하십시오. 어떻게하나요? 여기서 알아 보세요 !

Suggested posts

시계열 분석을 사용하여 GameStop 주가 예측

시계열 분석을 사용하여 GameStop 주가 예측

EOD 데이터를 사용하여 GameStop 주가를 예측하기 위해 SARIMAX를 사용하는 시계열 분석으로의 진출 GameStop에 대한 내 시리즈의 Part 1과 Part 2에서 언급했듯이 이것은 일반 주식이 아닙니다. 역사상 가장 높은 단기 관심으로 인해 첫 번째 큰 압박이 발생하여 작년 가격보다 약 2000 % 상승한 후 다시 40 달러로 하락했습니다.

Apache Spark 및 Python을 사용한 빅 데이터 101

Apache Spark 및 Python을 사용한 빅 데이터 101

빅 데이터 소개 빅 데이터는 지금까지 들어 보셨어야 할 가장 큰 유행어 중 하나이며, 들어 보지 못했다면 올바른 위치에 있습니다. 인터넷에서 빅 데이터에 대한 멋진 정의를 많이 찾을 수 있지만 위키 백과의이 정의를 좋아합니다.