Почему спектрограмма из библиотеки librosa имеет вдвое большую временную длительность, чем фактическая звуковая дорожка?

Я использую следующий код для получения спектрограммы Мела из записанного аудиосигнала длительностью около 30 с:

spectrogram =  librosa.feature.melspectrogram(y=self.RawSamples,sr=self.SamplingFrequency, n_mels=128, fmax=8000)

    if show:
        plt.figure(figsize=(10, 4))
        librosa.display.specshow(librosa.power_to_db(self.Spectrogram, ref=np.max), y_axis='mel', fmax=8000, x_axis='time')
        plt.colorbar(format='%+2.0f dB')
        plt.title('Mel spectrogram')
        plt.tight_layout()

Полученная спектрограмма: спектрограмма Мела

Не могли бы вы объяснить мне, почему на временной оси отображается удвоенная продолжительность времени (она должна быть 30 с). Что не так с кодом?


person LiukPet    schedule 12.07.2018    source источник
comment
Ваши сырые сэмплы случайно не из стерео файла?   -  person Paul R    schedule 12.07.2018
comment
Да, это стерео wav файл @PaulR   -  person LiukPet    schedule 12.07.2018
comment
Хорошо - так что если вы обрабатываете сэмплы как один канал, вы получите вдвое большую продолжительность.   -  person Paul R    schedule 12.07.2018
comment
Знаете ли вы, есть ли какой-либо атрибут, который нужно установить при вызове метода спектрограммы из librosa, чтобы этого избежать? Кстати, большое спасибо за ответ, это очень помогает @PaulR   -  person LiukPet    schedule 12.07.2018
comment
Я не знаком с конкретной библиотекой, но должно быть довольно просто извлечь один (левый или правый) канал или объединить оба канала в один (моно) канал, а затем обработать его.   -  person Paul R    schedule 12.07.2018
comment
Возможно, попробуйте librosa.core.to_mono?   -  person Paul R    schedule 12.07.2018


Ответы (2)


Вам необходимо передать частоту дискретизации librosa.display.specshow (sr = self.SamplingFrequency). В противном случае по умолчанию используется значение 20050, а если self.SamplingFrequency - другое значение, будет отображаться неправильная длина.

person Jon Nordby    schedule 15.07.2018
comment
Я работаю над 90 секундами с частотой дискретизации 12000. Спектрограмма показывает неправильную продолжительность времени, но сама спектрограмма на самом деле правильная, верно? - person LotOfQuestion; 30.12.2019
comment
Вполне возможно. Но лучше передать правильные параметры в specshow, чтобы убедиться, что все обстоит так, как вы ожидаете. - person Jon Nordby; 30.12.2019
comment
Мой код выглядит так ‹br/› data, sr = librosa.load(file_name, sr=None, duration=90) ‹br/› D = librosa.amplitude_to_db(np.abs(librosa.stft(data)), ref=np.max) ‹br/› librosa.display.specshow(D, y_axis='linear', x_axis='time', sr=12000) ‹br/› Я неправильно передаю? - person LotOfQuestion; 31.12.2019
comment
Это выглядит примерно правильно. Но если у вас есть проблема, вы должны открыть новый вопрос. - person Jon Nordby; 31.12.2019
comment
Теперь спектрограмма показывает правильную продолжительность, но неправильную частоту дискретизации :(. Все равно спасибо :) - person LotOfQuestion; 01.01.2020

Ваш librosa.display.spechow должен включать параметры: частоту дискретизации sr=<your_sampling_rate>, а также размер прыжка hop_size=<your_hop_size>. Значения по умолчанию для этих параметров - 22050 и 512 соответственно. Неправильная их установка приводит к неправильной оси x в результирующей спектрограмме.

Ссылка: http://man.hubwiz.com/docset/LibROSA.docset/Contents/Resources/Documents/generated/librosa.display.specshow.html

person vskadandale    schedule 06.04.2021