【问题标题】:fft: why my main peak is lower than the side peak?fft:为什么我的主峰比副峰低?
【发布时间】:2016-02-19 17:05:06
【问题描述】:

原始数据位于google drive。它是一个两列数据,t 和 x。我做了以下离散fft变换。 我不太明白主峰(尖峰)的高度低于侧峰。第二个子图表明确实是尖峰(最接近2.0)是主频。代码及图如下:

import numpy as np
import math
import matplotlib.pyplot as plt
from scipy.fftpack import fft,fftfreq

freqUnit=0.012/(2*np.pi)
data = np.loadtxt(fname='data.txt')
t = data[:,0]
x = data[:,1]
n=len(t)
d=t[1]-t[0]

fig=plt.figure()
ax1=fig.add_subplot(3,1,1)
ax2=fig.add_subplot(3,1,2)
ax3=fig.add_subplot(3,1,3)

y = abs(fft(x))
freqs = fftfreq(n, d)/freqUnit

ax1.plot(t, x)
ax2.plot(t, x)
ax2.set_xlim(40000,60000)
ax2.set_ylim(0.995,1.005)
ax3.plot(freqs,y,'-.')
ax3.set_xlim(0,4)
ax3.set_ylim(0,1000)
plt.show()

【问题讨论】:

  • 我不确定我是否理解你的论点,为什么主频率是 2;我也不确定你 freqUnit 中的 0.012 来自哪里。
  • data.txt中的数据是如何生成的?
  • 我建议 2.05 频率实际上是(几乎)主导频率(2.0 和 2.05 可能相等)。您最清楚地看到了 2.0,但您也看到了它们的区别:f=0.05 包络。因此,除非您有一些令人信服的理由知道您的主频率是 2.0,否则结果只是 f = 2.0 和 f = 2.05 的组合。
  • @Evert 从图中看原因是2.0的频率比较尖锐。
  • @fjarri 来自一个研究问题。

标签: python numpy scipy fft


【解决方案1】:

您需要在 FFT 之前应用 window function,否则您会看到上述伪影,尤其是在频谱中的峰值与 FFT bin 中心不直接对应的情况下。

有关详细信息,请参阅"Why do I need to apply a window function to samples when building a power spectrum of an audio signal?" 问题。

【讨论】:

  • 您是否也建议我的频率不是2.0,而是更大的频率?或者您是否建议您提供的材料在应用窗口函数后可能会使我的主峰(我认为是2.0)更大?
  • 如果应用窗函数,您将获得更准确的峰值 - 是的,根据两个分量的确切频率,您很可能会看到两个峰值幅度的相对变化在你上面的例子中。
猜你喜欢
  • 2019-02-14
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多