fft 0.1.1 → 0.1.2
raw patch · 3 files changed
+49/−28 lines, 3 filesdep +sybdep ~base
Dependencies added: syb
Dependency ranges changed: base
Files
- Math/FFT.hs +0/−1
- Math/FFT/Base.hsc +28/−20
- fft.cabal +21/−7
Math/FFT.hs view
@@ -168,4 +168,3 @@ ) where import Math.FFT.Base-import Data.Array.CArray
Math/FFT/Base.hsc view
@@ -21,7 +21,7 @@ import Foreign.ForeignPtr import Foreign.Ptr import Foreign.Storable-import Foreign.Storable.Complex+import Foreign.Storable.Complex () import System.IO.Unsafe (unsafePerformIO) #include <fftw3.h>@@ -49,6 +49,7 @@ -- | This lock must be taken during /planning/ of any transform. The FFTW -- library is not thread-safe in the planning phase. Thankfully, the lock is -- not needed during the execute phase.+lock :: MVar () lock = unsafePerformIO $ newMVar () {-# NOINLINE lock #-} @@ -165,6 +166,7 @@ , c_forward = FFTW_FORWARD , c_backward = FFTW_BACKWARD } +unSign :: Sign -> FFTWSign unSign DFTForward = c_forward unSign DFTBackward = c_backward @@ -206,8 +208,11 @@ -- | Corresponds to the @fftw_iodim@ structure. It completely describes the -- layout of each dimension, before and after the transform.-data IODim = IODim { n :: Int, is :: Int, os :: Int }- deriving (Eq, Show)+data IODim = IODim { nIODim :: Int -- ^ Logical size of dimension+ , isIODim :: Int -- ^ Stride along dimension in input array+ , osIODim :: Int -- ^ Stride along dimension in output array+ }+ deriving (Eq, Show, Data, Typeable) instance Storable IODim where sizeOf _ = #{size fftw_iodim}@@ -279,7 +284,9 @@ dftCRON :: (FFTWReal r, Ix i, Shapable i) => [Int] -> CArray i (Complex r) -> CArray i r dftCRON = dftCROG estimate +fzr :: b -> [a] -> [(a,b)] fzr = flip zip . repeat+drr :: (FFTWReal r, Ix i, Shapable i) => Kind -> [Int] -> CArray i r -> CArray i r drr = (dftRRN .) . fzr -- | Multi-dimensional real to real transform. The result is not normalized.@@ -380,6 +387,7 @@ -- Check if a flag is set. infix 7 `has`+has :: Flag -> Flag -> Bool a `has` b = a .&. b == b -- | Try to transform a CArray with only one memory allocation (for the result).@@ -416,7 +424,7 @@ withCArray a $ \ip -> withForeignPtr ofp $ \op -> withForeignPtr wfp $ \wp -> do- p <- withLock $ planner (unFlag $ f') wp op+ p <- withLock $ planner (unFlag f') wp op copyArray wp ip sz execute p unsafeForeignPtrToCArray ofp lu@@ -426,9 +434,9 @@ -- | All the logic for determining shape of resulting array, and how to do the transform. dftShape :: (Ix i, Shapable i, IArray CArray e) => DFT -> [Int] -> CArray i e -> ((i,i),TSpec)-dftShape dft tdims arr = assert valid (oBounds,tspec)- where shp = shape arr- rnk = rank arr+dftShape t tdims a = assert valid (oBounds,tspec)+ where shp = shape a+ rnk = rank a strides = shapeToStride shp valid = not (null tdims) && 0 <= minimum tdims && maximum tdims < rnk && nub tdims == tdims@@ -438,13 +446,13 @@ filt s = map (s !!) tdims filt' s = map (s !!) ([0 .. rnk - 1] \\ tdims) oShape = adjust f ldim shp -- Physical shape of the output array- where f = case dft of+ where f = case t of RC -> (\n -> n `div` 2 + 1) CR -> (\n -> (n - 1) * 2) CRO -> (\n -> (n - 1) * 2 + 1) _ -> id lShape = adjust f ldim shp -- Logical shape of the output array- where f = case dft of+ where f = case t of CR -> (\n -> (n - 1) * 2) CRO -> (\n -> (n - 1) * 2 + 1) _ -> id@@ -465,25 +473,25 @@ -- | Complex to Complex DFT, un-normalized. dftGU :: (FFTWReal r, Ix i, Shapable i) => Sign -> Flag -> [Int] -> CArray i (Complex r) -> CArray i (Complex r) dftGU s f tdims ain = transformCArray f ain bds go- where go f ip op = withTSpec tspec $ \r ds hr hds ->- plan_guru_dft r ds hr hds ip op (unSign s) f+ where go f' ip op = withTSpec tspec $ \r ds hr hds ->+ plan_guru_dft r ds hr hds ip op (unSign s) f' (bds,tspec) = dftShape CC tdims ain -- | Real to Complex DFT. dftRCG :: (FFTWReal r, Ix i, Shapable i) => Flag -> [Int] -> CArray i r -> CArray i (Complex r) dftRCG f tdims ain = transformCArray f ain bds go- where go f ip op = withTSpec tspec $ \r ds hr hds ->- plan_guru_dft_r2c r ds hr hds ip op f+ where go f' ip op = withTSpec tspec $ \r ds hr hds ->+ plan_guru_dft_r2c r ds hr hds ip op f' (bds,tspec) = dftShape RC tdims ain -- | Complex to Real DFT. The first argument determines whether the last -- transformed dimension is logically odd or even. 'True' implies the dimension -- is odd. dftCRG_ :: (FFTWReal r, Ix i, Shapable i) => Bool -> Flag -> [Int] -> CArray i (Complex r) -> CArray i r-dftCRG_ odd f tdims ain = tCArr f ain bds go- where go f ip op = withTSpec tspec $ \r ds hr hds ->- plan_guru_dft_c2r r ds hr hds ip op f- (bds,tspec) = dftShape (if odd then CRO else CR) tdims ain+dftCRG_ isOdd f tdims ain = tCArr f ain bds go+ where go f' ip op = withTSpec tspec $ \r ds hr hds ->+ plan_guru_dft_c2r r ds hr hds ip op f'+ (bds,tspec) = dftShape (if isOdd then CRO else CR) tdims ain tCArr = if length tdims == 1 && f `has` preserveInput -- A multi-dimensional C->R transform destroys its input. -- Also, a one-dimensional transform is faster if it can@@ -502,9 +510,9 @@ -- | Real to Real transforms. dftRRG :: (FFTWReal r, Ix i, Shapable i) => Flag -> [(Int,Kind)] -> CArray i r -> CArray i r dftRRG f tk ain = tCArr f ain bds go- where go f ip op = withTSpec tspec $ \r ds hr hds ->- withArray (map unKind ks) $ \pk ->- plan_guru_r2r r ds hr hds ip op pk f+ where go f' ip op = withTSpec tspec $ \r ds hr hds ->+ withArray (map unKind ks) $ \pk ->+ plan_guru_r2r r ds hr hds ip op pk f' (bds,tspec) = dftShape RR tdims ain (tdims,ks) = unzip tk tCArr = if any (== HC2R) ks && not (f `has` preserveInput)
fft.cabal view
@@ -1,5 +1,5 @@ name: fft-version: 0.1.1+version: 0.1.2 synopsis: Bindings to the FFTW library. description: Bindings to the FFTW library.@@ -13,10 +13,24 @@ license-file: LICENSE author: Jed Brown maintainer: <jed@59A2.org>-build-Depends: base, array, carray, storable-complex-extra-libraries: fftw3-extensions: ForeignFunctionInterface-exposed-modules: Math.FFT- Math.FFT.Base-ghc-options: build-type: Simple+cabal-version: >= 1.2++flag splitBase+flag base4++library+ if flag(splitBase)+ build-depends: base >= 3, array, carray, storable-complex+ else+ build-depends: base < 3, carray, storable-complex+ if flag(base4)+ build-depends: base >= 4 && < 5, syb >= 0.1+ else+ build-depends: base < 4++ exposed-modules: Math.FFT+ Math.FFT.Base+ extra-libraries: fftw3+ extensions: ForeignFunctionInterface+ ghc-options: -Wall