22231


scipyとmatplotlibを使って音声ファイルのスペクトログラムを表示したいです。しかし下記の関数では0除算エラーが出てしまいました。

[code]

    def show_spec(fn):
        sample_rate, X = wavfile.read(fn)
        print sample_rate, X[:,0].shape
        specgram(X[:,0], Fs=sample_rate)
    
[/code]

実行結果

[code]

    44100 (442991,)
    python2.7/site-packages/matplotlib/axes/_axes.py:7042: RuntimeWarning: divide by zero encountered in log10
      Z = 10. * np.log10(spec)
    
[/code]

なぜでしょうか。


CC BY-SA 3.0
2016-02-17T12:05:55.580
22213
2016-02-18T09:24:29.297
7232
question
python
wavファイルのスペクトログラム表示で0除算例外


[`matplotlib.pyplot.specgram`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.specgram)
はデフォルトでは信号の強さを対数スケールに変換して描画します。もしある周波数の強さが `0` だとすると `log10(0)` となり、計算結果が `-∞`
、加えて[0除算例外](https://linuxjm.osdn.jp/html/LDP_man-
pages/man7/math_error.7.html#lbAF)が発生することになります。

プログラムが間違っているわけではありません。

無音部分が原因ならそれを取り除くか完全な無音ではなくするという方法もあると思いますが、 `with
np.errstate(divide='ignore')` の中で `specgram` を呼び出せば抑制できるかもしれません。  
試してないですし、その対応が適切かどうか私にはわかりませんが・・・。

参考： [RuntimeWarning: Divide by Zero error: How to avoid? PYTHON, NUMPY - Stack
Overflow](https://stackoverflow.com/a/25088239/2818869)


CC BY-SA 3.0
2016-02-18T09:24:29.297
22231
2016-02-18T09:24:29.297
2017-05-23T12:38:55.250
-1
8000
22213
answer