51985


csvのデータを取り込んで、stftを行うプログラムを作りたいのですが、csvを取り込むところまではできたのですが、stftがうまくいきません。具体的にはstftした結果がすべて0.+0.jと返されてしまいます。そこで助言を頂きたく質問させていただきました。

ソースコードは以下のようになっています。

[code]

    from scipy import ceil, complex64, float64, hamming, zeros
    from scipy.fftpack import fft# , ifft
    from scipy import ifft 
    
    from matplotlib import pylab as pl
    import numpy as np
    import csv
    
    def stft(x, win, step):
        l = len(x) 
        N = len(win) 
        M = int(ceil(float(l - N + step) / step))    
        new_x = zeros(N + ((M - 1) * step), dtype = float64)
        x = new_x[: l] 
    
        X = zeros([M, N], dtype = complex64)
        for m in range(M):
            start = step * m
            X[m, :] = fft(new_x[start : start + N] * win)
        return X
    
    
    if __name__ == "__main__":
    
        data = []
        with open("data.csv","r") as f:
             reader = csv.reader(f)
             for row in reader:
              data.append(row[0])
        fftLen = 60 
        win = hamming(fftLen) 
        step = fftLen//4
        fdata = [float(s) for s in data]
    
    
    
        ### STFT
        spectrogram = stft(fdata, win, step)
    
        ### Plot
        fig = pl.figure()
        fig.add_subplot(311)
        pl.plot(fdata)
        pl.xlim([0, len(fdata)])
        pl.title("Input signal", fontsize = 20)
        fig.add_subplot(313)
        pl.imshow(abs(spectrogram[:, : fftLen // 2 + 1].T), aspect = "auto", origin = "lower")
        pl.title("Spectrogram", fontsize = 20)
        pl.show()
        print(spectrogram)　#デバッグ用
    
[/code]

またデータは600点のサンプリング周波数1Hzで10分間記録したものです。  
最初の部分だけ写真を載せておきます。  
[![画像の説明をここに入力](https://i.stack.imgur.com/Ok8iP.png)](https://i.stack.imgur.com/Ok8iP.png)  
またspectrogramのprint結果は  
[![画像の説明をここに入力](https://i.stack.imgur.com/on5MA.png)](https://i.stack.imgur.com/on5MA.png)  
このようになっています。助言頂けたら幸いです。よろしくお願いいたします。


CC BY-SA 4.0
2019-01-15T08:09:03.903
51984
2019-01-15T08:26:21.270
31757
question
python
pythonを用いたSTFT（スペクトログラム）について


データの初期化が下のように行われていますが、`sftt()` 関数の引数である `x` の値を使用せずにすべてゼロ埋めしています。

[code]

    new_x = zeros(N + ((M - 1) * step), dtype = float64)
    x = new_x[: l] 
    X = zeros([M, N], dtype = complex64)
    
[/code]

このもとで、FFT にかける部分では `new_x` しか使っていません。

[code]

    X[m, :] = fft(new_x[start : start + N] * win)
    
[/code]

このためデータとしては `0` しか現れていないのではないでしょうか。`new_x` および `x` の使い方を確認してみてください。


CC BY-SA 4.0
2019-01-15T08:26:21.270
51985
2019-01-15T08:26:21.270
19110
51984
answer