dsp-0.1: DSP/FastConvolution.hs
-----------------------------------------------------------------------------
-- |
-- Module : DSP.FastConvolution
-- Copyright : (c) Matthew Donadio 2003
-- License : GPL
--
-- Maintainer : m.p.donadio@ieee.org
-- Stability : experimental
-- Portability : portable
--
-- Module to perform fast linear convolution of two sequences
--
-----------------------------------------------------------------------------
module DSP.FastConvolution (fast_conv) where
import Data.Array
import Data.Complex
import Numeric.Transform.Fourier.FFT
-- * Functions
-- | @fast_conv@ convolves two finite sequences using DFT relationships
fast_conv :: (RealFloat b) => Array Int (Complex b) -> Array Int (Complex b) -> Array Int (Complex b)
fast_conv h1 h2 = h3
where m1 = snd $ bounds h1
m2 = snd $ bounds h2
m3 = m1 + m2
h1' = fft $ listArray (0,m3) $ elems h1 ++ replicate m2 0
h2' = fft $ listArray (0,m3) $ elems h2 ++ replicate m1 0
h3' = listArray (0,m3) $ zipWith (*) (elems h1') (elems h2')
h3 = ifft h3'