00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "arm_math.h"
00031
00059 static const q31_t sinTableQ31[259] = {
00060 0xfcdbd541, 0x0, 0x3242abf, 0x647d97c, 0x96a9049, 0xc8bd35e, 0xfab272b,
00061 0x12c8106f,
00062 0x15e21445, 0x18f8b83c, 0x1c0b826a, 0x1f19f97b, 0x2223a4c5, 0x25280c5e,
00063 0x2826b928, 0x2b1f34eb,
00064 0x2e110a62, 0x30fbc54d, 0x33def287, 0x36ba2014, 0x398cdd32, 0x3c56ba70,
00065 0x3f1749b8, 0x41ce1e65,
00066 0x447acd50, 0x471cece7, 0x49b41533, 0x4c3fdff4, 0x4ebfe8a5, 0x5133cc94,
00067 0x539b2af0, 0x55f5a4d2,
00068 0x5842dd54, 0x5a82799a, 0x5cb420e0, 0x5ed77c8a, 0x60ec3830, 0x62f201ac,
00069 0x64e88926, 0x66cf8120,
00070 0x68a69e81, 0x6a6d98a4, 0x6c242960, 0x6dca0d14, 0x6f5f02b2, 0x70e2cbc6,
00071 0x72552c85, 0x73b5ebd1,
00072 0x7504d345, 0x7641af3d, 0x776c4edb, 0x78848414, 0x798a23b1, 0x7a7d055b,
00073 0x7b5d039e, 0x7c29fbee,
00074 0x7ce3ceb2, 0x7d8a5f40, 0x7e1d93ea, 0x7e9d55fc, 0x7f0991c4, 0x7f62368f,
00075 0x7fa736b4, 0x7fd8878e,
00076 0x7ff62182, 0x7fffffff, 0x7ff62182, 0x7fd8878e, 0x7fa736b4, 0x7f62368f,
00077 0x7f0991c4, 0x7e9d55fc,
00078 0x7e1d93ea, 0x7d8a5f40, 0x7ce3ceb2, 0x7c29fbee, 0x7b5d039e, 0x7a7d055b,
00079 0x798a23b1, 0x78848414,
00080 0x776c4edb, 0x7641af3d, 0x7504d345, 0x73b5ebd1, 0x72552c85, 0x70e2cbc6,
00081 0x6f5f02b2, 0x6dca0d14,
00082 0x6c242960, 0x6a6d98a4, 0x68a69e81, 0x66cf8120, 0x64e88926, 0x62f201ac,
00083 0x60ec3830, 0x5ed77c8a,
00084 0x5cb420e0, 0x5a82799a, 0x5842dd54, 0x55f5a4d2, 0x539b2af0, 0x5133cc94,
00085 0x4ebfe8a5, 0x4c3fdff4,
00086 0x49b41533, 0x471cece7, 0x447acd50, 0x41ce1e65, 0x3f1749b8, 0x3c56ba70,
00087 0x398cdd32, 0x36ba2014,
00088 0x33def287, 0x30fbc54d, 0x2e110a62, 0x2b1f34eb, 0x2826b928, 0x25280c5e,
00089 0x2223a4c5, 0x1f19f97b,
00090 0x1c0b826a, 0x18f8b83c, 0x15e21445, 0x12c8106f, 0xfab272b, 0xc8bd35e,
00091 0x96a9049, 0x647d97c,
00092 0x3242abf, 0x0, 0xfcdbd541, 0xf9b82684, 0xf6956fb7, 0xf3742ca2, 0xf054d8d5,
00093 0xed37ef91,
00094 0xea1debbb, 0xe70747c4, 0xe3f47d96, 0xe0e60685, 0xdddc5b3b, 0xdad7f3a2,
00095 0xd7d946d8, 0xd4e0cb15,
00096 0xd1eef59e, 0xcf043ab3, 0xcc210d79, 0xc945dfec, 0xc67322ce, 0xc3a94590,
00097 0xc0e8b648, 0xbe31e19b,
00098 0xbb8532b0, 0xb8e31319, 0xb64beacd, 0xb3c0200c, 0xb140175b, 0xaecc336c,
00099 0xac64d510, 0xaa0a5b2e,
00100 0xa7bd22ac, 0xa57d8666, 0xa34bdf20, 0xa1288376, 0x9f13c7d0, 0x9d0dfe54,
00101 0x9b1776da, 0x99307ee0,
00102 0x9759617f, 0x9592675c, 0x93dbd6a0, 0x9235f2ec, 0x90a0fd4e, 0x8f1d343a,
00103 0x8daad37b, 0x8c4a142f,
00104 0x8afb2cbb, 0x89be50c3, 0x8893b125, 0x877b7bec, 0x8675dc4f, 0x8582faa5,
00105 0x84a2fc62, 0x83d60412,
00106 0x831c314e, 0x8275a0c0, 0x81e26c16, 0x8162aa04, 0x80f66e3c, 0x809dc971,
00107 0x8058c94c, 0x80277872,
00108 0x8009de7e, 0x80000000, 0x8009de7e, 0x80277872, 0x8058c94c, 0x809dc971,
00109 0x80f66e3c, 0x8162aa04,
00110 0x81e26c16, 0x8275a0c0, 0x831c314e, 0x83d60412, 0x84a2fc62, 0x8582faa5,
00111 0x8675dc4f, 0x877b7bec,
00112 0x8893b125, 0x89be50c3, 0x8afb2cbb, 0x8c4a142f, 0x8daad37b, 0x8f1d343a,
00113 0x90a0fd4e, 0x9235f2ec,
00114 0x93dbd6a0, 0x9592675c, 0x9759617f, 0x99307ee0, 0x9b1776da, 0x9d0dfe54,
00115 0x9f13c7d0, 0xa1288376,
00116 0xa34bdf20, 0xa57d8666, 0xa7bd22ac, 0xaa0a5b2e, 0xac64d510, 0xaecc336c,
00117 0xb140175b, 0xb3c0200c,
00118 0xb64beacd, 0xb8e31319, 0xbb8532b0, 0xbe31e19b, 0xc0e8b648, 0xc3a94590,
00119 0xc67322ce, 0xc945dfec,
00120 0xcc210d79, 0xcf043ab3, 0xd1eef59e, 0xd4e0cb15, 0xd7d946d8, 0xdad7f3a2,
00121 0xdddc5b3b, 0xe0e60685,
00122 0xe3f47d96, 0xe70747c4, 0xea1debbb, 0xed37ef91, 0xf054d8d5, 0xf3742ca2,
00123 0xf6956fb7, 0xf9b82684,
00124 0xfcdbd541, 0x0, 0x3242abf
00125 };
00126
00127
00136 q31_t arm_sin_q31(
00137 q31_t x)
00138 {
00139 q31_t sinVal, in, in2;
00140 uint32_t index;
00141 q31_t wa, wb, wc, wd;
00142 q31_t a, b, c, d;
00143 q31_t *tablePtr;
00144 q31_t fract, fractCube, fractSquare;
00145 q31_t oneBy6 = 0x15555555;
00146 q31_t tableSpacing = TABLE_SPACING_Q31;
00147 q31_t temp;
00148
00149 in = x;
00150
00151
00152 index = (uint32_t) in / (uint32_t) tableSpacing;
00153
00154
00155 in2 = (q31_t) index *tableSpacing;
00156
00157
00158 fract = (in - in2) << 8;
00159
00160
00161 fractSquare = ((q31_t) (((q63_t) fract * fract) >> 32));
00162 fractSquare = fractSquare << 1;
00163
00164
00165 fractCube = ((q31_t) (((q63_t) fractSquare * fract) >> 32));
00166 fractCube = fractCube << 1;
00167
00168
00169 tablePtr = (q31_t *) & sinTableQ31[index];
00170
00171
00172
00173
00174 wa = ((q31_t) (((q63_t) oneBy6 * fractCube) >> 32));
00175 temp = 0x2AAAAAAA;
00176 wa = (q31_t) ((((q63_t) wa << 32) + ((q63_t) temp * fract)) >> 32);
00177 wa = -(wa << 1u);
00178 wa += (fractSquare >> 1u);
00179
00180
00181 a = *tablePtr++;
00182
00183
00184 sinVal = ((q31_t) (((q63_t) a * wa) >> 32));
00185
00186
00187 temp = 0x7FFFFFFF;
00188
00189
00190 wb = ((fractCube >> 1u) - (fractSquare + (fract >> 1u))) + temp;
00191
00192
00193 b = *tablePtr++;
00194
00195
00196 sinVal = (q31_t) ((((q63_t) sinVal << 32) + (q63_t) b * (wb)) >> 32);
00197
00198
00199 wc = -fractCube + fractSquare;
00200 wc = (wc >> 1u) + fract;
00201
00202
00203 c = *tablePtr++;
00204
00205
00206 sinVal = (q31_t) ((((q63_t) sinVal << 32) + ((q63_t) c * wc)) >> 32);
00207
00208
00209
00210 fractCube = fractCube - fract;
00211 wd = ((q31_t) (((q63_t) oneBy6 * fractCube) >> 32));
00212 wd = (wd << 1u);
00213
00214
00215 d = *tablePtr++;
00216
00217
00218 sinVal = (q31_t) ((((q63_t) sinVal << 32) + ((q63_t) d * wd)) >> 32);
00219
00220
00221 return (sinVal << 1u);
00222
00223 }
00224