2017-10-27 2 views
0

나는 stft 주파수 데이터를 다른 stft 주파수 데이터와 비교하려고합니다. 나는 stft method를 사용할 수는 있지만 stft frequency data를 추출하는 방법을 모른다. 여기에 내 데이터가있다.파이썬에서 단시간 푸리에 변환 (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의 최대를 줄 것입니다. 트릭은 np.where

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

다음이 STFT는 낮은 주파수에서 상수 값이 많이 포함되어 있다는 사실을 모델링하는 사용하는 것입니다.

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]))) 

이 더 우아한 해결책이

pos_of_max=np.where(my_rand_fft==np.max(my_rand_fft[0:-1,:], axis=0)) 

이 최대로 부분이 있는지 제외되어 있는지 확인하는 것이 : 내가 잘못 한 경우 그에 따라

my_rand_fft[-1,:]=1 

무력 접근 방식이 나중에 코드를 변경 . 사용자가 0 인 경우 건너 뛴 항목을 추가하여 제외해야합니다.