-
파이썬 librosa 패키지로 스펙트럼 그리기Python/Librosa 2020. 1. 12. 01:00반응형
프로젝트에서 파형의 스펙트럼을 그려서 분석할 일이 있어 코드를 작성해보았다.
data load, normalization
내가 사용한 파일이 raw 파일이라 아래와 같은 방식으로 데이터를 읽었다.
librosa 패키지는 함수의 입력으로 -1 ~ 1로 노말라이즈된 데이터를 사용하기 때문에 32767로 나누어주었다.data = np.fromfile("ANC_X_8k/boeing_FF.raw", dtype=np.int16) data = data.astype(np.float) / 32767
spectrogram, amplitude, dB
librosa.stft()는 data의 스펙트로그램을 리턴한다.
여기서 n_fft로 FFT 사이즈를 설정할 수 있다.
스펙트로그램은 복소수로 리턴되므로 np.abs를 이용해서 amplitude로 바꿔준다.
librosa.amplitude_to_db()를 이용해 스펙트로그램을 dB 스케일로 바꿔준다.
원칙상으론 데이터의 길이만큼 fft를 하면 됐으나 편의상 스펙트로그램의 평균으로 대체하였다.data = librosa.stft(data[sample_rate // 4:sample_rate // 4 * 2], n_fft=n_fft) data = np.mean(librosa.amplitude_to_db(np.abs(data)), axis=1)
다음은 pyplot을 이용해 plot하는 과정이므로 전체 코드를 참고하면 된다.
전체 코드
import numpy as np import librosa import matplotlib.pyplot as plt sample_rate = 8000 n_fft = 512 data = np.fromfile("ANC_X_8k/boeing_FF.raw", dtype=np.int16) data = data.astype(np.float) / 32767 data = librosa.stft(data[sample_rate // 4:sample_rate // 4 * 2], n_fft=n_fft) data = np.mean(librosa.amplitude_to_db(np.abs(data)), axis=1) plt.title('boeing') plt.xlabel("Frequency[Hz]") plt.xticks(range(0, n_fft//2+1, 32), np.arange(0, 4001, 500)) plt.xlim(0, n_fft//2) plt.ylabel("Amplitude[dB]") plt.plot(data, label='data', alpha=0.7) plt.grid() plt.legend() fig = plt.gcf() plt.show() fig.savefig('boeing.png')
결과물
반응형