dsp-0.2: DSP/Multirate/Halfband.hs
-----------------------------------------------------------------------------
-- |
-- Module : DSP.Multirate.Halfband
-- Copyright : (c) Matthew Donadio 2003
-- License : GPL
--
-- Maintainer : m.p.donadio@ieee.org
-- Stability : experimental
-- Portability : portable
--
-- Halfband interpolators and decimators
--
-- Reference: C&R
--
-----------------------------------------------------------------------------
module DSP.Multirate.Halfband (hb_interp, hb_decim) where
import Data.Array
import DSP.Basic (delay, uninterleave, interleave)
import DSP.Filter.FIR.FIR
mkhalfband :: Num a => Array Int a -> Array Int a
mkhalfband h = listArray (0,m `div` 2) [ h!n | n <- [0,2..m] ]
where m = snd $ bounds h
-- | Halfband interpolator
hb_interp :: (Num a) => Array Int a -- ^ h[n]
-> [a] -- ^ x[n]
-> [a] -- ^ y[n]
hb_interp h x = interleave y1 y2
where (x1,x2) = uninterleave x
y1 = fir (mkhalfband h) x1
y2 = map (h!m2 *) $ delay m2 $ x2
m2 = (snd $ bounds h) `div` 2
-- | Halfband decimator
hb_decim :: (Num a) => Array Int a -- ^ h[n]
-> [a] -- ^ x[n]
-> [a] -- ^ y[n]
hb_decim h x = zipWith (+) y1 y2
where (x1,x2) = uninterleave x
y1 = fir (mkhalfband h) x1
y2 = map (h!m2 *) $ delay m2 $ x2
m2 = (snd $ bounds h) `div` 2