| /* Audio Library for Teensy 3.X | |||||
| * Copyright (c) 2014, Paul Stoffregen, paul@pjrc.com | |||||
| * | |||||
| * Development of this audio library was funded by PJRC.COM, LLC by sales of | |||||
| * Teensy and Audio Adaptor boards. Please support PJRC's efforts to develop | |||||
| * open source software by purchasing Teensy or other PJRC products. | |||||
| * | |||||
| * Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
| * of this software and associated documentation files (the "Software"), to deal | |||||
| * in the Software without restriction, including without limitation the rights | |||||
| * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
| * copies of the Software, and to permit persons to whom the Software is | |||||
| * furnished to do so, subject to the following conditions: | |||||
| * | |||||
| * The above copyright notice, development funding notice, and this permission | |||||
| * notice shall be included in all copies or substantial portions of the Software. | |||||
| * | |||||
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
| * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||||
| * THE SOFTWARE. | |||||
| */ | |||||
| #include "sqrt_integer.h" | |||||
| const uint16_t sqrt_integer_guess_table[33] = { | |||||
| 55109, | |||||
| 38968, | |||||
| 27555, | |||||
| 19484, | |||||
| 13778, | |||||
| 9742, | |||||
| 6889, | |||||
| 4871, | |||||
| 3445, | |||||
| 2436, | |||||
| 1723, | |||||
| 1218, | |||||
| 862, | |||||
| 609, | |||||
| 431, | |||||
| 305, | |||||
| 216, | |||||
| 153, | |||||
| 108, | |||||
| 77, | |||||
| 54, | |||||
| 39, | |||||
| 27, | |||||
| 20, | |||||
| 14, | |||||
| 10, | |||||
| 7, | |||||
| 5, | |||||
| 4, | |||||
| 3, | |||||
| 2, | |||||
| 1, | |||||
| 0 | |||||
| }; | |||||
| /* | |||||
| #! /usr/bin/perl | |||||
| use POSIX; | |||||
| print "const uint16_t sqrt_integer_guess_table[33] = {\n"; | |||||
| for ($i=0; $i <= 32; $i++) { | |||||
| printf "%5d", ceil(sqrt((0xFFFFFFFF >> $i) * sqrt(2)/2 )); | |||||
| print "," if $i < 32; | |||||
| print "\n"; | |||||
| } | |||||
| print "};\n"; | |||||
| */ |
| /* Audio Library for Teensy 3.X | |||||
| * Copyright (c) 2014, Paul Stoffregen, paul@pjrc.com | |||||
| * | |||||
| * Development of this audio library was funded by PJRC.COM, LLC by sales of | |||||
| * Teensy and Audio Adaptor boards. Please support PJRC's efforts to develop | |||||
| * open source software by purchasing Teensy or other PJRC products. | |||||
| * | |||||
| * Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
| * of this software and associated documentation files (the "Software"), to deal | |||||
| * in the Software without restriction, including without limitation the rights | |||||
| * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
| * copies of the Software, and to permit persons to whom the Software is | |||||
| * furnished to do so, subject to the following conditions: | |||||
| * | |||||
| * The above copyright notice, development funding notice, and this permission | |||||
| * notice shall be included in all copies or substantial portions of the Software. | |||||
| * | |||||
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
| * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||||
| * THE SOFTWARE. | |||||
| */ | |||||
| #include <stdint.h> | |||||
| #ifdef __cplusplus | |||||
| extern "C" const uint16_t sqrt_integer_guess_table[]; | |||||
| #else | |||||
| extern const uint16_t sqrt_integer_guess_table[]; | |||||
| #endif | |||||
| inline uint32_t sqrt_uint32(uint32_t in) __attribute__((always_inline,unused)); | |||||
| inline uint32_t sqrt_uint32(uint32_t in) | |||||
| { | |||||
| uint32_t n = sqrt_integer_guess_table[__builtin_clz(in)]; | |||||
| n = ((in / n) + n) / 2; | |||||
| n = ((in / n) + n) / 2; | |||||
| n = ((in / n) + n) / 2; | |||||
| return n; | |||||
| } | |||||
| inline uint32_t sqrt_uint32_approx(uint32_t in) __attribute__((always_inline,unused)); | |||||
| inline uint32_t sqrt_uint32_approx(uint32_t in) | |||||
| { | |||||
| uint32_t n = sqrt_integer_guess_table[__builtin_clz(in)]; | |||||
| n = ((in / n) + n) / 2; | |||||
| n = ((in / n) + n) / 2; | |||||
| return n; | |||||
| } | |||||
| return a; | return a; | ||||
| } | } | ||||
| // computes ((a[15:0] * b[15:0]) + (a[31:16] * b[31:16])) | |||||
| static inline int32_t multiply_16tx16t_add_16bx16b(uint32_t a, uint32_t b) __attribute__((always_inline, unused)); | |||||
| static inline int32_t multiply_16tx16t_add_16bx16b(uint32_t a, uint32_t b) | |||||
| { | |||||
| int32_t out; | |||||
| asm volatile("smuad %0, %1, %2" : "=r" (out) : "r" (a), "r" (b)); | |||||
| return out; | |||||
| } | |||||
| // computes ((a[15:0] * b[31:16]) + (a[31:16] * b[15:0])) | |||||
| static inline int32_t multiply_16tx16b_add_16bx16t(uint32_t a, uint32_t b) __attribute__((always_inline, unused)); | |||||
| static inline int32_t multiply_16tx16b_add_16bx16t(uint32_t a, uint32_t b) | |||||
| { | |||||
| int32_t out; | |||||
| asm volatile("smuad %0, %1, %2" : "=r" (out) : "r" (a), "r" (b)); | |||||
| return out; | |||||
| } | |||||
| #endif | #endif |