从FFT中求出振幅最大的频率

2024-06-01 01:49:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有原始的加速度计数据的形式的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得到最高振幅的频率值?在

完整的代码是可用的here


Tags: 数据fftdata信号pltsp形式频率
1条回答
网友
1楼 · 发布于 2024-06-01 01:49:47

我建议你远离你的代码,首先掌握执行fft调用的能力,然后理解调用返回的结果。。。要么读入已知频率的sin曲线,要么编写一个函数,用浮点sin曲线填充数组(这是您的时域信号)。。。然后把这个数组输入一个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,但您的过程可能非常相似

要识别最大振幅的频率(电流频率),只需跟踪在上述回路中哪个电流频率的幅值最大。。。在我们的玩具设置中,你可能很清楚你的源输入sin曲线的频率,因此相同的频率应该弹出作为电流频率最大的幅度在上面。。。当你完成了这项工作,并且它的概念被接受了,然后把你所学的应用到你手头的任务上-祝你好运

傅里叶分析和它的各种咒语是非常强大的,可以打开许多门。这是一个需要思考的话题,但是如果我们允许自己简单地将一些api调用连接在一起以使某些功能正常工作,我们确实错过了一些非常神奇的东西

相关问题 更多 >