答案 0 :(得分:0)
我认为@farenorth是对的。
当计算光谱图时,然后对于每个时间步长(x轴),对于给定的强度挑选某个灰度级。我们假设灰度是全局设置的。如果突然你在新的时间步长中有更高的强度,灰度会饱和。
如果您要实时工作,这将是一个真正的问题,因为您可能会从非常安静的音频开始突然变得响亮,但是您必须在开始时选择灰度与强度比基于对过去录音带的了解。
所以' mlab.specgram'是为了独立地缩放所有时间步长。因此,如果在时间步长期间发生突然变化,那么事情就不会与相邻步骤相媲美,这正是@farenorth所指出的。
下面的合成示例。顶部的情节只是一个啁啾的正弦波,底部的情节是相同的,突然爆炸了。
'''specgram(x, NFFT=256, Fs=2,detrend=mlab.detrend_none,
window=mlab.window_hanning, noverlap=128,
cmap=None, xextent=None, pad_to=None, sides='default',
scale_by_freq=None, mode='default')'''
import numpy as np
import matplotlib.pyplot as p
%matplotlib inline
time= np.arange(1,5,0.0004)
time=np.linspace(1,5,1024*16)
f= 50+ time*50
#add a bang
bang=np.ones(len(time))
bang[ len(time)/2:len(time)*3/4]=100
chirp1= np.sin(2*np.pi*f*time)
chirp2= np.sin(2*np.pi*f*time) *bang
p.figure(figsize=((20,8)))
p.subplot(221)
p.plot(chirp1)
p.subplot(222)
p.specgram(chirp1 ,noverlap=0,cmap=p.cm.gray)
p.subplot(223)
p.plot(chirp2)
p.subplot(224)
p.specgram(chirp2 ,noverlap=0,cmap=p.cm.gray)
p.show()
您无法通过 specgram 摆脱它,因为没有全局缩放选项。但你可以轻松地滚动自己的STFT或更好,一个Gabor谱图(如果我理解的话,STFT带有高斯窗口)。