Oto parametry 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)
Parametry podane w opisie pytania należy przekonwertować na porównywalne parametry mpl.specgram. Oto przykład odwzorowania:
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
Jeśli użyjesz 8ms, otrzymasz moc 2 FFT (128). Poniżej znajduje się opis ustawień Praat z ich strony internetowej
Zakres widoku (Hz) : zakres częstotliwości do wyświetlenia. Standardem jest 0 Hz u dołu i 5000 Hz u góry. Jeśli ta maksymalna częstotliwość jest wyższa niż częstotliwość Nyquista dźwięku (która jest połową częstotliwości próbkowania), niektóre wartości w spektrogramie będą wynosić zero, a wyższe częstotliwości zostaną narysowane na biało. Możesz to zobaczyć, jeśli nagrywasz dźwięk z częstotliwością 44100 Hz i ustawisz zakres widoku od 0 Hz do 25000 Hz.
Długość okna : czas trwania okna analizy. Jeśli jest to 0,005 sekundy (standard), Praat używa dla każdej klatki tej części dźwięku, która znajduje się między 0,0025 sekundy przed i 0,0025 sekundy po środku tej ramki (w przypadku okien gaussowskich Praat faktycznie używa nieco więcej). Długość okna określa szerokość pasma analizy spektralnej, tj. Szerokość linii poziomej w spektrogramie czystej fali sinusoidalnej (patrz poniżej). W przypadku okna gaussowskiego szerokość pasma -3 dB wynosi 2 * sqrt (6 * ln (2)) / (π * długość okna) lub 1,2982804 / długość okna. Aby uzyskać broad-band' spectrogram (bandwidth 260 Hz), keep the standard window
length of 5 ms; to get a
wąskopasmowy spektrogram (szerokość pasma 43 Hz), ustaw go na 30 ms (0,03 sekundy). Pozostałe kształty okien dają nieco inne wartości.
Zakres dynamiczny (dB) : Wszystkie wartości, które przekraczają zakres dynamiczny dB poniżej maksimum (być może po kompresji dynamicznej, patrz Zaawansowane ustawienia spektrogramu ...) zostaną narysowane na biało. Wartości pośrednie mają odpowiednie odcienie szarości. Zatem jeśli najwyższy szczyt w spektrogramie ma wysokość 30 dB / Hz, a zakres dynamiczny wynosi 50 dB (co jest wartością standardową), wówczas wartości poniżej -20 dB / Hz zostaną narysowane na biało, a wartości pomiędzy -20 dB / Hz i 30 dB / Hz będą rysowane w różnych odcieniach szarości.
Link do ustawień Praat
Pytanie OP może dotyczyć różnicy kontrastu między specgramem Praat a specgramem mpl (matplotlib). Praat ma ustawienie zakresu dynamicznego , które wpływa na kontrast. Funkcja mpl nie ma podobnego ustawienia / parametru. Mpl.specgram zwraca tablicę 2D poziomów mocy (spektrogram), zakres dynamiczny można zastosować do tablicy powrotnej i ponownie wykreślić.
Poniżej znajduje się fragment kodu umożliwiający utworzenie poniższych wykresów. Przykładem jest ~ 1m15s mowy z ćwierkaniem od 20 Hz do 8000 Hz.
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])