-----------------------------------------------------------------------------
-- |
-- Module      :  Numeric.Transform.Fourier.FFTHard
-- Copyright   :  (c) Matthew Donadio 2003
-- License     :  GPL
--
-- Maintainer  :  m.p.donadio@ieee.org
-- Stability   :  experimental
-- Portability :  portable
--
-- Hard-coded FFT transforms
--
-----------------------------------------------------------------------------

module Numeric.Transform.Fourier.FFTHard where

import Data.Array
import Data.Complex

-- These are the hard coded DFT's borrowed from FFTW

{-# specialize fft'2 :: Array Int (Complex Float) -> Array Int (Complex Float) #-}
{-# specialize fft'2 :: Array Int (Complex Double) -> Array Int (Complex Double) #-}

-- | Length 2 FFT

fft'2 :: (Ix a, Integral a, RealFloat b) => Array a (Complex b) -- ^ x[n]
      -> Array a (Complex b) -- ^ X[k]

fft'2 :: forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> Array a (Complex b)
fft'2 Array a (Complex b)
a = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e
array (a
0,a
1) [ (a
0, ((b
tmp1 forall a. Num a => a -> a -> a
+ b
tmp2) forall a. a -> a -> Complex a
:+ (b
tmp3 forall a. Num a => a -> a -> a
+ b
tmp4))),
			(a
1, ((b
tmp1 forall a. Num a => a -> a -> a
- b
tmp2) forall a. a -> a -> Complex a
:+ (b
tmp3 forall a. Num a => a -> a -> a
- b
tmp4) )) ]
    where tmp1 :: b
tmp1 = forall a. Complex a -> a
realPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
0)
	  tmp3 :: b
tmp3 = forall a. Complex a -> a
imagPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
0)
	  tmp2 :: b
tmp2 = forall a. Complex a -> a
realPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
1)
	  tmp4 :: b
tmp4 = forall a. Complex a -> a
imagPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
1)

{-# specialize fft'3 :: Array Int (Complex Float) -> Array Int (Complex Float) #-}
{-# specialize fft'3 :: Array Int (Complex Double) -> Array Int (Complex Double) #-}

-- | Length 3 FFT

fft'3 :: (Ix a, Integral a, RealFloat b) => Array a (Complex b) -- ^ x[n]
      -> Array a (Complex b) -- ^ X[k]

fft'3 :: forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> Array a (Complex b)
fft'3 Array a (Complex b)
a = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e
array (a
0,a
2) [ (a
0, ((b
tmp1 forall a. Num a => a -> a -> a
+ b
tmp4) forall a. a -> a -> Complex a
:+ (b
tmp10 forall a. Num a => a -> a -> a
+ b
tmp11))),
		        (a
1, ((b
tmp5 forall a. Num a => a -> a -> a
+ b
tmp8) forall a. a -> a -> Complex a
:+ (b
tmp9 forall a. Num a => a -> a -> a
+ b
tmp12))),
		        (a
2, ((b
tmp5 forall a. Num a => a -> a -> a
- b
tmp8) forall a. a -> a -> Complex a
:+ (b
tmp12 forall a. Num a => a -> a -> a
- b
tmp9))) ]
    where k866025403 :: b
k866025403 = forall a. Floating a => a -> a
sqrt b
3 forall a. Fractional a => a -> a -> a
/ b
2
	  k500000000 :: b
k500000000 = b
0.5
	  tmp1 :: b
tmp1  = forall a. Complex a -> a
realPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
0)
	  tmp10 :: b
tmp10 = forall a. Complex a -> a
imagPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
0)
	  tmp2 :: b
tmp2  = forall a. Complex a -> a
realPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
1)
	  tmp6 :: b
tmp6  = forall a. Complex a -> a
imagPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
1)
	  tmp3 :: b
tmp3  = forall a. Complex a -> a
realPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
2)
	  tmp7 :: b
tmp7  = forall a. Complex a -> a
imagPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
2)
	  tmp4 :: b
tmp4  = b
tmp2 forall a. Num a => a -> a -> a
+ b
tmp3
	  tmp9 :: b
