@@ -16,6 +16,10 @@ module HashedExpression.Interp
1616 evaluate2DComplex ,
1717 evaluate3DReal ,
1818 evaluate3DComplex ,
19+ fourierTransform1D ,
20+ fourierTransform2D ,
21+ fourierTransform3D ,
22+ FTMode (.. ),
1923 )
2024where
2125
@@ -463,8 +467,8 @@ evaluate1DComplex valMap (mp, n)
463467 ]
464468 Rotate [amount] arg ->
465469 rotate1D size amount (evaluate1DComplex valMap $ (mp, arg))
466- FT arg -> fourierTransform1D False size $ evaluate1DComplex valMap (mp, arg)
467- IFT arg -> fourierTransform1D True size $ evaluate1DComplex valMap (mp, arg)
470+ FT arg -> fourierTransform1D FT_FORWARD size $ evaluate1DComplex valMap (mp, arg)
471+ IFT arg -> fourierTransform1D FT_BACKWARD size $ evaluate1DComplex valMap (mp, arg)
468472 _ -> error " expression structure One C is wrong"
469473 | otherwise = error " one C but shape is not [size] ??"
470474
@@ -600,8 +604,8 @@ evaluate2DComplex valMap (mp, n)
600604 (size1, size2)
601605 (amount1, amount2)
602606 (evaluate2DComplex valMap $ (mp, arg))
603- FT arg -> fourierTransform2D False (size1, size2) $ evaluate2DComplex valMap (mp, arg)
604- IFT arg -> fourierTransform2D True (size1, size2) $ evaluate2DComplex valMap (mp, arg)
607+ FT arg -> fourierTransform2D FT_FORWARD (size1, size2) $ evaluate2DComplex valMap (mp, arg)
608+ IFT arg -> fourierTransform2D FT_BACKWARD (size1, size2) $ evaluate2DComplex valMap (mp, arg)
605609 _ -> error " expression structure Two C is wrong"
606610 | otherwise = error " Two C but shape is not [size1, size2] ??"
607611
@@ -739,8 +743,8 @@ evaluate3DComplex valMap (mp, n)
739743 (size1, size2, size3)
740744 (amount1, amount2, amount3)
741745 (evaluate3DComplex valMap $ (mp, arg))
742- FT arg -> fourierTransform3D False (size1, size2, size3) $ evaluate3DComplex valMap (mp, arg)
743- IFT arg -> fourierTransform3D True (size1, size2, size3) $ evaluate3DComplex valMap (mp, arg)
746+ FT arg -> fourierTransform3D FT_FORWARD (size1, size2, size3) $ evaluate3DComplex valMap (mp, arg)
747+ IFT arg -> fourierTransform3D FT_BACKWARD (size1, size2, size3) $ evaluate3DComplex valMap (mp, arg)
744748 _ -> error " expression structure Three C is wrong"
745749 | otherwise = error " Three C but shape is not [size1, size2, size3] ??"
746750
@@ -816,6 +820,8 @@ rotate3D (size1, size2, size3) (amount1, amount2, amount3) arr =
816820 k <- [0 .. size3 - 1 ]
817821 ]
818822
823+ data FTMode = FT_FORWARD | FT_BACKWARD deriving (Eq , Ord )
824+
819825-- | Fourier Transform in 1D.
820826-- Frequency is just in one dimension.
821827-- Consider a real-valued function, S(x),
@@ -824,14 +830,14 @@ rotate3D (size1, size2, size3) (amount1, amount2, amount3) arr =
824830-- length of cycle is P/n, and frequency is n/P.
825831-- so for input i the frequency is (2*pi*i*n)/P
826832fourierTransform1D ::
827- Bool -> Int -> Array Int (Complex Double ) -> Array Int (Complex Double )
828- fourierTransform1D inverse size arr =
833+ FTMode -> Int -> Array Int (Complex Double ) -> Array Int (Complex Double )
834+ fourierTransform1D mode size arr =
829835 listArray (0 , size - 1 ) [computeX i | i <- [0 .. size - 1 ]]
830836 where
831- s = if inverse then fromIntegral size else 1
837+ s = if mode == FT_BACKWARD then fromIntegral size else 1
832838 computeX i = (sum $ zipWithA (*) arr (fourierBasis i)) / s
833839 fourierBasis i =
834- let frequency n = (2 * pi * fromIntegral (i * n) / fromIntegral size) * (if inverse then - 1 else 1 )
840+ let frequency n = (2 * pi * fromIntegral (i * n) / fromIntegral size) * (if mode == FT_BACKWARD then - 1 else 1 )
835841 in listArray
836842 (0 , size - 1 )
837843 [ cos (frequency n) :+ (- sin (frequency n))
@@ -847,23 +853,23 @@ fourierTransform1D inverse size arr =
847853-- so for input i the frequency is (2*pi*i*n)/P
848854-- the frequency should be calculated in both dimensions for i and j
849855fourierTransform2D ::
850- Bool ->
856+ FTMode ->
851857 (Int , Int ) ->
852858 Array (Int , Int ) (Complex Double ) ->
853859 Array (Int , Int ) (Complex Double )
854- fourierTransform2D inverse (size1, size2) arr =
860+ fourierTransform2D mode (size1, size2) arr =
855861 listArray
856862 ((0 , 0 ), (size1 - 1 , size2 - 1 ))
857863 [computeX i j | i <- [0 .. size1 - 1 ], j <- [0 .. size2 - 1 ]]
858864 where
859- s = if inverse then fromIntegral (size1 * size2) else 1
865+ s = if mode == FT_BACKWARD then fromIntegral (size1 * size2) else 1
860866 computeX i j = (sum $ zipWithA (*) arr (fourierBasis i j)) / s
861867 fourierBasis i j =
862868 let frequency m n =
863869 ( 2 * pi * fromIntegral (i * m) / fromIntegral size1
864870 + 2 * pi * fromIntegral (j * n) / fromIntegral size2
865871 )
866- * (if inverse then - 1 else 1 )
872+ * (if mode == FT_BACKWARD then - 1 else 1 )
867873 in listArray
868874 ((0 , 0 ), (size1 - 1 , size2 - 1 ))
869875 [ cos (frequency m n) :+ (- sin (frequency m n))
@@ -880,11 +886,11 @@ fourierTransform2D inverse (size1, size2) arr =
880886-- so for input i the frequency is (2*pi*i*n)/P
881887-- the frequency should be calculated for all dimensions, i , j , k
882888fourierTransform3D ::
883- Bool ->
889+ FTMode ->
884890 (Int , Int , Int ) ->
885891 Array (Int , Int , Int ) (Complex Double ) ->
886892 Array (Int , Int , Int ) (Complex Double )
887- fourierTransform3D inverse (size1, size2, size3) arr =
893+ fourierTransform3D mode (size1, size2, size3) arr =
888894 listArray
889895 ((0 , 0 , 0 ), (size1 - 1 , size2 - 1 , size3 - 1 ))
890896 [ computeX i j k
@@ -893,15 +899,15 @@ fourierTransform3D inverse (size1, size2, size3) arr =
893899 k <- [0 .. size3 - 1 ]
894900 ]
895901 where
896- s = if inverse then fromIntegral (size1 * size2) else 1
902+ s = if mode == FT_BACKWARD then fromIntegral (size1 * size2) else 1
897903 computeX i j k = (sum $ zipWithA (*) arr (fourierBasis i j k)) / s
898904 fourierBasis i j k =
899905 let frequency m n p =
900906 ( 2 * pi * fromIntegral (i * m) / fromIntegral size1
901907 + 2 * pi * fromIntegral (j * n) / fromIntegral size2
902908 + 2 * pi * fromIntegral (k * p) / fromIntegral size3
903909 )
904- * (if inverse then - 1 else 1 )
910+ * (if mode == FT_BACKWARD then - 1 else 1 )
905911 in listArray
906912 ((0 , 0 , 0 ), (size1 - 1 , size2 - 1 , size3 - 1 ))
907913 [ cos (frequency m n p) :+ (- sin (frequency m n p))
0 commit comments