这是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设置的说明
查看范围(Hz):要显示的频率范围。标准为底部为0 Hz,顶部为5000 Hz。如果此最大频率高于声音的奈奎斯特频率(是其采样频率的一半),则频谱图中的某些值将为零,而较高的频率将用白色绘制。如果您以44100 Hz的频率录制声音并将查看范围设置为0 Hz至25000 Hz,则可以看到此信息。
窗口长度:分析窗口的持续时间。如果这是0.005秒(标准),则Praat会为每个帧使用位于该帧中心之前0.0025秒和之后0.0025秒之间的声音部分(对于高斯窗口,Praat实际上使用的声音要多得多)。窗口长度确定频谱分析的带宽,即纯正弦波的频谱图中水平线的宽度(请参见下文)。对于高斯窗口,-3 dB带宽为2 * sqrt(6 * ln(2))/(π*窗口长度)或1.2982804 /窗口长度。要获得broad-band' spectrogram (bandwidth 260 Hz), keep the standard window
length of 5 ms; to get a
窄带频谱图(带宽43 Hz),请将其设置为30 ms(0.03秒)。其他窗口形状给出的值略有不同。
动态范围(dB):大于动态范围dB最大值以下的所有值(可能在动态压缩之后,请参阅高级频谱图设置...)将以白色绘制。中间的值具有适当的灰色阴影。因此,如果频谱图中的最高峰的高度为30 dB / Hz,动态范围为50 dB(这是标准值),则低于-20 dB / Hz的值将用白色绘制,并且-20 dB / Hz和30 dB / Hz将以各种灰色阴影绘制。
链接到Praat设置
OP的问题可能与Praat频谱图和mpl(matplotlib)频谱图之间的对比度差异有关。Praat的动态范围设置会影响对比度。mpl功能没有相似的设置/参数。mpl.specgram确实返回了功率电平的二维数组(频谱图),动态范围可以应用于返回数组并重新绘制。
以下是创建以下图表的代码段。例如,语音约为20分钟-8000赫兹,声音约为1分15秒。
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])