tmp9  = b
k866025403 forall a. Num a => a -> a -> a
* (b
tmp3 forall a. Num a => a -> a -> a
- b
tmp2)
	  tmp8 :: b
tmp8  = b
k866025403 forall a. Num a => a -> a -> a
* (b
tmp6 forall a. Num a => a -> a -> a
- b
tmp7)
	  tmp11 :: b
tmp11 = b
tmp6 forall a. Num a => a -> a -> a
+ b
tmp7
	  tmp5 :: b
tmp5  = b
tmp1 forall a. Num a => a -> a -> a
- (b
k500000000 forall a. Num a => a -> a -> a
* b
tmp4)
	  tmp12 :: b
tmp12 = b
tmp10 forall a. Num a => a -> a -> a
- (b
k500000000 forall a. Num a => a -> a -> a
* b
tmp11)

{-# specialize fft'4 :: Array Int (Complex Float) -> Array Int (Complex Float) #-}
{-# specialize fft'4 :: Array Int (Complex Double) -> Array Int (Complex Double) #-}

-- | Length 4 FFT

fft'4 :: (Ix a, Integral a, RealFloat b) => Array a (Complex b) -- ^ x[n]
      -> Array a (Complex b) -- ^ X[k]

fft'4 :: forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> Array a (Complex b)
fft'4 Array a (Complex b)
a = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e
array (a
0,a
3) [ (a
0, (b
tmp3 forall a. Num a => a -> a -> a
+ b
tmp6) forall a. a -> a -> Complex a
:+ (b
tmp15 forall a. Num a => a -> a -> a
+ b
tmp16)),
		        (a
1, (b
tmp11 forall a. Num a => a -> a -> a
+ b
tmp14) forall a. a -> a -> Complex a
:+ (b
tmp9 forall a. Num a => a -> a -> a
- b
tmp10)),
		        (a
2, (b
tmp3 forall a. Num a => a -> a -> a
- b
tmp6) forall a. a -> a -> Complex a
:+ (b
tmp15 forall a. Num a => a -> a -> a
- b
tmp16)),
		        (a
3, (b
tmp11 forall a. Num a => a -> a -> a
- b
tmp14) forall a. a -> a -> Complex a
:+ (b
tmp10 forall a. Num a => a -> a -> a
+ b
tmp9)) ]
    where tmp1 :: b
tmp1  = forall a. Complex a -> a
realPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
0)
	  tmp7 :: b
tmp7  = forall a. Complex a -> a
imagPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
0)
	  tmp4 :: b
tmp4  = forall a. Complex a -> a
realPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
1)
	  tmp12 :: b
tmp12 = forall a. Complex a -> a
imagPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
1)
	  tmp2 :: b
tmp2  = forall a. Complex a -> a
realPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
2)
	  tmp8 :: b
tmp8  = forall a. Complex a -> a
imagPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
2)
	  tmp5 :: b
tmp5  = forall a. Complex a -> a
realPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
3)
	  tmp13 :: b
tmp13 = forall a. Complex a -> a
imagPart (Array a (Complex b)
aforall i e. Ix i => Array i e -> i -> e
!a
3)
	  tmp3 :: b
tmp3  = b
tmp1 forall a. Num a => a -> a -> a
+ b
tmp2
	  tmp11 :: b
tmp11 = b
tmp1 forall a. Num a => a -> a -> a
- b
tmp2
	  tmp9 :: b
tmp9  = b
tmp7 forall a. Num a => a -> a -> a
- b
tmp8
	  tmp15 :: b
tmp15 = b
tmp7 forall a. Num a => a -> a -> a
+ b
tmp8
	  tmp6 :: b
tmp6  = b
tmp4 forall a. Num a => a -> a -> a
+ b
tmp5
	  tmp10 :: b
tmp10 = b
tmp4 forall a. Num a => a -> a -> a
- b
tmp5
	  tmp14 :: b
tmp14 = b
tmp12 forall a. Num a => a -> a -> a
- b
tmp13
	  tmp16 :: b
tmp16 = b
tmp12 forall a. Num a => a -> a -> a
+ b
tmp13

-------------------------------------------------------------------------------