R 和 Scala 之间傅立叶逆变换的差异 Breeze

Difference on Inverse Fourier Transform beetween R and Scala Breeze

我正在尝试将 R 代码转换为 scala,当我执行逆傅立叶变换时,我注意到 breeze 和 R 之间存在差异。 (R 中的 fft ;breeze 中的 inverseFourierTransform)。

在 Scala 中 Breeze

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 )

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) 的别名,但除以长度 (x)