【问题标题】:Why do I get two frequency spikes from a simple sin function via FFT in R?为什么我通过 R 中的 FFT 从一个简单的 sin 函数中得到两个频率尖峰?
【发布时间】:2012-05-11 09:55:36
【问题描述】:

我在数学课上学习了傅立叶变换,并认为我已经理解了它们。现在,我正在尝试使用 R(统计语言)并在实践中解释离散 FFT 的结果。这就是我所做的:

x = seq(0,1,by=0.1)
y = sin(2*pi*(x))

calcenergy <- function(x) Im(x) * Im(x) + Re(x) * Re(x)

fy <- fft(y)
plot(x, calcenergy(fy))

得到这个情节:

如果我理解正确,这代表能量密度谱的“一半”。由于变换是对称的,我可以将所有值镜像到 x 的负值以获得完整的光谱。

但是,我不明白的是,为什么我会得到两个尖峰?这里只有一个正弦频率。这是混叠效应吗?

另外,我不知道如何从这个图中得到频率。假设 sinus 函数的单位是秒,那么密度谱中 1.0 处的峰值是 1Hz 吗?

再次:我了解 FFT 背后的理论;实际应用是问题:)。

感谢您的帮助!

【问题讨论】:

  • 切线,calcenergy 可以写成function(x) abs(x)^2。 (这样会更有效率)。
  • @dbaupp 哦,谢谢。我知道有一些内置的方法可以做到这一点,但我懒得去寻找它:)

标签: r signal-processing fft


【解决方案1】:

对于 N 点的纯实数输入信号,您会得到 N 点的复数输出,具有关于 N/2 的复共轭对称性。您可以忽略 N/2 以上的输出点,因为它们没有为真实输入信号提供有用的附加信息,但如果您绘制它们,您将看到上述对称性,对于单个正弦波,您将看到 bin @ 987654321@ 和N - n。 (注意:您可以将上面的 N/2 个 bin 视为代表 负频率。)总而言之,对于 N 个点的实际输入信号,您可以从 FFT 中获得 N/2 个有用的复数输出 bin ,表示从 DC (0 Hz) 到 Nyquist (Fs / 2) 的频率。

【讨论】:

  • 感谢您的回答。我刚刚尝试使用带有seq(0,1.1,by=0.1) 的奇数个值,并且确实如您所说,对称性正好在第 6 个桶附近。这已经回答了我的第一个问题。第二个怎么样,我如何推断这些垃圾箱的频率?如果可以的话,我会投票(需要 15 个代表):/
  • 哦,刚刚看到你在此期间已经回答了 :) 谢谢!
  • 我赞成并收藏了您的问题,以使您获得更多代表。 ;-)
【解决方案2】:

要从 FFT 的结果中获取频率,您需要知道输入到 FFT 的数据的采样率和 FFT 的长度。每个 bin 的中心频率是 bin 索引乘以采样率除以 FFT 的长度。因此,您将在中途 bin 处获得从 DC (0 Hz) 到 Fs/2 的频率。

FFT 结果的后半部分只是实际数据输入的前半部分的复共轭。原因是复共轭的虚部相消,这是表示虚部为零的求和结果所必需的,例如绝对真实。

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 2010-09-19
    • 1970-01-01
    • 2016-02-19
    • 2019-10-11
    • 2013-11-07
    • 1970-01-01
    • 2011-05-20
    相关资源
    最近更新 更多