packages feed

dsp-0.1: DSP/Basic.hs

-----------------------------------------------------------------------------
-- |
-- Module      :  DSP.Basic
-- Copyright   :  (c) Matthew Donadio 1998
-- License     :  GPL
--
-- Maintainer  :  m.p.donadio@ieee.org
-- Stability   :  experimental
-- Portability :  portable
--
-- Basic functions for manipulating signals
--
-----------------------------------------------------------------------------

module DSP.Basic where

import Data.Array

import DSP.Source.Basic

-- * Functions

-- | @z@ is the unit delay function, eg,
--
-- @z [ 1, 2, 3 ] == [ 0, 1, 2, 3 ]@

z  :: (Num a) => [a] -> [a]
z a = 0 : a

-- | zn is the n sample delay function, eg,
-- 
-- @zn 3 [ 1, 2, 3 ] == [ 0, 0, 0, 1, 2, 3 ]@

zn    :: (Num a) => Int -> [a] -> [a]
zn 0 a = a
zn n a = 0 : zn (n - 1) a

-- | @downsample@ throws away every n'th sample, eg,
--
-- @downsample 2 [ 1, 2, 3, 4, 5, 6 ] == [ 1, 3, 5 ]@

downsample :: (Num a) => Int -> [a] -> [a]
downsample n []     = []
downsample n (x:xs) = x : downsample n (drop (n - 1) xs)

-- | @upsample@ inserts n-1 zeros between each sample, eg,
-- 
-- @upsample 2 [ 1, 2, 3 ] == [ 1, 0, 2, 0, 3, 0 ]@

upsample :: (Num a) => Int -> [a] -> [a]
upsample _ []     = []
upsample n (x:xs) = x : zero n n xs
    where zero n 1 xs = upsample n xs
	  zero n i xs = 0 : zero n (i-1) xs

-- | @upsampleAndHold@ replicates each sample n times, eg,
--
-- @upsampleAndHold 3 [ 1, 2, 3 ] == [ 1, 1, 1, 2, 2, 2, 3, 3, 3 ]@

upsampleAndHold :: (Num a) => Int -> [a] -> [a]
upsampleAndHold n xs = hold' n n xs
    where hold' _ _ []     = []
	  hold' n 1 (x:xs) = x : hold' n n xs
	  hold' n i (x:xs) = x : hold' n (i-1) (x:xs)

-- | pad a sequence with zeros to length n
--
-- @pad [ 1, 2, 3 ] 6 == [ 1, 2, 3, 0, 0, 0 ]@

pad :: (Ix a, Integral a, Num b) => Array a b -> a -> Array a b
pad x n = listArray (0,n-1) $ elems x ++ zeros