packages feed

raw-feldspar-0.1: examples/DFT.hs

{-# LANGUAGE FlexibleContexts #-}

-- | Discrete Fourier Transform

module DFT
  ( dft
  , idft
  ) where



import Prelude ()

import Feldspar
import Feldspar.Data.Vector



-- | Discrete Fourier Transform
dft :: (RealFloat a, PrimType a, PrimType (Complex a)) =>
    DPull (Complex a) -> DPull (Complex a)
dft vec = fromColVec $ matMul (mat (length vec)) (toColVec vec)
  where
    mat n = Pull2 n n $ \k l ->
        polar 1 (-(2*π * i2n k * i2n l) / i2n n)

-- | Inverse Discrete Fourier Transform
idft :: (RealFloat a, PrimType a, PrimType (Complex a)) =>
    DPull (Complex a) -> DPull (Complex a)
idft = divLen . map conjugate . dft . map conjugate
  where
    divLen v = fmap (/ i2n (length v)) v