signal.spectrogram возвращает слишком много Гц

Я только начинал с кода для предварительной обработки некоторых аудиоданных, чтобы в последнее время кормить ими нейронную сеть. Прежде чем более подробно объяснять мою настоящую проблему, упомяните, что я взял ссылку о том, как делать проект, из этот сайт. Также использовался некоторый код, взятый из этого сообщения и читайте дополнительную информацию в signal.spectogram doc и этот пост.

На данный момент со всеми упомянутыми ранее источниками мне удалось получить аудиофайл wav в виде массива numpy и постройте его амплитуду и спектрограмму. Это запись моего произнесения слова «команда» на испанском языке.

Странный факт здесь заключается в том, что я поискал в Интернете и обнаружил, что спектр человеческого голоса колеблется от 80 до 8 кГц, поэтому, чтобы убедиться, я сравнил этот вывод с тем, что Возвращена спектрограмма Audacity. Как вы можете видеть, это кажется более согласованным с найденной информацией, поскольку диапазон частот - это тот, который должен быть для людей.

Итак, это подводит меня к последнему вопросу: я делаю что-то не так в процессе чтения аудио или генерации спектрограммы, или, может быть, у меня проблемы с сюжетом?

Кстати, я новичок как в Python, так и в обработке сигналов, поэтому заранее спасибо за ваше терпение.

Вот код, который я использую на самом деле:

def espectrograma(wav):
    sample_rate, samples = wavfile.read(wav)
    frequencies, times, spectrogram = signal.spectrogram(samples, sample_rate, nperseg=320, noverlap=16, scaling='density')
    #dBS = 10 * np.log10(spectrogram)  # convert to dB

    plt.subplot(2,1,1)
    plt.plot(samples[0:3100])

    plt.subplot(2,1,2)
    plt.pcolormesh(times, frequencies, spectrogram)
    plt.imshow(spectrogram,aspect='auto',origin='lower',cmap='rainbow')
    plt.ylim(0,30)
    plt.ylabel('Frecuencia [kHz]')
    plt.xlabel('Fragmento[20ms]')
    plt.colorbar()
    plt.show()

person Julen    schedule 07.08.2018    source источник


Ответы (2)


Расчет спектрограммы мне кажется удовлетворительным. Если вы построите спектрограмму в логарифмической шкале, вы должны увидеть нечто более похожее на графики прослушивания, на которые вы ссылались. Так раскомментируйте свою строку

#dBS = 10 * np.log10(spectrogram) # convert to dB

а затем используйте переменную dBS для построения вместо спектрограммы в

plt.pcolormesh(times, frequencies, spectrogram) plt.imshow(spectrogram,aspect='auto',origin='lower',cmap='rainbow')

person Maja    schedule 07.08.2018
comment
Вот что странно. Кажется, это ничего не меняет, преобразовывая его в дБ. Фактически, что касается вывода цветовой шкалы, мощность на некоторых частотах, кажется, достигает 40k дБ, что является АБСОЛЮТНЫМ значением. Что-то вроде этих чисел / 1000 должно быть более разумным, но опять же, я не понимаю, откуда эти числа берутся. Спасибо, кстати. - person Julen; 07.08.2018
comment
Хм .. странно, потому что я пробовал ваш код в звуковом файле, который у меня есть, и он работал хорошо, когда я использовал шкалу журнала ... Что касается вашего второго замечания о больших значениях: попробуйте загрузить свой wav-файл с помощью библиотеки звуковых файлов, вместо scipy.io.wavread - это решило проблему для меня. import soundfile as sf samples, sample_rate = sf.read(pathToFile') - person Maja; 07.08.2018
comment
Ах, а также удалите строку plt.imshow(spectrogram,aspect='auto',origin='lower',cmap='rainbow'), plt.colormesh уже выполняет свою работу. Тогда вы действительно должны увидеть, как ось частот поднимается до 8000 Гц, если ваша частота дискретизации составляет 16k, и ваш график должен быть хорошим. Других проблем с вашим кодом я не вижу. - person Maja; 07.08.2018
comment
Пробуя то, что вы предложили, используя sf.readfile, кажется, что что-то изменилось, так как теперь дБ выглядят иначе. Тем не менее, у них есть странные ценности, поскольку все они отрицательны. Частоты не изменились ... что странно, потому что я просмотрел значения в локальных варах, а массив частот max val равен 8000 i.imgur.com/zkruQYh.png - person Julen; 08.08.2018
comment
С другой стороны, я обнаружил, что, используя colormesh вместо imshow, я получаю спектрограмму с мс по оси x вместо окон, что немного менее полезно для моих будущих целей. i.imgur.com/jbVUvpP.png - person Julen; 08.08.2018
comment
Думаю, я понял, почему рисует эти значения оси (161x157). Кажется, это форма как спектрограммы, так и переменных dBS, поэтому это проблема печати, а не проблема реализации. Теперь осталось только найти правильные значения печати, чтобы получить желаемый график. - person Julen; 08.08.2018
comment
Между прочим, я обнаружил, что вы действительно были правы. Печать с использованием цветовой сетки возвращает правильный диапазон частот по оси x времени. Проблема заключалась в том, что plt.ylim был установлен, когда я использовал только imshow. Кстати, не знаю, почему использование imshow меняет масштаб, а это жалко, потому что я бы предпочел разделить его с учетом окон, а не времени. - person Julen; 08.08.2018

Спектрограмма использует преобразование Фурье для преобразования данных временного ряда в частотную область.

Максимальная частота, которую можно измерить, составляет (частота дискретизации) / 2, поэтому в этом случае может показаться, что ваша частота дискретизации составляет 60 кГц?

Во всяком случае, по поводу вашего вопроса. Может быть, правильно, что спектр человеческого голоса находится в этом диапазоне, но преобразование Фурье никогда не бывает идеальным. Я бы просто настроил вашу ось Y, чтобы специально смотреть на эти частоты.

Мне кажется, что вы правильно рассчитываете свою спектрограмму, по крайней мере, пока вы правильно читаете sample_rate и samples ..

person VegardKT    schedule 07.08.2018
comment
Прежде всего, спасибо за быстрый ответ! (не ожидал, что будет так быстро). Если вы внимательно посмотрите на левую часть снимка экрана спектрограммы Audacity, вы увидите, что он говорит о том, что частота дискретизации составляет 16k. Во всяком случае, на всякий случай я подтвердил это с помощью точки останова в коде и sample_rate, это действительно 16k, поэтому я не думаю, что это реальная проблема. - person Julen; 07.08.2018
comment
Понятно. Если это так, вы не сможете получить какую-либо информацию о частотах выше 8 кГц из-за частоты Найквиста. - person VegardKT; 07.08.2018