【问题标题】:FFT Scipy Calculating FrequencyFFT Scipy 计算频率
【发布时间】:2021-03-09 11:42:03
【问题描述】:

我正在尝试使用 scipy FFT 计算信号频率。通过“手动”计算频率,它显然在 2.5 Hz 左右。

这是我的输入信号: Signal Amplitude over Time

这是我正在使用的代码:

import matplotlib.pyplot as plt
import numpy as np
from scipy import fft

##---Get Data
AccZ = np.loadtxt('...', delimiter=';', usecols=(0,3))
Time = np.array(AccZ[:,0])
AccZ = np.array(AccZ[:,1])
Time_Step = Time[1]-Time[0]

##---FFT
AccZ_fft = fft.fft(AccZ) 
Amp = np.abs(AccZ_fft) 

Sample_Freq = fft.fftfreq(AccZ.size, d=Time_Step) 

Amp_Freq = np.array([Amp, Sample_Freq]) 
Amp_Pos = Amp_Freq[0,:].argmax() 
Peak_Freq = Amp_Freq[1, Amp_Pos] 

这是我从 FFT 得到的: Amplitude over Frequency

不幸的是,我的最高值始终位于数组位置 [0],这意味着我的 Sample_Freq 数组中的峰值频率始终为 0。

我在这里做错了什么?会感谢任何帮助。

【问题讨论】:

标签: python scipy fft


【解决方案1】:

第零个 bin 始终是 DC 分量,即输入函数的垂直偏移。如果你对这个值不感兴趣,你可以这样做:

AccZ_fft[0] = 0

这相当于对输入这样做:

AccZ -= np.mean(AccZ)

并且应该简化峰值查找。

顺便说一句,对于实值输入信号(就像你的那样),建议使用np.fft.rfft 而不是np.fft.fft。这样一来,您就不会得到这种具有冗余正负频率的对称输出。

【讨论】:

  • RFFT 确实让我更容易了解正在发生的事情!删除 DC 组件对我也很有效。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 2020-05-22
  • 1970-01-01
  • 2017-06-06
  • 2013-12-06
  • 2014-03-18
  • 2017-08-11
相关资源
最近更新 更多