From ccfeb203024e7bc46fb2159695c2737342def134 Mon Sep 17 00:00:00 2001 From: jdpigeon Date: Sat, 3 Mar 2018 13:36:30 -0500 Subject: [PATCH 1/2] Added zeropadding to fft.forward --- coverage/coverage.json | 1 + coverage/lcov-report/base.css | 182 ++ coverage/lcov-report/index.html | 73 + coverage/lcov-report/prettify.css | 1 + coverage/lcov-report/prettify.js | 1 + coverage/lcov-report/sort-arrow-sprite.png | Bin 0 -> 209 bytes coverage/lcov-report/sorter.js | 156 ++ coverage/lcov-report/src/calcCascades.js.html | 423 +++++ coverage/lcov-report/src/fft.js.html | 1551 +++++++++++++++++ coverage/lcov-report/src/firCoeffs.js.html | 453 +++++ coverage/lcov-report/src/firFilter.js.html | 384 ++++ coverage/lcov-report/src/iirCoeffs.js.html | 891 ++++++++++ coverage/lcov-report/src/iirFilter.js.html | 837 +++++++++ coverage/lcov-report/src/index.html | 151 ++ coverage/lcov-report/src/utils.js.html | 618 +++++++ coverage/lcov.info | 1236 +++++++++++++ dist/fili.js | 11 +- dist/fili.min.js | 4 +- src/fft.js | 963 +++++----- test/fft.js | 12 + 20 files changed, 7468 insertions(+), 480 deletions(-) create mode 100644 coverage/coverage.json create mode 100644 coverage/lcov-report/base.css create mode 100644 coverage/lcov-report/index.html create mode 100644 coverage/lcov-report/prettify.css create mode 100644 coverage/lcov-report/prettify.js create mode 100644 coverage/lcov-report/sort-arrow-sprite.png create mode 100644 coverage/lcov-report/sorter.js create mode 100644 coverage/lcov-report/src/calcCascades.js.html create mode 100644 coverage/lcov-report/src/fft.js.html create mode 100644 coverage/lcov-report/src/firCoeffs.js.html create mode 100644 coverage/lcov-report/src/firFilter.js.html create mode 100644 coverage/lcov-report/src/iirCoeffs.js.html create mode 100644 coverage/lcov-report/src/iirFilter.js.html create mode 100644 coverage/lcov-report/src/index.html create mode 100644 coverage/lcov-report/src/utils.js.html create mode 100644 coverage/lcov.info diff --git a/coverage/coverage.json b/coverage/coverage.json new file mode 100644 index 0000000..8683948 --- /dev/null +++ b/coverage/coverage.json @@ -0,0 +1 @@ +{"/home/dano/fili.js/src/fft.js":{"path":"/home/dano/fili.js/src/fft.js","s":{"1":1,"2":2,"3":2,"4":1,"5":1,"6":2,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":8191,"22":8191,"23":1,"24":1,"25":1,"26":1,"27":8192,"28":8192,"29":1,"30":8191,"31":8191,"32":8178,"33":8178,"34":8191,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":8193,"43":1,"44":1,"45":8193,"46":8193,"47":8193,"48":8193,"49":8193,"50":8193,"51":8193,"52":2049,"53":6144,"54":2048,"55":4096,"56":8193,"57":8193,"58":8193,"59":8193,"60":8193,"61":8193,"62":8193,"63":8193,"64":8193,"65":8193,"66":8193,"67":8193,"68":8193,"69":8193,"70":8193,"71":8193,"72":8193,"73":8193,"74":8193,"75":8193,"76":8193,"77":8193,"78":8193,"79":8193,"80":8193,"81":8193,"82":8193,"83":8193,"84":8193,"85":8193,"86":8193,"87":8193,"88":8193,"89":8193,"90":8193,"91":8193,"92":8193,"93":8193,"94":8193,"95":8193,"96":8193,"97":8193,"98":8193,"99":8193,"100":8193,"101":8193,"102":8193,"103":8193,"104":8193,"105":8193,"106":8193,"107":8193,"108":8193,"109":8193,"110":8193,"111":8193,"112":8193,"113":8193,"114":8193,"115":8193,"116":8193,"117":8193,"118":1,"119":303143,"120":303141,"121":74,"122":303141,"123":303141,"124":2,"125":1,"126":39,"127":1,"128":1,"129":38,"130":1,"131":39,"132":39,"133":39,"134":39,"135":39,"136":39,"137":37,"138":303104,"139":303104,"140":2,"141":16384,"142":39,"143":319488,"144":319488,"145":39,"146":507,"147":507,"148":507,"149":507,"150":319449,"151":319449,"152":319449,"153":2076672,"154":2076672,"155":2076672,"156":2076672,"157":2076672,"158":2076672,"159":2076672,"160":319449,"161":39,"162":1,"163":1,"164":1,"165":8192,"166":8192,"167":8192,"168":1,"169":13,"170":13,"171":13,"172":13,"173":8191,"174":8191,"175":8191,"176":53248,"177":53248,"178":53248,"179":53248,"180":53248,"181":53248,"182":53248,"183":8191,"184":1,"185":8192,"186":1,"187":1,"188":1,"189":8192,"190":1,"191":1,"192":1,"193":8192,"194":1,"195":1,"196":1,"197":8192,"198":1,"199":2,"200":2,"201":74,"202":2,"203":1,"204":1},"b":{"1":[1,1],"2":[1,1],"3":[1,8191],"4":[2049,6144],"5":[2048,4096],"6":[303141,2],"7":[74,303067],"8":[1,38],"9":[37,2]},"f":{"1":2,"2":2,"3":8193,"4":8193,"5":8193,"6":8193,"7":8193,"8":8193,"9":8193,"10":8193,"11":8193,"12":8193,"13":8193,"14":8193,"15":8193,"16":8193,"17":8193,"18":8193,"19":8193,"20":8193,"21":8193,"22":8193,"23":8193,"24":8193,"25":8193,"26":8193,"27":8193,"28":8193,"29":8193,"30":8193,"31":8193,"32":8193,"33":8193,"34":8193,"35":8193,"36":8193,"37":8193,"38":8193,"39":8193,"40":8193,"41":303143,"42":39,"43":39,"44":1,"45":1,"46":1,"47":1,"48":2},"fnMap":{"1":{"name":"Fft","line":3,"loc":{"start":{"line":3,"column":10},"end":{"line":3,"column":30}}},"2":{"name":"isPowerOfTwo","line":4,"loc":{"start":{"line":4,"column":21},"end":{"line":4,"column":50}}},"3":{"name":"sinc","line":58,"loc":{"start":{"line":58,"column":13},"end":{"line":58,"column":30}}},"4":{"name":"calc","line":65,"loc":{"start":{"line":65,"column":12},"end":{"line":65,"column":28}}},"5":{"name":"calc","line":72,"loc":{"start":{"line":72,"column":12},"end":{"line":72,"column":28}}},"6":{"name":"calc","line":79,"loc":{"start":{"line":79,"column":12},"end":{"line":79,"column":32}}},"7":{"name":"calc","line":87,"loc":{"start":{"line":87,"column":12},"end":{"line":87,"column":32}}},"8":{"name":"calc","line":95,"loc":{"start":{"line":95,"column":12},"end":{"line":95,"column":35}}},"9":{"name":"calc","line":108,"loc":{"start":{"line":108,"column":12},"end":{"line":108,"column":32}}},"10":{"name":"calc","line":115,"loc":{"start":{"line":115,"column":12},"end":{"line":115,"column":32}}},"11":{"name":"calc","line":122,"loc":{"start":{"line":122,"column":12},"end":{"line":122,"column":32}}},"12":{"name":"calc","line":129,"loc":{"start":{"line":129,"column":12},"end":{"line":129,"column":32}}},"13":{"name":"calc","line":136,"loc":{"start":{"line":136,"column":12},"end":{"line":136,"column":35}}},"14":{"name":"calc","line":143,"loc":{"start":{"line":143,"column":12},"end":{"line":143,"column":32}}},"15":{"name":"calc","line":151,"loc":{"start":{"line":151,"column":12},"end":{"line":151,"column":35}}},"16":{"name":"calc","line":162,"loc":{"start":{"line":162,"column":12},"end":{"line":162,"column":32}}},"17":{"name":"calc","line":170,"loc":{"start":{"line":170,"column":12},"end":{"line":170,"column":32}}},"18":{"name":"calc","line":178,"loc":{"start":{"line":178,"column":12},"end":{"line":178,"column":32}}},"19":{"name":"calc","line":186,"loc":{"start":{"line":186,"column":12},"end":{"line":186,"column":32}}},"20":{"name":"calc","line":194,"loc":{"start":{"line":194,"column":12},"end":{"line":194,"column":32}}},"21":{"name":"calc","line":202,"loc":{"start":{"line":202,"column":12},"end":{"line":202,"column":32}}},"22":{"name":"calc","line":210,"loc":{"start":{"line":210,"column":12},"end":{"line":210,"column":32}}},"23":{"name":"calc","line":218,"loc":{"start":{"line":218,"column":12},"end":{"line":218,"column":32}}},"24":{"name":"calc","line":227,"loc":{"start":{"line":227,"column":12},"end":{"line":227,"column":32}}},"25":{"name":"calc","line":235,"loc":{"start":{"line":235,"column":12},"end":{"line":235,"column":32}}},"26":{"name":"calc","line":243,"loc":{"start":{"line":243,"column":12},"end":{"line":243,"column":32}}},"27":{"name":"calc","line":252,"loc":{"start":{"line":252,"column":12},"end":{"line":252,"column":32}}},"28":{"name":"calc","line":260,"loc":{"start":{"line":260,"column":12},"end":{"line":260,"column":32}}},"29":{"name":"calc","line":268,"loc":{"start":{"line":268,"column":12},"end":{"line":268,"column":32}}},"30":{"name":"calc","line":276,"loc":{"start":{"line":276,"column":12},"end":{"line":276,"column":32}}},"31":{"name":"calc","line":284,"loc":{"start":{"line":284,"column":12},"end":{"line":284,"column":32}}},"32":{"name":"calc","line":292,"loc":{"start":{"line":292,"column":12},"end":{"line":292,"column":32}}},"33":{"name":"calc","line":300,"loc":{"start":{"line":300,"column":12},"end":{"line":300,"column":32}}},"34":{"name":"calc","line":308,"loc":{"start":{"line":308,"column":12},"end":{"line":308,"column":32}}},"35":{"name":"calc","line":316,"loc":{"start":{"line":316,"column":12},"end":{"line":316,"column":32}}},"36":{"name":"calc","line":324,"loc":{"start":{"line":324,"column":12},"end":{"line":324,"column":32}}},"37":{"name":"calc","line":332,"loc":{"start":{"line":332,"column":12},"end":{"line":332,"column":32}}},"38":{"name":"calc","line":340,"loc":{"start":{"line":340,"column":12},"end":{"line":340,"column":32}}},"39":{"name":"calc","line":348,"loc":{"start":{"line":348,"column":12},"end":{"line":348,"column":32}}},"40":{"name":"calc","line":356,"loc":{"start":{"line":356,"column":12},"end":{"line":356,"column":32}}},"41":{"name":"windowFunctions","line":365,"loc":{"start":{"line":365,"column":24},"end":{"line":365,"column":57}}},"42":{"name":"zeroPad","line":376,"loc":{"start":{"line":376,"column":16},"end":{"line":376,"column":52}}},"43":{"name":"forward","line":385,"loc":{"start":{"line":385,"column":13},"end":{"line":385,"column":41}}},"44":{"name":"inverse","line":436,"loc":{"start":{"line":436,"column":13},"end":{"line":436,"column":38}}},"45":{"name":"magnitude","line":470,"loc":{"start":{"line":470,"column":15},"end":{"line":470,"column":42}}},"46":{"name":"magToDb","line":477,"loc":{"start":{"line":477,"column":13},"end":{"line":477,"column":33}}},"47":{"name":"phase","line":484,"loc":{"start":{"line":484,"column":11},"end":{"line":484,"column":34}}},"48":{"name":"windows","line":491,"loc":{"start":{"line":491,"column":13},"end":{"line":491,"column":32}}}},"statementMap":{"1":{"start":{"line":3,"column":0},"end":{"line":500,"column":2}},"2":{"start":{"line":4,"column":2},"end":{"line":9,"column":4}},"3":{"start":{"line":5,"column":4},"end":{"line":7,"column":5}},"4":{"start":{"line":6,"column":6},"end":{"line":6,"column":18}},"5":{"start":{"line":8,"column":4},"end":{"line":8,"column":17}},"6":{"start":{"line":11,"column":2},"end":{"line":13,"column":3}},"7":{"start":{"line":12,"column":4},"end":{"line":12,"column":17}},"8":{"start":{"line":15,"column":2},"end":{"line":15,"column":15}},"9":{"start":{"line":16,"column":2},"end":{"line":16,"column":21}},"10":{"start":{"line":17,"column":2},"end":{"line":17,"column":39}},"11":{"start":{"line":18,"column":2},"end":{"line":18,"column":35}},"12":{"start":{"line":19,"column":2},"end":{"line":19,"column":35}},"13":{"start":{"line":20,"column":2},"end":{"line":20,"column":36}},"14":{"start":{"line":21,"column":2},"end":{"line":21,"column":36}},"15":{"start":{"line":23,"column":2},"end":{"line":23,"column":38}},"16":{"start":{"line":24,"column":2},"end":{"line":24,"column":45}},"17":{"start":{"line":25,"column":2},"end":{"line":25,"column":45}},"18":{"start":{"line":26,"column":2},"end":{"line":26,"column":24}},"19":{"start":{"line":27,"column":2},"end":{"line":27,"column":52}},"20":{"start":{"line":29,"column":2},"end":{"line":32,"column":3}},"21":{"start":{"line":30,"column":4},"end":{"line":30,"column":50}},"22":{"start":{"line":31,"column":4},"end":{"line":31,"column":50}},"23":{"start":{"line":34,"column":2},"end":{"line":34,"column":22}},"24":{"start":{"line":35,"column":2},"end":{"line":35,"column":12}},"25":{"start":{"line":36,"column":2},"end":{"line":36,"column":12}},"26":{"start":{"line":37,"column":2},"end":{"line":48,"column":3}},"27":{"start":{"line":38,"column":4},"end":{"line":38,"column":23}},"28":{"start":{"line":39,"column":4},"end":{"line":41,"column":5}},"29":{"start":{"line":40,"column":6},"end":{"line":40,"column":12}},"30":{"start":{"line":42,"column":4},"end":{"line":42,"column":14}},"31":{"start":{"line":43,"column":4},"end":{"line":46,"column":5}},"32":{"start":{"line":44,"column":6},"end":{"line":44,"column":16}},"33":{"start":{"line":45,"column":6},"end":{"line":45,"column":17}},"34":{"start":{"line":47,"column":4},"end":{"line":47,"column":14}},"35":{"start":{"line":52,"column":2},"end":{"line":52,"column":19}},"36":{"start":{"line":53,"column":2},"end":{"line":53,"column":24}},"37":{"start":{"line":54,"column":2},"end":{"line":54,"column":21}},"38":{"start":{"line":55,"column":2},"end":{"line":55,"column":21}},"39":{"start":{"line":56,"column":2},"end":{"line":56,"column":21}},"40":{"start":{"line":57,"column":2},"end":{"line":57,"column":21}},"41":{"start":{"line":58,"column":2},"end":{"line":60,"column":4}},"42":{"start":{"line":59,"column":4},"end":{"line":59,"column":34}},"43":{"start":{"line":61,"column":2},"end":{"line":61,"column":17}},"44":{"start":{"line":63,"column":2},"end":{"line":363,"column":4}},"45":{"start":{"line":66,"column":8},"end":{"line":66,"column":17}},"46":{"start":{"line":73,"column":8},"end":{"line":73,"column":17}},"47":{"start":{"line":80,"column":8},"end":{"line":80,"column":34}},"48":{"start":{"line":81,"column":8},"end":{"line":81,"column":34}},"49":{"start":{"line":88,"column":8},"end":{"line":88,"column":34}},"50":{"start":{"line":89,"column":8},"end":{"line":89,"column":36}},"51":{"start":{"line":96,"column":8},"end":{"line":102,"column":9}},"52":{"start":{"line":97,"column":10},"end":{"line":97,"column":67}},"53":{"start":{"line":98,"column":15},"end":{"line":102,"column":9}},"54":{"start":{"line":99,"column":10},"end":{"line":99,"column":75}},"55":{"start":{"line":101,"column":10},"end":{"line":101,"column":19}},"56":{"start":{"line":109,"column":8},"end":{"line":109,"column":37}},"57":{"start":{"line":116,"column":8},"end":{"line":116,"column":41}},"58":{"start":{"line":123,"column":8},"end":{"line":123,"column":66}},"59":{"start":{"line":130,"column":8},"end":{"line":130,"column":66}},"60":{"start":{"line":137,"column":8},"end":{"line":137,"column":76}},"61":{"start":{"line":144,"column":8},"end":{"line":144,"column":34}},"62":{"start":{"line":145,"column":8},"end":{"line":145,"column":68}},"63":{"start":{"line":152,"column":8},"end":{"line":152,"column":29}},"64":{"start":{"line":153,"column":8},"end":{"line":153,"column":21}},"65":{"start":{"line":154,"column":8},"end":{"line":154,"column":23}},"66":{"start":{"line":155,"column":8},"end":{"line":155,"column":34}},"67":{"start":{"line":156,"column":8},"end":{"line":156,"column":50}},"68":{"start":{"line":163,"column":8},"end":{"line":163,"column":34}},"69":{"start":{"line":164,"column":8},"end":{"line":164,"column":88}},"70":{"start":{"line":171,"column":8},"end":{"line":171,"column":34}},"71":{"start":{"line":172,"column":8},"end":{"line":172,"column":57}},"72":{"start":{"line":179,"column":8},"end":{"line":179,"column":34}},"73":{"start":{"line":180,"column":8},"end":{"line":180,"column":61}},"74":{"start":{"line":187,"column":8},"end":{"line":187,"column":34}},"75":{"start":{"line":188,"column":8},"end":{"line":188,"column":70}},"76":{"start":{"line":195,"column":8},"end":{"line":195,"column":34}},"77":{"start":{"line":196,"column":8},"end":{"line":196,"column":86}},"78":{"start":{"line":203,"column":8},"end":{"line":203,"column":34}},"79":{"start":{"line":204,"column":8},"end":{"line":204,"column":92}},"80":{"start":{"line":211,"column":8},"end":{"line":211,"column":34}},"81":{"start":{"line":212,"column":8},"end":{"line":212,"column":92}},"82":{"start":{"line":219,"column":8},"end":{"line":219,"column":34}},"83":{"start":{"line":220,"column":8},"end":{"line":220,"column":96}},"84":{"start":{"line":228,"column":8},"end":{"line":228,"column":34}},"85":{"start":{"line":229,"column":8},"end":{"line":229,"column":61}},"86":{"start":{"line":236,"column":8},"end":{"line":236,"column":34}},"87":{"start":{"line":237,"column":8},"end":{"line":237,"column":88}},"88":{"start":{"line":244,"column":8},"end":{"line":244,"column":34}},"89":{"start":{"line":245,"column":8},"end":{"line":245,"column":110}},"90":{"start":{"line":253,"column":8},"end":{"line":253,"column":34}},"91":{"start":{"line":254,"column":8},"end":{"line":254,"column":65}},"92":{"start":{"line":261,"column":8},"end":{"line":261,"column":34}},"93":{"start":{"line":262,"column":8},"end":{"line":262,"column":93}},"94":{"start":{"line":269,"column":8},"end":{"line":269,"column":34}},"95":{"start":{"line":270,"column":8},"end":{"line":270,"column":117}},"96":{"start":{"line":277,"column":8},"end":{"line":277,"column":34}},"97":{"start":{"line":278,"column":8},"end":{"line":278,"column":71}},"98":{"start":{"line":285,"column":8},"end":{"line":285,"column":34}},"99":{"start":{"line":286,"column":8},"end":{"line":286,"column":103}},"100":{"start":{"line":293,"column":8},"end":{"line":293,"column":34}},"101":{"start":{"line":294,"column":8},"end":{"line":294,"column":103}},"102":{"start":{"line":301,"column":8},"end":{"line":301,"column":34}},"103":{"start":{"line":302,"column":8},"end":{"line":302,"column":90}},"104":{"start":{"line":309,"column":8},"end":{"line":309,"column":34}},"105":{"start":{"line":310,"column":8},"end":{"line":310,"column":120}},"106":{"start":{"line":317,"column":8},"end":{"line":317,"column":34}},"107":{"start":{"line":318,"column":8},"end":{"line":318,"column":117}},"108":{"start":{"line":325,"column":8},"end":{"line":325,"column":34}},"109":{"start":{"line":326,"column":8},"end":{"line":326,"column":146}},"110":{"start":{"line":333,"column":8},"end":{"line":333,"column":34}},"111":{"start":{"line":334,"column":8},"end":{"line":334,"column":176}},"112":{"start":{"line":341,"column":8},"end":{"line":341,"column":34}},"113":{"start":{"line":342,"column":8},"end":{"line":342,"column":202}},"114":{"start":{"line":349,"column":8},"end":{"line":349,"column":34}},"115":{"start":{"line":350,"column":8},"end":{"line":350,"column":282}},"116":{"start":{"line":357,"column":8},"end":{"line":357,"column":34}},"117":{"start":{"line":358,"column":8},"end":{"line":358,"column":321}},"118":{"start":{"line":365,"column":2},"end":{"line":374,"column":4}},"119":{"start":{"line":366,"column":4},"end":{"line":372,"column":5}},"120":{"start":{"line":367,"column":6},"end":{"line":369,"column":7}},"121":{"start":{"line":368,"column":8},"end":{"line":368,"column":57}},"122":{"start":{"line":370,"column":6},"end":{"line":370,"column":166}},"123":{"start":{"line":371,"column":6},"end":{"line":371,"column":61}},"124":{"start":{"line":373,"column":4},"end":{"line":373,"column":49}},"125":{"start":{"line":376,"column":2},"end":{"line":382,"column":4}},"126":{"start":{"line":377,"column":4},"end":{"line":380,"column":5}},"127":{"start":{"line":378,"column":6},"end":{"line":378,"column":153}},"128":{"start":{"line":379,"column":6},"end":{"line":379,"column":73}},"129":{"start":{"line":381,"column":4},"end":{"line":381,"column":18}},"130":{"start":{"line":384,"column":2},"end":{"line":498,"column":4}},"131":{"start":{"line":386,"column":6},"end":{"line":386,"column":49}},"132":{"start":{"line":387,"column":6},"end":{"line":387,"column":28}},"133":{"start":{"line":388,"column":6},"end":{"line":393,"column":8}},"134":{"start":{"line":394,"column":6},"end":{"line":394,"column":24}},"135":{"start":{"line":395,"column":6},"end":{"line":395,"column":43}},"136":{"start":{"line":396,"column":6},"end":{"line":405,"column":7}},"137":{"start":{"line":397,"column":8},"end":{"line":400,"column":9}},"138":{"start":{"line":398,"column":10},"end":{"line":398,"column":28}},"139":{"start":{"line":399,"column":10},"end":{"line":399,"column":62}},"140":{"start":{"line":402,"column":8},"end":{"line":404,"column":9}},"141":{"start":{"line":403,"column":10},"end":{"line":403,"column":38}},"142":{"start":{"line":407,"column":6},"end":{"line":410,"column":7}},"143":{"start":{"line":408,"column":8},"end":{"line":408,"column":47}},"144":{"start":{"line":409,"column":8},"end":{"line":409,"column":24}},"145":{"start":{"line":412,"column":6},"end":{"line":430,"column":7}},"146":{"start":{"line":413,"column":8},"end":{"line":413,"column":14}},"147":{"start":{"line":414,"column":8},"end":{"line":414,"column":19}},"148":{"start":{"line":415,"column":8},"end":{"line":415,"column":19}},"149":{"start":{"line":416,"column":8},"end":{"line":429,"column":9}},"150":{"start":{"line":417,"column":10},"end":{"line":417,"column":30}},"151":{"start":{"line":418,"column":10},"end":{"line":418,"column":30}},"152":{"start":{"line":419,"column":10},"end":{"line":427,"column":11}},"153":{"start":{"line":420,"column":12},"end":{"line":420,"column":23}},"154":{"start":{"line":421,"column":12},"end":{"line":421,"column":49}},"155":{"start":{"line":422,"column":12},"end":{"line":422,"column":49}},"156":{"start":{"line":423,"column":12},"end":{"line":423,"column":40}},"157":{"start":{"line":424,"column":12},"end":{"line":424,"column":28}},"158":{"start":{"line":425,"column":12},"end":{"line":425,"column":40}},"159":{"start":{"line":426,"column":12},"end":{"line":426,"column":28}},"160":{"start":{"line":428,"column":10},"end":{"line":428,"column":17}},"161":{"start":{"line":431,"column":6},"end":{"line":434,"column":8}},"162":{"start":{"line":437,"column":6},"end":{"line":437,"column":49}},"163":{"start":{"line":438,"column":6},"end":{"line":438,"column":20}},"164":{"start":{"line":439,"column":6},"end":{"line":443,"column":7}},"165":{"start":{"line":440,"column":8},"end":{"line":440,"column":27}},"166":{"start":{"line":441,"column":8},"end":{"line":441,"column":27}},"167":{"start":{"line":442,"column":8},"end":{"line":442,"column":28}},"168":{"start":{"line":445,"column":6},"end":{"line":463,"column":7}},"169":{"start":{"line":446,"column":8},"end":{"line":446,"column":14}},"170":{"start":{"line":447,"column":8},"end":{"line":447,"column":19}},"171":{"start":{"line":448,"column":8},"end":{"line":448,"column":19}},"172":{"start":{"line":449,"column":8},"end":{"line":462,"column":9}},"173":{"start":{"line":450,"column":10},"end":{"line":450,"column":30}},"174":{"start":{"line":451,"column":10},"end":{"line":451,"column":30}},"175":{"start":{"line":452,"column":10},"end":{"line":460,"column":11}},"176":{"start":{"line":453,"column":12},"end":{"line":453,"column":23}},"177":{"start":{"line":454,"column":12},"end":{"line":454,"column":51}},"178":{"start":{"line":455,"column":12},"end":{"line":455,"column":51}},"179":{"start":{"line":456,"column":12},"end":{"line":456,"column":42}},"180":{"start":{"line":457,"column":12},"end":{"line":457,"column":29}},"181":{"start":{"line":458,"column":12},"end":{"line":458,"column":42}},"182":{"start":{"line":459,"column":12},"end":{"line":459,"column":29}},"183":{"start":{"line":461,"column":10},"end":{"line":461,"column":17}},"184":{"start":{"line":465,"column":6},"end":{"line":467,"column":7}},"185":{"start":{"line":466,"column":8},"end":{"line":466,"column":39}},"186":{"start":{"line":468,"column":6},"end":{"line":468,"column":24}},"187":{"start":{"line":471,"column":6},"end":{"line":471,"column":19}},"188":{"start":{"line":472,"column":6},"end":{"line":474,"column":7}},"189":{"start":{"line":473,"column":8},"end":{"line":473,"column":95}},"190":{"start":{"line":475,"column":6},"end":{"line":475,"column":17}},"191":{"start":{"line":478,"column":6},"end":{"line":478,"column":19}},"192":{"start":{"line":479,"column":6},"end":{"line":481,"column":7}},"193":{"start":{"line":480,"column":8},"end":{"line":480,"column":54}},"194":{"start":{"line":482,"column":6},"end":{"line":482,"column":17}},"195":{"start":{"line":485,"column":6},"end":{"line":485,"column":19}},"196":{"start":{"line":486,"column":6},"end":{"line":488,"column":7}},"197":{"start":{"line":487,"column":8},"end":{"line":487,"column":61}},"198":{"start":{"line":489,"column":6},"end":{"line":489,"column":17}},"199":{"start":{"line":492,"column":6},"end":{"line":492,"column":24}},"200":{"start":{"line":493,"column":6},"end":{"line":495,"column":7}},"201":{"start":{"line":494,"column":8},"end":{"line":494,"column":25}},"202":{"start":{"line":496,"column":6},"end":{"line":496,"column":22}},"203":{"start":{"line":499,"column":2},"end":{"line":499,"column":14}},"204":{"start":{"line":502,"column":0},"end":{"line":502,"column":21}}},"branchMap":{"1":{"line":5,"type":"if","locations":[{"start":{"line":5,"column":4},"end":{"line":5,"column":4}},{"start":{"line":5,"column":4},"end":{"line":5,"column":4}}]},"2":{"line":11,"type":"if","locations":[{"start":{"line":11,"column":2},"end":{"line":11,"column":2}},{"start":{"line":11,"column":2},"end":{"line":11,"column":2}}]},"3":{"line":39,"type":"if","locations":[{"start":{"line":39,"column":4},"end":{"line":39,"column":4}},{"start":{"line":39,"column":4},"end":{"line":39,"column":4}}]},"4":{"line":96,"type":"if","locations":[{"start":{"line":96,"column":8},"end":{"line":96,"column":8}},{"start":{"line":96,"column":8},"end":{"line":96,"column":8}}]},"5":{"line":98,"type":"if","locations":[{"start":{"line":98,"column":15},"end":{"line":98,"column":15}},{"start":{"line":98,"column":15},"end":{"line":98,"column":15}}]},"6":{"line":366,"type":"if","locations":[{"start":{"line":366,"column":4},"end":{"line":366,"column":4}},{"start":{"line":366,"column":4},"end":{"line":366,"column":4}}]},"7":{"line":367,"type":"if","locations":[{"start":{"line":367,"column":6},"end":{"line":367,"column":6}},{"start":{"line":367,"column":6},"end":{"line":367,"column":6}}]},"8":{"line":377,"type":"if","locations":[{"start":{"line":377,"column":4},"end":{"line":377,"column":4}},{"start":{"line":377,"column":4},"end":{"line":377,"column":4}}]},"9":{"line":396,"type":"if","locations":[{"start":{"line":396,"column":6},"end":{"line":396,"column":6}},{"start":{"line":396,"column":6},"end":{"line":396,"column":6}}]}}},"/home/dano/fili.js/src/firCoeffs.js":{"path":"/home/dano/fili.js/src/firCoeffs.js","s":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":52,"10":52,"11":52,"12":52,"13":662,"14":662,"15":662,"16":52,"17":1,"18":0,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":50,"28":1,"29":0,"30":1,"31":1,"32":0,"33":1,"34":1,"35":51,"36":1,"37":50,"38":1,"39":1,"40":6,"41":6,"42":6,"43":6,"44":6,"45":6,"46":6,"47":6,"48":606,"49":6,"50":600,"51":600,"52":606,"53":6,"54":606,"55":6,"56":1,"57":4,"58":4,"59":404,"60":4,"61":4,"62":1,"63":2,"64":2,"65":2,"66":2,"67":202,"68":2,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1},"b":{"1":[1,0],"2":[1,0],"3":[0,1],"4":[0,1],"5":[1,0],"6":[6,600]},"f":{"1":1,"2":1,"3":52,"4":6,"5":4,"6":2,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1},"fnMap":{"1":{"name":"FirCoeffs","line":3,"loc":{"start":{"line":3,"column":16},"end":{"line":3,"column":37}}},"2":{"name":"calcKImpulseResponse","line":7,"loc":{"start":{"line":7,"column":29},"end":{"line":7,"column":67}}},"3":{"name":"ino","line":13,"loc":{"start":{"line":13,"column":14},"end":{"line":13,"column":32}}},"4":{"name":"calcImpulseResponse","line":60,"loc":{"start":{"line":60,"column":28},"end":{"line":60,"column":65}}},"5":{"name":"invert","line":88,"loc":{"start":{"line":88,"column":15},"end":{"line":88,"column":34}}},"6":{"name":"bs","line":96,"loc":{"start":{"line":96,"column":11},"end":{"line":96,"column":31}}},"7":{"name":"lowpass","line":114,"loc":{"start":{"line":114,"column":13},"end":{"line":114,"column":38}}},"8":{"name":"highpass","line":117,"loc":{"start":{"line":117,"column":14},"end":{"line":117,"column":40}}},"9":{"name":"bandstop","line":120,"loc":{"start":{"line":120,"column":14},"end":{"line":120,"column":40}}},"10":{"name":"bandpass","line":123,"loc":{"start":{"line":123,"column":14},"end":{"line":123,"column":40}}},"11":{"name":"kbFilter","line":126,"loc":{"start":{"line":126,"column":14},"end":{"line":126,"column":40}}},"12":{"name":"available","line":129,"loc":{"start":{"line":129,"column":15},"end":{"line":129,"column":36}}}},"statementMap":{"1":{"start":{"line":3,"column":0},"end":{"line":134,"column":2}},"2":{"start":{"line":7,"column":2},"end":{"line":56,"column":4}},"3":{"start":{"line":8,"column":4},"end":{"line":8,"column":23}},"4":{"start":{"line":9,"column":4},"end":{"line":9,"column":23}},"5":{"start":{"line":10,"column":4},"end":{"line":10,"column":23}},"6":{"start":{"line":11,"column":4},"end":{"line":11,"column":31}},"7":{"start":{"line":12,"column":4},"end":{"line":12,"column":34}},"8":{"start":{"line":13,"column":4},"end":{"line":23,"column":6}},"9":{"start":{"line":14,"column":6},"end":{"line":14,"column":16}},"10":{"start":{"line":15,"column":6},"end":{"line":15,"column":17}},"11":{"start":{"line":16,"column":6},"end":{"line":16,"column":16}},"12":{"start":{"line":17,"column":6},"end":{"line":21,"column":7}},"13":{"start":{"line":18,"column":8},"end":{"line":18,"column":15}},"14":{"start":{"line":19,"column":8},"end":{"line":19,"column":34}},"15":{"start":{"line":20,"column":8},"end":{"line":20,"column":16}},"16":{"start":{"line":22,"column":6},"end":{"line":22,"column":15}},"17":{"start":{"line":25,"column":4},"end":{"line":27,"column":5}},"18":{"start":{"line":26,"column":6},"end":{"line":26,"column":10}},"19":{"start":{"line":28,"column":4},"end":{"line":28,"column":25}},"20":{"start":{"line":29,"column":4},"end":{"line":29,"column":15}},"21":{"start":{"line":30,"column":4},"end":{"line":30,"column":17}},"22":{"start":{"line":31,"column":4},"end":{"line":31,"column":16}},"23":{"start":{"line":32,"column":4},"end":{"line":32,"column":16}},"24":{"start":{"line":33,"column":4},"end":{"line":33,"column":17}},"25":{"start":{"line":35,"column":4},"end":{"line":35,"column":30}},"26":{"start":{"line":36,"column":4},"end":{"line":38,"column":5}},"27":{"start":{"line":37,"column":6},"end":{"line":37,"column":113}},"28":{"start":{"line":40,"column":4},"end":{"line":46,"column":5}},"29":{"start":{"line":41,"column":6},"end":{"line":41,"column":15}},"30":{"start":{"line":42,"column":11},"end":{"line":46,"column":5}},"31":{"start":{"line":43,"column":6},"end":{"line":43,"column":36}},"32":{"start":{"line":45,"column":6},"end":{"line":45,"column":73}},"33":{"start":{"line":48,"column":4},"end":{"line":48,"column":24}},"34":{"start":{"line":49,"column":4},"end":{"line":51,"column":5}},"35":{"start":{"line":50,"column":6},"end":{"line":50,"column":90}},"36":{"start":{"line":52,"column":4},"end":{"line":54,"column":5}},"37":{"start":{"line":53,"column":6},"end":{"line":53,"column":34}},"38":{"start":{"line":55,"column":4},"end":{"line":55,"column":15}},"39":{"start":{"line":60,"column":2},"end":{"line":86,"column":4}},"40":{"start":{"line":61,"column":4},"end":{"line":61,"column":23}},"41":{"start":{"line":62,"column":4},"end":{"line":62,"column":23}},"42":{"start":{"line":63,"column":4},"end":{"line":63,"column":25}},"43":{"start":{"line":64,"column":4},"end":{"line":64,"column":38}},"44":{"start":{"line":65,"column":4},"end":{"line":65,"column":16}},"45":{"start":{"line":66,"column":4},"end":{"line":66,"column":15}},"46":{"start":{"line":67,"column":4},"end":{"line":67,"column":17}},"47":{"start":{"line":71,"column":4},"end":{"line":80,"column":5}},"48":{"start":{"line":72,"column":6},"end":{"line":78,"column":7}},"49":{"start":{"line":73,"column":8},"end":{"line":73,"column":25}},"50":{"start":{"line":75,"column":8},"end":{"line":75,"column":67}},"51":{"start":{"line":77,"column":8},"end":{"line":77,"column":66}},"52":{"start":{"line":79,"column":6},"end":{"line":79,"column":25}},"53":{"start":{"line":82,"column":4},"end":{"line":84,"column":5}},"54":{"start":{"line":83,"column":6},"end":{"line":83,"column":21}},"55":{"start":{"line":85,"column":4},"end":{"line":85,"column":15}},"56":{"start":{"line":88,"column":2},"end":{"line":95,"column":4}},"57":{"start":{"line":89,"column":4},"end":{"line":89,"column":12}},"58":{"start":{"line":90,"column":4},"end":{"line":92,"column":5}},"59":{"start":{"line":91,"column":6},"end":{"line":91,"column":23}},"60":{"start":{"line":93,"column":4},"end":{"line":93,"column":28}},"61":{"start":{"line":94,"column":4},"end":{"line":94,"column":13}},"62":{"start":{"line":96,"column":2},"end":{"line":112,"column":4}},"63":{"start":{"line":97,"column":4},"end":{"line":101,"column":7}},"64":{"start":{"line":102,"column":4},"end":{"line":106,"column":8}},"65":{"start":{"line":107,"column":4},"end":{"line":107,"column":17}},"66":{"start":{"line":108,"column":4},"end":{"line":110,"column":5}},"67":{"start":{"line":109,"column":6},"end":{"line":109,"column":30}},"68":{"start":{"line":111,"column":4},"end":{"line":111,"column":15}},"69":{"start":{"line":113,"column":2},"end":{"line":132,"column":4}},"70":{"start":{"line":115,"column":6},"end":{"line":115,"column":41}},"71":{"start":{"line":118,"column":6},"end":{"line":118,"column":49}},"72":{"start":{"line":121,"column":6},"end":{"line":121,"column":24}},"73":{"start":{"line":124,"column":6},"end":{"line":124,"column":32}},"74":{"start":{"line":127,"column":6},"end":{"line":127,"column":42}},"75":{"start":{"line":130,"column":6},"end":{"line":130,"column":73}},"76":{"start":{"line":133,"column":2},"end":{"line":133,"column":14}},"77":{"start":{"line":136,"column":0},"end":{"line":136,"column":27}}},"branchMap":{"1":{"line":11,"type":"binary-expr","locations":[{"start":{"line":11,"column":12},"end":{"line":11,"column":24}},{"start":{"line":11,"column":28},"end":{"line":11,"column":30}}]},"2":{"line":12,"type":"binary-expr","locations":[{"start":{"line":12,"column":16},"end":{"line":12,"column":26}},{"start":{"line":12,"column":30},"end":{"line":12,"column":33}}]},"3":{"line":25,"type":"if","locations":[{"start":{"line":25,"column":4},"end":{"line":25,"column":4}},{"start":{"line":25,"column":4},"end":{"line":25,"column":4}}]},"4":{"line":40,"type":"if","locations":[{"start":{"line":40,"column":4},"end":{"line":40,"column":4}},{"start":{"line":40,"column":4},"end":{"line":40,"column":4}}]},"5":{"line":42,"type":"if","locations":[{"start":{"line":42,"column":11},"end":{"line":42,"column":11}},{"start":{"line":42,"column":11},"end":{"line":42,"column":11}}]},"6":{"line":72,"type":"if","locations":[{"start":{"line":72,"column":6},"end":{"line":72,"column":6}},{"start":{"line":72,"column":6},"end":{"line":72,"column":6}}]}}},"/home/dano/fili.js/src/firFilter.js":{"path":"/home/dano/fili.js/src/firFilter.js","s":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":5,"7":5,"8":5,"9":5,"10":505,"11":5,"12":14,"13":14,"14":14,"15":1400,"16":14,"17":5,"18":5,"19":100005,"20":100005,"21":100005,"22":10000500,"23":100005,"24":100005,"25":5,"26":5,"27":5,"28":5,"29":1000,"30":1000,"31":1000,"32":1000,"33":1000,"34":100000,"35":1000,"36":1000,"37":1000,"38":5,"39":0,"40":5,"41":5,"42":5,"43":5,"44":5,"45":1000,"46":5,"47":5,"48":5,"49":5,"50":5,"51":4,"52":5,"53":1},"b":{"1":[5,0]},"f":{"1":5,"2":14,"3":100005,"4":5,"5":1000,"6":0,"7":5,"8":5,"9":5,"10":5,"11":4},"fnMap":{"1":{"name":"FirFilter","line":12,"loc":{"start":{"line":12,"column":16},"end":{"line":12,"column":43}}},"2":{"name":"initZero","line":24,"loc":{"start":{"line":24,"column":17},"end":{"line":24,"column":40}}},"3":{"name":"doStep","line":38,"loc":{"start":{"line":38,"column":15},"end":{"line":38,"column":41}}},"4":{"name":"calcInputResponse","line":48,"loc":{"start":{"line":48,"column":26},"end":{"line":48,"column":60}}},"5":{"name":"calcResponse","line":53,"loc":{"start":{"line":53,"column":21},"end":{"line":53,"column":51}}},"6":{"name":"responsePoint","line":80,"loc":{"start":{"line":80,"column":19},"end":{"line":80,"column":50}}},"7":{"name":"response","line":83,"loc":{"start":{"line":83,"column":14},"end":{"line":83,"column":44}}},"8":{"name":"simulate","line":97,"loc":{"start":{"line":97,"column":14},"end":{"line":97,"column":39}}},"9":{"name":"singleStep","line":100,"loc":{"start":{"line":100,"column":16},"end":{"line":100,"column":43}}},"10":{"name":"multiStep","line":103,"loc":{"start":{"line":103,"column":15},"end":{"line":103,"column":52}}},"11":{"name":"reinit","line":106,"loc":{"start":{"line":106,"column":12},"end":{"line":106,"column":30}}}},"statementMap":{"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":34}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":45}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":31}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":43}},"5":{"start":{"line":12,"column":0},"end":{"line":111,"column":2}},"6":{"start":{"line":14,"column":2},"end":{"line":14,"column":17}},"7":{"start":{"line":15,"column":2},"end":{"line":15,"column":13}},"8":{"start":{"line":16,"column":2},"end":{"line":16,"column":14}},"9":{"start":{"line":17,"column":2},"end":{"line":22,"column":3}},"10":{"start":{"line":18,"column":4},"end":{"line":21,"column":6}},"11":{"start":{"line":24,"column":2},"end":{"line":34,"column":4}},"12":{"start":{"line":25,"column":4},"end":{"line":25,"column":15}},"13":{"start":{"line":26,"column":4},"end":{"line":26,"column":10}},"14":{"start":{"line":27,"column":4},"end":{"line":29,"column":5}},"15":{"start":{"line":28,"column":6},"end":{"line":28,"column":16}},"16":{"start":{"line":30,"column":4},"end":{"line":33,"column":6}},"17":{"start":{"line":36,"column":2},"end":{"line":36,"column":33}},"18":{"start":{"line":38,"column":2},"end":{"line":46,"column":4}},"19":{"start":{"line":39,"column":4},"end":{"line":39,"column":29}},"20":{"start":{"line":40,"column":4},"end":{"line":40,"column":16}},"21":{"start":{"line":41,"column":4},"end":{"line":43,"column":5}},"22":{"start":{"line":42,"column":6},"end":{"line":42,"column":62}},"23":{"start":{"line":44,"column":4},"end":{"line":44,"column":47}},"24":{"start":{"line":45,"column":4},"end":{"line":45,"column":15}},"25":{"start":{"line":48,"column":2},"end":{"line":51,"column":4}},"26":{"start":{"line":49,"column":4},"end":{"line":49,"column":39}},"27":{"start":{"line":50,"column":4},"end":{"line":50,"column":48}},"28":{"start":{"line":53,"column":2},"end":{"line":77,"column":4}},"29":{"start":{"line":54,"column":4},"end":{"line":54,"column":23}},"30":{"start":{"line":55,"column":4},"end":{"line":55,"column":23}},"31":{"start":{"line":59,"column":4},"end":{"line":59,"column":41}},"32":{"start":{"line":60,"column":4},"end":{"line":63,"column":6}},"33":{"start":{"line":64,"column":4},"end":{"line":69,"column":5}},"34":{"start":{"line":65,"column":6},"end":{"line":68,"column":10}},"35":{"start":{"line":70,"column":4},"end":{"line":70,"column":33}},"36":{"start":{"line":71,"column":4},"end":{"line":75,"column":6}},"37":{"start":{"line":76,"column":4},"end":{"line":76,"column":15}},"38":{"start":{"line":79,"column":2},"end":{"line":109,"column":4}},"39":{"start":{"line":81,"column":6},"end":{"line":81,"column":34}},"40":{"start":{"line":84,"column":6},"end":{"line":84,"column":37}},"41":{"start":{"line":85,"column":6},"end":{"line":85,"column":19}},"42":{"start":{"line":86,"column":6},"end":{"line":86,"column":18}},"43":{"start":{"line":87,"column":6},"end":{"line":87,"column":29}},"44":{"start":{"line":88,"column":6},"end":{"line":93,"column":7}},"45":{"start":{"line":89,"column":8},"end":{"line":92,"column":11}},"46":{"start":{"line":94,"column":6},"end":{"line":94,"column":25}},"47":{"start":{"line":95,"column":6},"end":{"line":95,"column":17}},"48":{"start":{"line":98,"column":6},"end":{"line":98,"column":38}},"49":{"start":{"line":101,"column":6},"end":{"line":101,"column":30}},"50":{"start":{"line":104,"column":6},"end":{"line":104,"column":57}},"51":{"start":{"line":107,"column":6},"end":{"line":107,"column":33}},"52":{"start":{"line":110,"column":2},"end":{"line":110,"column":14}},"53":{"start":{"line":113,"column":0},"end":{"line":113,"column":27}}},"branchMap":{"1":{"line":84,"type":"binary-expr","locations":[{"start":{"line":84,"column":19},"end":{"line":84,"column":29}},{"start":{"line":84,"column":33},"end":{"line":84,"column":36}}]}}},"/home/dano/fili.js/src/utils.js":{"path":"/home/dano/fili.js/src/utils.js","s":{"1":1,"2":17,"3":17,"4":17,"5":17,"6":17,"7":17,"8":2800,"9":17,"10":17,"11":17,"12":2783,"13":2783,"14":165,"15":15337,"16":2618,"17":18,"18":2021,"19":2783,"20":2456,"21":327,"22":2783,"23":2783,"24":2783,"25":381,"26":17,"27":13,"28":13,"29":4,"30":4,"31":4,"32":4,"33":1,"34":34,"35":34,"36":0,"37":34,"38":34,"39":221200,"40":34,"41":1,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":1,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":1,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":1,"73":0,"74":1,"75":0,"76":0,"77":0,"78":0,"79":1,"80":0,"81":1,"82":5418,"83":5418,"84":5418,"85":5418,"86":5418,"87":5418,"88":5418,"89":127090,"90":127090,"91":127090,"92":127090,"93":127090,"94":127090,"95":121672,"96":121672,"97":0,"98":0,"99":6418,"100":6418},"b":{"1":[165,2618],"2":[18,2600],"3":[2456,327],"4":[381,2402],"5":[13,4],"6":[0,34],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0]},"f":{"1":17,"2":34,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":5418,"14":127090,"15":121672,"16":0,"17":6418,"18":6418},"fnMap":{"1":{"name":"(anonymous_1)","line":6,"loc":{"start":{"line":6,"column":24},"end":{"line":6,"column":39}}},"2":{"name":"(anonymous_2)","line":55,"loc":{"start":{"line":55,"column":25},"end":{"line":55,"column":64}}},"3":{"name":"factorial","line":67,"loc":{"start":{"line":67,"column":16},"end":{"line":67,"column":44}}},"4":{"name":"(anonymous_4)","line":95,"loc":{"start":{"line":95,"column":24},"end":{"line":95,"column":37}}},"5":{"name":"fractionToFp","line":105,"loc":{"start":{"line":105,"column":19},"end":{"line":105,"column":65}}},"6":{"name":"numberToFp","line":117,"loc":{"start":{"line":117,"column":17},"end":{"line":117,"column":57}}},"7":{"name":"valueToFp","line":121,"loc":{"start":{"line":121,"column":16},"end":{"line":121,"column":68}}},"8":{"name":"convert","line":134,"loc":{"start":{"line":134,"column":11},"end":{"line":134,"column":61}}},"9":{"name":"add","line":137,"loc":{"start":{"line":137,"column":7},"end":{"line":137,"column":36}}},"10":{"name":"sub","line":138,"loc":{"start":{"line":138,"column":7},"end":{"line":138,"column":36}}},"11":{"name":"mul","line":139,"loc":{"start":{"line":139,"column":7},"end":{"line":139,"column":36}}},"12":{"name":"div","line":140,"loc":{"start":{"line":140,"column":7},"end":{"line":140,"column":36}}},"13":{"name":"div","line":148,"loc":{"start":{"line":148,"column":7},"end":{"line":148,"column":26}}},"14":{"name":"mul","line":160,"loc":{"start":{"line":160,"column":7},"end":{"line":160,"column":26}}},"15":{"name":"add","line":171,"loc":{"start":{"line":171,"column":7},"end":{"line":171,"column":26}}},"16":{"name":"sub","line":178,"loc":{"start":{"line":178,"column":7},"end":{"line":178,"column":26}}},"17":{"name":"phase","line":185,"loc":{"start":{"line":185,"column":9},"end":{"line":185,"column":27}}},"18":{"name":"magnitude","line":188,"loc":{"start":{"line":188,"column":13},"end":{"line":188,"column":35}}}},"statementMap":{"1":{"start":{"line":6,"column":0},"end":{"line":50,"column":2}},"2":{"start":{"line":7,"column":2},"end":{"line":7,"column":15}},"3":{"start":{"line":8,"column":2},"end":{"line":8,"column":14}},"4":{"start":{"line":9,"column":2},"end":{"line":9,"column":19}},"5":{"start":{"line":10,"column":2},"end":{"line":10,"column":19}},"6":{"start":{"line":11,"column":2},"end":{"line":11,"column":17}},"7":{"start":{"line":12,"column":2},"end":{"line":14,"column":3}},"8":{"start":{"line":13,"column":4},"end":{"line":13,"column":31}},"9":{"start":{"line":15,"column":2},"end":{"line":15,"column":39}},"10":{"start":{"line":16,"column":2},"end":{"line":16,"column":24}},"11":{"start":{"line":18,"column":2},"end":{"line":40,"column":3}},"12":{"start":{"line":19,"column":4},"end":{"line":19,"column":43}},"13":{"start":{"line":20,"column":4},"end":{"line":28,"column":5}},"14":{"start":{"line":21,"column":6},"end":{"line":23,"column":7}},"15":{"start":{"line":22,"column":8},"end":{"line":22,"column":27}},"16":{"start":{"line":24,"column":11},"end":{"line":28,"column":5}},"17":{"start":{"line":25,"column":6},"end":{"line":27,"column":7}},"18":{"start":{"line":26,"column":8},"end":{"line":26,"column":27}},"19":{"start":{"line":29,"column":4},"end":{"line":33,"column":5}},"20":{"start":{"line":30,"column":6},"end":{"line":30,"column":44}},"21":{"start":{"line":32,"column":6},"end":{"line":32,"column":43}},"22":{"start":{"line":35,"column":4},"end":{"line":35,"column":71}},"23":{"start":{"line":36,"column":4},"end":{"line":36,"column":102}},"24":{"start":{"line":37,"column":4},"end":{"line":39,"column":5}},"25":{"start":{"line":38,"column":6},"end":{"line":38,"column":49}},"26":{"start":{"line":41,"column":2},"end":{"line":49,"column":3}},"27":{"start":{"line":42,"column":4},"end":{"line":42,"column":42}},"28":{"start":{"line":43,"column":4},"end":{"line":43,"column":42}},"29":{"start":{"line":45,"column":4},"end":{"line":45,"column":42}},"30":{"start":{"line":46,"column":4},"end":{"line":46,"column":42}},"31":{"start":{"line":47,"column":4},"end":{"line":47,"column":42}},"32":{"start":{"line":48,"column":4},"end":{"line":48,"column":42}},"33":{"start":{"line":55,"column":0},"end":{"line":65,"column":2}},"34":{"start":{"line":56,"column":2},"end":{"line":56,"column":15}},"35":{"start":{"line":57,"column":2},"end":{"line":59,"column":3}},"36":{"start":{"line":58,"column":4},"end":{"line":58,"column":16}},"37":{"start":{"line":60,"column":2},"end":{"line":60,"column":8}},"38":{"start":{"line":61,"column":2},"end":{"line":63,"column":3}},"39":{"start":{"line":62,"column":4},"end":{"line":62,"column":33}},"40":{"start":{"line":64,"column":2},"end":{"line":64,"column":13}},"41":{"start":{"line":67,"column":0},"end":{"line":90,"column":2}},"42":{"start":{"line":68,"column":2},"end":{"line":68,"column":20}},"43":{"start":{"line":70,"column":2},"end":{"line":89,"column":3}},"44":{"start":{"line":70,"column":13},"end":{"line":89,"column":3}},"45":{"start":{"line":71,"column":4},"end":{"line":72,"column":16}},"46":{"start":{"line":73,"column":4},"end":{"line":73,"column":19}},"47":{"start":{"line":75,"column":4},"end":{"line":77,"column":5}},"48":{"start":{"line":76,"column":6},"end":{"line":76,"column":12}},"49":{"start":{"line":78,"column":4},"end":{"line":80,"column":5}},"50":{"start":{"line":79,"column":6},"end":{"line":79,"column":15}},"51":{"start":{"line":81,"column":4},"end":{"line":88,"column":5}},"52":{"start":{"line":82,"column":6},"end":{"line":82,"column":15}},"53":{"start":{"line":84,"column":6},"end":{"line":84,"column":17}},"54":{"start":{"line":85,"column":6},"end":{"line":85,"column":18}},"55":{"start":{"line":86,"column":6},"end":{"line":86,"column":20}},"56":{"start":{"line":87,"column":6},"end":{"line":87,"column":25}},"57":{"start":{"line":95,"column":0},"end":{"line":103,"column":2}},"58":{"start":{"line":96,"column":2},"end":{"line":96,"column":15}},"59":{"start":{"line":97,"column":2},"end":{"line":101,"column":3}},"60":{"start":{"line":98,"column":4},"end":{"line":98,"column":33}},"61":{"start":{"line":99,"column":4},"end":{"line":99,"column":65}},"62":{"start":{"line":100,"column":4},"end":{"line":100,"column":35}},"63":{"start":{"line":102,"column":2},"end":{"line":102,"column":13}},"64":{"start":{"line":105,"column":0},"end":{"line":115,"column":2}},"65":{"start":{"line":106,"column":2},"end":{"line":106,"column":21}},"66":{"start":{"line":107,"column":2},"end":{"line":113,"column":3}},"67":{"start":{"line":108,"column":4},"end":{"line":108,"column":42}},"68":{"start":{"line":109,"column":4},"end":{"line":112,"column":5}},"69":{"start":{"line":110,"column":6},"end":{"line":110,"column":25}},"70":{"start":{"line":111,"column":6},"end":{"line":111,"column":27}},"71":{"start":{"line":114,"column":2},"end":{"line":114,"column":20}},"72":{"start":{"line":117,"column":0},"end":{"line":119,"column":2}},"73":{"start":{"line":118,"column":2},"end":{"line":118,"column":42}},"74":{"start":{"line":121,"column":0},"end":{"line":131,"column":2}},"75":{"start":{"line":122,"column":2},"end":{"line":122,"column":31}},"76":{"start":{"line":123,"column":2},"end":{"line":123,"column":32}},"77":{"start":{"line":124,"column":2},"end":{"line":129,"column":4}},"78":{"start":{"line":130,"column":2},"end":{"line":130,"column":18}},"79":{"start":{"line":133,"column":0},"end":{"line":141,"column":2}},"80":{"start":{"line":135,"column":4},"end":{"line":135,"column":54}},"81":{"start":{"line":146,"column":0},"end":{"line":191,"column":2}},"82":{"start":{"line":149,"column":4},"end":{"line":149,"column":17}},"83":{"start":{"line":150,"column":4},"end":{"line":150,"column":17}},"84":{"start":{"line":151,"column":4},"end":{"line":151,"column":17}},"85":{"start":{"line":152,"column":4},"end":{"line":152,"column":17}},"86":{"start":{"line":153,"column":4},"end":{"line":153,"column":26}},"87":{"start":{"line":154,"column":4},"end":{"line":157,"column":6}},"88":{"start":{"line":158,"column":4},"end":{"line":158,"column":13}},"89":{"start":{"line":161,"column":4},"end":{"line":161,"column":17}},"90":{"start":{"line":162,"column":4},"end":{"line":162,"column":17}},"91":{"start":{"line":163,"column":4},"end":{"line":163,"column":17}},"92":{"start":{"line":164,"column":4},"end":{"line":164,"column":17}},"93":{"start":{"line":165,"column":4},"end":{"line":168,"column":6}},"94":{"start":{"line":169,"column":4},"end":{"line":169,"column":13}},"95":{"start":{"line":172,"column":4},"end":{"line":175,"column":6}},"96":{"start":{"line":176,"column":4},"end":{"line":176,"column":13}},"97":{"start":{"line":179,"column":4},"end":{"line":182,"column":6}},"98":{"start":{"line":183,"column":4},"end":{"line":183,"column":13}},"99":{"start":{"line":186,"column":4},"end":{"line":186,"column":34}},"100":{"start":{"line":189,"column":4},"end":{"line":189,"column":48}}},"branchMap":{"1":{"line":20,"type":"if","locations":[{"start":{"line":20,"column":4},"end":{"line":20,"column":4}},{"start":{"line":20,"column":4},"end":{"line":20,"column":4}}]},"2":{"line":24,"type":"if","locations":[{"start":{"line":24,"column":11},"end":{"line":24,"column":11}},{"start":{"line":24,"column":11},"end":{"line":24,"column":11}}]},"3":{"line":29,"type":"if","locations":[{"start":{"line":29,"column":4},"end":{"line":29,"column":4}},{"start":{"line":29,"column":4},"end":{"line":29,"column":4}}]},"4":{"line":37,"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":37,"column":4}},{"start":{"line":37,"column":4},"end":{"line":37,"column":4}}]},"5":{"line":41,"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":41,"column":2}},{"start":{"line":41,"column":2},"end":{"line":41,"column":2}}]},"6":{"line":57,"type":"if","locations":[{"start":{"line":57,"column":2},"end":{"line":57,"column":2}},{"start":{"line":57,"column":2},"end":{"line":57,"column":2}}]},"7":{"line":75,"type":"if","locations":[{"start":{"line":75,"column":4},"end":{"line":75,"column":4}},{"start":{"line":75,"column":4},"end":{"line":75,"column":4}}]},"8":{"line":78,"type":"if","locations":[{"start":{"line":78,"column":4},"end":{"line":78,"column":4}},{"start":{"line":78,"column":4},"end":{"line":78,"column":4}}]},"9":{"line":78,"type":"binary-expr","locations":[{"start":{"line":78,"column":8},"end":{"line":78,"column":27}},{"start":{"line":78,"column":31},"end":{"line":78,"column":50}}]},"10":{"line":81,"type":"if","locations":[{"start":{"line":81,"column":4},"end":{"line":81,"column":4}},{"start":{"line":81,"column":4},"end":{"line":81,"column":4}}]},"11":{"line":81,"type":"binary-expr","locations":[{"start":{"line":81,"column":8},"end":{"line":81,"column":15}},{"start":{"line":81,"column":19},"end":{"line":81,"column":26}}]},"12":{"line":109,"type":"if","locations":[{"start":{"line":109,"column":4},"end":{"line":109,"column":4}},{"start":{"line":109,"column":4},"end":{"line":109,"column":4}}]}}},"/home/dano/fili.js/src/calcCascades.js":{"path":"/home/dano/fili.js/src/calcCascades.js","s":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":26,"7":26,"8":26,"9":26,"10":0,"11":26,"12":76,"13":76,"14":21,"15":55,"16":35,"17":35,"18":20,"19":20,"20":0,"21":20,"22":55,"23":11,"24":44,"25":55,"26":9,"27":3,"28":55,"29":0,"30":0,"31":26,"32":1,"33":14,"34":26,"35":1,"36":1,"37":1,"38":1,"39":14,"40":14,"41":1,"42":1,"43":1,"44":1},"b":{"1":[26,0],"2":[0,26],"3":[21,55],"4":[35,20],"5":[0,20],"6":[11,44],"7":[9,46],"8":[55,52],"9":[3,6],"10":[55,55],"11":[55,55],"12":[55,43]},"f":{"1":26,"2":14,"3":26,"4":1,"5":1},"fnMap":{"1":{"name":"calcCoeffs","line":48,"loc":{"start":{"line":48,"column":17},"end":{"line":48,"column":55}}},"2":{"name":"initCalcCoeffs","line":107,"loc":{"start":{"line":107,"column":21},"end":{"line":107,"column":55}}},"3":{"name":"(anonymous_3)","line":108,"loc":{"start":{"line":108,"column":9},"end":{"line":108,"column":27}}},"4":{"name":"CalcCascades","line":114,"loc":{"start":{"line":114,"column":19},"end":{"line":114,"column":43}}},"5":{"name":"(anonymous_5)","line":120,"loc":{"start":{"line":120,"column":19},"end":{"line":120,"column":31}}}},"statementMap":{"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":39}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":32}},"3":{"start":{"line":7,"column":0},"end":{"line":14,"column":2}},"4":{"start":{"line":17,"column":0},"end":{"line":46,"column":2}},"5":{"start":{"line":48,"column":0},"end":{"line":105,"column":2}},"6":{"start":{"line":49,"column":2},"end":{"line":49,"column":18}},"7":{"start":{"line":50,"column":2},"end":{"line":50,"column":14}},"8":{"start":{"line":51,"column":2},"end":{"line":102,"column":3}},"9":{"start":{"line":52,"column":4},"end":{"line":54,"column":5}},"10":{"start":{"line":53,"column":6},"end":{"line":53,"column":24}},"11":{"start":{"line":55,"column":4},"end":{"line":97,"column":5}},"12":{"start":{"line":56,"column":6},"end":{"line":56,"column":19}},"13":{"start":{"line":57,"column":6},"end":{"line":96,"column":7}},"14":{"start":{"line":58,"column":8},"end":{"line":64,"column":12}},"15":{"start":{"line":66,"column":8},"end":{"line":76,"column":9}},"16":{"start":{"line":67,"column":10},"end":{"line":67,"column":73}},"17":{"start":{"line":68,"column":10},"end":{"line":68,"column":16}},"18":{"start":{"line":70,"column":10},"end":{"line":70,"column":68}},"19":{"start":{"line":71,"column":10},"end":{"line":75,"column":11}},"20":{"start":{"line":72,"column":12},"end":{"line":72,"column":73}},"21":{"start":{"line":74,"column":12},"end":{"line":74,"column":73}},"22":{"start":{"line":78,"column":8},"end":{"line":82,"column":9}},"23":{"start":{"line":79,"column":10},"end":{"line":79,"column":29}},"24":{"start":{"line":81,"column":10},"end":{"line":81,"column":29}},"25":{"start":{"line":83,"column":8},"end":{"line":87,"column":9}},"26":{"start":{"line":84,"column":10},"end":{"line":86,"column":11}},"27":{"start":{"line":85,"column":12},"end":{"line":85,"column":61}},"28":{"start":{"line":88,"column":8},"end":{"line":95,"column":12}},"29":{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},"30":{"start":{"line":100,"column":6},"end":{"line":100,"column":52}},"31":{"start":{"line":104,"column":2},"end":{"line":104,"column":16}},"32":{"start":{"line":107,"column":0},"end":{"line":111,"column":2}},"33":{"start":{"line":108,"column":2},"end":{"line":110,"column":4}},"34":{"start":{"line":109,"column":4},"end":{"line":109,"column":40}},"35":{"start":{"line":113,"column":0},"end":{"line":113,"column":14}},"36":{"start":{"line":114,"column":0},"end":{"line":124,"column":2}},"37":{"start":{"line":115,"column":2},"end":{"line":115,"column":21}},"38":{"start":{"line":116,"column":2},"end":{"line":119,"column":3}},"39":{"start":{"line":117,"column":4},"end":{"line":117,"column":32}},"40":{"start":{"line":118,"column":4},"end":{"line":118,"column":22}},"41":{"start":{"line":120,"column":2},"end":{"line":122,"column":4}},"42":{"start":{"line":121,"column":4},"end":{"line":121,"column":21}},"43":{"start":{"line":123,"column":2},"end":{"line":123,"column":14}},"44":{"start":{"line":126,"column":0},"end":{"line":126,"column":30}}},"branchMap":{"1":{"line":51,"type":"if","locations":[{"start":{"line":51,"column":2},"end":{"line":51,"column":2}},{"start":{"line":51,"column":2},"end":{"line":51,"column":2}}]},"2":{"line":52,"type":"if","locations":[{"start":{"line":52,"column":4},"end":{"line":52,"column":4}},{"start":{"line":52,"column":4},"end":{"line":52,"column":4}}]},"3":{"line":57,"type":"if","locations":[{"start":{"line":57,"column":6},"end":{"line":57,"column":6}},{"start":{"line":57,"column":6},"end":{"line":57,"column":6}}]},"4":{"line":66,"type":"if","locations":[{"start":{"line":66,"column":8},"end":{"line":66,"column":8}},{"start":{"line":66,"column":8},"end":{"line":66,"column":8}}]},"5":{"line":71,"type":"if","locations":[{"start":{"line":71,"column":10},"end":{"line":71,"column":10}},{"start":{"line":71,"column":10},"end":{"line":71,"column":10}}]},"6":{"line":78,"type":"if","locations":[{"start":{"line":78,"column":8},"end":{"line":78,"column":8}},{"start":{"line":78,"column":8},"end":{"line":78,"column":8}}]},"7":{"line":83,"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":8}},{"start":{"line":83,"column":8},"end":{"line":83,"column":8}}]},"8":{"line":83,"type":"binary-expr","locations":[{"start":{"line":83,"column":12},"end":{"line":83,"column":35}},{"start":{"line":83,"column":39},"end":{"line":83,"column":62}}]},"9":{"line":84,"type":"if","locations":[{"start":{"line":84,"column":10},"end":{"line":84,"column":10}},{"start":{"line":84,"column":10},"end":{"line":84,"column":10}}]},"10":{"line":92,"type":"binary-expr","locations":[{"start":{"line":92,"column":14},"end":{"line":92,"column":23}},{"start":{"line":92,"column":27},"end":{"line":92,"column":28}}]},"11":{"line":93,"type":"binary-expr","locations":[{"start":{"line":93,"column":16},"end":{"line":93,"column":27}},{"start":{"line":93,"column":31},"end":{"line":93,"column":32}}]},"12":{"line":94,"type":"binary-expr","locations":[{"start":{"line":94,"column":19},"end":{"line":94,"column":33}},{"start":{"line":94,"column":37},"end":{"line":94,"column":42}}]}}},"/home/dano/fili.js/src/iirCoeffs.js":{"path":"/home/dano/fili.js/src/iirCoeffs.js","s":{"1":1,"2":1,"3":37,"4":37,"5":37,"6":37,"7":37,"8":37,"9":0,"10":37,"11":37,"12":37,"13":37,"14":37,"15":37,"16":37,"17":37,"18":1,"19":9,"20":9,"21":9,"22":9,"23":9,"24":9,"25":9,"26":9,"27":9,"28":1,"29":76,"30":76,"31":76,"32":76,"33":76,"34":1,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":21,"47":21,"48":21,"49":21,"50":21,"51":21,"52":21,"53":21,"54":21,"55":21,"56":21,"57":0,"58":0,"59":21,"60":21,"61":21,"62":3,"63":3,"64":3,"65":3,"66":3,"67":0,"68":3,"69":3,"70":3,"71":3,"72":3,"73":3,"74":3,"75":3,"76":3,"77":3,"78":3,"79":3,"80":3,"81":0,"82":3,"83":3,"84":3,"85":3,"86":3,"87":3,"88":3,"89":3,"90":11,"91":11,"92":0,"93":11,"94":11,"95":6,"96":6,"97":5,"98":5,"99":11,"100":11,"101":11,"102":11,"103":11,"104":0,"105":11,"106":11,"107":6,"108":6,"109":5,"110":5,"111":11,"112":11,"113":11,"114":3,"115":3,"116":0,"117":3,"118":3,"119":3,"120":3,"121":3,"122":3,"123":3,"124":3,"125":3,"126":3,"127":3,"128":3,"129":3,"130":3,"131":3,"132":3,"133":3,"134":3,"135":3,"136":3,"137":6,"138":6,"139":6,"140":6,"141":6,"142":6,"143":6,"144":3,"145":3,"146":3,"147":3,"148":3,"149":3,"150":3,"151":3,"152":3,"153":3,"154":3,"155":3,"156":0,"157":3,"158":3,"159":3,"160":3,"161":3,"162":3,"163":3,"164":3,"165":3,"166":3,"167":3,"168":3,"169":0,"170":3,"171":3,"172":3,"173":3,"174":3,"175":3,"176":3,"177":3,"178":3,"179":3,"180":3,"181":3,"182":3,"183":3,"184":3,"185":3,"186":3,"187":3,"188":3,"189":3,"190":3,"191":3,"192":3,"193":1,"194":1},"b":{"1":[0,37],"2":[0,0],"3":[21,0],"4":[0,3],"5":[0,3],"6":[0,11],"7":[6,5],"8":[0,11],"9":[6,5],"10":[0,3],"11":[0,3],"12":[0,3]},"f":{"1":1,"2":37,"3":9,"4":76,"5":0,"6":21,"7":3,"8":3,"9":11,"10":11,"11":3,"12":3,"13":3,"14":6,"15":3,"16":3,"17":3,"18":3},"fnMap":{"1":{"name":"IirCoeffs","line":3,"loc":{"start":{"line":3,"column":16},"end":{"line":3,"column":37}}},"2":{"name":"preCalc","line":4,"loc":{"start":{"line":4,"column":16},"end":{"line":4,"column":49}}},"3":{"name":"preCalcGain","line":24,"loc":{"start":{"line":24,"column":20},"end":{"line":24,"column":49}}},"4":{"name":"initCoeffs","line":36,"loc":{"start":{"line":36,"column":19},"end":{"line":36,"column":41}}},"5":{"name":"fromPZ","line":46,"loc":{"start":{"line":46,"column":12},"end":{"line":46,"column":36}}},"6":{"name":"lowpassMZ","line":63,"loc":{"start":{"line":63,"column":15},"end":{"line":63,"column":42}}},"7":{"name":"lowpassBT","line":86,"loc":{"start":{"line":86,"column":15},"end":{"line":86,"column":42}}},"8":{"name":"highpassBT","line":104,"loc":{"start":{"line":104,"column":16},"end":{"line":104,"column":44}}},"9":{"name":"lowpass","line":126,"loc":{"start":{"line":126,"column":13},"end":{"line":126,"column":38}}},"10":{"name":"highpass","line":145,"loc":{"start":{"line":145,"column":14},"end":{"line":145,"column":40}}},"11":{"name":"allpass","line":164,"loc":{"start":{"line":164,"column":13},"end":{"line":164,"column":38}}},"12":{"name":"bandpassQ","line":178,"loc":{"start":{"line":178,"column":15},"end":{"line":178,"column":42}}},"13":{"name":"bandpass","line":189,"loc":{"start":{"line":189,"column":14},"end":{"line":189,"column":40}}},"14":{"name":"bandstop","line":200,"loc":{"start":{"line":200,"column":14},"end":{"line":200,"column":40}}},"15":{"name":"peak","line":211,"loc":{"start":{"line":211,"column":10},"end":{"line":211,"column":32}}},"16":{"name":"lowshelf","line":225,"loc":{"start":{"line":225,"column":14},"end":{"line":225,"column":40}}},"17":{"name":"highshelf","line":243,"loc":{"start":{"line":243,"column":15},"end":{"line":243,"column":42}}},"18":{"name":"aweighting","line":262,"loc":{"start":{"line":262,"column":16},"end":{"line":262,"column":44}}}},"statementMap":{"1":{"start":{"line":3,"column":0},"end":{"line":280,"column":2}},"2":{"start":{"line":4,"column":2},"end":{"line":22,"column":4}},"3":{"start":{"line":5,"column":4},"end":{"line":5,"column":21}},"4":{"start":{"line":6,"column":4},"end":{"line":6,"column":23}},"5":{"start":{"line":7,"column":4},"end":{"line":7,"column":23}},"6":{"start":{"line":8,"column":4},"end":{"line":8,"column":17}},"7":{"start":{"line":9,"column":4},"end":{"line":9,"column":34}},"8":{"start":{"line":10,"column":4},"end":{"line":14,"column":5}},"9":{"start":{"line":11,"column":6},"end":{"line":11,"column":89}},"10":{"start":{"line":13,"column":6},"end":{"line":13,"column":40}},"11":{"start":{"line":15,"column":4},"end":{"line":15,"column":25}},"12":{"start":{"line":16,"column":4},"end":{"line":16,"column":27}},"13":{"start":{"line":17,"column":4},"end":{"line":17,"column":23}},"14":{"start":{"line":18,"column":4},"end":{"line":18,"column":40}},"15":{"start":{"line":19,"column":4},"end":{"line":19,"column":17}},"16":{"start":{"line":20,"column":4},"end":{"line":20,"column":44}},"17":{"start":{"line":21,"column":4},"end":{"line":21,"column":15}},"18":{"start":{"line":24,"column":2},"end":{"line":34,"column":4}},"19":{"start":{"line":25,"column":4},"end":{"line":25,"column":21}},"20":{"start":{"line":26,"column":4},"end":{"line":26,"column":23}},"21":{"start":{"line":27,"column":4},"end":{"line":27,"column":23}},"22":{"start":{"line":28,"column":4},"end":{"line":28,"column":17}},"23":{"start":{"line":29,"column":4},"end":{"line":29,"column":34}},"24":{"start":{"line":30,"column":4},"end":{"line":30,"column":38}},"25":{"start":{"line":31,"column":4},"end":{"line":31,"column":25}},"26":{"start":{"line":32,"column":4},"end":{"line":32,"column":43}},"27":{"start":{"line":33,"column":4},"end":{"line":33,"column":15}},"28":{"start":{"line":36,"column":2},"end":{"line":42,"column":4}},"29":{"start":{"line":37,"column":4},"end":{"line":37,"column":20}},"30":{"start":{"line":38,"column":4},"end":{"line":38,"column":22}},"31":{"start":{"line":39,"column":4},"end":{"line":39,"column":18}},"32":{"start":{"line":40,"column":4},"end":{"line":40,"column":18}},"33":{"start":{"line":41,"column":4},"end":{"line":41,"column":18}},"34":{"start":{"line":44,"column":2},"end":{"line":277,"column":4}},"35":{"start":{"line":47,"column":6},"end":{"line":47,"column":32}},"36":{"start":{"line":48,"column":6},"end":{"line":48,"column":20}},"37":{"start":{"line":49,"column":6},"end":{"line":49,"column":23}},"38":{"start":{"line":50,"column":6},"end":{"line":50,"column":50}},"39":{"start":{"line":51,"column":6},"end":{"line":51,"column":79}},"40":{"start":{"line":52,"column":6},"end":{"line":52,"column":50}},"41":{"start":{"line":53,"column":6},"end":{"line":53,"column":79}},"42":{"start":{"line":54,"column":6},"end":{"line":58,"column":7}},"43":{"start":{"line":55,"column":8},"end":{"line":55,"column":85}},"44":{"start":{"line":57,"column":8},"end":{"line":57,"column":85}},"45":{"start":{"line":59,"column":6},"end":{"line":59,"column":20}},"46":{"start":{"line":64,"column":6},"end":{"line":64,"column":32}},"47":{"start":{"line":65,"column":6},"end":{"line":65,"column":20}},"48":{"start":{"line":66,"column":6},"end":{"line":66,"column":25}},"49":{"start":{"line":67,"column":6},"end":{"line":67,"column":25}},"50":{"start":{"line":68,"column":6},"end":{"line":68,"column":50}},"51":{"start":{"line":69,"column":6},"end":{"line":69,"column":31}},"52":{"start":{"line":70,"column":6},"end":{"line":70,"column":137}},"53":{"start":{"line":71,"column":6},"end":{"line":71,"column":49}},"54":{"start":{"line":73,"column":6},"end":{"line":79,"column":7}},"55":{"start":{"line":74,"column":8},"end":{"line":74,"column":61}},"56":{"start":{"line":75,"column":8},"end":{"line":75,"column":21}},"57":{"start":{"line":77,"column":8},"end":{"line":77,"column":25}},"58":{"start":{"line":78,"column":8},"end":{"line":78,"column":57}},"59":{"start":{"line":80,"column":6},"end":{"line":80,"column":23}},"60":{"start":{"line":81,"column":6},"end":{"line":81,"column":23}},"61":{"start":{"line":82,"column":6},"end":{"line":82,"column":20}},"62":{"start":{"line":87,"column":6},"end":{"line":87,"column":32}},"63":{"start":{"line":88,"column":6},"end":{"line":88,"column":19}},"64":{"start":{"line":89,"column":6},"end":{"line":89,"column":70}},"65":{"start":{"line":90,"column":6},"end":{"line":90,"column":41}},"66":{"start":{"line":91,"column":6},"end":{"line":93,"column":7}},"67":{"start":{"line":92,"column":8},"end":{"line":92,"column":25}},"68":{"start":{"line":94,"column":6},"end":{"line":94,"column":19}},"69":{"start":{"line":95,"column":6},"end":{"line":95,"column":53}},"70":{"start":{"line":96,"column":6},"end":{"line":96,"column":59}},"71":{"start":{"line":97,"column":6},"end":{"line":97,"column":37}},"72":{"start":{"line":98,"column":6},"end":{"line":98,"column":33}},"73":{"start":{"line":99,"column":6},"end":{"line":99,"column":54}},"74":{"start":{"line":100,"column":6},"end":{"line":100,"column":70}},"75":{"start":{"line":101,"column":6},"end":{"line":101,"column":20}},"76":{"start":{"line":105,"column":6},"end":{"line":105,"column":32}},"77":{"start":{"line":106,"column":6},"end":{"line":106,"column":19}},"78":{"start":{"line":107,"column":6},"end":{"line":107,"column":70}},"79":{"start":{"line":108,"column":6},"end":{"line":108,"column":41}},"80":{"start":{"line":109,"column":6},"end":{"line":111,"column":7}},"81":{"start":{"line":110,"column":8},"end":{"line":110,"column":25}},"82":{"start":{"line":112,"column":6},"end":{"line":112,"column":19}},"83":{"start":{"line":113,"column":6},"end":{"line":113,"column":45}},"84":{"start":{"line":114,"column":6},"end":{"line":114,"column":46}},"85":{"start":{"line":115,"column":6},"end":{"line":115,"column":37}},"86":{"start":{"line":116,"column":6},"end":{"line":116,"column":33}},"87":{"start":{"line":117,"column":6},"end":{"line":117,"column":54}},"88":{"start":{"line":118,"column":6},"end":{"line":118,"column":62}},"89":{"start":{"line":119,"column":6},"end":{"line":119,"column":20}},"90":{"start":{"line":127,"column":6},"end":{"line":127,"column":32}},"91":{"start":{"line":128,"column":6},"end":{"line":130,"column":7}},"92":{"start":{"line":129,"column":8},"end":{"line":129,"column":25}},"93":{"start":{"line":131,"column":6},"end":{"line":131,"column":38}},"94":{"start":{"line":132,"column":6},"end":{"line":138,"column":7}},"95":{"start":{"line":133,"column":8},"end":{"line":133,"column":36}},"96":{"start":{"line":134,"column":8},"end":{"line":134,"column":32}},"97":{"start":{"line":136,"column":8},"end":{"line":136,"column":21}},"98":{"start":{"line":137,"column":8},"end":{"line":137,"column":47}},"99":{"start":{"line":139,"column":6},"end":{"line":139,"column":37}},"100":{"start":{"line":140,"column":6},"end":{"line":140,"column":33}},"101":{"start":{"line":141,"column":6},"end":{"line":141,"column":20}},"102":{"start":{"line":146,"column":6},"end":{"line":146,"column":32}},"103":{"start":{"line":147,"column":6},"end":{"line":149,"column":7}},"104":{"start":{"line":148,"column":8},"end":{"line":148,"column":25}},"105":{"start":{"line":150,"column":6},"end":{"line":150,"column":38}},"106":{"start":{"line":151,"column":6},"end":{"line":157,"column":7}},"107":{"start":{"line":152,"column":8},"end":{"line":152,"column":36}},"108":{"start":{"line":153,"column":8},"end":{"line":153,"column":32}},"109":{"start":{"line":155,"column":8},"end":{"line":155,"column":21}},"110":{"start":{"line":156,"column":8},"end":{"line":156,"column":47}},"111":{"start":{"line":158,"column":6},"end":{"line":158,"column":38}},"112":{"start":{"line":159,"column":6},"end":{"line":159,"column":33}},"113":{"start":{"line":160,"column":6},"end":{"line":160,"column":20}},"114":{"start":{"line":165,"column":6},"end":{"line":165,"column":32}},"115":{"start":{"line":166,"column":6},"end":{"line":168,"column":7}},"116":{"start":{"line":167,"column":8},"end":{"line":167,"column":25}},"117":{"start":{"line":169,"column":6},"end":{"line":169,"column":38}},"118":{"start":{"line":170,"column":6},"end":{"line":170,"column":19}},"119":{"start":{"line":171,"column":6},"end":{"line":171,"column":42}},"120":{"start":{"line":172,"column":6},"end":{"line":172,"column":38}},"121":{"start":{"line":173,"column":6},"end":{"line":173,"column":42}},"122":{"start":{"line":174,"column":6},"end":{"line":174,"column":20}},"123":{"start":{"line":179,"column":6},"end":{"line":179,"column":32}},"124":{"start":{"line":180,"column":6},"end":{"line":180,"column":38}},"125":{"start":{"line":181,"column":6},"end":{"line":181,"column":19}},"126":{"start":{"line":182,"column":6},"end":{"line":182,"column":47}},"127":{"start":{"line":183,"column":6},"end":{"line":183,"column":23}},"128":{"start":{"line":184,"column":6},"end":{"line":184,"column":34}},"129":{"start":{"line":185,"column":6},"end":{"line":185,"column":20}},"130":{"start":{"line":190,"column":6},"end":{"line":190,"column":32}},"131":{"start":{"line":191,"column":6},"end":{"line":191,"column":38}},"132":{"start":{"line":192,"column":6},"end":{"line":192,"column":19}},"133":{"start":{"line":193,"column":6},"end":{"line":193,"column":36}},"134":{"start":{"line":194,"column":6},"end":{"line":194,"column":23}},"135":{"start":{"line":195,"column":6},"end":{"line":195,"column":34}},"136":{"start":{"line":196,"column":6},"end":{"line":196,"column":20}},"137":{"start":{"line":201,"column":6},"end":{"line":201,"column":32}},"138":{"start":{"line":202,"column":6},"end":{"line":202,"column":38}},"139":{"start":{"line":203,"column":6},"end":{"line":203,"column":19}},"140":{"start":{"line":204,"column":6},"end":{"line":204,"column":30}},"141":{"start":{"line":205,"column":6},"end":{"line":205,"column":38}},"142":{"start":{"line":206,"column":6},"end":{"line":206,"column":33}},"143":{"start":{"line":207,"column":6},"end":{"line":207,"column":20}},"144":{"start":{"line":212,"column":6},"end":{"line":212,"column":32}},"145":{"start":{"line":213,"column":6},"end":{"line":213,"column":34}},"146":{"start":{"line":214,"column":6},"end":{"line":214,"column":19}},"147":{"start":{"line":215,"column":6},"end":{"line":215,"column":36}},"148":{"start":{"line":216,"column":6},"end":{"line":216,"column":43}},"149":{"start":{"line":217,"column":6},"end":{"line":217,"column":53}},"150":{"start":{"line":218,"column":6},"end":{"line":218,"column":53}},"151":{"start":{"line":219,"column":6},"end":{"line":219,"column":43}},"152":{"start":{"line":220,"column":6},"end":{"line":220,"column":53}},"153":{"start":{"line":221,"column":6},"end":{"line":221,"column":20}},"154":{"start":{"line":226,"column":6},"end":{"line":226,"column":32}},"155":{"start":{"line":227,"column":6},"end":{"line":229,"column":7}},"156":{"start":{"line":228,"column":8},"end":{"line":228,"column":25}},"157":{"start":{"line":230,"column":6},"end":{"line":230,"column":34}},"158":{"start":{"line":231,"column":6},"end":{"line":231,"column":19}},"159":{"start":{"line":232,"column":6},"end":{"line":232,"column":44}},"160":{"start":{"line":233,"column":6},"end":{"line":233,"column":50}},"161":{"start":{"line":234,"column":6},"end":{"line":234,"column":67}},"162":{"start":{"line":235,"column":6},"end":{"line":235,"column":67}},"163":{"start":{"line":236,"column":6},"end":{"line":236,"column":73}},"164":{"start":{"line":237,"column":6},"end":{"line":237,"column":72}},"165":{"start":{"line":238,"column":6},"end":{"line":238,"column":73}},"166":{"start":{"line":239,"column":6},"end":{"line":239,"column":20}},"167":{"start":{"line":244,"column":6},"end":{"line":244,"column":32}},"168":{"start":{"line":245,"column":6},"end":{"line":247,"column":7}},"169":{"start":{"line":246,"column":8},"end":{"line":246,"column":25}},"170":{"start":{"line":248,"column":6},"end":{"line":248,"column":34}},"171":{"start":{"line":249,"column":6},"end":{"line":249,"column":19}},"172":{"start":{"line":250,"column":6},"end":{"line":250,"column":44}},"173":{"start":{"line":251,"column":6},"end":{"line":251,"column":50}},"174":{"start":{"line":252,"column":6},"end":{"line":252,"column":66}},"175":{"start":{"line":253,"column":6},"end":{"line":253,"column":67}},"176":{"start":{"line":254,"column":6},"end":{"line":254,"column":73}},"177":{"start":{"line":255,"column":6},"end":{"line":255,"column":73}},"178":{"start":{"line":256,"column":6},"end":{"line":256,"column":73}},"179":{"start":{"line":257,"column":6},"end":{"line":257,"column":20}},"180":{"start":{"line":263,"column":6},"end":{"line":263,"column":32}},"181":{"start":{"line":264,"column":6},"end":{"line":264,"column":19}},"182":{"start":{"line":265,"column":6},"end":{"line":265,"column":51}},"183":{"start":{"line":266,"column":6},"end":{"line":266,"column":35}},"184":{"start":{"line":267,"column":6},"end":{"line":267,"column":23}},"185":{"start":{"line":268,"column":6},"end":{"line":268,"column":31}},"186":{"start":{"line":269,"column":6},"end":{"line":269,"column":42}},"187":{"start":{"line":270,"column":6},"end":{"line":270,"column":41}},"188":{"start":{"line":271,"column":6},"end":{"line":271,"column":45}},"189":{"start":{"line":272,"column":6},"end":{"line":272,"column":29}},"190":{"start":{"line":273,"column":6},"end":{"line":273,"column":33}},"191":{"start":{"line":274,"column":6},"end":{"line":274,"column":29}},"192":{"start":{"line":275,"column":6},"end":{"line":275,"column":20}},"193":{"start":{"line":279,"column":2},"end":{"line":279,"column":14}},"194":{"start":{"line":282,"column":0},"end":{"line":282,"column":27}}},"branchMap":{"1":{"line":10,"type":"if","locations":[{"start":{"line":10,"column":4},"end":{"line":10,"column":4}},{"start":{"line":10,"column":4},"end":{"line":10,"column":4}}]},"2":{"line":54,"type":"if","locations":[{"start":{"line":54,"column":6},"end":{"line":54,"column":6}},{"start":{"line":54,"column":6},"end":{"line":54,"column":6}}]},"3":{"line":73,"type":"if","locations":[{"start":{"line":73,"column":6},"end":{"line":73,"column":6}},{"start":{"line":73,"column":6},"end":{"line":73,"column":6}}]},"4":{"line":91,"type":"if","locations":[{"start":{"line":91,"column":6},"end":{"line":91,"column":6}},{"start":{"line":91,"column":6},"end":{"line":91,"column":6}}]},"5":{"line":109,"type":"if","locations":[{"start":{"line":109,"column":6},"end":{"line":109,"column":6}},{"start":{"line":109,"column":6},"end":{"line":109,"column":6}}]},"6":{"line":128,"type":"if","locations":[{"start":{"line":128,"column":6},"end":{"line":128,"column":6}},{"start":{"line":128,"column":6},"end":{"line":128,"column":6}}]},"7":{"line":132,"type":"if","locations":[{"start":{"line":132,"column":6},"end":{"line":132,"column":6}},{"start":{"line":132,"column":6},"end":{"line":132,"column":6}}]},"8":{"line":147,"type":"if","locations":[{"start":{"line":147,"column":6},"end":{"line":147,"column":6}},{"start":{"line":147,"column":6},"end":{"line":147,"column":6}}]},"9":{"line":151,"type":"if","locations":[{"start":{"line":151,"column":6},"end":{"line":151,"column":6}},{"start":{"line":151,"column":6},"end":{"line":151,"column":6}}]},"10":{"line":166,"type":"if","locations":[{"start":{"line":166,"column":6},"end":{"line":166,"column":6}},{"start":{"line":166,"column":6},"end":{"line":166,"column":6}}]},"11":{"line":227,"type":"if","locations":[{"start":{"line":227,"column":6},"end":{"line":227,"column":6}},{"start":{"line":227,"column":6},"end":{"line":227,"column":6}}]},"12":{"line":245,"type":"if","locations":[{"start":{"line":245,"column":6},"end":{"line":245,"column":6}},{"start":{"line":245,"column":6},"end":{"line":245,"column":6}}]}}},"/home/dano/fili.js/src/iirFilter.js":{"path":"/home/dano/fili.js/src/iirFilter.js","s":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":6,"7":6,"8":6,"9":6,"10":6,"11":18,"12":18,"13":18,"14":18,"15":18,"16":18,"17":18,"18":18,"19":18,"20":18,"21":18,"22":18,"23":18,"24":18,"25":6,"26":363618,"27":363618,"28":363618,"29":363618,"30":363618,"31":6,"32":121206,"33":121206,"34":121206,"35":363618,"36":121206,"37":6,"38":5418,"39":5418,"40":5418,"41":5418,"42":5418,"43":5418,"44":5418,"45":5418,"46":5418,"47":6,"48":1806,"49":1806,"50":1806,"51":5418,"52":5418,"53":5418,"54":1806,"55":1806,"56":6,"57":18,"58":18,"59":54,"60":18,"61":6,"62":18,"63":18,"64":6,"65":12,"66":12,"67":12,"68":12,"69":1200,"70":12,"71":12,"72":12,"73":12,"74":95,"75":12,"76":12,"77":95,"78":12,"79":12,"80":12,"81":12,"82":6,"83":0,"84":0,"85":0,"86":0,"87":6,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":6,"95":6,"96":6,"97":6,"98":6,"99":600,"100":6,"101":600,"102":6,"103":594,"104":6,"105":12,"106":12,"107":12,"108":12,"109":12,"110":1800,"111":12,"112":12,"113":0,"114":6,"115":18,"116":6,"117":1},"b":{"1":[12,83],"2":[95,45],"3":[12,83],"4":[95,57,57],"5":[0,0],"6":[6,594],"7":[12,6]},"f":{"1":6,"2":363618,"3":121206,"4":5418,"5":1806,"6":18,"7":18,"8":12,"9":0,"10":0,"11":6,"12":6,"13":6,"14":6,"15":600,"16":6,"17":600,"18":6,"19":12,"20":0,"21":6},"fnMap":{"1":{"name":"IirFilter","line":11,"loc":{"start":{"line":11,"column":16},"end":{"line":11,"column":43}}},"2":{"name":"runStage","line":54,"loc":{"start":{"line":54,"column":17},"end":{"line":54,"column":45}}},"3":{"name":"doStep","line":62,"loc":{"start":{"line":62,"column":15},"end":{"line":62,"column":46}}},"4":{"name":"biquadResponse","line":71,"loc":{"start":{"line":71,"column":23},"end":{"line":71,"column":58}}},"5":{"name":"calcResponse","line":93,"loc":{"start":{"line":93,"column":21},"end":{"line":93,"column":51}}},"6":{"name":"reinit","line":111,"loc":{"start":{"line":111,"column":15},"end":{"line":111,"column":33}}},"7":{"name":"calcInputResponse","line":145,"loc":{"start":{"line":145,"column":26},"end":{"line":145,"column":60}}},"8":{"name":"predefinedResponse","line":150,"loc":{"start":{"line":150,"column":27},"end":{"line":150,"column":68}}},"9":{"name":"getComplRes","line":180,"loc":{"start":{"line":180,"column":20},"end":{"line":180,"column":49}}},"10":{"name":"getPZ","line":201,"loc":{"start":{"line":201,"column":14},"end":{"line":201,"column":31}}},"11":{"name":"singleStep","line":212,"loc":{"start":{"line":212,"column":16},"end":{"line":212,"column":43}}},"12":{"name":"multiStep","line":215,"loc":{"start":{"line":215,"column":15},"end":{"line":215,"column":52}}},"13":{"name":"simulate","line":218,"loc":{"start":{"line":218,"column":14},"end":{"line":218,"column":39}}},"14":{"name":"stepResponse","line":221,"loc":{"start":{"line":221,"column":18},"end":{"line":221,"column":48}}},"15":{"name":"(anonymous_15)","line":222,"loc":{"start":{"line":222,"column":32},"end":{"line":222,"column":44}}},"16":{"name":"impulseResponse","line":226,"loc":{"start":{"line":226,"column":21},"end":{"line":226,"column":54}}},"17":{"name":"(anonymous_17)","line":227,"loc":{"start":{"line":227,"column":32},"end":{"line":227,"column":47}}},"18":{"name":"responsePoint","line":235,"loc":{"start":{"line":235,"column":19},"end":{"line":235,"column":50}}},"19":{"name":"response","line":238,"loc":{"start":{"line":238,"column":14},"end":{"line":238,"column":44}}},"20":{"name":"polesZeros","line":252,"loc":{"start":{"line":252,"column":16},"end":{"line":252,"column":38}}},"21":{"name":"reinit","line":255,"loc":{"start":{"line":255,"column":12},"end":{"line":255,"column":30}}}},"statementMap":{"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":34}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":31}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":45}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":43}},"5":{"start":{"line":11,"column":0},"end":{"line":262,"column":2}},"6":{"start":{"line":12,"column":2},"end":{"line":12,"column":17}},"7":{"start":{"line":13,"column":2},"end":{"line":16,"column":4}},"8":{"start":{"line":17,"column":2},"end":{"line":17,"column":14}},"9":{"start":{"line":18,"column":2},"end":{"line":18,"column":14}},"10":{"start":{"line":19,"column":2},"end":{"line":52,"column":3}},"11":{"start":{"line":20,"column":4},"end":{"line":20,"column":17}},"12":{"start":{"line":21,"column":4},"end":{"line":21,"column":19}},"13":{"start":{"line":22,"column":4},"end":{"line":25,"column":6}},"14":{"start":{"line":26,"column":4},"end":{"line":29,"column":6}},"15":{"start":{"line":30,"column":4},"end":{"line":33,"column":6}},"16":{"start":{"line":34,"column":4},"end":{"line":37,"column":6}},"17":{"start":{"line":38,"column":4},"end":{"line":41,"column":6}},"18":{"start":{"line":42,"column":4},"end":{"line":45,"column":6}},"19":{"start":{"line":46,"column":4},"end":{"line":46,"column":23}},"20":{"start":{"line":47,"column":4},"end":{"line":47,"column":17}},"21":{"start":{"line":48,"column":4},"end":{"line":48,"column":33}},"22":{"start":{"line":49,"column":4},"end":{"line":49,"column":33}},"23":{"start":{"line":50,"column":4},"end":{"line":50,"column":24}},"24":{"start":{"line":51,"column":4},"end":{"line":51,"column":24}},"25":{"start":{"line":54,"column":2},"end":{"line":60,"column":4}},"26":{"start":{"line":55,"column":4},"end":{"line":55,"column":68}},"27":{"start":{"line":56,"column":4},"end":{"line":56,"column":67}},"28":{"start":{"line":57,"column":4},"end":{"line":57,"column":20}},"29":{"start":{"line":58,"column":4},"end":{"line":58,"column":18}},"30":{"start":{"line":59,"column":4},"end":{"line":59,"column":15}},"31":{"start":{"line":62,"column":2},"end":{"line":69,"column":4}},"32":{"start":{"line":63,"column":4},"end":{"line":63,"column":20}},"33":{"start":{"line":64,"column":4},"end":{"line":64,"column":16}},"34":{"start":{"line":65,"column":4},"end":{"line":67,"column":5}},"35":{"start":{"line":66,"column":6},"end":{"line":66,"column":39}},"36":{"start":{"line":68,"column":4},"end":{"line":68,"column":15}},"37":{"start":{"line":71,"column":2},"end":{"line":91,"column":4}},"38":{"start":{"line":72,"column":4},"end":{"line":72,"column":23}},"39":{"start":{"line":73,"column":4},"end":{"line":73,"column":23}},"40":{"start":{"line":77,"column":4},"end":{"line":77,"column":41}},"41":{"start":{"line":78,"column":4},"end":{"line":81,"column":6}},"42":{"start":{"line":83,"column":4},"end":{"line":83,"column":105}},"43":{"start":{"line":84,"column":4},"end":{"line":84,"column":87}},"44":{"start":{"line":85,"column":4},"end":{"line":85,"column":30}},"45":{"start":{"line":86,"column":4},"end":{"line":89,"column":6}},"46":{"start":{"line":90,"column":4},"end":{"line":90,"column":15}},"47":{"start":{"line":93,"column":2},"end":{"line":109,"column":4}},"48":{"start":{"line":94,"column":4},"end":{"line":94,"column":16}},"49":{"start":{"line":95,"column":4},"end":{"line":98,"column":6}},"50":{"start":{"line":99,"column":4},"end":{"line":106,"column":5}},"51":{"start":{"line":100,"column":6},"end":{"line":100,"column":46}},"52":{"start":{"line":103,"column":6},"end":{"line":103,"column":35}},"53":{"start":{"line":105,"column":6},"end":{"line":105,"column":27}},"54":{"start":{"line":107,"column":4},"end":{"line":107,"column":65}},"55":{"start":{"line":108,"column":4},"end":{"line":108,"column":15}},"56":{"start":{"line":111,"column":2},"end":{"line":143,"column":4}},"57":{"start":{"line":112,"column":4},"end":{"line":112,"column":19}},"58":{"start":{"line":113,"column":4},"end":{"line":141,"column":5}},"59":{"start":{"line":114,"column":6},"end":{"line":140,"column":8}},"60":{"start":{"line":142,"column":4},"end":{"line":142,"column":17}},"61":{"start":{"line":145,"column":2},"end":{"line":148,"column":4}},"62":{"start":{"line":146,"column":4},"end":{"line":146,"column":25}},"63":{"start":{"line":147,"column":4},"end":{"line":147,"column":48}},"64":{"start":{"line":150,"column":2},"end":{"line":178,"column":4}},"65":{"start":{"line":151,"column":4},"end":{"line":151,"column":17}},"66":{"start":{"line":152,"column":4},"end":{"line":152,"column":19}},"67":{"start":{"line":153,"column":4},"end":{"line":153,"column":16}},"68":{"start":{"line":154,"column":4},"end":{"line":156,"column":5}},"69":{"start":{"line":155,"column":6},"end":{"line":155,"column":27}},"70":{"start":{"line":157,"column":4},"end":{"line":157,"column":39}},"71":{"start":{"line":158,"column":4},"end":{"line":158,"column":25}},"72":{"start":{"line":159,"column":4},"end":{"line":159,"column":25}},"73":{"start":{"line":160,"column":4},"end":{"line":176,"column":5}},"74":{"start":{"line":161,"column":6},"end":{"line":167,"column":7}},"75":{"start":{"line":162,"column":8},"end":{"line":162,"column":24}},"76":{"start":{"line":163,"column":8},"end":{"line":166,"column":10}},"77":{"start":{"line":168,"column":6},"end":{"line":175,"column":7}},"78":{"start":{"line":169,"column":8},"end":{"line":169,"column":24}},"79":{"start":{"line":170,"column":8},"end":{"line":173,"column":10}},"80":{"start":{"line":174,"column":8},"end":{"line":174,"column":14}},"81":{"start":{"line":177,"column":4},"end":{"line":177,"column":15}},"82":{"start":{"line":180,"column":2},"end":{"line":199,"column":4}},"83":{"start":{"line":181,"column":4},"end":{"line":181,"column":45}},"84":{"start":{"line":182,"column":4},"end":{"line":198,"column":5}},"85":{"start":{"line":183,"column":6},"end":{"line":189,"column":9}},"86":{"start":{"line":191,"column":6},"end":{"line":197,"column":9}},"87":{"start":{"line":201,"column":2},"end":{"line":209,"column":4}},"88":{"start":{"line":202,"column":4},"end":{"line":202,"column":17}},"89":{"start":{"line":203,"column":4},"end":{"line":207,"column":5}},"90":{"start":{"line":204,"column":6},"end":{"line":204,"column":20}},"91":{"start":{"line":205,"column":6},"end":{"line":205,"column":55}},"92":{"start":{"line":206,"column":6},"end":{"line":206,"column":55}},"93":{"start":{"line":208,"column":4},"end":{"line":208,"column":15}},"94":{"start":{"line":211,"column":2},"end":{"line":260,"column":4}},"95":{"start":{"line":213,"column":6},"end":{"line":213,"column":31}},"96":{"start":{"line":216,"column":6},"end":{"line":216,"column":58}},"97":{"start":{"line":219,"column":6},"end":{"line":219,"column":38}},"98":{"start":{"line":222,"column":6},"end":{"line":224,"column":17}},"99":{"start":{"line":223,"column":8},"end":{"line":223,"column":17}},"100":{"start":{"line":227,"column":6},"end":{"line":233,"column":17}},"101":{"start":{"line":228,"column":8},"end":{"line":232,"column":9}},"102":{"start":{"line":229,"column":10},"end":{"line":229,"column":19}},"103":{"start":{"line":231,"column":10},"end":{"line":231,"column":19}},"104":{"start":{"line":236,"column":6},"end":{"line":236,"column":34}},"105":{"start":{"line":239,"column":6},"end":{"line":239,"column":37}},"106":{"start":{"line":240,"column":6},"end":{"line":240,"column":19}},"107":{"start":{"line":241,"column":6},"end":{"line":241,"column":18}},"108":{"start":{"line":242,"column":6},"end":{"line":242,"column":29}},"109":{"start":{"line":243,"column":6},"end":{"line":248,"column":7}},"110":{"start":{"line":244,"column":8},"end":{"line":247,"column":11}},"111":{"start":{"line":249,"column":6},"end":{"line":249,"column":25}},"112":{"start":{"line":250,"column":6},"end":{"line":250,"column":17}},"113":{"start":{"line":253,"column":6},"end":{"line":253,"column":21}},"114":{"start":{"line":256,"column":6},"end":{"line":258,"column":7}},"115":{"start":{"line":257,"column":8},"end":{"line":257,"column":27}},"116":{"start":{"line":261,"column":2},"end":{"line":261,"column":14}},"117":{"start":{"line":264,"column":0},"end":{"line":264,"column":27}}},"branchMap":{"1":{"line":161,"type":"if","locations":[{"start":{"line":161,"column":6},"end":{"line":161,"column":6}},{"start":{"line":161,"column":6},"end":{"line":161,"column":6}}]},"2":{"line":161,"type":"binary-expr","locations":[{"start":{"line":161,"column":10},"end":{"line":161,"column":41}},{"start":{"line":161,"column":45},"end":{"line":161,"column":54}}]},"3":{"line":168,"type":"if","locations":[{"start":{"line":168,"column":6},"end":{"line":168,"column":6}},{"start":{"line":168,"column":6},"end":{"line":168,"column":6}}]},"4":{"line":168,"type":"binary-expr","locations":[{"start":{"line":168,"column":10},"end":{"line":168,"column":18}},{"start":{"line":168,"column":22},"end":{"line":168,"column":31}},{"start":{"line":168,"column":35},"end":{"line":168,"column":66}}]},"5":{"line":182,"type":"if","locations":[{"start":{"line":182,"column":4},"end":{"line":182,"column":4}},{"start":{"line":182,"column":4},"end":{"line":182,"column":4}}]},"6":{"line":228,"type":"if","locations":[{"start":{"line":228,"column":8},"end":{"line":228,"column":8}},{"start":{"line":228,"column":8},"end":{"line":228,"column":8}}]},"7":{"line":239,"type":"binary-expr","locations":[{"start":{"line":239,"column":19},"end":{"line":239,"column":29}},{"start":{"line":239,"column":33},"end":{"line":239,"column":36}}]}}}} \ No newline at end of file diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css new file mode 100644 index 0000000..a6a2f32 --- /dev/null +++ b/coverage/lcov-report/base.css @@ -0,0 +1,182 @@ +body, html { + margin:0; padding: 0; +} +body { + font-family: Helvetica Neue, Helvetica,Arial; + font-size: 10pt; +} +div.header, div.footer { + background: #eee; + padding: 1em; +} +div.header { + z-index: 100; + position: fixed; + top: 0; + border-bottom: 1px solid #666; + width: 100%; +} +div.footer { + border-top: 1px solid #666; +} +div.body { + margin-top: 10em; +} +div.meta { + font-size: 90%; + text-align: center; +} +h1, h2, h3 { + font-weight: normal; +} +h1 { + font-size: 12pt; +} +h2 { + font-size: 10pt; +} +pre { + font-family: Consolas, Menlo, Monaco, monospace; + margin: 0; + padding: 0; + line-height: 1.3; + font-size: 14px; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} + +div.path { font-size: 110%; } +div.path a:link, div.path a:visited { color: #000; } +table.coverage { border-collapse: collapse; margin:0; padding: 0 } + +table.coverage td { + margin: 0; + padding: 0; + color: #111; + vertical-align: top; +} +table.coverage td.line-count { + width: 50px; + text-align: right; + padding-right: 5px; +} +table.coverage td.line-coverage { + color: #777 !important; + text-align: right; + border-left: 1px solid #666; + border-right: 1px solid #666; +} + +table.coverage td.text { +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 40px; +} +table.coverage td span.cline-neutral { + background: #eee; +} +table.coverage td span.cline-yes { + background: #b5d592; + color: #999; +} +table.coverage td span.cline-no { + background: #fc8c84; +} + +.cstat-yes { color: #111; } +.cstat-no { background: #fc8c84; color: #111; } +.fstat-no { background: #ffc520; color: #111 !important; } +.cbranch-no { background: yellow !important; color: #111; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +.missing-if-branch { + display: inline-block; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: black; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} + +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} + +.entity, .metric { font-weight: bold; } +.metric { display: inline-block; border: 1px solid #333; padding: 0.3em; background: white; } +.metric small { font-size: 80%; font-weight: normal; color: #666; } + +div.coverage-summary table { border-collapse: collapse; margin: 3em; font-size: 110%; } +div.coverage-summary td, div.coverage-summary table th { margin: 0; padding: 0.25em 1em; border-top: 1px solid #666; border-bottom: 1px solid #666; } +div.coverage-summary th { text-align: left; border: 1px solid #666; background: #eee; font-weight: normal; } +div.coverage-summary th.file { border-right: none !important; } +div.coverage-summary th.pic { border-left: none !important; text-align: right; } +div.coverage-summary th.pct { border-right: none !important; } +div.coverage-summary th.abs { border-left: none !important; text-align: right; } +div.coverage-summary td.pct { text-align: right; border-left: 1px solid #666; } +div.coverage-summary td.abs { text-align: right; font-size: 90%; color: #444; border-right: 1px solid #666; } +div.coverage-summary td.file { border-left: 1px solid #666; white-space: nowrap; } +div.coverage-summary td.pic { min-width: 120px !important; } +div.coverage-summary a:link { text-decoration: none; color: #000; } +div.coverage-summary a:visited { text-decoration: none; color: #777; } +div.coverage-summary a:hover { text-decoration: underline; } +div.coverage-summary tfoot td { border-top: 1px solid #666; } + +div.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +div.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +div.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} + +.high { background: #b5d592 !important; } +.medium { background: #ffe87c !important; } +.low { background: #fc8c84 !important; } + +span.cover-fill, span.cover-empty { + display:inline-block; + border:1px solid #444; + background: white; + height: 12px; +} +span.cover-fill { + background: #ccc; + border-right: 1px solid #444; +} +span.cover-empty { + background: white; + border-left: none; +} +span.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html new file mode 100644 index 0000000..ac702ae --- /dev/null +++ b/coverage/lcov-report/index.html @@ -0,0 +1,73 @@ + + + + Code coverage report for All files + + + + + + +
+

Code coverage report for All files

+

+ Statements: 90.24% (712 / 789)      + Branches: 70.59% (84 / 119)      + Functions: 87.97% (117 / 133)      + Lines: 90.36% (712 / 788)      + Ignored: none      +

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
src/90.24%(712 / 789)70.59%(84 / 119)87.97%(117 / 133)90.36%(712 / 788)
+
+
+ + + + + + diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js new file mode 100644 index 0000000..ef51e03 --- /dev/null +++ b/coverage/lcov-report/prettify.js @@ -0,0 +1 @@ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..03f704a609c6fd0dbfdac63466a7d7c958b5cbf3 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii$m5978H@?Fn+^JD|Y9yzj{W`447Gxa{7*dM7nnnD-Lb z6^}Hx2)'; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function (a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function (a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function () { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i =0 ; i < cols.length; i += 1) { + if (cols[i].sortable) { + el = getNthColumn(i).querySelector('.sorter'); + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function () { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(cols); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/lcov-report/src/calcCascades.js.html b/coverage/lcov-report/src/calcCascades.js.html new file mode 100644 index 0000000..65eda0c --- /dev/null +++ b/coverage/lcov-report/src/calcCascades.js.html @@ -0,0 +1,423 @@ + + + + Code coverage report for src/calcCascades.js + + + + + + +
+

Code coverage report for src/calcCascades.js

+

+ Statements: 90.91% (40 / 44)      + Branches: 87.5% (21 / 24)      + Functions: 100% (5 / 5)      + Lines: 90.91% (40 / 44)      + Ignored: none      +

+
All files » src/ » calcCascades.js
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127  +  +1 +  +1 +  +1 +  +  +  +  +  +  +  +  +  +1 +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1 +26 +26 +26 +26 +  +  +26 +76 +76 +21 +  +  +  +  +  +  +  +55 +35 +35 +  +20 +20 +  +  +20 +  +  +  +55 +11 +  +44 +  +55 +9 +3 +  +  +55 +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +26 +  +  +1 +14 +26 +  +  +  +1 +1 +1 +1 +14 +14 +  +1 +1 +  +1 +  +  +1 + 
'use strict';
+ 
+var IirCoeffs = require('./iirCoeffs');
+ 
+var getCoeffs = new IirCoeffs();
+ 
+var table = {
+  // values from https://gist.github.com/endolith/4982787#file-all-values-txt
+  bessel: {
+    q: [[0.57735026919], [0.805538281842, 0.521934581669], [1.02331395383, 0.611194546878, 0.510317824749], [1.22566942541, 0.710852074442, 0.559609164796, 0.505991069397], [1.41530886916, 0.809790964842, 0.620470155556, 0.537552151325, 0.503912727276], [1.59465693507, 0.905947107025, 0.684008068137, 0.579367238641, 0.525936202016, 0.502755558204], [1.76552743493, 0.998998442993, 0.747625068271, 0.624777082395, 0.556680772868, 0.519027293158, 0.502045428643], [1.9292718407, 1.08906376917, 0.810410302962, 0.671382379377, 0.591144659703, 0.542678365981, 0.514570953471, 0.501578400482], [2.08691792612, 1.17637337045, 0.872034231424, 0.718163551101, 0.627261751983, 0.569890924765, 0.533371782078, 0.511523796759, 0.50125489338], [2.23926560629, 1.26117120993, 0.932397288146, 0.764647810579, 0.664052481472, 0.598921924986, 0.555480327396, 0.526848630061, 0.509345928377, 0.501021580965], [2.38695091667, 1.34368488961, 0.991497755204, 0.81060830488, 0.701011199665, 0.628878390935, 0.57943181849, 0.545207253735, 0.52208637596, 0.507736060535, 0.500847111042], [2.53048919562, 1.42411783481, 1.04937620183, 0.85593899901, 0.737862159044, 0.659265671705, 0.604435823473, 0.565352679646, 0.537608804383, 0.51849505465, 0.506508536474, 0.500715908905]],
+    f3dB: [[1.27201964951], [1.60335751622, 1.43017155999], [1.9047076123, 1.68916826762, 1.60391912877], [2.18872623053, 1.95319575902, 1.8320926012, 1.77846591177], [2.45062684305, 2.20375262593, 2.06220731793, 1.98055310881, 1.94270419166], [2.69298925084, 2.43912611431, 2.28431825401, 2.18496722634, 2.12472538477, 2.09613322542], [2.91905714471, 2.66069088948, 2.49663434571, 2.38497976939, 2.30961462222, 2.26265746534, 2.24005716132], [3.13149167404, 2.87016099416, 2.69935018044, 2.57862945683, 2.49225505119, 2.43227707449, 2.39427710712, 2.37582307687], [3.33237300564, 3.06908580184, 2.89318259511, 2.76551588399, 2.67073340527, 2.60094950474, 2.55161764546, 2.52001358804, 2.50457164552], [3.52333123464, 3.25877569704, 3.07894353744, 2.94580435024, 2.84438325189, 2.76691082498, 2.70881411245, 2.66724655259, 2.64040228249, 2.62723439989], [3.70566068548, 3.44032173223, 3.2574059854, 3.11986367838, 3.01307175388, 2.92939234605, 2.86428726094, 2.81483068055, 2.77915465405, 2.75596888377, 2.74456638588], [3.88040469682, 3.61463243697, 3.4292654707, 3.28812274966, 3.17689762788, 3.08812364257, 3.01720732972, 2.96140104561, 2.91862858495, 2.88729479473, 2.8674198668, 2.8570800015]],
+    f1dB: [[2.16477559371], [2.70320928596, 2.41122332505], [3.25676581436, 2.88822569572, 2.74246238837], [3.76153580353, 3.35675411406, 3.14862673032, 3.05646412475], [4.22174260104, 3.79644757806, 3.55260471864, 3.41193742197, 3.34673435508], [4.64584812552, 4.20789257981, 3.94082363122, 3.76942681446, 3.66549975744, 3.61617359345], [5.04060395196, 4.5944592201, 4.3111677248, 4.11836351827, 3.98822359814, 3.90713836715, 3.86811234525], [5.41107948467, 4.95951159709, 4.66435804468, 4.45575796102, 4.30650679478, 4.20286750045, 4.13720522991, 4.10531748119], [5.76110791853, 5.30592898465, 5.00182215701, 4.7811081045, 4.61724509926, 4.49660100894, 4.41131378918, 4.35667671372, 4.32997951075], [6.09364309488, 5.63609116014, 5.32506930789, 5.09480346139, 4.91939504255, 4.78540258409, 4.68493280536, 4.61302286993, 4.56661931366, 4.54382759952], [6.41100731543, 5.95195558182, 5.63550073656, 5.39754464742, 5.21278891332, 5.06801430334, 4.95539684456, 4.8697869429, 4.80814951843, 4.76793469612, 4.74828032403], [6.71506056052, 6.25514029778, 5.9343616072, 5.69011422355, 5.49763642361, 5.34401973764, 5.22125973611, 5.12485045619, 5.05037962112, 4.99699982231, 4.96155789635, 4.94441828777]]
+  }
+};
+ 
+// from Texas Instruments "Op Amps for Everyone" Chapter 16 "Active Filter Design Techniques"
+var tiTable = {
+  bessel: {
+    as: [[1.3617], [1.3397, 0.7743], [1.2217, 0.9686, 0.5131], [1.1112, 0.9754, 0.7202, 0.3728], [1.0215, 0.9393, 0.7815, 0.5604, 0.2883]],
+    bs: [[0.6180], [0.4889, 0.3890], [0.3887, 0.3505, 0.2756], [0.3162, 0.2979, 0.2621, 0.2087], [0.2650, 0.2549, 0.2351, 0.2059, 0.1665]]
+  },
+  butterworth: {
+    as: [[1.4142], [1.8478, 0.7654], [1.9319, 1.4142, 0.5176], [1.9616, 1.6629, 1.1111, 0.3902], [1.9754, 1.7820, 1.4142, 0.9080, 0.3129]],
+    bs: [[1.0], [1.0, 1.0], [1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0]]
+  },
+  tschebyscheff05: {
+    as: [[1.3614], [2.6282, 0.3648], [3.8645, 0.7528, 0.1589], [5.1117, 1.0639, 0.3439, 0.0885], [6.3648, 1.3582, 0.4822, 0.1994, 0.0563]],
+    bs: [[1.3827], [3.4341, 1.1509], [6.9797, 1.8573, 1.0711], [11.9607, 2.9365, 1.4206, 1.0407], [18.3695, 4.3453, 1.9440, 1.2520, 1.0263]]
+  },
+  tschebyscheff1: {
+    as: [[1.3022], [2.5904, 0.3039], [3.8437, 0.6292, 0.1296], [5.1019, 0.8916, 0.2806, 0.0717], [6.3634, 1.1399, 0.3939, 0.1616, 0.0455]],
+    bs: [[1.5515], [4.1301, 1.1697], [8.5529, 1.9124, 1.0766], [14.7608, 3.0426, 1.4334, 1.0432], [22.7468, 4.5167, 1.9665, 1.2569, 1.0277]]
+  },
+  tschebyscheff2: {
+    as: [[1.1813], [2.4025, 0.2374], [3.5880, 0.4925, 0.0995], [4.7743, 0.6991, 0.2153, 0.0547], [5.9618, 0.8947, 0.3023, 0.1233, 0.0347]],
+    bs: [[1.7775], [4.9862, 1.1896], [10.4648, 1.9622, 1.0826], [18.1510, 3.1353, 1.4449, 1.0461], [28.0376, 4.6644, 1.9858, 1.2614, 1.0294]]
+  },
+  tschebyscheff3: {
+    as: [[1.0650], [2.1853, 0.1964], [3.2721, 0.4077, 0.0815], [4.3583, 0.5791, 0.1765, 0.0448], [5.4449, 0.7414, 0.2479, 0.1008, 0.0283]],
+    bs: [[1.9305], [5.5339, 1.2009], [11.6773, 1.9873, 1.0861], [20.2948, 3.1808, 1.4507, 1.0478], [31.3788, 4.7363, 1.9952, 1.2638, 1.0304]]
+  },
+  allpass: {
+    as: [[1.6278], [2.3370, 1.3506], [2.6117, 2.0706, 1.0967], [2.7541, 2.4174, 1.7850, 0.9239], [2.8406, 2.6120, 2.1733, 1.5583, 0.8018]],
+    bs: [[0.8832], [1.4878, 1.1837], [1.7763, 1.6015, 1.2596], [1.9420, 1.8300, 1.6101, 1.2822], [2.0490, 1.9714, 1.8184, 1.5923, 1.2877]]
+  }
+};
+ 
+var calcCoeffs = function calcCoeffs(params, behavior) {
+  var filter = [];
+  var cnt = 0;
+  Eif (behavior !== 'fromPZ') {
+    Iif (params.order > 12) {
+      params.order = 12;
+    }
+    for (cnt = 0; cnt < params.order; cnt++) {
+      var q, f, fd;
+      if (params.transform === 'matchedZ') {
+        filter.push(getCoeffs['lowpassMZ']({
+          Fs: params.Fs,
+          Fc: params.Fc,
+          preGain: params.preGain,
+          as: tiTable[params.characteristic].as[params.order - 1][cnt],
+          bs: tiTable[params.characteristic].bs[params.order - 1][cnt]
+        }));
+      } else {
+        if (params.characteristic === 'butterworth') {
+          q = 0.5 / Math.sin(Math.PI / (params.order * 2) * (cnt + 0.5));
+          f = 1;
+        } else {
+          q = table[params.characteristic].q[params.order - 1][cnt];
+          Iif (params.oneDb) {
+            f = table[params.characteristic].f1dB[params.order - 1][cnt];
+          } else {
+            f = table[params.characteristic].f3dB[params.order - 1][cnt];
+          }
+        }
+ 
+        if (behavior === 'highpass') {
+          fd = params.Fc / f;
+        } else {
+          fd = params.Fc * f;
+        }
+        if (behavior === 'bandpass' || behavior === 'bandstop') {
+          if (params.characteristic === 'bessel') {
+            fd = Math.sqrt(params.order) * fd / params.order;
+          }
+        }
+        filter.push(getCoeffs[behavior]({
+          Fs: params.Fs,
+          Fc: fd,
+          Q: q,
+          BW: params.BW || 0,
+          gain: params.gain || 0,
+          preGain: params.preGain || false
+        }));
+      }
+    }
+  } else {
+    for (cnt = 0; cnt < params.length; cnt++) {
+      filter.push(getCoeffs[behavior](params[cnt]));
+    }
+  }
+ 
+  return filter;
+};
+ 
+var initCalcCoeffs = function initCalcCoeffs(behavior) {
+  return function (params) {
+    return calcCoeffs(params, behavior);
+  };
+};
+ 
+var self = {};
+var CalcCascades = function CalcCascades() {
+  var available = [];
+  for (var k in getCoeffs) {
+    self[k] = initCalcCoeffs(k);
+    available.push(k);
+  }
+  self.available = function () {
+    return available;
+  };
+  return self;
+};
+ 
+module.exports = CalcCascades;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL2Rhbm8vZmlsaS5qcy9zcmMvY2FsY0Nhc2NhZGVzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQTs7QUFFWixJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUE7O0FBRXRDLElBQUksU0FBUyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUE7O0FBRS9CLElBQUksS0FBSyxHQUFHOztBQUVWLFFBQU0sRUFBRTtBQUNOLEtBQUMsRUFBRSxDQUNELENBQUMsYUFBYSxDQUFDLEVBQ2YsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLEVBQ2hDLENBQUMsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsRUFDL0MsQ0FBQyxhQUFhLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsRUFDL0QsQ0FBQyxhQUFhLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsY0FBYyxDQUFDLEVBQy9FLENBQUMsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsRUFDL0YsQ0FBQyxhQUFhLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsRUFDL0csQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsY0FBYyxDQUFDLEVBQzdILENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxhQUFhLENBQUMsRUFDN0ksQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsRUFDOUosQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsY0FBYyxDQUFDLEVBQzNLLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FDNUw7QUFDRCxRQUFJLEVBQUUsQ0FDSixDQUFDLGFBQWEsQ0FBQyxFQUNmLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUM5QixDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsYUFBYSxDQUFDLEVBQzVDLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsYUFBYSxDQUFDLEVBQzNELENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUMzRSxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxDQUFDLEVBQzFGLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxDQUFDLEVBQ3pHLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUN4SCxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxDQUFDLEVBQ3ZJLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxDQUFDLEVBQ3RKLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUNwSyxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQ2xMO0FBQ0QsUUFBSSxFQUFFLENBQ0osQ0FBQyxhQUFhLENBQUMsRUFDZixDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsRUFDOUIsQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUM3QyxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUM1RCxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsRUFDM0UsQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUMxRixDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUN2RyxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsRUFDeEgsQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUN0SSxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEs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QUFJLENBQUE7Q0FDWixDQUFBOztBQUVELE1BQU0sQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFBIiwiZmlsZSI6Ii9ob21lL2Rhbm8vZmlsaS5qcy9zcmMvY2FsY0Nhc2NhZGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbnZhciBJaXJDb2VmZnMgPSByZXF1aXJlKCcuL2lpckNvZWZmcycpXG5cbnZhciBnZXRDb2VmZnMgPSBuZXcgSWlyQ29lZmZzKClcblxudmFyIHRhYmxlID0ge1xuICAvLyB2YWx1ZXMgZnJvbSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9lbmRvbGl0aC80OTgyNzg3I2ZpbGUtYWxsLXZhbHVlcy10eHRcbiAgYmVzc2VsOiB7XG4gICAgcTogW1xuICAgICAgWzAuNTc3MzUwMjY5MTldLFxuICAgICAgWzAuODA1NTM4MjgxODQyLCAwLjUyMTkzNDU4MTY2OV0sXG4gICAgICBbMS4wMjMzMTM5NTM4MywgMC42MTExOTQ1NDY4NzgsIDAuNTEwMzE3ODI0NzQ5XSxcbiAgICAgIFsxLjIyNTY2OTQyNTQxLCAwLjcxMDg1MjA3NDQ0MiwgMC41NTk2MDkxNjQ3OTYsIDAuNTA1OTkxMDY5Mzk3XSxcbiAgICAgIFsxLjQxNTMwODg2OTE2LCAwLjgwOTc5MDk2NDg0MiwgMC42MjA0NzAxNTU1NTYsIDAuNTM3NTUyMTUxMzI1LCAwLjUwMzkxMjcyNzI3Nl0sXG4gICAgICBbMS41OTQ2NTY5MzUwNywgMC45MDU5NDcxMDcwMjUsIDAuNjg0MDA4MDY4MTM3LCAwLjU3OTM2NzIzODY0MSwgMC41MjU5MzYyMDIwMTYsIDAuNTAyNzU1NTU4MjA0XSxcbiAgICAgIFsxLjc2NTUyNzQzNDkzLCAwLjk5ODk5ODQ0Mjk5MywgMC43NDc2MjUwNjgyNzEsIDAuNjI0Nzc3MDgyMzk1LCAwLjU1NjY4MDc3Mjg2OCwgMC41MTkwMjcyOTMxNTgsIDAuNTAyMDQ1NDI4NjQzXSxcbiAgICAgIFsxLjkyOTI3MTg0MDcsIDEuMDg5MDYzNzY5MTcsIDAuODEwNDEwMzAyOTYyLCAwLjY3MTM4MjM3OTM3NywgMC41OTExNDQ2NTk3MDMsIDAuNTQyNjc4MzY1OTgxLCAwLjUxNDU3MDk1MzQ3MSwgMC41MDE1Nzg0MDA0ODJdLFxuICAgICAgWzIuMDg2OTE3OTI2MTIsIDEuMTc2MzczMzcwNDUsIDAuODcyMDM0MjMxNDI0LCAwLjcxODE2MzU1MTEwMSwgMC42MjcyNjE3NTE5ODMsIDAuNTY5ODkwOTI0NzY1LCAwLjUzMzM3MTc4MjA3OCwgMC41MTE1MjM3OTY3NTksIDAuNTAxMjU0ODkzMzhdLFxuICAgICAgWzIuMjM5MjY1NjA2MjksIDEuMjYxMTcxMjA5OTMsIDAuOTMyMzk3Mjg4MTQ2LCAwLjc2NDY0NzgxMDU3OSwgMC42NjQwNTI0ODE0NzIsIDAuNTk4OTIxOTI0OTg2LCAwLjU1NTQ4MDMyNzM5NiwgMC41MjY4NDg2MzAwNjEsIDAuNTA5MzQ1OTI4Mzc3LCAwLjUwMTAyMTU4MDk2NV0sXG4gICAgICBbMi4zODY5NTA5MTY2NywgMS4zNDM2ODQ4ODk2MSwgMC45OTE0OTc3NTUyMDQsIDAuODEwNjA4MzA0ODgsIDAuNzAxMDExMTk5NjY1LCAwLjYyODg3ODM5MDkzNSwgMC41Nzk0MzE4MTg0OSwgMC41NDUyMDcyNTM3MzUsIDAuNTIyMDg2Mzc1OTYsIDAuNTA3NzM2MDYwNTM1LCAwLjUwMDg0NzExMTA0Ml0sXG4gICAgICBbMi41MzA0ODkxOTU2MiwgMS40MjQxMTc4MzQ4MSwgMS4wNDkzNzYyMDE4MywgMC44NTU5Mzg5OTkwMSwgMC43Mzc4NjIxNTkwNDQsIDAuNjU5MjY1NjcxNzA1LCAwLjYwNDQzNTgyMzQ3MywgMC41NjUzNTI2Nzk2NDYsIDAuNTM3NjA4ODA0MzgzLCAwLjUxODQ5NTA1NDY1LCAwLjUwNjUwODUzNjQ3NCwgMC41MDA3MTU5MDg5MDVdXG4gICAgXSxcbiAgICBmM2RCOiBbXG4gICAgICBbMS4yNzIwMTk2NDk1MV0sXG4gICAgICBbMS42MDMzNTc1MTYyMiwgMS40MzAxNzE1NTk5OV0sXG4gICAgICBbMS45MDQ3MDc2MTIzLCAxLjY4OTE2ODI2NzYyLCAxLjYwMzkxOTEyODc3XSxcbiAgICAgIFsyLjE4ODcyNjIzMDUzLCAxLjk1MzE5NTc1OTAyLCAxLjgzMjA5MjYwMTIsIDEuNzc4NDY1OTExNzddLFxuICAgICAgWzIuNDUwNjI2ODQzMDUsIDIuMjAzNzUyNjI1OTMsIDIuMDYyMjA3MzE3OTMsIDEuOTgwNTUzMTA4ODEsIDEuOTQyNzA0MTkxNjZdLFxuICAgICAgWzIuNjkyOTg5MjUwODQsIDIuNDM5MTI2MTE0MzEsIDIuMjg0MzE4MjU0MDEsIDIuMTg0OTY3MjI2MzQsIDIuMTI0NzI1Mzg0NzcsIDIuMDk2MTMzMjI1NDJdLFxuICAgICAgWzIuOTE5MDU3MTQ0NzEsIDIuNjYwNjkwODg5NDgsIDIuNDk2NjM0MzQ1NzEsIDIuMzg0OTc5NzY5MzksIDIuMzA5NjE0NjIyMjIsIDIuMjYyNjU3NDY1MzQsIDIuMjQwMDU3MTYxMzJdLFxuICAgICAgWzMuMTMxNDkxNjc0MDQsIDIuODcwMTYwOTk0MTYsIDIuNjk5MzUwMTgwNDQsIDIuNTc4NjI5NDU2ODMsIDIuNDkyMjU1MDUxMTksIDIuNDMyMjc3MDc0NDksIDIuMzk0Mjc3MTA3MTIsIDIuMzc1ODIzMDc2ODddLFxuICAgICAgWzMuMzMyMzczMDA1NjQsIDMuMDY5MDg1ODAxODQsIDIuODkzMTgyNTk1MTEsIDIuNzY1NTE1ODgzOTksIDIuNjcwNzMzNDA1MjcsIDIuNjAwOTQ5NTA0NzQsIDIuNTUxNjE3NjQ1NDYsIDIuNTIwMDEzNTg4MDQsIDIuNTA0NTcxNjQ1NTJdLFxuICAgICAgWzMuNTIzMzMxMjM0NjQsIDMuMjU4Nzc1Njk3MDQsIDMuMDc4OTQzNTM3NDQsIDIuOTQ1ODA0MzUwMjQsIDIuODQ0MzgzMjUxODksIDIuNzY2OTEwODI0OTgsIDIuNzA4ODE0MTEyNDUsIDIuNjY3MjQ2NTUyNTksIDIuNjQwNDAyMjgyNDksIDIuNjI3MjM0Mzk5ODldLFxuICAgICAgWzMuNzA1NjYwNjg1NDgsIDMuNDQwMzIxNzMyMjMsIDMuMjU3NDA1OTg1NCwgMy4xMTk4NjM2NzgzOCwgMy4wMTMwNzE3NTM4OCwgMi45MjkzOTIzNDYwNSwgMi44NjQyODcyNjA5NCwgMi44MTQ4MzA2ODA1NSwgMi43NzkxNTQ2NTQwNSwgMi43NTU5Njg4ODM3NywgMi43NDQ1NjYzODU4OF0sXG4gICAgICBbMy44ODA0MDQ2OTY4MiwgMy42MTQ2MzI0MzY5NywgMy40MjkyNjU0NzA3LCAzLjI4ODEyMjc0OTY2LCAzLjE3Njg5NzYyNzg4LCAzLjA4ODEyMzY0MjU3LCAzLjAxNzIwNzMyOTcyLCAyLjk2MTQwMTA0NTYxLCAyLjkxODYyODU4NDk1LCAyLjg4NzI5NDc5NDczLCAyLjg2NzQxOTg2NjgsIDIuODU3MDgwMDAxNV1cbiAgICBdLFxuICAgIGYxZEI6IFtcbiAgICAgIFsyLjE2NDc3NTU5MzcxXSxcbiAgICAgIFsyLjcwMzIwOTI4NTk2LCAyLjQxMTIyMzMyNTA1XSxcbiAgICAgIFszLjI1Njc2NTgxNDM2LCAyLjg4ODIyNTY5NTcyLCAyLjc0MjQ2MjM4ODM3XSxcbiAgICAgIFszLjc2MTUzNTgwMzUzLCAzLjM1Njc1NDExNDA2LCAzLjE0ODYyNjczMDMyLCAzLjA1NjQ2NDEyNDc1XSxcbiAgICAgIFs0LjIyMTc0MjYwMTA0LCAzLjc5NjQ0NzU3ODA2LCAzLjU1MjYwNDcxODY0LCAzLjQxMTkzNzQyMTk3LCAzLjM0NjczNDM1NTA4XSxcbiAgICAgIFs0LjY0NTg0ODEyNTUyLCA0LjIwNzg5MjU3OTgxLCAzLjk0MDgyMzYzMTIyLCAzLjc2OTQyNjgxNDQ2LCAzLjY2NTQ5OTc1NzQ0LCAzLjYxNjE3MzU5MzQ1XSxcbiAgICAgIFs1LjA0MDYwMzk1MTk2LCA0LjU5NDQ1OTIyMDEsIDQuMzExMTY3NzI0OCwgNC4xMTgzNjM1MTgyNywgMy45ODgyMjM1OTgxNCwgMy45MDcxMzgzNjcxNSwgMy44NjgxMTIzNDUyNV0sXG4gICAgICBbNS40MTEwNzk0ODQ2NywgNC45NTk1MTE1OTcwOSwgNC42NjQzNTgwNDQ2OCwgNC40NTU3NTc5NjEwMiwgNC4zMDY1MDY3OTQ3OCwgNC4yMDI4Njc1MDA0NSwgNC4xMzcyMDUyMjk5MSwgNC4xMDUzMTc0ODExOV0sXG4gICAgICBbNS43NjExMDc5MTg1MywgNS4zMDU5Mjg5ODQ2NSwgNS4wMDE4MjIxNTcwMSwgNC43ODExMDgxMDQ1LCA0LjYxNzI0NTA5OTI2LCA0LjQ5NjYwMTAwODk0LCA0LjQxMTMxMzc4OTE4LCA0LjM1NjY3NjcxMzcyLCA0LjMyOTk3OTUxMDc1XSxcbiAgICAgIFs2LjA5MzY0MzA5NDg4LCA1LjYzNjA5MTE2MDE0LCA1LjMyNTA2OTMwNzg5LCA1LjA5NDgwMzQ2MTM5LCA0LjkxOTM5NTA0MjU1LCA0Ljc4NTQwMjU4NDA5LCA0LjY4NDkzMjgwNTM2LCA0LjYxMzAyMjg2OTkzLCA0LjU2NjYxOTMxMzY2LCA0LjU0MzgyNzU5OTUyXSxcbiAgICAgIFs2LjQxMTAwNzMxNTQzLCA1Ljk1MTk1NTU4MTgyLCA1LjYzNTUwMDczNjU2LCA1LjM5NzU0NDY0NzQyLCA1LjIxMjc4ODkxMzMyLCA1LjA2ODAxNDMwMzM0LCA0Ljk1NTM5Njg0NDU2LCA0Ljg2OTc4Njk0MjksIDQuODA4MTQ5NTE4NDMsIDQuNzY3OTM0Njk2MTIsIDQuNzQ4MjgwMzI0MDNdLFxuICAgICAgWzYuNzE1MDYwNTYwNTIsIDYuMjU1MTQwMjk3NzgsIDUuOTM0MzYxNjA3MiwgNS42OTAxMTQyMjM1NSwgNS40OTc2MzY0MjM2MSwgNS4zNDQwMTk3Mzc2NCwgNS4yMjEyNTk3MzYxMSwgNS4xMjQ4NTA0NTYxOSwgNS4wNTAzNzk2MjExMiwgNC45OTY5OTk4MjIzMSwgNC45NjE1NTc4OTYzNSwgNC45NDQ0MTgyODc3N11cbiAgICBdXG4gIH1cbn1cblxuLy8gZnJvbSBUZXhhcyBJbnN0cnVtZW50cyBcIk9wIEFtcHMgZm9yIEV2ZXJ5b25lXCIgQ2hhcHRlciAxNiBcIkFjdGl2ZSBGaWx0ZXIgRGVzaWduIFRlY2huaXF1ZXNcIlxudmFyIHRpVGFibGUgPSB7XG4gIGJlc3NlbDoge1xuICAgIGFzOiBbXG4gICAgICBbMS4zNjE3XSxcbiAgICAgIFsxLjMzOTcsIDAuNzc0M10sXG4gICAgICBbMS4yMjE3LCAwLjk2ODYsIDAuNTEzMV0sXG4gICAgICBbMS4xMTEyLCAwLjk3NTQsIDAuNzIwMiwgMC4zNzI4XSxcbiAgICAgIFsxLjAyMTUsIDAuOTM5MywgMC43ODE1LCAwLjU2MDQsIDAuMjg4M11cbiAgICBdLFxuICAgIGJzOiBbXG4gICAgICBbMC42MTgwXSxcbiAgICAgIFswLjQ4ODksIDAuMzg5MF0sXG4gICAgICBbMC4zODg3LCAwLjM1MDUsIDAuMjc1Nl0sXG4gICAgICBbMC4zMTYyLCAwLjI5NzksIDAuMjYyMSwgMC4yMDg3XSxcbiAgICAgIFswLjI2NTAsIDAuMjU0OSwgMC4yMzUxLCAwLjIwNTksIDAuMTY2NV1cbiAgICBdXG4gIH0sXG4gIGJ1dHRlcndvcnRoOiB7XG4gICAgYXM6IFtcbiAgICAgIFsxLjQxNDJdLFxuICAgICAgWzEuODQ3OCwgMC43NjU0XSxcbiAgICAgIFsxLjkzMTksIDEuNDE0MiwgMC41MTc2XSxcbiAgICAgIFsxLjk2MTYsIDEuNjYyOSwgMS4xMTExLCAwLjM5MDJdLFxuICAgICAgWzEuOTc1NCwgMS43ODIwLCAxLjQxNDIsIDAuOTA4MCwgMC4zMTI5XVxuICAgIF0sXG4gICAgYnM6IFtcbiAgICAgIFsxLjBdLFxuICAgICAgWzEuMCwgMS4wXSxcbiAgICAgIFsxLjAsIDEuMCwgMS4wXSxcbiAgICAgIFsxLjAsIDEuMCwgMS4wLCAxLjBdLFxuICAgICAgWzEuMCwgMS4wLCAxLjAsIDEuMCwgMS4wXVxuICAgIF1cbiAgfSxcbiAgdHNjaGVieXNjaGVmZjA1OiB7XG4gICAgYXM6IFtcbiAgICAgIFsxLjM2MTRdLFxuICAgICAgWzIuNjI4MiwgMC4zNjQ4XSxcbiAgICAgIFszLjg2NDUsIDAuNzUyOCwgMC4xNTg5XSxcbiAgICAgIFs1LjExMTcsIDEuMDYzOSwgMC4zNDM5LCAwLjA4ODVdLFxuICAgICAgWzYuMzY0OCwgMS4zNTgyLCAwLjQ4MjIsIDAuMTk5NCwgMC4wNTYzXVxuICAgIF0sXG4gICAgYnM6IFtcbiAgICAgIFsxLjM4MjddLFxuICAgICAgWzMuNDM0MSwgMS4xNTA5XSxcbiAgICAgIFs2Ljk3OTcsIDEuODU3MywgMS4wNzExXSxcbiAgICAgIFsxMS45NjA3LCAyLjkzNjUsIDEuNDIwNiwgMS4wNDA3XSxcbiAgICAgIFsxOC4zNjk1LCA0LjM0NTMsIDEuOTQ0MCwgMS4yNTIwLCAxLjAyNjNdXG4gICAgXVxuICB9LFxuICB0c2NoZWJ5c2NoZWZmMToge1xuICAgIGFzOiBbXG4gICAgICBbMS4zMDIyXSxcbiAgICAgIFsyLjU5MDQsIDAuMzAzOV0sXG4gICAgICBbMy44NDM3LCAwLjYyOTIsIDAuMTI5Nl0sXG4gICAgICBbNS4xMDE5LCAwLjg5MTYsIDAuMjgwNiwgMC4wNzE3XSxcbiAgICAgIFs2LjM2MzQsIDEuMTM5OSwgMC4zOTM5LCAwLjE2MTYsIDAuMDQ1NV1cbiAgICBdLFxuICAgIGJzOiBbXG4gICAgICBbMS41NTE1XSxcbiAgICAgIFs0LjEzMDEsIDEuMTY5N10sXG4gICAgICBbOC41NTI5LCAxLjkxMjQsIDEuMDc2Nl0sXG4gICAgICBbMTQuNzYwOCwgMy4wNDI2LCAxLjQzMzQsIDEuMDQzMl0sXG4gICAgICBbMjIuNzQ2OCwgNC41MTY3LCAxLjk2NjUsIDEuMjU2OSwgMS4wMjc3XVxuICAgIF1cbiAgfSxcbiAgdHNjaGVieXNjaGVmZjI6IHtcbiAgICBhczogW1xuICAgICAgWzEuMTgxM10sXG4gICAgICBbMi40MDI1LCAwLjIzNzRdLFxuICAgICAgWzMuNTg4MCwgMC40OTI1LCAwLjA5OTVdLFxuICAgICAgWzQuNzc0MywgMC42OTkxLCAwLjIxNTMsIDAuMDU0N10sXG4gICAgICBbNS45NjE4LCAwLjg5NDcsIDAuMzAyMywgMC4xMjMzLCAwLjAzNDddXG4gICAgXSxcbiAgICBiczogW1xuICAgICAgWzEuNzc3NV0sXG4gICAgICBbNC45ODYyLCAxLjE4OTZdLFxuICAgICAgWzEwLjQ2NDgsIDEuOTYyMiwgMS4wODI2XSxcbiAgICAgIFsxOC4xNTEwLCAzLjEzNTMsIDEuNDQ0OSwgMS4wNDYxXSxcbiAgICAgIFsyOC4wMzc2LCA0LjY2NDQsIDEuOTg1OCwgMS4yNjE0LCAxLjAyOTRdXG4gICAgXVxuICB9LFxuICB0c2NoZWJ5c2NoZWZmMzoge1xuICAgIGFzOiBbXG4gICAgICBbMS4wNjUwXSxcbiAgICAgIFsyLjE4NTMsIDAuMTk2NF0sXG4gICAgICBbMy4yNzIxLCAwLjQwNzcsIDAuMDgxNV0sXG4gICAgICBbNC4zNTgzLCAwLjU3OTEsIDAuMTc2NSwgMC4wNDQ4XSxcbiAgICAgIFs1LjQ0NDksIDAuNzQxNCwgMC4yNDc5LCAwLjEwMDgsIDAuMDI4M11cbiAgICBdLFxuICAgIGJzOiBbXG4gICAgICBbMS45MzA1XSxcbiAgICAgIFs1LjUzMzksIDEuMjAwOV0sXG4gICAgICBbMTEuNjc3MywgMS45ODczLCAxLjA4NjFdLFxuICAgICAgWzIwLjI5NDgsIDMuMTgwOCwgMS40NTA3LCAxLjA0NzhdLFxuICAgICAgWzMxLjM3ODgsIDQuNzM2MywgMS45OTUyLCAxLjI2MzgsIDEuMDMwNF1cbiAgICBdXG4gIH0sXG4gIGFsbHBhc3M6IHtcbiAgICBhczogW1xuICAgICAgWzEuNjI3OF0sXG4gICAgICBbMi4zMzcwLCAxLjM1MDZdLFxuICAgICAgWzIuNjExNywgMi4wNzA2LCAxLjA5NjddLFxuICAgICAgWzIuNzU0MSwgMi40MTc0LCAxLjc4NTAsIDAuOTIzOV0sXG4gICAgICBbMi44NDA2LCAyLjYxMjAsIDIuMTczMywgMS41NTgzLCAwLjgwMThdXG4gICAgXSxcbiAgICBiczogW1xuICAgICAgWzAuODgzMl0sXG4gICAgICBbMS40ODc4LCAxLjE4MzddLFxuICAgICAgWzEuNzc2MywgMS42MDE1LCAxLjI1OTZdLFxuICAgICAgWzEuOTQyMCwgMS44MzAwLCAxLjYxMDEsIDEuMjgyMl0sXG4gICAgICBbMi4wNDkwLCAxLjk3MTQsIDEuODE4NCwgMS41OTIzLCAxLjI4NzddXG4gICAgXVxuICB9XG59XG5cbnZhciBjYWxjQ29lZmZzID0gZnVuY3Rpb24gKHBhcmFtcywgYmVoYXZpb3IpIHtcbiAgdmFyIGZpbHRlciA9IFtdXG4gIHZhciBjbnQgPSAwXG4gIGlmIChiZWhhdmlvciAhPT0gJ2Zyb21QWicpIHtcbiAgICBpZiAocGFyYW1zLm9yZGVyID4gMTIpIHtcbiAgICAgIHBhcmFtcy5vcmRlciA9IDEyXG4gICAgfVxuICAgIGZvciAoY250ID0gMDsgY250IDwgcGFyYW1zLm9yZGVyOyBjbnQrKykge1xuICAgICAgdmFyIHEsIGYsIGZkXG4gICAgICBpZiAocGFyYW1zLnRyYW5zZm9ybSA9PT0gJ21hdGNoZWRaJykge1xuICAgICAgICBmaWx0ZXIucHVzaChnZXRDb2VmZnNbJ2xvd3Bhc3NNWiddKHtcbiAgICAgICAgICBGczogcGFyYW1zLkZzLFxuICAgICAgICAgIEZjOiBwYXJhbXMuRmMsXG4gICAgICAgICAgcHJlR2FpbjogcGFyYW1zLnByZUdhaW4sXG4gICAgICAgICAgYXM6IHRpVGFibGVbcGFyYW1zLmNoYXJhY3RlcmlzdGljXS5hc1twYXJhbXMub3JkZXIgLSAxXVtjbnRdLFxuICAgICAgICAgIGJzOiB0aVRhYmxlW3BhcmFtcy5jaGFyYWN0ZXJpc3RpY10uYnNbcGFyYW1zLm9yZGVyIC0gMV1bY250XVxuICAgICAgICB9KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwYXJhbXMuY2hhcmFjdGVyaXN0aWMgPT09ICdidXR0ZXJ3b3J0aCcpIHtcbiAgICAgICAgICBxID0gMC41IC8gKE1hdGguc2luKChNYXRoLlBJIC8gKHBhcmFtcy5vcmRlciAqIDIpKSAqIChjbnQgKyAwLjUpKSlcbiAgICAgICAgICBmID0gMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHEgPSB0YWJsZVtwYXJhbXMuY2hhcmFjdGVyaXN0aWNdLnFbcGFyYW1zLm9yZGVyIC0gMV1bY250XVxuICAgICAgICAgIGlmIChwYXJhbXMub25lRGIpIHtcbiAgICAgICAgICAgIGYgPSB0YWJsZVtwYXJhbXMuY2hhcmFjdGVyaXN0aWNdLmYxZEJbcGFyYW1zLm9yZGVyIC0gMV1bY250XVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmID0gdGFibGVbcGFyYW1zLmNoYXJhY3RlcmlzdGljXS5mM2RCW3BhcmFtcy5vcmRlciAtIDFdW2NudF1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmVoYXZpb3IgPT09ICdoaWdocGFzcycpIHtcbiAgICAgICAgICBmZCA9IHBhcmFtcy5GYyAvIGZcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmZCA9IHBhcmFtcy5GYyAqIGZcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmVoYXZpb3IgPT09ICdiYW5kcGFzcycgfHwgYmVoYXZpb3IgPT09ICdiYW5kc3RvcCcpIHtcbiAgICAgICAgICBpZiAocGFyYW1zLmNoYXJhY3RlcmlzdGljID09PSAnYmVzc2VsJykge1xuICAgICAgICAgICAgZmQgPSBNYXRoLnNxcnQocGFyYW1zLm9yZGVyKSAqIGZkIC8gcGFyYW1zLm9yZGVyXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbHRlci5wdXNoKGdldENvZWZmc1tiZWhhdmlvcl0oe1xuICAgICAgICAgIEZzOiBwYXJhbXMuRnMsXG4gICAgICAgICAgRmM6IGZkLFxuICAgICAgICAgIFE6IHEsXG4gICAgICAgICAgQlc6IHBhcmFtcy5CVyB8fCAwLFxuICAgICAgICAgIGdhaW46IHBhcmFtcy5nYWluIHx8IDAsXG4gICAgICAgICAgcHJlR2FpbjogcGFyYW1zLnByZUdhaW4gfHwgZmFsc2VcbiAgICAgICAgfSkpXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY250ID0gMDsgY250IDwgcGFyYW1zLmxlbmd0aDsgY250KyspIHtcbiAgICAgIGZpbHRlci5wdXNoKGdldENvZWZmc1tiZWhhdmlvcl0ocGFyYW1zW2NudF0pKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaWx0ZXJcbn1cblxudmFyIGluaXRDYWxjQ29lZmZzID0gZnVuY3Rpb24gKGJlaGF2aW9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNhbGNDb2VmZnMocGFyYW1zLCBiZWhhdmlvcilcbiAgfVxufVxuXG52YXIgc2VsZiA9IHt9XG52YXIgQ2FsY0Nhc2NhZGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYXZhaWxhYmxlID0gW11cbiAgZm9yICh2YXIgayBpbiBnZXRDb2VmZnMpIHtcbiAgICBzZWxmW2tdID0gaW5pdENhbGNDb2VmZnMoaylcbiAgICBhdmFpbGFibGUucHVzaChrKVxuICB9XG4gIHNlbGYuYXZhaWxhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBhdmFpbGFibGVcbiAgfVxuICByZXR1cm4gc2VsZlxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENhbGNDYXNjYWRlc1xuIl19
+ +
+ + + + + + diff --git a/coverage/lcov-report/src/fft.js.html b/coverage/lcov-report/src/fft.js.html new file mode 100644 index 0000000..2347919 --- /dev/null +++ b/coverage/lcov-report/src/fft.js.html @@ -0,0 +1,1551 @@ + + + + Code coverage report for src/fft.js + + + + + + +
+

Code coverage report for src/fft.js

+

+ Statements: 100% (204 / 204)      + Branches: 100% (18 / 18)      + Functions: 100% (48 / 48)      + Lines: 100% (204 / 204)      + Ignored: none      +

+
All files » src/ » fft.js
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503  +  +1 +2 +2 +1 +  +1 +  +  +2 +1 +  +  +1 +1 +1 +1 +1 +1 +1 +  +1 +1 +1 +1 +1 +  +1 +8191 +8191 +  +  +1 +1 +1 +1 +8192 +8192 +1 +  +8191 +8191 +8178 +8178 +  +8191 +  +  +  +  +1 +1 +1 +1 +1 +1 +1 +8193 +  +1 +  +1 +  +  +8193 +  +  +  +  +  +  +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +2049 +6144 +2048 +  +4096 +  +  +  +  +  +  +  +8193 +  +  +  +  +  +  +8193 +  +  +  +  +  +  +8193 +  +  +  +  +  +  +8193 +  +  +  +  +  +  +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +8193 +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +8193 +8193 +  +  +  +  +  +  +1 +303143 +303141 +74 +  +303141 +303141 +  +2 +  +  +1 +39 +1 +1 +  +38 +  +  +1 +  +39 +39 +39 +  +  +  +  +  +39 +39 +39 +37 +303104 +303104 +  +  +2 +16384 +  +  +  +39 +319488 +319488 +  +  +39 +507 +507 +507 +507 +319449 +319449 +319449 +2076672 +2076672 +2076672 +2076672 +2076672 +2076672 +2076672 +  +319449 +  +  +39 +  +  +  +  +  +1 +1 +1 +8192 +8192 +8192 +  +  +1 +13 +13 +13 +13 +8191 +8191 +8191 +53248 +53248 +53248 +53248 +53248 +53248 +53248 +  +8191 +  +  +  +1 +8192 +  +1 +  +  +1 +1 +8192 +  +1 +  +  +1 +1 +8192 +  +1 +  +  +1 +1 +8192 +  +1 +  +  +2 +2 +74 +  +2 +  +  +1 +  +  +1 + 
'use strict';
+ 
+var Fft = function Fft(radix) {
+  var isPowerOfTwo = function isPowerOfTwo(value) {
+    if (!(value & value - 1)) {
+      return true;
+    }
+    return false;
+  };
+ 
+  if (!isPowerOfTwo(radix)) {
+    return false;
+  }
+ 
+  var fft = {};
+  fft.length = radix;
+  fft.buffer = new Float64Array(radix);
+  fft.re = new Float64Array(radix);
+  fft.im = new Float64Array(radix);
+  fft.reI = new Float64Array(radix);
+  fft.imI = new Float64Array(radix);
+ 
+  fft.twiddle = new Int32Array(radix);
+  fft.sinTable = new Float64Array(radix - 1);
+  fft.cosTable = new Float64Array(radix - 1);
+  var TPI = 2 * Math.PI;
+  var bits = Math.floor(Math.log(radix) / Math.LN2);
+ 
+  for (i = fft.sinTable.length; i--;) {
+    fft.sinTable[i] = Math.sin(TPI * (i / radix));
+    fft.cosTable[i] = Math.cos(TPI * (i / radix));
+  }
+ 
+  var nh = radix >> 1;
+  var i = 0;
+  var j = 0;
+  for (;;) {
+    fft.twiddle[i] = j;
+    if (++i >= radix) {
+      break;
+    }
+    bits = nh;
+    while (bits <= j) {
+      j -= bits;
+      bits >>= 1;
+    }
+    j += bits;
+  }
+ 
+  // good explanation in https://holometer.fnal.gov/GH_FFT.pdf
+ 
+  var PI = Math.PI;
+  var PI2 = Math.PI * 2;
+  var abs = Math.abs;
+  var pow = Math.pow;
+  var cos = Math.cos;
+  var sin = Math.sin;
+  var sinc = function sinc(x) {
+    return sin(PI * x) / (PI * x);
+  };
+  var E = Math.E;
+ 
+  var windowCalculation = {
+    rectangular: {
+      calc: function calc() {
+        return 1;
+      },
+      values: [],
+      correction: 1
+    },
+    none: {
+      calc: function calc() {
+        return 1;
+      },
+      values: [],
+      correction: 1
+    },
+    hanning: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.5 * (1 - cos(z));
+      },
+      values: [],
+      correction: 2
+    },
+    hamming: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.54 - 0.46 * cos(z);
+      },
+      values: [],
+      correction: 1.8518999946875638
+    },
+    tukery: {
+      calc: function calc(n, N, a) {
+        if (n < a * (N - 1) / 2) {
+          return 0.5 * (1 + cos(PI * (2 * n / (a * (N - 1)) - 1)));
+        } else if ((N - 1) * (1 - a / 2) < n) {
+          return 0.5 * (1 + cos(PI * (2 * n / (a * (N - 1)) - 2 / a + 1)));
+        } else {
+          return 1;
+        }
+      },
+      values: [],
+      correction: 4 / 3
+    },
+    cosine: {
+      calc: function calc(n, N) {
+        return sin(PI * n / (N - 1));
+      },
+      values: [],
+      correction: 1.570844266360796
+    },
+    lanczos: {
+      calc: function calc(n, N) {
+        return sinc(2 * n / (N - 1) - 1);
+      },
+      values: [],
+      correction: 1.6964337576195783
+    },
+    triangular: {
+      calc: function calc(n, N) {
+        return 2 / (N + 1) * ((N + 1) / 2 - abs(n - (N - 1) / 2));
+      },
+      values: [],
+      correction: 2
+    },
+    bartlett: {
+      calc: function calc(n, N) {
+        return 2 / (N - 1) * ((N - 1) / 2 - abs(n - (N - 1) / 2));
+      },
+      values: [],
+      correction: 2
+    },
+    gaussian: {
+      calc: function calc(n, N, a) {
+        return pow(E, -0.5 * pow((n - (N - 1) / 2) / (a * (N - 1) / 2), 2));
+      },
+      values: [],
+      correction: 5 / 3
+    },
+    bartlettHanning: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.62 - 0.48 * abs(n / (N - 1) - 0.5) - 0.38 * cos(z);
+      },
+      values: [],
+      correction: 2
+    },
+    blackman: {
+      calc: function calc(n, N, a) {
+        var a0 = (1 - a) / 2;
+        var a1 = 0.5;
+        var a2 = a / 2;
+        var z = PI2 * n / (N - 1);
+        return a0 - a1 * cos(z) + a2 * cos(2 * z);
+      },
+      values: [],
+      correction: 4 / 3
+    },
+    blackmanHarris: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.35875 - 0.48829 * cos(z) + 0.14128 * cos(2 * z) - 0.01168 * cos(3 * z);
+      },
+      values: [],
+      correction: 1.5594508635
+    },
+    nuttall3: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.375 - 0.5 * cos(z) + 0.125 * cos(2 * z);
+      },
+      values: [],
+      correction: 1.56
+    },
+    nuttall3a: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.40897 - 0.5 * cos(z) + 0.09103 * cos(2 * z);
+      },
+      values: [],
+      correction: 1.692
+    },
+    nuttall3b: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.4243801 - 0.4973406 * cos(z) + 0.078793 * cos(2 * z);
+      },
+      values: [],
+      correction: 1.7372527
+    },
+    nuttall4: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.3125 - 0.46875 * cos(z) + 0.1875 * cos(2 * z) - 0.03125 * cos(3 * z);
+      },
+      values: [],
+      correction: 1.454543
+    },
+    nuttall4a: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.338946 - 0.481973 * cos(z) + 0.161054 * cos(2 * z) - 0.018027 * cos(3 * z);
+      },
+      values: [],
+      correction: 1.512732763
+    },
+    nuttall4b: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.355768 - 0.481973 * cos(z) + 0.144232 * cos(2 * z) - 0.012604 * cos(3 * z);
+      },
+      values: [],
+      correction: 1.55223262
+    },
+    nuttall4c: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.3635819 - 0.4891775 * cos(z) + 0.1365995 * cos(2 * z) - 0.0106411 * cos(3 * z);
+      },
+      values: [],
+      correction: 1.57129067
+    },
+    // fast decaying flat top
+    sft3f: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.26526 - 0.5 * cos(z) + 0.23474 * cos(2 * z);
+      },
+      values: [],
+      correction: 1.3610238
+    },
+    sft4f: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.21706 - 0.42103 * cos(z) + 0.28294 * cos(2 * z) - 0.07897 * cos(3 * z);
+      },
+      values: [],
+      correction: 1.2773573
+    },
+    sft5f: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.1881 - 0.36923 * cos(z) + 0.28702 * cos(2 * z) - 0.13077 * cos(3 * z) + 0.02488 * cos(4 * z);
+      },
+      values: [],
+      correction: 1.23167769
+    },
+    // minimum sidelobe flat top
+    sft3m: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.28235 - 0.52105 * cos(z) + 0.19659 * cos(2 * z);
+      },
+      values: [],
+      correction: 1.39343451
+    },
+    sft4m: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.241906 - 0.460841 * cos(z) + 0.2552381 * cos(2 * z) - 0.041872 * cos(3 * z);
+      },
+      values: [],
+      correction: 1.3190596
+    },
+    sft5m: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.209671 - 0.407331 * cos(z) + 0.281225 * cos(2 * z) - 0.092669 * cos(3 * z) + 0.0091036 * cos(4 * z);
+      },
+      values: [],
+      correction: 1.26529456464
+    },
+    nift: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return 0.2810639 - 0.5208972 * cos(z) + 0.1980399 * cos(2 * z);
+      },
+      values: [],
+      correction: 1.39094182
+    },
+    hpft: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return (1.0 - 1.912510941 * cos(z) + 1.079173272 * cos(2 * z) - 0.1832630879 * cos(3 * z)) / N;
+      },
+      values: [],
+      correction: 1
+    },
+    srft: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return (1.0 - 1.93 * cos(z) + 1.29 * cos(2 * z) - 0.388 * cos(3 * z) + 0.028 * cos(4 * z)) / N;
+      },
+      values: [],
+      correction: 1
+    },
+    hft70: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return (1.0 - 1.90796 * cos(z) + 1.07349 * cos(2 * z) - 0.18199 * cos(3 * z)) / N;
+      },
+      values: [],
+      correction: 1
+    },
+    hft95: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return (1.0 - 1.9383379 * cos(z) + 1.3045202 * cos(2 * z) - 0.402827 * cos(3 * z) + 0.0350665 * cos(4 * z)) / N;
+      },
+      values: [],
+      correction: 1
+    },
+    hft90d: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return (1.0 - 1.942604 * cos(z) + 1.340318 * cos(2 * z) - 0.440811 * cos(3 * z) + 0.043097 * cos(4 * z)) / N;
+      },
+      values: [],
+      correction: 1
+    },
+    hft116d: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return (1.0 - 1.9575375 * cos(z) + 1.4780705 * cos(2 * z) - 0.6367431 * cos(3 * z) + 0.1228389 * cos(4 * z) - 0.0066288 * cos(5 * z)) / N;
+      },
+      values: [],
+      correction: 1
+    },
+    hft144d: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return (1.0 - 1.96760033 * cos(z) + 1.57983607 * cos(2 * z) - 0.81123644 * cos(3 * z) + 0.22583558 * cos(4 * z) - 0.02773848 * cos(5 * z) + 0.0009036 * cos(6 * z)) / N;
+      },
+      values: [],
+      correction: 1
+    },
+    hft196d: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return (1.0 - 1.97441842 * cos(z) + 1.65409888 * cos(2 * z) - 0.95788186 * cos(3 * z) + 0.3367342 * cos(4 * z) - 0.06364621 * cos(5 * z) + 0.00521942 * cos(6 * z) - 0.00010599 * cos(7 * z)) / N;
+      },
+      values: [],
+      correction: 1
+    },
+    hft223d: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return (1.0 - 1.98298997309 * cos(z) + 1.75556083063 * cos(2 * z) - 1.19037717712 * cos(3 * z) + 0.56155440797 * cos(4 * z) - 0.17296769663 * cos(5 * z) + 0.03233247087 * cos(6 * z) - 0.00324954578 * cos(7 * z) + 0.00013801040 * cos(8 * z) - 0.00000132725 * cos(9 * z)) / N;
+      },
+      values: [],
+      correction: 1
+    },
+    hft248d: {
+      calc: function calc(n, N) {
+        var z = PI2 * n / (N - 1);
+        return (1.0 - 1.985844164102 * cos(z) + 1.791176438506 * cos(2 * z) - 1.282075284005 * cos(3 * z) + 0.667777530266 * cos(4 * z) - 0.240160796576 * cos(5 * z) + 0.056656381764 * cos(6 * z) - 0.008134974479 * cos(7 * z) + 0.00062454465 * cos(8 * z) - 0.000019808998 * cos(9 * z) + 0.000000132974 * cos(10 * z)) / N;
+      },
+      values: [],
+      correction: 1
+    }
+  };
+ 
+  var windowFunctions = function windowFunctions(params) {
+    if (windowCalculation[params.name].values.length !== params.N) {
+      if (params.n === 0) {
+        windowCalculation[params.name].values.length = 0;
+      }
+      windowCalculation[params.name].values[params.n] = windowCalculation[params.name].correction * windowCalculation[params.name].calc(params.n, params.N, params.a);
+      return windowCalculation[params.name].values[params.n];
+    }
+    return windowCalculation[params.name].values;
+  };
+ 
+  var zeroPad = function zeroPad(buffer, fftLength) {
+    if (fftLength > buffer.length) {
+      console.log('buffer: ', buffer.length, ' fftLength: ', fftLength, ' output: ', buffer.concat(new Array(fftLength - buffer.length).fill(0)).length);
+      return buffer.concat(new Array(fftLength - buffer.length).fill(0));
+    }
+    return buffer;
+  };
+ 
+  var self = {
+    forward: function forward(b, window) {
+      var i, j, n, k, k2, h, d, c, s, ik, dx, dy;
+      n = fft.buffer.length;
+      var winFunction = {
+        name: window,
+        N: n,
+        a: 0.5,
+        n: 0
+      };
+      b = zeroPad(b, n);
+      var w = windowFunctions(winFunction);
+      if (typeof w === 'number') {
+        for (i = 0; i < n; ++i) {
+          winFunction.n = i;
+          fft.buffer[i] = b[i] * windowFunctions(winFunction);
+        }
+      } else {
+        for (i = 0; i < n; ++i) {
+          fft.buffer[i] = b[i] * w[i];
+        }
+      }
+ 
+      for (i = n; i--;) {
+        fft.re[i] = fft.buffer[fft.twiddle[i]];
+        fft.im[i] = 0.0;
+      }
+ 
+      for (k = 1; k < n; k = k2) {
+        h = 0;
+        k2 = k + k;
+        d = n / k2;
+        for (j = 0; j < k; j++) {
+          c = fft.cosTable[h];
+          s = fft.sinTable[h];
+          for (i = j; i < n; i += k2) {
+            ik = i + k;
+            dx = s * fft.im[ik] + c * fft.re[ik];
+            dy = c * fft.im[ik] - s * fft.re[ik];
+            fft.re[ik] = fft.re[i] - dx;
+            fft.re[i] += dx;
+            fft.im[ik] = fft.im[i] - dy;
+            fft.im[i] += dy;
+          }
+          h += d;
+        }
+      }
+      return {
+        re: fft.re,
+        im: fft.im
+      };
+    },
+    inverse: function inverse(re, im) {
+      var i, j, n, k, k2, h, d, c, s, ik, dx, dy;
+      n = re.length;
+      for (i = n; i--;) {
+        j = fft.twiddle[i];
+        fft.reI[i] = re[j];
+        fft.imI[i] = -im[j];
+      }
+ 
+      for (k = 1; k < n; k = k2) {
+        h = 0;
+        k2 = k + k;
+        d = n / k2;
+        for (j = 0; j < k; j++) {
+          c = fft.cosTable[h];
+          s = fft.sinTable[h];
+          for (i = j; i < n; i += k2) {
+            ik = i + k;
+            dx = s * fft.imI[ik] + c * fft.reI[ik];
+            dy = c * fft.imI[ik] - s * fft.reI[ik];
+            fft.reI[ik] = fft.reI[i] - dx;
+            fft.reI[i] += dx;
+            fft.imI[ik] = fft.imI[i] - dy;
+            fft.imI[i] += dy;
+          }
+          h += d;
+        }
+      }
+ 
+      for (i = n; i--;) {
+        fft.buffer[i] = fft.reI[i] / n;
+      }
+      return fft.buffer;
+    },
+    magnitude: function magnitude(params) {
+      var ret = [];
+      for (var cnt = 0; cnt < params.re.length; cnt++) {
+        ret.push(Math.sqrt(params.re[cnt] * params.re[cnt] + params.im[cnt] * params.im[cnt]));
+      }
+      return ret;
+    },
+    magToDb: function magToDb(b) {
+      var ret = [];
+      for (var cnt = 0; cnt < b.length; cnt++) {
+        ret.push(20 * Math.log(b[cnt]) * Math.LOG10E);
+      }
+      return ret;
+    },
+    phase: function phase(params) {
+      var ret = [];
+      for (var cnt = 0; cnt < params.re.length; cnt++) {
+        ret.push(Math.atan2(params.im[cnt], params.re[cnt]));
+      }
+      return ret;
+    },
+    windows: function windows() {
+      var winFuncs = [];
+      for (var k in windowCalculation) {
+        winFuncs.push(k);
+      }
+      return winFuncs;
+    }
+  };
+  return self;
+};
+ 
+module.exports = Fft;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL2Rhbm8vZmlsaS5qcy9zcmMvZmZ0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQTs7QUFFWixJQUFJLEdBQUcsR0FBRyxTQUFOLEdBQUcsQ0FBYSxLQUFLLEVBQUU7QUFDekIsTUFBSSxZQUFZLEdBQUcsU0FBZixZQUFZLENBQWEsS0FBSyxFQUFFO0FBQ2xDLFFBQUksRUFBRSxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQSxBQUFDLEVBQUU7QUFDeEIsYUFBTyxJQUFJLENBQUE7S0FDWjtBQUNELFdBQU8sS0FBSyxDQUFBO0dBQ2IsQ0FBQTs7QUFFRCxNQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ3hCLFdBQU8sS0FBSyxDQUFBO0dBQ2I7O0FBRUQsTUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFBO0FBQ1osS0FBRyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUE7QUFDbEIsS0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUNwQyxLQUFHLENBQUMsRUFBRSxHQUFHLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ2hDLEtBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDaEMsS0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUNqQyxLQUFHLENBQUMsR0FBRyxHQUFHLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBOztBQUVqQyxLQUFHLENBQUMsT0FBTyxHQUFHLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ25DLEtBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxZQUFZLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBQzFDLEtBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxZQUFZLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFB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Q0FBQyxJQUFLLENBQUMsR0FBRyxDQUFDLENBQUEsQUFBQyxDQUFBO0FBQzNCLGVBQU8sT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7T0FDckQ7QUFDRCxZQUFNLEVBQUUsRUFBRTtBQUNWLGdCQUFVLEVBQUUsS0FBSztLQUNsQjtBQUNELGFBQVMsRUFBRTtBQUNULFVBQUksRUFBRSxjQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEIsWUFBSSxDQUFDLEdBQUcsQUFBQyxHQUFHLEdBQUcsQ0FBQyxJQUFLLENBQUMsR0FBRyxDQUFDLENBQUEsQUFBQyxDQUFBO0FBQzNCLGVBQU8sU0FBUyxHQUFHLFNBQVMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7T0FDOUQ7QUFDRCxZQUFNLEVBQUUsRUFBRTtBQUNWLGdCQUFVLEVBQUUsU0FBUztLQUN0QjtBQUNELFlBQVEsRUFBRTtBQUNSLFVBQUksRUFBRSxjQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEIsWUFBSSxDQUFDLEdBQUcsQUFBQyxHQUFHLEdBQUcsQ0FBQyxJQUFLLENBQUMsR0FBRyxDQUFDLENBQUEsQUFBQyxDQUFBO0FBQzNCLGVBQU8sTUFBTSxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7T0FDOUU7QUFDRCxZQUFNLEVBQUUsRUFBRTtBQUNWLGdCQUFVLEVBQUUsUUFBUTtLQUNyQjtBQUNELGFBQVMsRUFBRTtBQUNULFVBQUksRUFBRSxjQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEIsWUFBSSxDQUFDLEdBQUcsQUFBQyxHQUFHLEdBQUcsQ0FBQyxJQUFLLENBQUMsR0FBRyxDQUFDLENBQUEsQUFBQyxDQUFBO0FBQzNCLGVBQU8sUUFBUSxHQUFHLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7T0FDcEY7QUFDRCxZQUFNLEVBQUUsRUFBRTtBQUNWLGdCQUFVLEVBQUUsV0FBVztLQUN4QjtBQUNELGFBQVMsRUFBRTtBQUNULFVBQUksRUFBRSxjQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEIsWUFBSSxDQUFDLEdBQUcsQUFBQyxHQUFHLEdBQUcsQ0FBQyxJQUFLLENBQUMsR0FBRyxDQUFDLENBQUEsQUFBQyxDQUFBO0FBQzNCLGVBQU8sUUFBUSxHQUFHLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7T0FDcEY7QUFDRCxZQUFNLEVBQUUsRUFBRTtBQUNWLGdCQUFVLEVBQUUsVUFBVTtLQUN2QjtBQUNELGFBQVMsRUFBRTtBQUNULFVBQUksRUFBRSxjQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEIsWUFBSSxDQUFDLEdBQUcsQUFBQyxHQUFHLEdBQUcsQ0FBQyxJQUFLLENBQUMsR0FBRyxDQUFDLENBQUEsQUFBQyxDQUFBO0FBQzNCLGVBQU8sU0FBUyxHQUFHLFNBQVMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7T0FDeEY7QUFDRCxZQUFNLEVBQUUsRUFBRTtBQUNWLGdCQUFVLEVBQUUsVUFBVTtLQUN2Qjs7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RyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUE7T0FDaEI7O0FBRUQsV0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtBQUN6QixTQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ0wsVUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDVixTQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtBQUNWLGFBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3RCLFdBQUMsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ25CLFdBQUMsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ25CLGVBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7QUFDMUIsY0FBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDVixjQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDcEMsY0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQ3BDLGVBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUE7QUFDM0IsZUFBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7QUFDZixlQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FB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QyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7T0FDckQ7QUFDRCxhQUFPLEdBQUcsQ0FBQTtLQUNYO0FBQ0QsV0FBTyxFQUFFLG1CQUFZO0FBQ25CLFVBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQTtBQUNqQixXQUFLLElBQUksQ0FBQyxJQUFJLGlCQUFpQixFQUFFO0FBQy9CLGdCQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO09BQ2pCO0FBQ0QsYUFBTyxRQUFRLENBQUE7S0FDaEI7R0FDRixDQUFBO0FBQ0QsU0FBTyxJQUFJLENBQUE7Q0FDWixDQUFBOztBQUVELE1BQU0sQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFBIiwiZmlsZSI6Ii9ob21lL2Rhbm8vZmlsaS5qcy9zcmMvZmZ0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbnZhciBGZnQgPSBmdW5jdGlvbiAocmFkaXgpIHtcbiAgdmFyIGlzUG93ZXJPZlR3byA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICghKHZhbHVlICYgdmFsdWUgLSAxKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAoIWlzUG93ZXJPZlR3byhyYWRpeCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHZhciBmZnQgPSB7fVxuICBmZnQubGVuZ3RoID0gcmFkaXhcbiAgZmZ0LmJ1ZmZlciA9IG5ldyBGbG9hdDY0QXJyYXkocmFkaXgpXG4gIGZmdC5yZSA9IG5ldyBGbG9hdDY0QXJyYXkocmFkaXgpXG4gIGZmdC5pbSA9IG5ldyBGbG9hdDY0QXJyYXkocmFkaXgpXG4gIGZmdC5yZUkgPSBuZXcgRmxvYXQ2NEFycmF5KHJhZGl4KVxuICBmZnQuaW1JID0gbmV3IEZsb2F0NjRBcnJheShyYWRpeClcblxuICBmZnQudHdpZGRsZSA9IG5ldyBJbnQzMkFycmF5KHJhZGl4KVxuICBmZnQuc2luVGFibGUgPSBuZXcgRmxvYXQ2NEFycmF5KHJhZGl4IC0gMSlcbiAgZmZ0LmNvc1RhYmxlID0gbmV3IEZsb2F0NjRBcnJheShyYWRpeCAtIDEpXG4gIHZhciBUUEkgPSAyICogTWF0aC5QSVxuICB2YXIgYml0cyA9IE1hdGguZmxvb3IoTWF0aC5sb2cocmFkaXgpIC8gTWF0aC5MTjIpXG5cbiAgZm9yIChpID0gZmZ0LnNpblRhYmxlLmxlbmd0aDsgaS0tOykge1xuICAgIGZmdC5zaW5UYWJsZVtpXSA9IE1hdGguc2luKFRQSSAqIChpIC8gcmFkaXgpKVxuICAgIGZmdC5jb3NUYWJsZVtpXSA9IE1hdGguY29zKFRQSSAqIChpIC8gcmFkaXgpKVxuICB9XG5cbiAgdmFyIG5oID0gcmFkaXggPj4gMVxuICB2YXIgaSA9IDBcbiAgdmFyIGogPSAwXG4gIGZvciAoOzspIHtcbiAgICBmZnQudHdpZGRsZVtpXSA9IGpcbiAgICBpZiAoKytpID49IHJhZGl4KSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgICBiaXRzID0gbmhcbiAgICB3aGlsZSAoYml0cyA8PSBqKSB7XG4gICAgICBqIC09IGJpdHNcbiAgICAgIGJpdHMgPj49IDFcbiAgICB9XG4gICAgaiArPSBiaXRzXG4gIH1cblxuICAvLyBnb29kIGV4cGxhbmF0aW9uIGluIGh0dHBzOi8vaG9sb21ldGVyLmZuYWwuZ292L0dIX0ZGVC5wZGZcblxuICB2YXIgUEkgPSBNYXRoLlBJXG4gIHZhciBQSTIgPSBNYXRoLlBJICogMlxuICB2YXIgYWJzID0gTWF0aC5hYnNcbiAgdmFyIHBvdyA9IE1hdGgucG93XG4gIHZhciBjb3MgPSBNYXRoLmNvc1xuICB2YXIgc2luID0gTWF0aC5zaW5cbiAgdmFyIHNpbmMgPSBmdW5jdGlvbiAoeCkge1xuICAgIHJldHVybiBzaW4oUEkgKiB4KSAvIChQSSAqIHgpXG4gIH1cbiAgdmFyIEUgPSBNYXRoLkVcblxuICB2YXIgd2luZG93Q2FsY3VsYXRpb24gPSB7XG4gICAgcmVjdGFuZ3VsYXI6IHtcbiAgICAgIGNhbGM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogMVxuICAgIH0sXG4gICAgbm9uZToge1xuICAgICAgY2FsYzogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfSxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBjb3JyZWN0aW9uOiAxXG4gICAgfSxcbiAgICBoYW5uaW5nOiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTikge1xuICAgICAgICB2YXIgeiA9IChQSTIgKiBuKSAvIChOIC0gMSlcbiAgICAgICAgcmV0dXJuIDAuNSAqICgxIC0gY29zKHopKVxuICAgICAgfSxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBjb3JyZWN0aW9uOiAyXG4gICAgfSxcbiAgICBoYW1taW5nOiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTikge1xuICAgICAgICB2YXIgeiA9IChQSTIgKiBuKSAvIChOIC0gMSlcbiAgICAgICAgcmV0dXJuIDAuNTQgLSAwLjQ2ICogY29zKHopXG4gICAgICB9LFxuICAgICAgdmFsdWVzOiBbXSxcbiAgICAgIGNvcnJlY3Rpb246IDEuODUxODk5OTk0Njg3NTYzOFxuICAgIH0sXG4gICAgdHVrZXJ5OiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTiwgYSkge1xuICAgICAgICBpZiAobiA8IChhICogKE4gLSAxKSkgLyAyKSB7XG4gICAgICAgICAgcmV0dXJuIDAuNSAqICgxICsgY29zKFBJICogKCgoMiAqIG4pIC8gKGEgKiAoTiAtIDEpKSkgLSAxKSkpXG4gICAgICAgIH0gZWxzZSBpZiAoKE4gLSAxKSAqICgxIC0gKGEgLyAyKSkgPCBuKSB7XG4gICAgICAgICAgcmV0dXJuIDAuNSAqICgxICsgY29zKFBJICogKCgoMiAqIG4pIC8gKGEgKiAoTiAtIDEpKSkgLSAoMiAvIGEpICsgMSkpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogNCAvIDNcbiAgICB9LFxuICAgIGNvc2luZToge1xuICAgICAgY2FsYzogZnVuY3Rpb24gKG4sIE4pIHtcbiAgICAgICAgcmV0dXJuIHNpbigoUEkgKiBuKSAvIChOIC0gMSkpXG4gICAgICB9LFxuICAgICAgdmFsdWVzOiBbXSxcbiAgICAgIGNvcnJlY3Rpb246IDEuNTcwODQ0MjY2MzYwNzk2XG4gICAgfSxcbiAgICBsYW5jem9zOiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTikge1xuICAgICAgICByZXR1cm4gc2luYygoKDIgKiBuKSAvIChOIC0gMSkpIC0gMSlcbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogMS42OTY0MzM3NTc2MTk1NzgzXG4gICAgfSxcbiAgICB0cmlhbmd1bGFyOiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTikge1xuICAgICAgICByZXR1cm4gKDIgLyAoTiArIDEpKSAqICgoKE4gKyAxKSAvIDIpIC0gYWJzKG4gLSAoKE4gLSAxKSAvIDIpKSlcbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogMlxuICAgIH0sXG4gICAgYmFydGxldHQ6IHtcbiAgICAgIGNhbGM6IGZ1bmN0aW9uIChuLCBOKSB7XG4gICAgICAgIHJldHVybiAoMiAvIChOIC0gMSkpICogKCgoTiAtIDEpIC8gMikgLSBhYnMobiAtICgoTiAtIDEpIC8gMikpKVxuICAgICAgfSxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBjb3JyZWN0aW9uOiAyXG4gICAgfSxcbiAgICBnYXVzc2lhbjoge1xuICAgICAgY2FsYzogZnVuY3Rpb24gKG4sIE4sIGEpIHtcbiAgICAgICAgcmV0dXJuIHBvdyhFLCAtMC41ICogcG93KChuIC0gKE4gLSAxKSAvIDIpIC8gKGEgKiAoTiAtIDEpIC8gMiksIDIpKVxuICAgICAgfSxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBjb3JyZWN0aW9uOiA1IC8gM1xuICAgIH0sXG4gICAgYmFydGxldHRIYW5uaW5nOiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTikge1xuICAgICAgICB2YXIgeiA9IChQSTIgKiBuKSAvIChOIC0gMSlcbiAgICAgICAgcmV0dXJuIDAuNjIgLSAwLjQ4ICogYWJzKChuIC8gKE4gLSAxKSkgLSAwLjUpIC0gMC4zOCAqIGNvcyh6KVxuICAgICAgfSxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBjb3JyZWN0aW9uOiAyXG4gICAgfSxcbiAgICBibGFja21hbjoge1xuICAgICAgY2FsYzogZnVuY3Rpb24gKG4sIE4sIGEpIHtcbiAgICAgICAgdmFyIGEwID0gKDEgLSBhKSAvIDJcbiAgICAgICAgdmFyIGExID0gMC41XG4gICAgICAgIHZhciBhMiA9IGEgLyAyXG4gICAgICAgIHZhciB6ID0gKFBJMiAqIG4pIC8gKE4gLSAxKVxuICAgICAgICByZXR1cm4gYTAgLSBhMSAqIGNvcyh6KSArIGEyICogY29zKDIgKiB6KVxuICAgICAgfSxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBjb3JyZWN0aW9uOiA0IC8gM1xuICAgIH0sXG4gICAgYmxhY2ttYW5IYXJyaXM6IHtcbiAgICAgIGNhbGM6IGZ1bmN0aW9uIChuLCBOKSB7XG4gICAgICAgIHZhciB6ID0gKFBJMiAqIG4pIC8gKE4gLSAxKVxuICAgICAgICByZXR1cm4gMC4zNTg3NSAtIDAuNDg4MjkgKiBjb3MoeikgKyAwLjE0MTI4ICogY29zKDIgKiB6KSAtIDAuMDExNjggKiBjb3MoMyAqIHopXG4gICAgICB9LFxuICAgICAgdmFsdWVzOiBbXSxcbiAgICAgIGNvcnJlY3Rpb246IDEuNTU5NDUwODYzNVxuICAgIH0sXG4gICAgbnV0dGFsbDM6IHtcbiAgICAgIGNhbGM6IGZ1bmN0aW9uIChuLCBOKSB7XG4gICAgICAgIHZhciB6ID0gKFBJMiAqIG4pIC8gKE4gLSAxKVxuICAgICAgICByZXR1cm4gMC4zNzUgLSAwLjUgKiBjb3MoeikgKyAwLjEyNSAqIGNvcygyICogeilcbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogMS41NlxuICAgIH0sXG4gICAgbnV0dGFsbDNhOiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTikge1xuICAgICAgICB2YXIgeiA9IChQSTIgKiBuKSAvIChOIC0gMSlcbiAgICAgICAgcmV0dXJuIDAuNDA4OTcgLSAwLjUgKiBjb3MoeikgKyAwLjA5MTAzICogY29zKDIgKiB6KVxuICAgICAgfSxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBjb3JyZWN0aW9uOiAxLjY5MlxuICAgIH0sXG4gICAgbnV0dGFsbDNiOiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTikge1xuICAgICAgICB2YXIgeiA9IChQSTIgKiBuKSAvIChOIC0gMSlcbiAgICAgICAgcmV0dXJuIDAuNDI0MzgwMSAtIDAuNDk3MzQwNiAqIGNvcyh6KSArIDAuMDc4NzkzICogY29zKDIgKiB6KVxuICAgICAgfSxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBjb3JyZWN0aW9uOiAxLjczNzI1MjdcbiAgICB9LFxuICAgIG51dHRhbGw0OiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTikge1xuICAgICAgICB2YXIgeiA9IChQSTIgKiBuKSAvIChOIC0gMSlcbiAgICAgICAgcmV0dXJuIDAuMzEyNSAtIDAuNDY4NzUgKiBjb3MoeikgKyAwLjE4NzUgKiBjb3MoMiAqIHopIC0gMC4wMzEyNSAqIGNvcygzICogeilcbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogMS40NTQ1NDNcbiAgICB9LFxuICAgIG51dHRhbGw0YToge1xuICAgICAgY2FsYzogZnVuY3Rpb24gKG4sIE4pIHtcbiAgICAgICAgdmFyIHogPSAoUEkyICogbikgLyAoTiAtIDEpXG4gICAgICAgIHJldHVybiAwLjMzODk0NiAtIDAuNDgxOTczICogY29zKHopICsgMC4xNjEwNTQgKiBjb3MoMiAqIHopIC0gMC4wMTgwMjcgKiBjb3MoMyAqIHopXG4gICAgICB9LFxuICAgICAgdmFsdWVzOiBbXSxcbiAgICAgIGNvcnJlY3Rpb246IDEuNTEyNzMyNzYzXG4gICAgfSxcbiAgICBudXR0YWxsNGI6IHtcbiAgICAgIGNhbGM6IGZ1bmN0aW9uIChuLCBOKSB7XG4gICAgICAgIHZhciB6ID0gKFBJMiAqIG4pIC8gKE4gLSAxKVxuICAgICAgICByZXR1cm4gMC4zNTU3NjggLSAwLjQ4MTk3MyAqIGNvcyh6KSArIDAuMTQ0MjMyICogY29zKDIgKiB6KSAtIDAuMDEyNjA0ICogY29zKDMgKiB6KVxuICAgICAgfSxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBjb3JyZWN0aW9uOiAxLjU1MjIzMjYyXG4gICAgfSxcbiAgICBudXR0YWxsNGM6IHtcbiAgICAgIGNhbGM6IGZ1bmN0aW9uIChuLCBOKSB7XG4gICAgICAgIHZhciB6ID0gKFBJMiAqIG4pIC8gKE4gLSAxKVxuICAgICAgICByZXR1cm4gMC4zNjM1ODE5IC0gMC40ODkxNzc1ICogY29zKHopICsgMC4xMzY1OTk1ICogY29zKDIgKiB6KSAtIDAuMDEwNjQxMSAqIGNvcygzICogeilcbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogMS41NzEyOTA2N1xuICAgIH0sXG4gICAgLy8gZmFzdCBkZWNheWluZyBmbGF0IHRvcFxuICAgIHNmdDNmOiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTikge1xuICAgICAgICB2YXIgeiA9IChQSTIgKiBuKSAvIChOIC0gMSlcbiAgICAgICAgcmV0dXJuIDAuMjY1MjYgLSAwLjUgKiBjb3MoeikgKyAwLjIzNDc0ICogY29zKDIgKiB6KVxuICAgICAgfSxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBjb3JyZWN0aW9uOiAxLjM2MTAyMzhcbiAgICB9LFxuICAgIHNmdDRmOiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTikge1xuICAgICAgICB2YXIgeiA9IChQSTIgKiBuKSAvIChOIC0gMSlcbiAgICAgICAgcmV0dXJuIDAuMjE3MDYgLSAwLjQyMTAzICogY29zKHopICsgMC4yODI5NCAqIGNvcygyICogeikgLSAwLjA3ODk3ICogY29zKDMgKiB6KVxuICAgICAgfSxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBjb3JyZWN0aW9uOiAxLjI3NzM1NzNcbiAgICB9LFxuICAgIHNmdDVmOiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTikge1xuICAgICAgICB2YXIgeiA9IChQSTIgKiBuKSAvIChOIC0gMSlcbiAgICAgICAgcmV0dXJuIDAuMTg4MSAtIDAuMzY5MjMgKiBjb3MoeikgKyAwLjI4NzAyICogY29zKDIgKiB6KSAtIDAuMTMwNzcgKiBjb3MoMyAqIHopICsgMC4wMjQ4OCAqIGNvcyg0ICogeilcbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogMS4yMzE2Nzc2OVxuICAgIH0sXG4gICAgLy8gbWluaW11bSBzaWRlbG9iZSBmbGF0IHRvcFxuICAgIHNmdDNtOiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTikge1xuICAgICAgICB2YXIgeiA9IChQSTIgKiBuKSAvIChOIC0gMSlcbiAgICAgICAgcmV0dXJuIDAuMjgyMzUgLSAwLjUyMTA1ICogY29zKHopICsgMC4xOTY1OSAqIGNvcygyICogeilcbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogMS4zOTM0MzQ1MVxuICAgIH0sXG4gICAgc2Z0NG06IHtcbiAgICAgIGNhbGM6IGZ1bmN0aW9uIChuLCBOKSB7XG4gICAgICAgIHZhciB6ID0gKFBJMiAqIG4pIC8gKE4gLSAxKVxuICAgICAgICByZXR1cm4gMC4yNDE5MDYgLSAwLjQ2MDg0MSAqIGNvcyh6KSArIDAuMjU1MjM4MSAqIGNvcygyICogeikgLSAwLjA0MTg3MiAqIGNvcygzICogeilcbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogMS4zMTkwNTk2XG4gICAgfSxcbiAgICBzZnQ1bToge1xuICAgICAgY2FsYzogZnVuY3Rpb24gKG4sIE4pIHtcbiAgICAgICAgdmFyIHogPSAoUEkyICogbikgLyAoTiAtIDEpXG4gICAgICAgIHJldHVybiAwLjIwOTY3MSAtIDAuNDA3MzMxICogY29zKHopICsgMC4yODEyMjUgKiBjb3MoMiAqIHopIC0gMC4wOTI2NjkgKiBjb3MoMyAqIHopICsgMC4wMDkxMDM2ICogY29zKDQgKiB6KVxuICAgICAgfSxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBjb3JyZWN0aW9uOiAxLjI2NTI5NDU2NDY0XG4gICAgfSxcbiAgICBuaWZ0OiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTikge1xuICAgICAgICB2YXIgeiA9IChQSTIgKiBuKSAvIChOIC0gMSlcbiAgICAgICAgcmV0dXJuIDAuMjgxMDYzOSAtIDAuNTIwODk3MiAqIGNvcyh6KSArIDAuMTk4MDM5OSAqIGNvcygyICogeilcbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogMS4zOTA5NDE4MlxuICAgIH0sXG4gICAgaHBmdDoge1xuICAgICAgY2FsYzogZnVuY3Rpb24gKG4sIE4pIHtcbiAgICAgICAgdmFyIHogPSAoUEkyICogbikgLyAoTiAtIDEpXG4gICAgICAgIHJldHVybiAoMS4wIC0gMS45MTI1MTA5NDEgKiBjb3MoeikgKyAxLjA3OTE3MzI3MiAqIGNvcygyICogeikgLSAwLjE4MzI2MzA4NzkgKiBjb3MoMyAqIHopKSAvIE5cbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogMVxuICAgIH0sXG4gICAgc3JmdDoge1xuICAgICAgY2FsYzogZnVuY3Rpb24gKG4sIE4pIHtcbiAgICAgICAgdmFyIHogPSAoUEkyICogbikgLyAoTiAtIDEpXG4gICAgICAgIHJldHVybiAoMS4wIC0gMS45MyAqIGNvcyh6KSArIDEuMjkgKiBjb3MoMiAqIHopIC0gMC4zODggKiBjb3MoMyAqIHopICsgMC4wMjggKiBjb3MoNCAqIHopKSAvIE5cbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogMVxuICAgIH0sXG4gICAgaGZ0NzA6IHtcbiAgICAgIGNhbGM6IGZ1bmN0aW9uIChuLCBOKSB7XG4gICAgICAgIHZhciB6ID0gKFBJMiAqIG4pIC8gKE4gLSAxKVxuICAgICAgICByZXR1cm4gKDEuMCAtIDEuOTA3OTYgKiBjb3MoeikgKyAxLjA3MzQ5ICogY29zKDIgKiB6KSAtIDAuMTgxOTkgKiBjb3MoMyAqIHopKSAvIE5cbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogMVxuICAgIH0sXG4gICAgaGZ0OTU6IHtcbiAgICAgIGNhbGM6IGZ1bmN0aW9uIChuLCBOKSB7XG4gICAgICAgIHZhciB6ID0gKFBJMiAqIG4pIC8gKE4gLSAxKVxuICAgICAgICByZXR1cm4gKDEuMCAtIDEuOTM4MzM3OSAqIGNvcyh6KSArIDEuMzA0NTIwMiAqIGNvcygyICogeikgLSAwLjQwMjgyNyAqIGNvcygzICogeikgKyAwLjAzNTA2NjUgKiBjb3MoNCAqIHopKSAvIE5cbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogMVxuICAgIH0sXG4gICAgaGZ0OTBkOiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTikge1xuICAgICAgICB2YXIgeiA9IChQSTIgKiBuKSAvIChOIC0gMSlcbiAgICAgICAgcmV0dXJuICgxLjAgLSAxLjk0MjYwNCAqIGNvcyh6KSArIDEuMzQwMzE4ICogY29zKDIgKiB6KSAtIDAuNDQwODExICogY29zKDMgKiB6KSArIDAuMDQzMDk3ICogY29zKDQgKiB6KSkgLyBOXG4gICAgICB9LFxuICAgICAgdmFsdWVzOiBbXSxcbiAgICAgIGNvcnJlY3Rpb246IDFcbiAgICB9LFxuICAgIGhmdDExNmQ6IHtcbiAgICAgIGNhbGM6IGZ1bmN0aW9uIChuLCBOKSB7XG4gICAgICAgIHZhciB6ID0gKFBJMiAqIG4pIC8gKE4gLSAxKVxuICAgICAgICByZXR1cm4gKDEuMCAtIDEuOTU3NTM3NSAqIGNvcyh6KSArIDEuNDc4MDcwNSAqIGNvcygyICogeikgLSAwLjYzNjc0MzEgKiBjb3MoMyAqIHopICsgMC4xMjI4Mzg5ICogY29zKDQgKiB6KSAtIDAuMDA2NjI4OCAqIGNvcyg1ICogeikpIC8gTlxuICAgICAgfSxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBjb3JyZWN0aW9uOiAxXG4gICAgfSxcbiAgICBoZnQxNDRkOiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTikge1xuICAgICAgICB2YXIgeiA9IChQSTIgKiBuKSAvIChOIC0gMSlcbiAgICAgICAgcmV0dXJuICgxLjAgLSAxLjk2NzYwMDMzICogY29zKHopICsgMS41Nzk4MzYwNyAqIGNvcygyICogeikgLSAwLjgxMTIzNjQ0ICogY29zKDMgKiB6KSArIDAuMjI1ODM1NTggKiBjb3MoNCAqIHopIC0gMC4wMjc3Mzg0OCAqIGNvcyg1ICogeikgKyAwLjAwMDkwMzYgKiBjb3MoNiAqIHopKSAvIE5cbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogMVxuICAgIH0sXG4gICAgaGZ0MTk2ZDoge1xuICAgICAgY2FsYzogZnVuY3Rpb24gKG4sIE4pIHtcbiAgICAgICAgdmFyIHogPSAoUEkyICogbikgLyAoTiAtIDEpXG4gICAgICAgIHJldHVybiAoMS4wIC0gMS45NzQ0MTg0MiAqIGNvcyh6KSArIDEuNjU0MDk4ODggKiBjb3MoMiAqIHopIC0gMC45NTc4ODE4NiAqIGNvcygzICogeikgKyAwLjMzNjczNDIgKiBjb3MoNCAqIHopIC0gMC4wNjM2NDYyMSAqIGNvcyg1ICogeikgKyAwLjAwNTIxOTQyICogY29zKDYgKiB6KSAtIDAuMDAwMTA1OTkgKiBjb3MoNyAqIHopKSAvIE5cbiAgICAgIH0sXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgY29ycmVjdGlvbjogMVxuICAgIH0sXG4gICAgaGZ0MjIzZDoge1xuICAgICAgY2FsYzogZnVuY3Rpb24gKG4sIE4pIHtcbiAgICAgICAgdmFyIHogPSAoUEkyICogbikgLyAoTiAtIDEpXG4gICAgICAgIHJldHVybiAoMS4wIC0gMS45ODI5ODk5NzMwOSAqIGNvcyh6KSArIDEuNzU1NTYwODMwNjMgKiBjb3MoMiAqIHopIC0gMS4xOTAzNzcxNzcxMiAqIGNvcygzICogeikgKyAwLjU2MTU1NDQwNzk3ICogY29zKDQgKiB6KSAtIDAuMTcyOTY3Njk2NjMgKiBjb3MoNSAqIHopICsgMC4wMzIzMzI0NzA4NyAqIGNvcyg2ICogeikgLSAwLjAwMzI0OTU0NTc4ICogY29zKDcgKiB6KSArIDAuMDAwMTM4MDEwNDAgKiBjb3MoOCAqIHopIC0gMC4wMDAwMDEzMjcyNSAqIGNvcyg5ICogeikpIC8gTlxuICAgICAgfSxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBjb3JyZWN0aW9uOiAxXG4gICAgfSxcbiAgICBoZnQyNDhkOiB7XG4gICAgICBjYWxjOiBmdW5jdGlvbiAobiwgTikge1xuICAgICAgICB2YXIgeiA9IChQSTIgKiBuKSAvIChOIC0gMSlcbiAgICAgICAgcmV0dXJuICgxLjAgLSAxLjk4NTg0NDE2NDEwMiAqIGNvcyh6KSArIDEuNzkxMTc2NDM4NTA2ICogY29zKDIgKiB6KSAtIDEuMjgyMDc1Mjg0MDA1ICogY29zKDMgKiB6KSArIDAuNjY3Nzc3NTMwMjY2ICogY29zKDQgKiB6KSAtIDAuMjQwMTYwNzk2NTc2ICogY29zKDUgKiB6KSArIDAuMDU2NjU2MzgxNzY0ICogY29zKDYgKiB6KSAtIDAuMDA4MTM0OTc0NDc5ICogY29zKDcgKiB6KSArIDAuMDAwNjI0NTQ0NjUgKiBjb3MoOCAqIHopIC0gMC4wMDAwMTk4MDg5OTggKiBjb3MoOSAqIHopICsgMC4wMDAwMDAxMzI5NzQgKiBjb3MoMTAgKiB6KSkgLyBOXG4gICAgICB9LFxuICAgICAgdmFsdWVzOiBbXSxcbiAgICAgIGNvcnJlY3Rpb246IDFcbiAgICB9XG4gIH1cblxuICB2YXIgd2luZG93RnVuY3Rpb25zID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgIGlmICh3aW5kb3dDYWxjdWxhdGlvbltwYXJhbXMubmFtZV0udmFsdWVzLmxlbmd0aCAhPT0gcGFyYW1zLk4pIHtcbiAgICAgIGlmIChwYXJhbXMubiA9PT0gMCkge1xuICAgICAgICB3aW5kb3dDYWxjdWxhdGlvbltwYXJhbXMubmFtZV0udmFsdWVzLmxlbmd0aCA9IDBcbiAgICAgIH1cbiAgICAgIHdpbmRvd0NhbGN1bGF0aW9uW3BhcmFtcy5uYW1lXS52YWx1ZXNbcGFyYW1zLm5dID0gd2luZG93Q2FsY3VsYXRpb25bcGFyYW1zLm5hbWVdLmNvcnJlY3Rpb24gKiB3aW5kb3dDYWxjdWxhdGlvbltwYXJhbXMubmFtZV0uY2FsYyhwYXJhbXMubiwgcGFyYW1zLk4sIHBhcmFtcy5hKVxuICAgICAgcmV0dXJuIHdpbmRvd0NhbGN1bGF0aW9uW3BhcmFtcy5uYW1lXS52YWx1ZXNbcGFyYW1zLm5dXG4gICAgfVxuICAgIHJldHVybiB3aW5kb3dDYWxjdWxhdGlvbltwYXJhbXMubmFtZV0udmFsdWVzXG4gIH1cblxuICB2YXIgemVyb1BhZCA9IGZ1bmN0aW9uIChidWZmZXIsIGZmdExlbmd0aCkge1xuICAgIGlmIChmZnRMZW5ndGggPiBidWZmZXIubGVuZ3RoKSB7XG4gICAgICBjb25zb2xlLmxvZygnYnVmZmVyOiAnLCBidWZmZXIubGVuZ3RoLCAnIGZmdExlbmd0aDogJywgZmZ0TGVuZ3RoLCAnIG91dHB1dDogJywgYnVmZmVyLmNvbmNhdChuZXcgQXJyYXkoZmZ0TGVuZ3RoIC0gYnVmZmVyLmxlbmd0aCkuZmlsbCgwKSkubGVuZ3RoKVxuICAgICAgcmV0dXJuIGJ1ZmZlci5jb25jYXQobmV3IEFycmF5KGZmdExlbmd0aCAtIGJ1ZmZlci5sZW5ndGgpLmZpbGwoMCkpXG4gICAgfVxuICAgIHJldHVybiBidWZmZXJcbiAgfVxuXG4gIHZhciBzZWxmID0ge1xuICAgIGZvcndhcmQ6IGZ1bmN0aW9uIChiLCB3aW5kb3cpIHtcbiAgICAgIHZhciBpLCBqLCBuLCBrLCBrMiwgaCwgZCwgYywgcywgaWssIGR4LCBkeVxuICAgICAgbiA9IGZmdC5idWZmZXIubGVuZ3RoXG4gICAgICB2YXIgd2luRnVuY3Rpb24gPSB7XG4gICAgICAgIG5hbWU6IHdpbmRvdyxcbiAgICAgICAgTjogbixcbiAgICAgICAgYTogMC41LFxuICAgICAgICBuOiAwXG4gICAgICB9XG4gICAgICBiID0gemVyb1BhZChiLCBuKVxuICAgICAgdmFyIHcgPSB3aW5kb3dGdW5jdGlvbnMod2luRnVuY3Rpb24pXG4gICAgICBpZiAodHlwZW9mIHcgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICB3aW5GdW5jdGlvbi5uID0gaVxuICAgICAgICAgIGZmdC5idWZmZXJbaV0gPSBiW2ldICogd2luZG93RnVuY3Rpb25zKHdpbkZ1bmN0aW9uKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgICAgZmZ0LmJ1ZmZlcltpXSA9IGJbaV0gKiB3W2ldXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gbjsgaS0tOykge1xuICAgICAgICBmZnQucmVbaV0gPSBmZnQuYnVmZmVyW2ZmdC50d2lkZGxlW2ldXVxuICAgICAgICBmZnQuaW1baV0gPSAwLjBcbiAgICAgIH1cblxuICAgICAgZm9yIChrID0gMTsgayA8IG47IGsgPSBrMikge1xuICAgICAgICBoID0gMFxuICAgICAgICBrMiA9IGsgKyBrXG4gICAgICAgIGQgPSBuIC8gazJcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IGs7IGorKykge1xuICAgICAgICAgIGMgPSBmZnQuY29zVGFibGVbaF1cbiAgICAgICAgICBzID0gZmZ0LnNpblRhYmxlW2hdXG4gICAgICAgICAgZm9yIChpID0gajsgaSA8IG47IGkgKz0gazIpIHtcbiAgICAgICAgICAgIGlrID0gaSArIGtcbiAgICAgICAgICAgIGR4ID0gcyAqIGZmdC5pbVtpa10gKyBjICogZmZ0LnJlW2lrXVxuICAgICAgICAgICAgZHkgPSBjICogZmZ0LmltW2lrXSAtIHMgKiBmZnQucmVbaWtdXG4gICAgICAgICAgICBmZnQucmVbaWtdID0gZmZ0LnJlW2ldIC0gZHhcbiAgICAgICAgICAgIGZmdC5yZVtpXSArPSBkeFxuICAgICAgICAgICAgZmZ0LmltW2lrXSA9IGZmdC5pbVtpXSAtIGR5XG4gICAgICAgICAgICBmZnQuaW1baV0gKz0gZHlcbiAgICAgICAgICB9XG4gICAgICAgICAgaCArPSBkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlOiBmZnQucmUsXG4gICAgICAgIGltOiBmZnQuaW1cbiAgICAgIH1cbiAgICB9LFxuICAgIGludmVyc2U6IGZ1bmN0aW9uIChyZSwgaW0pIHtcbiAgICAgIHZhciBpLCBqLCBuLCBrLCBrMiwgaCwgZCwgYywgcywgaWssIGR4LCBkeVxuICAgICAgbiA9IHJlLmxlbmd0aFxuICAgICAgZm9yIChpID0gbjsgaS0tOykge1xuICAgICAgICBqID0gZmZ0LnR3aWRkbGVbaV1cbiAgICAgICAgZmZ0LnJlSVtpXSA9IHJlW2pdXG4gICAgICAgIGZmdC5pbUlbaV0gPSAtaW1bal1cbiAgICAgIH1cblxuICAgICAgZm9yIChrID0gMTsgayA8IG47IGsgPSBrMikge1xuICAgICAgICBoID0gMFxuICAgICAgICBrMiA9IGsgKyBrXG4gICAgICAgIGQgPSBuIC8gazJcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IGs7IGorKykge1xuICAgICAgICAgIGMgPSBmZnQuY29zVGFibGVbaF1cbiAgICAgICAgICBzID0gZmZ0LnNpblRhYmxlW2hdXG4gICAgICAgICAgZm9yIChpID0gajsgaSA8IG47IGkgKz0gazIpIHtcbiAgICAgICAgICAgIGlrID0gaSArIGtcbiAgICAgICAgICAgIGR4ID0gcyAqIGZmdC5pbUlbaWtdICsgYyAqIGZmdC5yZUlbaWtdXG4gICAgICAgICAgICBkeSA9IGMgKiBmZnQuaW1JW2lrXSAtIHMgKiBmZnQucmVJW2lrXVxuICAgICAgICAgICAgZmZ0LnJlSVtpa10gPSBmZnQucmVJW2ldIC0gZHhcbiAgICAgICAgICAgIGZmdC5yZUlbaV0gKz0gZHhcbiAgICAgICAgICAgIGZmdC5pbUlbaWtdID0gZmZ0LmltSVtpXSAtIGR5XG4gICAgICAgICAgICBmZnQuaW1JW2ldICs9IGR5XG4gICAgICAgICAgfVxuICAgICAgICAgIGggKz0gZFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoaSA9IG47IGktLTspIHtcbiAgICAgICAgZmZ0LmJ1ZmZlcltpXSA9IGZmdC5yZUlbaV0gLyBuXG4gICAgICB9XG4gICAgICByZXR1cm4gZmZ0LmJ1ZmZlclxuICAgIH0sXG4gICAgbWFnbml0dWRlOiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICB2YXIgcmV0ID0gW11cbiAgICAgIGZvciAodmFyIGNudCA9IDA7IGNudCA8IHBhcmFtcy5yZS5sZW5ndGg7IGNudCsrKSB7XG4gICAgICAgIHJldC5wdXNoKE1hdGguc3FydChwYXJhbXMucmVbY250XSAqIHBhcmFtcy5yZVtjbnRdICsgcGFyYW1zLmltW2NudF0gKiBwYXJhbXMuaW1bY250XSkpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0XG4gICAgfSxcbiAgICBtYWdUb0RiOiBmdW5jdGlvbiAoYikge1xuICAgICAgdmFyIHJldCA9IFtdXG4gICAgICBmb3IgKHZhciBjbnQgPSAwOyBjbnQgPCBiLmxlbmd0aDsgY250KyspIHtcbiAgICAgICAgcmV0LnB1c2goMjAgKiBNYXRoLmxvZyhiW2NudF0pICogTWF0aC5MT0cxMEUpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0XG4gICAgfSxcbiAgICBwaGFzZTogZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgdmFyIHJldCA9IFtdXG4gICAgICBmb3IgKHZhciBjbnQgPSAwOyBjbnQgPCBwYXJhbXMucmUubGVuZ3RoOyBjbnQrKykge1xuICAgICAgICByZXQucHVzaChNYXRoLmF0YW4yKHBhcmFtcy5pbVtjbnRdLCBwYXJhbXMucmVbY250XSkpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0XG4gICAgfSxcbiAgICB3aW5kb3dzOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgd2luRnVuY3MgPSBbXVxuICAgICAgZm9yICh2YXIgayBpbiB3aW5kb3dDYWxjdWxhdGlvbikge1xuICAgICAgICB3aW5GdW5jcy5wdXNoKGspXG4gICAgICB9XG4gICAgICByZXR1cm4gd2luRnVuY3NcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlbGZcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBGZnRcbiJdfQ==
+ +
+ + + + + + diff --git a/coverage/lcov-report/src/firCoeffs.js.html b/coverage/lcov-report/src/firCoeffs.js.html new file mode 100644 index 0000000..ac8d561 --- /dev/null +++ b/coverage/lcov-report/src/firCoeffs.js.html @@ -0,0 +1,453 @@ + + + + Code coverage report for src/firCoeffs.js + + + + + + +
+

Code coverage report for src/firCoeffs.js

+

+ Statements: 96.1% (74 / 77)      + Branches: 58.33% (7 / 12)      + Functions: 100% (12 / 12)      + Lines: 96.1% (74 / 77)      + Ignored: none      +

+
All files » src/ » firCoeffs.js
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137  +  +1 +  +  +  +1 +1 +1 +1 +1 +1 +1 +52 +52 +52 +52 +662 +662 +662 +  +52 +  +  +1 +  +  +1 +1 +1 +1 +1 +1 +  +1 +1 +50 +  +  +1 +  +1 +1 +  +  +  +  +1 +1 +51 +  +1 +50 +  +1 +  +  +  +  +1 +6 +6 +6 +6 +6 +6 +6 +  +  +  +6 +606 +6 +  +600 +  +600 +  +606 +  +  +6 +606 +  +6 +  +  +1 +4 +4 +404 +  +4 +4 +  +1 +2 +  +  +  +  +2 +  +  +  +  +2 +2 +202 +  +2 +  +1 +  +1 +  +  +1 +  +  +1 +  +  +1 +  +  +1 +  +  +1 +  +  +1 +  +  +1 + 
'use strict';
+ 
+var FirCoeffs = function FirCoeffs() {
+  // Kaiser windowd filters
+  // desired attenuation can be defined
+  // better than windowd sinc filters
+  var calcKImpulseResponse = function calcKImpulseResponse(params) {
+    var Fs = params.Fs;
+    var Fa = params.Fa;
+    var Fb = params.Fb;
+    var o = params.order || 51;
+    var alpha = params.Att || 100;
+    var ino = function ino(val) {
+      var d = 0;
+      var ds = 1;
+      var s = 1;
+      while (ds > s * 1e-6) {
+        d += 2;
+        ds *= val * val / (d * d);
+        s += ds;
+      }
+      return s;
+    };
+ 
+    Iif (o / 2 - Math.floor(o / 2) === 0) {
+      o++;
+    }
+    var Np = (o - 1) / 2;
+    var A = [];
+    var beta = 0;
+    var cnt = 0;
+    var inoBeta;
+    var ret = [];
+ 
+    A[0] = 2 * (Fb - Fa) / Fs;
+    for (cnt = 1; cnt <= Np; cnt++) {
+      A[cnt] = (Math.sin(2 * cnt * Math.PI * Fb / Fs) - Math.sin(2 * cnt * Math.PI * Fa / Fs)) / (cnt * Math.PI);
+    }
+    // empirical coefficients
+    Iif (alpha < 21) {
+      beta = 0;
+    } else Eif (alpha > 50) {
+      beta = 0.1102 * (alpha - 8.7);
+    } else {
+      beta = 0.5842 * Math.pow(alpha - 21, 0.4) + 0.07886 * (alpha - 21);
+    }
+ 
+    inoBeta = ino(beta);
+    for (cnt = 0; cnt <= Np; cnt++) {
+      ret[Np + cnt] = A[cnt] * ino(beta * Math.sqrt(1 - cnt * cnt / (Np * Np))) / inoBeta;
+    }
+    for (cnt = 0; cnt < Np; cnt++) {
+      ret[cnt] = ret[o - 1 - cnt];
+    }
+    return ret;
+  };
+ 
+  // note: coefficients are equal to impulse response
+  // windowd sinc filter
+  var calcImpulseResponse = function calcImpulseResponse(params) {
+    var Fs = params.Fs;
+    var Fc = params.Fc;
+    var o = params.order;
+    var omega = 2 * Math.PI * Fc / Fs;
+    var cnt = 0;
+    var dc = 0;
+    var ret = [];
+    // sinc function is considered to be
+    // the ideal impulse response
+    // do an idft and use Hamming window afterwards
+    for (cnt = 0; cnt <= o; cnt++) {
+      if (cnt - o / 2 === 0) {
+        ret[cnt] = omega;
+      } else {
+        ret[cnt] = Math.sin(omega * (cnt - o / 2)) / (cnt - o / 2);
+        // Hamming window
+        ret[cnt] *= 0.54 - 0.46 * Math.cos(2 * Math.PI * cnt / o);
+      }
+      dc = dc + ret[cnt];
+    }
+    // normalize
+    for (cnt = 0; cnt <= o; cnt++) {
+      ret[cnt] /= dc;
+    }
+    return ret;
+  };
+  // invert for highpass from lowpass
+  var invert = function invert(h) {
+    var cnt;
+    for (cnt = 0; cnt < h.length; cnt++) {
+      h[cnt] = -h[cnt];
+    }
+    h[(h.length - 1) / 2]++;
+    return h;
+  };
+  var bs = function bs(params) {
+    var lp = calcImpulseResponse({
+      order: params.order,
+      Fs: params.Fs,
+      Fc: params.F2
+    });
+    var hp = invert(calcImpulseResponse({
+      order: params.order,
+      Fs: params.Fs,
+      Fc: params.F1
+    }));
+    var out = [];
+    for (var i = 0; i < lp.length; i++) {
+      out.push(lp[i] + hp[i]);
+    }
+    return out;
+  };
+  var self = {
+    lowpass: function lowpass(params) {
+      return calcImpulseResponse(params);
+    },
+    highpass: function highpass(params) {
+      return invert(calcImpulseResponse(params));
+    },
+    bandstop: function bandstop(params) {
+      return bs(params);
+    },
+    bandpass: function bandpass(params) {
+      return invert(bs(params));
+    },
+    kbFilter: function kbFilter(params) {
+      return calcKImpulseResponse(params);
+    },
+    available: function available() {
+      return ['lowpass', 'highpass', 'bandstop', 'bandpass', 'kbFilter'];
+    }
+  };
+  return self;
+};
+ 
+module.exports = FirCoeffs;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL2Rhbm8vZmlsaS5qcy9zcmMvZmlyQ29lZmZzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQTs7QUFFWixJQUFJLFNBQVMsR0FBRyxTQUFaLFNBQVMsR0FBZTs7OztBQUkxQixNQUFJLG9CQUFvQixHQUFHLFNBQXZCLG9CQUFvQixDQUFhLE1BQU0sRUFBRTtBQUMzQyxRQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFBO0FBQ2xCLFFBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUE7QUFDbEIsUUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQTtBQUNsQixRQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQTtBQUMxQixRQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQTtBQUM3QixRQUFJLEdBQUcsR0FBRyxTQUFOLEdBQUcsQ0FBYSxHQUFHLEVBQUU7QUFDdkIsVUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ1QsVUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBQ1YsVUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ1QsYUFBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRTtBQUNwQixTQUFDLElBQUksQ0FBQyxDQUFBO0FBQ04sVUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQSxBQUFDLENBQUE7QUFDekIsU0FBQyxJQUFJLEVBQUUsQ0FBQTtPQUNSO0FBQ0QsYUFBTyxDQUFDLENBQUE7S0FDVCxDQUFBOztBQUVELFFBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDbkMsT0FBQyxFQUFFLENBQUE7S0FDSjtBQUNELFFBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxHQUFJLENBQUMsQ0FBQTtBQUNwQixRQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7QUFDVixRQUFJLElBQUksR0FBRyxDQUFDLENBQUE7QUFDWixRQUFJLEdBQUcsR0FBRyxDQUFDLENBQUE7QUFDWCxRQUFJLE9BQU8sQ0FBQTtBQUNYLFFBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQTs7QUFFWixLQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUEsQUFBQyxHQUFHLEVBQUUsQ0FBQTtBQUN6QixTQUFLLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRTtBQUM5QixPQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBLElBQUssR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUEsQUFBQyxDQUFBO0tBQzNHOztBQUVELFFBQUksS0FBSyxHQUFHLEVBQUUsRUFBRTtBQUNkLFVBQUksR0FBRyxDQUFDLENBQUE7S0FDVCxNQUFNLElBQUksS0FBSyxHQUFHLEVBQUUsRUFBRTtBQUNyQixVQUFJLEdBQUcsTUFBTSxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUEsQUFBQyxDQUFBO0tBQzlCLE1BQU07QUFDTCxVQUFJLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRyxHQUFHLENBQUMsR0FBRyxPQUFPLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQSxBQUFDLENBQUE7S0FDckU7O0FBRUQsV0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUNuQixTQUFLLEdB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QU0sQ0FBQyxDQUFBO0tBQ3BDO0FBQ0QsYUFBUyxFQUFFLHFCQUFZO0FBQ3JCLGFBQU8sQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUE7S0FDbkU7R0FDRixDQUFBO0FBQ0QsU0FBTyxJQUFJLENBQUE7Q0FDWixDQUFBOztBQUVELE1BQU0sQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFBIiwiZmlsZSI6Ii9ob21lL2Rhbm8vZmlsaS5qcy9zcmMvZmlyQ29lZmZzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbnZhciBGaXJDb2VmZnMgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIEthaXNlciB3aW5kb3dkIGZpbHRlcnNcbiAgLy8gZGVzaXJlZCBhdHRlbnVhdGlvbiBjYW4gYmUgZGVmaW5lZFxuICAvLyBiZXR0ZXIgdGhhbiB3aW5kb3dkIHNpbmMgZmlsdGVyc1xuICB2YXIgY2FsY0tJbXB1bHNlUmVzcG9uc2UgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgdmFyIEZzID0gcGFyYW1zLkZzXG4gICAgdmFyIEZhID0gcGFyYW1zLkZhXG4gICAgdmFyIEZiID0gcGFyYW1zLkZiXG4gICAgdmFyIG8gPSBwYXJhbXMub3JkZXIgfHwgNTFcbiAgICB2YXIgYWxwaGEgPSBwYXJhbXMuQXR0IHx8IDEwMFxuICAgIHZhciBpbm8gPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICB2YXIgZCA9IDBcbiAgICAgIHZhciBkcyA9IDFcbiAgICAgIHZhciBzID0gMVxuICAgICAgd2hpbGUgKGRzID4gcyAqIDFlLTYpIHtcbiAgICAgICAgZCArPSAyXG4gICAgICAgIGRzICo9IHZhbCAqIHZhbCAvIChkICogZClcbiAgICAgICAgcyArPSBkc1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNcbiAgICB9XG5cbiAgICBpZiAobyAvIDIgLSBNYXRoLmZsb29yKG8gLyAyKSA9PT0gMCkge1xuICAgICAgbysrXG4gICAgfVxuICAgIHZhciBOcCA9IChvIC0gMSkgLyAyXG4gICAgdmFyIEEgPSBbXVxuICAgIHZhciBiZXRhID0gMFxuICAgIHZhciBjbnQgPSAwXG4gICAgdmFyIGlub0JldGFcbiAgICB2YXIgcmV0ID0gW11cblxuICAgIEFbMF0gPSAyICogKEZiIC0gRmEpIC8gRnNcbiAgICBmb3IgKGNudCA9IDE7IGNudCA8PSBOcDsgY250KyspIHtcbiAgICAgIEFbY250XSA9IChNYXRoLnNpbigyICogY250ICogTWF0aC5QSSAqIEZiIC8gRnMpIC0gTWF0aC5zaW4oMiAqIGNudCAqIE1hdGguUEkgKiBGYSAvIEZzKSkgLyAoY250ICogTWF0aC5QSSlcbiAgICB9XG4gICAgLy8gZW1waXJpY2FsIGNvZWZmaWNpZW50c1xuICAgIGlmIChhbHBoYSA8IDIxKSB7XG4gICAgICBiZXRhID0gMFxuICAgIH0gZWxzZSBpZiAoYWxwaGEgPiA1MCkge1xuICAgICAgYmV0YSA9IDAuMTEwMiAqIChhbHBoYSAtIDguNylcbiAgICB9IGVsc2Uge1xuICAgICAgYmV0YSA9IDAuNTg0MiAqIE1hdGgucG93KChhbHBoYSAtIDIxKSwgMC40KSArIDAuMDc4ODYgKiAoYWxwaGEgLSAyMSlcbiAgICB9XG5cbiAgICBpbm9CZXRhID0gaW5vKGJldGEpXG4gICAgZm9yIChjbnQgPSAwOyBjbnQgPD0gTnA7IGNudCsrKSB7XG4gICAgICByZXRbTnAgKyBjbnRdID0gQVtjbnRdICogaW5vKGJldGEgKiBNYXRoLnNxcnQoMSAtIChjbnQgKiBjbnQgLyAoTnAgKiBOcCkpKSkgLyBpbm9CZXRhXG4gICAgfVxuICAgIGZvciAoY250ID0gMDsgY250IDwgTnA7IGNudCsrKSB7XG4gICAgICByZXRbY250XSA9IHJldFtvIC0gMSAtIGNudF1cbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgLy8gbm90ZTogY29lZmZpY2llbnRzIGFyZSBlcXVhbCB0byBpbXB1bHNlIHJlc3BvbnNlXG4gIC8vIHdpbmRvd2Qgc2luYyBmaWx0ZXJcbiAgdmFyIGNhbGNJbXB1bHNlUmVzcG9uc2UgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgdmFyIEZzID0gcGFyYW1zLkZzXG4gICAgdmFyIEZjID0gcGFyYW1zLkZjXG4gICAgdmFyIG8gPSBwYXJhbXMub3JkZXJcbiAgICB2YXIgb21lZ2EgPSAyICogTWF0aC5QSSAqIEZjIC8gRnNcbiAgICB2YXIgY250ID0gMFxuICAgIHZhciBkYyA9IDBcbiAgICB2YXIgcmV0ID0gW11cbiAgICAvLyBzaW5jIGZ1bmN0aW9uIGlzIGNvbnNpZGVyZWQgdG8gYmVcbiAgICAvLyB0aGUgaWRlYWwgaW1wdWxzZSByZXNwb25zZVxuICAgIC8vIGRvIGFuIGlkZnQgYW5kIHVzZSBIYW1taW5nIHdpbmRvdyBhZnRlcndhcmRzXG4gICAgZm9yIChjbnQgPSAwOyBjbnQgPD0gbzsgY250KyspIHtcbiAgICAgIGlmIChjbnQgLSBvIC8gMiA9PT0gMCkge1xuICAgICAgICByZXRbY250XSA9IG9tZWdhXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXRbY250XSA9IE1hdGguc2luKG9tZWdhICogKGNudCAtIG8gLyAyKSkgLyAoY250IC0gbyAvIDIpXG4gICAgICAgIC8vIEhhbW1pbmcgd2luZG93XG4gICAgICAgIHJldFtjbnRdICo9ICgwLjU0IC0gMC40NiAqIE1hdGguY29zKDIgKiBNYXRoLlBJICogY250IC8gbykpXG4gICAgICB9XG4gICAgICBkYyA9IGRjICsgcmV0W2NudF1cbiAgICB9XG4gICAgLy8gbm9ybWFsaXplXG4gICAgZm9yIChjbnQgPSAwOyBjbnQgPD0gbzsgY250KyspIHtcbiAgICAgIHJldFtjbnRdIC89IGRjXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxuICAvLyBpbnZlcnQgZm9yIGhpZ2hwYXNzIGZyb20gbG93cGFzc1xuICB2YXIgaW52ZXJ0ID0gZnVuY3Rpb24gKGgpIHtcbiAgICB2YXIgY250XG4gICAgZm9yIChjbnQgPSAwOyBjbnQgPCBoLmxlbmd0aDsgY250KyspIHtcbiAgICAgIGhbY250XSA9IC1oW2NudF1cbiAgICB9XG4gICAgaFsoaC5sZW5ndGggLSAxKSAvIDJdKytcbiAgICByZXR1cm4gaFxuICB9XG4gIHZhciBicyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICB2YXIgbHAgPSBjYWxjSW1wdWxzZVJlc3BvbnNlKHtcbiAgICAgIG9yZGVyOiBwYXJhbXMub3JkZXIsXG4gICAgICBGczogcGFyYW1zLkZzLFxuICAgICAgRmM6IHBhcmFtcy5GMlxuICAgIH0pXG4gICAgdmFyIGhwID0gaW52ZXJ0KGNhbGNJbXB1bHNlUmVzcG9uc2Uoe1xuICAgICAgb3JkZXI6IHBhcmFtcy5vcmRlcixcbiAgICAgIEZzOiBwYXJhbXMuRnMsXG4gICAgICBGYzogcGFyYW1zLkYxXG4gICAgfSkpXG4gICAgdmFyIG91dCA9IFtdXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBscC5sZW5ndGg7IGkrKykge1xuICAgICAgb3V0LnB1c2gobHBbaV0gKyBocFtpXSlcbiAgICB9XG4gICAgcmV0dXJuIG91dFxuICB9XG4gIHZhciBzZWxmID0ge1xuICAgIGxvd3Bhc3M6IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgIHJldHVybiBjYWxjSW1wdWxzZVJlc3BvbnNlKHBhcmFtcylcbiAgICB9LFxuICAgIGhpZ2hwYXNzOiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICByZXR1cm4gaW52ZXJ0KGNhbGNJbXB1bHNlUmVzcG9uc2UocGFyYW1zKSlcbiAgICB9LFxuICAgIGJhbmRzdG9wOiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICByZXR1cm4gYnMocGFyYW1zKVxuICAgIH0sXG4gICAgYmFuZHBhc3M6IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgIHJldHVybiBpbnZlcnQoYnMocGFyYW1zKSlcbiAgICB9LFxuICAgIGtiRmlsdGVyOiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICByZXR1cm4gY2FsY0tJbXB1bHNlUmVzcG9uc2UocGFyYW1zKVxuICAgIH0sXG4gICAgYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gWydsb3dwYXNzJywgJ2hpZ2hwYXNzJywgJ2JhbmRzdG9wJywgJ2JhbmRwYXNzJywgJ2tiRmlsdGVyJ11cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlbGZcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBGaXJDb2VmZnNcbiJdfQ==
+ +
+ + + + + + diff --git a/coverage/lcov-report/src/firFilter.js.html b/coverage/lcov-report/src/firFilter.js.html new file mode 100644 index 0000000..736740a --- /dev/null +++ b/coverage/lcov-report/src/firFilter.js.html @@ -0,0 +1,384 @@ + + + + Code coverage report for src/firFilter.js + + + + + + +
+

Code coverage report for src/firFilter.js

+

+ Statements: 98.11% (52 / 53)      + Branches: 50% (1 / 2)      + Functions: 90.91% (10 / 11)      + Lines: 98.11% (52 / 53)      + Ignored: none      +

+
All files » src/ » firFilter.js
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114  +  +1 +  +1 +1 +1 +  +  +  +  +1 +  +5 +5 +5 +5 +505 +  +  +  +  +  +5 +14 +14 +14 +1400 +  +14 +  +  +  +  +  +5 +  +5 +100005 +100005 +100005 +10000500 +  +100005 +100005 +  +  +5 +5 +5 +  +  +5 +1000 +1000 +  +  +  +1000 +1000 +  +  +  +1000 +100000 +  +  +  +  +1000 +1000 +  +  +  +  +1000 +  +  +5 +  +  +  +  +5 +5 +5 +5 +5 +1000 +  +  +  +  +5 +5 +  +  +5 +  +  +5 +  +  +5 +  +  +4 +  +  +5 +  +  +1 + 
'use strict';
+ 
+var _require = require('./utils');
+ 
+var runMultiFilter = _require.runMultiFilter;
+var complex = _require.complex;
+var evaluatePhase = _require.evaluatePhase;
+ 
+/**
+ * Fir filter
+ */
+var FirFilter = function FirFilter(filter) {
+  // note: coefficients are equal to input response
+  var f = filter;
+  var b = [];
+  var cnt = 0;
+  for (cnt = 0; cnt < f.length; cnt++) {
+    b[cnt] = {
+      re: f[cnt],
+      im: 0
+    };
+  }
+ 
+  var initZero = function initZero(cnt) {
+    var r = [];
+    var i;
+    for (i = 0; i < cnt; i++) {
+      r.push(0);
+    }
+    return {
+      buf: r,
+      pointer: 0
+    };
+  };
+ 
+  var z = initZero(f.length - 1);
+ 
+  var doStep = function doStep(input, d) {
+    d.buf[d.pointer] = input;
+    var out = 0;
+    for (cnt = 0; cnt < d.buf.length; cnt++) {
+      out += f[cnt] * d.buf[(d.pointer + cnt) % d.buf.length];
+    }
+    d.pointer = (d.pointer + 1) % d.buf.length;
+    return out;
+  };
+ 
+  var calcInputResponse = function calcInputResponse(input) {
+    var tempF = initZero(f.length - 1);
+    return runMultiFilter(input, tempF, doStep);
+  };
+ 
+  var calcResponse = function calcResponse(params) {
+    var Fs = params.Fs;
+    var Fr = params.Fr;
+    // z = exp(j*omega*pi) = cos(omega*pi) + j*sin(omega*pi)
+    // z^-1 = exp(-j*omega*pi)
+    // omega is between 0 and 1. 1 is the Nyquist frequency.
+    var theta = -Math.PI * (Fr / Fs) * 2;
+    var h = {
+      re: 0,
+      im: 0
+    };
+    for (var i = 0; i < f.length - 1; i++) {
+      h = complex.add(h, complex.mul(b[i], {
+        re: Math.cos(theta * i),
+        im: Math.sin(theta * i)
+      }));
+    }
+    var m = complex.magnitude(h);
+    var res = {
+      magnitude: m,
+      phase: complex.phase(h),
+      dBmagnitude: 20 * Math.log(m) * Math.LOG10E
+    };
+    return res;
+  };
+ 
+  var self = {
+    responsePoint: function responsePoint(params) {
+      return calcResponse(params);
+    },
+    response: function response(resolution) {
+      resolution = resolution || 100;
+      var res = [];
+      var cnt = 0;
+      var r = resolution * 2;
+      for (cnt = 0; cnt < resolution; cnt++) {
+        res[cnt] = calcResponse({
+          Fs: r,
+          Fr: cnt
+        });
+      }
+      evaluatePhase(res);
+      return res;
+    },
+    simulate: function simulate(input) {
+      return calcInputResponse(input);
+    },
+    singleStep: function singleStep(input) {
+      return doStep(input, z);
+    },
+    multiStep: function multiStep(input, overwrite) {
+      return runMultiFilter(input, z, doStep, overwrite);
+    },
+    reinit: function reinit() {
+      z = initZero(f.length - 1);
+    }
+  };
+  return self;
+};
+ 
+module.exports = FirFilter;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL2Rhbm8vZmlsaS5qcy9zcmMvZmlyRmlsdGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQTs7ZUFNUixPQUFPLENBQUMsU0FBUyxDQUFDOztJQUhwQixjQUFjLFlBQWQsY0FBYztJQUNkLE9BQU8sWUFBUCxPQUFPO0lBQ1AsYUFBYSxZQUFiLGFBQWE7Ozs7O0FBTWYsSUFBSSxTQUFTLEdBQUcsU0FBWixTQUFTLENBQWEsTUFBTSxFQUFFOztBQUVoQyxNQUFJLENBQUMsR0FBRyxNQUFNLENBQUE7QUFDZCxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7QUFDVixNQUFJLEdBQUcsR0FBRyxDQUFDLENBQUE7QUFDWCxPQUFLLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUU7QUFDbkMsS0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHO0FBQ1AsUUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDVixRQUFFLEVBQUUsQ0FBQztLQUNOLENBQUE7R0FDRjs7QUFFRCxNQUFJLFFBQVEsR0FBRyxTQUFYLFFBQVEsQ0FBYSxHQUFHLEVBQUU7QUFDNUIsUUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO0FBQ1YsUUFBSSxDQUFDLENBQUE7QUFDTCxTQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN4QixPQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ1Y7QUFDRCxXQUFPO0FBQ0wsU0FBRyxFQUFFLENBQUM7QUFDTixhQUFPLEVBQUUsQ0FBQztLQUNYLENBQUE7R0FDRixDQUFBOztBQUVELE1BQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBOztBQUU5QixNQUFJLE1BQU0sR0FBRyxTQUFULE1BQU0sQ0FBYSxLQUFLLEVBQUUsQ0FB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QyxFQUFFLEdBQUcsR0FBRyxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUU7QUFDckMsV0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQztBQUN0QixZQUFFLEVBQUUsQ0FBQztBQUNMLFlBQUUsRUFBRSxHQUFHO1NBQ1IsQ0FBQyxDQUFBO09BQ0g7QUFDRCxtQkFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ2xCLGFBQU8sR0FBRyxDQUFBO0tBQ1g7QUFDRCxZQUFRLEVBQUUsa0JBQVUsS0FBSyxFQUFFO0FBQ3pCLGFBQU8saUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUE7S0FDaEM7QUFDRCxjQUFVLEVBQUUsb0JBQVUsS0FBSyxFQUFFO0FBQzNCLGFBQU8sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQTtLQUN4QjtBQUNELGFBQVMsRUFBRSxtQkFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFO0FBQ3JDLGFBQU8sY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0tBQ25EO0FBQ0QsVUFBTSxFQUFFLGtCQUFZO0FBQ2xCLE9BQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtLQUMzQjtHQUNGLENBQUE7QUFDRCxTQUFPLElBQUksQ0FBQTtDQUNaLENBQUE7O0FBRUQsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUEiLCJmaWxlIjoiL2hvbWUvZGFuby9maWxpLmpzL3NyYy9maXJGaWx0ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxudmFyIHtcbiAgcnVuTXVsdGlGaWx0ZXIsXG4gIGNvbXBsZXgsXG4gIGV2YWx1YXRlUGhhc2Vcbn0gPSByZXF1aXJlKCcuL3V0aWxzJylcblxuLyoqXG4gKiBGaXIgZmlsdGVyXG4gKi9cbnZhciBGaXJGaWx0ZXIgPSBmdW5jdGlvbiAoZmlsdGVyKSB7XG4gIC8vIG5vdGU6IGNvZWZmaWNpZW50cyBhcmUgZXF1YWwgdG8gaW5wdXQgcmVzcG9uc2VcbiAgdmFyIGYgPSBmaWx0ZXJcbiAgdmFyIGIgPSBbXVxuICB2YXIgY250ID0gMFxuICBmb3IgKGNudCA9IDA7IGNudCA8IGYubGVuZ3RoOyBjbnQrKykge1xuICAgIGJbY250XSA9IHtcbiAgICAgIHJlOiBmW2NudF0sXG4gICAgICBpbTogMFxuICAgIH1cbiAgfVxuXG4gIHZhciBpbml0WmVybyA9IGZ1bmN0aW9uIChjbnQpIHtcbiAgICB2YXIgciA9IFtdXG4gICAgdmFyIGlcbiAgICBmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHtcbiAgICAgIHIucHVzaCgwKVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYnVmOiByLFxuICAgICAgcG9pbnRlcjogMFxuICAgIH1cbiAgfVxuXG4gIHZhciB6ID0gaW5pdFplcm8oZi5sZW5ndGggLSAxKVxuXG4gIHZhciBkb1N0ZXAgPSBmdW5jdGlvbiAoaW5wdXQsIGQpIHtcbiAgICBkLmJ1ZltkLnBvaW50ZXJdID0gaW5wdXRcbiAgICB2YXIgb3V0ID0gMFxuICAgIGZvciAoY250ID0gMDsgY250IDwgZC5idWYubGVuZ3RoOyBjbnQrKykge1xuICAgICAgb3V0ICs9IChmW2NudF0gKiBkLmJ1ZlsoZC5wb2ludGVyICsgY250KSAlIGQuYnVmLmxlbmd0aF0pXG4gICAgfVxuICAgIGQucG9pbnRlciA9IChkLnBvaW50ZXIgKyAxKSAlIChkLmJ1Zi5sZW5ndGgpXG4gICAgcmV0dXJuIG91dFxuICB9XG5cbiAgdmFyIGNhbGNJbnB1dFJlc3BvbnNlID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgdmFyIHRlbXBGID0gaW5pdFplcm8oZi5sZW5ndGggLSAxKVxuICAgIHJldHVybiBydW5NdWx0aUZpbHRlcihpbnB1dCwgdGVtcEYsIGRvU3RlcClcbiAgfVxuXG4gIHZhciBjYWxjUmVzcG9uc2UgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgdmFyIEZzID0gcGFyYW1zLkZzXG4gICAgdmFyIEZyID0gcGFyYW1zLkZyXG4gICAgLy8geiA9IGV4cChqKm9tZWdhKnBpKSA9IGNvcyhvbWVnYSpwaSkgKyBqKnNpbihvbWVnYSpwaSlcbiAgICAvLyB6Xi0xID0gZXhwKC1qKm9tZWdhKnBpKVxuICAgIC8vIG9tZWdhIGlzIGJldHdlZW4gMCBhbmQgMS4gMSBpcyB0aGUgTnlxdWlzdCBmcmVxdWVuY3kuXG4gICAgdmFyIHRoZXRhID0gLU1hdGguUEkgKiAoRnIgLyBGcykgKiAyXG4gICAgdmFyIGggPSB7XG4gICAgICByZTogMCxcbiAgICAgIGltOiAwXG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZi5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGggPSBjb21wbGV4LmFkZChoLCBjb21wbGV4Lm11bChiW2ldLCB7XG4gICAgICAgIHJlOiBNYXRoLmNvcyh0aGV0YSAqIGkpLFxuICAgICAgICBpbTogTWF0aC5zaW4odGhldGEgKiBpKVxuICAgICAgfSkpXG4gICAgfVxuICAgIHZhciBtID0gY29tcGxleC5tYWduaXR1ZGUoaClcbiAgICB2YXIgcmVzID0ge1xuICAgICAgbWFnbml0dWRlOiBtLFxuICAgICAgcGhhc2U6IGNvbXBsZXgucGhhc2UoaCksXG4gICAgICBkQm1hZ25pdHVkZTogMjAgKiBNYXRoLmxvZyhtKSAqIE1hdGguTE9HMTBFXG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfVxuXG4gIHZhciBzZWxmID0ge1xuICAgIHJlc3BvbnNlUG9pbnQ6IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgIHJldHVybiBjYWxjUmVzcG9uc2UocGFyYW1zKVxuICAgIH0sXG4gICAgcmVzcG9uc2U6IGZ1bmN0aW9uIChyZXNvbHV0aW9uKSB7XG4gICAgICByZXNvbHV0aW9uID0gcmVzb2x1dGlvbiB8fCAxMDBcbiAgICAgIHZhciByZXMgPSBbXVxuICAgICAgdmFyIGNudCA9IDBcbiAgICAgIHZhciByID0gcmVzb2x1dGlvbiAqIDJcbiAgICAgIGZvciAoY250ID0gMDsgY250IDwgcmVzb2x1dGlvbjsgY250KyspIHtcbiAgICAgICAgcmVzW2NudF0gPSBjYWxjUmVzcG9uc2Uoe1xuICAgICAgICAgIEZzOiByLFxuICAgICAgICAgIEZyOiBjbnRcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGV2YWx1YXRlUGhhc2UocmVzKVxuICAgICAgcmV0dXJuIHJlc1xuICAgIH0sXG4gICAgc2ltdWxhdGU6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgcmV0dXJuIGNhbGNJbnB1dFJlc3BvbnNlKGlucHV0KVxuICAgIH0sXG4gICAgc2luZ2xlU3RlcDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICByZXR1cm4gZG9TdGVwKGlucHV0LCB6KVxuICAgIH0sXG4gICAgbXVsdGlTdGVwOiBmdW5jdGlvbiAoaW5wdXQsIG92ZXJ3cml0ZSkge1xuICAgICAgcmV0dXJuIHJ1bk11bHRpRmlsdGVyKGlucHV0LCB6LCBkb1N0ZXAsIG92ZXJ3cml0ZSlcbiAgICB9LFxuICAgIHJlaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgeiA9IGluaXRaZXJvKGYubGVuZ3RoIC0gMSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlbGZcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBGaXJGaWx0ZXJcbiJdfQ==
+ +
+ + + + + + diff --git a/coverage/lcov-report/src/iirCoeffs.js.html b/coverage/lcov-report/src/iirCoeffs.js.html new file mode 100644 index 0000000..daf1e59 --- /dev/null +++ b/coverage/lcov-report/src/iirCoeffs.js.html @@ -0,0 +1,891 @@ + + + + Code coverage report for src/iirCoeffs.js + + + + + + +
+

Code coverage report for src/iirCoeffs.js

+

+ Statements: 89.18% (173 / 194)      + Branches: 54.17% (13 / 24)      + Functions: 94.44% (17 / 18)      + Lines: 89.18% (173 / 194)      + Ignored: none      +

+
All files » src/ » iirCoeffs.js
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283  +  +1 +1 +37 +37 +37 +37 +37 +37 +  +  +37 +  +37 +37 +37 +37 +37 +37 +37 +  +  +1 +9 +9 +9 +9 +9 +9 +9 +9 +9 +  +  +1 +76 +76 +76 +76 +76 +  +  +1 +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +21 +21 +21 +21 +21 +21 +21 +21 +  +21 +21 +21 +  +  +  +  +21 +21 +21 +  +  +  +  +3 +3 +3 +3 +3 +  +  +3 +3 +3 +3 +3 +3 +3 +3 +  +  +  +3 +3 +3 +3 +3 +  +  +3 +3 +3 +3 +3 +3 +3 +3 +  +  +  +  +  +  +  +11 +11 +  +  +11 +11 +6 +6 +  +5 +5 +  +11 +11 +11 +  +  +  +  +11 +11 +  +  +11 +11 +6 +6 +  +5 +5 +  +11 +11 +11 +  +  +  +  +3 +3 +  +  +3 +3 +3 +3 +3 +3 +  +  +  +  +3 +3 +3 +3 +3 +3 +3 +  +  +  +  +3 +3 +3 +3 +3 +3 +3 +  +  +  +  +6 +6 +6 +6 +6 +6 +6 +  +  +  +  +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +  +  +  +  +3 +3 +  +  +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +  +  +  +  +3 +3 +  +  +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +  +  +  +  +  +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +  +  +  +1 +  +  +1 + 
'use strict';
+ 
+var IirCoeffs = function IirCoeffs() {
+  var preCalc = function preCalc(params, coeffs) {
+    var Q = params.Q;
+    var Fc = params.Fc;
+    var Fs = params.Fs;
+    var pre = {};
+    var w = 2 * Math.PI * Fc / Fs;
+    Iif (params.BW) {
+      pre.alpha = Math.sin(w) * Math.sinh(Math.log(2) / 2 * params.BW * w / Math.sin(w));
+    } else {
+      pre.alpha = Math.sin(w) / (2 * Q);
+    }
+    pre.cw = Math.cos(w);
+    pre.a0 = 1 + pre.alpha;
+    coeffs.a0 = pre.a0;
+    coeffs.a.push(-2 * pre.cw / pre.a0);
+    coeffs.k = 1;
+    coeffs.a.push((1 - pre.alpha) / pre.a0);
+    return pre;
+  };
+ 
+  var preCalcGain = function preCalcGain(params) {
+    var Q = params.Q;
+    var Fc = params.Fc;
+    var Fs = params.Fs;
+    var pre = {};
+    var w = 2 * Math.PI * Fc / Fs;
+    pre.alpha = Math.sin(w) / (2 * Q);
+    pre.cw = Math.cos(w);
+    pre.A = Math.pow(10, params.gain / 40);
+    return pre;
+  };
+ 
+  var initCoeffs = function initCoeffs() {
+    var coeffs = {};
+    coeffs.z = [0, 0];
+    coeffs.a = [];
+    coeffs.b = [];
+    return coeffs;
+  };
+ 
+  var self = {
+ 
+    fromPZ: function fromPZ(params) {
+      var coeffs = initCoeffs();
+      coeffs.a0 = 1;
+      coeffs.b.push(1);
+      coeffs.b.push(-params.z0.re - params.z1.re);
+      coeffs.b.push(params.z0.re * params.z1.re - params.z0.im * params.z1.im);
+      coeffs.a.push(-params.p0.re - params.p1.re);
+      coeffs.a.push(params.p0.re * params.p1.re - params.p0.im * params.p1.im);
+      if (params.type === 'lowpass') {
+        coeffs.k = (1 + coeffs.a[0] + coeffs.a[1]) / (1 + coeffs.b[1] + coeffs.b[2]);
+      } else {
+        coeffs.k = (1 - coeffs.a[0] + coeffs.a[1]) / (1 - coeffs.b[1] + coeffs.b[2]);
+      }
+      return coeffs;
+    },
+ 
+    // lowpass matched-z transform: H(s) = 1/(1+a's/w_c+b's^2/w_c)
+    lowpassMZ: function lowpassMZ(params) {
+      var coeffs = initCoeffs();
+      coeffs.a0 = 1;
+      var as = params.as;
+      var bs = params.bs;
+      var w = 2 * Math.PI * params.Fc / params.Fs;
+      var s = -(as / (2 * bs));
+      coeffs.a.push(-Math.pow(Math.E, s * w) * 2 * Math.cos(-w * Math.sqrt(Math.abs(Math.pow(as, 2) / (4 * Math.pow(bs, 2)) - 1 / bs))));
+      coeffs.a.push(Math.pow(Math.E, 2 * s * w));
+      // correct gain
+      Eif (!params.preGain) {
+        coeffs.b.push(coeffs.a0 + coeffs.a[0] + coeffs.a[1]);
+        coeffs.k = 1;
+      } else {
+        coeffs.b.push(1);
+        coeffs.k = coeffs.a0 + coeffs.a[0] + coeffs.a[1];
+      }
+      coeffs.b.push(0);
+      coeffs.b.push(0);
+      return coeffs;
+    },
+ 
+    // Bessel-Thomson: H(s) = 3/(s^2+3*s+3)
+    lowpassBT: function lowpassBT(params) {
+      var coeffs = initCoeffs();
+      params.Q = 1;
+      coeffs.wp = Math.tan(2 * Math.PI * params.Fc / (2 * params.Fs));
+      coeffs.wp2 = coeffs.wp * coeffs.wp;
+      Iif (params.BW) {
+        delete params.BW;
+      }
+      coeffs.k = 1;
+      coeffs.a0 = 3 * coeffs.wp + 3 * coeffs.wp2 + 1;
+      coeffs.b.push(3 * coeffs.wp2 * params.Q / coeffs.a0);
+      coeffs.b.push(2 * coeffs.b[0]);
+      coeffs.b.push(coeffs.b[0]);
+      coeffs.a.push((6 * coeffs.wp2 - 2) / coeffs.a0);
+      coeffs.a.push((3 * coeffs.wp2 - 3 * coeffs.wp + 1) / coeffs.a0);
+      return coeffs;
+    },
+ 
+    highpassBT: function highpassBT(params) {
+      var coeffs = initCoeffs();
+      params.Q = 1;
+      coeffs.wp = Math.tan(2 * Math.PI * params.Fc / (2 * params.Fs));
+      coeffs.wp2 = coeffs.wp * coeffs.wp;
+      Iif (params.BW) {
+        delete params.BW;
+      }
+      coeffs.k = 1;
+      coeffs.a0 = coeffs.wp + coeffs.wp2 + 3;
+      coeffs.b.push(3 * params.Q / coeffs.a0);
+      coeffs.b.push(2 * coeffs.b[0]);
+      coeffs.b.push(coeffs.b[0]);
+      coeffs.a.push((2 * coeffs.wp2 - 6) / coeffs.a0);
+      coeffs.a.push((coeffs.wp2 - coeffs.wp + 3) / coeffs.a0);
+      return coeffs;
+    },
+ 
+    /*
+     * Formulas from http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt
+     */
+    // H(s) = 1 / (s^2 + s/Q + 1)
+    lowpass: function lowpass(params) {
+      var coeffs = initCoeffs();
+      Iif (params.BW) {
+        delete params.BW;
+      }
+      var p = preCalc(params, coeffs);
+      if (params.preGain) {
+        coeffs.k = (1 - p.cw) * 0.5;
+        coeffs.b.push(1 / p.a0);
+      } else {
+        coeffs.k = 1;
+        coeffs.b.push((1 - p.cw) / (2 * p.a0));
+      }
+      coeffs.b.push(2 * coeffs.b[0]);
+      coeffs.b.push(coeffs.b[0]);
+      return coeffs;
+    },
+ 
+    // H(s) = s^2 / (s^2 + s/Q + 1)
+    highpass: function highpass(params) {
+      var coeffs = initCoeffs();
+      Iif (params.BW) {
+        delete params.BW;
+      }
+      var p = preCalc(params, coeffs);
+      if (params.preGain) {
+        coeffs.k = (1 + p.cw) * 0.5;
+        coeffs.b.push(1 / p.a0);
+      } else {
+        coeffs.k = 1;
+        coeffs.b.push((1 + p.cw) / (2 * p.a0));
+      }
+      coeffs.b.push(-2 * coeffs.b[0]);
+      coeffs.b.push(coeffs.b[0]);
+      return coeffs;
+    },
+ 
+    // H(s) = (s^2 - s/Q + 1) / (s^2 + s/Q + 1)
+    allpass: function allpass(params) {
+      var coeffs = initCoeffs();
+      Iif (params.BW) {
+        delete params.BW;
+      }
+      var p = preCalc(params, coeffs);
+      coeffs.k = 1;
+      coeffs.b.push((1 - p.alpha) / p.a0);
+      coeffs.b.push(-2 * p.cw / p.a0);
+      coeffs.b.push((1 + p.alpha) / p.a0);
+      return coeffs;
+    },
+ 
+    // H(s) = s / (s^2 + s/Q + 1)
+    bandpassQ: function bandpassQ(params) {
+      var coeffs = initCoeffs();
+      var p = preCalc(params, coeffs);
+      coeffs.k = 1;
+      coeffs.b.push(p.alpha * params.Q / p.a0);
+      coeffs.b.push(0);
+      coeffs.b.push(-coeffs.b[0]);
+      return coeffs;
+    },
+ 
+    // H(s) = (s/Q) / (s^2 + s/Q + 1)
+    bandpass: function bandpass(params) {
+      var coeffs = initCoeffs();
+      var p = preCalc(params, coeffs);
+      coeffs.k = 1;
+      coeffs.b.push(p.alpha / p.a0);
+      coeffs.b.push(0);
+      coeffs.b.push(-coeffs.b[0]);
+      return coeffs;
+    },
+ 
+    // H(s) = (s^2 + 1) / (s^2 + s/Q + 1)
+    bandstop: function bandstop(params) {
+      var coeffs = initCoeffs();
+      var p = preCalc(params, coeffs);
+      coeffs.k = 1;
+      coeffs.b.push(1 / p.a0);
+      coeffs.b.push(-2 * p.cw / p.a0);
+      coeffs.b.push(coeffs.b[0]);
+      return coeffs;
+    },
+ 
+    // H(s) = (s^2 + s*(A/Q) + 1) / (s^2 + s/(A*Q) + 1)
+    peak: function peak(params) {
+      var coeffs = initCoeffs();
+      var p = preCalcGain(params);
+      coeffs.k = 1;
+      coeffs.a0 = 1 + p.alpha / p.A;
+      coeffs.a.push(-2 * p.cw / coeffs.a0);
+      coeffs.a.push((1 - p.alpha / p.A) / coeffs.a0);
+      coeffs.b.push((1 + p.alpha * p.A) / coeffs.a0);
+      coeffs.b.push(-2 * p.cw / coeffs.a0);
+      coeffs.b.push((1 - p.alpha * p.A) / coeffs.a0);
+      return coeffs;
+    },
+ 
+    // H(s) = A * (s^2 + (sqrt(A)/Q)*s + A)/(A*s^2 + (sqrt(A)/Q)*s + 1)
+    lowshelf: function lowshelf(params) {
+      var coeffs = initCoeffs();
+      Iif (params.BW) {
+        delete params.BW;
+      }
+      var p = preCalcGain(params);
+      coeffs.k = 1;
+      var sa = 2 * Math.sqrt(p.A) * p.alpha;
+      coeffs.a0 = p.A + 1 + (p.A - 1) * p.cw + sa;
+      coeffs.a.push(-2 * (p.A - 1 + (p.A + 1) * p.cw) / coeffs.a0);
+      coeffs.a.push((p.A + 1 + (p.A - 1) * p.cw - sa) / coeffs.a0);
+      coeffs.b.push(p.A * (p.A + 1 - (p.A - 1) * p.cw + sa) / coeffs.a0);
+      coeffs.b.push(2 * p.A * (p.A - 1 - (p.A + 1) * p.cw) / coeffs.a0);
+      coeffs.b.push(p.A * (p.A + 1 - (p.A - 1) * p.cw - sa) / coeffs.a0);
+      return coeffs;
+    },
+ 
+    // H(s) = A * (A*s^2 + (sqrt(A)/Q)*s + 1)/(s^2 + (sqrt(A)/Q)*s + A)
+    highshelf: function highshelf(params) {
+      var coeffs = initCoeffs();
+      Iif (params.BW) {
+        delete params.BW;
+      }
+      var p = preCalcGain(params);
+      coeffs.k = 1;
+      var sa = 2 * Math.sqrt(p.A) * p.alpha;
+      coeffs.a0 = p.A + 1 - (p.A - 1) * p.cw + sa;
+      coeffs.a.push(2 * (p.A - 1 - (p.A + 1) * p.cw) / coeffs.a0);
+      coeffs.a.push((p.A + 1 - (p.A - 1) * p.cw - sa) / coeffs.a0);
+      coeffs.b.push(p.A * (p.A + 1 + (p.A - 1) * p.cw + sa) / coeffs.a0);
+      coeffs.b.push(-2 * p.A * (p.A - 1 + (p.A + 1) * p.cw) / coeffs.a0);
+      coeffs.b.push(p.A * (p.A + 1 + (p.A - 1) * p.cw - sa) / coeffs.a0);
+      return coeffs;
+    },
+ 
+    // taken from: Design of digital filters for frequency weightings (A and C) required for risk assessments of workers exposed to noise
+    // use Butterworth one stage IIR filter to get the results from the paper
+    aweighting: function aweighting(params) {
+      var coeffs = initCoeffs();
+      coeffs.k = 1;
+      var wo = 2 * Math.PI * params.Fc / params.Fs;
+      var w = 2 * Math.tan(wo / 2);
+      var Q = params.Q;
+      var wsq = Math.pow(w, 2);
+      coeffs.a0 = 4 * Q + wsq * Q + 2 * w;
+      coeffs.a.push(2 * wsq * Q - 8 * Q);
+      coeffs.a.push(4 * Q + wsq * Q - 2 * w);
+      coeffs.b.push(wsq * Q);
+      coeffs.b.push(2 * wsq * Q);
+      coeffs.b.push(wsq * Q);
+      return coeffs;
+    }
+  };
+ 
+  return self;
+};
+ 
+module.exports = IirCoeffs;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL2Rhbm8vZmlsaS5qcy9zcmMvaWlyQ29lZmZzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQTs7QUFFWixJQUFJLFNBQVMsR0FBRyxTQUFaLFNBQVMsR0FBZTtBQUMxQixNQUFJLE9BQU8sR0FBRyxTQUFWLE9BQU8sQ0FBYSxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQ3RDLFFBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUE7QUFDaEIsUUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQTtBQUNsQixRQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFBO0FBQ2xCLFFBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQTtBQUNaLFFBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUE7QUFDN0IsUUFBSSxNQUFNLENBQUMsRUFBRSxFQUFFO0FBQ2IsU0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ25GLE1BQU07QUFDTCxTQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQSxBQUFDLENBQUE7S0FDbEM7QUFDRCxPQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDcEIsT0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQTtBQUN0QixVQUFNLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FB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QUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNaLFVBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFBO0FBQ3JDLFlBQU0sQ0FBQyxFQUFFLEdBQUcsQUFBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEdBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUE7QUFDN0MsWUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQUFBQyxDQUFDLENBQUMsSUFBSSxBQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsR0FBSSxDQUFDLENBQUMsRUFBRSxDQUFBLEFBQUMsR0FBSSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDaEUsWUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxBQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsR0FBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQSxHQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUM5RCxZQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxBQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQUFBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEdBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUEsQUFBQyxHQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUN0RSxZQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxBQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEFBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxHQUFJLENBQUMsQ0FBQyxFQUFFLENBQUEsQUFBQyxHQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUNyRSxZQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxBQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQUFBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEdBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUEsQUFBQyxHQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUN0RSxhQUFPLE1BQU0sQ0FBQTtLQUNkOzs7QUFHRCxhQUFTLEVBQUUsbUJBQVUsTUFBTSxFQUFFO0FBQzNCLFVBQUksTUFBTSxHQUFHLFVBQVUsRUFBRSxDQUFBO0FBQ3pCLFVBQUksTUFBTSxDQUFDLEVBQUUsRUFBRTtBQUNiLGVBQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQTtPQUNqQjtBQUNELFVBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUMzQixZQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNaLFVBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFBO0FBQ3JDLFlBQU0sQ0FBQyxFQUFFLEdBQUcsQUFBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEdBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUE7QUFDN0MsWUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQUFBQyxDQUFDLElBQUksQUFBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEdBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQSxBQUFDLEdBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQy9ELFlBQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQUFBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEdBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUEsR0FBSSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDOUQsWUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQUFBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEFBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxHQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFBLEFBQUMsR0FBSSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDdEUsWUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQUFBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEFBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxHQUFJLENBQUMsQ0FBQyxFQUFFLENBQUEsQUFBQyxHQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUN0RSxZQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxBQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQUFBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEdBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUEsQUFBQyxHQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUN0RSxhQUFPLE1BQU0sQ0FBQTtLQUNkOzs7O0FBSUQsY0FBVSxFQUFFLG9CQUFVLE1BQU0sRUFBRTtBQUM1QixVQUFJLE1BQU0sR0FBRyxVQUFVLEVBQUUsQ0FBQTtBQUN6QixZQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNaLFVBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQTtBQUM1QyxVQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7QUFDNUIsVUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQTtBQUNoQixVQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUN4QixZQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ25DLFlBQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUNsQyxZQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBRSxDQUFBO0FBQ3hDLFlBQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUN0QixZQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBQzFCLFlBQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUN0QixhQUFPLE1BQU0sQ0FBQTtLQUNkO0dBQ0YsQ0FBQTs7QUFFRCxTQUFPLElBQUksQ0FBQTtDQUNaLENBQUE7O0FBRUQsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUEiLCJmaWxlIjoiL2hvbWUvZGFuby9maWxpLmpzL3NyYy9paXJDb2VmZnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxudmFyIElpckNvZWZmcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHByZUNhbGMgPSBmdW5jdGlvbiAocGFyYW1zLCBjb2VmZnMpIHtcbiAgICB2YXIgUSA9IHBhcmFtcy5RXG4gICAgdmFyIEZjID0gcGFyYW1zLkZjXG4gICAgdmFyIEZzID0gcGFyYW1zLkZzXG4gICAgdmFyIHByZSA9IHt9XG4gICAgdmFyIHcgPSAyICogTWF0aC5QSSAqIEZjIC8gRnNcbiAgICBpZiAocGFyYW1zLkJXKSB7XG4gICAgICBwcmUuYWxwaGEgPSBNYXRoLnNpbih3KSAqIE1hdGguc2luaChNYXRoLmxvZygyKSAvIDIgKiBwYXJhbXMuQlcgKiB3IC8gTWF0aC5zaW4odykpXG4gICAgfSBlbHNlIHtcbiAgICAgIHByZS5hbHBoYSA9IE1hdGguc2luKHcpIC8gKDIgKiBRKVxuICAgIH1cbiAgICBwcmUuY3cgPSBNYXRoLmNvcyh3KVxuICAgIHByZS5hMCA9IDEgKyBwcmUuYWxwaGFcbiAgICBjb2VmZnMuYTAgPSBwcmUuYTBcbiAgICBjb2VmZnMuYS5wdXNoKCgtMiAqIHByZS5jdykgLyBwcmUuYTApXG4gICAgY29lZmZzLmsgPSAxXG4gICAgY29lZmZzLmEucHVzaCgoMSAtIHByZS5hbHBoYSkgLyBwcmUuYTApXG4gICAgcmV0dXJuIHByZVxuICB9XG5cbiAgdmFyIHByZUNhbGNHYWluID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgIHZhciBRID0gcGFyYW1zLlFcbiAgICB2YXIgRmMgPSBwYXJhbXMuRmNcbiAgICB2YXIgRnMgPSBwYXJhbXMuRnNcbiAgICB2YXIgcHJlID0ge31cbiAgICB2YXIgdyA9IDIgKiBNYXRoLlBJICogRmMgLyBGc1xuICAgIHByZS5hbHBoYSA9IE1hdGguc2luKHcpIC8gKDIgKiBRKVxuICAgIHByZS5jdyA9IE1hdGguY29zKHcpXG4gICAgcHJlLkEgPSBNYXRoLnBvdygxMCwgcGFyYW1zLmdhaW4gLyA0MClcbiAgICByZXR1cm4gcHJlXG4gIH1cblxuICB2YXIgaW5pdENvZWZmcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29lZmZzID0ge31cbiAgICBjb2VmZnMueiA9IFswLCAwXVxuICAgIGNvZWZmcy5hID0gW11cbiAgICBjb2VmZnMuYiA9IFtdXG4gICAgcmV0dXJuIGNvZWZmc1xuICB9XG5cbiAgdmFyIHNlbGYgPSB7XG5cbiAgICBmcm9tUFo6IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgIHZhciBjb2VmZnMgPSBpbml0Q29lZmZzKClcbiAgICAgIGNvZWZmcy5hMCA9IDFcbiAgICAgIGNvZWZmcy5iLnB1c2goMSlcbiAgICAgIGNvZWZmcy5iLnB1c2goLXBhcmFtcy56MC5yZSAtIHBhcmFtcy56MS5yZSlcbiAgICAgIGNvZWZmcy5iLnB1c2gocGFyYW1zLnowLnJlICogcGFyYW1zLnoxLnJlIC0gcGFyYW1zLnowLmltICogcGFyYW1zLnoxLmltKVxuICAgICAgY29lZmZzLmEucHVzaCgtcGFyYW1zLnAwLnJlIC0gcGFyYW1zLnAxLnJlKVxuICAgICAgY29lZmZzLmEucHVzaChwYXJhbXMucDAucmUgKiBwYXJhbXMucDEucmUgLSBwYXJhbXMucDAuaW0gKiBwYXJhbXMucDEuaW0pXG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdsb3dwYXNzJykge1xuICAgICAgICBjb2VmZnMuayA9ICgxICsgY29lZmZzLmFbMF0gKyBjb2VmZnMuYVsxXSkgLyAoMSArIGNvZWZmcy5iWzFdICsgY29lZmZzLmJbMl0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2VmZnMuayA9ICgxIC0gY29lZmZzLmFbMF0gKyBjb2VmZnMuYVsxXSkgLyAoMSAtIGNvZWZmcy5iWzFdICsgY29lZmZzLmJbMl0pXG4gICAgICB9XG4gICAgICByZXR1cm4gY29lZmZzXG4gICAgfSxcblxuICAgIC8vIGxvd3Bhc3MgbWF0Y2hlZC16IHRyYW5zZm9ybTogSChzKSA9IDEvKDErYSdzL3dfYytiJ3NeMi93X2MpXG4gICAgbG93cGFzc01aOiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICB2YXIgY29lZmZzID0gaW5pdENvZWZmcygpXG4gICAgICBjb2VmZnMuYTAgPSAxXG4gICAgICB2YXIgYXMgPSBwYXJhbXMuYXNcbiAgICAgIHZhciBicyA9IHBhcmFtcy5ic1xuICAgICAgdmFyIHcgPSAyICogTWF0aC5QSSAqIHBhcmFtcy5GYyAvIHBhcmFtcy5Gc1xuICAgICAgdmFyIHMgPSAtKGFzIC8gKDIgKiBicykpXG4gICAgICBjb2VmZnMuYS5wdXNoKC1NYXRoLnBvdyhNYXRoLkUsIHMgKiB3KSAqIDIgKiBNYXRoLmNvcygtdyAqIE1hdGguc3FydChNYXRoLmFicyhNYXRoLnBvdyhhcywgMikgLyAoNCAqIE1hdGgucG93KGJzLCAyKSkgLSAxIC8gYnMpKSkpXG4gICAgICBjb2VmZnMuYS5wdXNoKE1hdGgucG93KE1hdGguRSwgMiAqIHMgKiB3KSlcbiAgICAgIC8vIGNvcnJlY3QgZ2FpblxuICAgICAgaWYgKCFwYXJhbXMucHJlR2Fpbikge1xuICAgICAgICBjb2VmZnMuYi5wdXNoKGNvZWZmcy5hMCArIGNvZWZmcy5hWzBdICsgY29lZmZzLmFbMV0pXG4gICAgICAgIGNvZWZmcy5rID0gMVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29lZmZzLmIucHVzaCgxKVxuICAgICAgICBjb2VmZnMuayA9IGNvZWZmcy5hMCArIGNvZWZmcy5hWzBdICsgY29lZmZzLmFbMV1cbiAgICAgIH1cbiAgICAgIGNvZWZmcy5iLnB1c2goMClcbiAgICAgIGNvZWZmcy5iLnB1c2goMClcbiAgICAgIHJldHVybiBjb2VmZnNcbiAgICB9LFxuXG4gICAgLy8gQmVzc2VsLVRob21zb246IEgocykgPSAzLyhzXjIrMypzKzMpXG4gICAgbG93cGFzc0JUOiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICB2YXIgY29lZmZzID0gaW5pdENvZWZmcygpXG4gICAgICBwYXJhbXMuUSA9IDFcbiAgICAgIGNvZWZmcy53cCA9IE1hdGgudGFuKCgyICogTWF0aC5QSSAqIHBhcmFtcy5GYykgLyAoMiAqIHBhcmFtcy5GcykpXG4gICAgICBjb2VmZnMud3AyID0gY29lZmZzLndwICogY29lZmZzLndwXG4gICAgICBpZiAocGFyYW1zLkJXKSB7XG4gICAgICAgIGRlbGV0ZSBwYXJhbXMuQldcbiAgICAgIH1cbiAgICAgIGNvZWZmcy5rID0gMVxuICAgICAgY29lZmZzLmEwID0gMyAqIGNvZWZmcy53cCArIDMgKiBjb2VmZnMud3AyICsgMVxuICAgICAgY29lZmZzLmIucHVzaCgzICogY29lZmZzLndwMiAqIHBhcmFtcy5RIC8gY29lZmZzLmEwKVxuICAgICAgY29lZmZzLmIucHVzaCgyICogY29lZmZzLmJbMF0pXG4gICAgICBjb2VmZnMuYi5wdXNoKGNvZWZmcy5iWzBdKVxuICAgICAgY29lZmZzLmEucHVzaCgoNiAqIGNvZWZmcy53cDIgLSAyKSAvIGNvZWZmcy5hMClcbiAgICAgIGNvZWZmcy5hLnB1c2goKDMgKiBjb2VmZnMud3AyIC0gMyAqIGNvZWZmcy53cCArIDEpIC8gY29lZmZzLmEwKVxuICAgICAgcmV0dXJuIGNvZWZmc1xuICAgIH0sXG5cbiAgICBoaWdocGFzc0JUOiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICB2YXIgY29lZmZzID0gaW5pdENvZWZmcygpXG4gICAgICBwYXJhbXMuUSA9IDFcbiAgICAgIGNvZWZmcy53cCA9IE1hdGgudGFuKCgyICogTWF0aC5QSSAqIHBhcmFtcy5GYykgLyAoMiAqIHBhcmFtcy5GcykpXG4gICAgICBjb2VmZnMud3AyID0gY29lZmZzLndwICogY29lZmZzLndwXG4gICAgICBpZiAocGFyYW1zLkJXKSB7XG4gICAgICAgIGRlbGV0ZSBwYXJhbXMuQldcbiAgICAgIH1cbiAgICAgIGNvZWZmcy5rID0gMVxuICAgICAgY29lZmZzLmEwID0gY29lZmZzLndwICsgY29lZmZzLndwMiArIDNcbiAgICAgIGNvZWZmcy5iLnB1c2goMyAqIHBhcmFtcy5RIC8gY29lZmZzLmEwKVxuICAgICAgY29lZmZzLmIucHVzaCgyICogY29lZmZzLmJbMF0pXG4gICAgICBjb2VmZnMuYi5wdXNoKGNvZWZmcy5iWzBdKVxuICAgICAgY29lZmZzLmEucHVzaCgoMiAqIGNvZWZmcy53cDIgLSA2KSAvIGNvZWZmcy5hMClcbiAgICAgIGNvZWZmcy5hLnB1c2goKGNvZWZmcy53cDIgLSBjb2VmZnMud3AgKyAzKSAvIGNvZWZmcy5hMClcbiAgICAgIHJldHVybiBjb2VmZnNcbiAgICB9LFxuXG4gICAgLypcbiAgICAgKiBGb3JtdWxhcyBmcm9tIGh0dHA6Ly93d3cubXVzaWNkc3Aub3JnL2ZpbGVzL0F1ZGlvLUVRLUNvb2tib29rLnR4dFxuICAgICAqL1xuICAgIC8vIEgocykgPSAxIC8gKHNeMiArIHMvUSArIDEpXG4gICAgbG93cGFzczogZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgdmFyIGNvZWZmcyA9IGluaXRDb2VmZnMoKVxuICAgICAgaWYgKHBhcmFtcy5CVykge1xuICAgICAgICBkZWxldGUgcGFyYW1zLkJXXG4gICAgICB9XG4gICAgICB2YXIgcCA9IHByZUNhbGMocGFyYW1zLCBjb2VmZnMpXG4gICAgICBpZiAocGFyYW1zLnByZUdhaW4pIHtcbiAgICAgICAgY29lZmZzLmsgPSAoMSAtIHAuY3cpICogMC41XG4gICAgICAgIGNvZWZmcy5iLnB1c2goMSAvIChwLmEwKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvZWZmcy5rID0gMVxuICAgICAgICBjb2VmZnMuYi5wdXNoKCgxIC0gcC5jdykgLyAoMiAqIHAuYTApKVxuICAgICAgfVxuICAgICAgY29lZmZzLmIucHVzaCgyICogY29lZmZzLmJbMF0pXG4gICAgICBjb2VmZnMuYi5wdXNoKGNvZWZmcy5iWzBdKVxuICAgICAgcmV0dXJuIGNvZWZmc1xuICAgIH0sXG5cbiAgICAvLyBIKHMpID0gc14yIC8gKHNeMiArIHMvUSArIDEpXG4gICAgaGlnaHBhc3M6IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgIHZhciBjb2VmZnMgPSBpbml0Q29lZmZzKClcbiAgICAgIGlmIChwYXJhbXMuQlcpIHtcbiAgICAgICAgZGVsZXRlIHBhcmFtcy5CV1xuICAgICAgfVxuICAgICAgdmFyIHAgPSBwcmVDYWxjKHBhcmFtcywgY29lZmZzKVxuICAgICAgaWYgKHBhcmFtcy5wcmVHYWluKSB7XG4gICAgICAgIGNvZWZmcy5rID0gKDEgKyBwLmN3KSAqIDAuNVxuICAgICAgICBjb2VmZnMuYi5wdXNoKDEgLyAocC5hMCkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2VmZnMuayA9IDFcbiAgICAgICAgY29lZmZzLmIucHVzaCgoMSArIHAuY3cpIC8gKDIgKiBwLmEwKSlcbiAgICAgIH1cbiAgICAgIGNvZWZmcy5iLnB1c2goLTIgKiBjb2VmZnMuYlswXSlcbiAgICAgIGNvZWZmcy5iLnB1c2goY29lZmZzLmJbMF0pXG4gICAgICByZXR1cm4gY29lZmZzXG4gICAgfSxcblxuICAgIC8vIEgocykgPSAoc14yIC0gcy9RICsgMSkgLyAoc14yICsgcy9RICsgMSlcbiAgICBhbGxwYXNzOiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICB2YXIgY29lZmZzID0gaW5pdENvZWZmcygpXG4gICAgICBpZiAocGFyYW1zLkJXKSB7XG4gICAgICAgIGRlbGV0ZSBwYXJhbXMuQldcbiAgICAgIH1cbiAgICAgIHZhciBwID0gcHJlQ2FsYyhwYXJhbXMsIGNvZWZmcylcbiAgICAgIGNvZWZmcy5rID0gMVxuICAgICAgY29lZmZzLmIucHVzaCgoMSAtIHAuYWxwaGEpIC8gcC5hMClcbiAgICAgIGNvZWZmcy5iLnB1c2goLTIgKiBwLmN3IC8gcC5hMClcbiAgICAgIGNvZWZmcy5iLnB1c2goKDEgKyBwLmFscGhhKSAvIHAuYTApXG4gICAgICByZXR1cm4gY29lZmZzXG4gICAgfSxcblxuICAgIC8vIEgocykgPSBzIC8gKHNeMiArIHMvUSArIDEpXG4gICAgYmFuZHBhc3NROiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICB2YXIgY29lZmZzID0gaW5pdENvZWZmcygpXG4gICAgICB2YXIgcCA9IHByZUNhbGMocGFyYW1zLCBjb2VmZnMpXG4gICAgICBjb2VmZnMuayA9IDFcbiAgICAgIGNvZWZmcy5iLnB1c2gocC5hbHBoYSAqIHBhcmFtcy5RIC8gcC5hMClcbiAgICAgIGNvZWZmcy5iLnB1c2goMClcbiAgICAgIGNvZWZmcy5iLnB1c2goLWNvZWZmcy5iWzBdKVxuICAgICAgcmV0dXJuIGNvZWZmc1xuICAgIH0sXG5cbiAgICAvLyBIKHMpID0gKHMvUSkgLyAoc14yICsgcy9RICsgMSlcbiAgICBiYW5kcGFzczogZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgdmFyIGNvZWZmcyA9IGluaXRDb2VmZnMoKVxuICAgICAgdmFyIHAgPSBwcmVDYWxjKHBhcmFtcywgY29lZmZzKVxuICAgICAgY29lZmZzLmsgPSAxXG4gICAgICBjb2VmZnMuYi5wdXNoKHAuYWxwaGEgLyBwLmEwKVxuICAgICAgY29lZmZzLmIucHVzaCgwKVxuICAgICAgY29lZmZzLmIucHVzaCgtY29lZmZzLmJbMF0pXG4gICAgICByZXR1cm4gY29lZmZzXG4gICAgfSxcblxuICAgIC8vIEgocykgPSAoc14yICsgMSkgLyAoc14yICsgcy9RICsgMSlcbiAgICBiYW5kc3RvcDogZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgdmFyIGNvZWZmcyA9IGluaXRDb2VmZnMoKVxuICAgICAgdmFyIHAgPSBwcmVDYWxjKHBhcmFtcywgY29lZmZzKVxuICAgICAgY29lZmZzLmsgPSAxXG4gICAgICBjb2VmZnMuYi5wdXNoKDEgLyBwLmEwKVxuICAgICAgY29lZmZzLmIucHVzaCgtMiAqIHAuY3cgLyBwLmEwKVxuICAgICAgY29lZmZzLmIucHVzaChjb2VmZnMuYlswXSlcbiAgICAgIHJldHVybiBjb2VmZnNcbiAgICB9LFxuXG4gICAgLy8gSChzKSA9IChzXjIgKyBzKihBL1EpICsgMSkgLyAoc14yICsgcy8oQSpRKSArIDEpXG4gICAgcGVhazogZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgdmFyIGNvZWZmcyA9IGluaXRDb2VmZnMoKVxuICAgICAgdmFyIHAgPSBwcmVDYWxjR2FpbihwYXJhbXMpXG4gICAgICBjb2VmZnMuayA9IDFcbiAgICAgIGNvZWZmcy5hMCA9IDEgKyBwLmFscGhhIC8gcC5BXG4gICAgICBjb2VmZnMuYS5wdXNoKC0yICogcC5jdyAvIGNvZWZmcy5hMClcbiAgICAgIGNvZWZmcy5hLnB1c2goKDEgLSBwLmFscGhhIC8gcC5BKSAvIGNvZWZmcy5hMClcbiAgICAgIGNvZWZmcy5iLnB1c2goKDEgKyBwLmFscGhhICogcC5BKSAvIGNvZWZmcy5hMClcbiAgICAgIGNvZWZmcy5iLnB1c2goLTIgKiBwLmN3IC8gY29lZmZzLmEwKVxuICAgICAgY29lZmZzLmIucHVzaCgoMSAtIHAuYWxwaGEgKiBwLkEpIC8gY29lZmZzLmEwKVxuICAgICAgcmV0dXJuIGNvZWZmc1xuICAgIH0sXG5cbiAgICAvLyBIKHMpID0gQSAqIChzXjIgKyAoc3FydChBKS9RKSpzICsgQSkvKEEqc14yICsgKHNxcnQoQSkvUSkqcyArIDEpXG4gICAgbG93c2hlbGY6IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgIHZhciBjb2VmZnMgPSBpbml0Q29lZmZzKClcbiAgICAgIGlmIChwYXJhbXMuQlcpIHtcbiAgICAgICAgZGVsZXRlIHBhcmFtcy5CV1xuICAgICAgfVxuICAgICAgdmFyIHAgPSBwcmVDYWxjR2FpbihwYXJhbXMpXG4gICAgICBjb2VmZnMuayA9IDFcbiAgICAgIHZhciBzYSA9IDIgKiBNYXRoLnNxcnQocC5BKSAqIHAuYWxwaGFcbiAgICAgIGNvZWZmcy5hMCA9IChwLkEgKyAxKSArIChwLkEgLSAxKSAqIHAuY3cgKyBzYVxuICAgICAgY29lZmZzLmEucHVzaCgoLTIgKiAoKHAuQSAtIDEpICsgKHAuQSArIDEpICogcC5jdykpIC8gY29lZmZzLmEwKVxuICAgICAgY29lZmZzLmEucHVzaCgoKHAuQSArIDEpICsgKHAuQSAtIDEpICogcC5jdyAtIHNhKSAvIGNvZWZmcy5hMClcbiAgICAgIGNvZWZmcy5iLnB1c2goKHAuQSAqICgocC5BICsgMSkgLSAocC5BIC0gMSkgKiBwLmN3ICsgc2EpKSAvIGNvZWZmcy5hMClcbiAgICAgIGNvZWZmcy5iLnB1c2goKDIgKiBwLkEgKiAoKHAuQSAtIDEpIC0gKHAuQSArIDEpICogcC5jdykpIC8gY29lZmZzLmEwKVxuICAgICAgY29lZmZzLmIucHVzaCgocC5BICogKChwLkEgKyAxKSAtIChwLkEgLSAxKSAqIHAuY3cgLSBzYSkpIC8gY29lZmZzLmEwKVxuICAgICAgcmV0dXJuIGNvZWZmc1xuICAgIH0sXG5cbiAgICAvLyBIKHMpID0gQSAqIChBKnNeMiArIChzcXJ0KEEpL1EpKnMgKyAxKS8oc14yICsgKHNxcnQoQSkvUSkqcyArIEEpXG4gICAgaGlnaHNoZWxmOiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICB2YXIgY29lZmZzID0gaW5pdENvZWZmcygpXG4gICAgICBpZiAocGFyYW1zLkJXKSB7XG4gICAgICAgIGRlbGV0ZSBwYXJhbXMuQldcbiAgICAgIH1cbiAgICAgIHZhciBwID0gcHJlQ2FsY0dhaW4ocGFyYW1zKVxuICAgICAgY29lZmZzLmsgPSAxXG4gICAgICB2YXIgc2EgPSAyICogTWF0aC5zcXJ0KHAuQSkgKiBwLmFscGhhXG4gICAgICBjb2VmZnMuYTAgPSAocC5BICsgMSkgLSAocC5BIC0gMSkgKiBwLmN3ICsgc2FcbiAgICAgIGNvZWZmcy5hLnB1c2goKDIgKiAoKHAuQSAtIDEpIC0gKHAuQSArIDEpICogcC5jdykpIC8gY29lZmZzLmEwKVxuICAgICAgY29lZmZzLmEucHVzaCgoKHAuQSArIDEpIC0gKHAuQSAtIDEpICogcC5jdyAtIHNhKSAvIGNvZWZmcy5hMClcbiAgICAgIGNvZWZmcy5iLnB1c2goKHAuQSAqICgocC5BICsgMSkgKyAocC5BIC0gMSkgKiBwLmN3ICsgc2EpKSAvIGNvZWZmcy5hMClcbiAgICAgIGNvZWZmcy5iLnB1c2goKC0yICogcC5BICogKChwLkEgLSAxKSArIChwLkEgKyAxKSAqIHAuY3cpKSAvIGNvZWZmcy5hMClcbiAgICAgIGNvZWZmcy5iLnB1c2goKHAuQSAqICgocC5BICsgMSkgKyAocC5BIC0gMSkgKiBwLmN3IC0gc2EpKSAvIGNvZWZmcy5hMClcbiAgICAgIHJldHVybiBjb2VmZnNcbiAgICB9LFxuXG4gICAgLy8gdGFrZW4gZnJvbTogRGVzaWduIG9mIGRpZ2l0YWwgZmlsdGVycyBmb3IgZnJlcXVlbmN5IHdlaWdodGluZ3MgKEEgYW5kIEMpIHJlcXVpcmVkIGZvciByaXNrIGFzc2Vzc21lbnRzIG9mIHdvcmtlcnMgZXhwb3NlZCB0byBub2lzZVxuICAgIC8vIHVzZSBCdXR0ZXJ3b3J0aCBvbmUgc3RhZ2UgSUlSIGZpbHRlciB0byBnZXQgdGhlIHJlc3VsdHMgZnJvbSB0aGUgcGFwZXJcbiAgICBhd2VpZ2h0aW5nOiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICB2YXIgY29lZmZzID0gaW5pdENvZWZmcygpXG4gICAgICBjb2VmZnMuayA9IDFcbiAgICAgIHZhciB3byA9IDIgKiBNYXRoLlBJICogcGFyYW1zLkZjIC8gcGFyYW1zLkZzXG4gICAgICB2YXIgdyA9IDIgKiBNYXRoLnRhbih3byAvIDIpXG4gICAgICB2YXIgUSA9IHBhcmFtcy5RXG4gICAgICB2YXIgd3NxID0gTWF0aC5wb3codywgMilcbiAgICAgIGNvZWZmcy5hMCA9IDQgKiBRICsgd3NxICogUSArIDIgKiB3XG4gICAgICBjb2VmZnMuYS5wdXNoKDIgKiB3c3EgKiBRIC0gOCAqIFEpXG4gICAgICBjb2VmZnMuYS5wdXNoKCg0ICogUSArIHdzcSAqIFEgLSAyICogdykpXG4gICAgICBjb2VmZnMuYi5wdXNoKHdzcSAqIFEpXG4gICAgICBjb2VmZnMuYi5wdXNoKDIgKiB3c3EgKiBRKVxuICAgICAgY29lZmZzLmIucHVzaCh3c3EgKiBRKVxuICAgICAgcmV0dXJuIGNvZWZmc1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzZWxmXG59XG5cbm1vZHVsZS5leHBvcnRzID0gSWlyQ29lZmZzXG4iXX0=
+ +
+ + + + + + diff --git a/coverage/lcov-report/src/iirFilter.js.html b/coverage/lcov-report/src/iirFilter.js.html new file mode 100644 index 0000000..c414063 --- /dev/null +++ b/coverage/lcov-report/src/iirFilter.js.html @@ -0,0 +1,837 @@ + + + + Code coverage report for src/iirFilter.js + + + + + + +
+

Code coverage report for src/iirFilter.js

+

+ Statements: 90.6% (106 / 117)      + Branches: 86.67% (13 / 15)      + Functions: 85.71% (18 / 21)      + Lines: 90.6% (106 / 117)      + Ignored: none      +

+
All files » src/ » iirFilter.js
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265  +  +1 +  +1 +1 +1 +  +  +  +1 +6 +6 +  +  +  +6 +6 +6 +18 +18 +18 +  +  +  +18 +  +  +  +18 +  +  +  +18 +  +  +  +18 +  +  +  +18 +  +  +  +18 +18 +18 +18 +18 +18 +  +  +6 +363618 +363618 +363618 +363618 +363618 +  +  +6 +121206 +121206 +121206 +363618 +  +121206 +  +  +6 +5418 +5418 +  +  +  +5418 +5418 +  +  +  +  +5418 +5418 +5418 +5418 +  +  +  +5418 +  +  +6 +1806 +1806 +  +  +  +1806 +5418 +  +  +5418 +  +5418 +  +1806 +1806 +  +  +6 +18 +18 +54 +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +18 +  +  +6 +18 +18 +  +  +6 +12 +12 +12 +12 +1200 +  +12 +12 +12 +12 +95 +12 +12 +  +  +  +  +95 +12 +12 +  +  +  +12 +  +  +12 +  +  +6 +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6 +  +  +  +  +  +  +  +  +  +6 +  +6 +  +  +6 +  +  +6 +  +  +6 +600 +  +  +  +6 +600 +6 +  +594 +  +  +  +  +6 +  +  +12 +12 +12 +12 +12 +1800 +  +  +  +  +12 +12 +  +  +  +  +  +6 +18 +  +  +  +6 +  +  +1 + 
'use strict';
+ 
+var _require = require('./utils');
+ 
+var complex = _require.complex;
+var runMultiFilter = _require.runMultiFilter;
+var evaluatePhase = _require.evaluatePhase;
+ 
+// params: array of biquad coefficient objects and z registers
+// stage structure e.g. {k:1, a:[1.1, -1.2], b:[0.3, -1.2, -0.4], z:[0, 0]}
+var IirFilter = function IirFilter(filter) {
+  var f = filter;
+  var cone = {
+    re: 1,
+    im: 0
+  };
+  var cf = [];
+  var cc = [];
+  for (var cnt = 0; cnt < f.length; cnt++) {
+    cf[cnt] = {};
+    var s = f[cnt];
+    cf[cnt].b0 = {
+      re: s.b[0],
+      im: 0
+    };
+    cf[cnt].b1 = {
+      re: s.b[1],
+      im: 0
+    };
+    cf[cnt].b2 = {
+      re: s.b[2],
+      im: 0
+    };
+    cf[cnt].a1 = {
+      re: s.a[0],
+      im: 0
+    };
+    cf[cnt].a2 = {
+      re: s.a[1],
+      im: 0
+    };
+    cf[cnt].k = {
+      re: s.k,
+      im: 0
+    };
+    cf[cnt].z = [0, 0];
+    cc[cnt] = {};
+    cc[cnt].b1 = s.b[1] / s.b[0];
+    cc[cnt].b2 = s.b[2] / s.b[0];
+    cc[cnt].a1 = s.a[0];
+    cc[cnt].a2 = s.a[1];
+  }
+ 
+  var runStage = function runStage(s, input) {
+    var temp = input * s.k.re - s.a1.re * s.z[0] - s.a2.re * s.z[1];
+    var out = s.b0.re * temp + s.b1.re * s.z[0] + s.b2.re * s.z[1];
+    s.z[1] = s.z[0];
+    s.z[0] = temp;
+    return out;
+  };
+ 
+  var doStep = function doStep(input, coeffs) {
+    var out = input;
+    var cnt = 0;
+    for (cnt = 0; cnt < coeffs.length; cnt++) {
+      out = runStage(coeffs[cnt], out);
+    }
+    return out;
+  };
+ 
+  var biquadResponse = function biquadResponse(params, s) {
+    var Fs = params.Fs;
+    var Fr = params.Fr;
+    // z = exp(j*omega*pi) = cos(omega*pi) + j*sin(omega*pi)
+    // z^-1 = exp(-j*omega*pi)
+    // omega is between 0 and 1. 1 is the Nyquist frequency.
+    var theta = -Math.PI * (Fr / Fs) * 2;
+    var z = {
+      re: Math.cos(theta),
+      im: Math.sin(theta)
+    };
+    // k * (b0 + b1*z^-1 + b2*z^-2) / (1 + a1*z^⁻1 + a2*z^-2)
+    var p = complex.mul(s.k, complex.add(s.b0, complex.mul(z, complex.add(s.b1, complex.mul(s.b2, z)))));
+    var q = complex.add(cone, complex.mul(z, complex.add(s.a1, complex.mul(s.a2, z))));
+    var h = complex.div(p, q);
+    var res = {
+      magnitude: complex.magnitude(h),
+      phase: complex.phase(h)
+    };
+    return res;
+  };
+ 
+  var calcResponse = function calcResponse(params) {
+    var cnt = 0;
+    var res = {
+      magnitude: 1,
+      phase: 0
+    };
+    for (cnt = 0; cnt < cf.length; cnt++) {
+      var r = biquadResponse(params, cf[cnt]);
+      // a cascade of biquads results in the multiplication of H(z)
+      // H_casc(z) = H_0(z) * H_1(z) * ... * H_n(z)
+      res.magnitude *= r.magnitude;
+      // phase is wrapped -> unwrap before using
+      res.phase += r.phase;
+    }
+    res.dBmagnitude = 20 * Math.log(res.magnitude) * Math.LOG10E;
+    return res;
+  };
+ 
+  var reinit = function reinit() {
+    var tempF = [];
+    for (var cnt = 0; cnt < f.length; cnt++) {
+      tempF[cnt] = {
+        b0: {
+          re: s.b[0],
+          im: 0
+        },
+        b1: {
+          re: s.b[1],
+          im: 0
+        },
+        b2: {
+          re: s.b[2],
+          im: 0
+        },
+        a1: {
+          re: s.a[0],
+          im: 0
+        },
+        a2: {
+          re: s.a[1],
+          im: 0
+        },
+        k: {
+          re: s.k,
+          im: 0
+        },
+        z: [0, 0]
+      };
+    }
+    return tempF;
+  };
+ 
+  var calcInputResponse = function calcInputResponse(input) {
+    var tempF = reinit();
+    return runMultiFilter(input, tempF, doStep);
+  };
+ 
+  var predefinedResponse = function predefinedResponse(def, length) {
+    var ret = {};
+    var input = [];
+    var cnt = 0;
+    for (cnt = 0; cnt < length; cnt++) {
+      input.push(def(cnt));
+    }
+    ret.out = calcInputResponse(input);
+    var maxFound = false;
+    var minFound = false;
+    for (cnt = 0; cnt < length - 1; cnt++) {
+      if (ret.out[cnt] > ret.out[cnt + 1] && !maxFound) {
+        maxFound = true;
+        ret.max = {
+          sample: cnt,
+          value: ret.out[cnt]
+        };
+      }
+      if (maxFound && !minFound && ret.out[cnt] < ret.out[cnt + 1]) {
+        minFound = true;
+        ret.min = {
+          sample: cnt,
+          value: ret.out[cnt]
+        };
+        break;
+      }
+    }
+    return ret;
+  };
+ 
+  var getComplRes = function getComplRes(n1, n2) {
+    var innerSqrt = Math.pow(n1 / 2, 2) - n2;
+    if (innerSqrt < 0) {
+      return [{
+        re: -n1 / 2,
+        im: Math.sqrt(Math.abs(innerSqrt))
+      }, {
+        re: -n1 / 2,
+        im: -Math.sqrt(Math.abs(innerSqrt))
+      }];
+    } else {
+      return [{
+        re: -n1 / 2 + Math.sqrt(innerSqrt),
+        im: 0
+      }, {
+        re: -n1 / 2 - Math.sqrt(innerSqrt),
+        im: 0
+      }];
+    }
+  };
+ 
+  var getPZ = function getPZ() {
+    var res = [];
+    for (var cnt = 0; cnt < cc.length; cnt++) {
+      res[cnt] = {};
+      res[cnt].z = getComplRes(cc[cnt].b1, cc[cnt].b2);
+      res[cnt].p = getComplRes(cc[cnt].a1, cc[cnt].a2);
+    }
+    return res;
+  };
+ 
+  var self = {
+    singleStep: function singleStep(input) {
+      return doStep(input, cf);
+    },
+    multiStep: function multiStep(input, overwrite) {
+      return runMultiFilter(input, cf, doStep, overwrite);
+    },
+    simulate: function simulate(input) {
+      return calcInputResponse(input);
+    },
+    stepResponse: function stepResponse(length) {
+      return predefinedResponse(function () {
+        return 1;
+      }, length);
+    },
+    impulseResponse: function impulseResponse(length) {
+      return predefinedResponse(function (val) {
+        if (val === 0) {
+          return 1;
+        } else {
+          return 0;
+        }
+      }, length);
+    },
+    responsePoint: function responsePoint(params) {
+      return calcResponse(params);
+    },
+    response: function response(resolution) {
+      resolution = resolution || 100;
+      var res = [];
+      var cnt = 0;
+      var r = resolution * 2;
+      for (cnt = 0; cnt < resolution; cnt++) {
+        res[cnt] = calcResponse({
+          Fs: r,
+          Fr: cnt
+        });
+      }
+      evaluatePhase(res);
+      return res;
+    },
+    polesZeros: function polesZeros() {
+      return getPZ();
+    },
+    reinit: function reinit() {
+      for (cnt = 0; cnt < cf.length; cnt++) {
+        cf[cnt].z = [0, 0];
+      }
+    }
+  };
+  return self;
+};
+ 
+module.exports = IirFilter;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL2Rhbm8vZmlsaS5qcy9zcmMvaWlyRmlsdGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQTs7ZUFNUixPQUFPLENBQUMsU0FBUyxDQUFDOztJQUhwQixPQUFPLFlBQVAsT0FBTztJQUNQLGNBQWMsWUFBZCxjQUFjO0lBQ2QsYUFBYSxZQUFiLGFBQWE7Ozs7QUFLZixJQUFJLFNBQVMsR0FBRyxTQUFaLFNBQVMsQ0FBYSxNQUFNLEVBQUU7QUFDaEMsTUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFBO0FBQ2QsTUFBSSxJQUFJLEdBQUc7QUFDVCxNQUFFLEVBQUUsQ0FBQztBQUNMLE1BQUUsRUFBRSxDQUFDO0dBQ04sQ0FBQTtBQUNELE1BQUksRUFBRSxHQUFHLEVBQUUsQ0FBQTtBQUNYLE1BQUksRUFBRSxHQUFHLEVBQUUsQ0FBQTtBQUNYLE9BQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO0FBQ3ZDLE1BQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUE7QUFDWixRQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDZCxNQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHO0FBQ1gsUUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1YsUUFBRSxFQUFFLENBQUM7S0FDTixDQUFBO0FBQ0QsTUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRztBQUNYLFFBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNWLFFBQUUsRUFBRSxDQUFDO0tBQ04sQ0FBQTtBQUNELE1BQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUc7QUFDWCxRQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDVixRQUFFLEVBQUUsQ0FBQztLQUNOLENBQUE7QUFDRCxNQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHO0FBQ1gsUUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1YsUUFBRSxFQUFFLENBQUM7S0FDTixDQUFBO0FBQ0QsTUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRztBQUNYLFFBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNWLFFBQUUsRUFBRSxDQUFDO0tBQ04sQ0FBQTtBQUNELE1BQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUc7QUFDVixRQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDUCxRQUFFLEVBQUUsQ0FBQztLQUNOLENBQUE7QUFDRCxNQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQ2xCLE1BQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUE7QUFDWixNQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUM1QixNQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUM1QixNQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbkIsTUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0dBQ3BCOztBQUVELE1BQUksUUFBUSxHQUFHLFNBQVgsUUFBUSxDQUFhLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDakMsUUFBSSxJQUFJ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RSxHQUFHLEVBQUUsRUFBRTtBQUNyQyxXQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsWUFBWSxDQUFDO0FBQ3RCLFlBQUUsRUFBRSxDQUFDO0FBQ0wsWUFBRSxFQUFFLEdBQUc7U0FDUixDQUFDLENBQUE7T0FDSDtBQUNELG1CQUFhLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDbEIsYUFBTyxHQUFHLENBQUE7S0FDWDtBQUNELGNBQVUsRUFBRSxzQkFBWTtBQUN0QixhQUFPLEtBQUssRUFBRSxDQUFBO0tBQ2Y7QUFDRCxVQUFNLEVBQUUsa0JBQVk7QUFDbEIsV0FBSyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO0FBQ3BDLFVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7T0FDbkI7S0FDRjtHQUNGLENBQUE7QUFDRCxTQUFPLElBQUksQ0FBQTtDQUNaLENBQUE7O0FBRUQsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUEiLCJmaWxlIjoiL2hvbWUvZGFuby9maWxpLmpzL3NyYy9paXJGaWx0ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxudmFyIHtcbiAgY29tcGxleCxcbiAgcnVuTXVsdGlGaWx0ZXIsXG4gIGV2YWx1YXRlUGhhc2Vcbn0gPSByZXF1aXJlKCcuL3V0aWxzJylcblxuLy8gcGFyYW1zOiBhcnJheSBvZiBiaXF1YWQgY29lZmZpY2llbnQgb2JqZWN0cyBhbmQgeiByZWdpc3RlcnNcbi8vIHN0YWdlIHN0cnVjdHVyZSBlLmcuIHtrOjEsIGE6WzEuMSwgLTEuMl0sIGI6WzAuMywgLTEuMiwgLTAuNF0sIHo6WzAsIDBdfVxudmFyIElpckZpbHRlciA9IGZ1bmN0aW9uIChmaWx0ZXIpIHtcbiAgdmFyIGYgPSBmaWx0ZXJcbiAgdmFyIGNvbmUgPSB7XG4gICAgcmU6IDEsXG4gICAgaW06IDBcbiAgfVxuICB2YXIgY2YgPSBbXVxuICB2YXIgY2MgPSBbXVxuICBmb3IgKHZhciBjbnQgPSAwOyBjbnQgPCBmLmxlbmd0aDsgY250KyspIHtcbiAgICBjZltjbnRdID0ge31cbiAgICB2YXIgcyA9IGZbY250XVxuICAgIGNmW2NudF0uYjAgPSB7XG4gICAgICByZTogcy5iWzBdLFxuICAgICAgaW06IDBcbiAgICB9XG4gICAgY2ZbY250XS5iMSA9IHtcbiAgICAgIHJlOiBzLmJbMV0sXG4gICAgICBpbTogMFxuICAgIH1cbiAgICBjZltjbnRdLmIyID0ge1xuICAgICAgcmU6IHMuYlsyXSxcbiAgICAgIGltOiAwXG4gICAgfVxuICAgIGNmW2NudF0uYTEgPSB7XG4gICAgICByZTogcy5hWzBdLFxuICAgICAgaW06IDBcbiAgICB9XG4gICAgY2ZbY250XS5hMiA9IHtcbiAgICAgIHJlOiBzLmFbMV0sXG4gICAgICBpbTogMFxuICAgIH1cbiAgICBjZltjbnRdLmsgPSB7XG4gICAgICByZTogcy5rLFxuICAgICAgaW06IDBcbiAgICB9XG4gICAgY2ZbY250XS56ID0gWzAsIDBdXG4gICAgY2NbY250XSA9IHt9XG4gICAgY2NbY250XS5iMSA9IHMuYlsxXSAvIHMuYlswXVxuICAgIGNjW2NudF0uYjIgPSBzLmJbMl0gLyBzLmJbMF1cbiAgICBjY1tjbnRdLmExID0gcy5hWzBdXG4gICAgY2NbY250XS5hMiA9IHMuYVsxXVxuICB9XG5cbiAgdmFyIHJ1blN0YWdlID0gZnVuY3Rpb24gKHMsIGlucHV0KSB7XG4gICAgdmFyIHRlbXAgPSBpbnB1dCAqIHMuay5yZSAtIHMuYTEucmUgKiBzLnpbMF0gLSBzLmEyLnJlICogcy56WzFdXG4gICAgdmFyIG91dCA9IHMuYjAucmUgKiB0ZW1wICsgcy5iMS5yZSAqIHMuelswXSArIHMuYjIucmUgKiBzLnpbMV1cbiAgICBzLnpbMV0gPSBzLnpbMF1cbiAgICBzLnpbMF0gPSB0ZW1wXG4gICAgcmV0dXJuIG91dFxuICB9XG5cbiAgdmFyIGRvU3RlcCA9IGZ1bmN0aW9uIChpbnB1dCwgY29lZmZzKSB7XG4gICAgdmFyIG91dCA9IGlucHV0XG4gICAgdmFyIGNudCA9IDBcbiAgICBmb3IgKGNudCA9IDA7IGNudCA8IGNvZWZmcy5sZW5ndGg7IGNudCsrKSB7XG4gICAgICBvdXQgPSBydW5TdGFnZShjb2VmZnNbY250XSwgb3V0KVxuICAgIH1cbiAgICByZXR1cm4gb3V0XG4gIH1cblxuICB2YXIgYmlxdWFkUmVzcG9uc2UgPSBmdW5jdGlvbiAocGFyYW1zLCBzKSB7XG4gICAgdmFyIEZzID0gcGFyYW1zLkZzXG4gICAgdmFyIEZyID0gcGFyYW1zLkZyXG4gICAgLy8geiA9IGV4cChqKm9tZWdhKnBpKSA9IGNvcyhvbWVnYSpwaSkgKyBqKnNpbihvbWVnYSpwaSlcbiAgICAvLyB6Xi0xID0gZXhwKC1qKm9tZWdhKnBpKVxuICAgIC8vIG9tZWdhIGlzIGJldHdlZW4gMCBhbmQgMS4gMSBpcyB0aGUgTnlxdWlzdCBmcmVxdWVuY3kuXG4gICAgdmFyIHRoZXRhID0gLU1hdGguUEkgKiAoRnIgLyBGcykgKiAyXG4gICAgdmFyIHogPSB7XG4gICAgICByZTogTWF0aC5jb3ModGhldGEpLFxuICAgICAgaW06IE1hdGguc2luKHRoZXRhKVxuICAgIH1cbiAgICAvLyBrICogKGIwICsgYjEqel4tMSArIGIyKnpeLTIpIC8gKDEgKyBhMSp6XuKBuzEgKyBhMip6Xi0yKVxuICAgIHZhciBwID0gY29tcGxleC5tdWwocy5rLCBjb21wbGV4LmFkZChzLmIwLCBjb21wbGV4Lm11bCh6LCBjb21wbGV4LmFkZChzLmIxLCBjb21wbGV4Lm11bChzLmIyLCB6KSkpKSlcbiAgICB2YXIgcSA9IGNvbXBsZXguYWRkKGNvbmUsIGNvbXBsZXgubXVsKHosIGNvbXBsZXguYWRkKHMuYTEsIGNvbXBsZXgubXVsKHMuYTIsIHopKSkpXG4gICAgdmFyIGggPSBjb21wbGV4LmRpdihwLCBxKVxuICAgIHZhciByZXMgPSB7XG4gICAgICBtYWduaXR1ZGU6IGNvbXBsZXgubWFnbml0dWRlKGgpLFxuICAgICAgcGhhc2U6IGNvbXBsZXgucGhhc2UoaClcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xuICB9XG5cbiAgdmFyIGNhbGNSZXNwb25zZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICB2YXIgY250ID0gMFxuICAgIHZhciByZXMgPSB7XG4gICAgICBtYWduaXR1ZGU6IDEsXG4gICAgICBwaGFzZTogMFxuICAgIH1cbiAgICBmb3IgKGNudCA9IDA7IGNudCA8IGNmLmxlbmd0aDsgY250KyspIHtcbiAgICAgIHZhciByID0gYmlxdWFkUmVzcG9uc2UocGFyYW1zLCBjZltjbnRdKVxuICAgICAgLy8gYSBjYXNjYWRlIG9mIGJpcXVhZHMgcmVzdWx0cyBpbiB0aGUgbXVsdGlwbGljYXRpb24gb2YgSCh6KVxuICAgICAgLy8gSF9jYXNjKHopID0gSF8wKHopICogSF8xKHopICogLi4uICogSF9uKHopXG4gICAgICByZXMubWFnbml0dWRlICo9IHIubWFnbml0dWRlXG4gICAgICAvLyBwaGFzZSBpcyB3cmFwcGVkIC0+IHVud3JhcCBiZWZvcmUgdXNpbmdcbiAgICAgIHJlcy5waGFzZSArPSByLnBoYXNlXG4gICAgfVxuICAgIHJlcy5kQm1hZ25pdHVkZSA9IDIwICogTWF0aC5sb2cocmVzLm1hZ25pdHVkZSkgKiBNYXRoLkxPRzEwRVxuICAgIHJldHVybiByZXNcbiAgfVxuXG4gIHZhciByZWluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRlbXBGID0gW11cbiAgICBmb3IgKHZhciBjbnQgPSAwOyBjbnQgPCBmLmxlbmd0aDsgY250KyspIHtcbiAgICAgIHRlbXBGW2NudF0gPSB7XG4gICAgICAgIGIwOiB7XG4gICAgICAgICAgcmU6IHMuYlswXSxcbiAgICAgICAgICBpbTogMFxuICAgICAgICB9LFxuICAgICAgICBiMToge1xuICAgICAgICAgIHJlOiBzLmJbMV0sXG4gICAgICAgICAgaW06IDBcbiAgICAgICAgfSxcbiAgICAgICAgYjI6IHtcbiAgICAgICAgICByZTogcy5iWzJdLFxuICAgICAgICAgIGltOiAwXG4gICAgICAgIH0sXG4gICAgICAgIGExOiB7XG4gICAgICAgICAgcmU6IHMuYVswXSxcbiAgICAgICAgICBpbTogMFxuICAgICAgICB9LFxuICAgICAgICBhMjoge1xuICAgICAgICAgIHJlOiBzLmFbMV0sXG4gICAgICAgICAgaW06IDBcbiAgICAgICAgfSxcbiAgICAgICAgazoge1xuICAgICAgICAgIHJlOiBzLmssXG4gICAgICAgICAgaW06IDBcbiAgICAgICAgfSxcbiAgICAgICAgejogWzAsIDBdXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZW1wRlxuICB9XG5cbiAgdmFyIGNhbGNJbnB1dFJlc3BvbnNlID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgdmFyIHRlbXBGID0gcmVpbml0KClcbiAgICByZXR1cm4gcnVuTXVsdGlGaWx0ZXIoaW5wdXQsIHRlbXBGLCBkb1N0ZXApXG4gIH1cblxuICB2YXIgcHJlZGVmaW5lZFJlc3BvbnNlID0gZnVuY3Rpb24gKGRlZiwgbGVuZ3RoKSB7XG4gICAgdmFyIHJldCA9IHt9XG4gICAgdmFyIGlucHV0ID0gW11cbiAgICB2YXIgY250ID0gMFxuICAgIGZvciAoY250ID0gMDsgY250IDwgbGVuZ3RoOyBjbnQrKykge1xuICAgICAgaW5wdXQucHVzaChkZWYoY250KSlcbiAgICB9XG4gICAgcmV0Lm91dCA9IGNhbGNJbnB1dFJlc3BvbnNlKGlucHV0KVxuICAgIHZhciBtYXhGb3VuZCA9IGZhbHNlXG4gICAgdmFyIG1pbkZvdW5kID0gZmFsc2VcbiAgICBmb3IgKGNudCA9IDA7IGNudCA8IGxlbmd0aCAtIDE7IGNudCsrKSB7XG4gICAgICBpZiAocmV0Lm91dFtjbnRdID4gcmV0Lm91dFtjbnQgKyAxXSAmJiAhbWF4Rm91bmQpIHtcbiAgICAgICAgbWF4Rm91bmQgPSB0cnVlXG4gICAgICAgIHJldC5tYXggPSB7XG4gICAgICAgICAgc2FtcGxlOiBjbnQsXG4gICAgICAgICAgdmFsdWU6IHJldC5vdXRbY250XVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobWF4Rm91bmQgJiYgIW1pbkZvdW5kICYmIHJldC5vdXRbY250XSA8IHJldC5vdXRbY250ICsgMV0pIHtcbiAgICAgICAgbWluRm91bmQgPSB0cnVlXG4gICAgICAgIHJldC5taW4gPSB7XG4gICAgICAgICAgc2FtcGxlOiBjbnQsXG4gICAgICAgICAgdmFsdWU6IHJldC5vdXRbY250XVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIHZhciBnZXRDb21wbFJlcyA9IGZ1bmN0aW9uIChuMSwgbjIpIHtcbiAgICB2YXIgaW5uZXJTcXJ0ID0gTWF0aC5wb3cobjEgLyAyLCAyKSAtIG4yXG4gICAgaWYgKGlubmVyU3FydCA8IDApIHtcbiAgICAgIHJldHVybiBbe1xuICAgICAgICByZTogLW4xIC8gMixcbiAgICAgICAgaW06IE1hdGguc3FydChNYXRoLmFicyhpbm5lclNxcnQpKVxuICAgICAgfSwge1xuICAgICAgICByZTogLW4xIC8gMixcbiAgICAgICAgaW06IC1NYXRoLnNxcnQoTWF0aC5hYnMoaW5uZXJTcXJ0KSlcbiAgICAgIH1dXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbe1xuICAgICAgICByZTogLW4xIC8gMiArIE1hdGguc3FydChpbm5lclNxcnQpLFxuICAgICAgICBpbTogMFxuICAgICAgfSwge1xuICAgICAgICByZTogLW4xIC8gMiAtIE1hdGguc3FydChpbm5lclNxcnQpLFxuICAgICAgICBpbTogMFxuICAgICAgfV1cbiAgICB9XG4gIH1cblxuICB2YXIgZ2V0UFogPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlcyA9IFtdXG4gICAgZm9yICh2YXIgY250ID0gMDsgY250IDwgY2MubGVuZ3RoOyBjbnQrKykge1xuICAgICAgcmVzW2NudF0gPSB7fVxuICAgICAgcmVzW2NudF0ueiA9IGdldENvbXBsUmVzKGNjW2NudF0uYjEsIGNjW2NudF0uYjIpXG4gICAgICByZXNbY250XS5wID0gZ2V0Q29tcGxSZXMoY2NbY250XS5hMSwgY2NbY250XS5hMilcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xuICB9XG5cbiAgdmFyIHNlbGYgPSB7XG4gICAgc2luZ2xlU3RlcDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICByZXR1cm4gZG9TdGVwKGlucHV0LCBjZilcbiAgICB9LFxuICAgIG11bHRpU3RlcDogZnVuY3Rpb24gKGlucHV0LCBvdmVyd3JpdGUpIHtcbiAgICAgIHJldHVybiBydW5NdWx0aUZpbHRlcihpbnB1dCwgY2YsIGRvU3RlcCwgb3ZlcndyaXRlKVxuICAgIH0sXG4gICAgc2ltdWxhdGU6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgcmV0dXJuIGNhbGNJbnB1dFJlc3BvbnNlKGlucHV0KVxuICAgIH0sXG4gICAgc3RlcFJlc3BvbnNlOiBmdW5jdGlvbiAobGVuZ3RoKSB7XG4gICAgICByZXR1cm4gcHJlZGVmaW5lZFJlc3BvbnNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH0sIGxlbmd0aClcbiAgICB9LFxuICAgIGltcHVsc2VSZXNwb25zZTogZnVuY3Rpb24gKGxlbmd0aCkge1xuICAgICAgcmV0dXJuIHByZWRlZmluZWRSZXNwb25zZShmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIGlmICh2YWwgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH1cbiAgICAgIH0sIGxlbmd0aClcbiAgICB9LFxuICAgIHJlc3BvbnNlUG9pbnQ6IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgIHJldHVybiBjYWxjUmVzcG9uc2UocGFyYW1zKVxuICAgIH0sXG4gICAgcmVzcG9uc2U6IGZ1bmN0aW9uIChyZXNvbHV0aW9uKSB7XG4gICAgICByZXNvbHV0aW9uID0gcmVzb2x1dGlvbiB8fCAxMDBcbiAgICAgIHZhciByZXMgPSBbXVxuICAgICAgdmFyIGNudCA9IDBcbiAgICAgIHZhciByID0gcmVzb2x1dGlvbiAqIDJcbiAgICAgIGZvciAoY250ID0gMDsgY250IDwgcmVzb2x1dGlvbjsgY250KyspIHtcbiAgICAgICAgcmVzW2NudF0gPSBjYWxjUmVzcG9uc2Uoe1xuICAgICAgICAgIEZzOiByLFxuICAgICAgICAgIEZyOiBjbnRcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGV2YWx1YXRlUGhhc2UocmVzKVxuICAgICAgcmV0dXJuIHJlc1xuICAgIH0sXG4gICAgcG9sZXNaZXJvczogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldFBaKClcbiAgICB9LFxuICAgIHJlaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBjZi5sZW5ndGg7IGNudCsrKSB7XG4gICAgICAgIGNmW2NudF0ueiA9IFswLCAwXVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc2VsZlxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IElpckZpbHRlclxuIl19
+ +
+ + + + + + diff --git a/coverage/lcov-report/src/index.html b/coverage/lcov-report/src/index.html new file mode 100644 index 0000000..45d6e96 --- /dev/null +++ b/coverage/lcov-report/src/index.html @@ -0,0 +1,151 @@ + + + + Code coverage report for src/ + + + + + + +
+

Code coverage report for src/

+

+ Statements: 90.24% (712 / 789)      + Branches: 70.59% (84 / 119)      + Functions: 87.97% (117 / 133)      + Lines: 90.36% (712 / 788)      + Ignored: none      +

+
All files » src/
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
calcCascades.js90.91%(40 / 44)87.5%(21 / 24)100%(5 / 5)90.91%(40 / 44)
fft.js100%(204 / 204)100%(18 / 18)100%(48 / 48)100%(204 / 204)
firCoeffs.js96.1%(74 / 77)58.33%(7 / 12)100%(12 / 12)96.1%(74 / 77)
firFilter.js98.11%(52 / 53)50%(1 / 2)90.91%(10 / 11)98.11%(52 / 53)
iirCoeffs.js89.18%(173 / 194)54.17%(13 / 24)94.44%(17 / 18)89.18%(173 / 194)
iirFilter.js90.6%(106 / 117)86.67%(13 / 15)85.71%(18 / 21)90.6%(106 / 117)
utils.js63%(63 / 100)45.83%(11 / 24)38.89%(7 / 18)63.64%(63 / 99)
+
+
+ + + + + + diff --git a/coverage/lcov-report/src/utils.js.html b/coverage/lcov-report/src/utils.js.html new file mode 100644 index 0000000..a7f0f04 --- /dev/null +++ b/coverage/lcov-report/src/utils.js.html @@ -0,0 +1,618 @@ + + + + Code coverage report for src/utils.js + + + + + + +
+

Code coverage report for src/utils.js

+

+ Statements: 63% (63 / 100)      + Branches: 45.83% (11 / 24)      + Functions: 38.89% (7 / 18)      + Lines: 63.64% (63 / 99)      + Ignored: none      +

+
All files » src/ » utils.js
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192  +  +  +  +  +1 +17 +17 +17 +17 +17 +17 +2800 +  +17 +17 +  +17 +2783 +2783 +165 +15337 +  +2618 +18 +2021 +  +  +2783 +2456 +  +327 +  +  +2783 +2783 +2783 +381 +  +  +17 +13 +13 +  +4 +4 +4 +4 +  +  +  +  +  +  +1 +34 +34 +  +  +34 +34 +221200 +  +34 +  +  +1 +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1 +  +  +  +  +  +  +  +  +  +1 +  +  +  +  +  +  +  +  +  +  +  +1 +  +  +  +1 +  +  +  +  +  +  +  +  +  +  +  +1 +  +  +  +  +  +  +  +  +  +  +  +  +1 +  +  +5418 +5418 +5418 +5418 +5418 +5418 +  +  +  +5418 +  +  +127090 +127090 +127090 +127090 +127090 +  +  +  +127090 +  +  +121672 +  +  +  +121672 +  +  +  +  +  +  +  +  +  +6418 +  +  +6418 +  +  + 
'use strict';
+ 
+/**
+ * Evaluate phase
+ */
+exports.evaluatePhase = function (res) {
+  var xcnt = 0;
+  var cnt = 0;
+  var pi = Math.PI;
+  var tpi = 2 * pi;
+  var phase = [];
+  for (cnt = 0; cnt < res.length; cnt++) {
+    phase.push(res[cnt].phase);
+  }
+  res[0].unwrappedPhase = res[0].phase;
+  res[0].groupDelay = 0;
+  // TODO: more sophisticated phase unwrapping needed
+  for (cnt = 1; cnt < phase.length; cnt++) {
+    var diff = phase[cnt] - phase[cnt - 1];
+    if (diff > pi) {
+      for (xcnt = cnt; xcnt < phase.length; xcnt++) {
+        phase[xcnt] -= tpi;
+      }
+    } else if (diff < -pi) {
+      for (xcnt = cnt; xcnt < phase.length; xcnt++) {
+        phase[xcnt] += tpi;
+      }
+    }
+    if (phase[cnt] < 0) {
+      res[cnt].unwrappedPhase = -phase[cnt];
+    } else {
+      res[cnt].unwrappedPhase = phase[cnt];
+    }
+ 
+    res[cnt].phaseDelay = res[cnt].unwrappedPhase / (cnt / res.length);
+    res[cnt].groupDelay = (res[cnt].unwrappedPhase - res[cnt - 1].unwrappedPhase) / (pi / res.length);
+    if (res[cnt].groupDelay < 0) {
+      res[cnt].groupDelay = -res[cnt].groupDelay;
+    }
+  }
+  if (res[0].magnitude !== 0) {
+    res[0].phaseDelay = res[1].phaseDelay;
+    res[0].groupDelay = res[1].groupDelay;
+  } else {
+    res[0].phaseDelay = res[2].phaseDelay;
+    res[0].groupDelay = res[2].groupDelay;
+    res[1].phaseDelay = res[2].phaseDelay;
+    res[1].groupDelay = res[2].groupDelay;
+  }
+};
+ 
+/**
+ * Run multi filter
+ */
+exports.runMultiFilter = function (input, d, doStep, overwrite) {
+  var out = [];
+  Iif (overwrite) {
+    out = input;
+  }
+  var i;
+  for (i = 0; i < input.length; i++) {
+    out[i] = doStep(input[i], d);
+  }
+  return out;
+};
+ 
+var factorial = function factorial(_x, _x2) {
+  var _again = true;
+ 
+  _function: while (_again) {
+    var n = _x,
+        a = _x2;
+    _again = false;
+ 
+    if (!a) {
+      a = 1;
+    }
+    if (n !== Math.floor(n) || a !== Math.floor(a)) {
+      return 1;
+    }
+    if (n === 0 || n === 1) {
+      return a;
+    } else {
+      _x = n - 1;
+      _x2 = a * n;
+      _again = true;
+      continue _function;
+    }
+  }
+};
+ 
+/**
+ * Bessel factors
+ */
+exports.besselFactors = function (n) {
+  var res = [];
+  for (var k = 0; k < n + 1; k++) {
+    var p = factorial(2 * n - k);
+    var q = Math.pow(2, n - k) * factorial(k) * factorial(n - k);
+    res.unshift(Math.floor(p / q));
+  }
+  return res;
+};
+ 
+var fractionToFp = function fractionToFp(fraction, fractionBits) {
+  var fpFraction = 0;
+  for (var cnt = 0; cnt < fractionBits; cnt++) {
+    var bitVal = 1 / Math.pow(2, cnt + 1);
+    if (fraction > bitVal) {
+      fraction -= bitVal;
+      fpFraction += bitVal;
+    }
+  }
+  return fpFraction;
+};
+ 
+var numberToFp = function numberToFp(number, numberBits) {
+  return number & Math.pow(2, numberBits);
+};
+ 
+var valueToFp = function valueToFp(value, numberBits, fractionBits) {
+  var number = Math.abs(value);
+  var fraction = value - number;
+  var fpNumber = {
+    number: numberToFp(number, numberBits).toString(),
+    fraction: fractionToFp(fraction, fractionBits).toString(),
+    numberBits: numberBits,
+    fractionBits: fractionBits
+  };
+  return fpNumber;
+};
+ 
+exports.fixedPoint = {
+  convert: function convert(value, numberBits, fractionBits) {
+    return valueToFp(value, numberBits, fractionBits);
+  },
+  add: function add(fpVal1, fpVal2) {},
+  sub: function sub(fpVal1, fpVal2) {},
+  mul: function mul(fpVal1, fpVal2) {},
+  div: function div(fpVal1, fpVal2) {}
+};
+ 
+/**
+ * Complex
+ */
+exports.complex = {
+ 
+  div: function div(p, q) {
+    var a = p.re;
+    var b = p.im;
+    var c = q.re;
+    var d = q.im;
+    var n = c * c + d * d;
+    var x = {
+      re: (a * c + b * d) / n,
+      im: (b * c - a * d) / n
+    };
+    return x;
+  },
+  mul: function mul(p, q) {
+    var a = p.re;
+    var b = p.im;
+    var c = q.re;
+    var d = q.im;
+    var x = {
+      re: a * c - b * d,
+      im: (a + b) * (c + d) - a * c - b * d
+    };
+    return x;
+  },
+  add: function add(p, q) {
+    var x = {
+      re: p.re + q.re,
+      im: p.im + q.im
+    };
+    return x;
+  },
+  sub: function sub(p, q) {
+    var x = {
+      re: p.re - q.re,
+      im: p.im - q.im
+    };
+    return x;
+  },
+  phase: function phase(n) {
+    return Math.atan2(n.im, n.re);
+  },
+  magnitude: function magnitude(n) {
+    return Math.sqrt(n.re * n.re + n.im * n.im);
+  }
+};
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL2Rhbm8vZmlsaS5qcy9zcmMvdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFBOzs7OztBQUtaLE9BQU8sQ0FBQyxhQUFhLEdBQUcsVUFBVSxHQUFHLEVBQUU7QUFDckMsTUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFBO0FBQ1osTUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFBO0FBQ1gsTUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQTtBQUNoQixNQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFBO0FBQ2hCLE1BQUksS0FBSyxHQUFHLEVBQUUsQ0FBQTtBQUNkLE9BQUssR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRTtBQUNyQyxTQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtHQUMzQjtBQUNELEtBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtBQUNwQyxLQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQTs7QUFFckIsT0FBSyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO0FBQ3ZDLFFBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBQ3RDLFFBQUksSUFBSSxHQUFHLEVBQUUsRUFBRTtBQUNiLFdBQUssSUFBSSxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRTtBQUM1QyxhQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFBO09BQ25CO0tB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cy9zcmMvdXRpbHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxuLyoqXG4gKiBFdmFsdWF0ZSBwaGFzZVxuICovXG5leHBvcnRzLmV2YWx1YXRlUGhhc2UgPSBmdW5jdGlvbiAocmVzKSB7XG4gIHZhciB4Y250ID0gMFxuICB2YXIgY250ID0gMFxuICB2YXIgcGkgPSBNYXRoLlBJXG4gIHZhciB0cGkgPSAyICogcGlcbiAgdmFyIHBoYXNlID0gW11cbiAgZm9yIChjbnQgPSAwOyBjbnQgPCByZXMubGVuZ3RoOyBjbnQrKykge1xuICAgIHBoYXNlLnB1c2gocmVzW2NudF0ucGhhc2UpXG4gIH1cbiAgcmVzWzBdLnVud3JhcHBlZFBoYXNlID0gcmVzWzBdLnBoYXNlXG4gIHJlc1swXS5ncm91cERlbGF5ID0gMFxuICAvLyBUT0RPOiBtb3JlIHNvcGhpc3RpY2F0ZWQgcGhhc2UgdW53cmFwcGluZyBuZWVkZWRcbiAgZm9yIChjbnQgPSAxOyBjbnQgPCBwaGFzZS5sZW5ndGg7IGNudCsrKSB7XG4gICAgdmFyIGRpZmYgPSBwaGFzZVtjbnRdIC0gcGhhc2VbY250IC0gMV1cbiAgICBpZiAoZGlmZiA+IHBpKSB7XG4gICAgICBmb3IgKHhjbnQgPSBjbnQ7IHhjbnQgPCBwaGFzZS5sZW5ndGg7IHhjbnQrKykge1xuICAgICAgICBwaGFzZVt4Y250XSAtPSB0cGlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRpZmYgPCAtcGkpIHtcbiAgICAgIGZvciAoeGNudCA9IGNudDsgeGNudCA8IHBoYXNlLmxlbmd0aDsgeGNudCsrKSB7XG4gICAgICAgIHBoYXNlW3hjbnRdICs9IHRwaVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGhhc2VbY250XSA8IDApIHtcbiAgICAgIHJlc1tjbnRdLnVud3JhcHBlZFBoYXNlID0gLXBoYXNlW2NudF1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzW2NudF0udW53cmFwcGVkUGhhc2UgPSBwaGFzZVtjbnRdXG4gICAgfVxuXG4gICAgcmVzW2NudF0ucGhhc2VEZWxheSA9IHJlc1tjbnRdLnVud3JhcHBlZFBoYXNlIC8gKGNudCAvIHJlcy5sZW5ndGgpXG4gICAgcmVzW2NudF0uZ3JvdXBEZWxheSA9IChyZXNbY250XS51bndyYXBwZWRQaGFzZSAtIHJlc1tjbnQgLSAxXS51bndyYXBwZWRQaGFzZSkgLyAocGkgLyByZXMubGVuZ3RoKVxuICAgIGlmIChyZXNbY250XS5ncm91cERlbGF5IDwgMCkge1xuICAgICAgcmVzW2NudF0uZ3JvdXBEZWxheSA9IC1yZXNbY250XS5ncm91cERlbGF5XG4gICAgfVxuICB9XG4gIGlmIChyZXNbMF0ubWFnbml0dWRlICE9PSAwKSB7XG4gICAgcmVzWzBdLnBoYXNlRGVsYXkgPSByZXNbMV0ucGhhc2VEZWxheVxuICAgIHJlc1swXS5ncm91cERlbGF5ID0gcmVzWzFdLmdyb3VwRGVsYXlcbiAgfSBlbHNlIHtcbiAgICByZXNbMF0ucGhhc2VEZWxheSA9IHJlc1syXS5waGFzZURlbGF5XG4gICAgcmVzWzBdLmdyb3VwRGVsYXkgPSByZXNbMl0uZ3JvdXBEZWxheVxuICAgIHJlc1sxXS5waGFzZURlbGF5ID0gcmVzWzJdLnBoYXNlRGVsYXlcbiAgICByZXNbMV0uZ3JvdXBEZWxheSA9IHJlc1syXS5ncm91cERlbGF5XG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gbXVsdGkgZmlsdGVyXG4gKi9cbmV4cG9ydHMucnVuTXVsdGlGaWx0ZXIgPSBmdW5jdGlvbiAoaW5wdXQsIGQsIGRvU3RlcCwgb3ZlcndyaXRlKSB7XG4gIHZhciBvdXQgPSBbXVxuICBpZiAob3ZlcndyaXRlKSB7XG4gICAgb3V0ID0gaW5wdXRcbiAgfVxuICB2YXIgaVxuICBmb3IgKGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICBvdXRbaV0gPSBkb1N0ZXAoaW5wdXRbaV0sIGQpXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG52YXIgZmFjdG9yaWFsID0gZnVuY3Rpb24gKG4sIGEpIHtcbiAgaWYgKCFhKSB7XG4gICAgYSA9IDFcbiAgfVxuICBpZiAobiAhPT0gTWF0aC5mbG9vcihuKSB8fCBhICE9PSBNYXRoLmZsb29yKGEpKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuICBpZiAobiA9PT0gMCB8fCBuID09PSAxKSB7XG4gICAgcmV0dXJuIGFcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFjdG9yaWFsKG4gLSAxLCBhICogbilcbiAgfVxufVxuXG4vKipcbiAqIEJlc3NlbCBmYWN0b3JzXG4gKi9cbmV4cG9ydHMuYmVzc2VsRmFjdG9ycyA9IGZ1bmN0aW9uIChuKSB7XG4gIHZhciByZXMgPSBbXVxuICBmb3IgKHZhciBrID0gMDsgayA8IG4gKyAxOyBrKyspIHtcbiAgICB2YXIgcCA9IGZhY3RvcmlhbCgyICogbiAtIGspXG4gICAgdmFyIHEgPSBNYXRoLnBvdygyLCAobiAtIGspKSAqIGZhY3RvcmlhbChrKSAqIGZhY3RvcmlhbChuIC0gaylcbiAgICByZXMudW5zaGlmdChNYXRoLmZsb29yKHAgLyBxKSlcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbnZhciBmcmFjdGlvblRvRnAgPSBmdW5jdGlvbiAoZnJhY3Rpb24sIGZyYWN0aW9uQml0cykge1xuICB2YXIgZnBGcmFjdGlvbiA9IDBcbiAgZm9yICh2YXIgY250ID0gMDsgY250IDwgZnJhY3Rpb25CaXRzOyBjbnQrKykge1xuICAgIHZhciBiaXRWYWwgPSAxIC8gTWF0aC5wb3coMiwgY250ICsgMSlcbiAgICBpZiAoZnJhY3Rpb24gPiBiaXRWYWwpIHtcbiAgICAgIGZyYWN0aW9uIC09IGJpdFZhbFxuICAgICAgZnBGcmFjdGlvbiArPSBiaXRWYWxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZwRnJhY3Rpb25cbn1cblxudmFyIG51bWJlclRvRnAgPSBmdW5jdGlvbiAobnVtYmVyLCBudW1iZXJCaXRzKSB7XG4gIHJldHVybiBudW1iZXIgJiBNYXRoLnBvdygyLCBudW1iZXJCaXRzKVxufVxuXG52YXIgdmFsdWVUb0ZwID0gZnVuY3Rpb24gKHZhbHVlLCBudW1iZXJCaXRzLCBmcmFjdGlvbkJpdHMpIHtcbiAgdmFyIG51bWJlciA9IE1hdGguYWJzKHZhbHVlKVxuICB2YXIgZnJhY3Rpb24gPSB2YWx1ZSAtIG51bWJlclxuICB2YXIgZnBOdW1iZXIgPSB7XG4gICAgbnVtYmVyOiBudW1iZXJUb0ZwKG51bWJlciwgbnVtYmVyQml0cykudG9TdHJpbmcoKSxcbiAgICBmcmFjdGlvbjogZnJhY3Rpb25Ub0ZwKGZyYWN0aW9uLCBmcmFjdGlvbkJpdHMpLnRvU3RyaW5nKCksXG4gICAgbnVtYmVyQml0czogbnVtYmVyQml0cyxcbiAgICBmcmFjdGlvbkJpdHM6IGZyYWN0aW9uQml0c1xuICB9XG4gIHJldHVybiBmcE51bWJlclxufVxuXG5leHBvcnRzLmZpeGVkUG9pbnQgPSB7XG4gIGNvbnZlcnQ6IGZ1bmN0aW9uICh2YWx1ZSwgbnVtYmVyQml0cywgZnJhY3Rpb25CaXRzKSB7XG4gICAgcmV0dXJuIHZhbHVlVG9GcCh2YWx1ZSwgbnVtYmVyQml0cywgZnJhY3Rpb25CaXRzKVxuICB9LFxuICBhZGQ6IGZ1bmN0aW9uIChmcFZhbDEsIGZwVmFsMikge1xuICB9LFxuICBzdWI6IGZ1bmN0aW9uIChmcFZhbDEsIGZwVmFsMikge1xuICB9LFxuICBtdWw6IGZ1bmN0aW9uIChmcFZhbDEsIGZwVmFsMikge1xuICB9LFxuICBkaXY6IGZ1bmN0aW9uIChmcFZhbDEsIGZwVmFsMikge1xuICB9XG59XG5cbi8qKlxuICogQ29tcGxleFxuICovXG5leHBvcnRzLmNvbXBsZXggPSB7XG5cbiAgZGl2OiBmdW5jdGlvbiAocCwgcSkge1xuICAgIHZhciBhID0gcC5yZVxuICAgIHZhciBiID0gcC5pbVxuICAgIHZhciBjID0gcS5yZVxuICAgIHZhciBkID0gcS5pbVxuICAgIHZhciBuID0gKGMgKiBjICsgZCAqIGQpXG4gICAgdmFyIHggPSB7XG4gICAgICByZTogKGEgKiBjICsgYiAqIGQpIC8gbixcbiAgICAgIGltOiAoYiAqIGMgLSBhICogZCkgLyBuXG4gICAgfVxuICAgIHJldHVybiB4XG4gIH0sXG4gIG11bDogZnVuY3Rpb24gKHAsIHEpIHtcbiAgICB2YXIgYSA9IHAucmVcbiAgICB2YXIgYiA9IHAuaW1cbiAgICB2YXIgYyA9IHEucmVcbiAgICB2YXIgZCA9IHEuaW1cbiAgICB2YXIgeCA9IHtcbiAgICAgIHJlOiAoYSAqIGMgLSBiICogZCksXG4gICAgICBpbTogKGEgKyBiKSAqIChjICsgZCkgLSBhICogYyAtIGIgKiBkXG4gICAgfVxuICAgIHJldHVybiB4XG4gIH0sXG4gIGFkZDogZnVuY3Rpb24gKHAsIHEpIHtcbiAgICB2YXIgeCA9IHtcbiAgICAgIHJlOiBwLnJlICsgcS5yZSxcbiAgICAgIGltOiBwLmltICsgcS5pbVxuICAgIH1cbiAgICByZXR1cm4geFxuICB9LFxuICBzdWI6IGZ1bmN0aW9uIChwLCBxKSB7XG4gICAgdmFyIHggPSB7XG4gICAgICByZTogcC5yZSAtIHEucmUsXG4gICAgICBpbTogcC5pbSAtIHEuaW1cbiAgICB9XG4gICAgcmV0dXJuIHhcbiAgfSxcbiAgcGhhc2U6IGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIE1hdGguYXRhbjIobi5pbSwgbi5yZSlcbiAgfSxcbiAgbWFnbml0dWRlOiBmdW5jdGlvbiAobikge1xuICAgIHJldHVybiBNYXRoLnNxcnQobi5yZSAqIG4ucmUgKyBuLmltICogbi5pbSlcbiAgfVxufVxuIl19
+ +
+ + + + + + diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 0000000..be61a6a --- /dev/null +++ b/coverage/lcov.info @@ -0,0 +1,1236 @@ +TN: +SF:/home/dano/fili.js/src/fft.js +FN:3,Fft +FN:4,isPowerOfTwo +FN:58,sinc +FN:65,calc +FN:72,calc +FN:79,calc +FN:87,calc +FN:95,calc +FN:108,calc +FN:115,calc +FN:122,calc +FN:129,calc +FN:136,calc +FN:143,calc +FN:151,calc +FN:162,calc +FN:170,calc +FN:178,calc +FN:186,calc +FN:194,calc +FN:202,calc +FN:210,calc +FN:218,calc +FN:227,calc +FN:235,calc +FN:243,calc +FN:252,calc +FN:260,calc +FN:268,calc +FN:276,calc +FN:284,calc +FN:292,calc +FN:300,calc +FN:308,calc +FN:316,calc +FN:324,calc +FN:332,calc +FN:340,calc +FN:348,calc +FN:356,calc +FN:365,windowFunctions +FN:376,zeroPad +FN:385,forward +FN:436,inverse +FN:470,magnitude +FN:477,magToDb +FN:484,phase +FN:491,windows +FNF:48 +FNH:48 +FNDA:2,Fft +FNDA:2,isPowerOfTwo +FNDA:8193,sinc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:8193,calc +FNDA:303143,windowFunctions +FNDA:39,zeroPad +FNDA:39,forward +FNDA:1,inverse +FNDA:1,magnitude +FNDA:1,magToDb +FNDA:1,phase +FNDA:2,windows +DA:3,1 +DA:4,2 +DA:5,2 +DA:6,1 +DA:8,1 +DA:11,2 +DA:12,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:29,1 +DA:30,8191 +DA:31,8191 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,8192 +DA:39,8192 +DA:40,1 +DA:42,8191 +DA:43,8191 +DA:44,8178 +DA:45,8178 +DA:47,8191 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,8193 +DA:61,1 +DA:63,1 +DA:66,8193 +DA:73,8193 +DA:80,8193 +DA:81,8193 +DA:88,8193 +DA:89,8193 +DA:96,8193 +DA:97,2049 +DA:98,6144 +DA:99,2048 +DA:101,4096 +DA:109,8193 +DA:116,8193 +DA:123,8193 +DA:130,8193 +DA:137,8193 +DA:144,8193 +DA:145,8193 +DA:152,8193 +DA:153,8193 +DA:154,8193 +DA:155,8193 +DA:156,8193 +DA:163,8193 +DA:164,8193 +DA:171,8193 +DA:172,8193 +DA:179,8193 +DA:180,8193 +DA:187,8193 +DA:188,8193 +DA:195,8193 +DA:196,8193 +DA:203,8193 +DA:204,8193 +DA:211,8193 +DA:212,8193 +DA:219,8193 +DA:220,8193 +DA:228,8193 +DA:229,8193 +DA:236,8193 +DA:237,8193 +DA:244,8193 +DA:245,8193 +DA:253,8193 +DA:254,8193 +DA:261,8193 +DA:262,8193 +DA:269,8193 +DA:270,8193 +DA:277,8193 +DA:278,8193 +DA:285,8193 +DA:286,8193 +DA:293,8193 +DA:294,8193 +DA:301,8193 +DA:302,8193 +DA:309,8193 +DA:310,8193 +DA:317,8193 +DA:318,8193 +DA:325,8193 +DA:326,8193 +DA:333,8193 +DA:334,8193 +DA:341,8193 +DA:342,8193 +DA:349,8193 +DA:350,8193 +DA:357,8193 +DA:358,8193 +DA:365,1 +DA:366,303143 +DA:367,303141 +DA:368,74 +DA:370,303141 +DA:371,303141 +DA:373,2 +DA:376,1 +DA:377,39 +DA:378,1 +DA:379,1 +DA:381,38 +DA:384,1 +DA:386,39 +DA:387,39 +DA:388,39 +DA:394,39 +DA:395,39 +DA:396,39 +DA:397,37 +DA:398,303104 +DA:399,303104 +DA:402,2 +DA:403,16384 +DA:407,39 +DA:408,319488 +DA:409,319488 +DA:412,39 +DA:413,507 +DA:414,507 +DA:415,507 +DA:416,507 +DA:417,319449 +DA:418,319449 +DA:419,319449 +DA:420,2076672 +DA:421,2076672 +DA:422,2076672 +DA:423,2076672 +DA:424,2076672 +DA:425,2076672 +DA:426,2076672 +DA:428,319449 +DA:431,39 +DA:437,1 +DA:438,1 +DA:439,1 +DA:440,8192 +DA:441,8192 +DA:442,8192 +DA:445,1 +DA:446,13 +DA:447,13 +DA:448,13 +DA:449,13 +DA:450,8191 +DA:451,8191 +DA:452,8191 +DA:453,53248 +DA:454,53248 +DA:455,53248 +DA:456,53248 +DA:457,53248 +DA:458,53248 +DA:459,53248 +DA:461,8191 +DA:465,1 +DA:466,8192 +DA:468,1 +DA:471,1 +DA:472,1 +DA:473,8192 +DA:475,1 +DA:478,1 +DA:479,1 +DA:480,8192 +DA:482,1 +DA:485,1 +DA:486,1 +DA:487,8192 +DA:489,1 +DA:492,2 +DA:493,2 +DA:494,74 +DA:496,2 +DA:499,1 +DA:502,1 +LF:204 +LH:204 +BRDA:5,1,0,1 +BRDA:5,1,1,1 +BRDA:11,2,0,1 +BRDA:11,2,1,1 +BRDA:39,3,0,1 +BRDA:39,3,1,8191 +BRDA:96,4,0,2049 +BRDA:96,4,1,6144 +BRDA:98,5,0,2048 +BRDA:98,5,1,4096 +BRDA:366,6,0,303141 +BRDA:366,6,1,2 +BRDA:367,7,0,74 +BRDA:367,7,1,303067 +BRDA:377,8,0,1 +BRDA:377,8,1,38 +BRDA:396,9,0,37 +BRDA:396,9,1,2 +BRF:18 +BRH:18 +end_of_record +TN: +SF:/home/dano/fili.js/src/firCoeffs.js +FN:3,FirCoeffs +FN:7,calcKImpulseResponse +FN:13,ino +FN:60,calcImpulseResponse +FN:88,invert +FN:96,bs +FN:114,lowpass +FN:117,highpass +FN:120,bandstop +FN:123,bandpass +FN:126,kbFilter +FN:129,available +FNF:12 +FNH:12 +FNDA:1,FirCoeffs +FNDA:1,calcKImpulseResponse +FNDA:52,ino +FNDA:6,calcImpulseResponse +FNDA:4,invert +FNDA:2,bs +FNDA:1,lowpass +FNDA:1,highpass +FNDA:1,bandstop +FNDA:1,bandpass +FNDA:1,kbFilter +FNDA:1,available +DA:3,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,52 +DA:15,52 +DA:16,52 +DA:17,52 +DA:18,662 +DA:19,662 +DA:20,662 +DA:22,52 +DA:25,1 +DA:26,0 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:35,1 +DA:36,1 +DA:37,50 +DA:40,1 +DA:41,0 +DA:42,1 +DA:43,1 +DA:45,0 +DA:48,1 +DA:49,1 +DA:50,51 +DA:52,1 +DA:53,50 +DA:55,1 +DA:60,1 +DA:61,6 +DA:62,6 +DA:63,6 +DA:64,6 +DA:65,6 +DA:66,6 +DA:67,6 +DA:71,6 +DA:72,606 +DA:73,6 +DA:75,600 +DA:77,600 +DA:79,606 +DA:82,6 +DA:83,606 +DA:85,6 +DA:88,1 +DA:89,4 +DA:90,4 +DA:91,404 +DA:93,4 +DA:94,4 +DA:96,1 +DA:97,2 +DA:102,2 +DA:107,2 +DA:108,2 +DA:109,202 +DA:111,2 +DA:113,1 +DA:115,1 +DA:118,1 +DA:121,1 +DA:124,1 +DA:127,1 +DA:130,1 +DA:133,1 +DA:136,1 +LF:77 +LH:74 +BRDA:11,1,0,1 +BRDA:11,1,1,0 +BRDA:12,2,0,1 +BRDA:12,2,1,0 +BRDA:25,3,0,0 +BRDA:25,3,1,1 +BRDA:40,4,0,0 +BRDA:40,4,1,1 +BRDA:42,5,0,1 +BRDA:42,5,1,0 +BRDA:72,6,0,6 +BRDA:72,6,1,600 +BRF:12 +BRH:7 +end_of_record +TN: +SF:/home/dano/fili.js/src/firFilter.js +FN:12,FirFilter +FN:24,initZero +FN:38,doStep +FN:48,calcInputResponse +FN:53,calcResponse +FN:80,responsePoint +FN:83,response +FN:97,simulate +FN:100,singleStep +FN:103,multiStep +FN:106,reinit +FNF:11 +FNH:10 +FNDA:5,FirFilter +FNDA:14,initZero +FNDA:100005,doStep +FNDA:5,calcInputResponse +FNDA:1000,calcResponse +FNDA:0,responsePoint +FNDA:5,response +FNDA:5,simulate +FNDA:5,singleStep +FNDA:5,multiStep +FNDA:4,reinit +DA:3,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:12,1 +DA:14,5 +DA:15,5 +DA:16,5 +DA:17,5 +DA:18,505 +DA:24,5 +DA:25,14 +DA:26,14 +DA:27,14 +DA:28,1400 +DA:30,14 +DA:36,5 +DA:38,5 +DA:39,100005 +DA:40,100005 +DA:41,100005 +DA:42,10000500 +DA:44,100005 +DA:45,100005 +DA:48,5 +DA:49,5 +DA:50,5 +DA:53,5 +DA:54,1000 +DA:55,1000 +DA:59,1000 +DA:60,1000 +DA:64,1000 +DA:65,100000 +DA:70,1000 +DA:71,1000 +DA:76,1000 +DA:79,5 +DA:81,0 +DA:84,5 +DA:85,5 +DA:86,5 +DA:87,5 +DA:88,5 +DA:89,1000 +DA:94,5 +DA:95,5 +DA:98,5 +DA:101,5 +DA:104,5 +DA:107,4 +DA:110,5 +DA:113,1 +LF:53 +LH:52 +BRDA:84,1,0,5 +BRDA:84,1,1,0 +BRF:2 +BRH:1 +end_of_record +TN: +SF:/home/dano/fili.js/src/utils.js +FN:6,(anonymous_1) +FN:55,(anonymous_2) +FN:67,factorial +FN:95,(anonymous_4) +FN:105,fractionToFp +FN:117,numberToFp +FN:121,valueToFp +FN:134,convert +FN:137,add +FN:138,sub +FN:139,mul +FN:140,div +FN:148,div +FN:160,mul +FN:171,add +FN:178,sub +FN:185,phase +FN:188,magnitude +FNF:18 +FNH:7 +FNDA:17,(anonymous_1) +FNDA:34,(anonymous_2) +FNDA:0,factorial +FNDA:0,(anonymous_4) +FNDA:0,fractionToFp +FNDA:0,numberToFp +FNDA:0,valueToFp +FNDA:0,convert +FNDA:0,add +FNDA:0,sub +FNDA:0,mul +FNDA:0,div +FNDA:5418,div +FNDA:127090,mul +FNDA:121672,add +FNDA:0,sub +FNDA:6418,phase +FNDA:6418,magnitude +DA:6,1 +DA:7,17 +DA:8,17 +DA:9,17 +DA:10,17 +DA:11,17 +DA:12,17 +DA:13,2800 +DA:15,17 +DA:16,17 +DA:18,17 +DA:19,2783 +DA:20,2783 +DA:21,165 +DA:22,15337 +DA:24,2618 +DA:25,18 +DA:26,2021 +DA:29,2783 +DA:30,2456 +DA:32,327 +DA:35,2783 +DA:36,2783 +DA:37,2783 +DA:38,381 +DA:41,17 +DA:42,13 +DA:43,13 +DA:45,4 +DA:46,4 +DA:47,4 +DA:48,4 +DA:55,1 +DA:56,34 +DA:57,34 +DA:58,0 +DA:60,34 +DA:61,34 +DA:62,221200 +DA:64,34 +DA:67,1 +DA:68,0 +DA:70,0 +DA:71,0 +DA:73,0 +DA:75,0 +DA:76,0 +DA:78,0 +DA:79,0 +DA:81,0 +DA:82,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:95,1 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:102,0 +DA:105,1 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:114,0 +DA:117,1 +DA:118,0 +DA:121,1 +DA:122,0 +DA:123,0 +DA:124,0 +DA:130,0 +DA:133,1 +DA:135,0 +DA:146,1 +DA:149,5418 +DA:150,5418 +DA:151,5418 +DA:152,5418 +DA:153,5418 +DA:154,5418 +DA:158,5418 +DA:161,127090 +DA:162,127090 +DA:163,127090 +DA:164,127090 +DA:165,127090 +DA:169,127090 +DA:172,121672 +DA:176,121672 +DA:179,0 +DA:183,0 +DA:186,6418 +DA:189,6418 +LF:99 +LH:63 +BRDA:20,1,0,165 +BRDA:20,1,1,2618 +BRDA:24,2,0,18 +BRDA:24,2,1,2600 +BRDA:29,3,0,2456 +BRDA:29,3,1,327 +BRDA:37,4,0,381 +BRDA:37,4,1,2402 +BRDA:41,5,0,13 +BRDA:41,5,1,4 +BRDA:57,6,0,0 +BRDA:57,6,1,34 +BRDA:75,7,0,0 +BRDA:75,7,1,0 +BRDA:78,8,0,0 +BRDA:78,8,1,0 +BRDA:78,9,0,0 +BRDA:78,9,1,0 +BRDA:81,10,0,0 +BRDA:81,10,1,0 +BRDA:81,11,0,0 +BRDA:81,11,1,0 +BRDA:109,12,0,0 +BRDA:109,12,1,0 +BRF:24 +BRH:11 +end_of_record +TN: +SF:/home/dano/fili.js/src/calcCascades.js +FN:48,calcCoeffs +FN:107,initCalcCoeffs +FN:108,(anonymous_3) +FN:114,CalcCascades +FN:120,(anonymous_5) +FNF:5 +FNH:5 +FNDA:26,calcCoeffs +FNDA:14,initCalcCoeffs +FNDA:26,(anonymous_3) +FNDA:1,CalcCascades +FNDA:1,(anonymous_5) +DA:3,1 +DA:5,1 +DA:7,1 +DA:17,1 +DA:48,1 +DA:49,26 +DA:50,26 +DA:51,26 +DA:52,26 +DA:53,0 +DA:55,26 +DA:56,76 +DA:57,76 +DA:58,21 +DA:66,55 +DA:67,35 +DA:68,35 +DA:70,20 +DA:71,20 +DA:72,0 +DA:74,20 +DA:78,55 +DA:79,11 +DA:81,44 +DA:83,55 +DA:84,9 +DA:85,3 +DA:88,55 +DA:99,0 +DA:100,0 +DA:104,26 +DA:107,1 +DA:108,14 +DA:109,26 +DA:113,1 +DA:114,1 +DA:115,1 +DA:116,1 +DA:117,14 +DA:118,14 +DA:120,1 +DA:121,1 +DA:123,1 +DA:126,1 +LF:44 +LH:40 +BRDA:51,1,0,26 +BRDA:51,1,1,0 +BRDA:52,2,0,0 +BRDA:52,2,1,26 +BRDA:57,3,0,21 +BRDA:57,3,1,55 +BRDA:66,4,0,35 +BRDA:66,4,1,20 +BRDA:71,5,0,0 +BRDA:71,5,1,20 +BRDA:78,6,0,11 +BRDA:78,6,1,44 +BRDA:83,7,0,9 +BRDA:83,7,1,46 +BRDA:83,8,0,55 +BRDA:83,8,1,52 +BRDA:84,9,0,3 +BRDA:84,9,1,6 +BRDA:92,10,0,55 +BRDA:92,10,1,55 +BRDA:93,11,0,55 +BRDA:93,11,1,55 +BRDA:94,12,0,55 +BRDA:94,12,1,43 +BRF:24 +BRH:21 +end_of_record +TN: +SF:/home/dano/fili.js/src/iirCoeffs.js +FN:3,IirCoeffs +FN:4,preCalc +FN:24,preCalcGain +FN:36,initCoeffs +FN:46,fromPZ +FN:63,lowpassMZ +FN:86,lowpassBT +FN:104,highpassBT +FN:126,lowpass +FN:145,highpass +FN:164,allpass +FN:178,bandpassQ +FN:189,bandpass +FN:200,bandstop +FN:211,peak +FN:225,lowshelf +FN:243,highshelf +FN:262,aweighting +FNF:18 +FNH:17 +FNDA:1,IirCoeffs +FNDA:37,preCalc +FNDA:9,preCalcGain +FNDA:76,initCoeffs +FNDA:0,fromPZ +FNDA:21,lowpassMZ +FNDA:3,lowpassBT +FNDA:3,highpassBT +FNDA:11,lowpass +FNDA:11,highpass +FNDA:3,allpass +FNDA:3,bandpassQ +FNDA:3,bandpass +FNDA:6,bandstop +FNDA:3,peak +FNDA:3,lowshelf +FNDA:3,highshelf +FNDA:3,aweighting +DA:3,1 +DA:4,1 +DA:5,37 +DA:6,37 +DA:7,37 +DA:8,37 +DA:9,37 +DA:10,37 +DA:11,0 +DA:13,37 +DA:15,37 +DA:16,37 +DA:17,37 +DA:18,37 +DA:19,37 +DA:20,37 +DA:21,37 +DA:24,1 +DA:25,9 +DA:26,9 +DA:27,9 +DA:28,9 +DA:29,9 +DA:30,9 +DA:31,9 +DA:32,9 +DA:33,9 +DA:36,1 +DA:37,76 +DA:38,76 +DA:39,76 +DA:40,76 +DA:41,76 +DA:44,1 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:57,0 +DA:59,0 +DA:64,21 +DA:65,21 +DA:66,21 +DA:67,21 +DA:68,21 +DA:69,21 +DA:70,21 +DA:71,21 +DA:73,21 +DA:74,21 +DA:75,21 +DA:77,0 +DA:78,0 +DA:80,21 +DA:81,21 +DA:82,21 +DA:87,3 +DA:88,3 +DA:89,3 +DA:90,3 +DA:91,3 +DA:92,0 +DA:94,3 +DA:95,3 +DA:96,3 +DA:97,3 +DA:98,3 +DA:99,3 +DA:100,3 +DA:101,3 +DA:105,3 +DA:106,3 +DA:107,3 +DA:108,3 +DA:109,3 +DA:110,0 +DA:112,3 +DA:113,3 +DA:114,3 +DA:115,3 +DA:116,3 +DA:117,3 +DA:118,3 +DA:119,3 +DA:127,11 +DA:128,11 +DA:129,0 +DA:131,11 +DA:132,11 +DA:133,6 +DA:134,6 +DA:136,5 +DA:137,5 +DA:139,11 +DA:140,11 +DA:141,11 +DA:146,11 +DA:147,11 +DA:148,0 +DA:150,11 +DA:151,11 +DA:152,6 +DA:153,6 +DA:155,5 +DA:156,5 +DA:158,11 +DA:159,11 +DA:160,11 +DA:165,3 +DA:166,3 +DA:167,0 +DA:169,3 +DA:170,3 +DA:171,3 +DA:172,3 +DA:173,3 +DA:174,3 +DA:179,3 +DA:180,3 +DA:181,3 +DA:182,3 +DA:183,3 +DA:184,3 +DA:185,3 +DA:190,3 +DA:191,3 +DA:192,3 +DA:193,3 +DA:194,3 +DA:195,3 +DA:196,3 +DA:201,6 +DA:202,6 +DA:203,6 +DA:204,6 +DA:205,6 +DA:206,6 +DA:207,6 +DA:212,3 +DA:213,3 +DA:214,3 +DA:215,3 +DA:216,3 +DA:217,3 +DA:218,3 +DA:219,3 +DA:220,3 +DA:221,3 +DA:226,3 +DA:227,3 +DA:228,0 +DA:230,3 +DA:231,3 +DA:232,3 +DA:233,3 +DA:234,3 +DA:235,3 +DA:236,3 +DA:237,3 +DA:238,3 +DA:239,3 +DA:244,3 +DA:245,3 +DA:246,0 +DA:248,3 +DA:249,3 +DA:250,3 +DA:251,3 +DA:252,3 +DA:253,3 +DA:254,3 +DA:255,3 +DA:256,3 +DA:257,3 +DA:263,3 +DA:264,3 +DA:265,3 +DA:266,3 +DA:267,3 +DA:268,3 +DA:269,3 +DA:270,3 +DA:271,3 +DA:272,3 +DA:273,3 +DA:274,3 +DA:275,3 +DA:279,1 +DA:282,1 +LF:194 +LH:173 +BRDA:10,1,0,0 +BRDA:10,1,1,37 +BRDA:54,2,0,0 +BRDA:54,2,1,0 +BRDA:73,3,0,21 +BRDA:73,3,1,0 +BRDA:91,4,0,0 +BRDA:91,4,1,3 +BRDA:109,5,0,0 +BRDA:109,5,1,3 +BRDA:128,6,0,0 +BRDA:128,6,1,11 +BRDA:132,7,0,6 +BRDA:132,7,1,5 +BRDA:147,8,0,0 +BRDA:147,8,1,11 +BRDA:151,9,0,6 +BRDA:151,9,1,5 +BRDA:166,10,0,0 +BRDA:166,10,1,3 +BRDA:227,11,0,0 +BRDA:227,11,1,3 +BRDA:245,12,0,0 +BRDA:245,12,1,3 +BRF:24 +BRH:13 +end_of_record +TN: +SF:/home/dano/fili.js/src/iirFilter.js +FN:11,IirFilter +FN:54,runStage +FN:62,doStep +FN:71,biquadResponse +FN:93,calcResponse +FN:111,reinit +FN:145,calcInputResponse +FN:150,predefinedResponse +FN:180,getComplRes +FN:201,getPZ +FN:212,singleStep +FN:215,multiStep +FN:218,simulate +FN:221,stepResponse +FN:222,(anonymous_15) +FN:226,impulseResponse +FN:227,(anonymous_17) +FN:235,responsePoint +FN:238,response +FN:252,polesZeros +FN:255,reinit +FNF:21 +FNH:18 +FNDA:6,IirFilter +FNDA:363618,runStage +FNDA:121206,doStep +FNDA:5418,biquadResponse +FNDA:1806,calcResponse +FNDA:18,reinit +FNDA:18,calcInputResponse +FNDA:12,predefinedResponse +FNDA:0,getComplRes +FNDA:0,getPZ +FNDA:6,singleStep +FNDA:6,multiStep +FNDA:6,simulate +FNDA:6,stepResponse +FNDA:600,(anonymous_15) +FNDA:6,impulseResponse +FNDA:600,(anonymous_17) +FNDA:6,responsePoint +FNDA:12,response +FNDA:0,polesZeros +FNDA:6,reinit +DA:3,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:11,1 +DA:12,6 +DA:13,6 +DA:17,6 +DA:18,6 +DA:19,6 +DA:20,18 +DA:21,18 +DA:22,18 +DA:26,18 +DA:30,18 +DA:34,18 +DA:38,18 +DA:42,18 +DA:46,18 +DA:47,18 +DA:48,18 +DA:49,18 +DA:50,18 +DA:51,18 +DA:54,6 +DA:55,363618 +DA:56,363618 +DA:57,363618 +DA:58,363618 +DA:59,363618 +DA:62,6 +DA:63,121206 +DA:64,121206 +DA:65,121206 +DA:66,363618 +DA:68,121206 +DA:71,6 +DA:72,5418 +DA:73,5418 +DA:77,5418 +DA:78,5418 +DA:83,5418 +DA:84,5418 +DA:85,5418 +DA:86,5418 +DA:90,5418 +DA:93,6 +DA:94,1806 +DA:95,1806 +DA:99,1806 +DA:100,5418 +DA:103,5418 +DA:105,5418 +DA:107,1806 +DA:108,1806 +DA:111,6 +DA:112,18 +DA:113,18 +DA:114,54 +DA:142,18 +DA:145,6 +DA:146,18 +DA:147,18 +DA:150,6 +DA:151,12 +DA:152,12 +DA:153,12 +DA:154,12 +DA:155,1200 +DA:157,12 +DA:158,12 +DA:159,12 +DA:160,12 +DA:161,95 +DA:162,12 +DA:163,12 +DA:168,95 +DA:169,12 +DA:170,12 +DA:174,12 +DA:177,12 +DA:180,6 +DA:181,0 +DA:182,0 +DA:183,0 +DA:191,0 +DA:201,6 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:208,0 +DA:211,6 +DA:213,6 +DA:216,6 +DA:219,6 +DA:222,6 +DA:223,600 +DA:227,6 +DA:228,600 +DA:229,6 +DA:231,594 +DA:236,6 +DA:239,12 +DA:240,12 +DA:241,12 +DA:242,12 +DA:243,12 +DA:244,1800 +DA:249,12 +DA:250,12 +DA:253,0 +DA:256,6 +DA:257,18 +DA:261,6 +DA:264,1 +LF:117 +LH:106 +BRDA:161,1,0,12 +BRDA:161,1,1,83 +BRDA:161,2,0,95 +BRDA:161,2,1,45 +BRDA:168,3,0,12 +BRDA:168,3,1,83 +BRDA:168,4,0,95 +BRDA:168,4,1,57 +BRDA:168,4,2,57 +BRDA:182,5,0,0 +BRDA:182,5,1,0 +BRDA:228,6,0,6 +BRDA:228,6,1,594 +BRDA:239,7,0,12 +BRDA:239,7,1,6 +BRF:15 +BRH:13 +end_of_record diff --git a/dist/fili.js b/dist/fili.js index a1e56a6..bce634c 100644 --- a/dist/fili.js +++ b/dist/fili.js @@ -1,6 +1,6 @@ /** * @name fili - * @version 2.0.1 | November 20th 2017 + * @version 2.0.2 | March 3rd 2018 * @author Florian Markert * @license MIT */ @@ -523,6 +523,14 @@ var Fft = function Fft(radix) { return windowCalculation[params.name].values; }; + var zeroPad = function zeroPad(buffer, fftLength) { + if (fftLength > buffer.length) { + console.log('buffer: ', buffer.length, ' fftLength: ', fftLength, ' output: ', buffer.concat(new Array(fftLength - buffer.length).fill(0)).length); + return buffer.concat(new Array(fftLength - buffer.length).fill(0)); + } + return buffer; + }; + var self = { forward: function forward(b, window) { var i, j, n, k, k2, h, d, c, s, ik, dx, dy; @@ -533,6 +541,7 @@ var Fft = function Fft(radix) { a: 0.5, n: 0 }; + b = zeroPad(b, n); var w = windowFunctions(winFunction); if (typeof w === 'number') { for (i = 0; i < n; ++i) { diff --git a/dist/fili.min.js b/dist/fili.min.js index c3d664f..163a2ad 100644 --- a/dist/fili.min.js +++ b/dist/fili.min.js @@ -1,7 +1,7 @@ /** * @name fili - * @version 2.0.1 | November 20th 2017 + * @version 2.0.2 | March 3rd 2018 * @author Florian Markert * @license MIT */ -!function(r){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=r();else if("function"==typeof define&&define.amd)define([],r);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Fili=r()}}(function(){return function r(t,e,n){function a(o,i){if(!e[o]){if(!t[o]){var s="function"==typeof require&&require;if(!i&&s)return s(o,!0);if(u)return u(o,!0);var c=new Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var f=e[o]={exports:{}};t[o][0].call(f.exports,function(r){var e=t[o][1][r];return a(e?e:r)},f,f.exports,r,t,e,n)}return e[o].exports}for(var u="function"==typeof require&&require,o=0;o12&&(r.order=12),n=0;n>1,o=0,i=0;e.twiddle[o]=i,!(++o>=r);){for(a=u;a<=i;)i-=a,a>>=1;i+=a}var s=Math.PI,c=2*Math.PI,f=Math.abs,l=Math.pow,h=Math.cos,p=Math.sin,v=function(r){return p(s*r)/(s*r)},b=Math.E,m={rectangular:{calc:function(){return 1},values:[],correction:1},none:{calc:function(){return 1},values:[],correction:1},hanning:{calc:function(r,t){var e=c*r/(t-1);return.5*(1-h(e))},values:[],correction:2},hamming:{calc:function(r,t){var e=c*r/(t-1);return.54-.46*h(e)},values:[],correction:1.8518999946875638},tukery:{calc:function(r,t,e){return r1e-6*n;)t+=2,e*=r*r/(t*t),n+=e;return n};a/2-Math.floor(a/2)===0&&a++;var i,s=(a-1)/2,c=[],f=0,l=0,h=[];for(c[0]=2*(n-e)/t,l=1;l<=s;l++)c[l]=(Math.sin(2*l*Math.PI*n/t)-Math.sin(2*l*Math.PI*e/t))/(l*Math.PI);for(f=u<21?0:u>50?.1102*(u-8.7):.5842*Math.pow(u-21,.4)+.07886*(u-21),i=o(f),l=0;l<=s;l++)h[s+l]=c[l]*o(f*Math.sqrt(1-l*l/(s*s)))/i;for(l=0;le.out[a+1]&&!u&&(u=!0,e.max={sample:a,value:e.out[a]}),u&&!o&&e.out[a]r.maxStable||n[t]r.maxStable||n[t]n)for(t=e;ta&&(r-=a,e+=a)}return e},u=function(r,t){return r&Math.pow(2,t)},o=function(r,t,e){var n=Math.abs(r),o=r-n,i={number:u(n,t).toString(),fraction:a(o,e).toString(),numberBits:t,fractionBits:e};return i};e.fixedPoint={convert:function(r,t,e){return o(r,t,e)},add:function(r,t){},sub:function(r,t){},mul:function(r,t){},div:function(r,t){}},e.complex={div:function(r,t){var e=r.re,n=r.im,a=t.re,u=t.im,o=a*a+u*u,i={re:(e*a+n*u)/o,im:(n*a-e*u)/o};return i},mul:function(r,t){var e=r.re,n=r.im,a=t.re,u=t.im,o={re:e*a-n*u,im:(e+n)*(a+u)-e*a-n*u};return o},add:function(r,t){var e={re:r.re+t.re,im:r.im+t.im};return e},sub:function(r,t){var e={re:r.re-t.re,im:r.im-t.im};return e},phase:function(r){return Math.atan2(r.im,r.re)},magnitude:function(r){return Math.sqrt(r.re*r.re+r.im*r.im)}}},{}]},{},[1])(1)}); \ No newline at end of file +!function(r){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=r();else if("function"==typeof define&&define.amd)define([],r);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Fili=r()}}(function(){return function r(t,e,n){function a(o,i){if(!e[o]){if(!t[o]){var s="function"==typeof require&&require;if(!i&&s)return s(o,!0);if(u)return u(o,!0);var c=new Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var f=e[o]={exports:{}};t[o][0].call(f.exports,function(r){var e=t[o][1][r];return a(e||r)},f,f.exports,r,t,e,n)}return e[o].exports}for(var u="function"==typeof require&&require,o=0;o12&&(r.order=12),n=0;n>1,u=0,o=0;t.twiddle[u]=o,!(++u>=r);){for(n=a;n<=o;)o-=n,n>>=1;o+=n}var i=Math.PI,s=2*Math.PI,c=Math.abs,f=Math.pow,l=Math.cos,h=Math.sin,p=function(r){return h(i*r)/(i*r)},v=Math.E,b={rectangular:{calc:function(){return 1},values:[],correction:1},none:{calc:function(){return 1},values:[],correction:1},hanning:{calc:function(r,t){return.5*(1-l(s*r/(t-1)))},values:[],correction:2},hamming:{calc:function(r,t){return.54-.46*l(s*r/(t-1))},values:[],correction:1.8518999946875638},tukery:{calc:function(r,t,e){return rr.length?(console.log("buffer: ",r.length," fftLength: ",t," output: ",r.concat(new Array(t-r.length).fill(0)).length),r.concat(new Array(t-r.length).fill(0))):r};return{forward:function(r,e){var n,a,u,o,i,s,c,f,l,h,p,v;u=t.buffer.length;var b={name:e,N:u,a:.5,n:0};r=d(r,u);var g=m(b);if("number"==typeof g)for(n=0;n1e-6*n;)t+=2,e*=r*r/(t*t),n+=e;return n};a/2-Math.floor(a/2)==0&&a++;var i,s=(a-1)/2,c=[],f=0,l=0,h=[];for(c[0]=2*(n-e)/t,l=1;l<=s;l++)c[l]=(Math.sin(2*l*Math.PI*n/t)-Math.sin(2*l*Math.PI*e/t))/(l*Math.PI);for(f=u<21?0:u>50?.1102*(u-8.7):.5842*Math.pow(u-21,.4)+.07886*(u-21),i=o(f),l=0;l<=s;l++)h[s+l]=c[l]*o(f*Math.sqrt(1-l*l/(s*s)))/i;for(l=0;le.out[a+1]&&!u&&(u=!0,e.max={sample:a,value:e.out[a]}),u&&!o&&e.out[a]r.maxStable||n[t]r.maxStable||n[t]n)for(t=e;ta&&(r-=a,e+=a)}return e},u=function(r,t){return r&Math.pow(2,t)},o=function(r,t,e){var n=Math.abs(r),o=r-n;return{number:u(n,t).toString(),fraction:a(o,e).toString(),numberBits:t,fractionBits:e}};e.fixedPoint={convert:function(r,t,e){return o(r,t,e)},add:function(r,t){},sub:function(r,t){},mul:function(r,t){},div:function(r,t){}},e.complex={div:function(r,t){var e=r.re,n=r.im,a=t.re,u=t.im,o=a*a+u*u;return{re:(e*a+n*u)/o,im:(n*a-e*u)/o}},mul:function(r,t){var e=r.re,n=r.im,a=t.re,u=t.im;return{re:e*a-n*u,im:(e+n)*(a+u)-e*a-n*u}},add:function(r,t){return{re:r.re+t.re,im:r.im+t.im}},sub:function(r,t){return{re:r.re-t.re,im:r.im-t.im}},phase:function(r){return Math.atan2(r.im,r.re)},magnitude:function(r){return Math.sqrt(r.re*r.re+r.im*r.im)}}},{}]},{},[1])(1)}); \ No newline at end of file diff --git a/src/fft.js b/src/fft.js index dd59fb2..2528c4f 100644 --- a/src/fft.js +++ b/src/fft.js @@ -1,493 +1,502 @@ - 'use strict' +'use strict' - var Fft = function (radix) { - var isPowerOfTwo = function (value) { - if (!(value & value - 1)) { - return true - } - return false - } +var Fft = function (radix) { + var isPowerOfTwo = function (value) { + if (!(value & value - 1)) { + return true + } + return false + } - if (!isPowerOfTwo(radix)) { - return false - } + if (!isPowerOfTwo(radix)) { + return false + } - var fft = {} - fft.length = radix - fft.buffer = new Float64Array(radix) - fft.re = new Float64Array(radix) - fft.im = new Float64Array(radix) - fft.reI = new Float64Array(radix) - fft.imI = new Float64Array(radix) + var fft = {} + fft.length = radix + fft.buffer = new Float64Array(radix) + fft.re = new Float64Array(radix) + fft.im = new Float64Array(radix) + fft.reI = new Float64Array(radix) + fft.imI = new Float64Array(radix) - fft.twiddle = new Int32Array(radix) - fft.sinTable = new Float64Array(radix - 1) - fft.cosTable = new Float64Array(radix - 1) - var TPI = 2 * Math.PI - var bits = Math.floor(Math.log(radix) / Math.LN2) + fft.twiddle = new Int32Array(radix) + fft.sinTable = new Float64Array(radix - 1) + fft.cosTable = new Float64Array(radix - 1) + var TPI = 2 * Math.PI + var bits = Math.floor(Math.log(radix) / Math.LN2) - for (i = fft.sinTable.length; i--;) { - fft.sinTable[i] = Math.sin(TPI * (i / radix)) - fft.cosTable[i] = Math.cos(TPI * (i / radix)) - } + for (i = fft.sinTable.length; i--;) { + fft.sinTable[i] = Math.sin(TPI * (i / radix)) + fft.cosTable[i] = Math.cos(TPI * (i / radix)) + } - var nh = radix >> 1 - var i = 0 - var j = 0 - for (;;) { - fft.twiddle[i] = j - if (++i >= radix) { - break - } - bits = nh - while (bits <= j) { - j -= bits - bits >>= 1 - } - j += bits - } + var nh = radix >> 1 + var i = 0 + var j = 0 + for (;;) { + fft.twiddle[i] = j + if (++i >= radix) { + break + } + bits = nh + while (bits <= j) { + j -= bits + bits >>= 1 + } + j += bits + } - // good explanation in https://holometer.fnal.gov/GH_FFT.pdf + // good explanation in https://holometer.fnal.gov/GH_FFT.pdf - var PI = Math.PI - var PI2 = Math.PI * 2 - var abs = Math.abs - var pow = Math.pow - var cos = Math.cos - var sin = Math.sin - var sinc = function (x) { - return sin(PI * x) / (PI * x) - } - var E = Math.E + var PI = Math.PI + var PI2 = Math.PI * 2 + var abs = Math.abs + var pow = Math.pow + var cos = Math.cos + var sin = Math.sin + var sinc = function (x) { + return sin(PI * x) / (PI * x) + } + var E = Math.E - var windowCalculation = { - rectangular: { - calc: function () { - return 1 - }, - values: [], - correction: 1 - }, - none: { - calc: function () { - return 1 - }, - values: [], - correction: 1 - }, - hanning: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.5 * (1 - cos(z)) - }, - values: [], - correction: 2 - }, - hamming: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.54 - 0.46 * cos(z) - }, - values: [], - correction: 1.8518999946875638 - }, - tukery: { - calc: function (n, N, a) { - if (n < (a * (N - 1)) / 2) { - return 0.5 * (1 + cos(PI * (((2 * n) / (a * (N - 1))) - 1))) - } else if ((N - 1) * (1 - (a / 2)) < n) { - return 0.5 * (1 + cos(PI * (((2 * n) / (a * (N - 1))) - (2 / a) + 1))) - } else { - return 1 - } - }, - values: [], - correction: 4 / 3 - }, - cosine: { - calc: function (n, N) { - return sin((PI * n) / (N - 1)) - }, - values: [], - correction: 1.570844266360796 - }, - lanczos: { - calc: function (n, N) { - return sinc(((2 * n) / (N - 1)) - 1) - }, - values: [], - correction: 1.6964337576195783 - }, - triangular: { - calc: function (n, N) { - return (2 / (N + 1)) * (((N + 1) / 2) - abs(n - ((N - 1) / 2))) - }, - values: [], - correction: 2 - }, - bartlett: { - calc: function (n, N) { - return (2 / (N - 1)) * (((N - 1) / 2) - abs(n - ((N - 1) / 2))) - }, - values: [], - correction: 2 - }, - gaussian: { - calc: function (n, N, a) { - return pow(E, -0.5 * pow((n - (N - 1) / 2) / (a * (N - 1) / 2), 2)) - }, - values: [], - correction: 5 / 3 - }, - bartlettHanning: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.62 - 0.48 * abs((n / (N - 1)) - 0.5) - 0.38 * cos(z) - }, - values: [], - correction: 2 - }, - blackman: { - calc: function (n, N, a) { - var a0 = (1 - a) / 2 - var a1 = 0.5 - var a2 = a / 2 - var z = (PI2 * n) / (N - 1) - return a0 - a1 * cos(z) + a2 * cos(2 * z) - }, - values: [], - correction: 4 / 3 - }, - blackmanHarris: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.35875 - 0.48829 * cos(z) + 0.14128 * cos(2 * z) - 0.01168 * cos(3 * z) - }, - values: [], - correction: 1.5594508635 - }, - nuttall3: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.375 - 0.5 * cos(z) + 0.125 * cos(2 * z) - }, - values: [], - correction: 1.56 - }, - nuttall3a: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.40897 - 0.5 * cos(z) + 0.09103 * cos(2 * z) - }, - values: [], - correction: 1.692 - }, - nuttall3b: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.4243801 - 0.4973406 * cos(z) + 0.078793 * cos(2 * z) - }, - values: [], - correction: 1.7372527 - }, - nuttall4: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.3125 - 0.46875 * cos(z) + 0.1875 * cos(2 * z) - 0.03125 * cos(3 * z) - }, - values: [], - correction: 1.454543 - }, - nuttall4a: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.338946 - 0.481973 * cos(z) + 0.161054 * cos(2 * z) - 0.018027 * cos(3 * z) - }, - values: [], - correction: 1.512732763 - }, - nuttall4b: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.355768 - 0.481973 * cos(z) + 0.144232 * cos(2 * z) - 0.012604 * cos(3 * z) - }, - values: [], - correction: 1.55223262 - }, - nuttall4c: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.3635819 - 0.4891775 * cos(z) + 0.1365995 * cos(2 * z) - 0.0106411 * cos(3 * z) - }, - values: [], - correction: 1.57129067 - }, - // fast decaying flat top - sft3f: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.26526 - 0.5 * cos(z) + 0.23474 * cos(2 * z) - }, - values: [], - correction: 1.3610238 - }, - sft4f: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.21706 - 0.42103 * cos(z) + 0.28294 * cos(2 * z) - 0.07897 * cos(3 * z) - }, - values: [], - correction: 1.2773573 - }, - sft5f: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.1881 - 0.36923 * cos(z) + 0.28702 * cos(2 * z) - 0.13077 * cos(3 * z) + 0.02488 * cos(4 * z) - }, - values: [], - correction: 1.23167769 - }, - // minimum sidelobe flat top - sft3m: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.28235 - 0.52105 * cos(z) + 0.19659 * cos(2 * z) - }, - values: [], - correction: 1.39343451 - }, - sft4m: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.241906 - 0.460841 * cos(z) + 0.2552381 * cos(2 * z) - 0.041872 * cos(3 * z) - }, - values: [], - correction: 1.3190596 - }, - sft5m: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.209671 - 0.407331 * cos(z) + 0.281225 * cos(2 * z) - 0.092669 * cos(3 * z) + 0.0091036 * cos(4 * z) - }, - values: [], - correction: 1.26529456464 - }, - nift: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return 0.2810639 - 0.5208972 * cos(z) + 0.1980399 * cos(2 * z) - }, - values: [], - correction: 1.39094182 - }, - hpft: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return (1.0 - 1.912510941 * cos(z) + 1.079173272 * cos(2 * z) - 0.1832630879 * cos(3 * z)) / N - }, - values: [], - correction: 1 - }, - srft: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return (1.0 - 1.93 * cos(z) + 1.29 * cos(2 * z) - 0.388 * cos(3 * z) + 0.028 * cos(4 * z)) / N - }, - values: [], - correction: 1 - }, - hft70: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return (1.0 - 1.90796 * cos(z) + 1.07349 * cos(2 * z) - 0.18199 * cos(3 * z)) / N - }, - values: [], - correction: 1 - }, - hft95: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return (1.0 - 1.9383379 * cos(z) + 1.3045202 * cos(2 * z) - 0.402827 * cos(3 * z) + 0.0350665 * cos(4 * z)) / N - }, - values: [], - correction: 1 - }, - hft90d: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return (1.0 - 1.942604 * cos(z) + 1.340318 * cos(2 * z) - 0.440811 * cos(3 * z) + 0.043097 * cos(4 * z)) / N - }, - values: [], - correction: 1 - }, - hft116d: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return (1.0 - 1.9575375 * cos(z) + 1.4780705 * cos(2 * z) - 0.6367431 * cos(3 * z) + 0.1228389 * cos(4 * z) - 0.0066288 * cos(5 * z)) / N - }, - values: [], - correction: 1 - }, - hft144d: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return (1.0 - 1.96760033 * cos(z) + 1.57983607 * cos(2 * z) - 0.81123644 * cos(3 * z) + 0.22583558 * cos(4 * z) - 0.02773848 * cos(5 * z) + 0.0009036 * cos(6 * z)) / N - }, - values: [], - correction: 1 - }, - hft196d: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return (1.0 - 1.97441842 * cos(z) + 1.65409888 * cos(2 * z) - 0.95788186 * cos(3 * z) + 0.3367342 * cos(4 * z) - 0.06364621 * cos(5 * z) + 0.00521942 * cos(6 * z) - 0.00010599 * cos(7 * z)) / N - }, - values: [], - correction: 1 - }, - hft223d: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return (1.0 - 1.98298997309 * cos(z) + 1.75556083063 * cos(2 * z) - 1.19037717712 * cos(3 * z) + 0.56155440797 * cos(4 * z) - 0.17296769663 * cos(5 * z) + 0.03233247087 * cos(6 * z) - 0.00324954578 * cos(7 * z) + 0.00013801040 * cos(8 * z) - 0.00000132725 * cos(9 * z)) / N - }, - values: [], - correction: 1 - }, - hft248d: { - calc: function (n, N) { - var z = (PI2 * n) / (N - 1) - return (1.0 - 1.985844164102 * cos(z) + 1.791176438506 * cos(2 * z) - 1.282075284005 * cos(3 * z) + 0.667777530266 * cos(4 * z) - 0.240160796576 * cos(5 * z) + 0.056656381764 * cos(6 * z) - 0.008134974479 * cos(7 * z) + 0.00062454465 * cos(8 * z) - 0.000019808998 * cos(9 * z) + 0.000000132974 * cos(10 * z)) / N - }, - values: [], - correction: 1 - } - } + var windowCalculation = { + rectangular: { + calc: function () { + return 1 + }, + values: [], + correction: 1 + }, + none: { + calc: function () { + return 1 + }, + values: [], + correction: 1 + }, + hanning: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.5 * (1 - cos(z)) + }, + values: [], + correction: 2 + }, + hamming: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.54 - 0.46 * cos(z) + }, + values: [], + correction: 1.8518999946875638 + }, + tukery: { + calc: function (n, N, a) { + if (n < (a * (N - 1)) / 2) { + return 0.5 * (1 + cos(PI * (((2 * n) / (a * (N - 1))) - 1))) + } else if ((N - 1) * (1 - (a / 2)) < n) { + return 0.5 * (1 + cos(PI * (((2 * n) / (a * (N - 1))) - (2 / a) + 1))) + } else { + return 1 + } + }, + values: [], + correction: 4 / 3 + }, + cosine: { + calc: function (n, N) { + return sin((PI * n) / (N - 1)) + }, + values: [], + correction: 1.570844266360796 + }, + lanczos: { + calc: function (n, N) { + return sinc(((2 * n) / (N - 1)) - 1) + }, + values: [], + correction: 1.6964337576195783 + }, + triangular: { + calc: function (n, N) { + return (2 / (N + 1)) * (((N + 1) / 2) - abs(n - ((N - 1) / 2))) + }, + values: [], + correction: 2 + }, + bartlett: { + calc: function (n, N) { + return (2 / (N - 1)) * (((N - 1) / 2) - abs(n - ((N - 1) / 2))) + }, + values: [], + correction: 2 + }, + gaussian: { + calc: function (n, N, a) { + return pow(E, -0.5 * pow((n - (N - 1) / 2) / (a * (N - 1) / 2), 2)) + }, + values: [], + correction: 5 / 3 + }, + bartlettHanning: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.62 - 0.48 * abs((n / (N - 1)) - 0.5) - 0.38 * cos(z) + }, + values: [], + correction: 2 + }, + blackman: { + calc: function (n, N, a) { + var a0 = (1 - a) / 2 + var a1 = 0.5 + var a2 = a / 2 + var z = (PI2 * n) / (N - 1) + return a0 - a1 * cos(z) + a2 * cos(2 * z) + }, + values: [], + correction: 4 / 3 + }, + blackmanHarris: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.35875 - 0.48829 * cos(z) + 0.14128 * cos(2 * z) - 0.01168 * cos(3 * z) + }, + values: [], + correction: 1.5594508635 + }, + nuttall3: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.375 - 0.5 * cos(z) + 0.125 * cos(2 * z) + }, + values: [], + correction: 1.56 + }, + nuttall3a: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.40897 - 0.5 * cos(z) + 0.09103 * cos(2 * z) + }, + values: [], + correction: 1.692 + }, + nuttall3b: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.4243801 - 0.4973406 * cos(z) + 0.078793 * cos(2 * z) + }, + values: [], + correction: 1.7372527 + }, + nuttall4: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.3125 - 0.46875 * cos(z) + 0.1875 * cos(2 * z) - 0.03125 * cos(3 * z) + }, + values: [], + correction: 1.454543 + }, + nuttall4a: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.338946 - 0.481973 * cos(z) + 0.161054 * cos(2 * z) - 0.018027 * cos(3 * z) + }, + values: [], + correction: 1.512732763 + }, + nuttall4b: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.355768 - 0.481973 * cos(z) + 0.144232 * cos(2 * z) - 0.012604 * cos(3 * z) + }, + values: [], + correction: 1.55223262 + }, + nuttall4c: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.3635819 - 0.4891775 * cos(z) + 0.1365995 * cos(2 * z) - 0.0106411 * cos(3 * z) + }, + values: [], + correction: 1.57129067 + }, + // fast decaying flat top + sft3f: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.26526 - 0.5 * cos(z) + 0.23474 * cos(2 * z) + }, + values: [], + correction: 1.3610238 + }, + sft4f: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.21706 - 0.42103 * cos(z) + 0.28294 * cos(2 * z) - 0.07897 * cos(3 * z) + }, + values: [], + correction: 1.2773573 + }, + sft5f: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.1881 - 0.36923 * cos(z) + 0.28702 * cos(2 * z) - 0.13077 * cos(3 * z) + 0.02488 * cos(4 * z) + }, + values: [], + correction: 1.23167769 + }, + // minimum sidelobe flat top + sft3m: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.28235 - 0.52105 * cos(z) + 0.19659 * cos(2 * z) + }, + values: [], + correction: 1.39343451 + }, + sft4m: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.241906 - 0.460841 * cos(z) + 0.2552381 * cos(2 * z) - 0.041872 * cos(3 * z) + }, + values: [], + correction: 1.3190596 + }, + sft5m: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.209671 - 0.407331 * cos(z) + 0.281225 * cos(2 * z) - 0.092669 * cos(3 * z) + 0.0091036 * cos(4 * z) + }, + values: [], + correction: 1.26529456464 + }, + nift: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return 0.2810639 - 0.5208972 * cos(z) + 0.1980399 * cos(2 * z) + }, + values: [], + correction: 1.39094182 + }, + hpft: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return (1.0 - 1.912510941 * cos(z) + 1.079173272 * cos(2 * z) - 0.1832630879 * cos(3 * z)) / N + }, + values: [], + correction: 1 + }, + srft: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return (1.0 - 1.93 * cos(z) + 1.29 * cos(2 * z) - 0.388 * cos(3 * z) + 0.028 * cos(4 * z)) / N + }, + values: [], + correction: 1 + }, + hft70: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return (1.0 - 1.90796 * cos(z) + 1.07349 * cos(2 * z) - 0.18199 * cos(3 * z)) / N + }, + values: [], + correction: 1 + }, + hft95: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return (1.0 - 1.9383379 * cos(z) + 1.3045202 * cos(2 * z) - 0.402827 * cos(3 * z) + 0.0350665 * cos(4 * z)) / N + }, + values: [], + correction: 1 + }, + hft90d: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return (1.0 - 1.942604 * cos(z) + 1.340318 * cos(2 * z) - 0.440811 * cos(3 * z) + 0.043097 * cos(4 * z)) / N + }, + values: [], + correction: 1 + }, + hft116d: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return (1.0 - 1.9575375 * cos(z) + 1.4780705 * cos(2 * z) - 0.6367431 * cos(3 * z) + 0.1228389 * cos(4 * z) - 0.0066288 * cos(5 * z)) / N + }, + values: [], + correction: 1 + }, + hft144d: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return (1.0 - 1.96760033 * cos(z) + 1.57983607 * cos(2 * z) - 0.81123644 * cos(3 * z) + 0.22583558 * cos(4 * z) - 0.02773848 * cos(5 * z) + 0.0009036 * cos(6 * z)) / N + }, + values: [], + correction: 1 + }, + hft196d: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return (1.0 - 1.97441842 * cos(z) + 1.65409888 * cos(2 * z) - 0.95788186 * cos(3 * z) + 0.3367342 * cos(4 * z) - 0.06364621 * cos(5 * z) + 0.00521942 * cos(6 * z) - 0.00010599 * cos(7 * z)) / N + }, + values: [], + correction: 1 + }, + hft223d: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return (1.0 - 1.98298997309 * cos(z) + 1.75556083063 * cos(2 * z) - 1.19037717712 * cos(3 * z) + 0.56155440797 * cos(4 * z) - 0.17296769663 * cos(5 * z) + 0.03233247087 * cos(6 * z) - 0.00324954578 * cos(7 * z) + 0.00013801040 * cos(8 * z) - 0.00000132725 * cos(9 * z)) / N + }, + values: [], + correction: 1 + }, + hft248d: { + calc: function (n, N) { + var z = (PI2 * n) / (N - 1) + return (1.0 - 1.985844164102 * cos(z) + 1.791176438506 * cos(2 * z) - 1.282075284005 * cos(3 * z) + 0.667777530266 * cos(4 * z) - 0.240160796576 * cos(5 * z) + 0.056656381764 * cos(6 * z) - 0.008134974479 * cos(7 * z) + 0.00062454465 * cos(8 * z) - 0.000019808998 * cos(9 * z) + 0.000000132974 * cos(10 * z)) / N + }, + values: [], + correction: 1 + } + } - var windowFunctions = function (params) { - if (windowCalculation[params.name].values.length !== params.N) { - if (params.n === 0) { - windowCalculation[params.name].values.length = 0 - } - windowCalculation[params.name].values[params.n] = windowCalculation[params.name].correction * windowCalculation[params.name].calc(params.n, params.N, params.a) - return windowCalculation[params.name].values[params.n] - } - return windowCalculation[params.name].values - } + var windowFunctions = function (params) { + if (windowCalculation[params.name].values.length !== params.N) { + if (params.n === 0) { + windowCalculation[params.name].values.length = 0 + } + windowCalculation[params.name].values[params.n] = windowCalculation[params.name].correction * windowCalculation[params.name].calc(params.n, params.N, params.a) + return windowCalculation[params.name].values[params.n] + } + return windowCalculation[params.name].values + } - var self = { - forward: function (b, window) { - var i, j, n, k, k2, h, d, c, s, ik, dx, dy - n = fft.buffer.length - var winFunction = { - name: window, - N: n, - a: 0.5, - n: 0 - } - var w = windowFunctions(winFunction) - if (typeof w === 'number') { - for (i = 0; i < n; ++i) { - winFunction.n = i - fft.buffer[i] = b[i] * windowFunctions(winFunction) - } - } else { - for (i = 0; i < n; ++i) { - fft.buffer[i] = b[i] * w[i] - } - } + var zeroPad = function (buffer, fftLength) { + if (fftLength > buffer.length) { + console.log('buffer: ', buffer.length, ' fftLength: ', fftLength, ' output: ', buffer.concat(new Array(fftLength - buffer.length).fill(0)).length) + return buffer.concat(new Array(fftLength - buffer.length).fill(0)) + } + return buffer + } - for (i = n; i--;) { - fft.re[i] = fft.buffer[fft.twiddle[i]] - fft.im[i] = 0.0 - } + var self = { + forward: function (b, window) { + var i, j, n, k, k2, h, d, c, s, ik, dx, dy + n = fft.buffer.length + var winFunction = { + name: window, + N: n, + a: 0.5, + n: 0 + } + b = zeroPad(b, n) + var w = windowFunctions(winFunction) + if (typeof w === 'number') { + for (i = 0; i < n; ++i) { + winFunction.n = i + fft.buffer[i] = b[i] * windowFunctions(winFunction) + } + } else { + for (i = 0; i < n; ++i) { + fft.buffer[i] = b[i] * w[i] + } + } - for (k = 1; k < n; k = k2) { - h = 0 - k2 = k + k - d = n / k2 - for (j = 0; j < k; j++) { - c = fft.cosTable[h] - s = fft.sinTable[h] - for (i = j; i < n; i += k2) { - ik = i + k - dx = s * fft.im[ik] + c * fft.re[ik] - dy = c * fft.im[ik] - s * fft.re[ik] - fft.re[ik] = fft.re[i] - dx - fft.re[i] += dx - fft.im[ik] = fft.im[i] - dy - fft.im[i] += dy - } - h += d - } - } - return { - re: fft.re, - im: fft.im - } - }, - inverse: function (re, im) { - var i, j, n, k, k2, h, d, c, s, ik, dx, dy - n = re.length - for (i = n; i--;) { - j = fft.twiddle[i] - fft.reI[i] = re[j] - fft.imI[i] = -im[j] - } + for (i = n; i--;) { + fft.re[i] = fft.buffer[fft.twiddle[i]] + fft.im[i] = 0.0 + } - for (k = 1; k < n; k = k2) { - h = 0 - k2 = k + k - d = n / k2 - for (j = 0; j < k; j++) { - c = fft.cosTable[h] - s = fft.sinTable[h] - for (i = j; i < n; i += k2) { - ik = i + k - dx = s * fft.imI[ik] + c * fft.reI[ik] - dy = c * fft.imI[ik] - s * fft.reI[ik] - fft.reI[ik] = fft.reI[i] - dx - fft.reI[i] += dx - fft.imI[ik] = fft.imI[i] - dy - fft.imI[i] += dy - } - h += d - } - } + for (k = 1; k < n; k = k2) { + h = 0 + k2 = k + k + d = n / k2 + for (j = 0; j < k; j++) { + c = fft.cosTable[h] + s = fft.sinTable[h] + for (i = j; i < n; i += k2) { + ik = i + k + dx = s * fft.im[ik] + c * fft.re[ik] + dy = c * fft.im[ik] - s * fft.re[ik] + fft.re[ik] = fft.re[i] - dx + fft.re[i] += dx + fft.im[ik] = fft.im[i] - dy + fft.im[i] += dy + } + h += d + } + } + return { + re: fft.re, + im: fft.im + } + }, + inverse: function (re, im) { + var i, j, n, k, k2, h, d, c, s, ik, dx, dy + n = re.length + for (i = n; i--;) { + j = fft.twiddle[i] + fft.reI[i] = re[j] + fft.imI[i] = -im[j] + } - for (i = n; i--;) { - fft.buffer[i] = fft.reI[i] / n - } - return fft.buffer - }, - magnitude: function (params) { - var ret = [] - for (var cnt = 0; cnt < params.re.length; cnt++) { - ret.push(Math.sqrt(params.re[cnt] * params.re[cnt] + params.im[cnt] * params.im[cnt])) - } - return ret - }, - magToDb: function (b) { - var ret = [] - for (var cnt = 0; cnt < b.length; cnt++) { - ret.push(20 * Math.log(b[cnt]) * Math.LOG10E) - } - return ret - }, - phase: function (params) { - var ret = [] - for (var cnt = 0; cnt < params.re.length; cnt++) { - ret.push(Math.atan2(params.im[cnt], params.re[cnt])) - } - return ret - }, - windows: function () { - var winFuncs = [] - for (var k in windowCalculation) { - winFuncs.push(k) - } - return winFuncs - } - } - return self - } + for (k = 1; k < n; k = k2) { + h = 0 + k2 = k + k + d = n / k2 + for (j = 0; j < k; j++) { + c = fft.cosTable[h] + s = fft.sinTable[h] + for (i = j; i < n; i += k2) { + ik = i + k + dx = s * fft.imI[ik] + c * fft.reI[ik] + dy = c * fft.imI[ik] - s * fft.reI[ik] + fft.reI[ik] = fft.reI[i] - dx + fft.reI[i] += dx + fft.imI[ik] = fft.imI[i] - dy + fft.imI[i] += dy + } + h += d + } + } - module.exports = Fft + for (i = n; i--;) { + fft.buffer[i] = fft.reI[i] / n + } + return fft.buffer + }, + magnitude: function (params) { + var ret = [] + for (var cnt = 0; cnt < params.re.length; cnt++) { + ret.push(Math.sqrt(params.re[cnt] * params.re[cnt] + params.im[cnt] * params.im[cnt])) + } + return ret + }, + magToDb: function (b) { + var ret = [] + for (var cnt = 0; cnt < b.length; cnt++) { + ret.push(20 * Math.log(b[cnt]) * Math.LOG10E) + } + return ret + }, + phase: function (params) { + var ret = [] + for (var cnt = 0; cnt < params.re.length; cnt++) { + ret.push(Math.atan2(params.im[cnt], params.re[cnt])) + } + return ret + }, + windows: function () { + var winFuncs = [] + for (var k in windowCalculation) { + winFuncs.push(k) + } + return winFuncs + } + } + return self +} + +module.exports = Fft diff --git a/test/fft.js b/test/fft.js index f372d58..fa27a44 100644 --- a/test/fft.js +++ b/test/fft.js @@ -65,6 +65,18 @@ describe('fft.js', function () { fftResult.im[133].should.be.a.Number } }) + + it('can handle input requiring zeropadding', function () { + var shortSinewave = [] + for (var cnt = 0; cnt < 500; cnt++) { + shortSinewave.push(Math.sin(2 * Math.PI * (113.33232 * cnt / 500))) + } + fftResult = fftCalc.forward(shortSinewave, 'hanning') + fftResult.re.length.should.equal(8192) + fftResult.im.length.should.equal(8192) + fftResult.re[133].should.be.a.Number + fftResult.im[133].should.be.a.Number + }) }) describe('fft_helpers', function () { From 50b4d0ce45da57eb4ad78779e87c907295684731 Mon Sep 17 00:00:00 2001 From: jdpigeon Date: Sat, 3 Mar 2018 13:40:46 -0500 Subject: [PATCH 2/2] referenced zeropadding in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 233281d..44669b3 100644 --- a/README.md +++ b/README.md @@ -266,7 +266,7 @@ for (var cnt = 0; cnt < 8192; cnt++) { // get available window functions var availableWindows = fft.windows(); -// buffer.length must be greater or equal fft radix +// if buffer.length < fft radix, buffer will be zeropadded var fftResult = fft.forward(buffer, 'hanning'); // fftResult = {re: [], im: []}. The array length equals the FFT radix