我正在尝试将 R 代码转换为 scala,当我执行傅里叶逆变换时,我注意到 Breeze 和 R 之间存在差异。 (R 中的 fft;微风中的逆傅里叶变换)。
在斯卡拉微风中
val vec = new DenseVector(Array(1.0,2.0,3.0,4.0))
val res = inverseFourierTransform(vec)
// res = ( 2.5 ; -0.5 - 0.5i ; -0.5 ; -0.5 + 0.5i )
在 R 中
vec <- c(1,2,3,4)
res <- fft(vec, inverse = TRUE)
# res = ( 10 ; -2 - 2i ; -2 ; -2 + 2i )
我们可以观察到两个结果之间存在 4 倍的差异
她从哪里来?
最佳答案
根据fft
的帮助文件,倒数应计算为:
fft(x, inverse = TRUE)/length(x)
所以在你的情况下:
vec <- c(1,2,3,4)
res <- fft(vec, inverse = TRUE)/length(vec)
res
# [1] 2.5+0.0i -0.5-0.5i -0.5+0.0i -0.5+0.5i
或者使用pracma
包:
pracma::ifft(vec)
# [1] 2.5+0.0i -0.5-0.5i -0.5+0.0i -0.5+0.5i
ifft
帮助页面中的注释指出它几乎是 R 的 fft(x, inverse=TRUE) 的别名,但除以 length(x)
关于r - R 和 Scala Breeze 之间傅里叶逆变换的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35358832/