【问题标题】:How to find frequency of a square wave using FFT如何使用 FFT 找到方波的频率
【发布时间】:2016-11-26 08:21:22
【问题描述】:

在 FFT(第二个)图中,与其他频率相比,我预计频率 = 1.0 处的峰值更大,因为它是以 5Hz 采样的 1Hz 方波信号。

我是这方面的初学者,可能在这里遗漏了一些愚蠢的东西 这是我所做的:

import numpy as np
from matplotlib import pyplot as plt
from scipy import signal
t500 = np.linspace(0,5,500,endpoint=False)
s1t500 = signal.square(2*np.pi*1.0*t500)

第一个图显示以 5Hz 采样 5 秒的 1Hz 方波:

t5 = np.linspace(0,5,25,endpoint=False)
t5 = t5 + 1e-14
s1t5 = signal.square(2.0*np.pi*1.0*t5)
plt.ylim(-2,2); plt.plot(t500,s1t500,'k',t5,s1t5,'b',t5,s1t5,'bo'); plt.show()

在第二个图中,我预计 f=1 Hz 处的幅度大于 f=2 处的幅度。我错过了什么吗?

y1t5 = np.fft.fft(s1t5)
ff1t5 = np.fft.fftfreq(25,d=0.2)
plt.plot(ff1t5,y1t5); plt.show()

【问题讨论】:

标签: python numpy scipy fft


【解决方案1】:

您似乎忽略了傅里叶变换在复数空间中产生函数(或数字序列,在 DFT/FFT 的情况下):

>>> np.fft.fft(s1t5)
[ 5. +0.j          0. +0.j          0. +0.j          0. +0.j          0. +0.j
  5.-15.38841769j  0. +0.j          0. +0.j          0. +0.j          0. +0.j
  5. +3.63271264j  0. +0.j          0. +0.j          0. +0.j          0. +0.j
# and so on

要查看绘图上的幅度谱,请应用 np.absoluteabs

>>> np.absolute(np.fft.fft(s1t5))
[  5.           0.           0.           0.           0.          16.18033989
   0.           0.           0.           0.           6.18033989   0.           0.
   0.           0.           6.18033989   0.           0.           0.           0.
   16.18033989  0.           0.           0.           0.        ]

否则只会显示真实的部分。

【讨论】:

  • 如果我使用np.fft.rfft,应该不会返回预期的 1/n 依赖项吗?
  • 如果你有一个对称方波,那么 FFT 将是全实的(机器精度):这是 Matlab 中的一个例子:blogs.mathworks.com/steve/2010/07/16/complex-surprises-from-fft
  • @AhmedFasih OP 转换的不是实际的 1 Hz 方波,而是一组以 5 Hz 采样率制作的样本。这引入了虚部。
  • @jojonas 不确定 fftrfft 之间有什么区别(后者是本地 numpy 术语),但它们都为您的案例返回相同的结果。
  • @Vovanrock2002 谢谢,我的错! @jojonas 请注意,在上述示例中执行 fftrfft 会返回相同的结果,除了 fft 在原点的右侧 (-ve) 对称地提供相同的输出(包括 nyquist 组件)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 2010-12-29
  • 2021-05-11
  • 2012-02-08
  • 1970-01-01
相关资源
最近更新 更多