【问题标题】:Amplitude and Phase of FFTFFT的幅度和相位
【发布时间】:2014-01-12 09:39:18
【问题描述】:

我有一个健全的函数,我试图将其分解为正弦/余弦。所以我求助于快速傅里叶变换。通过使用fft(y,inverse=FALSE) 函数,我能够将声音的时域转换为频域。输出很复杂。我读到,为了转换这个虚数形式的输出并剔除必要的信息,即A(v)cos(2*pi*v+P) 的幅度和相位,必须使用输出的abs() 来获得幅度;但是我很难找到让我们进入相位的 R 函数。在 MATLAB 中,angle() 函数返回 FFT 的相位。 R中查找相位的相应函数是什么?

更新

谢谢大家的建议;仍然遇到问题。我在一个简单的函数上运行 FFT 来测试它是否有效。我的功能是y=cos(2*pi*(seq(0,10,by=.01)*(1/5)+7.5)。 因此频率为 1/5,相移为 7.5。

y=cos(2*pi*(seq(0,10,by=.01)*(1/5)+7.5)
fty=(y,inverse=F)
plot(abs(fty),xlim=c(0,10),type="l")
angle=atan2(Im(fty), Re(fty))
> angle[3]
[1] 1.222766

当我绘制系列时,幅度在频率值为 3 处达到峰值,而角度函数(它应该给我在幅度达到峰值的频率处的相位)给我一个 1.2 的相位。我究竟做错了什么?

【问题讨论】:

  • 相位 7.5(弧度)将减少模块 2pi。如果你从 7.5 中减去 2*3.14,你会得到大约 1.2。
  • 谢谢弗洛里斯。频率呢?在输出中,我的频率箱为 3,什么操作将值调整为 1/5?
  • 第一个 bin 包含 DC 分量;第三个 bin 包含恰好适合两次的频率。您有2*pi*seq(0,10,by=0.01) * (1/5),我们可以将其重写为2*pi*seq(0,2,by=0.002)。因此,您可以准确地获得两个波形 (10 / 5 = 2),并且您可以在 bin 3 中看到预期的峰值。反过来, (maxBin - 1) / maxTime = (3 - 1) / 10 = 1/5 。有意义吗?

标签: r


【解决方案1】:

您可能会发现atan2 函数可以满足您的需求。因为原型是atan2(y, x),所以你可以给它虚部和实部的值。所以你可以这样做:

angle = atan2(Im(value), Re(value));

【讨论】:

  • 应该是ImRe
  • 感谢您的帮助弗洛里斯! fft() 的输出格式为 a+bi,因此它包含实数和复数函数。如何从输出向量中的b 解析aimre 是 R 中的实际函数吗?如果有,是哪个包?
  • ImRe (原文如此)在基础 R 中,它们是您问题的答案。 x <- complex(real=2:3,imaginary=1:2); print(x); Im(x); Re(x)
  • 我的错 - 正如@MatthewLundberg 和 Ben Bolker 指出的那样,它们应该是 ImRe - 而不是 imre。所以是的 - Re(fftOutput) 应该给你a 值,Im(fftOutput) 应该给你b 值。
  • 感谢马特和弗洛里斯的帮助。我能够计算 FFT 的角度,但这些值没有意义。请参阅最初的帖子以获取更新。
猜你喜欢
  • 2021-05-25
  • 2022-11-15
  • 2011-12-07
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 2017-11-13
相关资源
最近更新 更多