| /* |
| * Copyright (c) 2016, Intel Corporation |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * * Neither the name of the Intel Corporation nor the |
| * names of its contributors may be used to endorse or promote products |
| * derived from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGE. |
| * |
| * Author: Seppo Ingalsuo <seppo.ingalsuo@linux.intel.com> |
| * Liam Girdwood <liam.r.girdwood@linux.intel.com> |
| * Keyon Jie <yang.jie@linux.intel.com> |
| */ |
| |
| #include <stdint.h> |
| #include <sof/audio/format.h> |
| #include <sof/math/trig.h> |
| |
| |
| #define SINE_C_Q20 341782638 /* 2*SINE_NQUART/pi in Q12.20 */ |
| #define SINE_NQUART 512 /* Must be 2^N */ |
| #define SINE_TABLE_SIZE (SINE_NQUART+1) |
| |
| /* An 1/4 period of sine wave as Q1.31 */ |
| const int32_t sine_table[SINE_TABLE_SIZE] = { |
| 0, |
| 6588387, |
| 13176712, |
| 19764913, |
| 26352928, |
| 32940695, |
| 39528151, |
| 46115236, |
| 52701887, |
| 59288042, |
| 65873638, |
| 72458615, |
| 79042909, |
| 85626460, |
| 92209205, |
| 98791081, |
| 105372028, |
| 111951983, |
| 118530885, |
| 125108670, |
| 131685278, |
| 138260647, |
| 144834714, |
| 151407418, |
| 157978697, |
| 164548489, |
| 171116732, |
| 177683365, |
| 184248325, |
| 190811551, |
| 197372981, |
| 203932553, |
| 210490206, |
| 217045877, |
| 223599506, |
| 230151030, |
| 236700388, |
| 243247517, |
| 249792358, |
| 256334847, |
| 262874923, |
| 269412525, |
| 275947592, |
| 282480061, |
| 289009871, |
| 295536961, |
| 302061269, |
| 308582734, |
| 315101294, |
| 321616889, |
| 328129457, |
| 334638936, |
| 341145265, |
| 347648383, |
| 354148229, |
| 360644742, |
| 367137860, |
| 373627523, |
| 380113669, |
| 386596237, |
| 393075166, |
| 399550396, |
| 406021864, |
| 412489512, |
| 418953276, |
| 425413098, |
| 431868915, |
| 438320667, |
| 444768293, |
| 451211734, |
| 457650927, |
| 464085813, |
| 470516330, |
| 476942419, |
| 483364019, |
| 489781069, |
| 496193509, |
| 502601279, |
| 509004318, |
| 515402566, |
| 521795963, |
| 528184448, |
| 534567963, |
| 540946445, |
| 547319836, |
| 553688076, |
| 560051103, |
| 566408860, |
| 572761285, |
| 579108319, |
| 585449903, |
| 591785976, |
| 598116478, |
| 604441351, |
| 610760535, |
| 617073970, |
| 623381597, |
| 629683357, |
| 635979190, |
| 642269036, |
| 648552837, |
| 654830534, |
| 661102068, |
| 667367379, |
| 673626408, |
| 679879097, |
| 686125386, |
| 692365218, |
| 698598533, |
| 704825272, |
| 711045377, |
| 717258790, |
| 723465451, |
| 729665303, |
| 735858287, |
| 742044345, |
| 748223418, |
| 754395449, |
| 760560379, |
| 766718151, |
| 772868706, |
| 779011986, |
| 785147934, |
| 791276492, |
| 797397602, |
| 803511207, |
| 809617248, |
| 815715670, |
| 821806413, |
| 827889421, |
| 833964637, |
| 840032003, |
| 846091463, |
| 852142959, |
| 858186434, |
| 864221832, |
| 870249095, |
| 876268167, |
| 882278991, |
| 888281511, |
| 894275670, |
| 900261412, |
| 906238681, |
| 912207419, |
| 918167571, |
| 924119082, |
| 930061894, |
| 935995952, |
| 941921200, |
| 947837582, |
| 953745043, |
| 959643527, |
| 965532978, |
| 971413341, |
| 977284561, |
| 983146583, |
| 988999351, |
| 994842809, |
| 1000676905, |
| 1006501581, |
| 1012316784, |
| 1018122458, |
| 1023918549, |
| 1029705003, |
| 1035481765, |
| 1041248781, |
| 1047005996, |
| 1052753356, |
| 1058490807, |
| 1064218296, |
| 1069935767, |
| 1075643168, |
| 1081340445, |
| 1087027543, |
| 1092704410, |
| 1098370992, |
| 1104027236, |
| 1109673088, |
| 1115308496, |
| 1120933406, |
| 1126547765, |
| 1132151521, |
| 1137744620, |
| 1143327011, |
| 1148898640, |
| 1154459455, |
| 1160009404, |
| 1165548435, |
| 1171076495, |
| 1176593532, |
| 1182099495, |
| 1187594332, |
| 1193077990, |
| 1198550419, |
| 1204011566, |
| 1209461381, |
| 1214899812, |
| 1220326808, |
| 1225742318, |
| 1231146290, |
| 1236538675, |
| 1241919421, |
| 1247288477, |
| 1252645793, |
| 1257991319, |
| 1263325005, |
| 1268646799, |
| 1273956652, |
| 1279254515, |
| 1284540337, |
| 1289814068, |
| 1295075658, |
| 1300325059, |
| 1305562221, |
| 1310787095, |
| 1315999631, |
| 1321199780, |
| 1326387493, |
| 1331562722, |
| 1336725418, |
| 1341875532, |
| 1347013016, |
| 1352137822, |
| 1357249900, |
| 1362349204, |
| 1367435684, |
| 1372509294, |
| 1377569985, |
| 1382617710, |
| 1387652421, |
| 1392674071, |
| 1397682613, |
| 1402677999, |
| 1407660183, |
| 1412629117, |
| 1417584755, |
| 1422527050, |
| 1427455956, |
| 1432371426, |
| 1437273414, |
| 1442161874, |
| 1447036759, |
| 1451898025, |
| 1456745625, |
| 1461579513, |
| 1466399644, |
| 1471205973, |
| 1475998455, |
| 1480777044, |
| 1485541695, |
| 1490292364, |
| 1495029005, |
| 1499751575, |
| 1504460029, |
| 1509154322, |
| 1513834410, |
| 1518500249, |
| 1523151796, |
| 1527789006, |
| 1532411836, |
| 1537020243, |
| 1541614182, |
| 1546193612, |
| 1550758488, |
| 1555308767, |
| 1559844407, |
| 1564365366, |
| 1568871600, |
| 1573363067, |
| 1577839726, |
| 1582301533, |
| 1586748446, |
| 1591180425, |
| 1595597427, |
| 1599999410, |
| 1604386334, |
| 1608758157, |
| 1613114837, |
| 1617456334, |
| 1621782607, |
| 1626093615, |
| 1630389318, |
| 1634669675, |
| 1638934646, |
| 1643184190, |
| 1647418268, |
| 1651636840, |
| 1655839867, |
| 1660027308, |
| 1664199124, |
| 1668355276, |
| 1672495724, |
| 1676620431, |
| 1680729357, |
| 1684822463, |
| 1688899710, |
| 1692961061, |
| 1697006478, |
| 1701035921, |
| 1705049354, |
| 1709046738, |
| 1713028036, |
| 1716993211, |
| 1720942224, |
| 1724875039, |
| 1728791619, |
| 1732691927, |
| 1736575926, |
| 1740443580, |
| 1744294852, |
| 1748129706, |
| 1751948106, |
| 1755750016, |
| 1759535401, |
| 1763304223, |
| 1767056449, |
| 1770792043, |
| 1774510970, |
| 1778213194, |
| 1781898680, |
| 1785567395, |
| 1789219304, |
| 1792854372, |
| 1796472564, |
| 1800073848, |
| 1803658188, |
| 1807225552, |
| 1810775906, |
| 1814309215, |
| 1817825448, |
| 1821324571, |
| 1824806551, |
| 1828271355, |
| 1831718951, |
| 1835149305, |
| 1838562387, |
| 1841958164, |
| 1845336603, |
| 1848697673, |
| 1852041343, |
| 1855367580, |
| 1858676354, |
| 1861967633, |
| 1865241387, |
| 1868497585, |
| 1871736195, |
| 1874957188, |
| 1878160534, |
| 1881346201, |
| 1884514160, |
| 1887664382, |
| 1890796836, |
| 1893911493, |
| 1897008324, |
| 1900087300, |
| 1903148391, |
| 1906191569, |
| 1909216806, |
| 1912224072, |
| 1915213339, |
| 1918184580, |
| 1921137766, |
| 1924072870, |
| 1926989863, |
| 1929888719, |
| 1932769410, |
| 1935631909, |
| 1938476189, |
| 1941302224, |
| 1944109986, |
| 1946899450, |
| 1949670588, |
| 1952423376, |
| 1955157787, |
| 1957873795, |
| 1960571374, |
| 1963250500, |
| 1965911147, |
| 1968553291, |
| 1971176905, |
| 1973781966, |
| 1976368449, |
| 1978936330, |
| 1981485584, |
| 1984016188, |
| 1986528117, |
| 1989021349, |
| 1991495859, |
| 1993951624, |
| 1996388621, |
| 1998806828, |
| 2001206221, |
| 2003586778, |
| 2005948477, |
| 2008291295, |
| 2010615209, |
| 2012920200, |
| 2015206244, |
| 2017473320, |
| 2019721407, |
| 2021950483, |
| 2024160528, |
| 2026351521, |
| 2028523441, |
| 2030676268, |
| 2032809981, |
| 2034924561, |
| 2037019987, |
| 2039096240, |
| 2041153301, |
| 2043191149, |
| 2045209766, |
| 2047209132, |
| 2049189230, |
| 2051150040, |
| 2053091543, |
| 2055013722, |
| 2056916559, |
| 2058800035, |
| 2060664132, |
| 2062508835, |
| 2064334123, |
| 2066139982, |
| 2067926393, |
| 2069693341, |
| 2071440807, |
| 2073168776, |
| 2074877232, |
| 2076566159, |
| 2078235539, |
| 2079885359, |
| 2081515602, |
| 2083126253, |
| 2084717297, |
| 2086288719, |
| 2087840504, |
| 2089372637, |
| 2090885104, |
| 2092377891, |
| 2093850984, |
| 2095304369, |
| 2096738031, |
| 2098151959, |
| 2099546138, |
| 2100920555, |
| 2102275198, |
| 2103610053, |
| 2104925108, |
| 2106220351, |
| 2107495769, |
| 2108751351, |
| 2109987084, |
| 2111202958, |
| 2112398959, |
| 2113575079, |
| 2114731304, |
| 2115867625, |
| 2116984030, |
| 2118080510, |
| 2119157053, |
| 2120213650, |
| 2121250291, |
| 2122266966, |
| 2123263665, |
| 2124240379, |
| 2125197099, |
| 2126133816, |
| 2127050521, |
| 2127947205, |
| 2128823861, |
| 2129680479, |
| 2130517051, |
| 2131333571, |
| 2132130029, |
| 2132906419, |
| 2133662733, |
| 2134398965, |
| 2135115106, |
| 2135811152, |
| 2136487094, |
| 2137142926, |
| 2137778643, |
| 2138394239, |
| 2138989707, |
| 2139565042, |
| 2140120239, |
| 2140655292, |
| 2141170196, |
| 2141664947, |
| 2142139540, |
| 2142593970, |
| 2143028233, |
| 2143442325, |
| 2143836243, |
| 2144209981, |
| 2144563538, |
| 2144896909, |
| 2145210091, |
| 2145503082, |
| 2145775879, |
| 2146028479, |
| 2146260880, |
| 2146473079, |
| 2146665075, |
| 2146836865, |
| 2146988449, |
| 2147119824, |
| 2147230990, |
| 2147321945, |
| 2147392689, |
| 2147443221, |
| 2147473541, |
| 2147483647 |
| }; |
| |
| /* Sine lookup table read */ |
| static inline int32_t sine_lookup(int idx) { |
| int32_t s; |
| int i1; |
| |
| i1 = idx & (2 * SINE_NQUART - 1); |
| if (i1 > SINE_NQUART) |
| i1 = 2 * SINE_NQUART - i1; |
| |
| if (idx > 2 * SINE_NQUART) |
| s = -sine_table[i1]; |
| else |
| s = sine_table[i1]; |
| |
| return (s); |
| } |
| |
| /* Compute fixed point sine with table lookup and interpolation */ |
| int32_t sin_fixed(int32_t w) { |
| int idx; |
| int32_t frac; |
| int32_t s0; |
| int32_t s1; |
| int32_t delta; |
| int64_t sine; |
| int64_t idx_tmp; |
| |
| /* Q4.28 x Q12.20 -> Q16.48 */ |
| idx_tmp = (int64_t) w * SINE_C_Q20; |
| idx = (int) (idx_tmp >> 48); /* Shift to Q0 */ |
| idx_tmp = idx_tmp >> 17; /* Shift to Q16.31 */ |
| idx_tmp = idx_tmp - (idx << 31); /* Get fraction */ |
| frac = (int32_t) idx_tmp; /* Q1.31 */ |
| s0 = sine_lookup(idx); /* Q1.31 */ |
| s1 = sine_lookup(idx + 1); /* Q1.31 */ |
| delta = s1 - s0; /* Q1.31 */ |
| //sine = (int64_t) frac*delta; /* Q1.31 x Q1.31 -> Q2.62 */ |
| //sine = (sine >> 31) + s0; /* Q2.31 */ |
| /* All Q1.31 */ |
| sine = s0 + q_mults_32x32(frac, delta, Q_SHIFT_BITS_64(31, 31, 31)); |
| return (int32_t) sine; |
| } |