dsp 0.2.1 → 0.2.2
raw patch · 34 files changed
+409/−2058 lines, 34 filesdep −mtldep ~arraydep ~basedep ~randomPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies removed: mtl
Dependency ranges changed: array, base, random
API changes (from Hackage documentation)
- DSP.Filter.FIR.Window: bartlett :: Int -> Array Int Double
- DSP.Filter.FIR.Window: blackman :: Int -> Array Int Double
- DSP.Filter.FIR.Window: gen_hamming :: Double -> Int -> Array Int Double
- DSP.Filter.FIR.Window: hamming :: Int -> Array Int Double
- DSP.Filter.FIR.Window: hanning :: Int -> Array Int Double
- DSP.Filter.FIR.Window: kaiser :: Double -> Int -> Array Int Double
- DSP.Filter.FIR.Window: parzen :: Int -> Array Int Double
- DSP.Filter.FIR.Window: rectangular :: Int -> Array Int Double
- DSP.Filter.FIR.Window: window :: Array Int Double -> Array Int Double -> Array Int Double
+ DSP.Basic: linspace :: Double -> Double -> Int -> [Double]
+ DSP.Basic: logspace :: Double -> Double -> Int -> [Double]
+ DSP.Window: bartlett :: Int -> Array Int Double
+ DSP.Window: blackman :: Int -> Array Int Double
+ DSP.Window: gen_hamming :: Double -> Int -> Array Int Double
+ DSP.Window: hamming :: Int -> Array Int Double
+ DSP.Window: hanning :: Int -> Array Int Double
+ DSP.Window: kaiser :: Double -> Int -> Array Int Double
+ DSP.Window: parzen :: Int -> Array Int Double
+ DSP.Window: rectangular :: Int -> Array Int Double
+ DSP.Window: window :: Array Int Double -> Array Int Double -> Array Int Double
- DSP.Filter.FIR.FIR: fir :: Num a => Array Int a -> [a] -> [a]
+ DSP.Filter.FIR.FIR: fir :: (Num a, Eq a) => Array Int a -> [a] -> [a]
- DSP.Filter.FIR.Sharpen: sharpen :: Num a => Array Int a -> ([a] -> [a])
+ DSP.Filter.FIR.Sharpen: sharpen :: (Num a, Eq a) => Array Int a -> ([a] -> [a])
- DSP.Filter.FIR.Taps: bpf :: (Ix a, Integral a, Enum b, Floating b) => b -> b -> a -> Array a b
+ DSP.Filter.FIR.Taps: bpf :: (Ix a, Integral a, Enum b, Floating b, Eq b) => b -> b -> a -> Array a b
- DSP.Filter.FIR.Taps: bsf :: (Ix a, Integral a, Enum b, Floating b) => b -> b -> a -> Array a b
+ DSP.Filter.FIR.Taps: bsf :: (Ix a, Integral a, Enum b, Floating b, Eq b) => b -> b -> a -> Array a b
- DSP.Filter.FIR.Taps: hpf :: (Ix a, Integral a, Enum b, Floating b) => b -> a -> Array a b
+ DSP.Filter.FIR.Taps: hpf :: (Ix a, Integral a, Enum b, Floating b, Eq b) => b -> a -> Array a b
- DSP.Filter.FIR.Taps: lpf :: (Ix a, Integral a, Enum b, Floating b) => b -> a -> Array a b
+ DSP.Filter.FIR.Taps: lpf :: (Ix a, Integral a, Enum b, Floating b, Eq b) => b -> a -> Array a b
- DSP.Filter.FIR.Taps: mbf :: (Ix a, Integral a, Enum b, Floating b) => [b] -> [b] -> a -> Array a b
+ DSP.Filter.FIR.Taps: mbf :: (Ix a, Integral a, Enum b, Floating b, Eq b) => [b] -> [b] -> a -> Array a b
- DSP.Filter.FIR.Taps: rc :: (Ix a, Integral a, Enum b, Floating b) => b -> b -> a -> Array a b
+ DSP.Filter.FIR.Taps: rc :: (Ix a, Integral a, Enum b, Floating b, Eq b) => b -> b -> a -> Array a b
- DSP.Filter.IIR.IIR: iir_df1 :: Num a => (Array Int a, Array Int a) -> [a] -> [a]
+ DSP.Filter.IIR.IIR: iir_df1 :: (Num a, Eq a) => (Array Int a, Array Int a) -> [a] -> [a]
- DSP.Multirate.Halfband: hb_decim :: Num a => Array Int a -> [a] -> [a]
+ DSP.Multirate.Halfband: hb_decim :: (Num a, Eq a) => Array Int a -> [a] -> [a]
- DSP.Multirate.Halfband: hb_interp :: Num a => Array Int a -> [a] -> [a]
+ DSP.Multirate.Halfband: hb_interp :: (Num a, Eq a) => Array Int a -> [a] -> [a]
- DSP.Multirate.Polyphase: poly_interp :: Num a => Int -> Array Int a -> [a] -> [a]
+ DSP.Multirate.Polyphase: poly_interp :: (Num a, Eq a) => Int -> Array Int a -> [a] -> [a]
- Numeric.Transform.Fourier.FFTUtils: write_fft_info :: (Ix i, Integral i) => [Char] -> Array i (Complex Double) -> IO ()
+ Numeric.Transform.Fourier.FFTUtils: write_fft_info :: (Ix i, Integral i) => String -> Array i (Complex Double) -> IO ()
- Numeric.Transform.Fourier.FFTUtils: write_rfft_info :: [Char] -> Array Int Double -> IO ()
+ Numeric.Transform.Fourier.FFTUtils: write_rfft_info :: String -> Array Int Double -> IO ()
Files
- DSP/Basic.hs +22/−0
- DSP/Filter/FIR/FIR.hs +12/−12
- DSP/Filter/FIR/Kaiser.hs +3/−3
- DSP/Filter/FIR/Sharpen.hs +1/−1
- DSP/Filter/FIR/Smooth.hs +1/−1
- DSP/Filter/FIR/Taps.hs +12/−12
- DSP/Filter/FIR/Window.hs +4/−170
- DSP/Filter/IIR/IIR.hs +3/−3
- DSP/Multirate/Halfband.hs +2/−2
- DSP/Multirate/Polyphase.hs +1/−1
- DSP/Window.hs +172/−0
- Makefile +0/−117
- Numeric/Special/Airy.gc +0/−276
- Numeric/Special/Bessel.gc +0/−874
- Numeric/Special/Clausen.gc +0/−45
- Numeric/Special/Ellint.gc +0/−234
- Numeric/Special/Elljac.gc +0/−93
- Numeric/Special/Erf.gc +0/−129
- Numeric/Special/Foo.gc +0/−45
- Numeric/Statistics/Covariance.hs +0/−2
- Numeric/Statistics/Median.hs +1/−1
- Numeric/Statistics/Moment.hs +0/−2
- Numeric/Statistics/TTest.hs +0/−2
- Numeric/Transform/Fourier/CT.hs +1/−1
- Numeric/Transform/Fourier/Eigensystem.hs +142/−0
- Numeric/Transform/Fourier/FFT.hs +0/−1
- Numeric/Transform/Fourier/FFTUtils.hs +7/−9
- Numeric/Transform/Fourier/PFA.hs +1/−1
- Numeric/Transform/Fourier/R2DIF.hs +0/−1
- Numeric/Transform/Fourier/R2DIT.hs +0/−1
- Numeric/Transform/Fourier/R4DIF.hs +0/−1
- Numeric/Transform/Fourier/Rader.hs +0/−1
- Numeric/Transform/Fourier/SRDIF.hs +0/−1
- dsp.cabal +24/−16
DSP/Basic.hs view
@@ -20,6 +20,28 @@ -- * Functions +-- | 'linspace' generates a list of values linearly spaced between specified+-- start and end values (array will include both start and end values).+--+-- @linspace 0.0 1.0 5 == [ 0.0, 0.25, 0.5, 0.75 1.0 ]@++linspace :: Double -> Double -> Int -> [Double]+linspace a b n =+ map (\ i -> a + (fromIntegral i) * inc) [(0::Int) .. (n - 1)]+ where+ inc = (b - a) / (fromIntegral (n - 1))+++-- | 'logspace' generates a list of values logarithmically spaced between the+-- values 10 ** start and 10 ** end (array will include both start and end values).+--+-- @logspace 0.0 1.0 4 == [ 1.0, 2.1544, 4.6416, 10.0 ]@++logspace :: Double -> Double -> Int -> [Double]+logspace a b n =+ map (\ x -> 10.0 ** x) $ linspace a b n++ -- | 'delay' is the unit delay function, eg, -- -- @delay1 [ 1, 2, 3 ] == [ 0, 1, 2, 3 ]@
DSP/Filter/FIR/FIR.hs view
@@ -28,7 +28,7 @@ {-# specialize fir :: Array Int Float -> [Float] -> [Float] #-} {-# specialize fir :: Array Int Double -> [Double] -> [Double] #-} -fir :: Num a => Array Int a -- ^ h[n]+fir :: (Num a, Eq a) => Array Int a -- ^ h[n] -> [a] -- ^ x[n] -> [a] -- ^ y[n] @@ -41,7 +41,7 @@ where w = listArray (0,m) $ x : replicate m 0 m = snd $ bounds h --- This is for testing the symetric helpers.+-- This is for testing the symmetric helpers. fir0 :: Num a => Array Int a -> [a] -> [a] fir0 _ [] = []@@ -49,7 +49,7 @@ where w = listArray (0,m) $ x : replicate m 0 m = snd $ bounds h --- Asymetric FIR+-- Asymmetric FIR {-# specialize fir'0 :: Array Int Float -> Array Int Float -> [Float] -> [Float] #-} {-# specialize fir'0 :: Array Int Double -> Array Int Double -> [Double] -> [Double] #-}@@ -63,7 +63,7 @@ w' = listArray (0,m) $ x : elems w m = snd $ bounds h --- Type 1: symetric FIR, even order / odd length+-- Type 1: symmetric FIR, even order / odd length {-# specialize fir'1 :: Array Int Float -> Array Int Float -> [Float] -> [Float] #-} {-# specialize fir'1 :: Array Int Double -> Array Int Double -> [Double] -> [Double] #-}@@ -79,7 +79,7 @@ m = snd $ bounds h m2 = m `div` 2 --- Type 2: symetric FIR, odd order / even length+-- Type 2: symmetric FIR, odd order / even length {-# specialize fir'2 :: Array Int Float -> Array Int Float -> [Float] -> [Float] #-} {-# specialize fir'2 :: Array Int Double -> Array Int Double -> [Double] -> [Double] #-}@@ -95,7 +95,7 @@ m = snd $ bounds h m2 = m `div` 2 --- Type 3: anti-symetric FIR, even order / odd length+-- Type 3: anti-symmetric FIR, even order / odd length {-# specialize fir'3 :: Array Int Float -> Array Int Float -> [Float] -> [Float] #-} {-# specialize fir'3 :: Array Int Double -> Array Int Double -> [Double] -> [Double] #-}@@ -111,7 +111,7 @@ m = snd $ bounds h m2 = m `div` 2 --- Type 4: anti-symetric FIR, off order / even length+-- Type 4: anti-symmetric FIR, off order / even length {-# specialize fir'4 :: Array Int Float -> Array Int Float -> [Float] -> [Float] #-} {-# specialize fir'4 :: Array Int Double -> Array Int Double -> [Double] -> [Double] #-}@@ -133,7 +133,7 @@ {-# specialize isFIRType1 :: Array Int Float -> Bool #-} {-# specialize isFIRType1 :: Array Int Double -> Bool #-} -isFIRType1 :: Num a => Array Int a -> Bool+isFIRType1 :: (Num a, Eq a) => Array Int a -> Bool isFIRType1 h = even m && (h' == (reverse h')) where m = snd $ bounds h h' = elems h@@ -141,7 +141,7 @@ {-# specialize isFIRType2 :: Array Int Float -> Bool #-} {-# specialize isFIRType2 :: Array Int Double -> Bool #-} -isFIRType2 :: Num a => Array Int a -> Bool+isFIRType2 :: (Num a, Eq a) => Array Int a -> Bool isFIRType2 h = odd m && (h' == (reverse h')) where m = snd $ bounds h h' = elems h@@ -149,7 +149,7 @@ {-# specialize isFIRType3 :: Array Int Float -> Bool #-} {-# specialize isFIRType3 :: Array Int Double -> Bool #-} -isFIRType3 :: Num a => Array Int a -> Bool+isFIRType3 :: (Num a, Eq a) => Array Int a -> Bool isFIRType3 h = even m && ha == reverse hb where m = snd $ bounds h h' = elems h@@ -160,7 +160,7 @@ {-# specialize isFIRType4 :: Array Int Float -> Bool #-} {-# specialize isFIRType4 :: Array Int Double -> Bool #-} -isFIRType4 :: Num a => Array Int a -> Bool+isFIRType4 :: (Num a, Eq a) => Array Int a -> Bool isFIRType4 h = odd m && ha == reverse hb where m = snd $ bounds h ha = elems h@@ -182,7 +182,7 @@ yt' :: [Double] yt' = fir ht xt --- This checks the symetric routines against fir'0+-- This checks the symmetric routines against fir'0 h1 :: Array Int Double h1 = listArray (0,4) [ 1, 2, 3, 2, 1 ]
DSP/Filter/FIR/Kaiser.hs view
@@ -18,17 +18,17 @@ -- @Book{dsp, -- author = "Alan V. Oppenheim and Ronald W. Schafer", -- title = "Discrete-Time Signal Processing",--- publisher = "Pretice-Hall",+-- publisher = "Prentice-Hall", -- year = 1989, -- address = "Englewood Cliffs",--- series = {Pretice-Hall Signal Processing Series}+-- series = {Prentice-Hall Signal Processing Series} -- } module DSP.Filter.FIR.Kaiser (kaiser_lpf, kaiser_hpf) where import Data.Array -import DSP.Filter.FIR.Window+import DSP.Window import DSP.Filter.FIR.Taps -- Set the cutoff frequency to the middle of the transition band. This
DSP/Filter/FIR/Sharpen.hs view
@@ -36,7 +36,7 @@ -- | Filter shaprening routine -sharpen :: (Num a) => Array Int a -- ^ h[n]+sharpen :: (Num a, Eq a) => Array Int a -- ^ h[n] -> ([a] -> [a]) -- ^ function that implements the sharpened filter sharpen h x = step4
DSP/Filter/FIR/Smooth.hs view
@@ -42,7 +42,7 @@ where m1 (y:ys) = y : map (0.5*) ys p1 (_:ys) = map (0.5*) ys ++ [ 0, 0 ] --- Reflect makes the filter symetric (not sure where this is stated)+-- Reflect makes the filter symmetric (not sure where this is stated) reflect :: Fractional a => [a] -> [a] reflect (x:xs) = (map (0.5*) $ reverse xs) ++ x : (map (0.5*) xs)
DSP/Filter/FIR/Taps.hs view
@@ -18,10 +18,10 @@ @Book{dsp, author = "Alan V. Oppenheim and Ronald W. Schafer", title = "Discrete-Time Signal Processing",- publisher = "Pretice-Hall",+ publisher = "Prentice-Hall", year = 1989, address = "Englewood Cliffs",- series = {Pretice-Hall Signal Processing Series}+ series = {Prentice-Hall Signal Processing Series} } -} @@ -43,21 +43,21 @@ -- Lowpass tap function -lpf_tap :: (Integral a, Floating b) => b -> a -> b -> b+lpf_tap :: (Integral a, Floating b, Eq b) => b -> a -> b -> b lpf_tap wc m n | n-a == 0 = wc / pi | otherwise = sin (wc * (n-a)) / (pi * (n-a)) where a = (fromIntegral m) / 2 -- Highpass tap function -hpf_tap :: (Floating a1, Integral a) => a1 -> a -> a1 -> a1+hpf_tap :: (Integral a, Floating b, Eq b) => b -> a -> b -> b hpf_tap wc m n | n-a == 0 = 1 - wc / pi | otherwise = sin (pi * (n-a)) / (pi * (n-a)) - lpf_tap wc m n where a = (fromIntegral m) / 2 -- Multiband tap function -mbf_tap :: (Floating b, Integral a) => [b] -> [b] -> a -> b -> b+mbf_tap :: (Integral a, Floating b, Eq b) => [b] -> [b] -> a -> b -> b mbf_tap (g:[]) (w:[]) m n = g * lpf_tap w m n mbf_tap (g1:g2:gs) (w:ws) m n = (g1-g2) * lpf_tap w m n + mbf_tap (g2:gs) ws m n mbf_tap _ _ _ _ = error "mbf_tap: bands out of sync"@@ -67,7 +67,7 @@ -- ws = symbol rate in normalized radians -- b = filter beta -rc_tap :: (Integral a, Floating a1) => a1 -> a1 -> a -> a1 -> a1+rc_tap :: (Integral a, Floating b, Eq b) => b -> b -> a -> b -> b rc_tap ws b m n | n-a == 0 = 1 | den == 0 = 0 | otherwise = sin sarg / sarg * cos carg / den@@ -81,7 +81,7 @@ -- | Lowpass filter -lpf :: (Ix a, Integral a, Enum b, Floating b) => b -- ^ wc+lpf :: (Ix a, Integral a, Enum b, Floating b, Eq b) => b -- ^ wc -> a -- ^ M -> Array a b -- ^ h[n] @@ -89,7 +89,7 @@ -- | Highpass filter -hpf :: (Ix a, Integral a, Enum b, Floating b) => b -- ^ wc+hpf :: (Ix a, Integral a, Enum b, Floating b, Eq b) => b -- ^ wc -> a -- ^ M -> Array a b -- ^ h[n] @@ -97,7 +97,7 @@ -- | Bandpass filter -bpf :: (Ix a, Integral a, Enum b, Floating b) => b -- ^ wl+bpf :: (Ix a, Integral a, Enum b, Floating b, Eq b) => b -- ^ wl -> b -- ^ wu -> a -- ^ M -> Array a b -- ^ h[n]@@ -106,7 +106,7 @@ -- | Bandstop filter -bsf :: (Ix a, Integral a, Enum b, Floating b) => b -- ^ wl+bsf :: (Ix a, Integral a, Enum b, Floating b, Eq b) => b -- ^ wl -> b -- ^ wu -> a -- ^ M -> Array a b -- ^ h[n]@@ -115,7 +115,7 @@ -- | Multiband filter -mbf :: (Ix a, Integral a, Enum b, Floating b) => [b] -- ^ [mags]+mbf :: (Ix a, Integral a, Enum b, Floating b, Eq b) => [b] -- ^ [mags] -> [b] -- ^ [w] -> a -- ^ M -> Array a b -- ^ h[n]@@ -124,7 +124,7 @@ -- | Raised-cosine filter -rc :: (Ix a, Integral a, Enum b, Floating b) => b -- ^ ws+rc :: (Ix a, Integral a, Enum b, Floating b, Eq b) => b -- ^ ws -> b -- ^ beta -> a -- ^ M -> Array a b -- ^ h[n]
DSP/Filter/FIR/Window.hs view
@@ -1,172 +1,6 @@--------------------------------------------------------------------------------- |--- Module : DSP.Filter.FIR.Window--- Copyright : (c) Matthew Donadio 1998--- License : GPL------ Maintainer : m.p.donadio@ieee.org--- Stability : experimental--- Portability : portable------ Commonly used window functions. Except for the Parzen window, the--- results of all of these /look/ right, but I have to check them against--- either Matlab or my C code.------ More windowing functions exist, but I have to dig through my papers to--- find the equations.------------------------------------------------------------------------------------- TODO: These functions should probably be reworked to use list--- comprehensions...--{---Reference:--@Book{dsp,- author = "Alan V. Oppenheim and Ronald W. Schafer",- title = "Discrete-Time Signal Processing",- publisher = "Pretice-Hall",- year = 1989,- address = "Englewood Cliffs",- series = {Pretice-Hall Signal Processing Series}-}--@Book{kay,- author = "Steven M. Kay",- title = "Modern Spectral Estimation: Theory \& Application",- publisher = "Prentice Hall",- year = 1988,- address = "Englewood Cliffs",- series = {Pretice-Hall Signal Processing Series}-}---}--module DSP.Filter.FIR.Window- (window, rectangular, bartlett, hanning, hamming, blackman,- kaiser, gen_hamming, parzen) where--import DSP.Basic ((^!))-import Data.Array----- | Applys a window, @w@, to a sequence @x@--window :: Array Int Double -- ^ w[n]- -> Array Int Double -- ^ x[n]- -> Array Int Double -- ^ w[n] * x[n]--window w x = listArray (0,m) [ w!i * x!i | i <- [0..m] ]- where m = snd $ bounds w---- | rectangular window--rectangular :: Int -- ^ M- -> Array Int Double -- ^ w[n]--rectangular m = listArray (0,m) $ repeat 1---- | Bartlett window--bartlett :: Int -- ^ M- -> Array Int Double -- ^ w[n]--bartlett = makeArray bartlett'--bartlett' :: Double -> Double -> Double-bartlett' m n =- if n <= m / 2- then 2 * n / m- else 2 - 2 * n / m---- | Hanning window--hanning :: Int -- ^ M- -> Array Int Double -- ^ w[n]--hanning = makeArray hanning'--hanning' :: Double -> Double -> Double-hanning' m n = 0.5 - 0.5 * cos(2 * pi * n / m)---- | Hamming window--hamming :: Int -- ^ M- -> Array Int Double -- ^ w[n]--hamming = makeArray hamming'--hamming' :: Double -> Double -> Double-hamming' m n = 0.54 - 0.46 * cos(2 * pi * n / m)----- | Blackman window--blackman :: Int -- ^ M- -> Array Int Double -- ^ w[n]--blackman = makeArray blackman'--blackman' :: Double -> Double -> Double-blackman' m n =- 0.42 - 0.5 * cos(2 * pi * n / m) +- 0.08 * cos (4 * pi * n / m)---- | Generalized Hamming window--gen_hamming :: Double -- ^ alpha- -> Int -- ^ M- -> Array Int Double -- ^ w[n]--gen_hamming = makeArray . gen_hamming'--gen_hamming' :: Double -> Double -> Double -> Double-gen_hamming' a m n = a - (1 - a) * cos(2 * pi * n / m)---- | rectangular window--kaiser :: Double -- ^ beta- -> Int -- ^ M- -> Array Int Double -- ^ w[n]--kaiser = makeArray . kaiser'--kaiser' :: Double -> Double -> Double -> Double-kaiser' b m n =- let a = m / 2- in i0 (b * sqrt (1 -((n-a)/a)^!2)) / i0 b----- Recursive computation of I0, the zeroth-order modified Bessel function--- of the first kind.--i0 :: Double -> Double-i0 x = i0' x 2 1--i0' :: Double -> Double -> Double -> Double-i0' x d ds | ds < 1.0e-30 = 1- | otherwise = ds * x^!2 / d^!2 + (i0' x (d+2) (ds * x^!2 / d^!2))---- I don't think this one is correct. Kay's book uses different variable--- conventions and I haven't deciphered them yet...---- | rectangular window--parzen :: Int -- ^ M- -> Array Int Double -- ^ w[n]--parzen = makeArray parzen'--parzen' :: Double -> Double -> Double-parzen' m n =- if n <= m / 2- then 2 * (1-n/m) ^! 3 - (1-2*n/m) ^! 3- else 2 * (1-n/m) ^! 3+module DSP.Filter.FIR.Window {-# DEPRECATED "Use DSP.Window instead" #-} (+ module DSP.Window+ ) where +import DSP.Window -makeArray :: (Double -> Double -> Double) -> Int -> Array Int Double-makeArray win m =- let md = fromIntegral m- in listArray (0,m) $ map (win md . fromIntegral) [(0::Int) ..]
DSP/Filter/IIR/IIR.hs view
@@ -35,10 +35,10 @@ @Book{dsp, author = "Alan V. Oppenheim and Ronald W. Schafer", title = "Discrete-Time Signal Processing",- publisher = "Pretice-Hall",+ publisher = "Prentice-Hall", year = 1989, address = "Englewood Cliffs",- series = {Pretice-Hall Signal Processing Series}+ series = {Prentice-Hall Signal Processing Series} } However, we differ in the convention of the sign of the poles, as@@ -243,7 +243,7 @@ {- specialize iir_df1 :: (Array Int Float, Array Int Float) -> [Float] -> [Float] -} {- specialize iir_df1 :: (Array Int Double, Array Int Double) -> [Double] -> [Double] -} -iir_df1 :: (Num a) => (Array Int a, Array Int a) -- ^ (b,a)+iir_df1 :: (Num a, Eq a) => (Array Int a, Array Int a) -- ^ (b,a) -> [a] -- ^ x[n] -> [a] -- ^ y[n]
DSP/Multirate/Halfband.hs view
@@ -27,7 +27,7 @@ -- | Halfband interpolator -hb_interp :: (Num a) => Array Int a -- ^ h[n]+hb_interp :: (Num a, Eq a) => Array Int a -- ^ h[n] -> [a] -- ^ x[n] -> [a] -- ^ y[n] @@ -39,7 +39,7 @@ -- | Halfband decimator -hb_decim :: (Num a) => Array Int a -- ^ h[n]+hb_decim :: (Num a, Eq a) => Array Int a -- ^ h[n] -> [a] -- ^ x[n] -> [a] -- ^ y[n]
DSP/Multirate/Polyphase.hs view
@@ -29,7 +29,7 @@ -- | Polyphase interpolator -poly_interp :: Num a => Int -- ^ L+poly_interp :: (Num a, Eq a) => Int -- ^ L -> Array Int a -- ^ h[n] -> [a] -- ^ x[n] -> [a] -- ^ y[n]
+ DSP/Window.hs view
@@ -0,0 +1,172 @@+-----------------------------------------------------------------------------+-- |+-- Module : DSP.Window+-- Copyright : (c) Matthew Donadio 1998+-- License : GPL+--+-- Maintainer : m.p.donadio@ieee.org+-- Stability : experimental+-- Portability : portable+--+-- Commonly used window functions. Except for the Parzen window, the+-- results of all of these /look/ right, but I have to check them against+-- either Matlab or my C code.+--+-- More windowing functions exist, but I have to dig through my papers to+-- find the equations.+--+-----------------------------------------------------------------------------++-- TODO: These functions should probably be reworked to use list+-- comprehensions...++{-++Reference:++@Book{dsp,+ author = "Alan V. Oppenheim and Ronald W. Schafer",+ title = "Discrete-Time Signal Processing",+ publisher = "Prentice-Hall",+ year = 1989,+ address = "Englewood Cliffs",+ series = {Prentice-Hall Signal Processing Series}+}++@Book{kay,+ author = "Steven M. Kay",+ title = "Modern Spectral Estimation: Theory \& Application",+ publisher = "Prentice Hall",+ year = 1988,+ address = "Englewood Cliffs",+ series = {Prentice-Hall Signal Processing Series}+}++-}++module DSP.Window+ (window, rectangular, bartlett, hanning, hamming, blackman,+ kaiser, gen_hamming, parzen) where++import DSP.Basic ((^!))+import Data.Array+++-- | Applys a window, @w@, to a sequence @x@++window :: Array Int Double -- ^ w[n]+ -> Array Int Double -- ^ x[n]+ -> Array Int Double -- ^ w[n] * x[n]++window w x = listArray (0,m) [ w!i * x!i | i <- [0..m] ]+ where m = snd $ bounds w++-- | rectangular window++rectangular :: Int -- ^ M+ -> Array Int Double -- ^ w[n]++rectangular m = listArray (0,m) $ repeat 1++-- | Bartlett window++bartlett :: Int -- ^ M+ -> Array Int Double -- ^ w[n]++bartlett = makeArray bartlett'++bartlett' :: Double -> Double -> Double+bartlett' m n =+ if n <= m / 2+ then 2 * n / m+ else 2 - 2 * n / m++-- | Hanning window++hanning :: Int -- ^ M+ -> Array Int Double -- ^ w[n]++hanning = makeArray hanning'++hanning' :: Double -> Double -> Double+hanning' m n = 0.5 - 0.5 * cos(2 * pi * n / m)++-- | Hamming window++hamming :: Int -- ^ M+ -> Array Int Double -- ^ w[n]++hamming = makeArray hamming'++hamming' :: Double -> Double -> Double+hamming' m n = 0.54 - 0.46 * cos(2 * pi * n / m)+++-- | Blackman window++blackman :: Int -- ^ M+ -> Array Int Double -- ^ w[n]++blackman = makeArray blackman'++blackman' :: Double -> Double -> Double+blackman' m n =+ 0.42 - 0.5 * cos(2 * pi * n / m) ++ 0.08 * cos (4 * pi * n / m)++-- | Generalized Hamming window++gen_hamming :: Double -- ^ alpha+ -> Int -- ^ M+ -> Array Int Double -- ^ w[n]++gen_hamming = makeArray . gen_hamming'++gen_hamming' :: Double -> Double -> Double -> Double+gen_hamming' a m n = a - (1 - a) * cos(2 * pi * n / m)++-- | rectangular window++kaiser :: Double -- ^ beta+ -> Int -- ^ M+ -> Array Int Double -- ^ w[n]++kaiser = makeArray . kaiser'++kaiser' :: Double -> Double -> Double -> Double+kaiser' b m n =+ let a = m / 2+ in i0 (b * sqrt (1 -((n-a)/a)^!2)) / i0 b+++-- Recursive computation of I0, the zeroth-order modified Bessel function+-- of the first kind.++i0 :: Double -> Double+i0 x = i0' x 2 1++i0' :: Double -> Double -> Double -> Double+i0' x d ds | ds < 1.0e-30 = 1+ | otherwise = ds * x^!2 / d^!2 + (i0' x (d+2) (ds * x^!2 / d^!2))++-- I don't think this one is correct. Kay's book uses different variable+-- conventions and I haven't deciphered them yet...++-- | rectangular window++parzen :: Int -- ^ M+ -> Array Int Double -- ^ w[n]++parzen = makeArray parzen'++parzen' :: Double -> Double -> Double+parzen' m n =+ if n <= m / 2+ then 2 * (1-n/m) ^! 3 - (1-2*n/m) ^! 3+ else 2 * (1-n/m) ^! 3+++makeArray :: (Double -> Double -> Double) -> Int -> Array Int Double+makeArray win m =+ let md = fromIntegral m+ in listArray (0,m) $ map (win md . fromIntegral) [(0::Int) ..]
− Makefile
@@ -1,117 +0,0 @@-LIBS= Matrix-LIBS+= Polynomial-LIBS+= Numeric-LIBS+= DSP--APPS= FFTBench-APPS+= FFTTest-APPS+= Article-APPS+= IIRDemo-APPS+= FreqDemo-APPS+= NoiseDemo--#OPT= -O -funbox-strict-fields-#OPT+= -fvia-C -O2-for-C--#PROF= -prof -auto-all--#WARN= -W-#WARN= -Wall--#HEAP= -H128m--HC= ghc-5.04.3-#HC= ghc-6.0--GC= green-card--GC_PATH= /usr/local/lib/green-card-GC_LIBS= $(GC_PATH)/StdDIS.o--GSL_PATH= /usr/local/lib-GSL_INC= /usr/local/include-#GSL_LIBS= -lgsl -lgslcblas-GSL_LIBS= -lgsl -lcblas -latlas--TARGET= ffi--GCSRCS= Numeric/Special/Airy.gc-GCSRCS+= Numeric/Special/Bessel.gc-GCSRCS+= Numeric/Special/Clausen.gc-GCSRCS+= Numeric/Special/Ellint.gc-GCSRCS+= Numeric/Special/Elljac.gc-GCSRCS+= Numeric/Special/Erf.gc--GCOBJS= $(GCSRCS:.gc=.o)--HSFLAGS= -fno-glasgow-exts ${OPT} ${PROF} ${WARN} ${HEAP}-HSFLAGS+= -cpp -fffi -package lang -I$(GSL_INC) -i$(GC_PATH) --INSTALLDIR= /usr/home/donadio/lib/hs--URL= http://haskelldsp.sourceforge.net/--.SUFFIXES:-.SUFFIXES: .o .hs .gc--.gc.o:- $(GC) -t $(TARGET) -i $(GC_PATH) $<- $(HC) $(HSFLAGS) -I. -I$(GSL_INC) -i$(GC_PATH) -package-name=Numeric -package lang -c $*.hs -o $*_hs.o- $(HC) $(HSFLAGS) -I. -I$(GSL_INC) -i$(GC_PATH) -package-name=Numeric -package lang -c $*_stub_$(TARGET).c -o $*_stub_$(TARGET).o- $(LD) -r -o $@ $*_hs.o $*_stub_$(TARGET).o-# $(RM) $*.hs - $(RM) $*_stub_$(TARGET).c $*_stub_$(TARGET).h- $(RM) $*_hs.o $*_stub_$(TARGET).o--all: foreign libs--apps:- for f in ${APPS}; do \- $(HC) --make ${HSFLAGS} -o $$f demo/$$f.hs ;\- done--foreign: $(GCOBJS)--libs:- for f in ${LIBS}; do \- find $$f \( -name "*.lhs" -or -name "*.hs" \) -print | xargs $(HC) --make -package-name=$$f ${HSFLAGS} ;\- done--docs:- find ${LIBS} -name "*.hs" -print | xargs haddock -h -o doc -t "Haskell DSP Library" -s "${URL}"--install: #libs- for f in ${LIBS}; do \- rm -f libHS$$f.a HS$$f.o ;\- find $$f -name "*.o" -print | xargs ar cqs libHS$$f.a ;\- ld -r --whole-archive -o HS$$f.o libHS$$f.a ;\- for i in `find $$f -name "*.hi" -print`; do \- mkdir -p `dirname ${INSTALLDIR}/imports/$$i` ;\- install -m 644 $$i ${INSTALLDIR}/imports/$$i ;\- done ;\- install -m 644 libHS$$f.a ${INSTALLDIR} ;\- install -m 644 HS$$f.o ${INSTALLDIR} ;\- installdir=${INSTALLDIR} ghc-pkg -f mpd.conf -u < pkg/$$f.pkg ;\- done--test: test.hs- $(HC) -cpp -package lang -i$(GC_PATH) -L$(GSL_PATH) $(GSL_LIBS) --make -o test test.hs--snapshot:- tar cfz haskelldsp-snapshot.tar.gz ${LIBS} demo doc \- COPYING README TODO Makefile--clean:- find . -name "*.o" -print | xargs rm -f- find . -name "*.hi" -print | xargs rm -f- find . -name "*~" -print | xargs rm -f- rm -f $(GCSRCS:.gc=.hs)- rm -f $(GCSRCS:.gc=_stub_$(TARGET).c)- rm -f $(GCSRCS:.gc=_stub_$(TARGET).h)- rm -f *.a- rm -f *.prof--realclean: clean- rm -f ${APPS}- rm -f *.core- rm -f haskelldsp-snapshot.tar.gz
− Numeric/Special/Airy.gc
@@ -1,276 +0,0 @@-{-# OPTIONS -fffi -fvia-C #-}---------------------------------------------------------------------------------- |--- Module : Numeric.Special.Airy--- Copyright : (c) Matthew Donadio 2003--- License : GPL------ Maintainer : m.p.donadio@ieee.org--- Stability : experimental--- Portability : portable------ FFI to GSL for the Airy functions-----------------------------------------------------------------------------------module Numeric.Special.Airy (airy_Ai, airy_Ai_e,- airy_Ai_scaled, airy_Ai_scaled_e,- airy_Ai_deriv, airy_Ai_deriv_e,- airy_Ai_deriv_scaled, airy_Ai_deriv_scaled_e,- airy_zero_Ai, airy_zero_Ai_e,- airy_zero_Ai_deriv, airy_zero_Ai_deriv_e,- airy_Bi, airy_Bi_e,- airy_Bi_scaled, airy_Bi_scaled_e,- airy_Bi_deriv, airy_Bi_deriv_e,- airy_Bi_deriv_scaled, airy_Bi_deriv_scaled_e,- airy_zero_Bi, airy_zero_Bi_e,- airy_zero_Bi_deriv, airy_zero_Bi_deriv_e- ) where--import StdDIS--import Foreign--%#include <gsl/gsl_errno.h>-%#include <gsl/gsl_sf_airy.h>-----------------------------------------------------------------------------------%fun airy_Ai :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_airy_Ai(x, GSL_PREC_DOUBLE);-%result (double y)--%fun airy_Ai_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_airy_Ai_e(x, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun airy_Ai_scaled :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_airy_Ai_scaled(x, GSL_PREC_DOUBLE);-%result (double y)--%fun airy_Ai_scaled_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_airy_Ai_scaled_e(x, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun airy_Ai_deriv :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_airy_Ai_deriv(x, GSL_PREC_DOUBLE);-%result (double y)--%fun airy_Ai_deriv_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_airy_Ai_deriv_e(x, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun airy_Ai_deriv_scaled :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_airy_Ai_deriv_scaled(x, GSL_PREC_DOUBLE);-%result (double y)--%fun airy_Ai_deriv_scaled_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_airy_Ai_deriv_scaled_e(x, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun airy_zero_Ai :: Int -> Double-%call (int s)-%code double z;-% z = gsl_sf_airy_zero_Ai(s);-%result (double z)--%fun airy_zero_Ai_e :: Int -> (Double, Double)-%call (int s)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_airy_zero_Ai_e(s, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun airy_zero_Ai_deriv :: Int -> Double-%call (int s)-%code double z;-% z = gsl_sf_airy_zero_Ai_deriv(s);-%result (double z)--%fun airy_zero_Ai_deriv_e :: Int -> (Double, Double)-%call (int s)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_airy_zero_Ai_deriv_e(s, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun airy_Bi :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_airy_Bi(x, GSL_PREC_DOUBLE);-%result (double y)--%fun airy_Bi_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_airy_Bi_e(x, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun airy_Bi_scaled :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_airy_Bi_scaled(x, GSL_PREC_DOUBLE);-%result (double y)--%fun airy_Bi_scaled_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_airy_Bi_scaled_e(x, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun airy_Bi_deriv :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_airy_Bi_deriv(x, GSL_PREC_DOUBLE);-%result (double y)--%fun airy_Bi_deriv_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_airy_Bi_deriv_e(x, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun airy_Bi_deriv_scaled :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_airy_Bi_deriv_scaled(x, GSL_PREC_DOUBLE);-%result (double y)--%fun airy_Bi_deriv_scaled_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_airy_Bi_deriv_scaled_e(x, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun airy_zero_Bi :: Int -> Double-%call (int s)-%code double z;-% z = gsl_sf_airy_zero_Bi(s);-%result (double z)--%fun airy_zero_Bi_e :: Int -> (Double, Double)-%call (int s)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_airy_zero_Bi_e(s, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun airy_zero_Bi_deriv :: Int -> Double-%call (int s)-%code double z;-% z = gsl_sf_airy_zero_Bi_deriv(s);-%result (double z)--%fun airy_zero_Bi_deriv_e :: Int -> (Double, Double)-%call (int s)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_airy_zero_Bi_deriv_e(s, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)
− Numeric/Special/Bessel.gc
@@ -1,874 +0,0 @@-{-# OPTIONS -fffi -fvia-C #-}---------------------------------------------------------------------------------- |--- Module : Numeric.Special.Bessel--- Copyright : (c) Matthew Donadio 2003--- License : GPL------ Maintainer : m.p.donadio@ieee.org--- Stability : experimental--- Portability : portable------ FFI to GSL for the Bessel functions-----------------------------------------------------------------------------------module Numeric.Special.Bessel (bessel_J0, bessel_J0_e,- bessel_J1, bessel_J1_e,- bessel_Jn, bessel_Jn_e,-- bessel_Y0, bessel_Y0_e,- bessel_Y1, bessel_Y1_e,- bessel_Yn, bessel_Yn_e,-- bessel_I0, bessel_I0_e,- bessel_I1, bessel_I1_e,- bessel_In, bessel_In_e,-- bessel_I0_scaled, bessel_I0_scaled_e,- bessel_I1_scaled, bessel_I1_scaled_e,- bessel_In_scaled, bessel_In_scaled_e,-- bessel_K0, bessel_K0_e,- bessel_K1, bessel_K1_e,- bessel_Kn, bessel_Kn_e,-- bessel_K0_scaled, bessel_K0_scaled_e,- bessel_K1_scaled, bessel_K1_scaled_e,- bessel_Kn_scaled, bessel_Kn_scaled_e,-- bessel_j0, bessel_j0_e,- bessel_j1, bessel_j1_e,- bessel_jl, bessel_jl_e,-- bessel_y0, bessel_y0_e,- bessel_y1, bessel_y1_e,- bessel_yl, bessel_yl_e,-- bessel_i0_scaled, bessel_i0_scaled_e,- bessel_i1_scaled, bessel_i1_scaled_e,- bessel_il_scaled, bessel_il_scaled_e,-- bessel_k0_scaled, bessel_k0_scaled_e,- bessel_k1_scaled, bessel_k1_scaled_e,- bessel_kl_scaled, bessel_kl_scaled_e,-- bessel_Jnu, bessel_Jnu_e,- bessel_Ynu, bessel_Ynu_e,- bessel_Inu, bessel_Inu_e,- bessel_Inu_scaled, bessel_Inu_scaled_e,- bessel_Knu, bessel_Knu_e,- bessel_Knu_scaled, bessel_Knu_scaled_e,- bessel_lnKnu, bessel_lnKnu_e,-- bessel_zero_J0, bessel_zero_J0_e,- bessel_zero_J1, bessel_zero_J1_e,- bessel_zero_Jnu, bessel_zero_Jnu_e- ) where--import StdDIS--import Foreign--%#include <gsl/gsl_errno.h>-%#include <gsl/gsl_sf_bessel.h>-----------------------------------------------------------------------------------%fun bessel_J0 :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_J0(x);-%result (double y)--%fun bessel_J0_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_J0_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_J1 :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_J1(x);-%result (double y)--%fun bessel_J1_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_J1_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_Jn :: Int -> Double -> Double-%call (int n) (double x)-%code double y;-% y = gsl_sf_bessel_Jn(n, x);-%result (double y)--%fun bessel_Jn_e :: Int -> Double -> (Double, Double)-%call (int n) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_Jn_e(n, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_Y0 :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_Y0(x);-%result (double y)--%fun bessel_Y0_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_Y0_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_Y1 :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_Y1(x);-%result (double y)--%fun bessel_Y1_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_Y1_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_Yn :: Int -> Double -> Double-%call (int n) (double x)-%code double y;-% y = gsl_sf_bessel_Yn(n, x);-%result (double y)--%fun bessel_Yn_e :: Int -> Double -> (Double, Double)-%call (int n) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_Yn_e(n, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_I0 :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_I0(x);-%result (double y)--%fun bessel_I0_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_I0_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_I1 :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_I1(x);-%result (double y)--%fun bessel_I1_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_I1_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_In :: Int -> Double -> Double-%call (int n) (double x)-%code double y;-% y = gsl_sf_bessel_In(n, x);-%result (double y)--%fun bessel_In_e :: Int -> Double -> (Double, Double)-%call (int n) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_In_e(n, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_I0_scaled :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_I0_scaled(x);-%result (double y)--%fun bessel_I0_scaled_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_I0_scaled_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_I1_scaled :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_I1_scaled(x);-%result (double y)--%fun bessel_I1_scaled_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_I1_scaled_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_In_scaled :: Int -> Double -> Double-%call (int n) (double x)-%code double y;-% y = gsl_sf_bessel_In_scaled(n, x);-%result (double y)--%fun bessel_In_scaled_e :: Int -> Double -> (Double, Double)-%call (int n) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_In_scaled_e(n, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_K0 :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_K0(x);-%result (double y)--%fun bessel_K0_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_K0_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_K1 :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_K1(x);-%result (double y)--%fun bessel_K1_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_K1_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_Kn :: Int -> Double -> Double-%call (int n) (double x)-%code double y;-% y = gsl_sf_bessel_Kn(n, x);-%result (double y)--%fun bessel_Kn_e :: Int -> Double -> (Double, Double)-%call (int n) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_Kn_e(n, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)----------------------------------------------------------------------------------%fun bessel_K0_scaled :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_K0_scaled(x);-%result (double y)--%fun bessel_K0_scaled_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_K0_scaled_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_K1_scaled :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_K1_scaled(x);-%result (double y)--%fun bessel_K1_scaled_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_K1_scaled_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_Kn_scaled :: Int -> Double -> Double-%call (int n) (double x)-%code double y;-% y = gsl_sf_bessel_Kn_scaled(n, x);-%result (double y)--%fun bessel_Kn_scaled_e :: Int -> Double -> (Double, Double)-%call (int n) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_Kn_scaled_e(n, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_j0 :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_j0(x);-%result (double y)--%fun bessel_j0_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_j0_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_j1 :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_j1(x);-%result (double y)--%fun bessel_j1_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_j1_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_jl :: Int -> Double -> Double-%call (int n) (double x)-%code double y;-% y = gsl_sf_bessel_jl(n, x);-%result (double y)--%fun bessel_jl_e :: Int -> Double -> (Double, Double)-%call (int l) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_jl_e(l, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_y0 :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_y0(x);-%result (double y)--%fun bessel_y0_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_y0_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_y1 :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_y1(x);-%result (double y)--%fun bessel_y1_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_y1_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_yl :: Int -> Double -> Double-%call (int n) (double x)-%code double y;-% y = gsl_sf_bessel_yl(n, x);-%result (double y)--%fun bessel_yl_e :: Int -> Double -> (Double, Double)-%call (int l) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_yl_e(l, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_i0_scaled :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_i0_scaled(x);-%result (double y)--%fun bessel_i0_scaled_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_i0_scaled_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_i1_scaled :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_i1_scaled(x);-%result (double y)--%fun bessel_i1_scaled_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_i1_scaled_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_il_scaled :: Int -> Double -> Double-%call (int n) (double x)-%code double y;-% y = gsl_sf_bessel_il_scaled(n, x);-%result (double y)--%fun bessel_il_scaled_e :: Int -> Double -> (Double, Double)-%call (int l) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_il_scaled_e(l, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_k0_scaled :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_k0_scaled(x);-%result (double y)--%fun bessel_k0_scaled_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_k0_scaled_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_k1_scaled :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_bessel_k1_scaled(x);-%result (double y)--%fun bessel_k1_scaled_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_k1_scaled_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_kl_scaled :: Int -> Double -> Double-%call (int n) (double x)-%code double y;-% y = gsl_sf_bessel_kl_scaled(n, x);-%result (double y)--%fun bessel_kl_scaled_e :: Int -> Double -> (Double, Double)-%call (int l) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_kl_scaled_e(l, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_Jnu :: Double -> Double -> Double-%call (double nu) (double x)-%code double y;-% y = gsl_sf_bessel_Jnu(nu, x);-%result (double y)--%fun bessel_Jnu_e :: Double -> Double -> (Double, Double)-%call (double nu) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_Jnu_e(nu, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_Ynu :: Double -> Double -> Double-%call (double nu) (double x)-%code double y;-% y = gsl_sf_bessel_Ynu(nu, x);-%result (double y)--%fun bessel_Ynu_e :: Double -> Double -> (Double, Double)-%call (double nu) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_Ynu_e(nu, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_Inu :: Double -> Double -> Double-%call (double nu) (double x)-%code double y;-% y = gsl_sf_bessel_Inu(nu, x);-%result (double y)--%fun bessel_Inu_e :: Double -> Double -> (Double, Double)-%call (double nu) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_Inu_e(nu, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_Inu_scaled :: Double -> Double -> Double-%call (double nu) (double x)-%code double y;-% y = gsl_sf_bessel_Inu_scaled(nu, x);-%result (double y)--%fun bessel_Inu_scaled_e :: Double -> Double -> (Double, Double)-%call (double nu) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_Inu_scaled_e(nu, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_Knu :: Double -> Double -> Double-%call (double nu) (double x)-%code double y;-% y = gsl_sf_bessel_Knu(nu, x);-%result (double y)--%fun bessel_Knu_e :: Double -> Double -> (Double, Double)-%call (double nu) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_Knu_e(nu, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_Knu_scaled :: Double -> Double -> Double-%call (double nu) (double x)-%code double y;-% y = gsl_sf_bessel_Knu_scaled(nu, x);-%result (double y)--%fun bessel_Knu_scaled_e :: Double -> Double -> (Double, Double)-%call (double nu) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_Knu_scaled_e(nu, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_lnKnu :: Double -> Double -> Double-%call (double nu) (double x)-%code double y;-% y = gsl_sf_bessel_lnKnu(nu, x);-%result (double y)--%fun bessel_lnKnu_e :: Double -> Double -> (Double, Double)-%call (double nu) (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_lnKnu_e(nu, x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_zero_J0 :: Int -> Double-%call (int s)-%code double y;-% y = gsl_sf_bessel_zero_J0(s);-%result (double y)--%fun bessel_zero_J0_e :: Int -> (Double, Double)-%call (int s)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_zero_J0_e(s, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_zero_J1 :: Int -> Double-%call (int s)-%code double y;-% y = gsl_sf_bessel_zero_J1(s);-%result (double y)--%fun bessel_zero_J1_e :: Int -> (Double, Double)-%call (int s)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_zero_J1_e(s, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun bessel_zero_Jnu :: Double -> Int -> Double-%call (double nu) (int s)-%code double y;-% y = gsl_sf_bessel_zero_Jnu(nu, s);-%result (double y)--%fun bessel_zero_Jnu_e :: Double -> Int -> (Double, Double)-%call (double nu) (int s)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_bessel_zero_Jnu_e(nu, s, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)
− Numeric/Special/Clausen.gc
@@ -1,45 +0,0 @@-{-# OPTIONS -fffi -fvia-C #-}---------------------------------------------------------------------------------- |--- Module : Numeric.Special.Clausen--- Copyright : (c) Matthew Donadio 2003--- License : GPL------ Maintainer : m.p.donadio@ieee.org--- Stability : experimental--- Portability : portable------ FFI to GSL for the Clausen functions-----------------------------------------------------------------------------------module Numeric.Special.Clausen (clausen, clausen_e,- ) where--import StdDIS--import Foreign--%#include <gsl/gsl_errno.h>-%#include <gsl/gsl_sf_clausen.h>-----------------------------------------------------------------------------------%fun clausen :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_clausen(x);-%result (double y)--%fun clausen_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_clausen_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)
− Numeric/Special/Ellint.gc
@@ -1,234 +0,0 @@-{-# OPTIONS -fffi -fvia-C #-}---------------------------------------------------------------------------------- |--- Module : Numeric.Special.Ellint--- Copyright : (c) Matthew Donadio 2003--- License : GPL------ Maintainer : m.p.donadio@ieee.org--- Stability : experimental--- Portability : portable------ FFI to GSL for the Ellint functions-----------------------------------------------------------------------------------module Numeric.Special.Ellint (ellint_Kcomp, ellint_Kcomp_e,- ellint_Ecomp, ellint_Ecomp_e,- ellint_F, ellint_F_e,- ellint_E, ellint_E_e,- ellint_P, ellint_P_e,- ellint_D, ellint_D_e,- ellint_RC, ellint_RC_e,- ellint_RD, ellint_RD_e,- ellint_RF, ellint_RF_e,- ellint_RJ, ellint_RJ_e- ) where--import StdDIS--import Foreign--%#include <gsl/gsl_errno.h>-%#include <gsl/gsl_sf_ellint.h>-----------------------------------------------------------------------------------%fun ellint_Kcomp :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_ellint_Kcomp(x, GSL_PREC_DOUBLE);-%result (double y)--%fun ellint_Kcomp_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_ellint_Kcomp_e(x, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun ellint_Ecomp :: Double -> Double-%call (double k)-%code double y;-% y = gsl_sf_ellint_Ecomp(k, GSL_PREC_DOUBLE);-%result (double y)--%fun ellint_Ecomp_e :: Double -> (Double, Double)-%call (double k)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_ellint_Ecomp_e(k, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun ellint_F :: Double -> Double -> Double-%call (double phi) (double k)-%code double y;-% y = gsl_sf_ellint_F(phi, k, GSL_PREC_DOUBLE);-%result (double y)--%fun ellint_F_e :: Double -> Double -> (Double, Double)-%call (double phi) (double k)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_ellint_F_e(phi, k, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun ellint_E :: Double -> Double -> Double-%call (double phi) (double k)-%code double y;-% y = gsl_sf_ellint_E(phi, k, GSL_PREC_DOUBLE);-%result (double y)--%fun ellint_E_e :: Double -> Double -> (Double, Double)-%call (double phi) (double k)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_ellint_E_e(phi, k, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun ellint_P :: Double -> Double -> Double -> Double-%call (double phi) (double k) (double n)-%code double y;-% y = gsl_sf_ellint_P(phi, k, n, GSL_PREC_DOUBLE);-%result (double y)--%fun ellint_P_e :: Double -> Double -> Double -> (Double, Double)-%call (double phi) (double k) (double n)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_ellint_P_e(phi, k, n, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun ellint_D :: Double -> Double -> Double -> Double-%call (double phi) (double k) (double n)-%code double y;-% y = gsl_sf_ellint_D(phi, k, n, GSL_PREC_DOUBLE);-%result (double y)--%fun ellint_D_e :: Double -> Double -> Double -> (Double, Double)-%call (double phi) (double k) (double n)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_ellint_D_e(phi, k, n, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun ellint_RC :: Double -> Double -> Double-%call (double x) (double y)-%code double it;-% it = gsl_sf_ellint_RC(x, y, GSL_PREC_DOUBLE);-%result (double it)--%fun ellint_RC_e :: Double -> Double -> (Double, Double)-%call (double x) (double y)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_ellint_RC_e(x, y, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun ellint_RD :: Double -> Double -> Double -> Double-%call (double x) (double y) (double z)-%code double it;-% it = gsl_sf_ellint_RD(x, y, z, GSL_PREC_DOUBLE);-%result (double it)--%fun ellint_RD_e :: Double -> Double -> Double -> (Double, Double)-%call (double x) (double y) (double z)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_ellint_RD_e(x, y, z, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun ellint_RF :: Double -> Double -> Double -> Double-%call (double x) (double y) (double z)-%code double it;-% it = gsl_sf_ellint_RF(x, y, z, GSL_PREC_DOUBLE);-%result (double it)--%fun ellint_RF_e :: Double -> Double -> Double -> (Double, Double)-%call (double x) (double y) (double z)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_ellint_RF_e(x, y, z, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun ellint_RJ :: Double -> Double -> Double -> Double -> Double-%call (double x) (double y) (double z) (double p)-%code double it;-% it = gsl_sf_ellint_RJ(x, y, z, p, GSL_PREC_DOUBLE);-%result (double it)--%fun ellint_RJ_e :: Double -> Double -> Double -> Double -> (Double, Double)-%call (double x) (double y) (double z) (double p)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_ellint_RJ_e(x, y, z, p, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)
− Numeric/Special/Elljac.gc
@@ -1,93 +0,0 @@-{-# OPTIONS -fffi -fvia-C #-}---------------------------------------------------------------------------------- |--- Module : Numeric.Special.Elljac--- Copyright : (c) Matthew Donadio 2003--- License : GPL------ Maintainer : m.p.donadio@ieee.org--- Stability : experimental--- Portability : portable------ FFI to GSL for the Elljac functions-----------------------------------------------------------------------------------module Numeric.Special.Elljac (elljac_e,- elljac_sn_e, elljac_cn_e, elljac_dn_e,- elljac_cd_e, elljac_dc_e, elljac_ns_e,- elljac_sd_e, elljac_nc_e, elljac_ds_e,- elljac_nd_e, elljac_sc_e, elljac_cs_e- ) where--import StdDIS--import Foreign--%#include <gsl/gsl_errno.h>-%#include <gsl/gsl_sf_elljac.h>-----------------------------------------------------------------------------------%fun elljac_e :: Double -> Double -> (Double, Double, Double)-%call (double u) (double m)-%code int status;-% double sn;-% double cn;-% double dn;-% status = gsl_sf_elljac_e(u, m, &sn, &cn, &dn);-%fail {status != 0} {gsl_strerror(status)}-%result (double sn, double cn, double dn)------------------------------------------------------------------------------------- Abramowitz & Stegun, Sec 16.3--elljac_sn_e :: Double -> Double -> Double-elljac_sn_e u m = sn- where (sn,_,_) = elljac_e u m--elljac_cn_e :: Double -> Double -> Double-elljac_cn_e u m = cn- where (_,cn,_) = elljac_e u m--elljac_dn_e :: Double -> Double -> Double-elljac_dn_e u m = dn- where (_,_,dn) = elljac_e u m--elljac_cd_e :: Double -> Double -> Double-elljac_cd_e u m = cn / dn- where (_,cn,dn) = elljac_e u m--elljac_sd_e :: Double -> Double -> Double-elljac_sd_e u m = sn / dn- where (sn,_,dn) = elljac_e u m--elljac_nd_e :: Double -> Double -> Double-elljac_nd_e u m = 1 / dn- where (_,_,dn) = elljac_e u m--elljac_dc_e :: Double -> Double -> Double-elljac_dc_e u m = dn / cn- where (_,cn,dn) = elljac_e u m--elljac_nc_e :: Double -> Double -> Double-elljac_nc_e u m = 1 / cn- where (_,cn,_) = elljac_e u m--elljac_sc_e :: Double -> Double -> Double-elljac_sc_e u m = sn / cn- where (sn,cn,_) = elljac_e u m--elljac_ns_e :: Double -> Double -> Double-elljac_ns_e u m = 1 / sn- where (sn,_,_) = elljac_e u m--elljac_ds_e :: Double -> Double -> Double-elljac_ds_e u m = dn / sn- where (sn,_,dn) = elljac_e u m--elljac_cs_e :: Double -> Double -> Double-elljac_cs_e u m = cn / sn- where (sn,cn,_) = elljac_e u m
− Numeric/Special/Erf.gc
@@ -1,129 +0,0 @@-{-# OPTIONS -fffi -fvia-C #-}---------------------------------------------------------------------------------- |--- Module : Numeric.Special.Erf--- Copyright : (c) Matthew Donadio 2003--- License : GPL------ Maintainer : m.p.donadio@ieee.org--- Stability : experimental--- Portability : portable------ FFI to GSL for the Erf functions-----------------------------------------------------------------------------------module Numeric.Special.Erf (erfc, erfc_e,- log_erfc, log_erfc_e,- erf, erf_e,- erf_Z, erf_Z_e,- erf_Q, erf_Q_e,- ) where--import StdDIS--import Foreign--%#include <gsl/gsl_errno.h>-%#include <gsl/gsl_sf_erf.h>-----------------------------------------------------------------------------------%fun erfc :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_erfc(x);-%result (double y)--%fun erfc_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_erfc_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun log_erfc :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_log_erfc(x);-%result (double y)--%fun log_erfc_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_log_erfc_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun erf :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_erf(x);-%result (double y)--%fun erf_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_erf_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun erf_Z :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_erf_Z(x);-%result (double y)--%fun erf_Z_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_erf_Z_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)-----------------------------------------------------------------------------------%fun erf_Q :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_erf_Q(x);-%result (double y)--%fun erf_Q_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_erf_Q_e(x, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)
− Numeric/Special/Foo.gc
@@ -1,45 +0,0 @@-{-# OPTIONS -fffi -fvia-C #-}---------------------------------------------------------------------------------- |--- Module : Numeric.Special.Foo--- Copyright : (c) Matthew Donadio 2003--- License : GPL------ Maintainer : m.p.donadio@ieee.org--- Stability : experimental--- Portability : portable------ FFI to GSL for the Foo functions-----------------------------------------------------------------------------------module Numeric.Special.Foo (foo_Bar, foo_Bar_e,- ) where--import StdDIS--import Foreign--%#include <gsl/gsl_errno.h>-%#include <gsl/gsl_sf_foo.h>-----------------------------------------------------------------------------------%fun foo_Bar :: Double -> Double-%call (double x)-%code double y;-% y = gsl_sf_foo_Bar(x, GSL_PREC_DOUBLE);-%result (double y)--%fun foo_Bar_e :: Double -> (Double, Double)-%call (double x)-%code int status;-% double val;-% double err;-% gsl_sf_result result;-% status = gsl_sf_foo_Bar_e(x, GSL_PREC_DOUBLE, &result);-% val = result.val;-% err = result.err;-%fail {status != 0} {gsl_strerror(status)}-%result (double val, double err)
Numeric/Statistics/Covariance.hs view
@@ -20,8 +20,6 @@ module Numeric.Statistics.Covariance (cov) where -import Data.List- import Numeric.Statistics.Moment cov :: (Fractional a) => [a] -> [a] -> a
Numeric/Statistics/Median.hs view
@@ -16,7 +16,7 @@ module Numeric.Statistics.Median (median, medianFast) where -import Data.List+import Data.List (sort) -- | Compute the median of a list
Numeric/Statistics/Moment.hs view
@@ -24,8 +24,6 @@ -- TODO: does var passes through the list twice, once to compute the mean of -- the squares, and the other to compute the mean? -import Data.List- -- * Functions -- | Compute the mean of a list
Numeric/Statistics/TTest.hs view
@@ -18,8 +18,6 @@ module Numeric.Statistics.TTest (ttest, tutest, tptest) where -import Data.List- import Numeric.Statistics.Covariance import Numeric.Statistics.Moment
Numeric/Transform/Fourier/CT.hs view
@@ -14,7 +14,7 @@ module Numeric.Transform.Fourier.CT (fft_ct1, fft_ct2) where -import Data.List+import Data.List (transpose) import Data.Array import Data.Complex
+ Numeric/Transform/Fourier/Eigensystem.hs view
@@ -0,0 +1,142 @@+module Numeric.Transform.Fourier.Eigensystem where++import qualified Numeric.Transform.Fourier.FFT as FT+import qualified Data.Complex as Complex+import qualified Data.Array as Array+import Data.Array (Array, Ix, )+++(^!) :: Num a => a -> Int -> a+(^!) = (^)++{-# specialize gaussianPlain :: Int -> Float -> Array Int Float #-}+{-# specialize gaussianPlain :: Int -> Double -> Array Int Double #-}++{- |+For small values of @narrow@ (large width)+it is faster to compute the spectrum of the Gaussian+and apply the Fourier transform on it.+-}+gaussianFourier ::+ (Ix a, Integral a, RealFloat b) =>+ a -- ^ array size+ -> b -- ^ reciprocal of width+ -> Array a b -- ^ X[k]+gaussianFourier n narrow =+ fmap ((/ (narrow*sqrt (fromIntegral n))) . Complex.realPart) $+ FT.rfft $ gaussianPlain n (recip narrow)++gaussianPlain ::+ (Ix a, Integral a, RealFloat b) =>+ a -- ^ array size+ -> b -- ^ reciprocal of width, 1 is the width of the eigenvector+ -> Array a b -- ^ X[k]+gaussianPlain n narrow =+ let nr = fromIntegral n+ in Array.listArray (0,n-1) $+ map (wrappedGaussian 1e-20 (narrow^!2 * nr * pi)) $+ map (/nr) $+ iterate (1+) 0++{- |+For small @c@ the convergence is slow,+but the result will be close to @recip (sqrt c)@.+-}+wrappedGaussian ::+ (RealFloat b) =>+ b -> b -> b -> b+wrappedGaussian tol c x =+ let xpos = iterate (1+) x+ xneg = tail $ iterate (subtract 1) x+ applyTrunc =+ takeWhile ((>=tol) . abs) .+ map (\xi -> exp (- c*xi*xi))+ in sum (applyTrunc xpos) ++ sum (applyTrunc xneg)+++example0 :: ([Double], [Complex.Complex Double])+example0 =+ let c=0.06; n=13 in (map (\k -> (sqrt (pi/c) *) $ sum $ map (\l -> exp (-pi^!2/(n^!2*c)*(k+n*l)^!2)) [-100..100]) [0..n-1], map (\j -> sum $ map (\k -> exp (((-c*k^!2) Complex.:+ 2*pi*j*k/n))) [-100..100]) [0..n-1])++example1 :: (Double, Double)+example1 =+ let c=0.3 in (sum $ map (\k -> exp(-pi*k^!2/c)) [-100..100], sqrt c * sum (map (\k -> exp(-pi*k^!2*c)) [-100..100]))++exampleAlgebraicDouble :: (Double, Double)+exampleAlgebraicDouble =+ (sum $ map (\k -> exp(-pi*k^!2)) [-100..100], sqrt (4 - sqrt 8) * sum (map (\k -> exp(-pi*2*k^!2)) [-100..100]))++{-+I checked polynomials up to degree 9+and there does not seem to be one,+that has the ratio of the numbers as root.++exampleAlgebraicTriple :: (Double, Double)+exampleAlgebraicTriple =+ (sum $ map (\k -> exp(-pi*k^!2)) [-100..100], sum (map (\k -> exp(-pi*3*k^!2)) [-100..100]))+-}++exampleAlgebraicQuadro :: (Double, Double)+exampleAlgebraicQuadro =+ let a = (2-sqrt(2*sqrt 2)) * (2 + sqrt 2)+ _b = 4 / (2 + sqrt(sqrt 8)) :: Double+ in (sum $ map (\k -> exp(-pi*k^!2)) [-100..100], a * sum (map (\k -> exp(-pi*4*k^!2)) [-100..100]))++exampleAlgebraicHalf :: (Double, Double)+exampleAlgebraicHalf =+ (sum $ map (\k -> exp(-pi*k^!2)) [-100..100], sqrt (2 - sqrt 2) * sum (map (\k -> exp(-pi/2*k^!2)) [-100..100]))++exampleAlgebraicFourth :: (Double, Double)+exampleAlgebraicFourth =+ let a = (2-sqrt(2*sqrt 2)) * (2+sqrt 2)/2+ _b = 2/(2+sqrt(sqrt 8)) :: Double+ in (sum $ map (\k -> exp(-pi*k^!2)) [-100..100], a * sum (map (\k -> exp(-pi/4*k^!2)) [-100..100]))++exampleAlgebraic2 :: (Double, Double)+exampleAlgebraic2 =+ let n=2 in (sum $ map (\k -> exp(-pi*n*k^!2)) [-100..100], (1+sqrt 2) * sum (map (\k -> exp(-pi*n*(k+1/n)^!2)) [-100..100]))+{-+a = 1+sqrt 2+a - 1 = sqrt 2+(a - 1)^2 = 2+0 = -1 - 2*a + a^2+-}++exampleAlgebraic3 :: (Double, Double)+exampleAlgebraic3 =+ let n=3 in (sum $ map (\k -> exp(-pi*n*k^!2)) [-100..100], (1+sqrt 3) * sum (map (\k -> exp(-pi*n*(k+1/n)^!2)) [-100..100]))+{-+0 = -2 - 2*a + a^2+-}++exampleAlgebraic4 :: [Double]+exampleAlgebraic4 =+ let n=4 in zipWith (*) [1, 1+sqrt(sqrt 2), (1+sqrt(sqrt 2))/(sqrt(sqrt 2)-1), 1+sqrt(sqrt 2)] $ map (\j -> sum (map (\k -> exp(-pi*n*(k+j/n)^!2)) [-100..100])) [0..n-1]+{-+0 = -1 - 4*a + 6*a^2 - 4*a^3 + a^4+0 = 1 - 12*b + 6*b^2 - 12*b^3 + b^4+-}++exampleAlgebraic5 :: [Double]+exampleAlgebraic5 =+ let n=5; a=1.8743053964841243; b=11.833898536015248 in zipWith (*) [1, a, b, a, 1] $ map (\j -> sum (map (\k -> exp(-pi*n*(k+j/n)^!2)) [-100..100])) [0..n-1]+{-+This must be a linear combination of+(goldenRatio, 1, 0, 0, 1)+(goldenRatio, 0, 1, 1, 0)++with goldenRatio = (1+sqrt 5)/2++0=-4*a^0-4*a^1+26*a^2-14*a^3+a^4+0=-4*b^0-4*b^1+26*b^2-14*b^3+b^4+-}++++{-+ToDo:+ - efficient computation of 2-norm of the discrete Gaussian+ - investigate eigenfunctions including Gaussian and Hermite polynomials+ - is there an algebraic ratio between exampleAlgebraicTriple and exampleAlgebraicSixtimes+-}
Numeric/Transform/Fourier/FFT.hs view
@@ -16,7 +16,6 @@ module Numeric.Transform.Fourier.FFT (fft, ifft, rfft, irfft, r2fft) where -import Data.List import Data.Array import Data.Complex
Numeric/Transform/Fourier/FFTUtils.hs view
@@ -28,7 +28,7 @@ magsq :: RealFloat a => Complex a -> a magsq (x:+y) = x*x + y*y -log10 :: Floating a => a -> a+log10 :: (Floating a, Eq a) => a -> a log10 0 = -1.0e9 log10 x = logBase 10 x @@ -111,12 +111,11 @@ FilePath -> Array i e -> IO () write_cvector f x = do let n = (snd $ bounds x) + 1- h <- openFile f WriteMode- sequence $ map (hPrintIndex h n) $ assocs $ x- hClose h+ withFile f WriteMode $ \h ->+ mapM_ (hPrintIndex h n) $ assocs x write_fft_info :: (Ix i, Integral i) =>- [Char] -> Array i (Complex Double) -> IO ()+ String -> Array i (Complex Double) -> IO () write_fft_info b x = do let (mag,db,arg,grd) = fft_info x write_cvector (b ++ "_mag.out") mag@@ -127,11 +126,10 @@ write_rvector :: Show e => FilePath -> Array Int e -> IO () write_rvector f x = do let n = (snd $ bounds x) + 1- h <- openFile f WriteMode- sequence $ map (hPrintIndex h n) $ take (n `div` 2) $ assocs $ x- hClose h+ withFile f WriteMode $ \h ->+ mapM_ (hPrintIndex h n) $ take (n `div` 2) $ assocs x -write_rfft_info :: [Char] -> Array Int Double -> IO ()+write_rfft_info :: String -> Array Int Double -> IO () write_rfft_info b x = do let (mag,db,arg,grd) = rfft_info x write_rvector (b ++ "_mag.out") mag
Numeric/Transform/Fourier/PFA.hs view
@@ -14,7 +14,7 @@ module Numeric.Transform.Fourier.PFA (fft_pfa) where -import Data.List+import Data.List (transpose) import Data.Array import Data.Complex
Numeric/Transform/Fourier/R2DIF.hs view
@@ -15,7 +15,6 @@ module Numeric.Transform.Fourier.R2DIF (fft_r2dif) where import DSP.Basic (interleave)-import Data.List import Data.Array import Data.Complex
Numeric/Transform/Fourier/R2DIT.hs view
@@ -14,7 +14,6 @@ module Numeric.Transform.Fourier.R2DIT (fft_r2dit) where -import Data.List import Data.Array import Data.Complex
Numeric/Transform/Fourier/R4DIF.hs view
@@ -15,7 +15,6 @@ module Numeric.Transform.Fourier.R4DIF (fft_r4dif) where import DSP.Basic (interleave)-import Data.List import Data.Array import Data.Complex
Numeric/Transform/Fourier/Rader.hs view
@@ -14,7 +14,6 @@ module Numeric.Transform.Fourier.Rader (fft_rader1, fft_rader2) where -import Data.List import Data.Array import Data.Complex
Numeric/Transform/Fourier/SRDIF.hs view
@@ -15,7 +15,6 @@ module Numeric.Transform.Fourier.SRDIF (fft_srdif) where import DSP.Basic (interleave)--- import Data.List import Data.Array import Data.Complex
dsp.cabal view
@@ -1,46 +1,51 @@ Name: dsp-Version: 0.2.1+Version: 0.2.2 License: GPL License-File: COPYING Copyright: Matt Donadio, 2003 Author: Matt Donadio <m.p.donadio@ieee.org> Maintainer: Henning Thielemann <haskell@henning-thielemann.de> Stability: Experimental-Homepage: http://haskelldsp.sourceforge.net/-Package-URL: http://darcs.haskell.org/dsp/+Homepage: http://www.haskell.org/haskellwiki/DSP+-- Homepage: http://haskelldsp.sourceforge.net/ Synopsis: Haskell Digital Signal Processing Description: Digital Signal Processing, Fourier Transform, Linear Algebra, Interpolation-Category: Sound+Category: Sound, Math Tested-With: GHC==6.4.1, GHC==6.8.2-Cabal-Version: >=1.2+Tested-With: GHC==7.4.2, GHC==7.6.3+Cabal-Version: >=1.6 Build-Type: Simple Extra-Source-Files:- Numeric/Special/Airy.gc- Numeric/Special/Erf.gc- Numeric/Special/Foo.gc- Numeric/Special/Clausen.gc- Numeric/Special/Bessel.gc- Numeric/Special/Elljac.gc- Numeric/Special/Ellint.gc demo/Article.hs demo/FFTBench.hs demo/FFTTest.hs demo/FreqDemo.hs demo/IIRDemo.hs demo/NoiseDemo.hs- Makefile +Source-Repository this+ Tag: 0.2.2+ Type: darcs+ Location: http://code.haskell.org/~thielema/dsp/++Source-Repository head+ Type: darcs+ Location: http://code.haskell.org/~thielema/dsp/+ Flag splitBase description: Choose the new smaller, split-up base package. Library- Build-Depends: mtl If flag(splitBase)- Build-Depends: base >= 2, array, random+ Build-Depends:+ array >=0.1 && <0.5,+ random >=1.0 && <1.1,+ base >= 2 && <5 Else- Build-Depends: base >= 1.0 && < 2+ Build-Depends:+ base >=1.0 && <2 GHC-Options: -Wall Exposed-modules:@@ -81,6 +86,7 @@ DSP.Source.Basic DSP.Source.Oscillator DSP.Unwrap+ DSP.Window Matrix.Cholesky Matrix.LU Matrix.Levinson@@ -122,6 +128,8 @@ Polynomial.Maclaurin Polynomial.Roots DSP.Filter.IIR.Cookbook+ Other-Modules:+ Numeric.Transform.Fourier.Eigensystem -- Executable: -- Article.hs