pythonを用いたSTFT(スペクトログラム)について
csvのデータを取り込んで、stftを行うプログラムを作りたいのですが、csvを取り込むところまではできたのですが、stftがうまくいきません。具体的にはstftした結果がすべて0.+0.jと返されてしまいます。そこで助言を頂きたく質問させていただきました。
ソースコードは以下のようになっています。
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) #デバッグ用
またデータは600点のサンプリング周波数1Hzで10分間記録したものです。
最初の部分だけ写真を載せておきます。
またspectrogramのprint結果は
このようになっています。助言頂けたら幸いです。よろしくお願いいたします。