module DSP.Filter.FIR.PolyInterp where
import Data.Array
import Polynomial.Basic
mkcoef :: (Num a, Ix b, Integral b) => (a -> a)
-> b
-> a
-> Array b a
mkcoef f p x = listArray (0,p1) $ map f [ x fromIntegral i | i <- [p1..p2] ]
where p1 = (p `div` 2 1)
p2 = p `div` 2
bspline_1p0o :: (Ord a, Fractional a) => a -> a
bspline_1p0o x | 0 <= x && x < 1 = polyeval [ 1 ] x
| otherwise = 0
bspline_2p1o :: (Ord a, Fractional a) => a -> a
bspline_2p1o x | 0 <= x && x < 1 = polyeval [ 1, 1 ] x
| 1 <= x = 0
| otherwise = bspline_2p1o (x)
bspline_4p3o :: (Ord a, Fractional a) => a -> a
bspline_4p3o x | 0 <= x && x < 1 = polyeval [ 2/3, 0, 1, 1/2 ] x
| 1 <= x && x < 2 = polyeval [ 4/3, 2, 1, 1/6 ] x
| 2 <= x = 0
| otherwise = bspline_4p3o (x)
bspline_6p5o :: (Ord a, Fractional a) => a -> a
bspline_6p5o x | 0 <= x && x < 1 = polyeval [ 11/20, 0, 1/2, 0, 1/4, 1/12 ] x
| 1 <= x && x < 2 = polyeval [ 17/40, 5/8, 7/4, 5/4, 3/8, 1/24 ] x
| 2 <= x && x < 3 = polyeval [ 81/40, 27/8, 9/4, 3/4, 1/8, 1/120 ] x
| 3 <= x = 0
| otherwise = bspline_6p5o (x)
lagrange_4p3o :: (Ord a, Fractional a) => a -> a
lagrange_4p3o x | 0 <= x && x < 1 = polyeval [ 1, 1/2, 1, 1/2 ] x
| 1 <= x && x < 2 = polyeval [ 1, 11/6, 1, 1/6 ] x
| 2 <= x = 0
| otherwise = lagrange_4p3o (x)
lagrange_6p5o :: (Ord a, Fractional a) => a -> a
lagrange_6p5o x | 0 <= x && x < 1 = polyeval [ 1, 1/3, 5/4, 5/12, 1/4, 1/12 ] x
| 1 <= x && x < 2 = polyeval [ 1, 13/12, 5/8, 25/24, 3/8, 1/24 ] x
| 2 <= x && x < 3 = polyeval [ 1, 137/60, 15/8, 17/24, 1/8, 1/120 ] x
| 3 <= x = 0
| otherwise = lagrange_6p5o (x)
hermite_4p3o :: (Ord a, Fractional a) => a -> a
hermite_4p3o x | 0 <= x && x < 1 = polyeval [ 1, 0, 5/2, 3/2 ] x
| 1 <= x && x < 2 = polyeval [ 2, 4, 5/2, 1/2 ] x
| 2 <= x = 0
| otherwise = hermite_4p3o (x)
hermite_6p3o :: (Ord a, Fractional a) => a -> a
hermite_6p3o x | 0 <= x && x < 1 = polyeval [ 1, 0, 7/3, 4/3 ] x
| 1 <= x && x < 2 = polyeval [ 5/2, 59/12, 3, 7/12 ] x
| 2 <= x && x < 3 = polyeval [ 3/2, 7/4, 2/3, 1/12 ] x
| 3 <= x = 0
| otherwise = hermite_6p3o (x)
hermite_6p5o :: (Ord a, Fractional a) => a -> a
hermite_6p5o x | 0 <= x && x < 1 = polyeval [ 1, 0, 25/12, 5/12, 13/12, 5/12 ] x
| 1 <= x && x < 2 = polyeval [ 1, 5/12, 35/8, 35/8, 13/8, 5/24 ] x
| 2 <= x && x < 3 = polyeval [ 3, 29/4, 155/24, 65/24, 13/24, 1/24 ] x
| 3 <= x = 0
| otherwise = hermite_6p5o (x)
sndosc_4p5o :: (Ord a, Fractional a) => a -> a
sndosc_4p5o x | 0 <= x && x < 1 = polyeval [ 1, 0, 1, 9/2, 15/2, 3 ] x
| 1 <= x && x < 2 = polyeval [ 4, 18, 29, 43/2, 15/2, 1 ] x
| 2 <= x = 0
| otherwise = sndosc_4p5o (x)
sndosc_6p5o :: (Ord a, Fractional a) => a -> a
sndosc_6p5o x | 0 <= x && x < 1 = polyeval [ 1, 0, 5/4, 35/12, 21/4, 25/12 ] x
| 1 <= x && x < 2 = polyeval [ 4, 75/4, 245/8, 545/24, 63/8, 25/24 ] x
| 2 <= x && x < 3 = polyeval [ 18, 153/4, 255/8, 313/24, 21/8, 5/24 ] x
| 3 <= x = 0
| otherwise = sndosc_6p5o (x)
watte_4p2o :: (Ord a, Fractional a) => a -> a
watte_4p2o x | 0 <= x && x < 1 = polyeval [ 1, 1/2, 1/2 ] x
| 1 <= x && x < 2 = polyeval [ 1, 3/2, 1/2 ] x
| 2 <= x = 0
| otherwise = watte_4p2o (x)
parabolic2x_4p2o :: (Ord a, Fractional a) => a -> a
parabolic2x_4p2o x | 0 <= x && x < 1 = polyeval [ 1/2, 0, 1/4 ] x
| 1 <= x && x < 2 = polyeval [ 1, 1, 1/4 ] x
| 2 <= x = 0
| otherwise = parabolic2x_4p2o (x)
optimal_2p3o2x :: (Ord a, Fractional a) => a -> a
optimal_2p3o2x x | 0 <= x && x < 1 = polyeval [ 0.80607906469176971, 0.17594740788514596,
2.35977550974341630, 1.57015627178718420 ] x
| 1 <= x = 0
| otherwise = optimal_2p3o2x (x)
optimal_2p3o4x :: (Ord a, Fractional a) => a -> a
optimal_2p3o4x x | 0 <= x && x < 1 = polyeval [ 0.88207975731800936, 0.10012219395448523,
1.99054787320203810, 1.32598918957298410 ] x
| 1 <= x = 0
| otherwise = optimal_2p3o4x (x)
optimal_2p3o8x :: (Ord a, Fractional a) => a -> a
optimal_2p3o8x x | 0 <= x && x < 1 = polyeval [ 0.94001491168487883, 0.51213628865925998,
1.10319974084152170, 0.73514591836770027 ] x
| 1 <= x = 0
| otherwise = optimal_2p3o8x (x)
optimal_2p3o16x :: (Ord a, Fractional a) => a -> a
optimal_2p3o16x x | 0 <= x && x < 1 = polyeval [ 0.96964782067188493, 0.74617479745643256,
0.57923093055631791, 0.38606621963374965 ] x
| 1 <= x = 0
| otherwise = optimal_2p3o16x (x)
optimal_2p3o32x :: (Ord a, Fractional a) => a -> a
optimal_2p3o32x x | 0 <= x && x < 1 = polyeval [ 0.98472017575676363, 0.87053863725307623,
0.29667081825572522, 0.19775766248673177 ] x
| 1 <= x = 0
| otherwise = optimal_2p3o32x (x)
optimal_4p2o2x :: (Ord a, Fractional a) => a -> a
optimal_4p2o2x x | 0 <= x && x < 1 = polyeval [ 0.50061662213752656, 0.04782068534965925,
0.21343978756177684 ] x
| 1 <= x && x < 2 = polyeval [ 0.92770135528027386, 0.88689658749623701,
0.21303593243799016 ] x
| 2 <= x = 0
| otherwise = optimal_4p2o2x (x)
optimal_4p2o4x :: (Ord a, Fractional a) => a -> a
optimal_4p2o4x x | 0 <= x && x < 1 = polyeval [ 0.33820365736567115, 0.2114449807519728,
0.22865399531858188 ] x
| 1 <= x && x < 2 = polyeval [ 1.12014639874555470, 1.01414466618792900,
0.22858390767180370 ] x
| 2 <= x = 0
| otherwise = optimal_4p2o4x (x)
optimal_4p2o8x :: (Ord a, Fractional a) => a -> a
optimal_4p2o8x x | 0 <= x && x < 1 = polyeval [ 0.09224718574204172, 0.59257579283164508,
0.24005206207889518 ] x
| 1 <= x && x < 2 = polyeval [ 1.38828036063664320, 1.17126532964206100,
0.24004281672637814 ] x
| 2 <= x = 0
| otherwise = optimal_4p2o8x (x)
optimal_4p2o16x :: (Ord a, Fractional a) => a -> a
optimal_4p2o16x x | 0 <= x && x < 1 = polyeval [ 0.41849525763976203, 1.36361593203840510,
0.24506117865474364 ] x
| 1 <= x && x < 2 = polyeval [ 1.90873339502208310, 1.44144384373471430,
0.24506002360805534 ] x
| 2 <= x = 0
| otherwise = optimal_4p2o16x (x)
optimal_4p2o32x :: (Ord a, Fractional a) => a -> a
optimal_4p2o32x x | 0 <= x && x < 1 = polyeval [ 1.42170796824052890, 2.87083485132510450,
0.24755243839713828 ] x
| 1 <= x && x < 2 = polyeval [ 2.91684291662070860, 1.95043794419108290,
0.24755229501840223 ] x
| 2 <= x = 0
| otherwise = optimal_4p2o32x (x)
optimal_4p3o2x :: (Ord a, Fractional a) => a -> a
optimal_4p3o2x x | 0 <= x && x < 1 = polyeval [ 0.59244492420272321, 0.03573669883299365,
0.78664888597764893, 0.36030925263849456 ] x
| 1 <= x && x < 2 = polyeval [ 1.20220428331406090, 1.60101160971478710,
0.70401463131621556, 0.10174985775982505 ] x
| 2 <= x = 0
| otherwise = optimal_4p3o2x (x)
optimal_4p3o4x :: (Ord a, Fractional a) => a -> a
optimal_4p3o4x x | 0 <= x && x < 1 = polyeval [ 0.60304009430474115, 0.05694012453786401,
0.89223007211175309, 0.42912649274763925 ] x
| 1 <= x && x < 2 = polyeval [ 1.31228823423882930, 1.85072890189700660,
0.87687351895686727, 0.13963062613760227 ] x
| 2 <= x = 0
| otherwise = optimal_4p3o4x (x)
optimal_4p3o8x :: (Ord a, Fractional a) => a -> a
optimal_4p3o8x x | 0 <= x && x < 1 = polyeval [ 0.60658368706046584, 0.07280793921972525,
0.95149675410360302, 0.46789242171187317 ] x
| 1 <= x && x < 2 = polyeval [ 1.35919815911169020, 1.95618744839533010,
0.94949311590826524, 0.15551896027602030 ] x
| 2 <= x = 0
| otherwise = optimal_4p3o8x (x)
optimal_4p3o16x :: (Ord a, Fractional a) => a -> a
optimal_4p3o16x x | 0 <= x && x < 1 = polyeval [ 0.60844825096346644, 0.07980169577604959,
0.97894238166068270, 0.48601256046234864 ] x
| 1 <= x && x < 2 = polyeval [ 1.37724137476464990, 1.99807048591354810,
0.97870442828560433, 0.16195131297091253 ] x
| 2 <= x = 0
| otherwise = optimal_4p3o16x (x)
optimal_4p3o32x :: (Ord a, Fractional a) => a -> a
optimal_4p3o32x x | 0 <= x && x < 1 = polyeval [ 0.60908264223655417, 0.08298544053689563,
0.99052586766084594, 0.49369595780454456 ] x
| 1 <= x && x < 2 = polyeval [ 1.38455689452848450, 2.01496368680360890,
0.99049753216621961, 0.16455902278580614 ] x
| 2 <= x = 0
| otherwise = optimal_4p3o32x (x)
optimal_4p4o2x :: (Ord a, Fractional a) => a -> a
optimal_4p4o2x x | 0 <= x && x < 1 = polyeval [ 0.58448510036125145, 0.04442540676862300,
0.7586487041827807, 0.29412762852131868,
0.04252164479749607 ] x
| 1 <= x && x < 2 = polyeval [ 1.06598379704160570, 1.16581445347275190,
0.21256821036268256, 0.13781898240764315,
0.04289144034653719 ] x
| 2 <= x = 0
| otherwise = optimal_4p4o2x (x)
optimal_4p4o4x :: (Ord a, Fractional a) => a -> a
optimal_4p4o4x x | 0 <= x && x < 1 = polyeval [ 0.61340295990566229, 0.06128937679587994,
0.94057832565094635, 0.44922093286355397,
0.00986988334359864 ] x
| 1 <= x && x < 2 = polyeval [ 1.30835018075821670, 1.82814511658458520,
0.81943257721092366, 0.09642760567543440,
0.00989340017126506 ] x
| 2 <= x = 0
| otherwise = optimal_4p4o4x (x)
optimal_4p4o8x :: (Ord a, Fractional a) => a -> a
optimal_4p4o8x x | 0 <= x && x < 1 = polyeval [ 0.62095991632974834, 0.06389302461261143,
0.98489647972932193, 0.48698871865064902,
0.00255074537015887 ] x
| 1 <= x && x < 2 = polyeval [ 1.35943398999940390, 1.97277963497287720,
0.95410568622888214, 0.14868053358928229,
0.00255226912537286 ] x
| 2 <= x = 0
| otherwise = optimal_4p4o8x (x)
optimal_4p4o16x :: (Ord a, Fractional a) => a -> a
optimal_4p4o16x x | 0 <= x && x < 1 = polyeval [ 0.62293049365660191, 0.06443376638262904,
0.99620011474430481, 0.49672182806667398,
0.00064264050033187 ] x
| 1 <= x && x < 2 = polyeval [ 1.37216269878963180, 2.00931632449031920,
0.98847675044522398, 0.16214364417487748,
0.00064273459469381 ] x
| 2 <= x = 0
| otherwise = optimal_4p4o16x (x)
optimal_4p4o32x :: (Ord a, Fractional a) => a -> a
optimal_4p4o32x x | 0 <= x && x < 1 = polyeval [ 0.62342449465938121, 0.06456923251842608,
0.99904509583176049, 0.49917660509564427,
0.00016095224137360 ] x
| 1 <= x && x < 2 = polyeval [ 1.37534629142898650, 2.01847637982642340,
0.99711292321092770, 0.16553360612350931,
0.00016095810460478 ] x
| 2 <= x = 0
| otherwise = optimal_4p4o32x (x)
optimal_6p4o2x :: (Ord a, Fractional a) => a -> a
optimal_6p4o2x x | 0 <= x && x < 1 = polyeval [ 0.42640922432669054, 0.0052558029434142,
0.20486985491012843, 0.00255494211547300,
0.03134095684084392 ] x
| 1 <= x && x < 2 = polyeval [ 0.30902529029941583, 0.37868437559565432,
0.70564644117967990, 0.31182026815653541,
0.04385804833432710 ] x
| 2 <= x && x < 3 = polyeval [ 1.51897639740576910, 1.83761742915820410,
0.83217835730406542, 0.16695522597587154,
0.01249475765486819 ] x
| 3 <= x = 0
| otherwise = optimal_6p4o2x (x)
optimal_6p4o4x :: (Ord a, Fractional a) => a -> a
optimal_6p4o4x x | 0 <= x && x < 1 = polyeval [ 0.20167941634921072, 0.06119274485321008,
0.56468711069379207, 0.42059475673758634,
0.02881527997393852 ] x
| 1 <= x && x < 2 = polyeval [ 0.64579641436229407, 2.33580825807694700,
1.85350543411307390, 0.51926458031522660,
0.04250898918476453 ] x
| 2 <= x && x < 3 = polyeval [ 2.76228852293285200, 3.09936092833253300,
1.27147464005834010, 0.22283280665600644,
0.01369173779618459 ] x
| 3 <= x = 0
| otherwise = optimal_6p4o4x (x)
optimal_6p4o8x :: (Ord a, Fractional a) => a -> a
optimal_6p4o8x x | 0 <= x && x < 1 = polyeval [ 0.17436452172055789, 0.15190225510786248,
1.87551558979819120, 1.15976496200057480,
0.03401038103941584 ] x
| 1 <= x && x < 2 = polyeval [ 2.26955357035241170, 5.73320660746477540,
3.92391712129699590, 0.93463067895166918,
0.05090907029392906 ] x
| 2 <= x && x < 3 = polyeval [ 4.84834508915762540, 5.25661448354449060,
2.04584149450148180, 0.32814290420019698,
0.01689861603514873 ] x
| 3 <= x = 0
| otherwise = optimal_6p4o8x (x)
optimal_6p4o16x :: (Ord a, Fractional a) => a -> a
optimal_6p4o16x x | 0 <= x && x < 1 = polyeval [ 0.94730014688427577, 0.33649680079382827,
4.53807483241466340, 2.64598691215356660,
0.03755086455339280 ] x
| 1 <= x && x < 2 = polyeval [ 5.55035312316726960, 12.52871168241192600,
7.98288364772738750, 1.70665858343069510,
0.05631219122315393 ] x
| 2 <= x && x < 3 = polyeval [ 8.94785524286246310, 9.37021675593126700,
3.44447036756440590, 0.49470749109917245,
0.01876132424143207 ] x
| 3 <= x = 0
| otherwise = optimal_6p4o16x (x)
optimal_6p4o32x :: (Ord a, Fractional a) => a -> a
optimal_6p4o32x x | 0 <= x && x < 1 = polyeval [ 2.44391738331193720, 0.69468212315980082,
9.67889243081689440, 5.50592307590218160,
0.03957507923965987 ] x
| 1 <= x && x < 2 = polyeval [ 11.87524595267807600, 25.58633277328986500,
15.73068663442630400, 3.15288929279855570,
0.05936083498715066 ] x
| 2 <= x && x < 3 = polyeval [ 16.79403235763479100, 17.17264148794549100,
6.05175140696421730, 0.79053754554850286,
0.01978575568000696 ] x
| 3 <= x = 0
| otherwise = optimal_6p4o32x (x)
optimal_6p5o2x :: (Ord a, Fractional a) => a -> a
optimal_6p5o2x x | 0 <= x && x < 1 = polyeval [ 0.48217702203158502, 0.00127577239632662,
0.3267507171395277, 0.02014846731685776,
0.14640674192652170, 0.04317950185225609 ] x
| 1 <= x && x < 2 = polyeval [ 0.35095903476754237, 0.53534756396439365,
1.22477236472789920, 0.74995484587342742,
0.19234043023690772, 0.01802814255926417 ] x
| 2 <= x && x < 3 = polyeval [ 1.62814578813495040, 2.26168360510917840,
1.22220278720010690, 0.31577407091450355,
0.03768876199398620, 0.00152170021558204 ] x
| 3 <= x = 0
| otherwise = optimal_6p5o2x (x)
optimal_6p5o4x :: (Ord a, Fractional a) => a -> a
optimal_6p5o4x x | 0 <= x && x < 1 = polyeval [ 0.50164509338655083, 0.00256790184606694,
0.36229943140977111, 0.04512026308730401,
0.20620318519804220, 0.06607747864416924 ] x
| 1 <= x && x < 2 = polyeval [ 0.30718330223223800, 0.78336433172501685,
1.66940481896969310, 1.08365113099941970,
0.30560854964737405, 0.03255079211953620 ] x
| 2 <= x && x < 3 = polyeval [ 2.05191571792256240, 3.19403437421534920,
1.99766476840488070, 0.62765808573554227,
0.09909173357642603, 0.00628989632244913 ] x
| 3 <= x = 0
| otherwise = optimal_6p5o4x (x)
optimal_6p5o8x :: (Ord a, Fractional a) => a -> a
optimal_6p5o8x x | 0 <= x && x < 1 = polyeval [ 0.50513183702821474, 0.00368143670114908,
0.36434084624989699, 0.06070462616102962,
0.22942797169644802, 0.07517133281176167 ] x
| 1 <= x && x < 2 = polyeval [ 0.28281884957695946, 0.88385964850687193,
1.82581238657617080, 1.19588167464050650,
0.34363487882262922, 0.03751837438141215 ] x
| 2 <= x && x < 3 = polyeval [ 2.15756386503245070, 3.42137079071284810,
2.18592382088982260, 0.70370361187427199,
0.11419603882898799, 0.00747588873055296 ] x
| 3 <= x = 0
| otherwise = optimal_6p5o8x (x)
optimal_6p5o16x :: (Ord a, Fractional a) => a -> a
optimal_6p5o16x x | 0 <= x && x < 1 = polyeval [ 0.50819303579369868, 0.00387117789818541,
0.36990908725555449, 0.06616250180411522,
0.24139298776307896, 0.07990500783668089 ] x
| 1 <= x && x < 2 = polyeval [ 0.27758734130911511, 0.91870010875159547,
1.89281840112089440, 1.24834464824612510,
0.36203450650610985, 0.03994519162531633 ] x
| 2 <= x && x < 3 = polyeval [ 2.19284545406407450, 3.50786533926449100,
2.26228244623301580, 0.73559668875725392,
0.12064126711558003, 0.00798609327859495 ] x
| 3 <= x = 0
| otherwise = optimal_6p5o16x (x)
optimal_6p5o32x :: (Ord a, Fractional a) => a -> a
optimal_6p5o32x x | 0 <= x && x < 1 = polyeval [ 0.52558916128536759, 0.00010896283126635,
0.42682321682847008, 0.04095676092513167,
0.25041444762720882, 0.08349799235675044 ] x
| 1 <= x && x < 2 = polyeval [ 0.33937904183610190, 0.80946953063234006,
1.86228986389877100, 1.27215033630638800,
0.37562266426589430, 0.04174912841630993 ] x
| 2 <= x && x < 3 = polyeval [ 2.13606003964474490, 3.48774662195185850,
2.28912105276248390, 0.75510203509083995,
0.12520821766375972, 0.00834987866042734 ] x
| 3 <= x = 0
| otherwise = optimal_6p5o32x (x)