27582


python
matplotlibでスペクトログラムのy軸（周波数）を対数表示したいのですが、yscale("log")を追加したところ、なにも表示されなくなりました。  
コードは以下のようになります

[code]

    import wave
    import struct
    from pylab import *
    
    if __name__ == "__main__":
    
        # WAVEファイルから波形データを取得
        name=sin.wave
        wf = wave.open("ファイル名", "rb")
        data = wf.readframes(wf.getnframes())
        data = frombuffer(data, dtype="int16")
        length = float(wf.getnframes()) / wf.getframerate()  # 波形長さ（秒）
    
        # FFTのサンプル数
        N = 512
        # FFTで用いるハミング窓
        hammingWindow = np.hamming(N)
    
        # スペクトログラムを描画
        yscale('log')
        grid(which="both")
        pxx, freqs, bins, im = signal.specgram(data, NFFT=N, Fs=wf.getframerate(), noverlap=120, window=hammingWindow)
    
        axis([0, 1, 0, 10000])
        yscale("log")
        xlabel("time [second]")
        ylabel("frequency [Hz]")
        show()
    
[/code]


CC BY-SA 3.0
2016-07-11T05:15:38.183
27521
2016-07-12T18:22:54.287
2016-07-11T06:44:00.533
3054
17131
question
python matplotlib
matplotlibのスペクトログラムにyscaleを追加すると何も表示されない


`specgram()` の場合、プロット(というよりは描画)しているのは frequency ではなく、`PSD(Power Spectral
Density)`ですので、それを log scale にする必要があります。

具体的には `matplotlib.pyplot.pcolor` か `matplotlib.pyplot.pcolormesh`
を使うことになるかと思いますが、`pcolormesh` の方が処理が速いのでそちらを使うことにします。以下、具体的なコードです。

[code]

    pxx, freqs, bins, _ = specgram(data, NFFT=N, Fs=wf.getframerate(),
                                   noverlap=120, window=hammingWindow)
    
    pcolormesh(bins, freqs, 10*log10(pxx))
    
    axis([0, 1, 0.01, 10000])
    yscale('symlog', linthreshy=0.01)
    grid(which='both')
    xlabel('time [second]')
    ylabel('frequency [Hz]')
    
    show()
    
[/code]

PSD を `10*log10(pxx)` としていますが、`10*` はあってもなくても構いません(`dB scale`
合わせただけですので)。また、`axis([0, 1, 0.01, 10000])`, `linthreshy=0.01` として frequency
の最小値を `0.01` にしていますが、これはデータに合わせて適宜変更して下さい。

参考までにサンプルファイルでの処理結果を載せておきます。

**Log scale**

[![画像の説明をここに入力](https://i.stack.imgur.com/Jzn7G.png)](https://i.stack.imgur.com/Jzn7G.png)

**Linear scale**  
[![画像の説明をここに入力](https://i.stack.imgur.com/3uwzG.png)](https://i.stack.imgur.com/3uwzG.png)


CC BY-SA 3.0
2016-07-12T18:22:54.287
27582
2016-07-12T18:22:54.287
27521
answer