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