使用matplotlib在specgram中的奇怪行

时间:2016-06-19 12:49:11

标签: python matplotlib

我正在使用matplotlib.specgram来创建口语单词录音的谱图。由于我不知道的原因,光谱图中有奇怪的线条,如下图所示。

我想知道造成这些线条的原因是什么,我怎么能摆脱它们呢?

Example spectrogram Example spectrogram

1 个答案:

答案 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()

enter image description here

您无法通过 specgram 摆脱它,因为没有全局缩放选项。但你可以轻松地滚动自己的STFT或更好,一个Gabor谱图(如果我理解的话,STFT带有高斯窗口)。