module Sound.SC3.Lang.Math.Window where
import qualified Numeric.GSL.Special.Bessel as M
import qualified Numeric.GSL.Special.Trig as M
type Window x = x -> x
type Table x = [x]
window_table :: (Integral n,Fractional a,Enum a) => n -> Window a -> Table a
window_table n f =
let k = 1 / (fromIntegral n 1)
in map f [0,k..1]
bessel0 :: Double -> Double
bessel0 = M.bessel_Inu 0
square :: Num a => a -> a
square x = x * x
gaussian :: Floating a => a -> Window a
gaussian theta i = exp ( (0.5 * square ((i 0.5) / (theta * 0.5))))
hann :: Floating a => Window a
hann i = 0.5 * (1 cos (2 * pi * i))
hamming :: Floating a => Window a
hamming i = 0.54 0.46 * cos (2 * pi * i)
kaiser :: Double -> Window Double
kaiser beta i =
let beta' = bessel0 beta
in bessel0 (beta * sqrt (1 ((2 * i 1) ** 2))) / beta'
lanczos :: Window Double
lanczos i = M.sinc (2 * i 1)
rectangular :: Window a
rectangular = id
sine :: Floating a => Window a
sine i = sin (i * pi)
triangular :: Fractional a => Window a
triangular i = 2 * (0.5 abs (i 0.5))
gaussian_table :: (Integral n, Floating b, Enum b) => n -> b -> [b]
gaussian_table n = window_table n . gaussian
hamming_table :: Int -> [Double]
hamming_table n = window_table n hamming
hann_table :: Int -> [Double]
hann_table n = window_table n hann
kaiser_table :: Int -> Double -> [Double]
kaiser_table n = window_table n . kaiser
lanczos_table :: Integral n => n -> [Double]
lanczos_table n = window_table n lanczos
sine_table :: (Integral n, Floating b, Enum b) => n -> [b]
sine_table n = window_table n sine
triangular_table :: (Integral n, Fractional b, Enum b) => n -> [b]
triangular_table n = window_table n triangular