【发布时间】: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