使用matplotlib的specgram中的奇怪行

2024-05-16 08:55:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我用matplotlib.specgram来制作口语录音的谱图。因为我不知道的原因,从下面的图像中可以看到光谱图中有奇怪的线条。在

我想知道是什么造成了这些线,我怎样才能消除它们?在

Example spectrogramExample spectrogram


Tags: 图像matplotlib原因光谱线条录音口语specgram
1条回答
网友
1楼 · 发布于 2024-05-16 08:55:44

我认为“远北”是对的。在

当计算光谱图时,对于每个时间步(x轴),为给定的强度选择一定的灰度。假设灰度是全局设置的。如果突然在一个新的时间步中有更高的强度,灰度将饱和。在

这将是一个真正的问题,如果你是在实时工作,因为你可能开始非常安静的音频突然变大,但你必须选择一个灰度与强度的比率,在开始时根据过去的音频轨迹的知识。在

所以克规范'是独立缩放所有时间步长。因此,如果在一个时间步中发生突然的变化,事情看起来就无法与相邻的步骤相提并论,这是@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)。在

相关问题 更多 >