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

如何在python中提取短时傅立叶变换(stft)数据,python,fft,spectrogram,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(da

我将比较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)

如何提取黄线数据?x轴是时间/y轴是频率

这并不完美,但应该可以工作。它将为您提供fft的最大值。诀窍是使用np.where

下一步是模拟这样一个事实,即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))
确保排除具有最大值的零件。如果它们处于零位置,请记住,您需要添加跳过的内容以排除它们

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