如何在python中提取短时傅里叶变换(stft)数据

时间:2017-10-27 05:54:53

标签: python fft spectrogram

我要将stft频率数据与另一个stft频率数据进行比较。我只能使用stft方法,但我不知道如何提取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 个答案:

答案 0 :(得分:1)

这不完美,但应该有效。它会给你最大的fft。诀窍是使用np.where

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

接下来是模拟STFT在低频处包含大量常数值的事实。如果我错了,请相应地更改后面的代码

my_rand_fft[-1,:]=1

蛮力方法:

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

确保排除具有最大值的部分。如果它们处于零位,请记住,您需要添加被跳过的内容以排除它们。