Librosa CQT: почему эти простые синусоидальные волны не падают аккуратно в свои частотные бины? - PullRequest
0 голосов
/ 31 марта 2020

Я пробовал Librosa и тестировал функцию cqt для проекта, связанного с (musi c). Чтобы убедиться, что я правильно его использую, я ввел сумму двух синусоид, соответствующих двум нотам: A3 и C5. Результат оказался не совсем таким, как я ожидал. Две корзины для A3 и C5 имеют самую сильную энергию, но корзины вокруг них совсем не симметричны c .

Это нормальный результат или я что-то делаю не так ? Я проверил и частоты cqt идеально совпадают с примечаниями. Кроме того, когда я попробовал chroma_cqt, результат был почти идеально симметричен c.

import librosa
import librosa.display
import numpy as np
import matplotlib.pyplot as plt

sr = 44100
s = np.linspace(0,5,5*sr)
f1 = librosa.midi_to_hz(69) # A, 440 Hz
f2 = librosa.midi_to_hz(84) # C, 1047 Hz
y = np.sin(2*np.pi*f1*s)+np.sin(2*np.pi*f2*s)


fmin = librosa.midi_to_hz(36) # C2, 65.4 Hz
n_octaves = 6
n_bins = 12*n_octaves

n_fft = 8192
hop_length = n_fft//4


## CQT implementation
# chromogram
Cr = librosa.feature.chroma_cqt(y=y, sr=44100, hop_length=hop_length, norm=None, n_octaves=7)

plt.figure(figsize=(10, 4))
librosa.display.specshow(Cr, hop_length=hop_length,
                         x_axis='time',
                         y_axis='chroma', sr=sr,
                         cmap="Greys")
plt.colorbar(format='%+2.0f dB')
plt.title('spectrogram')
plt.tight_layout()
plt.show()

# spectrogram
C =librosa.core.cqt(y, sr=44100,
                    hop_length=hop_length, 
                    filter_scale=2, fmin=fmin,
                    n_bins=n_bins)
C_dB = librosa.amplitude_to_db(np.abs(C))
plt.figure(figsize=(10, 4))

librosa.display.specshow(C_dB, x_axis='time',
                         hop_length=hop_length,
                         y_axis='cqt_note', sr=sr,
                         cmap="Greys")
plt.colorbar(format='%+2.0f dB')
plt.title('spectrogram')
plt.tight_layout()
plt.show()
...