packages feed

align-audio-0.0.0.2: src/Common.hs

module Common where

import qualified Numeric.FFTW.Shape as Spectrum
import qualified Numeric.FFTW.Rank1 as Trafo1
import qualified Numeric.Netlib.Class as Class

import qualified Data.Array.Comfort.Storable as Array
import qualified Data.Array.Comfort.Shape as Shape
import qualified Data.StorableVector.Lazy as SVL
import qualified Data.StorableVector as SV
import Data.Array.Comfort.Storable (Array)
import Data.Complex (Complex)

import Foreign.Storable (Storable)


cyclicFromVector :: (Storable a) => SVL.Vector a -> Array (Shape.Cyclic Int) a
cyclicFromVector =
   Array.mapShape (\(Shape.ZeroBased n) -> Shape.Cyclic n) .
   Array.fromStorableVector . SV.concat . SVL.chunks

pad :: (Storable a, Num a) => Int -> SVL.Vector a -> SVL.Vector a
pad n xs =
   SVL.append xs $ SVL.replicate SVL.defaultChunkSize (n - SVL.length xs) 0

fourierRC ::
   (Class.Real a) =>
   Int -> SVL.Vector a -> Array (Spectrum.Half Int) (Complex a)
fourierRC n = Trafo1.fourierRC . cyclicFromVector . pad n