Python 用于特征提取的 FFT
Python FFT for feature extraction
我希望对人体加速度计数据执行特征提取以用于 activity 识别。我的数据采样率为100Hz。
从我研究过的各种来源来看,FFT 是一种很好的使用方法。我有滑动 windows 格式的数据,每个 window 的长度是 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
这给出如下所示的输出:
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..
freq_data
array([ 0. , 0.390625, 0.78125 , 1.171875, 1.5625 , etc...
power_spectrum
array([ 8.54947354e+02, 5.78037884e+01, 1.07854606e+02,
4.46098863e+01, 2.49775388e+03, etc...
我还使用此代码绘制了结果 - 其中 fst_ps 是 power_spectrum 的第一个 array/window,fst_freq 是第一个 window/array 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()
我正在寻找一些关于下一步提取特征的建议。谢谢
因此,当您将信号分解为频谱时,下一步您可以尝试了解哪些频率与您的应用相关。但是从单张光谱图片中得到它是相当困难的。请记住,频谱中的一个频率仓 - 它是受窄频率范围限制的相同基本信号。某些频率对您的任务可能并不重要。
更好的方法,如果你可以尝试 STFT method to understand your signal features in the frequency-time domain. For example, you may read this article 关于 Python 上的 STFT 方法。通常这种方法适用于搜索某种可以识别为特征的时频模式。例如,在人声模式中(如文章中所述),您可能会看到具有持续时间和频率限制特征的可持续浮动频率。您需要为您的信号获取 STFT,以便在超声图上找到一些模式,从而为您的任务提取特征。
我希望对人体加速度计数据执行特征提取以用于 activity 识别。我的数据采样率为100Hz。
从我研究过的各种来源来看,FFT 是一种很好的使用方法。我有滑动 windows 格式的数据,每个 window 的长度是 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
这给出如下所示的输出:
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..
freq_data
array([ 0. , 0.390625, 0.78125 , 1.171875, 1.5625 , etc...
power_spectrum
array([ 8.54947354e+02, 5.78037884e+01, 1.07854606e+02,
4.46098863e+01, 2.49775388e+03, etc...
我还使用此代码绘制了结果 - 其中 fst_ps 是 power_spectrum 的第一个 array/window,fst_freq 是第一个 window/array 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()
我正在寻找一些关于下一步提取特征的建议。谢谢
因此,当您将信号分解为频谱时,下一步您可以尝试了解哪些频率与您的应用相关。但是从单张光谱图片中得到它是相当困难的。请记住,频谱中的一个频率仓 - 它是受窄频率范围限制的相同基本信号。某些频率对您的任务可能并不重要。
更好的方法,如果你可以尝试 STFT method to understand your signal features in the frequency-time domain. For example, you may read this article 关于 Python 上的 STFT 方法。通常这种方法适用于搜索某种可以识别为特征的时频模式。例如,在人声模式中(如文章中所述),您可能会看到具有持续时间和频率限制特征的可持续浮动频率。您需要为您的信号获取 STFT,以便在超声图上找到一些模式,从而为您的任务提取特征。