我有x,y,z轴形式的原始加速度计数据,这些数据经过平滑处理,并应用了带通滤波器。现在我想将其转换为频域信号并使用scipy.fftpack.fft
应用 FFT。
sampling_frequency = 32
def fft(acc_data):
N = len(acc_data)
fft_data = sp.fftpack.fft(acc_data)
freqs = sp.fftpack.fftfreq(N)
plt.bar(freqs, np.abs(fft_data))
plt.xlabel('Frequency in Hertz [Hz]')
plt.ylabel('Magnitude')
plt.title('FFT')
plt.show()
此图未绘制任何点,并且为空。fft 的返回值是一个复杂的数组。我正在使用fftfreq
来获取最高振幅的频率。
有人可以指出它的错误或举例说明如何通过应用 FFT 获得具有最高振幅的频率值吗?
完整的代码可在此处获得
我建议你远离你的代码,首先掌握执行 fft 调用并理解该调用返回的结果的能力...... 要么读取已知频率的正弦曲线,要么只编写一个函数来用浮点正弦曲线填充数组(这是你的时域信号)......然后将该数组输入到FFT调用中,该调用通常会返回给您一个新的复数数组... 现在在频域中的这个新阵列的每个元素代表一个频率值......一个频率箱...该频率的幅度可以用以下公式计算
nyquist_limit_index := int(number_of_samples / 2)
curr_freq := 0.0
incr_freq := flow_data_spec.sample_rate / number_of_samples
for index, curr_complex := range complex_fft {
if index <= nyquist_limit_index {
curr_real = real(curr_complex) // pluck out real portion of imaginary number
curr_imag = imag(curr_complex) // ditto for im
curr_mag = 2.0 * math.Sqrt(curr_real*curr_real+curr_imag*curr_imag) / number_of_samples
curr_theta = math.Atan2(curr_imag, curr_real) // phase shift of this freq
curr_dftt := discrete_fft { // populate a struct of current array element
real: 2.0 * curr_real,
imaginary: 2.0 * curr_imag,
magnitude: curr_mag,
theta: curr_theta,
}
// optionally stow curr_dftt for later
}
curr_freq += incr_freq
}
其中number_of_samples只是您输入到 FFT 调用中的时域数组的长度
上面的代码向您展示了如何遍历从早期 fft 调用返回给您的复数频域数组......以上是伪代码而不是python,但您的过程可能非常相似
要识别具有最大振幅的频率(curr_freq),只需跟踪哪个curr_freq在上面的环路中具有最大的幅度...在我们的玩具设置中,您可能很清楚源输入正弦曲线的频率,因此相同的频率应该弹出为上面幅度最大的curr_freq......在你完成这项工作并且它的概念深入人心之后,然后将你学到的知识应用到你手头的任务中 - 祝你好运
傅里叶分析及其各种咒语非常强大,可以打开许多门。 这是一个需要思考的话题,但是如果我们允许自己简单地将一些api调用插入在一起以使某些工作,那么我们确实错过了一些非常神奇的东西
。