Python FFT用于特征提取

can*_*did 6 fft machine-learning feature-extraction python-3.x

我正在寻找对人体加速度计数据进行特征提取以用于活动识别的方法。我的数据的采样率为100Hz。

我已经从各种来源研究了FFT是一种很适合使用的方法。我具有滑动窗口格式的数据,每个窗口的长度为256。我正在使用Python通过NumPy库执行此操作。我用来应用FFt的代码是:

import numpy as np

def fft_transform (window_data):

    fft_data = []
    fft_freq = []
    power_spec = []

    for window in window_data:

        fft_window = np.fft.fft(window)
        fft_data.append(fft_window)

        freq  = np.fft.fftfreq(np.array(window).shape[-1], d=0.01)
        fft_freq.append(freq )

        fft_ps = np.abs(fft_window)**2
        power_spec.append(fft_ps)

    return fft_data, fft_freq, power_spec
Run Code Online (Sandbox Code Playgroud)

这样给出的输出如下所示:

fft_data

array([  2.92394828e+01 +0.00000000e+00j,
        -6.00104665e-01 -7.57915977e+00j,
        -1.02677676e+01 -1.55806119e+00j,
        -7.17273995e-01 -6.64043705e+00j,
         3.45758079e+01 +3.60869421e+01j,
         etc..
Run Code Online (Sandbox Code Playgroud)

freq_data

array([  0.      ,   0.390625,   0.78125 ,   1.171875,   1.5625  , etc...
Run Code Online (Sandbox Code Playgroud)

功率谱

array([  8.54947354e+02,   5.78037884e+01,   1.07854606e+02,
         4.46098863e+01,   2.49775388e+03,   etc...
Run Code Online (Sandbox Code Playgroud)

我还使用此代码绘制了结果-其中fst_ps是power_spectrum的第一个数组/窗口,而fst_freq是fft_freq数据的第一个窗口/数组。

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(width, height))

fig1= fig.add_subplot(221)
fig2= fig.add_subplot(222)
fig1.plot(fst_freq, fst_ps)
fig2.plot(fst_freq, np.log10(fst_ps))
plt.show()
Run Code Online (Sandbox Code Playgroud)

快速傅立叶变换

我正在寻找有关下一步提取功能的建议。谢谢

Ego*_*man 2

因此,当您将信号分解为频谱时,下一步您可以尝试了解哪些频率与您的应用相关。但从单幅光谱图中获取它是相当困难的。请记住,频谱中的一个频率段 - 它是受窄频率范围限制的相同基本信号。有些频率对于您的任务可能并不重要。

更好的方法是,如果您可以尝试STFT方法来了解频时域中的信号特征。例如,您可以阅读这篇关于 Python 上的 STFT 方法的文章。通常该方法用于搜索某种时频模式,这些时频模式可以被识别为特征。例如,在人声模式(如文章中)中,您可能会看到具有持续时间和频率限制特征的可持续浮动频率。您需要获取信号的 STFT,以在超声图上找到一些模式,从而为您的任务提取特征。