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
00054 static const q31_t cosTableQ31[259] = {
00055 0x7ff62182, 0x7fffffff, 0x7ff62182, 0x7fd8878e, 0x7fa736b4, 0x7f62368f,
00056 0x7f0991c4, 0x7e9d55fc,
00057 0x7e1d93ea, 0x7d8a5f40, 0x7ce3ceb2, 0x7c29fbee, 0x7b5d039e, 0x7a7d055b,
00058 0x798a23b1, 0x78848414,
00059 0x776c4edb, 0x7641af3d, 0x7504d345, 0x73b5ebd1, 0x72552c85, 0x70e2cbc6,
00060 0x6f5f02b2, 0x6dca0d14,
00061 0x6c242960, 0x6a6d98a4, 0x68a69e81, 0x66cf8120, 0x64e88926, 0x62f201ac,
00062 0x60ec3830, 0x5ed77c8a,
00063 0x5cb420e0, 0x5a82799a, 0x5842dd54, 0x55f5a4d2, 0x539b2af0, 0x5133cc94,
00064 0x4ebfe8a5, 0x4c3fdff4,
00065 0x49b41533, 0x471cece7, 0x447acd50, 0x41ce1e65, 0x3f1749b8, 0x3c56ba70,
00066 0x398cdd32, 0x36ba2014,
00067 0x33def287, 0x30fbc54d, 0x2e110a62, 0x2b1f34eb, 0x2826b928, 0x25280c5e,
00068 0x2223a4c5, 0x1f19f97b,
00069 0x1c0b826a, 0x18f8b83c, 0x15e21445, 0x12c8106f, 0xfab272b, 0xc8bd35e,
00070 0x96a9049, 0x647d97c,
00071 0x3242abf, 0x0, 0xfcdbd541, 0xf9b82684, 0xf6956fb7, 0xf3742ca2, 0xf054d8d5,
00072 0xed37ef91,
00073 0xea1debbb, 0xe70747c4, 0xe3f47d96, 0xe0e60685, 0xdddc5b3b, 0xdad7f3a2,
00074 0xd7d946d8, 0xd4e0cb15,
00075 0xd1eef59e, 0xcf043ab3, 0xcc210d79, 0xc945dfec, 0xc67322ce, 0xc3a94590,
00076 0xc0e8b648, 0xbe31e19b,
00077 0xbb8532b0, 0xb8e31319, 0xb64beacd, 0xb3c0200c, 0xb140175b, 0xaecc336c,
00078 0xac64d510, 0xaa0a5b2e,
00079 0xa7bd22ac, 0xa57d8666, 0xa34bdf20, 0xa1288376, 0x9f13c7d0, 0x9d0dfe54,
00080 0x9b1776da, 0x99307ee0,
00081 0x9759617f, 0x9592675c, 0x93dbd6a0, 0x9235f2ec, 0x90a0fd4e, 0x8f1d343a,
00082 0x8daad37b, 0x8c4a142f,
00083 0x8afb2cbb, 0x89be50c3, 0x8893b125, 0x877b7bec, 0x8675dc4f, 0x8582faa5,
00084 0x84a2fc62, 0x83d60412,
00085 0x831c314e, 0x8275a0c0, 0x81e26c16, 0x8162aa04, 0x80f66e3c, 0x809dc971,
00086 0x8058c94c, 0x80277872,
00087 0x8009de7e, 0x80000000, 0x8009de7e, 0x80277872, 0x8058c94c, 0x809dc971,
00088 0x80f66e3c, 0x8162aa04,
00089 0x81e26c16, 0x8275a0c0, 0x831c314e, 0x83d60412, 0x84a2fc62, 0x8582faa5,
00090 0x8675dc4f, 0x877b7bec,
00091 0x8893b125, 0x89be50c3, 0x8afb2cbb, 0x8c4a142f, 0x8daad37b, 0x8f1d343a,
00092 0x90a0fd4e, 0x9235f2ec,
00093 0x93dbd6a0, 0x9592675c, 0x9759617f, 0x99307ee0, 0x9b1776da, 0x9d0dfe54,
00094 0x9f13c7d0, 0xa1288376,
00095 0xa34bdf20, 0xa57d8666, 0xa7bd22ac, 0xaa0a5b2e, 0xac64d510, 0xaecc336c,
00096 0xb140175b, 0xb3c0200c,
00097 0xb64beacd, 0xb8e31319, 0xbb8532b0, 0xbe31e19b, 0xc0e8b648, 0xc3a94590,
00098 0xc67322ce, 0xc945dfec,
00099 0xcc210d79, 0xcf043ab3, 0xd1eef59e, 0xd4e0cb15, 0xd7d946d8, 0xdad7f3a2,
00100 0xdddc5b3b, 0xe0e60685,
00101 0xe3f47d96, 0xe70747c4, 0xea1debbb, 0xed37ef91, 0xf054d8d5, 0xf3742ca2,
00102 0xf6956fb7, 0xf9b82684,
00103 0xfcdbd541, 0x0, 0x3242abf, 0x647d97c, 0x96a9049, 0xc8bd35e, 0xfab272b,
00104 0x12c8106f,
00105 0x15e21445, 0x18f8b83c, 0x1c0b826a, 0x1f19f97b, 0x2223a4c5, 0x25280c5e,
00106 0x2826b928, 0x2b1f34eb,
00107 0x2e110a62, 0x30fbc54d, 0x33def287, 0x36ba2014, 0x398cdd32, 0x3c56ba70,
00108 0x3f1749b8, 0x41ce1e65,
00109 0x447acd50, 0x471cece7, 0x49b41533, 0x4c3fdff4, 0x4ebfe8a5, 0x5133cc94,
00110 0x539b2af0, 0x55f5a4d2,
00111 0x5842dd54, 0x5a82799a, 0x5cb420e0, 0x5ed77c8a, 0x60ec3830, 0x62f201ac,
00112 0x64e88926, 0x66cf8120,
00113 0x68a69e81, 0x6a6d98a4, 0x6c242960, 0x6dca0d14, 0x6f5f02b2, 0x70e2cbc6,
00114 0x72552c85, 0x73b5ebd1,
00115 0x7504d345, 0x7641af3d, 0x776c4edb, 0x78848414, 0x798a23b1, 0x7a7d055b,
00116 0x7b5d039e, 0x7c29fbee,
00117 0x7ce3ceb2, 0x7d8a5f40, 0x7e1d93ea, 0x7e9d55fc, 0x7f0991c4, 0x7f62368f,
00118 0x7fa736b4, 0x7fd8878e,
00119 0x7ff62182, 0x7fffffff, 0x7ff62182
00120 };
00121
00130 q31_t arm_cos_q31(
00131 q31_t x)
00132 {
00133 q31_t cosVal, 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 *) & cosTableQ31[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 cosVal = ((q31_t) (((q63_t) a * wa) >> 32));
00186
00187
00188 b = *tablePtr++;
00189
00190
00191 cosVal = (q31_t) ((((q63_t) cosVal << 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 cosVal = (q31_t) ((((q63_t) cosVal << 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 cosVal = (q31_t) ((((q63_t) cosVal << 32) + ((q63_t) d * (wd))) >> 32);
00214
00215
00216 return (cosVal << 1u);
00217
00218 }
00219