Ось параметри matplotlib.specgram
matplotlib.mlab.specgram(x,
NFFT=256,
Fs=2,
detrend=<function detrend_none at 0x1dd6410>,
window=<function window_hanning at 0x1e0b1b8>,
noverlap=128,
pad_to=None,
sides='default',
scale_by_freq=None)
Параметри, наведені в описі запитання, потрібно перетворити на порівнянні параметри mpl.specgram. Далі наведено приклад відображення:
View range: 0-8000Hz Fs=16000
Window length: 0.005s NFFT = int(Fs*0.005) = 80
noverlap = int(Fs*0.0025) = 40
Dynamic range: 70dB n/a
Time steps: 1000 n/a
Frequency steps: 250
Window shape: Gaussian default window is hanning change to gaussian
Якщо ви використовуєте 8 мс, ви отримаєте потужність 2 FFT (128). Далі йде опис налаштувань Praat з їх веб-сайту
Діапазон перегляду (Гц) : діапазон частот для відображення. Стандартний - 0 Гц внизу і 5000 Гц вгорі. Якщо ця максимальна частота перевищує частоту Найквіста звуку (що становить половину його частоти дискретизації), деякі значення в спектрограмі будуть нульовими, а більш високі частоти будуть намальовані білим кольором. Це можна побачити, якщо ви записуєте звук у 44100 Гц і встановлюєте діапазон перегляду від 0 Гц до 25000 Гц.
Довжина вікна : тривалість вікна аналізу. Якщо це 0,005 секунди (стандарт), Praat використовує для кожного кадру ту частину звуку, яка лежить між 0,0025 секундами до і 0,0025 секунд після центру цього кадру (для Gaussian windows Praat фактично використовує трохи більше, ніж це). Довжина вікна визначає пропускну здатність спектрального аналізу, тобто ширину горизонтальної лінії в спектрограмі чистої синусоїди (див. Нижче). Для вікна Гаусса пропускна здатність -3 дБ становить 2 * sqrt (6 * ln (2)) / (π * довжина вікна), або 1,22982804 / довжина вікна. Щоб отримати broad-band' spectrogram (bandwidth 260 Hz), keep the standard window
length of 5 ms; to get a
вузькосмугову спектрограму (смуга пропускання 43 Гц), встановіть її на 30 мс (0,03 секунди). Інші форми вікон дають дещо інші значення.
Динамічний діапазон (дБ) : Усі значення, що перевищують динамічний діапазон дБ нижче максимального (можливо після динамічного стиснення, див. Розширені настройки спектрограми ...), будуть намальовані білим кольором. Значення між ними мають відповідні відтінки сірого. Таким чином, якщо найвищий пік спектрограми має висоту 30 дБ / Гц, а динамічний діапазон - 50 дБ (що є стандартним значенням), то значення нижче -20 дБ / Гц будуть виведені білим кольором, а значення між -20 дБ / Гц і 30 дБ / Гц будуть намальовані різними відтінками сірого.
Посилання на налаштування Praat
Питання ОП може стосуватися різниці контрасту між спектром Праат та спектром mpl (matplotlib). Praat має налаштування динамічного діапазону , яке впливає на контраст. Функція mpl не має аналогічних параметрів / параметрів. Mpl.specgram повертає 2D масив рівнів потужності (спектрограма), який динамічний діапазон може бути застосований до масиву повернення та повторно побудований.
Далі наведено фрагмент коду для створення графіків нижче. Приклад - мовлення ~ 1m15s з щебетанням від 20Гц до 8000Гц.
import numpy
import pylab
import wave
import array
pylab.close('all')
w1 = wave.open('example_no_noise.wav')
w2 = wave.open('example_noise.wav')
# hmmm, probably a better way to do this, scipy.io function?
x1 = numpy.array(array.array('h', w1.readframes(w1.getnframes())))
x2 = numpy.array(array.array('h', w2.readframes(w2.getnframes())))
x1 = x1 / (2.**(16-1)) # normalize
x2 = x2 / (2.**(16-1)) # normalize
Fs = 16000.
NFFT = int(Fs*0.005) # 5ms window
noverlap = int(Fs*0.0025)
pylab.figure(1)
pylab.specgram(x1, NFFT=NFFT, Fs=Fs, noverlap=noverlap,
cmap=pylab.get_cmap('Greys'))
pylab.title('Full 1m15s example min noise')
pylab.figure(2)
pylab.specgram(x2, NFFT=NFFT, Fs=Fs, noverlap=noverlap,
cmap=pylab.get_cmap('Greys'))
pylab.title('Full 1m15s example more noise')
pylab.figure(3); n=2100*176;
pylab.specgram(x2[n:n+256*256], NFFT=NFFT, Fs=Fs, noverlap=noverlap,
cmap=pylab.get_cmap('Greys'))
pylab.title('Full ~4s example min noise')
pylab.figure(4); pylab.plot(x1[n:n+256*256])