我将加速度计传感器数据(时间、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.
我的猜测是我的频率被四舍五入。我尝试修复它但没有成功。有什么建议吗?
有两个问题:
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)
频率和幅度数组未正确对齐,这意味着对应于给定频率的幅度在
Amptsx
数组中的索引与频率在 freqs
数组中的索引不同。
原因是,通过使用
[:int(self.N/2) - 1]
,您可以从 freqs
的 end中删除一项额外的项目,而使用
[1:]
则可以从 Amptsx
的 start中删除一项额外项目。
您应该从 both 数组的末尾或开头删除一项,具体取决于哪一项在您的应用程序中具有正确的含义。
我怀疑您这样做是为了从数组的开头删除零频率的值(即传感器值中的恒定偏移),因此在这种情况下,您应该将
[:int(self.N/2) - 1]
更改为 [1:int(self.N/2)]
以获得 freqs
.
argmax
为您提供 Amptsx
中最高值的 index,这不是频率。您应该使用该索引从
freqs
获取频率值。
您可以分享您用来提取图形的代码吗?