module Data.Array.Accelerate.Fourier.Utility (
scaleDown,
) where
import Data.Array.Accelerate.Fourier.Private (Transform, )
import Data.Array.Accelerate.Data.Complex (Complex((:+)), )
import qualified Data.Array.Accelerate.Utility.Sliced as Sliced
import qualified Data.Array.Accelerate as A
import Data.Array.Accelerate (Exp, Slice, Shape, (:.), )
scaleDown ::
(Shape sh, Slice sh, A.RealFloat a, A.FromIntegral Int a) =>
Transform (sh:.Int) (Complex a)
scaleDown zs =
A.map (cscale (recip $ A.fromIntegral $ Sliced.length zs)) zs
cscale :: (A.Num a) => Exp a -> Exp (Complex a) -> Exp (Complex a)
cscale x z =
case A.unlift z of
r :+ i -> A.lift (x*r :+ x*i)