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
00045 static const int32_t sinTableQ31[360] = {
00046
00047 0x0, 0xfdc41e9b, 0xfb8869ce, 0xf94d0e2e, 0xf7123849, 0xf4d814a4, 0xf29ecfb2,
00048 0xf06695da,
00049 0xee2f9369, 0xebf9f498, 0xe9c5e582, 0xe7939223, 0xe5632654, 0xe334cdc9,
00050 0xe108b40d, 0xdedf047d,
00051 0xdcb7ea46, 0xda939061, 0xd8722192, 0xd653c860, 0xd438af17, 0xd220ffc0,
00052 0xd00ce422, 0xcdfc85bb,
00053 0xcbf00dbe, 0xc9e7a512, 0xc7e3744b, 0xc5e3a3a9, 0xc3e85b18, 0xc1f1c224,
00054 0xc0000000, 0xbe133b7c,
00055 0xbc2b9b05, 0xba4944a2, 0xb86c5df0, 0xb6950c1e, 0xb4c373ee, 0xb2f7b9af,
00056 0xb1320139, 0xaf726def,
00057 0xadb922b7, 0xac0641fb, 0xaa59eda4, 0xa8b4471a, 0xa7156f3c, 0xa57d8666,
00058 0xa3ecac65, 0xa263007d,
00059 0xa0e0a15f, 0x9f65ad2d, 0x9df24175, 0x9c867b2c, 0x9b2276b0, 0x99c64fc5,
00060 0x98722192, 0x9726069c,
00061 0x95e218c9, 0x94a6715d, 0x937328f5, 0x92485786, 0x9126145f, 0x900c7621,
00062 0x8efb92c2, 0x8df37f8b,
00063 0x8cf45113, 0x8bfe1b3f, 0x8b10f144, 0x8a2ce59f, 0x89520a1a, 0x88806fc4,
00064 0x87b826f7, 0x86f93f50,
00065 0x8643c7b3, 0x8597ce46, 0x84f56073, 0x845c8ae3, 0x83cd5982, 0x8347d77b,
00066 0x82cc0f36, 0x825a0a5b,
00067 0x81f1d1ce, 0x81936daf, 0x813ee55b, 0x80f43f69, 0x80b381ac, 0x807cb130,
00068 0x804fd23a, 0x802ce84c,
00069 0x8013f61d, 0x8004fda0, 0x80000000, 0x8004fda0, 0x8013f61d, 0x802ce84c,
00070 0x804fd23a, 0x807cb130,
00071 0x80b381ac, 0x80f43f69, 0x813ee55b, 0x81936daf, 0x81f1d1ce, 0x825a0a5b,
00072 0x82cc0f36, 0x8347d77b,
00073 0x83cd5982, 0x845c8ae3, 0x84f56073, 0x8597ce46, 0x8643c7b3, 0x86f93f50,
00074 0x87b826f7, 0x88806fc4,
00075 0x89520a1a, 0x8a2ce59f, 0x8b10f144, 0x8bfe1b3f, 0x8cf45113, 0x8df37f8b,
00076 0x8efb92c2, 0x900c7621,
00077 0x9126145f, 0x92485786, 0x937328f5, 0x94a6715d, 0x95e218c9, 0x9726069c,
00078 0x98722192, 0x99c64fc5,
00079 0x9b2276b0, 0x9c867b2c, 0x9df24175, 0x9f65ad2d, 0xa0e0a15f, 0xa263007d,
00080 0xa3ecac65, 0xa57d8666,
00081 0xa7156f3c, 0xa8b4471a, 0xaa59eda4, 0xac0641fb, 0xadb922b7, 0xaf726def,
00082 0xb1320139, 0xb2f7b9af,
00083 0xb4c373ee, 0xb6950c1e, 0xb86c5df0, 0xba4944a2, 0xbc2b9b05, 0xbe133b7c,
00084 0xc0000000, 0xc1f1c224,
00085 0xc3e85b18, 0xc5e3a3a9, 0xc7e3744b, 0xc9e7a512, 0xcbf00dbe, 0xcdfc85bb,
00086 0xd00ce422, 0xd220ffc0,
00087 0xd438af17, 0xd653c860, 0xd8722192, 0xda939061, 0xdcb7ea46, 0xdedf047d,
00088 0xe108b40d, 0xe334cdc9,
00089 0xe5632654, 0xe7939223, 0xe9c5e582, 0xebf9f498, 0xee2f9369, 0xf06695da,
00090 0xf29ecfb2, 0xf4d814a4,
00091 0xf7123849, 0xf94d0e2e, 0xfb8869ce, 0xfdc41e9b, 0x0, 0x23be165, 0x4779632,
00092 0x6b2f1d2,
00093 0x8edc7b7, 0xb27eb5c, 0xd61304e, 0xf996a26, 0x11d06c97, 0x14060b68,
00094 0x163a1a7e, 0x186c6ddd,
00095 0x1a9cd9ac, 0x1ccb3237, 0x1ef74bf3, 0x2120fb83, 0x234815ba, 0x256c6f9f,
00096 0x278dde6e, 0x29ac37a0,
00097 0x2bc750e9, 0x2ddf0040, 0x2ff31bde, 0x32037a45, 0x340ff242, 0x36185aee,
00098 0x381c8bb5, 0x3a1c5c57,
00099 0x3c17a4e8, 0x3e0e3ddc, 0x40000000, 0x41ecc484, 0x43d464fb, 0x45b6bb5e,
00100 0x4793a210, 0x496af3e2,
00101 0x4b3c8c12, 0x4d084651, 0x4ecdfec7, 0x508d9211, 0x5246dd49, 0x53f9be05,
00102 0x55a6125c, 0x574bb8e6,
00103 0x58ea90c4, 0x5a82799a, 0x5c13539b, 0x5d9cff83, 0x5f1f5ea1, 0x609a52d3,
00104 0x620dbe8b, 0x637984d4,
00105 0x64dd8950, 0x6639b03b, 0x678dde6e, 0x68d9f964, 0x6a1de737, 0x6b598ea3,
00106 0x6c8cd70b, 0x6db7a87a,
00107 0x6ed9eba1, 0x6ff389df, 0x71046d3e, 0x720c8075, 0x730baeed, 0x7401e4c1,
00108 0x74ef0ebc, 0x75d31a61,
00109 0x76adf5e6, 0x777f903c, 0x7847d909, 0x7906c0b0, 0x79bc384d, 0x7a6831ba,
00110 0x7b0a9f8d, 0x7ba3751d,
00111 0x7c32a67e, 0x7cb82885, 0x7d33f0ca, 0x7da5f5a5, 0x7e0e2e32, 0x7e6c9251,
00112 0x7ec11aa5, 0x7f0bc097,
00113 0x7f4c7e54, 0x7f834ed0, 0x7fb02dc6, 0x7fd317b4, 0x7fec09e3, 0x7ffb0260,
00114 0x7fffffff, 0x7ffb0260,
00115 0x7fec09e3, 0x7fd317b4, 0x7fb02dc6, 0x7f834ed0, 0x7f4c7e54, 0x7f0bc097,
00116 0x7ec11aa5, 0x7e6c9251,
00117 0x7e0e2e32, 0x7da5f5a5, 0x7d33f0ca, 0x7cb82885, 0x7c32a67e, 0x7ba3751d,
00118 0x7b0a9f8d, 0x7a6831ba,
00119 0x79bc384d, 0x7906c0b0, 0x7847d909, 0x777f903c, 0x76adf5e6, 0x75d31a61,
00120 0x74ef0ebc, 0x7401e4c1,
00121 0x730baeed, 0x720c8075, 0x71046d3e, 0x6ff389df, 0x6ed9eba1, 0x6db7a87a,
00122 0x6c8cd70b, 0x6b598ea3,
00123 0x6a1de737, 0x68d9f964, 0x678dde6e, 0x6639b03b, 0x64dd8950, 0x637984d4,
00124 0x620dbe8b, 0x609a52d3,
00125 0x5f1f5ea1, 0x5d9cff83, 0x5c13539b, 0x5a82799a, 0x58ea90c4, 0x574bb8e6,
00126 0x55a6125c, 0x53f9be05,
00127 0x5246dd49, 0x508d9211, 0x4ecdfec7, 0x4d084651, 0x4b3c8c12, 0x496af3e2,
00128 0x4793a210, 0x45b6bb5e,
00129 0x43d464fb, 0x41ecc484, 0x40000000, 0x3e0e3ddc, 0x3c17a4e8, 0x3a1c5c57,
00130 0x381c8bb5, 0x36185aee,
00131 0x340ff242, 0x32037a45, 0x2ff31bde, 0x2ddf0040, 0x2bc750e9, 0x29ac37a0,
00132 0x278dde6e, 0x256c6f9f,
00133 0x234815ba, 0x2120fb83, 0x1ef74bf3, 0x1ccb3237, 0x1a9cd9ac, 0x186c6ddd,
00134 0x163a1a7e, 0x14060b68,
00135 0x11d06c97, 0xf996a26, 0xd61304e, 0xb27eb5c, 0x8edc7b7, 0x6b2f1d2,
00136 0x4779632, 0x23be165,
00137
00138
00139 };
00140
00151 static const int32_t cosTableQ31[360] = {
00152 0x80000000, 0x8004fda0, 0x8013f61d, 0x802ce84c, 0x804fd23a, 0x807cb130,
00153 0x80b381ac, 0x80f43f69,
00154 0x813ee55b, 0x81936daf, 0x81f1d1ce, 0x825a0a5b, 0x82cc0f36, 0x8347d77b,
00155 0x83cd5982, 0x845c8ae3,
00156 0x84f56073, 0x8597ce46, 0x8643c7b3, 0x86f93f50, 0x87b826f7, 0x88806fc4,
00157 0x89520a1a, 0x8a2ce59f,
00158 0x8b10f144, 0x8bfe1b3f, 0x8cf45113, 0x8df37f8b, 0x8efb92c2, 0x900c7621,
00159 0x9126145f, 0x92485786,
00160 0x937328f5, 0x94a6715d, 0x95e218c9, 0x9726069c, 0x98722192, 0x99c64fc5,
00161 0x9b2276b0, 0x9c867b2c,
00162 0x9df24175, 0x9f65ad2d, 0xa0e0a15f, 0xa263007d, 0xa3ecac65, 0xa57d8666,
00163 0xa7156f3c, 0xa8b4471a,
00164 0xaa59eda4, 0xac0641fb, 0xadb922b7, 0xaf726def, 0xb1320139, 0xb2f7b9af,
00165 0xb4c373ee, 0xb6950c1e,
00166 0xb86c5df0, 0xba4944a2, 0xbc2b9b05, 0xbe133b7c, 0xc0000000, 0xc1f1c224,
00167 0xc3e85b18, 0xc5e3a3a9,
00168 0xc7e3744b, 0xc9e7a512, 0xcbf00dbe, 0xcdfc85bb, 0xd00ce422, 0xd220ffc0,
00169 0xd438af17, 0xd653c860,
00170 0xd8722192, 0xda939061, 0xdcb7ea46, 0xdedf047d, 0xe108b40d, 0xe334cdc9,
00171 0xe5632654, 0xe7939223,
00172 0xe9c5e582, 0xebf9f498, 0xee2f9369, 0xf06695da, 0xf29ecfb2, 0xf4d814a4,
00173 0xf7123849, 0xf94d0e2e,
00174 0xfb8869ce, 0xfdc41e9b, 0x0, 0x23be165, 0x4779632, 0x6b2f1d2, 0x8edc7b7,
00175 0xb27eb5c,
00176 0xd61304e, 0xf996a26, 0x11d06c97, 0x14060b68, 0x163a1a7e, 0x186c6ddd,
00177 0x1a9cd9ac, 0x1ccb3237,
00178 0x1ef74bf3, 0x2120fb83, 0x234815ba, 0x256c6f9f, 0x278dde6e, 0x29ac37a0,
00179 0x2bc750e9, 0x2ddf0040,
00180 0x2ff31bde, 0x32037a45, 0x340ff242, 0x36185aee, 0x381c8bb5, 0x3a1c5c57,
00181 0x3c17a4e8, 0x3e0e3ddc,
00182 0x40000000, 0x41ecc484, 0x43d464fb, 0x45b6bb5e, 0x4793a210, 0x496af3e2,
00183 0x4b3c8c12, 0x4d084651,
00184 0x4ecdfec7, 0x508d9211, 0x5246dd49, 0x53f9be05, 0x55a6125c, 0x574bb8e6,
00185 0x58ea90c4, 0x5a82799a,
00186 0x5c13539b, 0x5d9cff83, 0x5f1f5ea1, 0x609a52d3, 0x620dbe8b, 0x637984d4,
00187 0x64dd8950, 0x6639b03b,
00188 0x678dde6e, 0x68d9f964, 0x6a1de737, 0x6b598ea3, 0x6c8cd70b, 0x6db7a87a,
00189 0x6ed9eba1, 0x6ff389df,
00190 0x71046d3e, 0x720c8075, 0x730baeed, 0x7401e4c1, 0x74ef0ebc, 0x75d31a61,
00191 0x76adf5e6, 0x777f903c,
00192 0x7847d909, 0x7906c0b0, 0x79bc384d, 0x7a6831ba, 0x7b0a9f8d, 0x7ba3751d,
00193 0x7c32a67e, 0x7cb82885,
00194 0x7d33f0ca, 0x7da5f5a5, 0x7e0e2e32, 0x7e6c9251, 0x7ec11aa5, 0x7f0bc097,
00195 0x7f4c7e54, 0x7f834ed0,
00196 0x7fb02dc6, 0x7fd317b4, 0x7fec09e3, 0x7ffb0260, 0x7fffffff, 0x7ffb0260,
00197 0x7fec09e3, 0x7fd317b4,
00198 0x7fb02dc6, 0x7f834ed0, 0x7f4c7e54, 0x7f0bc097, 0x7ec11aa5, 0x7e6c9251,
00199 0x7e0e2e32, 0x7da5f5a5,
00200 0x7d33f0ca, 0x7cb82885, 0x7c32a67e, 0x7ba3751d, 0x7b0a9f8d, 0x7a6831ba,
00201 0x79bc384d, 0x7906c0b0,
00202 0x7847d909, 0x777f903c, 0x76adf5e6, 0x75d31a61, 0x74ef0ebc, 0x7401e4c1,
00203 0x730baeed, 0x720c8075,
00204 0x71046d3e, 0x6ff389df, 0x6ed9eba1, 0x6db7a87a, 0x6c8cd70b, 0x6b598ea3,
00205 0x6a1de737, 0x68d9f964,
00206 0x678dde6e, 0x6639b03b, 0x64dd8950, 0x637984d4, 0x620dbe8b, 0x609a52d3,
00207 0x5f1f5ea1, 0x5d9cff83,
00208 0x5c13539b, 0x5a82799a, 0x58ea90c4, 0x574bb8e6, 0x55a6125c, 0x53f9be05,
00209 0x5246dd49, 0x508d9211,
00210 0x4ecdfec7, 0x4d084651, 0x4b3c8c12, 0x496af3e2, 0x4793a210, 0x45b6bb5e,
00211 0x43d464fb, 0x41ecc484,
00212 0x40000000, 0x3e0e3ddc, 0x3c17a4e8, 0x3a1c5c57, 0x381c8bb5, 0x36185aee,
00213 0x340ff242, 0x32037a45,
00214 0x2ff31bde, 0x2ddf0040, 0x2bc750e9, 0x29ac37a0, 0x278dde6e, 0x256c6f9f,
00215 0x234815ba, 0x2120fb83,
00216 0x1ef74bf3, 0x1ccb3237, 0x1a9cd9ac, 0x186c6ddd, 0x163a1a7e, 0x14060b68,
00217 0x11d06c97, 0xf996a26,
00218 0xd61304e, 0xb27eb5c, 0x8edc7b7, 0x6b2f1d2, 0x4779632, 0x23be165, 0x0,
00219 0xfdc41e9b,
00220 0xfb8869ce, 0xf94d0e2e, 0xf7123849, 0xf4d814a4, 0xf29ecfb2, 0xf06695da,
00221 0xee2f9369, 0xebf9f498,
00222 0xe9c5e582, 0xe7939223, 0xe5632654, 0xe334cdc9, 0xe108b40d, 0xdedf047d,
00223 0xdcb7ea46, 0xda939061,
00224 0xd8722192, 0xd653c860, 0xd438af17, 0xd220ffc0, 0xd00ce422, 0xcdfc85bb,
00225 0xcbf00dbe, 0xc9e7a512,
00226 0xc7e3744b, 0xc5e3a3a9, 0xc3e85b18, 0xc1f1c224, 0xc0000000, 0xbe133b7c,
00227 0xbc2b9b05, 0xba4944a2,
00228 0xb86c5df0, 0xb6950c1e, 0xb4c373ee, 0xb2f7b9af, 0xb1320139, 0xaf726def,
00229 0xadb922b7, 0xac0641fb,
00230 0xaa59eda4, 0xa8b4471a, 0xa7156f3c, 0xa57d8666, 0xa3ecac65, 0xa263007d,
00231 0xa0e0a15f, 0x9f65ad2d,
00232 0x9df24175, 0x9c867b2c, 0x9b2276b0, 0x99c64fc5, 0x98722192, 0x9726069c,
00233 0x95e218c9, 0x94a6715d,
00234 0x937328f5, 0x92485786, 0x9126145f, 0x900c7621, 0x8efb92c2, 0x8df37f8b,
00235 0x8cf45113, 0x8bfe1b3f,
00236 0x8b10f144, 0x8a2ce59f, 0x89520a1a, 0x88806fc4, 0x87b826f7, 0x86f93f50,
00237 0x8643c7b3, 0x8597ce46,
00238 0x84f56073, 0x845c8ae3, 0x83cd5982, 0x8347d77b, 0x82cc0f36, 0x825a0a5b,
00239 0x81f1d1ce, 0x81936daf,
00240 0x813ee55b, 0x80f43f69, 0x80b381ac, 0x807cb130, 0x804fd23a, 0x802ce84c,
00241 0x8013f61d, 0x8004fda0,
00242
00243 };
00244
00245
00258 void arm_sin_cos_q31(
00259 q31_t theta,
00260 q31_t * pSinVal,
00261 q31_t * pCosVal)
00262 {
00263 q31_t x0;
00264 q31_t ysin0, ysin1;
00265 q31_t ycos0, ycos1;
00266 q31_t xSpacing = INPUT_SPACING;
00267 uint32_t i;
00268 q31_t oneByXSpacing;
00269 q31_t out;
00270 uint32_t sign_bits;
00271 uint32_t firstX = 0x80000000;
00272 q63_t acc1, acc2;
00273 q31_t thetaminusx0;
00274
00275
00276 i = ((uint32_t) theta - firstX) / (uint32_t) xSpacing;
00277
00278
00279 x0 = (q31_t) firstX + ((q31_t) i * xSpacing);
00280
00281
00282 ysin0 = sinTableQ31[i];
00283 ysin1 = sinTableQ31[i + 1u];
00284
00285
00286 thetaminusx0 = theta - x0;
00287
00288 oneByXSpacing = 0x5A000000;
00289
00290
00291 ycos0 = cosTableQ31[i];
00292 ycos1 = cosTableQ31[i + 1u];
00293
00294 out = (((q63_t) thetaminusx0 * oneByXSpacing) >> 32);
00295
00296
00297
00298 sign_bits = 8u;
00299
00300
00301 ysin1 = ysin1 - ysin0;
00302
00303
00304 out = (((q31_t) out) << sign_bits);
00305
00306
00307 ycos1 = ycos1 - ycos0;
00308
00309 acc1 = ((q63_t) ysin1 * out);
00310 acc2 = ((q63_t) ycos1 * out);
00311
00312 x0 = ((q31_t) (acc1 >> 30));
00313 out = ((q31_t) (acc2 >> 30));
00314
00315 *pSinVal = ysin0 + x0;
00316
00317
00318 *pCosVal = ycos0 + out;
00319
00320 }
00321