2016-06-19 14 views
0

私はmatplotlib.specgramを使用して、話し言葉の記録のスペクトログラムを作成しています。私にとって未知の理由のために、スペクトログラムは、以下の画像から見られるように、それらに奇妙な線を持っています。matplotlibを使ったspecgramの奇妙な線

私はこれらの行を引き起こしているのだろうと思いますが、どうすればそれらを取り除くことができますか?

Example spectrogram Example spectrogram

+0

これを生成するために使用されるコード+データがなければ、確かに言うのは難しいですが、実際には「線」があなたのデータセットの根本的な離散的かつ劇的な変化であるように見えます。 – farenorth

答えて

0

私は@farenorthが右だと思います。

スペクトログラムが計算されると、各タイムステップ(x軸)に対して、特定のグレースケールが所定の強度に対して選択されます。グレースケールがグローバルに設定されていると仮定しましょう。突然新しいタイムステップで強度が上がった場合、グレースケールが飽和します。

突然大音量になる非常に静かなオーディオで始めることができるので、これはリアルタイムで作業する場合には本当に問題になりますが、最初にグレースケールと強度比を選択する必要があります過去の聴覚障害に関する知識

したがって、 'mlab.specgram'のアプローチは、すべてのタイムステップを独立してスケールすることです。したがって、タイムステップの間に突然の変化があった場合、物事は隣のステップに匹敵するように見えません。これは指摘したことです。

下記の合成例。上のプロットはちょうどチャープされた正弦波であり、下のプロットは突然の強打が加えられたものと同じです。

'''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)

関連する問題