2017-10-27 6 views
0

私はstft頻度データを別のstft頻度データと比較します。私はちょうどstftメソッドを使用することができますが、私はstft頻度データを抽出する方法を知らない。私のデータはここにあります。Pythonで短時間フーリエ変換(stft)データを抽出するにはどうすればいいですか

from scipy import signal 
import matplotlib.pyplot as plt 
import numpy as np 

# Data load 
data = open('data.txt', 'r').read().split('\n') 
time = [] 
temperature = [] 
for i in range(0, len(data)): 
    time.append(float(data[i][0:8])) 
    temperature.append(float(data[i][9:len(data[i])])) 

fs = len(time)/(max(time)-min(time)) # Sampling frequency 

# FFT 
f, t, Zxx = signal.stft(temperature, fs) 

plt.pcolormesh(t, 2*np.pi*1.8*f/1e3, np.abs(Zxx), vmin=0, vmax=100) 

enter image description here

どのように私は黄色の線データを抽出することができますか? (x軸は時間/ y軸が周波数)

答えて

1

これは完璧ではありませんが、動作するはずです。それはあなたのfftの最大値を与えるでしょう。トリックは、次はあなたのSTFTは、低周波数で一定の値を多く含んでいるという事実をモデル化することであるnp.where

my_rand_fft = np.random.rand(20,80) 

を使用することです。最大値との一部が除外されていることを確認し

よりエレガントなソリューション
pos_of_max=np.where(my_rand_fft==np.max(my_rand_fft[0:-1,:], axis=0)) 

pos_of_max=[] 
for n in range(np.shape(my_rand_fft)[1]): 
    pos_of_max.append((0,np.where(my_rand_fft[0:-1,n]==np.max(my_rand_fft[0:-1,n])[0]))) 

:私が間違っている場合は、

my_rand_fft[-1,:]=1 

に応じて強引なアプローチを後でコードを変更。それらがゼロの位置にある場合、それらを除外するためにスキップされたものを追加する必要があることに留意してください。

関連する問題