kfr

Fast, modern C++ DSP framework, FFT, Sample Rate Conversion, FIR/IIR/Biquad Filters (SSE, AVX, AVX-512, ARM NEON)
Log | Files | Refs | README

commit 809b4bf1ddbc97373a9ece7c5237033c9763d2ae
parent aa8dd2326d805f0a4c21e3d88d27c4ad25ad8ed2
Author: [email protected] <[email protected]>
Date:   Tue, 26 Jul 2016 20:46:36 +0300

data/sincos.hpp: Reduce table size

Diffstat:
Minclude/kfr/data/sincos.hpp | 209+++++--------------------------------------------------------------------------
1 file changed, 12 insertions(+), 197 deletions(-)

diff --git a/include/kfr/data/sincos.hpp b/include/kfr/data/sincos.hpp @@ -33,7 +33,7 @@ namespace data // data generated by mpfr template <typename T> -constexpr T c_sin_table[256] = { +constexpr T c_sin_table[64] = { /* sin(2*pi* 0/ 256) */ T(0.0), /* sin(2*pi* 1/ 256) */ T(0.02454122852291228803173452945928292506547), /* sin(2*pi* 2/ 256) */ T(0.04906767432741801425495497694268265831475), @@ -97,208 +97,23 @@ constexpr T c_sin_table[256] = { /* sin(2*pi* 60/ 256) */ T(0.9951847266721968862448369531094799215755), /* sin(2*pi* 61/ 256) */ T(0.9972904566786902161355971401825678211717), /* sin(2*pi* 62/ 256) */ T(0.9987954562051723927147716047591006944432), - /* sin(2*pi* 63/ 256) */ T(0.9996988186962042201157656496661721968501), - /* sin(2*pi* 64/ 256) */ T(1.0), - /* sin(2*pi* 65/ 256) */ T(0.9996988186962042201157656496661721968501), - /* sin(2*pi* 66/ 256) */ T(0.9987954562051723927147716047591006944432), - /* sin(2*pi* 67/ 256) */ T(0.9972904566786902161355971401825678211717), - /* sin(2*pi* 68/ 256) */ T(0.9951847266721968862448369531094799215755), - /* sin(2*pi* 69/ 256) */ T(0.9924795345987099981567672516611178200108), - /* sin(2*pi* 70/ 256) */ T(0.9891765099647809734516737380162430639837), - /* sin(2*pi* 71/ 256) */ T(0.9852776423889412447740184331785477871601), - /* sin(2*pi* 72/ 256) */ T(0.9807852804032304491261822361342390369739), - /* sin(2*pi* 73/ 256) */ T(0.975702130038528544460395766419527971644), - /* sin(2*pi* 74/ 256) */ T(0.9700312531945439926039842072861002514569), - /* sin(2*pi* 75/ 256) */ T(0.9637760657954398666864643555078351536631), - /* sin(2*pi* 76/ 256) */ T(0.9569403357322088649357978869802699694828), - /* sin(2*pi* 77/ 256) */ T(0.9495281805930366671959360741893450282522), - /* sin(2*pi* 78/ 256) */ T(0.9415440651830207784125094025995023571856), - /* sin(2*pi* 79/ 256) */ T(0.932992798834738887711660255543302498295), - /* sin(2*pi* 80/ 256) */ T(0.9238795325112867561281831893967882868224), - /* sin(2*pi* 81/ 256) */ T(0.9142097557035306546350148293935774010447), - /* sin(2*pi* 82/ 256) */ T(0.9039892931234433315862002972305370487101), - /* sin(2*pi* 83/ 256) */ T(0.8932243011955153203424164474933979780006), - /* sin(2*pi* 84/ 256) */ T(0.8819212643483550297127568636603883495084), - /* sin(2*pi* 85/ 256) */ T(0.8700869911087114186522924044838488439108), - /* sin(2*pi* 86/ 256) */ T(0.8577286100002720699022699842847701370425), - /* sin(2*pi* 87/ 256) */ T(0.8448535652497070732595712051049570977198), - /* sin(2*pi* 88/ 256) */ T(0.8314696123025452370787883776179057567386), - /* sin(2*pi* 89/ 256) */ T(0.817584813151583696504920884130633809471), - /* sin(2*pi* 90/ 256) */ T(0.8032075314806449098066765129631419238796), - /* sin(2*pi* 91/ 256) */ T(0.7883464276266062620091647053596892826565), - /* sin(2*pi* 92/ 256) */ T(0.773010453362736960810906609758469800971), - /* sin(2*pi* 93/ 256) */ T(0.7572088465064845475754640536057844730404), - /* sin(2*pi* 94/ 256) */ T(0.740951125354959091175616897495162729729), - /* sin(2*pi* 95/ 256) */ T(0.7242470829514669209410692432905531674831), - /* sin(2*pi* 96/ 256) */ T(0.7071067811865475244008443621048490392848), - /* sin(2*pi* 97/ 256) */ T(0.6895405447370669246167306299574847028455), - /* sin(2*pi* 98/ 256) */ T(0.6715589548470184006253768504274218032288), - /* sin(2*pi* 99/ 256) */ T(0.6531728429537767640842030136563054150769), - /* sin(2*pi* 100/ 256) */ T(0.6343932841636454982151716132254933706757), - /* sin(2*pi* 101/ 256) */ T(0.6152315905806268454849135634139842776594), - /* sin(2*pi* 102/ 256) */ T(0.5956993044924333434670365288299698895119), - /* sin(2*pi* 103/ 256) */ T(0.575808191417845300745972453815730841776), - /* sin(2*pi* 104/ 256) */ T(0.5555702330196022247428308139485328743749), - /* sin(2*pi* 105/ 256) */ T(0.5349976198870972106630769046370179155603), - /* sin(2*pi* 106/ 256) */ T(0.514102744193221726593693838968815772608), - /* sin(2*pi* 107/ 256) */ T(0.4928981922297840368730266887588092682397), - /* sin(2*pi* 108/ 256) */ T(0.4713967368259976485563876259052543776575), - /* sin(2*pi* 109/ 256) */ T(0.4496113296546066000462945794242270758832), - /* sin(2*pi* 110/ 256) */ T(0.4275550934302820943209668568887985343046), - /* sin(2*pi* 111/ 256) */ T(0.4052413140049898709084813055050524665119), - /* sin(2*pi* 112/ 256) */ T(0.3826834323650897717284599840303988667613), - /* sin(2*pi* 113/ 256) */ T(0.3598950365349881487751045723267564202023), - /* sin(2*pi* 114/ 256) */ T(0.3368898533922200506892532126191475704778), - /* sin(2*pi* 115/ 256) */ T(0.3136817403988914766564788459941003099934), - /* sin(2*pi* 116/ 256) */ T(0.2902846772544623676361923758173952746915), - /* sin(2*pi* 117/ 256) */ T(0.2667127574748983863252865151164363940421), - /* sin(2*pi* 118/ 256) */ T(0.242980179903263889948274162077471118321), - /* sin(2*pi* 119/ 256) */ T(0.2191012401568697972277375474973577988484), - /* sin(2*pi* 120/ 256) */ T(0.1950903220161282678482848684770222409277), - /* sin(2*pi* 121/ 256) */ T(0.1709618887603012263636423572082635319663), - /* sin(2*pi* 122/ 256) */ T(0.1467304744553617516588501296467178197062), - /* sin(2*pi* 123/ 256) */ T(0.1224106751992161984987044741509457875752), - /* sin(2*pi* 124/ 256) */ T(0.09801714032956060199419556388864184586114), - /* sin(2*pi* 125/ 256) */ T(0.0735645635996674235294656215752343218133), - /* sin(2*pi* 126/ 256) */ T(0.04906767432741801425495497694268265831475), - /* sin(2*pi* 127/ 256) */ T(0.02454122852291228803173452945928292506547), - /* sin(2*pi* 128/ 256) */ T(0.0), - /* sin(2*pi* 129/ 256) */ T(-0.02454122852291228803173452945928292506547), - /* sin(2*pi* 130/ 256) */ T(-0.04906767432741801425495497694268265831475), - /* sin(2*pi* 131/ 256) */ T(-0.0735645635996674235294656215752343218133), - /* sin(2*pi* 132/ 256) */ T(-0.09801714032956060199419556388864184586114), - /* sin(2*pi* 133/ 256) */ T(-0.1224106751992161984987044741509457875752), - /* sin(2*pi* 134/ 256) */ T(-0.1467304744553617516588501296467178197062), - /* sin(2*pi* 135/ 256) */ T(-0.1709618887603012263636423572082635319663), - /* sin(2*pi* 136/ 256) */ T(-0.1950903220161282678482848684770222409277), - /* sin(2*pi* 137/ 256) */ T(-0.2191012401568697972277375474973577988484), - /* sin(2*pi* 138/ 256) */ T(-0.242980179903263889948274162077471118321), - /* sin(2*pi* 139/ 256) */ T(-0.2667127574748983863252865151164363940421), - /* sin(2*pi* 140/ 256) */ T(-0.2902846772544623676361923758173952746915), - /* sin(2*pi* 141/ 256) */ T(-0.3136817403988914766564788459941003099934), - /* sin(2*pi* 142/ 256) */ T(-0.3368898533922200506892532126191475704778), - /* sin(2*pi* 143/ 256) */ T(-0.3598950365349881487751045723267564202023), - /* sin(2*pi* 144/ 256) */ T(-0.3826834323650897717284599840303988667613), - /* sin(2*pi* 145/ 256) */ T(-0.4052413140049898709084813055050524665119), - /* sin(2*pi* 146/ 256) */ T(-0.4275550934302820943209668568887985343046), - /* sin(2*pi* 147/ 256) */ T(-0.4496113296546066000462945794242270758832), - /* sin(2*pi* 148/ 256) */ T(-0.4713967368259976485563876259052543776575), - /* sin(2*pi* 149/ 256) */ T(-0.4928981922297840368730266887588092682397), - /* sin(2*pi* 150/ 256) */ T(-0.514102744193221726593693838968815772608), - /* sin(2*pi* 151/ 256) */ T(-0.5349976198870972106630769046370179155603), - /* sin(2*pi* 152/ 256) */ T(-0.5555702330196022247428308139485328743749), - /* sin(2*pi* 153/ 256) */ T(-0.575808191417845300745972453815730841776), - /* sin(2*pi* 154/ 256) */ T(-0.5956993044924333434670365288299698895119), - /* sin(2*pi* 155/ 256) */ T(-0.6152315905806268454849135634139842776594), - /* sin(2*pi* 156/ 256) */ T(-0.6343932841636454982151716132254933706757), - /* sin(2*pi* 157/ 256) */ T(-0.6531728429537767640842030136563054150769), - /* sin(2*pi* 158/ 256) */ T(-0.6715589548470184006253768504274218032288), - /* sin(2*pi* 159/ 256) */ T(-0.6895405447370669246167306299574847028455), - /* sin(2*pi* 160/ 256) */ T(-0.7071067811865475244008443621048490392848), - /* sin(2*pi* 161/ 256) */ T(-0.7242470829514669209410692432905531674831), - /* sin(2*pi* 162/ 256) */ T(-0.740951125354959091175616897495162729729), - /* sin(2*pi* 163/ 256) */ T(-0.7572088465064845475754640536057844730404), - /* sin(2*pi* 164/ 256) */ T(-0.773010453362736960810906609758469800971), - /* sin(2*pi* 165/ 256) */ T(-0.7883464276266062620091647053596892826565), - /* sin(2*pi* 166/ 256) */ T(-0.8032075314806449098066765129631419238796), - /* sin(2*pi* 167/ 256) */ T(-0.817584813151583696504920884130633809471), - /* sin(2*pi* 168/ 256) */ T(-0.8314696123025452370787883776179057567386), - /* sin(2*pi* 169/ 256) */ T(-0.8448535652497070732595712051049570977198), - /* sin(2*pi* 170/ 256) */ T(-0.8577286100002720699022699842847701370425), - /* sin(2*pi* 171/ 256) */ T(-0.8700869911087114186522924044838488439108), - /* sin(2*pi* 172/ 256) */ T(-0.8819212643483550297127568636603883495084), - /* sin(2*pi* 173/ 256) */ T(-0.8932243011955153203424164474933979780006), - /* sin(2*pi* 174/ 256) */ T(-0.9039892931234433315862002972305370487101), - /* sin(2*pi* 175/ 256) */ T(-0.9142097557035306546350148293935774010447), - /* sin(2*pi* 176/ 256) */ T(-0.9238795325112867561281831893967882868224), - /* sin(2*pi* 177/ 256) */ T(-0.932992798834738887711660255543302498295), - /* sin(2*pi* 178/ 256) */ T(-0.9415440651830207784125094025995023571856), - /* sin(2*pi* 179/ 256) */ T(-0.9495281805930366671959360741893450282522), - /* sin(2*pi* 180/ 256) */ T(-0.9569403357322088649357978869802699694828), - /* sin(2*pi* 181/ 256) */ T(-0.9637760657954398666864643555078351536631), - /* sin(2*pi* 182/ 256) */ T(-0.9700312531945439926039842072861002514569), - /* sin(2*pi* 183/ 256) */ T(-0.975702130038528544460395766419527971644), - /* sin(2*pi* 184/ 256) */ T(-0.9807852804032304491261822361342390369739), - /* sin(2*pi* 185/ 256) */ T(-0.9852776423889412447740184331785477871601), - /* sin(2*pi* 186/ 256) */ T(-0.9891765099647809734516737380162430639837), - /* sin(2*pi* 187/ 256) */ T(-0.9924795345987099981567672516611178200108), - /* sin(2*pi* 188/ 256) */ T(-0.9951847266721968862448369531094799215755), - /* sin(2*pi* 189/ 256) */ T(-0.9972904566786902161355971401825678211717), - /* sin(2*pi* 190/ 256) */ T(-0.9987954562051723927147716047591006944432), - /* sin(2*pi* 191/ 256) */ T(-0.9996988186962042201157656496661721968501), - /* sin(2*pi* 192/ 256) */ T(-1.0), - /* sin(2*pi* 193/ 256) */ T(-0.9996988186962042201157656496661721968501), - /* sin(2*pi* 194/ 256) */ T(-0.9987954562051723927147716047591006944432), - /* sin(2*pi* 195/ 256) */ T(-0.9972904566786902161355971401825678211717), - /* sin(2*pi* 196/ 256) */ T(-0.9951847266721968862448369531094799215755), - /* sin(2*pi* 197/ 256) */ T(-0.9924795345987099981567672516611178200108), - /* sin(2*pi* 198/ 256) */ T(-0.9891765099647809734516737380162430639837), - /* sin(2*pi* 199/ 256) */ T(-0.9852776423889412447740184331785477871601), - /* sin(2*pi* 200/ 256) */ T(-0.9807852804032304491261822361342390369739), - /* sin(2*pi* 201/ 256) */ T(-0.975702130038528544460395766419527971644), - /* sin(2*pi* 202/ 256) */ T(-0.9700312531945439926039842072861002514569), - /* sin(2*pi* 203/ 256) */ T(-0.9637760657954398666864643555078351536631), - /* sin(2*pi* 204/ 256) */ T(-0.9569403357322088649357978869802699694828), - /* sin(2*pi* 205/ 256) */ T(-0.9495281805930366671959360741893450282522), - /* sin(2*pi* 206/ 256) */ T(-0.9415440651830207784125094025995023571856), - /* sin(2*pi* 207/ 256) */ T(-0.932992798834738887711660255543302498295), - /* sin(2*pi* 208/ 256) */ T(-0.9238795325112867561281831893967882868224), - /* sin(2*pi* 209/ 256) */ T(-0.9142097557035306546350148293935774010447), - /* sin(2*pi* 210/ 256) */ T(-0.9039892931234433315862002972305370487101), - /* sin(2*pi* 211/ 256) */ T(-0.8932243011955153203424164474933979780006), - /* sin(2*pi* 212/ 256) */ T(-0.8819212643483550297127568636603883495084), - /* sin(2*pi* 213/ 256) */ T(-0.8700869911087114186522924044838488439108), - /* sin(2*pi* 214/ 256) */ T(-0.8577286100002720699022699842847701370425), - /* sin(2*pi* 215/ 256) */ T(-0.8448535652497070732595712051049570977198), - /* sin(2*pi* 216/ 256) */ T(-0.8314696123025452370787883776179057567386), - /* sin(2*pi* 217/ 256) */ T(-0.817584813151583696504920884130633809471), - /* sin(2*pi* 218/ 256) */ T(-0.8032075314806449098066765129631419238796), - /* sin(2*pi* 219/ 256) */ T(-0.7883464276266062620091647053596892826565), - /* sin(2*pi* 220/ 256) */ T(-0.773010453362736960810906609758469800971), - /* sin(2*pi* 221/ 256) */ T(-0.7572088465064845475754640536057844730404), - /* sin(2*pi* 222/ 256) */ T(-0.740951125354959091175616897495162729729), - /* sin(2*pi* 223/ 256) */ T(-0.7242470829514669209410692432905531674831), - /* sin(2*pi* 224/ 256) */ T(-0.7071067811865475244008443621048490392848), - /* sin(2*pi* 225/ 256) */ T(-0.6895405447370669246167306299574847028455), - /* sin(2*pi* 226/ 256) */ T(-0.6715589548470184006253768504274218032288), - /* sin(2*pi* 227/ 256) */ T(-0.6531728429537767640842030136563054150769), - /* sin(2*pi* 228/ 256) */ T(-0.6343932841636454982151716132254933706757), - /* sin(2*pi* 229/ 256) */ T(-0.6152315905806268454849135634139842776594), - /* sin(2*pi* 230/ 256) */ T(-0.5956993044924333434670365288299698895119), - /* sin(2*pi* 231/ 256) */ T(-0.575808191417845300745972453815730841776), - /* sin(2*pi* 232/ 256) */ T(-0.5555702330196022247428308139485328743749), - /* sin(2*pi* 233/ 256) */ T(-0.5349976198870972106630769046370179155603), - /* sin(2*pi* 234/ 256) */ T(-0.514102744193221726593693838968815772608), - /* sin(2*pi* 235/ 256) */ T(-0.4928981922297840368730266887588092682397), - /* sin(2*pi* 236/ 256) */ T(-0.4713967368259976485563876259052543776575), - /* sin(2*pi* 237/ 256) */ T(-0.4496113296546066000462945794242270758832), - /* sin(2*pi* 238/ 256) */ T(-0.4275550934302820943209668568887985343046), - /* sin(2*pi* 239/ 256) */ T(-0.4052413140049898709084813055050524665119), - /* sin(2*pi* 240/ 256) */ T(-0.3826834323650897717284599840303988667613), - /* sin(2*pi* 241/ 256) */ T(-0.3598950365349881487751045723267564202023), - /* sin(2*pi* 242/ 256) */ T(-0.3368898533922200506892532126191475704778), - /* sin(2*pi* 243/ 256) */ T(-0.3136817403988914766564788459941003099934), - /* sin(2*pi* 244/ 256) */ T(-0.2902846772544623676361923758173952746915), - /* sin(2*pi* 245/ 256) */ T(-0.2667127574748983863252865151164363940421), - /* sin(2*pi* 246/ 256) */ T(-0.242980179903263889948274162077471118321), - /* sin(2*pi* 247/ 256) */ T(-0.2191012401568697972277375474973577988484), - /* sin(2*pi* 248/ 256) */ T(-0.1950903220161282678482848684770222409277), - /* sin(2*pi* 249/ 256) */ T(-0.1709618887603012263636423572082635319663), - /* sin(2*pi* 250/ 256) */ T(-0.1467304744553617516588501296467178197062), - /* sin(2*pi* 251/ 256) */ T(-0.1224106751992161984987044741509457875752), - /* sin(2*pi* 252/ 256) */ T(-0.09801714032956060199419556388864184586114), - /* sin(2*pi* 253/ 256) */ T(-0.0735645635996674235294656215752343218133), - /* sin(2*pi* 254/ 256) */ T(-0.04906767432741801425495497694268265831475), - /* sin(2*pi* 255/ 256) */ T(-0.02454122852291228803173452945928292506547), - + /* sin(2*pi* 63/ 256) */ T(0.9996988186962042201157656496661721968501) }; } template <typename T> +constexpr inline T sin_using_table_256(size_t k) +{ + return (k == 0 || k == 128) ? T(0) : (k == 64) ? T(1) : (k > 128) + ? -sin_using_table_256<T>(k - 128) + : (k > 64) ? sin_using_table_256<T>(128 - k) + : data::c_sin_table<T>[k]; +} + +template <typename T> constexpr inline T sin_using_table(size_t size, size_t k) { - constexpr size_t table_size = arraysize(data::c_sin_table<T>); - return data::c_sin_table<T>[(k * table_size / size) % table_size]; + return sin_using_table_256<T>((k * 256 / size) % 256); } template <typename T> constexpr inline T cos_using_table(size_t size, size_t k)