[가로축 : 시간, 세로축 : 주파수, 색깔 : dB(magnitude)]
function : tf.signal.stft(signals)
parameter :
frame_length
: 각 프레임 길이frame_step
: frame 간 sample 개수fft_length
: FFT sizespectrograms = tf.signal.stft(signals,
frame_length=1024,
frame_step=512)
tf.abs()
magnitude_spectrograms = tf.abs(spectrograms)
이제 spectrogram 값의 크기를 측정했으므로, 시각화가 가능합니다.
함수 : librosa.amplitude_to_db()
엄밀히 말하면, log-magnitude power-spectrogram 입니다.
아래는 scaling 한 그림이랑 안한 그림입니다.
이 과정은 아래 함수로 진행이 가능합니다.
tf.signal.linear_to_mel_weight_matrix()
num_mel_bins
: mel-frequency band의 개수num_spectrogram_bins
: fft_length//2 + 1sample_rate
lower_edge_hertz
, upper_edge_hertz
: 가장 높은 주파수
[mel-filter bank with 16 mel-bins]
squared magnitude-spectrograms 와
mel-filter bank를 곱하여 봅시다.
그러면 mel-scaled power-spectrogram을 결과물로 받게 됩니다.
mel_power_specgrams = tf.matmul(tf.square(magnitude_spectrograms),
mel_filterbank)
마지막으로 소리 변환을 로그 스케일로 인식할 수 있도록 로그 변환을 해줍니다.
mel -spectrogram에 log를 씌우는 방법도 있지만, log(0)가 정의되면 골치아파 집니다.
대신 magnitude를 dB(decibel)로 바꾸어 크기를 전환합니다.
함수 : librosa.power_to_db
log_magnitude_mel_spectrograms = power_to_db(mel_power_spectrograms)
log scale로 변환 후 spectrogram의 최댓값은 0이 되고 최소값은 - top_db
가 됩니다. 위의 멜 스펙트로그램을 다시 한 번 확인해 봅시다.
[최대 0dB, 최소 -80dB]