何故かフーリエ変換したくなったので、Scalaで書いてみた。
フーリエ変換そのものについてはWikipediaでもごらん下され。
高速じゃない離散フーリエ変換。
ワンライナーで書こうと思えば書けるね、これ。
ひどく読みにくくなりそうだけど。
def ft(data: IndexedSeq[Double]): (IndexedSeq[Double], IndexedSeq[Double]) = {
val n = data.length
// 実部
val realPart =
(for (i <- 0 to n-1) yield
(for (j <- 0 to n-1) yield
(data(j) * Math.cos(2.0 * Math.Pi * i * j / n) -
data(j) * Math.sin(2.0 * Math.Pi * i * j / n)))sum)
// 虚部
val imaginaryPart =
(for (i <- 0 to n-1) yield
(for (j <- 0 to n-1) yield
(data(j) * Math.cos(2.0 * Math.Pi * i * j / n) +
data(j) * Math.sin(2.0 * Math.Pi * i * j / n)))sum)
return (realPart, imaginaryPart)
}