【问题标题】:Dominant frequency extraction when doing FFT returns wrong frequency执行 FFT 时提取主频返回错误的频率
【发布时间】:2020-10-05 16:41:32
【问题描述】:

我将加速度计传感器数据(时间、x 轴、y 轴和 z 轴)保存在 csv 文件中。我正在尝试从每个轴获取 FFT。我的图表如下:

现在,我想从每个 FFT 图中提取主频率并获得其对应的幅度。经过一番研究,我想出了代码:

def Freq(self):
    
    freqs = arange(1, self.N, 1)[:int(self.N/2) - 1]
    Amptsx = (2/self.N)* abs( fft(self.fx)[:int(self.N/2)] )[1:]
    Amptsy = (2/self.N)* abs( fft(self.fy)[:int(self.N/2)] )[1:]
    Amptsz = (2/self.N)* abs( fft(self.fz)[:int(self.N/2)] )[1:]
    
    
    print 'The highest frequency in the x axis is:', round(np.argmax(Amptsx),6)
    print 'The highest frequency in the y axis is:', round(np.argmax(Amptsy),6)
    print 'The highest frequency in the z axis is:', round(np.argmax(Amptsz),6)
    
    print 'The highest amplitude in the x axis is:', round(np.max(Amptsx),6) 
    print 'The highest amplitude in the y axis is:', round(np.max(Amptsy),6)
    print 'The highest amplitude in the z axis is:', round(np.max(Amptsz),6) 
    
    return freqs, Amptsx, Amptsy, Amptsz

我的幅度结果是准确的,但频率不是。我的结果如下:

The highest frequency in the x axis is: 0.0.
The highest frequency in the y axis is: 1.0.
The highest frequency in the z axis is: 15.0.
The highest amplitude in the x axis is: 0.768894.
The highest amplitude in the y axis is: 0.59046.
The highest amplitude in the z axis is: 0.3679.

我的猜测是我的频率被四舍五入了。我试图修复它但没有成功。有什么建议吗?

【问题讨论】:

  • 这可能是一个错误。 [1:] 在我看来很可疑。
  • @mkrieger1 你建议做什么?

标签: python fft frequency


【解决方案1】:

有两个问题:

freqs = arange(1, self.N, 1)[:int(self.N/2) - 1]
Amptsx = (2/self.N)* abs( fft(self.fx)[:int(self.N/2)] )[1:]
print 'The highest frequency in the x axis is:', round(np.argmax(Amptsx),6)
  1. 频率和幅度数组未正确对齐,这意味着与给定频率对应的幅度在Amptsx 数组中的索引与频率在freqs 数组中的索引不同。

    原因是使用[:int(self.N/2) - 1] 会从freqsend 中删除一项额外的项目,而使用[1:] 会从开始 中删除一项额外的项目em> Amptsx

    您应该在 both 数组中从末尾或从开头删除一项,这取决于您的应用程序中哪一项具有正确的含义。

    我怀疑您这样做是为了从数组的开头删除零频率的值(即传感器值中的恒定偏移),因此在这种情况下,您应该将 [:int(self.N/2) - 1] 更改为 [1:int(self.N/2)] freqs.

  2. argmax 为您提供Amptsx 中最高值的index,这不是频率。您应该使用该索引从freqs 获取频率值。

【讨论】:

  • 写完答案后,我认为第一点甚至可能是正确的(我不确切知道),第二点是真正的问题。
  • 非常感谢您的投入和时间!我确实完成了您在第 1 点中描述的移动。对于第二点,如果我使用 round(np.argmax(freqs),6) ,我将如何确定每个轴的频率?就像我怎么能在x轴上得到它,最高频率是2.02246Hz,y轴是3.01934Hz,z轴是17.0172Hz?
  • 您使用argmax(Amptsx) 等的结果作为freqs 的索引。 argmax(freqs) 给出了freqs 中最大值的索引,这不是很有用。
  • 您使用argmax(Amptsx) 等的结果作为freqs 的索引。 您介意再详细说明一下吗?
  • 索引是你放入[]的东西:freqs[argmax(Amptsx)]
猜你喜欢
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 2016-01-14
  • 1970-01-01
相关资源
最近更新 更多