mirror of
https://github.com/esp8266/Arduino.git
synced 2025-06-22 08:22:04 +03:00
[sam] Adding CMSIS 2.10
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,415 @@
|
||||
/* ----------------------------------------------------------------------
|
||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
||||
*
|
||||
* $Date: 15. July 2011
|
||||
* $Revision: V1.0.10
|
||||
*
|
||||
* Project: CMSIS DSP Library
|
||||
* Title: arm_cfft_radix4_init_q15.c
|
||||
*
|
||||
* Description: Radix-4 Decimation in Frequency Q15 FFT & IFFT initialization function
|
||||
*
|
||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
||||
*
|
||||
* Version 1.0.10 2011/7/15
|
||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
||||
*
|
||||
* Version 1.0.3 2010/11/29
|
||||
* Re-organized the CMSIS folders and updated documentation.
|
||||
*
|
||||
* Version 1.0.2 2010/11/11
|
||||
* Documentation updated.
|
||||
*
|
||||
* Version 1.0.1 2010/10/05
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 1.0.0 2010/09/20
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 0.0.5 2010/04/26
|
||||
* incorporated review comments and updated with latest CMSIS layer
|
||||
*
|
||||
* Version 0.0.3 2010/03/10
|
||||
* Initial version
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#include "arm_math.h"
|
||||
#include "arm_common_tables.h"
|
||||
|
||||
/**
|
||||
* @ingroup groupTransforms
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup CFFT_CIFFT
|
||||
* @{
|
||||
*/
|
||||
|
||||
/*
|
||||
* @brief Twiddle factors Table
|
||||
*/
|
||||
|
||||
/**
|
||||
* \par
|
||||
* Example code for Q15 Twiddle factors Generation::
|
||||
* \par
|
||||
* <pre>for(i = 0; i< N; i++)
|
||||
* {
|
||||
* twiddleCoefQ15[2*i]= cos(i * 2*PI/(float)N);
|
||||
* twiddleCoefQ15[2*i+1]= sin(i * 2*PI/(float)N);
|
||||
* } </pre>
|
||||
* \par
|
||||
* where N = 1024 and PI = 3.14159265358979
|
||||
* \par
|
||||
* Cos and Sin values are interleaved fashion
|
||||
* \par
|
||||
* Convert Floating point to Q15(Fixed point 1.15):
|
||||
* round(twiddleCoefQ15(i) * pow(2, 15))
|
||||
*
|
||||
*/
|
||||
|
||||
static const q15_t twiddleCoefQ15[2048] = {
|
||||
0x7fff, 0x0, 0x7fff, 0xc9, 0x7ffe, 0x192, 0x7ffa, 0x25b,
|
||||
0x7ff6, 0x324, 0x7ff1, 0x3ed, 0x7fea, 0x4b6, 0x7fe2, 0x57f,
|
||||
0x7fd9, 0x648, 0x7fce, 0x711, 0x7fc2, 0x7d9, 0x7fb5, 0x8a2,
|
||||
0x7fa7, 0x96b, 0x7f98, 0xa33, 0x7f87, 0xafb, 0x7f75, 0xbc4,
|
||||
0x7f62, 0xc8c, 0x7f4e, 0xd54, 0x7f38, 0xe1c, 0x7f22, 0xee4,
|
||||
0x7f0a, 0xfab, 0x7ef0, 0x1073, 0x7ed6, 0x113a, 0x7eba, 0x1201,
|
||||
0x7e9d, 0x12c8, 0x7e7f, 0x138f, 0x7e60, 0x1455, 0x7e3f, 0x151c,
|
||||
0x7e1e, 0x15e2, 0x7dfb, 0x16a8, 0x7dd6, 0x176e, 0x7db1, 0x1833,
|
||||
0x7d8a, 0x18f9, 0x7d63, 0x19be, 0x7d3a, 0x1a83, 0x7d0f, 0x1b47,
|
||||
0x7ce4, 0x1c0c, 0x7cb7, 0x1cd0, 0x7c89, 0x1d93, 0x7c5a, 0x1e57,
|
||||
0x7c2a, 0x1f1a, 0x7bf9, 0x1fdd, 0x7bc6, 0x209f, 0x7b92, 0x2162,
|
||||
0x7b5d, 0x2224, 0x7b27, 0x22e5, 0x7aef, 0x23a7, 0x7ab7, 0x2467,
|
||||
0x7a7d, 0x2528, 0x7a42, 0x25e8, 0x7a06, 0x26a8, 0x79c9, 0x2768,
|
||||
0x798a, 0x2827, 0x794a, 0x28e5, 0x790a, 0x29a4, 0x78c8, 0x2a62,
|
||||
0x7885, 0x2b1f, 0x7840, 0x2bdc, 0x77fb, 0x2c99, 0x77b4, 0x2d55,
|
||||
0x776c, 0x2e11, 0x7723, 0x2ecc, 0x76d9, 0x2f87, 0x768e, 0x3042,
|
||||
0x7642, 0x30fc, 0x75f4, 0x31b5, 0x75a6, 0x326e, 0x7556, 0x3327,
|
||||
0x7505, 0x33df, 0x74b3, 0x3497, 0x7460, 0x354e, 0x740b, 0x3604,
|
||||
0x73b6, 0x36ba, 0x735f, 0x3770, 0x7308, 0x3825, 0x72af, 0x38d9,
|
||||
0x7255, 0x398d, 0x71fa, 0x3a40, 0x719e, 0x3af3, 0x7141, 0x3ba5,
|
||||
0x70e3, 0x3c57, 0x7083, 0x3d08, 0x7023, 0x3db8, 0x6fc2, 0x3e68,
|
||||
0x6f5f, 0x3f17, 0x6efb, 0x3fc6, 0x6e97, 0x4074, 0x6e31, 0x4121,
|
||||
0x6dca, 0x41ce, 0x6d62, 0x427a, 0x6cf9, 0x4326, 0x6c8f, 0x43d1,
|
||||
0x6c24, 0x447b, 0x6bb8, 0x4524, 0x6b4b, 0x45cd, 0x6add, 0x4675,
|
||||
0x6a6e, 0x471d, 0x69fd, 0x47c4, 0x698c, 0x486a, 0x691a, 0x490f,
|
||||
0x68a7, 0x49b4, 0x6832, 0x4a58, 0x67bd, 0x4afb, 0x6747, 0x4b9e,
|
||||
0x66d0, 0x4c40, 0x6657, 0x4ce1, 0x65de, 0x4d81, 0x6564, 0x4e21,
|
||||
0x64e9, 0x4ec0, 0x646c, 0x4f5e, 0x63ef, 0x4ffb, 0x6371, 0x5098,
|
||||
0x62f2, 0x5134, 0x6272, 0x51cf, 0x61f1, 0x5269, 0x616f, 0x5303,
|
||||
0x60ec, 0x539b, 0x6068, 0x5433, 0x5fe4, 0x54ca, 0x5f5e, 0x5560,
|
||||
0x5ed7, 0x55f6, 0x5e50, 0x568a, 0x5dc8, 0x571e, 0x5d3e, 0x57b1,
|
||||
0x5cb4, 0x5843, 0x5c29, 0x58d4, 0x5b9d, 0x5964, 0x5b10, 0x59f4,
|
||||
0x5a82, 0x5a82, 0x59f4, 0x5b10, 0x5964, 0x5b9d, 0x58d4, 0x5c29,
|
||||
0x5843, 0x5cb4, 0x57b1, 0x5d3e, 0x571e, 0x5dc8, 0x568a, 0x5e50,
|
||||
0x55f6, 0x5ed7, 0x5560, 0x5f5e, 0x54ca, 0x5fe4, 0x5433, 0x6068,
|
||||
0x539b, 0x60ec, 0x5303, 0x616f, 0x5269, 0x61f1, 0x51cf, 0x6272,
|
||||
0x5134, 0x62f2, 0x5098, 0x6371, 0x4ffb, 0x63ef, 0x4f5e, 0x646c,
|
||||
0x4ec0, 0x64e9, 0x4e21, 0x6564, 0x4d81, 0x65de, 0x4ce1, 0x6657,
|
||||
0x4c40, 0x66d0, 0x4b9e, 0x6747, 0x4afb, 0x67bd, 0x4a58, 0x6832,
|
||||
0x49b4, 0x68a7, 0x490f, 0x691a, 0x486a, 0x698c, 0x47c4, 0x69fd,
|
||||
0x471d, 0x6a6e, 0x4675, 0x6add, 0x45cd, 0x6b4b, 0x4524, 0x6bb8,
|
||||
0x447b, 0x6c24, 0x43d1, 0x6c8f, 0x4326, 0x6cf9, 0x427a, 0x6d62,
|
||||
0x41ce, 0x6dca, 0x4121, 0x6e31, 0x4074, 0x6e97, 0x3fc6, 0x6efb,
|
||||
0x3f17, 0x6f5f, 0x3e68, 0x6fc2, 0x3db8, 0x7023, 0x3d08, 0x7083,
|
||||
0x3c57, 0x70e3, 0x3ba5, 0x7141, 0x3af3, 0x719e, 0x3a40, 0x71fa,
|
||||
0x398d, 0x7255, 0x38d9, 0x72af, 0x3825, 0x7308, 0x3770, 0x735f,
|
||||
0x36ba, 0x73b6, 0x3604, 0x740b, 0x354e, 0x7460, 0x3497, 0x74b3,
|
||||
0x33df, 0x7505, 0x3327, 0x7556, 0x326e, 0x75a6, 0x31b5, 0x75f4,
|
||||
0x30fc, 0x7642, 0x3042, 0x768e, 0x2f87, 0x76d9, 0x2ecc, 0x7723,
|
||||
0x2e11, 0x776c, 0x2d55, 0x77b4, 0x2c99, 0x77fb, 0x2bdc, 0x7840,
|
||||
0x2b1f, 0x7885, 0x2a62, 0x78c8, 0x29a4, 0x790a, 0x28e5, 0x794a,
|
||||
0x2827, 0x798a, 0x2768, 0x79c9, 0x26a8, 0x7a06, 0x25e8, 0x7a42,
|
||||
0x2528, 0x7a7d, 0x2467, 0x7ab7, 0x23a7, 0x7aef, 0x22e5, 0x7b27,
|
||||
0x2224, 0x7b5d, 0x2162, 0x7b92, 0x209f, 0x7bc6, 0x1fdd, 0x7bf9,
|
||||
0x1f1a, 0x7c2a, 0x1e57, 0x7c5a, 0x1d93, 0x7c89, 0x1cd0, 0x7cb7,
|
||||
0x1c0c, 0x7ce4, 0x1b47, 0x7d0f, 0x1a83, 0x7d3a, 0x19be, 0x7d63,
|
||||
0x18f9, 0x7d8a, 0x1833, 0x7db1, 0x176e, 0x7dd6, 0x16a8, 0x7dfb,
|
||||
0x15e2, 0x7e1e, 0x151c, 0x7e3f, 0x1455, 0x7e60, 0x138f, 0x7e7f,
|
||||
0x12c8, 0x7e9d, 0x1201, 0x7eba, 0x113a, 0x7ed6, 0x1073, 0x7ef0,
|
||||
0xfab, 0x7f0a, 0xee4, 0x7f22, 0xe1c, 0x7f38, 0xd54, 0x7f4e,
|
||||
0xc8c, 0x7f62, 0xbc4, 0x7f75, 0xafb, 0x7f87, 0xa33, 0x7f98,
|
||||
0x96b, 0x7fa7, 0x8a2, 0x7fb5, 0x7d9, 0x7fc2, 0x711, 0x7fce,
|
||||
0x648, 0x7fd9, 0x57f, 0x7fe2, 0x4b6, 0x7fea, 0x3ed, 0x7ff1,
|
||||
0x324, 0x7ff6, 0x25b, 0x7ffa, 0x192, 0x7ffe, 0xc9, 0x7fff,
|
||||
0x0, 0x7fff, 0xff37, 0x7fff, 0xfe6e, 0x7ffe, 0xfda5, 0x7ffa,
|
||||
0xfcdc, 0x7ff6, 0xfc13, 0x7ff1, 0xfb4a, 0x7fea, 0xfa81, 0x7fe2,
|
||||
0xf9b8, 0x7fd9, 0xf8ef, 0x7fce, 0xf827, 0x7fc2, 0xf75e, 0x7fb5,
|
||||
0xf695, 0x7fa7, 0xf5cd, 0x7f98, 0xf505, 0x7f87, 0xf43c, 0x7f75,
|
||||
0xf374, 0x7f62, 0xf2ac, 0x7f4e, 0xf1e4, 0x7f38, 0xf11c, 0x7f22,
|
||||
0xf055, 0x7f0a, 0xef8d, 0x7ef0, 0xeec6, 0x7ed6, 0xedff, 0x7eba,
|
||||
0xed38, 0x7e9d, 0xec71, 0x7e7f, 0xebab, 0x7e60, 0xeae4, 0x7e3f,
|
||||
0xea1e, 0x7e1e, 0xe958, 0x7dfb, 0xe892, 0x7dd6, 0xe7cd, 0x7db1,
|
||||
0xe707, 0x7d8a, 0xe642, 0x7d63, 0xe57d, 0x7d3a, 0xe4b9, 0x7d0f,
|
||||
0xe3f4, 0x7ce4, 0xe330, 0x7cb7, 0xe26d, 0x7c89, 0xe1a9, 0x7c5a,
|
||||
0xe0e6, 0x7c2a, 0xe023, 0x7bf9, 0xdf61, 0x7bc6, 0xde9e, 0x7b92,
|
||||
0xdddc, 0x7b5d, 0xdd1b, 0x7b27, 0xdc59, 0x7aef, 0xdb99, 0x7ab7,
|
||||
0xdad8, 0x7a7d, 0xda18, 0x7a42, 0xd958, 0x7a06, 0xd898, 0x79c9,
|
||||
0xd7d9, 0x798a, 0xd71b, 0x794a, 0xd65c, 0x790a, 0xd59e, 0x78c8,
|
||||
0xd4e1, 0x7885, 0xd424, 0x7840, 0xd367, 0x77fb, 0xd2ab, 0x77b4,
|
||||
0xd1ef, 0x776c, 0xd134, 0x7723, 0xd079, 0x76d9, 0xcfbe, 0x768e,
|
||||
0xcf04, 0x7642, 0xce4b, 0x75f4, 0xcd92, 0x75a6, 0xccd9, 0x7556,
|
||||
0xcc21, 0x7505, 0xcb69, 0x74b3, 0xcab2, 0x7460, 0xc9fc, 0x740b,
|
||||
0xc946, 0x73b6, 0xc890, 0x735f, 0xc7db, 0x7308, 0xc727, 0x72af,
|
||||
0xc673, 0x7255, 0xc5c0, 0x71fa, 0xc50d, 0x719e, 0xc45b, 0x7141,
|
||||
0xc3a9, 0x70e3, 0xc2f8, 0x7083, 0xc248, 0x7023, 0xc198, 0x6fc2,
|
||||
0xc0e9, 0x6f5f, 0xc03a, 0x6efb, 0xbf8c, 0x6e97, 0xbedf, 0x6e31,
|
||||
0xbe32, 0x6dca, 0xbd86, 0x6d62, 0xbcda, 0x6cf9, 0xbc2f, 0x6c8f,
|
||||
0xbb85, 0x6c24, 0xbadc, 0x6bb8, 0xba33, 0x6b4b, 0xb98b, 0x6add,
|
||||
0xb8e3, 0x6a6e, 0xb83c, 0x69fd, 0xb796, 0x698c, 0xb6f1, 0x691a,
|
||||
0xb64c, 0x68a7, 0xb5a8, 0x6832, 0xb505, 0x67bd, 0xb462, 0x6747,
|
||||
0xb3c0, 0x66d0, 0xb31f, 0x6657, 0xb27f, 0x65de, 0xb1df, 0x6564,
|
||||
0xb140, 0x64e9, 0xb0a2, 0x646c, 0xb005, 0x63ef, 0xaf68, 0x6371,
|
||||
0xaecc, 0x62f2, 0xae31, 0x6272, 0xad97, 0x61f1, 0xacfd, 0x616f,
|
||||
0xac65, 0x60ec, 0xabcd, 0x6068, 0xab36, 0x5fe4, 0xaaa0, 0x5f5e,
|
||||
0xaa0a, 0x5ed7, 0xa976, 0x5e50, 0xa8e2, 0x5dc8, 0xa84f, 0x5d3e,
|
||||
0xa7bd, 0x5cb4, 0xa72c, 0x5c29, 0xa69c, 0x5b9d, 0xa60c, 0x5b10,
|
||||
0xa57e, 0x5a82, 0xa4f0, 0x59f4, 0xa463, 0x5964, 0xa3d7, 0x58d4,
|
||||
0xa34c, 0x5843, 0xa2c2, 0x57b1, 0xa238, 0x571e, 0xa1b0, 0x568a,
|
||||
0xa129, 0x55f6, 0xa0a2, 0x5560, 0xa01c, 0x54ca, 0x9f98, 0x5433,
|
||||
0x9f14, 0x539b, 0x9e91, 0x5303, 0x9e0f, 0x5269, 0x9d8e, 0x51cf,
|
||||
0x9d0e, 0x5134, 0x9c8f, 0x5098, 0x9c11, 0x4ffb, 0x9b94, 0x4f5e,
|
||||
0x9b17, 0x4ec0, 0x9a9c, 0x4e21, 0x9a22, 0x4d81, 0x99a9, 0x4ce1,
|
||||
0x9930, 0x4c40, 0x98b9, 0x4b9e, 0x9843, 0x4afb, 0x97ce, 0x4a58,
|
||||
0x9759, 0x49b4, 0x96e6, 0x490f, 0x9674, 0x486a, 0x9603, 0x47c4,
|
||||
0x9592, 0x471d, 0x9523, 0x4675, 0x94b5, 0x45cd, 0x9448, 0x4524,
|
||||
0x93dc, 0x447b, 0x9371, 0x43d1, 0x9307, 0x4326, 0x929e, 0x427a,
|
||||
0x9236, 0x41ce, 0x91cf, 0x4121, 0x9169, 0x4074, 0x9105, 0x3fc6,
|
||||
0x90a1, 0x3f17, 0x903e, 0x3e68, 0x8fdd, 0x3db8, 0x8f7d, 0x3d08,
|
||||
0x8f1d, 0x3c57, 0x8ebf, 0x3ba5, 0x8e62, 0x3af3, 0x8e06, 0x3a40,
|
||||
0x8dab, 0x398d, 0x8d51, 0x38d9, 0x8cf8, 0x3825, 0x8ca1, 0x3770,
|
||||
0x8c4a, 0x36ba, 0x8bf5, 0x3604, 0x8ba0, 0x354e, 0x8b4d, 0x3497,
|
||||
0x8afb, 0x33df, 0x8aaa, 0x3327, 0x8a5a, 0x326e, 0x8a0c, 0x31b5,
|
||||
0x89be, 0x30fc, 0x8972, 0x3042, 0x8927, 0x2f87, 0x88dd, 0x2ecc,
|
||||
0x8894, 0x2e11, 0x884c, 0x2d55, 0x8805, 0x2c99, 0x87c0, 0x2bdc,
|
||||
0x877b, 0x2b1f, 0x8738, 0x2a62, 0x86f6, 0x29a4, 0x86b6, 0x28e5,
|
||||
0x8676, 0x2827, 0x8637, 0x2768, 0x85fa, 0x26a8, 0x85be, 0x25e8,
|
||||
0x8583, 0x2528, 0x8549, 0x2467, 0x8511, 0x23a7, 0x84d9, 0x22e5,
|
||||
0x84a3, 0x2224, 0x846e, 0x2162, 0x843a, 0x209f, 0x8407, 0x1fdd,
|
||||
0x83d6, 0x1f1a, 0x83a6, 0x1e57, 0x8377, 0x1d93, 0x8349, 0x1cd0,
|
||||
0x831c, 0x1c0c, 0x82f1, 0x1b47, 0x82c6, 0x1a83, 0x829d, 0x19be,
|
||||
0x8276, 0x18f9, 0x824f, 0x1833, 0x822a, 0x176e, 0x8205, 0x16a8,
|
||||
0x81e2, 0x15e2, 0x81c1, 0x151c, 0x81a0, 0x1455, 0x8181, 0x138f,
|
||||
0x8163, 0x12c8, 0x8146, 0x1201, 0x812a, 0x113a, 0x8110, 0x1073,
|
||||
0x80f6, 0xfab, 0x80de, 0xee4, 0x80c8, 0xe1c, 0x80b2, 0xd54,
|
||||
0x809e, 0xc8c, 0x808b, 0xbc4, 0x8079, 0xafb, 0x8068, 0xa33,
|
||||
0x8059, 0x96b, 0x804b, 0x8a2, 0x803e, 0x7d9, 0x8032, 0x711,
|
||||
0x8027, 0x648, 0x801e, 0x57f, 0x8016, 0x4b6, 0x800f, 0x3ed,
|
||||
0x800a, 0x324, 0x8006, 0x25b, 0x8002, 0x192, 0x8001, 0xc9,
|
||||
0x8000, 0x0, 0x8001, 0xff37, 0x8002, 0xfe6e, 0x8006, 0xfda5,
|
||||
0x800a, 0xfcdc, 0x800f, 0xfc13, 0x8016, 0xfb4a, 0x801e, 0xfa81,
|
||||
0x8027, 0xf9b8, 0x8032, 0xf8ef, 0x803e, 0xf827, 0x804b, 0xf75e,
|
||||
0x8059, 0xf695, 0x8068, 0xf5cd, 0x8079, 0xf505, 0x808b, 0xf43c,
|
||||
0x809e, 0xf374, 0x80b2, 0xf2ac, 0x80c8, 0xf1e4, 0x80de, 0xf11c,
|
||||
0x80f6, 0xf055, 0x8110, 0xef8d, 0x812a, 0xeec6, 0x8146, 0xedff,
|
||||
0x8163, 0xed38, 0x8181, 0xec71, 0x81a0, 0xebab, 0x81c1, 0xeae4,
|
||||
0x81e2, 0xea1e, 0x8205, 0xe958, 0x822a, 0xe892, 0x824f, 0xe7cd,
|
||||
0x8276, 0xe707, 0x829d, 0xe642, 0x82c6, 0xe57d, 0x82f1, 0xe4b9,
|
||||
0x831c, 0xe3f4, 0x8349, 0xe330, 0x8377, 0xe26d, 0x83a6, 0xe1a9,
|
||||
0x83d6, 0xe0e6, 0x8407, 0xe023, 0x843a, 0xdf61, 0x846e, 0xde9e,
|
||||
0x84a3, 0xdddc, 0x84d9, 0xdd1b, 0x8511, 0xdc59, 0x8549, 0xdb99,
|
||||
0x8583, 0xdad8, 0x85be, 0xda18, 0x85fa, 0xd958, 0x8637, 0xd898,
|
||||
0x8676, 0xd7d9, 0x86b6, 0xd71b, 0x86f6, 0xd65c, 0x8738, 0xd59e,
|
||||
0x877b, 0xd4e1, 0x87c0, 0xd424, 0x8805, 0xd367, 0x884c, 0xd2ab,
|
||||
0x8894, 0xd1ef, 0x88dd, 0xd134, 0x8927, 0xd079, 0x8972, 0xcfbe,
|
||||
0x89be, 0xcf04, 0x8a0c, 0xce4b, 0x8a5a, 0xcd92, 0x8aaa, 0xccd9,
|
||||
0x8afb, 0xcc21, 0x8b4d, 0xcb69, 0x8ba0, 0xcab2, 0x8bf5, 0xc9fc,
|
||||
0x8c4a, 0xc946, 0x8ca1, 0xc890, 0x8cf8, 0xc7db, 0x8d51, 0xc727,
|
||||
0x8dab, 0xc673, 0x8e06, 0xc5c0, 0x8e62, 0xc50d, 0x8ebf, 0xc45b,
|
||||
0x8f1d, 0xc3a9, 0x8f7d, 0xc2f8, 0x8fdd, 0xc248, 0x903e, 0xc198,
|
||||
0x90a1, 0xc0e9, 0x9105, 0xc03a, 0x9169, 0xbf8c, 0x91cf, 0xbedf,
|
||||
0x9236, 0xbe32, 0x929e, 0xbd86, 0x9307, 0xbcda, 0x9371, 0xbc2f,
|
||||
0x93dc, 0xbb85, 0x9448, 0xbadc, 0x94b5, 0xba33, 0x9523, 0xb98b,
|
||||
0x9592, 0xb8e3, 0x9603, 0xb83c, 0x9674, 0xb796, 0x96e6, 0xb6f1,
|
||||
0x9759, 0xb64c, 0x97ce, 0xb5a8, 0x9843, 0xb505, 0x98b9, 0xb462,
|
||||
0x9930, 0xb3c0, 0x99a9, 0xb31f, 0x9a22, 0xb27f, 0x9a9c, 0xb1df,
|
||||
0x9b17, 0xb140, 0x9b94, 0xb0a2, 0x9c11, 0xb005, 0x9c8f, 0xaf68,
|
||||
0x9d0e, 0xaecc, 0x9d8e, 0xae31, 0x9e0f, 0xad97, 0x9e91, 0xacfd,
|
||||
0x9f14, 0xac65, 0x9f98, 0xabcd, 0xa01c, 0xab36, 0xa0a2, 0xaaa0,
|
||||
0xa129, 0xaa0a, 0xa1b0, 0xa976, 0xa238, 0xa8e2, 0xa2c2, 0xa84f,
|
||||
0xa34c, 0xa7bd, 0xa3d7, 0xa72c, 0xa463, 0xa69c, 0xa4f0, 0xa60c,
|
||||
0xa57e, 0xa57e, 0xa60c, 0xa4f0, 0xa69c, 0xa463, 0xa72c, 0xa3d7,
|
||||
0xa7bd, 0xa34c, 0xa84f, 0xa2c2, 0xa8e2, 0xa238, 0xa976, 0xa1b0,
|
||||
0xaa0a, 0xa129, 0xaaa0, 0xa0a2, 0xab36, 0xa01c, 0xabcd, 0x9f98,
|
||||
0xac65, 0x9f14, 0xacfd, 0x9e91, 0xad97, 0x9e0f, 0xae31, 0x9d8e,
|
||||
0xaecc, 0x9d0e, 0xaf68, 0x9c8f, 0xb005, 0x9c11, 0xb0a2, 0x9b94,
|
||||
0xb140, 0x9b17, 0xb1df, 0x9a9c, 0xb27f, 0x9a22, 0xb31f, 0x99a9,
|
||||
0xb3c0, 0x9930, 0xb462, 0x98b9, 0xb505, 0x9843, 0xb5a8, 0x97ce,
|
||||
0xb64c, 0x9759, 0xb6f1, 0x96e6, 0xb796, 0x9674, 0xb83c, 0x9603,
|
||||
0xb8e3, 0x9592, 0xb98b, 0x9523, 0xba33, 0x94b5, 0xbadc, 0x9448,
|
||||
0xbb85, 0x93dc, 0xbc2f, 0x9371, 0xbcda, 0x9307, 0xbd86, 0x929e,
|
||||
0xbe32, 0x9236, 0xbedf, 0x91cf, 0xbf8c, 0x9169, 0xc03a, 0x9105,
|
||||
0xc0e9, 0x90a1, 0xc198, 0x903e, 0xc248, 0x8fdd, 0xc2f8, 0x8f7d,
|
||||
0xc3a9, 0x8f1d, 0xc45b, 0x8ebf, 0xc50d, 0x8e62, 0xc5c0, 0x8e06,
|
||||
0xc673, 0x8dab, 0xc727, 0x8d51, 0xc7db, 0x8cf8, 0xc890, 0x8ca1,
|
||||
0xc946, 0x8c4a, 0xc9fc, 0x8bf5, 0xcab2, 0x8ba0, 0xcb69, 0x8b4d,
|
||||
0xcc21, 0x8afb, 0xccd9, 0x8aaa, 0xcd92, 0x8a5a, 0xce4b, 0x8a0c,
|
||||
0xcf04, 0x89be, 0xcfbe, 0x8972, 0xd079, 0x8927, 0xd134, 0x88dd,
|
||||
0xd1ef, 0x8894, 0xd2ab, 0x884c, 0xd367, 0x8805, 0xd424, 0x87c0,
|
||||
0xd4e1, 0x877b, 0xd59e, 0x8738, 0xd65c, 0x86f6, 0xd71b, 0x86b6,
|
||||
0xd7d9, 0x8676, 0xd898, 0x8637, 0xd958, 0x85fa, 0xda18, 0x85be,
|
||||
0xdad8, 0x8583, 0xdb99, 0x8549, 0xdc59, 0x8511, 0xdd1b, 0x84d9,
|
||||
0xdddc, 0x84a3, 0xde9e, 0x846e, 0xdf61, 0x843a, 0xe023, 0x8407,
|
||||
0xe0e6, 0x83d6, 0xe1a9, 0x83a6, 0xe26d, 0x8377, 0xe330, 0x8349,
|
||||
0xe3f4, 0x831c, 0xe4b9, 0x82f1, 0xe57d, 0x82c6, 0xe642, 0x829d,
|
||||
0xe707, 0x8276, 0xe7cd, 0x824f, 0xe892, 0x822a, 0xe958, 0x8205,
|
||||
0xea1e, 0x81e2, 0xeae4, 0x81c1, 0xebab, 0x81a0, 0xec71, 0x8181,
|
||||
0xed38, 0x8163, 0xedff, 0x8146, 0xeec6, 0x812a, 0xef8d, 0x8110,
|
||||
0xf055, 0x80f6, 0xf11c, 0x80de, 0xf1e4, 0x80c8, 0xf2ac, 0x80b2,
|
||||
0xf374, 0x809e, 0xf43c, 0x808b, 0xf505, 0x8079, 0xf5cd, 0x8068,
|
||||
0xf695, 0x8059, 0xf75e, 0x804b, 0xf827, 0x803e, 0xf8ef, 0x8032,
|
||||
0xf9b8, 0x8027, 0xfa81, 0x801e, 0xfb4a, 0x8016, 0xfc13, 0x800f,
|
||||
0xfcdc, 0x800a, 0xfda5, 0x8006, 0xfe6e, 0x8002, 0xff37, 0x8001,
|
||||
0x0, 0x8000, 0xc9, 0x8001, 0x192, 0x8002, 0x25b, 0x8006,
|
||||
0x324, 0x800a, 0x3ed, 0x800f, 0x4b6, 0x8016, 0x57f, 0x801e,
|
||||
0x648, 0x8027, 0x711, 0x8032, 0x7d9, 0x803e, 0x8a2, 0x804b,
|
||||
0x96b, 0x8059, 0xa33, 0x8068, 0xafb, 0x8079, 0xbc4, 0x808b,
|
||||
0xc8c, 0x809e, 0xd54, 0x80b2, 0xe1c, 0x80c8, 0xee4, 0x80de,
|
||||
0xfab, 0x80f6, 0x1073, 0x8110, 0x113a, 0x812a, 0x1201, 0x8146,
|
||||
0x12c8, 0x8163, 0x138f, 0x8181, 0x1455, 0x81a0, 0x151c, 0x81c1,
|
||||
0x15e2, 0x81e2, 0x16a8, 0x8205, 0x176e, 0x822a, 0x1833, 0x824f,
|
||||
0x18f9, 0x8276, 0x19be, 0x829d, 0x1a83, 0x82c6, 0x1b47, 0x82f1,
|
||||
0x1c0c, 0x831c, 0x1cd0, 0x8349, 0x1d93, 0x8377, 0x1e57, 0x83a6,
|
||||
0x1f1a, 0x83d6, 0x1fdd, 0x8407, 0x209f, 0x843a, 0x2162, 0x846e,
|
||||
0x2224, 0x84a3, 0x22e5, 0x84d9, 0x23a7, 0x8511, 0x2467, 0x8549,
|
||||
0x2528, 0x8583, 0x25e8, 0x85be, 0x26a8, 0x85fa, 0x2768, 0x8637,
|
||||
0x2827, 0x8676, 0x28e5, 0x86b6, 0x29a4, 0x86f6, 0x2a62, 0x8738,
|
||||
0x2b1f, 0x877b, 0x2bdc, 0x87c0, 0x2c99, 0x8805, 0x2d55, 0x884c,
|
||||
0x2e11, 0x8894, 0x2ecc, 0x88dd, 0x2f87, 0x8927, 0x3042, 0x8972,
|
||||
0x30fc, 0x89be, 0x31b5, 0x8a0c, 0x326e, 0x8a5a, 0x3327, 0x8aaa,
|
||||
0x33df, 0x8afb, 0x3497, 0x8b4d, 0x354e, 0x8ba0, 0x3604, 0x8bf5,
|
||||
0x36ba, 0x8c4a, 0x3770, 0x8ca1, 0x3825, 0x8cf8, 0x38d9, 0x8d51,
|
||||
0x398d, 0x8dab, 0x3a40, 0x8e06, 0x3af3, 0x8e62, 0x3ba5, 0x8ebf,
|
||||
0x3c57, 0x8f1d, 0x3d08, 0x8f7d, 0x3db8, 0x8fdd, 0x3e68, 0x903e,
|
||||
0x3f17, 0x90a1, 0x3fc6, 0x9105, 0x4074, 0x9169, 0x4121, 0x91cf,
|
||||
0x41ce, 0x9236, 0x427a, 0x929e, 0x4326, 0x9307, 0x43d1, 0x9371,
|
||||
0x447b, 0x93dc, 0x4524, 0x9448, 0x45cd, 0x94b5, 0x4675, 0x9523,
|
||||
0x471d, 0x9592, 0x47c4, 0x9603, 0x486a, 0x9674, 0x490f, 0x96e6,
|
||||
0x49b4, 0x9759, 0x4a58, 0x97ce, 0x4afb, 0x9843, 0x4b9e, 0x98b9,
|
||||
0x4c40, 0x9930, 0x4ce1, 0x99a9, 0x4d81, 0x9a22, 0x4e21, 0x9a9c,
|
||||
0x4ec0, 0x9b17, 0x4f5e, 0x9b94, 0x4ffb, 0x9c11, 0x5098, 0x9c8f,
|
||||
0x5134, 0x9d0e, 0x51cf, 0x9d8e, 0x5269, 0x9e0f, 0x5303, 0x9e91,
|
||||
0x539b, 0x9f14, 0x5433, 0x9f98, 0x54ca, 0xa01c, 0x5560, 0xa0a2,
|
||||
0x55f6, 0xa129, 0x568a, 0xa1b0, 0x571e, 0xa238, 0x57b1, 0xa2c2,
|
||||
0x5843, 0xa34c, 0x58d4, 0xa3d7, 0x5964, 0xa463, 0x59f4, 0xa4f0,
|
||||
0x5a82, 0xa57e, 0x5b10, 0xa60c, 0x5b9d, 0xa69c, 0x5c29, 0xa72c,
|
||||
0x5cb4, 0xa7bd, 0x5d3e, 0xa84f, 0x5dc8, 0xa8e2, 0x5e50, 0xa976,
|
||||
0x5ed7, 0xaa0a, 0x5f5e, 0xaaa0, 0x5fe4, 0xab36, 0x6068, 0xabcd,
|
||||
0x60ec, 0xac65, 0x616f, 0xacfd, 0x61f1, 0xad97, 0x6272, 0xae31,
|
||||
0x62f2, 0xaecc, 0x6371, 0xaf68, 0x63ef, 0xb005, 0x646c, 0xb0a2,
|
||||
0x64e9, 0xb140, 0x6564, 0xb1df, 0x65de, 0xb27f, 0x6657, 0xb31f,
|
||||
0x66d0, 0xb3c0, 0x6747, 0xb462, 0x67bd, 0xb505, 0x6832, 0xb5a8,
|
||||
0x68a7, 0xb64c, 0x691a, 0xb6f1, 0x698c, 0xb796, 0x69fd, 0xb83c,
|
||||
0x6a6e, 0xb8e3, 0x6add, 0xb98b, 0x6b4b, 0xba33, 0x6bb8, 0xbadc,
|
||||
0x6c24, 0xbb85, 0x6c8f, 0xbc2f, 0x6cf9, 0xbcda, 0x6d62, 0xbd86,
|
||||
0x6dca, 0xbe32, 0x6e31, 0xbedf, 0x6e97, 0xbf8c, 0x6efb, 0xc03a,
|
||||
0x6f5f, 0xc0e9, 0x6fc2, 0xc198, 0x7023, 0xc248, 0x7083, 0xc2f8,
|
||||
0x70e3, 0xc3a9, 0x7141, 0xc45b, 0x719e, 0xc50d, 0x71fa, 0xc5c0,
|
||||
0x7255, 0xc673, 0x72af, 0xc727, 0x7308, 0xc7db, 0x735f, 0xc890,
|
||||
0x73b6, 0xc946, 0x740b, 0xc9fc, 0x7460, 0xcab2, 0x74b3, 0xcb69,
|
||||
0x7505, 0xcc21, 0x7556, 0xccd9, 0x75a6, 0xcd92, 0x75f4, 0xce4b,
|
||||
0x7642, 0xcf04, 0x768e, 0xcfbe, 0x76d9, 0xd079, 0x7723, 0xd134,
|
||||
0x776c, 0xd1ef, 0x77b4, 0xd2ab, 0x77fb, 0xd367, 0x7840, 0xd424,
|
||||
0x7885, 0xd4e1, 0x78c8, 0xd59e, 0x790a, 0xd65c, 0x794a, 0xd71b,
|
||||
0x798a, 0xd7d9, 0x79c9, 0xd898, 0x7a06, 0xd958, 0x7a42, 0xda18,
|
||||
0x7a7d, 0xdad8, 0x7ab7, 0xdb99, 0x7aef, 0xdc59, 0x7b27, 0xdd1b,
|
||||
0x7b5d, 0xdddc, 0x7b92, 0xde9e, 0x7bc6, 0xdf61, 0x7bf9, 0xe023,
|
||||
0x7c2a, 0xe0e6, 0x7c5a, 0xe1a9, 0x7c89, 0xe26d, 0x7cb7, 0xe330,
|
||||
0x7ce4, 0xe3f4, 0x7d0f, 0xe4b9, 0x7d3a, 0xe57d, 0x7d63, 0xe642,
|
||||
0x7d8a, 0xe707, 0x7db1, 0xe7cd, 0x7dd6, 0xe892, 0x7dfb, 0xe958,
|
||||
0x7e1e, 0xea1e, 0x7e3f, 0xeae4, 0x7e60, 0xebab, 0x7e7f, 0xec71,
|
||||
0x7e9d, 0xed38, 0x7eba, 0xedff, 0x7ed6, 0xeec6, 0x7ef0, 0xef8d,
|
||||
0x7f0a, 0xf055, 0x7f22, 0xf11c, 0x7f38, 0xf1e4, 0x7f4e, 0xf2ac,
|
||||
0x7f62, 0xf374, 0x7f75, 0xf43c, 0x7f87, 0xf505, 0x7f98, 0xf5cd,
|
||||
0x7fa7, 0xf695, 0x7fb5, 0xf75e, 0x7fc2, 0xf827, 0x7fce, 0xf8ef,
|
||||
0x7fd9, 0xf9b8, 0x7fe2, 0xfa81, 0x7fea, 0xfb4a, 0x7ff1, 0xfc13,
|
||||
0x7ff6, 0xfcdc, 0x7ffa, 0xfda5, 0x7ffe, 0xfe6e, 0x7fff, 0xff37
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @brief Initialization function for the Q15 CFFT/CIFFT.
|
||||
* @param[in,out] *S points to an instance of the Q15 CFFT/CIFFT structure.
|
||||
* @param[in] fftLen length of the FFT.
|
||||
* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform.
|
||||
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output.
|
||||
* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLen</code> is not a supported value.
|
||||
*
|
||||
* \par Description:
|
||||
* \par
|
||||
* The parameter <code>ifftFlag</code> controls whether a forward or inverse transform is computed.
|
||||
* Set(=1) ifftFlag for calculation of CIFFT otherwise CFFT is calculated
|
||||
* \par
|
||||
* The parameter <code>bitReverseFlag</code> controls whether output is in normal order or bit reversed order.
|
||||
* Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order.
|
||||
* \par
|
||||
* The parameter <code>fftLen</code> Specifies length of CFFT/CIFFT process. Supported FFT Lengths are 16, 64, 256, 1024.
|
||||
* \par
|
||||
* This Function also initializes Twiddle factor table pointer and Bit reversal table pointer.
|
||||
*/
|
||||
|
||||
arm_status arm_cfft_radix4_init_q15(
|
||||
arm_cfft_radix4_instance_q15 * S,
|
||||
uint16_t fftLen,
|
||||
uint8_t ifftFlag,
|
||||
uint8_t bitReverseFlag)
|
||||
{
|
||||
/* Initialise the default arm status */
|
||||
arm_status status = ARM_MATH_SUCCESS;
|
||||
/* Initialise the FFT length */
|
||||
S->fftLen = fftLen;
|
||||
/* Initialise the Twiddle coefficient pointer */
|
||||
S->pTwiddle = (q15_t *) twiddleCoefQ15;
|
||||
/* Initialise the Flag for selection of CFFT or CIFFT */
|
||||
S->ifftFlag = ifftFlag;
|
||||
/* Initialise the Flag for calculation Bit reversal or not */
|
||||
S->bitReverseFlag = bitReverseFlag;
|
||||
|
||||
/* Initializations of structure parameters depending on the FFT length */
|
||||
switch (S->fftLen)
|
||||
{
|
||||
/* Initializations of structure parameters for 1024 point FFT */
|
||||
case 1024u:
|
||||
/* Initialise the twiddle coef modifier value */
|
||||
S->twidCoefModifier = 1u;
|
||||
/* Initialise the bit reversal table modifier */
|
||||
S->bitRevFactor = 1u;
|
||||
/* Initialise the bit reversal table pointer */
|
||||
S->pBitRevTable = armBitRevTable;
|
||||
|
||||
break;
|
||||
case 256u:
|
||||
/* Initializations of structure parameters for 2566 point FFT */
|
||||
S->twidCoefModifier = 4u;
|
||||
S->bitRevFactor = 4u;
|
||||
S->pBitRevTable = &armBitRevTable[3];
|
||||
|
||||
break;
|
||||
case 64u:
|
||||
/* Initializations of structure parameters for 64 point FFT */
|
||||
S->twidCoefModifier = 16u;
|
||||
S->bitRevFactor = 16u;
|
||||
S->pBitRevTable = &armBitRevTable[15];
|
||||
|
||||
break;
|
||||
case 16u:
|
||||
/* Initializations of structure parameters for 16 point FFT */
|
||||
S->twidCoefModifier = 64u;
|
||||
S->bitRevFactor = 64u;
|
||||
S->pBitRevTable = &armBitRevTable[63];
|
||||
|
||||
break;
|
||||
default:
|
||||
/* Reporting argument error if fftSize is not valid value */
|
||||
status = ARM_MATH_ARGUMENT_ERROR;
|
||||
break;
|
||||
}
|
||||
|
||||
return (status);
|
||||
}
|
||||
|
||||
/**
|
||||
* @} end of CFFT_CIFFT group
|
||||
*/
|
@ -0,0 +1,670 @@
|
||||
/* ----------------------------------------------------------------------
|
||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
||||
*
|
||||
* $Date: 15. July 2011
|
||||
* $Revision: V1.0.10
|
||||
*
|
||||
* Project: CMSIS DSP Library
|
||||
* Title: arm_cfft_radix4_init_q31.c
|
||||
*
|
||||
* Description: Radix-4 Decimation in Frequency Q31 FFT & IFFT initialization function
|
||||
*
|
||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
||||
*
|
||||
* Version 1.0.10 2011/7/15
|
||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
||||
*
|
||||
* Version 1.0.3 2010/11/29
|
||||
* Re-organized the CMSIS folders and updated documentation.
|
||||
*
|
||||
* Version 1.0.2 2010/11/11
|
||||
* Documentation updated.
|
||||
*
|
||||
* Version 1.0.1 2010/10/05
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 1.0.0 2010/09/20
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 0.0.5 2010/04/26
|
||||
* incorporated review comments and updated with latest CMSIS layer
|
||||
*
|
||||
* Version 0.0.3 2010/03/10
|
||||
* Initial version
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#include "arm_math.h"
|
||||
#include "arm_common_tables.h"
|
||||
|
||||
/**
|
||||
* @ingroup groupTransforms
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup CFFT_CIFFT
|
||||
* @{
|
||||
*/
|
||||
|
||||
/*
|
||||
* @brief Twiddle factors Table
|
||||
*/
|
||||
|
||||
/**
|
||||
* \par
|
||||
* Example code for Q31 Twiddle factors Generation::
|
||||
* \par
|
||||
* <pre>for(i = 0; i< N; i++)
|
||||
* {
|
||||
* twiddleCoefQ31[2*i]= cos(i * 2*PI/(float)N);
|
||||
* twiddleCoefQ31[2*i+1]= sin(i * 2*PI/(float)N);
|
||||
* } </pre>
|
||||
* \par
|
||||
* where N = 1024 and PI = 3.14159265358979
|
||||
* \par
|
||||
* Cos and Sin values are interleaved fashion
|
||||
* \par
|
||||
* Convert Floating point to Q31(Fixed point 1.31):
|
||||
* round(twiddleCoefQ31(i) * pow(2, 31))
|
||||
*
|
||||
*/
|
||||
|
||||
static const q31_t twiddleCoefQ31[2048] = {
|
||||
0x7fffffff, 0x0, 0x7fff6216, 0xc90f88, 0x7ffd885a, 0x1921d20, 0x7ffa72d1,
|
||||
0x25b26d7,
|
||||
0x7ff62182, 0x3242abf, 0x7ff09478, 0x3ed26e6, 0x7fe9cbc0, 0x4b6195d,
|
||||
0x7fe1c76b, 0x57f0035,
|
||||
0x7fd8878e, 0x647d97c, 0x7fce0c3e, 0x710a345, 0x7fc25596, 0x7d95b9e,
|
||||
0x7fb563b3, 0x8a2009a,
|
||||
0x7fa736b4, 0x96a9049, 0x7f97cebd, 0xa3308bd, 0x7f872bf3, 0xafb6805,
|
||||
0x7f754e80, 0xbc3ac35,
|
||||
0x7f62368f, 0xc8bd35e, 0x7f4de451, 0xd53db92, 0x7f3857f6, 0xe1bc2e4,
|
||||
0x7f2191b4, 0xee38766,
|
||||
0x7f0991c4, 0xfab272b, 0x7ef05860, 0x1072a048, 0x7ed5e5c6, 0x1139f0cf,
|
||||
0x7eba3a39, 0x120116d5,
|
||||
0x7e9d55fc, 0x12c8106f, 0x7e7f3957, 0x138edbb1, 0x7e5fe493, 0x145576b1,
|
||||
0x7e3f57ff, 0x151bdf86,
|
||||
0x7e1d93ea, 0x15e21445, 0x7dfa98a8, 0x16a81305, 0x7dd6668f, 0x176dd9de,
|
||||
0x7db0fdf8, 0x183366e9,
|
||||
0x7d8a5f40, 0x18f8b83c, 0x7d628ac6, 0x19bdcbf3, 0x7d3980ec, 0x1a82a026,
|
||||
0x7d0f4218, 0x1b4732ef,
|
||||
0x7ce3ceb2, 0x1c0b826a, 0x7cb72724, 0x1ccf8cb3, 0x7c894bde, 0x1d934fe5,
|
||||
0x7c5a3d50, 0x1e56ca1e,
|
||||
0x7c29fbee, 0x1f19f97b, 0x7bf88830, 0x1fdcdc1b, 0x7bc5e290, 0x209f701c,
|
||||
0x7b920b89, 0x2161b3a0,
|
||||
0x7b5d039e, 0x2223a4c5, 0x7b26cb4f, 0x22e541af, 0x7aef6323, 0x23a6887f,
|
||||
0x7ab6cba4, 0x24677758,
|
||||
0x7a7d055b, 0x25280c5e, 0x7a4210d8, 0x25e845b6, 0x7a05eead, 0x26a82186,
|
||||
0x79c89f6e, 0x27679df4,
|
||||
0x798a23b1, 0x2826b928, 0x794a7c12, 0x28e5714b, 0x7909a92d, 0x29a3c485,
|
||||
0x78c7aba2, 0x2a61b101,
|
||||
0x78848414, 0x2b1f34eb, 0x78403329, 0x2bdc4e6f, 0x77fab989, 0x2c98fbba,
|
||||
0x77b417df, 0x2d553afc,
|
||||
0x776c4edb, 0x2e110a62, 0x77235f2d, 0x2ecc681e, 0x76d94989, 0x2f875262,
|
||||
0x768e0ea6, 0x3041c761,
|
||||
0x7641af3d, 0x30fbc54d, 0x75f42c0b, 0x31b54a5e, 0x75a585cf, 0x326e54c7,
|
||||
0x7555bd4c, 0x3326e2c3,
|
||||
0x7504d345, 0x33def287, 0x74b2c884, 0x34968250, 0x745f9dd1, 0x354d9057,
|
||||
0x740b53fb, 0x36041ad9,
|
||||
0x73b5ebd1, 0x36ba2014, 0x735f6626, 0x376f9e46, 0x7307c3d0, 0x382493b0,
|
||||
0x72af05a7, 0x38d8fe93,
|
||||
0x72552c85, 0x398cdd32, 0x71fa3949, 0x3a402dd2, 0x719e2cd2, 0x3af2eeb7,
|
||||
0x71410805, 0x3ba51e29,
|
||||
0x70e2cbc6, 0x3c56ba70, 0x708378ff, 0x3d07c1d6, 0x7023109a, 0x3db832a6,
|
||||
0x6fc19385, 0x3e680b2c,
|
||||
0x6f5f02b2, 0x3f1749b8, 0x6efb5f12, 0x3fc5ec98, 0x6e96a99d, 0x4073f21d,
|
||||
0x6e30e34a, 0x4121589b,
|
||||
0x6dca0d14, 0x41ce1e65, 0x6d6227fa, 0x427a41d0, 0x6cf934fc, 0x4325c135,
|
||||
0x6c8f351c, 0x43d09aed,
|
||||
0x6c242960, 0x447acd50, 0x6bb812d1, 0x452456bd, 0x6b4af279, 0x45cd358f,
|
||||
0x6adcc964, 0x46756828,
|
||||
0x6a6d98a4, 0x471cece7, 0x69fd614a, 0x47c3c22f, 0x698c246c, 0x4869e665,
|
||||
0x6919e320, 0x490f57ee,
|
||||
0x68a69e81, 0x49b41533, 0x683257ab, 0x4a581c9e, 0x67bd0fbd, 0x4afb6c98,
|
||||
0x6746c7d8, 0x4b9e0390,
|
||||
0x66cf8120, 0x4c3fdff4, 0x66573cbb, 0x4ce10034, 0x65ddfbd3, 0x4d8162c4,
|
||||
0x6563bf92, 0x4e210617,
|
||||
0x64e88926, 0x4ebfe8a5, 0x646c59bf, 0x4f5e08e3, 0x63ef3290, 0x4ffb654d,
|
||||
0x637114cc, 0x5097fc5e,
|
||||
0x62f201ac, 0x5133cc94, 0x6271fa69, 0x51ced46e, 0x61f1003f, 0x5269126e,
|
||||
0x616f146c, 0x53028518,
|
||||
0x60ec3830, 0x539b2af0, 0x60686ccf, 0x5433027d, 0x5fe3b38d, 0x54ca0a4b,
|
||||
0x5f5e0db3, 0x556040e2,
|
||||
0x5ed77c8a, 0x55f5a4d2, 0x5e50015d, 0x568a34a9, 0x5dc79d7c, 0x571deefa,
|
||||
0x5d3e5237, 0x57b0d256,
|
||||
0x5cb420e0, 0x5842dd54, 0x5c290acc, 0x58d40e8c, 0x5b9d1154, 0x59646498,
|
||||
0x5b1035cf, 0x59f3de12,
|
||||
0x5a82799a, 0x5a82799a, 0x59f3de12, 0x5b1035cf, 0x59646498, 0x5b9d1154,
|
||||
0x58d40e8c, 0x5c290acc,
|
||||
0x5842dd54, 0x5cb420e0, 0x57b0d256, 0x5d3e5237, 0x571deefa, 0x5dc79d7c,
|
||||
0x568a34a9, 0x5e50015d,
|
||||
0x55f5a4d2, 0x5ed77c8a, 0x556040e2, 0x5f5e0db3, 0x54ca0a4b, 0x5fe3b38d,
|
||||
0x5433027d, 0x60686ccf,
|
||||
0x539b2af0, 0x60ec3830, 0x53028518, 0x616f146c, 0x5269126e, 0x61f1003f,
|
||||
0x51ced46e, 0x6271fa69,
|
||||
0x5133cc94, 0x62f201ac, 0x5097fc5e, 0x637114cc, 0x4ffb654d, 0x63ef3290,
|
||||
0x4f5e08e3, 0x646c59bf,
|
||||
0x4ebfe8a5, 0x64e88926, 0x4e210617, 0x6563bf92, 0x4d8162c4, 0x65ddfbd3,
|
||||
0x4ce10034, 0x66573cbb,
|
||||
0x4c3fdff4, 0x66cf8120, 0x4b9e0390, 0x6746c7d8, 0x4afb6c98, 0x67bd0fbd,
|
||||
0x4a581c9e, 0x683257ab,
|
||||
0x49b41533, 0x68a69e81, 0x490f57ee, 0x6919e320, 0x4869e665, 0x698c246c,
|
||||
0x47c3c22f, 0x69fd614a,
|
||||
0x471cece7, 0x6a6d98a4, 0x46756828, 0x6adcc964, 0x45cd358f, 0x6b4af279,
|
||||
0x452456bd, 0x6bb812d1,
|
||||
0x447acd50, 0x6c242960, 0x43d09aed, 0x6c8f351c, 0x4325c135, 0x6cf934fc,
|
||||
0x427a41d0, 0x6d6227fa,
|
||||
0x41ce1e65, 0x6dca0d14, 0x4121589b, 0x6e30e34a, 0x4073f21d, 0x6e96a99d,
|
||||
0x3fc5ec98, 0x6efb5f12,
|
||||
0x3f1749b8, 0x6f5f02b2, 0x3e680b2c, 0x6fc19385, 0x3db832a6, 0x7023109a,
|
||||
0x3d07c1d6, 0x708378ff,
|
||||
0x3c56ba70, 0x70e2cbc6, 0x3ba51e29, 0x71410805, 0x3af2eeb7, 0x719e2cd2,
|
||||
0x3a402dd2, 0x71fa3949,
|
||||
0x398cdd32, 0x72552c85, 0x38d8fe93, 0x72af05a7, 0x382493b0, 0x7307c3d0,
|
||||
0x376f9e46, 0x735f6626,
|
||||
0x36ba2014, 0x73b5ebd1, 0x36041ad9, 0x740b53fb, 0x354d9057, 0x745f9dd1,
|
||||
0x34968250, 0x74b2c884,
|
||||
0x33def287, 0x7504d345, 0x3326e2c3, 0x7555bd4c, 0x326e54c7, 0x75a585cf,
|
||||
0x31b54a5e, 0x75f42c0b,
|
||||
0x30fbc54d, 0x7641af3d, 0x3041c761, 0x768e0ea6, 0x2f875262, 0x76d94989,
|
||||
0x2ecc681e, 0x77235f2d,
|
||||
0x2e110a62, 0x776c4edb, 0x2d553afc, 0x77b417df, 0x2c98fbba, 0x77fab989,
|
||||
0x2bdc4e6f, 0x78403329,
|
||||
0x2b1f34eb, 0x78848414, 0x2a61b101, 0x78c7aba2, 0x29a3c485, 0x7909a92d,
|
||||
0x28e5714b, 0x794a7c12,
|
||||
0x2826b928, 0x798a23b1, 0x27679df4, 0x79c89f6e, 0x26a82186, 0x7a05eead,
|
||||
0x25e845b6, 0x7a4210d8,
|
||||
0x25280c5e, 0x7a7d055b, 0x24677758, 0x7ab6cba4, 0x23a6887f, 0x7aef6323,
|
||||
0x22e541af, 0x7b26cb4f,
|
||||
0x2223a4c5, 0x7b5d039e, 0x2161b3a0, 0x7b920b89, 0x209f701c, 0x7bc5e290,
|
||||
0x1fdcdc1b, 0x7bf88830,
|
||||
0x1f19f97b, 0x7c29fbee, 0x1e56ca1e, 0x7c5a3d50, 0x1d934fe5, 0x7c894bde,
|
||||
0x1ccf8cb3, 0x7cb72724,
|
||||
0x1c0b826a, 0x7ce3ceb2, 0x1b4732ef, 0x7d0f4218, 0x1a82a026, 0x7d3980ec,
|
||||
0x19bdcbf3, 0x7d628ac6,
|
||||
0x18f8b83c, 0x7d8a5f40, 0x183366e9, 0x7db0fdf8, 0x176dd9de, 0x7dd6668f,
|
||||
0x16a81305, 0x7dfa98a8,
|
||||
0x15e21445, 0x7e1d93ea, 0x151bdf86, 0x7e3f57ff, 0x145576b1, 0x7e5fe493,
|
||||
0x138edbb1, 0x7e7f3957,
|
||||
0x12c8106f, 0x7e9d55fc, 0x120116d5, 0x7eba3a39, 0x1139f0cf, 0x7ed5e5c6,
|
||||
0x1072a048, 0x7ef05860,
|
||||
0xfab272b, 0x7f0991c4, 0xee38766, 0x7f2191b4, 0xe1bc2e4, 0x7f3857f6,
|
||||
0xd53db92, 0x7f4de451,
|
||||
0xc8bd35e, 0x7f62368f, 0xbc3ac35, 0x7f754e80, 0xafb6805, 0x7f872bf3,
|
||||
0xa3308bd, 0x7f97cebd,
|
||||
0x96a9049, 0x7fa736b4, 0x8a2009a, 0x7fb563b3, 0x7d95b9e, 0x7fc25596,
|
||||
0x710a345, 0x7fce0c3e,
|
||||
0x647d97c, 0x7fd8878e, 0x57f0035, 0x7fe1c76b, 0x4b6195d, 0x7fe9cbc0,
|
||||
0x3ed26e6, 0x7ff09478,
|
||||
0x3242abf, 0x7ff62182, 0x25b26d7, 0x7ffa72d1, 0x1921d20, 0x7ffd885a,
|
||||
0xc90f88, 0x7fff6216,
|
||||
0x0, 0x7fffffff, 0xff36f078, 0x7fff6216, 0xfe6de2e0, 0x7ffd885a, 0xfda4d929,
|
||||
0x7ffa72d1,
|
||||
0xfcdbd541, 0x7ff62182, 0xfc12d91a, 0x7ff09478, 0xfb49e6a3, 0x7fe9cbc0,
|
||||
0xfa80ffcb, 0x7fe1c76b,
|
||||
0xf9b82684, 0x7fd8878e, 0xf8ef5cbb, 0x7fce0c3e, 0xf826a462, 0x7fc25596,
|
||||
0xf75dff66, 0x7fb563b3,
|
||||
0xf6956fb7, 0x7fa736b4, 0xf5ccf743, 0x7f97cebd, 0xf50497fb, 0x7f872bf3,
|
||||
0xf43c53cb, 0x7f754e80,
|
||||
0xf3742ca2, 0x7f62368f, 0xf2ac246e, 0x7f4de451, 0xf1e43d1c, 0x7f3857f6,
|
||||
0xf11c789a, 0x7f2191b4,
|
||||
0xf054d8d5, 0x7f0991c4, 0xef8d5fb8, 0x7ef05860, 0xeec60f31, 0x7ed5e5c6,
|
||||
0xedfee92b, 0x7eba3a39,
|
||||
0xed37ef91, 0x7e9d55fc, 0xec71244f, 0x7e7f3957, 0xebaa894f, 0x7e5fe493,
|
||||
0xeae4207a, 0x7e3f57ff,
|
||||
0xea1debbb, 0x7e1d93ea, 0xe957ecfb, 0x7dfa98a8, 0xe8922622, 0x7dd6668f,
|
||||
0xe7cc9917, 0x7db0fdf8,
|
||||
0xe70747c4, 0x7d8a5f40, 0xe642340d, 0x7d628ac6, 0xe57d5fda, 0x7d3980ec,
|
||||
0xe4b8cd11, 0x7d0f4218,
|
||||
0xe3f47d96, 0x7ce3ceb2, 0xe330734d, 0x7cb72724, 0xe26cb01b, 0x7c894bde,
|
||||
0xe1a935e2, 0x7c5a3d50,
|
||||
0xe0e60685, 0x7c29fbee, 0xe02323e5, 0x7bf88830, 0xdf608fe4, 0x7bc5e290,
|
||||
0xde9e4c60, 0x7b920b89,
|
||||
0xdddc5b3b, 0x7b5d039e, 0xdd1abe51, 0x7b26cb4f, 0xdc597781, 0x7aef6323,
|
||||
0xdb9888a8, 0x7ab6cba4,
|
||||
0xdad7f3a2, 0x7a7d055b, 0xda17ba4a, 0x7a4210d8, 0xd957de7a, 0x7a05eead,
|
||||
0xd898620c, 0x79c89f6e,
|
||||
0xd7d946d8, 0x798a23b1, 0xd71a8eb5, 0x794a7c12, 0xd65c3b7b, 0x7909a92d,
|
||||
0xd59e4eff, 0x78c7aba2,
|
||||
0xd4e0cb15, 0x78848414, 0xd423b191, 0x78403329, 0xd3670446, 0x77fab989,
|
||||
0xd2aac504, 0x77b417df,
|
||||
0xd1eef59e, 0x776c4edb, 0xd13397e2, 0x77235f2d, 0xd078ad9e, 0x76d94989,
|
||||
0xcfbe389f, 0x768e0ea6,
|
||||
0xcf043ab3, 0x7641af3d, 0xce4ab5a2, 0x75f42c0b, 0xcd91ab39, 0x75a585cf,
|
||||
0xccd91d3d, 0x7555bd4c,
|
||||
0xcc210d79, 0x7504d345, 0xcb697db0, 0x74b2c884, 0xcab26fa9, 0x745f9dd1,
|
||||
0xc9fbe527, 0x740b53fb,
|
||||
0xc945dfec, 0x73b5ebd1, 0xc89061ba, 0x735f6626, 0xc7db6c50, 0x7307c3d0,
|
||||
0xc727016d, 0x72af05a7,
|
||||
0xc67322ce, 0x72552c85, 0xc5bfd22e, 0x71fa3949, 0xc50d1149, 0x719e2cd2,
|
||||
0xc45ae1d7, 0x71410805,
|
||||
0xc3a94590, 0x70e2cbc6, 0xc2f83e2a, 0x708378ff, 0xc247cd5a, 0x7023109a,
|
||||
0xc197f4d4, 0x6fc19385,
|
||||
0xc0e8b648, 0x6f5f02b2, 0xc03a1368, 0x6efb5f12, 0xbf8c0de3, 0x6e96a99d,
|
||||
0xbedea765, 0x6e30e34a,
|
||||
0xbe31e19b, 0x6dca0d14, 0xbd85be30, 0x6d6227fa, 0xbcda3ecb, 0x6cf934fc,
|
||||
0xbc2f6513, 0x6c8f351c,
|
||||
0xbb8532b0, 0x6c242960, 0xbadba943, 0x6bb812d1, 0xba32ca71, 0x6b4af279,
|
||||
0xb98a97d8, 0x6adcc964,
|
||||
0xb8e31319, 0x6a6d98a4, 0xb83c3dd1, 0x69fd614a, 0xb796199b, 0x698c246c,
|
||||
0xb6f0a812, 0x6919e320,
|
||||
0xb64beacd, 0x68a69e81, 0xb5a7e362, 0x683257ab, 0xb5049368, 0x67bd0fbd,
|
||||
0xb461fc70, 0x6746c7d8,
|
||||
0xb3c0200c, 0x66cf8120, 0xb31effcc, 0x66573cbb, 0xb27e9d3c, 0x65ddfbd3,
|
||||
0xb1def9e9, 0x6563bf92,
|
||||
0xb140175b, 0x64e88926, 0xb0a1f71d, 0x646c59bf, 0xb0049ab3, 0x63ef3290,
|
||||
0xaf6803a2, 0x637114cc,
|
||||
0xaecc336c, 0x62f201ac, 0xae312b92, 0x6271fa69, 0xad96ed92, 0x61f1003f,
|
||||
0xacfd7ae8, 0x616f146c,
|
||||
0xac64d510, 0x60ec3830, 0xabccfd83, 0x60686ccf, 0xab35f5b5, 0x5fe3b38d,
|
||||
0xaa9fbf1e, 0x5f5e0db3,
|
||||
0xaa0a5b2e, 0x5ed77c8a, 0xa975cb57, 0x5e50015d, 0xa8e21106, 0x5dc79d7c,
|
||||
0xa84f2daa, 0x5d3e5237,
|
||||
0xa7bd22ac, 0x5cb420e0, 0xa72bf174, 0x5c290acc, 0xa69b9b68, 0x5b9d1154,
|
||||
0xa60c21ee, 0x5b1035cf,
|
||||
0xa57d8666, 0x5a82799a, 0xa4efca31, 0x59f3de12, 0xa462eeac, 0x59646498,
|
||||
0xa3d6f534, 0x58d40e8c,
|
||||
0xa34bdf20, 0x5842dd54, 0xa2c1adc9, 0x57b0d256, 0xa2386284, 0x571deefa,
|
||||
0xa1affea3, 0x568a34a9,
|
||||
0xa1288376, 0x55f5a4d2, 0xa0a1f24d, 0x556040e2, 0xa01c4c73, 0x54ca0a4b,
|
||||
0x9f979331, 0x5433027d,
|
||||
0x9f13c7d0, 0x539b2af0, 0x9e90eb94, 0x53028518, 0x9e0effc1, 0x5269126e,
|
||||
0x9d8e0597, 0x51ced46e,
|
||||
0x9d0dfe54, 0x5133cc94, 0x9c8eeb34, 0x5097fc5e, 0x9c10cd70, 0x4ffb654d,
|
||||
0x9b93a641, 0x4f5e08e3,
|
||||
0x9b1776da, 0x4ebfe8a5, 0x9a9c406e, 0x4e210617, 0x9a22042d, 0x4d8162c4,
|
||||
0x99a8c345, 0x4ce10034,
|
||||
0x99307ee0, 0x4c3fdff4, 0x98b93828, 0x4b9e0390, 0x9842f043, 0x4afb6c98,
|
||||
0x97cda855, 0x4a581c9e,
|
||||
0x9759617f, 0x49b41533, 0x96e61ce0, 0x490f57ee, 0x9673db94, 0x4869e665,
|
||||
0x96029eb6, 0x47c3c22f,
|
||||
0x9592675c, 0x471cece7, 0x9523369c, 0x46756828, 0x94b50d87, 0x45cd358f,
|
||||
0x9447ed2f, 0x452456bd,
|
||||
0x93dbd6a0, 0x447acd50, 0x9370cae4, 0x43d09aed, 0x9306cb04, 0x4325c135,
|
||||
0x929dd806, 0x427a41d0,
|
||||
0x9235f2ec, 0x41ce1e65, 0x91cf1cb6, 0x4121589b, 0x91695663, 0x4073f21d,
|
||||
0x9104a0ee, 0x3fc5ec98,
|
||||
0x90a0fd4e, 0x3f1749b8, 0x903e6c7b, 0x3e680b2c, 0x8fdcef66, 0x3db832a6,
|
||||
0x8f7c8701, 0x3d07c1d6,
|
||||
0x8f1d343a, 0x3c56ba70, 0x8ebef7fb, 0x3ba51e29, 0x8e61d32e, 0x3af2eeb7,
|
||||
0x8e05c6b7, 0x3a402dd2,
|
||||
0x8daad37b, 0x398cdd32, 0x8d50fa59, 0x38d8fe93, 0x8cf83c30, 0x382493b0,
|
||||
0x8ca099da, 0x376f9e46,
|
||||
0x8c4a142f, 0x36ba2014, 0x8bf4ac05, 0x36041ad9, 0x8ba0622f, 0x354d9057,
|
||||
0x8b4d377c, 0x34968250,
|
||||
0x8afb2cbb, 0x33def287, 0x8aaa42b4, 0x3326e2c3, 0x8a5a7a31, 0x326e54c7,
|
||||
0x8a0bd3f5, 0x31b54a5e,
|
||||
0x89be50c3, 0x30fbc54d, 0x8971f15a, 0x3041c761, 0x8926b677, 0x2f875262,
|
||||
0x88dca0d3, 0x2ecc681e,
|
||||
0x8893b125, 0x2e110a62, 0x884be821, 0x2d553afc, 0x88054677, 0x2c98fbba,
|
||||
0x87bfccd7, 0x2bdc4e6f,
|
||||
0x877b7bec, 0x2b1f34eb, 0x8738545e, 0x2a61b101, 0x86f656d3, 0x29a3c485,
|
||||
0x86b583ee, 0x28e5714b,
|
||||
0x8675dc4f, 0x2826b928, 0x86376092, 0x27679df4, 0x85fa1153, 0x26a82186,
|
||||
0x85bdef28, 0x25e845b6,
|
||||
0x8582faa5, 0x25280c5e, 0x8549345c, 0x24677758, 0x85109cdd, 0x23a6887f,
|
||||
0x84d934b1, 0x22e541af,
|
||||
0x84a2fc62, 0x2223a4c5, 0x846df477, 0x2161b3a0, 0x843a1d70, 0x209f701c,
|
||||
0x840777d0, 0x1fdcdc1b,
|
||||
0x83d60412, 0x1f19f97b, 0x83a5c2b0, 0x1e56ca1e, 0x8376b422, 0x1d934fe5,
|
||||
0x8348d8dc, 0x1ccf8cb3,
|
||||
0x831c314e, 0x1c0b826a, 0x82f0bde8, 0x1b4732ef, 0x82c67f14, 0x1a82a026,
|
||||
0x829d753a, 0x19bdcbf3,
|
||||
0x8275a0c0, 0x18f8b83c, 0x824f0208, 0x183366e9, 0x82299971, 0x176dd9de,
|
||||
0x82056758, 0x16a81305,
|
||||
0x81e26c16, 0x15e21445, 0x81c0a801, 0x151bdf86, 0x81a01b6d, 0x145576b1,
|
||||
0x8180c6a9, 0x138edbb1,
|
||||
0x8162aa04, 0x12c8106f, 0x8145c5c7, 0x120116d5, 0x812a1a3a, 0x1139f0cf,
|
||||
0x810fa7a0, 0x1072a048,
|
||||
0x80f66e3c, 0xfab272b, 0x80de6e4c, 0xee38766, 0x80c7a80a, 0xe1bc2e4,
|
||||
0x80b21baf, 0xd53db92,
|
||||
0x809dc971, 0xc8bd35e, 0x808ab180, 0xbc3ac35, 0x8078d40d, 0xafb6805,
|
||||
0x80683143, 0xa3308bd,
|
||||
0x8058c94c, 0x96a9049, 0x804a9c4d, 0x8a2009a, 0x803daa6a, 0x7d95b9e,
|
||||
0x8031f3c2, 0x710a345,
|
||||
0x80277872, 0x647d97c, 0x801e3895, 0x57f0035, 0x80163440, 0x4b6195d,
|
||||
0x800f6b88, 0x3ed26e6,
|
||||
0x8009de7e, 0x3242abf, 0x80058d2f, 0x25b26d7, 0x800277a6, 0x1921d20,
|
||||
0x80009dea, 0xc90f88,
|
||||
0x80000000, 0x0, 0x80009dea, 0xff36f078, 0x800277a6, 0xfe6de2e0, 0x80058d2f,
|
||||
0xfda4d929,
|
||||
0x8009de7e, 0xfcdbd541, 0x800f6b88, 0xfc12d91a, 0x80163440, 0xfb49e6a3,
|
||||
0x801e3895, 0xfa80ffcb,
|
||||
0x80277872, 0xf9b82684, 0x8031f3c2, 0xf8ef5cbb, 0x803daa6a, 0xf826a462,
|
||||
0x804a9c4d, 0xf75dff66,
|
||||
0x8058c94c, 0xf6956fb7, 0x80683143, 0xf5ccf743, 0x8078d40d, 0xf50497fb,
|
||||
0x808ab180, 0xf43c53cb,
|
||||
0x809dc971, 0xf3742ca2, 0x80b21baf, 0xf2ac246e, 0x80c7a80a, 0xf1e43d1c,
|
||||
0x80de6e4c, 0xf11c789a,
|
||||
0x80f66e3c, 0xf054d8d5, 0x810fa7a0, 0xef8d5fb8, 0x812a1a3a, 0xeec60f31,
|
||||
0x8145c5c7, 0xedfee92b,
|
||||
0x8162aa04, 0xed37ef91, 0x8180c6a9, 0xec71244f, 0x81a01b6d, 0xebaa894f,
|
||||
0x81c0a801, 0xeae4207a,
|
||||
0x81e26c16, 0xea1debbb, 0x82056758, 0xe957ecfb, 0x82299971, 0xe8922622,
|
||||
0x824f0208, 0xe7cc9917,
|
||||
0x8275a0c0, 0xe70747c4, 0x829d753a, 0xe642340d, 0x82c67f14, 0xe57d5fda,
|
||||
0x82f0bde8, 0xe4b8cd11,
|
||||
0x831c314e, 0xe3f47d96, 0x8348d8dc, 0xe330734d, 0x8376b422, 0xe26cb01b,
|
||||
0x83a5c2b0, 0xe1a935e2,
|
||||
0x83d60412, 0xe0e60685, 0x840777d0, 0xe02323e5, 0x843a1d70, 0xdf608fe4,
|
||||
0x846df477, 0xde9e4c60,
|
||||
0x84a2fc62, 0xdddc5b3b, 0x84d934b1, 0xdd1abe51, 0x85109cdd, 0xdc597781,
|
||||
0x8549345c, 0xdb9888a8,
|
||||
0x8582faa5, 0xdad7f3a2, 0x85bdef28, 0xda17ba4a, 0x85fa1153, 0xd957de7a,
|
||||
0x86376092, 0xd898620c,
|
||||
0x8675dc4f, 0xd7d946d8, 0x86b583ee, 0xd71a8eb5, 0x86f656d3, 0xd65c3b7b,
|
||||
0x8738545e, 0xd59e4eff,
|
||||
0x877b7bec, 0xd4e0cb15, 0x87bfccd7, 0xd423b191, 0x88054677, 0xd3670446,
|
||||
0x884be821, 0xd2aac504,
|
||||
0x8893b125, 0xd1eef59e, 0x88dca0d3, 0xd13397e2, 0x8926b677, 0xd078ad9e,
|
||||
0x8971f15a, 0xcfbe389f,
|
||||
0x89be50c3, 0xcf043ab3, 0x8a0bd3f5, 0xce4ab5a2, 0x8a5a7a31, 0xcd91ab39,
|
||||
0x8aaa42b4, 0xccd91d3d,
|
||||
0x8afb2cbb, 0xcc210d79, 0x8b4d377c, 0xcb697db0, 0x8ba0622f, 0xcab26fa9,
|
||||
0x8bf4ac05, 0xc9fbe527,
|
||||
0x8c4a142f, 0xc945dfec, 0x8ca099da, 0xc89061ba, 0x8cf83c30, 0xc7db6c50,
|
||||
0x8d50fa59, 0xc727016d,
|
||||
0x8daad37b, 0xc67322ce, 0x8e05c6b7, 0xc5bfd22e, 0x8e61d32e, 0xc50d1149,
|
||||
0x8ebef7fb, 0xc45ae1d7,
|
||||
0x8f1d343a, 0xc3a94590, 0x8f7c8701, 0xc2f83e2a, 0x8fdcef66, 0xc247cd5a,
|
||||
0x903e6c7b, 0xc197f4d4,
|
||||
0x90a0fd4e, 0xc0e8b648, 0x9104a0ee, 0xc03a1368, 0x91695663, 0xbf8c0de3,
|
||||
0x91cf1cb6, 0xbedea765,
|
||||
0x9235f2ec, 0xbe31e19b, 0x929dd806, 0xbd85be30, 0x9306cb04, 0xbcda3ecb,
|
||||
0x9370cae4, 0xbc2f6513,
|
||||
0x93dbd6a0, 0xbb8532b0, 0x9447ed2f, 0xbadba943, 0x94b50d87, 0xba32ca71,
|
||||
0x9523369c, 0xb98a97d8,
|
||||
0x9592675c, 0xb8e31319, 0x96029eb6, 0xb83c3dd1, 0x9673db94, 0xb796199b,
|
||||
0x96e61ce0, 0xb6f0a812,
|
||||
0x9759617f, 0xb64beacd, 0x97cda855, 0xb5a7e362, 0x9842f043, 0xb5049368,
|
||||
0x98b93828, 0xb461fc70,
|
||||
0x99307ee0, 0xb3c0200c, 0x99a8c345, 0xb31effcc, 0x9a22042d, 0xb27e9d3c,
|
||||
0x9a9c406e, 0xb1def9e9,
|
||||
0x9b1776da, 0xb140175b, 0x9b93a641, 0xb0a1f71d, 0x9c10cd70, 0xb0049ab3,
|
||||
0x9c8eeb34, 0xaf6803a2,
|
||||
0x9d0dfe54, 0xaecc336c, 0x9d8e0597, 0xae312b92, 0x9e0effc1, 0xad96ed92,
|
||||
0x9e90eb94, 0xacfd7ae8,
|
||||
0x9f13c7d0, 0xac64d510, 0x9f979331, 0xabccfd83, 0xa01c4c73, 0xab35f5b5,
|
||||
0xa0a1f24d, 0xaa9fbf1e,
|
||||
0xa1288376, 0xaa0a5b2e, 0xa1affea3, 0xa975cb57, 0xa2386284, 0xa8e21106,
|
||||
0xa2c1adc9, 0xa84f2daa,
|
||||
0xa34bdf20, 0xa7bd22ac, 0xa3d6f534, 0xa72bf174, 0xa462eeac, 0xa69b9b68,
|
||||
0xa4efca31, 0xa60c21ee,
|
||||
0xa57d8666, 0xa57d8666, 0xa60c21ee, 0xa4efca31, 0xa69b9b68, 0xa462eeac,
|
||||
0xa72bf174, 0xa3d6f534,
|
||||
0xa7bd22ac, 0xa34bdf20, 0xa84f2daa, 0xa2c1adc9, 0xa8e21106, 0xa2386284,
|
||||
0xa975cb57, 0xa1affea3,
|
||||
0xaa0a5b2e, 0xa1288376, 0xaa9fbf1e, 0xa0a1f24d, 0xab35f5b5, 0xa01c4c73,
|
||||
0xabccfd83, 0x9f979331,
|
||||
0xac64d510, 0x9f13c7d0, 0xacfd7ae8, 0x9e90eb94, 0xad96ed92, 0x9e0effc1,
|
||||
0xae312b92, 0x9d8e0597,
|
||||
0xaecc336c, 0x9d0dfe54, 0xaf6803a2, 0x9c8eeb34, 0xb0049ab3, 0x9c10cd70,
|
||||
0xb0a1f71d, 0x9b93a641,
|
||||
0xb140175b, 0x9b1776da, 0xb1def9e9, 0x9a9c406e, 0xb27e9d3c, 0x9a22042d,
|
||||
0xb31effcc, 0x99a8c345,
|
||||
0xb3c0200c, 0x99307ee0, 0xb461fc70, 0x98b93828, 0xb5049368, 0x9842f043,
|
||||
0xb5a7e362, 0x97cda855,
|
||||
0xb64beacd, 0x9759617f, 0xb6f0a812, 0x96e61ce0, 0xb796199b, 0x9673db94,
|
||||
0xb83c3dd1, 0x96029eb6,
|
||||
0xb8e31319, 0x9592675c, 0xb98a97d8, 0x9523369c, 0xba32ca71, 0x94b50d87,
|
||||
0xbadba943, 0x9447ed2f,
|
||||
0xbb8532b0, 0x93dbd6a0, 0xbc2f6513, 0x9370cae4, 0xbcda3ecb, 0x9306cb04,
|
||||
0xbd85be30, 0x929dd806,
|
||||
0xbe31e19b, 0x9235f2ec, 0xbedea765, 0x91cf1cb6, 0xbf8c0de3, 0x91695663,
|
||||
0xc03a1368, 0x9104a0ee,
|
||||
0xc0e8b648, 0x90a0fd4e, 0xc197f4d4, 0x903e6c7b, 0xc247cd5a, 0x8fdcef66,
|
||||
0xc2f83e2a, 0x8f7c8701,
|
||||
0xc3a94590, 0x8f1d343a, 0xc45ae1d7, 0x8ebef7fb, 0xc50d1149, 0x8e61d32e,
|
||||
0xc5bfd22e, 0x8e05c6b7,
|
||||
0xc67322ce, 0x8daad37b, 0xc727016d, 0x8d50fa59, 0xc7db6c50, 0x8cf83c30,
|
||||
0xc89061ba, 0x8ca099da,
|
||||
0xc945dfec, 0x8c4a142f, 0xc9fbe527, 0x8bf4ac05, 0xcab26fa9, 0x8ba0622f,
|
||||
0xcb697db0, 0x8b4d377c,
|
||||
0xcc210d79, 0x8afb2cbb, 0xccd91d3d, 0x8aaa42b4, 0xcd91ab39, 0x8a5a7a31,
|
||||
0xce4ab5a2, 0x8a0bd3f5,
|
||||
0xcf043ab3, 0x89be50c3, 0xcfbe389f, 0x8971f15a, 0xd078ad9e, 0x8926b677,
|
||||
0xd13397e2, 0x88dca0d3,
|
||||
0xd1eef59e, 0x8893b125, 0xd2aac504, 0x884be821, 0xd3670446, 0x88054677,
|
||||
0xd423b191, 0x87bfccd7,
|
||||
0xd4e0cb15, 0x877b7bec, 0xd59e4eff, 0x8738545e, 0xd65c3b7b, 0x86f656d3,
|
||||
0xd71a8eb5, 0x86b583ee,
|
||||
0xd7d946d8, 0x8675dc4f, 0xd898620c, 0x86376092, 0xd957de7a, 0x85fa1153,
|
||||
0xda17ba4a, 0x85bdef28,
|
||||
0xdad7f3a2, 0x8582faa5, 0xdb9888a8, 0x8549345c, 0xdc597781, 0x85109cdd,
|
||||
0xdd1abe51, 0x84d934b1,
|
||||
0xdddc5b3b, 0x84a2fc62, 0xde9e4c60, 0x846df477, 0xdf608fe4, 0x843a1d70,
|
||||
0xe02323e5, 0x840777d0,
|
||||
0xe0e60685, 0x83d60412, 0xe1a935e2, 0x83a5c2b0, 0xe26cb01b, 0x8376b422,
|
||||
0xe330734d, 0x8348d8dc,
|
||||
0xe3f47d96, 0x831c314e, 0xe4b8cd11, 0x82f0bde8, 0xe57d5fda, 0x82c67f14,
|
||||
0xe642340d, 0x829d753a,
|
||||
0xe70747c4, 0x8275a0c0, 0xe7cc9917, 0x824f0208, 0xe8922622, 0x82299971,
|
||||
0xe957ecfb, 0x82056758,
|
||||
0xea1debbb, 0x81e26c16, 0xeae4207a, 0x81c0a801, 0xebaa894f, 0x81a01b6d,
|
||||
0xec71244f, 0x8180c6a9,
|
||||
0xed37ef91, 0x8162aa04, 0xedfee92b, 0x8145c5c7, 0xeec60f31, 0x812a1a3a,
|
||||
0xef8d5fb8, 0x810fa7a0,
|
||||
0xf054d8d5, 0x80f66e3c, 0xf11c789a, 0x80de6e4c, 0xf1e43d1c, 0x80c7a80a,
|
||||
0xf2ac246e, 0x80b21baf,
|
||||
0xf3742ca2, 0x809dc971, 0xf43c53cb, 0x808ab180, 0xf50497fb, 0x8078d40d,
|
||||
0xf5ccf743, 0x80683143,
|
||||
0xf6956fb7, 0x8058c94c, 0xf75dff66, 0x804a9c4d, 0xf826a462, 0x803daa6a,
|
||||
0xf8ef5cbb, 0x8031f3c2,
|
||||
0xf9b82684, 0x80277872, 0xfa80ffcb, 0x801e3895, 0xfb49e6a3, 0x80163440,
|
||||
0xfc12d91a, 0x800f6b88,
|
||||
0xfcdbd541, 0x8009de7e, 0xfda4d929, 0x80058d2f, 0xfe6de2e0, 0x800277a6,
|
||||
0xff36f078, 0x80009dea,
|
||||
0x0, 0x80000000, 0xc90f88, 0x80009dea, 0x1921d20, 0x800277a6, 0x25b26d7,
|
||||
0x80058d2f,
|
||||
0x3242abf, 0x8009de7e, 0x3ed26e6, 0x800f6b88, 0x4b6195d, 0x80163440,
|
||||
0x57f0035, 0x801e3895,
|
||||
0x647d97c, 0x80277872, 0x710a345, 0x8031f3c2, 0x7d95b9e, 0x803daa6a,
|
||||
0x8a2009a, 0x804a9c4d,
|
||||
0x96a9049, 0x8058c94c, 0xa3308bd, 0x80683143, 0xafb6805, 0x8078d40d,
|
||||
0xbc3ac35, 0x808ab180,
|
||||
0xc8bd35e, 0x809dc971, 0xd53db92, 0x80b21baf, 0xe1bc2e4, 0x80c7a80a,
|
||||
0xee38766, 0x80de6e4c,
|
||||
0xfab272b, 0x80f66e3c, 0x1072a048, 0x810fa7a0, 0x1139f0cf, 0x812a1a3a,
|
||||
0x120116d5, 0x8145c5c7,
|
||||
0x12c8106f, 0x8162aa04, 0x138edbb1, 0x8180c6a9, 0x145576b1, 0x81a01b6d,
|
||||
0x151bdf86, 0x81c0a801,
|
||||
0x15e21445, 0x81e26c16, 0x16a81305, 0x82056758, 0x176dd9de, 0x82299971,
|
||||
0x183366e9, 0x824f0208,
|
||||
0x18f8b83c, 0x8275a0c0, 0x19bdcbf3, 0x829d753a, 0x1a82a026, 0x82c67f14,
|
||||
0x1b4732ef, 0x82f0bde8,
|
||||
0x1c0b826a, 0x831c314e, 0x1ccf8cb3, 0x8348d8dc, 0x1d934fe5, 0x8376b422,
|
||||
0x1e56ca1e, 0x83a5c2b0,
|
||||
0x1f19f97b, 0x83d60412, 0x1fdcdc1b, 0x840777d0, 0x209f701c, 0x843a1d70,
|
||||
0x2161b3a0, 0x846df477,
|
||||
0x2223a4c5, 0x84a2fc62, 0x22e541af, 0x84d934b1, 0x23a6887f, 0x85109cdd,
|
||||
0x24677758, 0x8549345c,
|
||||
0x25280c5e, 0x8582faa5, 0x25e845b6, 0x85bdef28, 0x26a82186, 0x85fa1153,
|
||||
0x27679df4, 0x86376092,
|
||||
0x2826b928, 0x8675dc4f, 0x28e5714b, 0x86b583ee, 0x29a3c485, 0x86f656d3,
|
||||
0x2a61b101, 0x8738545e,
|
||||
0x2b1f34eb, 0x877b7bec, 0x2bdc4e6f, 0x87bfccd7, 0x2c98fbba, 0x88054677,
|
||||
0x2d553afc, 0x884be821,
|
||||
0x2e110a62, 0x8893b125, 0x2ecc681e, 0x88dca0d3, 0x2f875262, 0x8926b677,
|
||||
0x3041c761, 0x8971f15a,
|
||||
0x30fbc54d, 0x89be50c3, 0x31b54a5e, 0x8a0bd3f5, 0x326e54c7, 0x8a5a7a31,
|
||||
0x3326e2c3, 0x8aaa42b4,
|
||||
0x33def287, 0x8afb2cbb, 0x34968250, 0x8b4d377c, 0x354d9057, 0x8ba0622f,
|
||||
0x36041ad9, 0x8bf4ac05,
|
||||
0x36ba2014, 0x8c4a142f, 0x376f9e46, 0x8ca099da, 0x382493b0, 0x8cf83c30,
|
||||
0x38d8fe93, 0x8d50fa59,
|
||||
0x398cdd32, 0x8daad37b, 0x3a402dd2, 0x8e05c6b7, 0x3af2eeb7, 0x8e61d32e,
|
||||
0x3ba51e29, 0x8ebef7fb,
|
||||
0x3c56ba70, 0x8f1d343a, 0x3d07c1d6, 0x8f7c8701, 0x3db832a6, 0x8fdcef66,
|
||||
0x3e680b2c, 0x903e6c7b,
|
||||
0x3f1749b8, 0x90a0fd4e, 0x3fc5ec98, 0x9104a0ee, 0x4073f21d, 0x91695663,
|
||||
0x4121589b, 0x91cf1cb6,
|
||||
0x41ce1e65, 0x9235f2ec, 0x427a41d0, 0x929dd806, 0x4325c135, 0x9306cb04,
|
||||
0x43d09aed, 0x9370cae4,
|
||||
0x447acd50, 0x93dbd6a0, 0x452456bd, 0x9447ed2f, 0x45cd358f, 0x94b50d87,
|
||||
0x46756828, 0x9523369c,
|
||||
0x471cece7, 0x9592675c, 0x47c3c22f, 0x96029eb6, 0x4869e665, 0x9673db94,
|
||||
0x490f57ee, 0x96e61ce0,
|
||||
0x49b41533, 0x9759617f, 0x4a581c9e, 0x97cda855, 0x4afb6c98, 0x9842f043,
|
||||
0x4b9e0390, 0x98b93828,
|
||||
0x4c3fdff4, 0x99307ee0, 0x4ce10034, 0x99a8c345, 0x4d8162c4, 0x9a22042d,
|
||||
0x4e210617, 0x9a9c406e,
|
||||
0x4ebfe8a5, 0x9b1776da, 0x4f5e08e3, 0x9b93a641, 0x4ffb654d, 0x9c10cd70,
|
||||
0x5097fc5e, 0x9c8eeb34,
|
||||
0x5133cc94, 0x9d0dfe54, 0x51ced46e, 0x9d8e0597, 0x5269126e, 0x9e0effc1,
|
||||
0x53028518, 0x9e90eb94,
|
||||
0x539b2af0, 0x9f13c7d0, 0x5433027d, 0x9f979331, 0x54ca0a4b, 0xa01c4c73,
|
||||
0x556040e2, 0xa0a1f24d,
|
||||
0x55f5a4d2, 0xa1288376, 0x568a34a9, 0xa1affea3, 0x571deefa, 0xa2386284,
|
||||
0x57b0d256, 0xa2c1adc9,
|
||||
0x5842dd54, 0xa34bdf20, 0x58d40e8c, 0xa3d6f534, 0x59646498, 0xa462eeac,
|
||||
0x59f3de12, 0xa4efca31,
|
||||
0x5a82799a, 0xa57d8666, 0x5b1035cf, 0xa60c21ee, 0x5b9d1154, 0xa69b9b68,
|
||||
0x5c290acc, 0xa72bf174,
|
||||
0x5cb420e0, 0xa7bd22ac, 0x5d3e5237, 0xa84f2daa, 0x5dc79d7c, 0xa8e21106,
|
||||
0x5e50015d, 0xa975cb57,
|
||||
0x5ed77c8a, 0xaa0a5b2e, 0x5f5e0db3, 0xaa9fbf1e, 0x5fe3b38d, 0xab35f5b5,
|
||||
0x60686ccf, 0xabccfd83,
|
||||
0x60ec3830, 0xac64d510, 0x616f146c, 0xacfd7ae8, 0x61f1003f, 0xad96ed92,
|
||||
0x6271fa69, 0xae312b92,
|
||||
0x62f201ac, 0xaecc336c, 0x637114cc, 0xaf6803a2, 0x63ef3290, 0xb0049ab3,
|
||||
0x646c59bf, 0xb0a1f71d,
|
||||
0x64e88926, 0xb140175b, 0x6563bf92, 0xb1def9e9, 0x65ddfbd3, 0xb27e9d3c,
|
||||
0x66573cbb, 0xb31effcc,
|
||||
0x66cf8120, 0xb3c0200c, 0x6746c7d8, 0xb461fc70, 0x67bd0fbd, 0xb5049368,
|
||||
0x683257ab, 0xb5a7e362,
|
||||
0x68a69e81, 0xb64beacd, 0x6919e320, 0xb6f0a812, 0x698c246c, 0xb796199b,
|
||||
0x69fd614a, 0xb83c3dd1,
|
||||
0x6a6d98a4, 0xb8e31319, 0x6adcc964, 0xb98a97d8, 0x6b4af279, 0xba32ca71,
|
||||
0x6bb812d1, 0xbadba943,
|
||||
0x6c242960, 0xbb8532b0, 0x6c8f351c, 0xbc2f6513, 0x6cf934fc, 0xbcda3ecb,
|
||||
0x6d6227fa, 0xbd85be30,
|
||||
0x6dca0d14, 0xbe31e19b, 0x6e30e34a, 0xbedea765, 0x6e96a99d, 0xbf8c0de3,
|
||||
0x6efb5f12, 0xc03a1368,
|
||||
0x6f5f02b2, 0xc0e8b648, 0x6fc19385, 0xc197f4d4, 0x7023109a, 0xc247cd5a,
|
||||
0x708378ff, 0xc2f83e2a,
|
||||
0x70e2cbc6, 0xc3a94590, 0x71410805, 0xc45ae1d7, 0x719e2cd2, 0xc50d1149,
|
||||
0x71fa3949, 0xc5bfd22e,
|
||||
0x72552c85, 0xc67322ce, 0x72af05a7, 0xc727016d, 0x7307c3d0, 0xc7db6c50,
|
||||
0x735f6626, 0xc89061ba,
|
||||
0x73b5ebd1, 0xc945dfec, 0x740b53fb, 0xc9fbe527, 0x745f9dd1, 0xcab26fa9,
|
||||
0x74b2c884, 0xcb697db0,
|
||||
0x7504d345, 0xcc210d79, 0x7555bd4c, 0xccd91d3d, 0x75a585cf, 0xcd91ab39,
|
||||
0x75f42c0b, 0xce4ab5a2,
|
||||
0x7641af3d, 0xcf043ab3, 0x768e0ea6, 0xcfbe389f, 0x76d94989, 0xd078ad9e,
|
||||
0x77235f2d, 0xd13397e2,
|
||||
0x776c4edb, 0xd1eef59e, 0x77b417df, 0xd2aac504, 0x77fab989, 0xd3670446,
|
||||
0x78403329, 0xd423b191,
|
||||
0x78848414, 0xd4e0cb15, 0x78c7aba2, 0xd59e4eff, 0x7909a92d, 0xd65c3b7b,
|
||||
0x794a7c12, 0xd71a8eb5,
|
||||
0x798a23b1, 0xd7d946d8, 0x79c89f6e, 0xd898620c, 0x7a05eead, 0xd957de7a,
|
||||
0x7a4210d8, 0xda17ba4a,
|
||||
0x7a7d055b, 0xdad7f3a2, 0x7ab6cba4, 0xdb9888a8, 0x7aef6323, 0xdc597781,
|
||||
0x7b26cb4f, 0xdd1abe51,
|
||||
0x7b5d039e, 0xdddc5b3b, 0x7b920b89, 0xde9e4c60, 0x7bc5e290, 0xdf608fe4,
|
||||
0x7bf88830, 0xe02323e5,
|
||||
0x7c29fbee, 0xe0e60685, 0x7c5a3d50, 0xe1a935e2, 0x7c894bde, 0xe26cb01b,
|
||||
0x7cb72724, 0xe330734d,
|
||||
0x7ce3ceb2, 0xe3f47d96, 0x7d0f4218, 0xe4b8cd11, 0x7d3980ec, 0xe57d5fda,
|
||||
0x7d628ac6, 0xe642340d,
|
||||
0x7d8a5f40, 0xe70747c4, 0x7db0fdf8, 0xe7cc9917, 0x7dd6668f, 0xe8922622,
|
||||
0x7dfa98a8, 0xe957ecfb,
|
||||
0x7e1d93ea, 0xea1debbb, 0x7e3f57ff, 0xeae4207a, 0x7e5fe493, 0xebaa894f,
|
||||
0x7e7f3957, 0xec71244f,
|
||||
0x7e9d55fc, 0xed37ef91, 0x7eba3a39, 0xedfee92b, 0x7ed5e5c6, 0xeec60f31,
|
||||
0x7ef05860, 0xef8d5fb8,
|
||||
0x7f0991c4, 0xf054d8d5, 0x7f2191b4, 0xf11c789a, 0x7f3857f6, 0xf1e43d1c,
|
||||
0x7f4de451, 0xf2ac246e,
|
||||
0x7f62368f, 0xf3742ca2, 0x7f754e80, 0xf43c53cb, 0x7f872bf3, 0xf50497fb,
|
||||
0x7f97cebd, 0xf5ccf743,
|
||||
0x7fa736b4, 0xf6956fb7, 0x7fb563b3, 0xf75dff66, 0x7fc25596, 0xf826a462,
|
||||
0x7fce0c3e, 0xf8ef5cbb,
|
||||
0x7fd8878e, 0xf9b82684, 0x7fe1c76b, 0xfa80ffcb, 0x7fe9cbc0, 0xfb49e6a3,
|
||||
0x7ff09478, 0xfc12d91a,
|
||||
0x7ff62182, 0xfcdbd541, 0x7ffa72d1, 0xfda4d929, 0x7ffd885a, 0xfe6de2e0,
|
||||
0x7fff6216, 0xff36f078
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief Initialization function for the Q31 CFFT/CIFFT.
|
||||
* @param[in,out] *S points to an instance of the Q31 CFFT/CIFFT structure.
|
||||
* @param[in] fftLen length of the FFT.
|
||||
* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform.
|
||||
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output.
|
||||
* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLen</code> is not a supported value.
|
||||
*
|
||||
* \par Description:
|
||||
* \par
|
||||
* The parameter <code>ifftFlag</code> controls whether a forward or inverse transform is computed.
|
||||
* Set(=1) ifftFlag for calculation of CIFFT otherwise CFFT is calculated
|
||||
* \par
|
||||
* The parameter <code>bitReverseFlag</code> controls whether output is in normal order or bit reversed order.
|
||||
* Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order.
|
||||
* \par
|
||||
* The parameter <code>fftLen</code> Specifies length of CFFT/CIFFT process. Supported FFT Lengths are 16, 64, 256, 1024.
|
||||
* \par
|
||||
* This Function also initializes Twiddle factor table pointer and Bit reversal table pointer.
|
||||
*/
|
||||
|
||||
arm_status arm_cfft_radix4_init_q31(
|
||||
arm_cfft_radix4_instance_q31 * S,
|
||||
uint16_t fftLen,
|
||||
uint8_t ifftFlag,
|
||||
uint8_t bitReverseFlag)
|
||||
{
|
||||
/* Initialise the default arm status */
|
||||
arm_status status = ARM_MATH_SUCCESS;
|
||||
/* Initialise the FFT length */
|
||||
S->fftLen = fftLen;
|
||||
/* Initialise the Twiddle coefficient pointer */
|
||||
S->pTwiddle = (q31_t *) twiddleCoefQ31;
|
||||
/* Initialise the Flag for selection of CFFT or CIFFT */
|
||||
S->ifftFlag = ifftFlag;
|
||||
/* Initialise the Flag for calculation Bit reversal or not */
|
||||
S->bitReverseFlag = bitReverseFlag;
|
||||
|
||||
/* Initializations of Instance structure depending on the FFT length */
|
||||
switch (S->fftLen)
|
||||
{
|
||||
/* Initializations of structure parameters for 1024 point FFT */
|
||||
case 1024u:
|
||||
/* Initialise the twiddle coef modifier value */
|
||||
S->twidCoefModifier = 1u;
|
||||
/* Initialise the bit reversal table modifier */
|
||||
S->bitRevFactor = 1u;
|
||||
/* Initialise the bit reversal table pointer */
|
||||
S->pBitRevTable = armBitRevTable;
|
||||
break;
|
||||
|
||||
case 256u:
|
||||
/* Initializations of structure parameters for 256 point FFT */
|
||||
S->twidCoefModifier = 4u;
|
||||
S->bitRevFactor = 4u;
|
||||
S->pBitRevTable = (uint16_t *) & armBitRevTable[3];
|
||||
break;
|
||||
|
||||
case 64u:
|
||||
/* Initializations of structure parameters for 64 point FFT */
|
||||
S->twidCoefModifier = 16u;
|
||||
S->bitRevFactor = 16u;
|
||||
S->pBitRevTable = &armBitRevTable[15];
|
||||
break;
|
||||
|
||||
case 16u:
|
||||
/* Initializations of structure parameters for 16 point FFT */
|
||||
S->twidCoefModifier = 64u;
|
||||
S->bitRevFactor = 64u;
|
||||
S->pBitRevTable = &armBitRevTable[63];
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Reporting argument error if fftSize is not valid value */
|
||||
status = ARM_MATH_ARGUMENT_ERROR;
|
||||
break;
|
||||
}
|
||||
|
||||
return (status);
|
||||
}
|
||||
|
||||
/**
|
||||
* @} end of CFFT_CIFFT group
|
||||
*/
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,906 @@
|
||||
/* ----------------------------------------------------------------------
|
||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
||||
*
|
||||
* $Date: 15. July 2011
|
||||
* $Revision: V1.0.10
|
||||
*
|
||||
* Project: CMSIS DSP Library
|
||||
* Title: arm_cfft_radix4_q31.c
|
||||
*
|
||||
* Description: This file has function definition of Radix-4 FFT & IFFT function and
|
||||
* In-place bit reversal using bit reversal table
|
||||
*
|
||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
||||
*
|
||||
* Version 1.0.10 2011/7/15
|
||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
||||
*
|
||||
* Version 1.0.3 2010/11/29
|
||||
* Re-organized the CMSIS folders and updated documentation.
|
||||
*
|
||||
* Version 1.0.2 2010/11/11
|
||||
* Documentation updated.
|
||||
*
|
||||
* Version 1.0.1 2010/10/05
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 1.0.0 2010/09/20
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 0.0.5 2010/04/26
|
||||
* incorporated review comments and updated with latest CMSIS layer
|
||||
*
|
||||
* Version 0.0.3 2010/03/10
|
||||
* Initial version
|
||||
* -------------------------------------------------------------------- */
|
||||
#include "arm_math.h"
|
||||
|
||||
|
||||
/**
|
||||
* @ingroup groupTransforms
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup CFFT_CIFFT
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @details
|
||||
* @brief Processing function for the Q31 CFFT/CIFFT.
|
||||
* @param[in] *S points to an instance of the Q31 CFFT/CIFFT structure.
|
||||
* @param[in, out] *pSrc points to the complex data buffer of size <code>2*fftLen</code>. Processing occurs in-place.
|
||||
* @return none.
|
||||
*
|
||||
* \par Input and output formats:
|
||||
* \par
|
||||
* Internally input is downscaled by 2 for every stage to avoid saturations inside CFFT/CIFFT process.
|
||||
* Hence the output format is different for different FFT sizes.
|
||||
* The input and output formats for different FFT sizes and number of bits to upscale are mentioned in the tables below for CFFT and CIFFT:
|
||||
* \par
|
||||
* \image html CFFTQ31.gif "Input and Output Formats for Q31 CFFT"
|
||||
* \image html CIFFTQ31.gif "Input and Output Formats for Q31 CIFFT"
|
||||
*
|
||||
*/
|
||||
|
||||
void arm_cfft_radix4_q31(
|
||||
const arm_cfft_radix4_instance_q31 * S,
|
||||
q31_t * pSrc)
|
||||
{
|
||||
if(S->ifftFlag == 1u)
|
||||
{
|
||||
/* Complex IFFT radix-4 */
|
||||
arm_radix4_butterfly_inverse_q31(pSrc, S->fftLen, S->pTwiddle,
|
||||
S->twidCoefModifier);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Complex FFT radix-4 */
|
||||
arm_radix4_butterfly_q31(pSrc, S->fftLen, S->pTwiddle,
|
||||
S->twidCoefModifier);
|
||||
}
|
||||
|
||||
|
||||
if(S->bitReverseFlag == 1u)
|
||||
{
|
||||
/* Bit Reversal */
|
||||
arm_bitreversal_q31(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @} end of CFFT_CIFFT group
|
||||
*/
|
||||
|
||||
/*
|
||||
* Radix-4 FFT algorithm used is :
|
||||
*
|
||||
* Input real and imaginary data:
|
||||
* x(n) = xa + j * ya
|
||||
* x(n+N/4 ) = xb + j * yb
|
||||
* x(n+N/2 ) = xc + j * yc
|
||||
* x(n+3N 4) = xd + j * yd
|
||||
*
|
||||
*
|
||||
* Output real and imaginary data:
|
||||
* x(4r) = xa'+ j * ya'
|
||||
* x(4r+1) = xb'+ j * yb'
|
||||
* x(4r+2) = xc'+ j * yc'
|
||||
* x(4r+3) = xd'+ j * yd'
|
||||
*
|
||||
*
|
||||
* Twiddle factors for radix-4 FFT:
|
||||
* Wn = co1 + j * (- si1)
|
||||
* W2n = co2 + j * (- si2)
|
||||
* W3n = co3 + j * (- si3)
|
||||
*
|
||||
* Butterfly implementation:
|
||||
* xa' = xa + xb + xc + xd
|
||||
* ya' = ya + yb + yc + yd
|
||||
* xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1)
|
||||
* yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1)
|
||||
* xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2)
|
||||
* yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2)
|
||||
* xd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3)
|
||||
* yd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3)
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Core function for the Q31 CFFT butterfly process.
|
||||
* @param[in, out] *pSrc points to the in-place buffer of Q31 data type.
|
||||
* @param[in] fftLen length of the FFT.
|
||||
* @param[in] *pCoef points to twiddle coefficient buffer.
|
||||
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
|
||||
* @return none.
|
||||
*/
|
||||
|
||||
void arm_radix4_butterfly_q31(
|
||||
q31_t * pSrc,
|
||||
uint32_t fftLen,
|
||||
q31_t * pCoef,
|
||||
uint32_t twidCoefModifier)
|
||||
{
|
||||
uint32_t n1, n2, ia1, ia2, ia3, i0, i1, i2, i3, j, k;
|
||||
q31_t t1, t2, r1, r2, s1, s2, co1, co2, co3, si1, si2, si3;
|
||||
|
||||
|
||||
/* Total process is divided into three stages */
|
||||
|
||||
/* process first stage, middle stages, & last stage */
|
||||
|
||||
|
||||
/* start of first stage process */
|
||||
|
||||
/* Initializations for the first stage */
|
||||
n2 = fftLen;
|
||||
n1 = n2;
|
||||
/* n2 = fftLen/4 */
|
||||
n2 >>= 2u;
|
||||
i0 = 0u;
|
||||
ia1 = 0u;
|
||||
|
||||
j = n2;
|
||||
|
||||
/* Calculation of first stage */
|
||||
do
|
||||
{
|
||||
/* index calculation for the input as, */
|
||||
/* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2u], pSrc[i0 + 3fftLen/4] */
|
||||
i1 = i0 + n2;
|
||||
i2 = i1 + n2;
|
||||
i3 = i2 + n2;
|
||||
|
||||
/* input is in 1.31(q31) format and provide 4 guard bits for the input */
|
||||
|
||||
/* Butterfly implementation */
|
||||
/* xa + xc */
|
||||
r1 = (pSrc[(2u * i0)] >> 4u) + (pSrc[(2u * i2)] >> 4u);
|
||||
/* xa - xc */
|
||||
r2 = (pSrc[2u * i0] >> 4u) - (pSrc[2u * i2] >> 4u);
|
||||
|
||||
/* ya + yc */
|
||||
s1 = (pSrc[(2u * i0) + 1u] >> 4u) + (pSrc[(2u * i2) + 1u] >> 4u);
|
||||
/* ya - yc */
|
||||
s2 = (pSrc[(2u * i0) + 1u] >> 4u) - (pSrc[(2u * i2) + 1u] >> 4u);
|
||||
|
||||
/* xb + xd */
|
||||
t1 = (pSrc[2u * i1] >> 4u) + (pSrc[2u * i3] >> 4u);
|
||||
|
||||
/* xa' = xa + xb + xc + xd */
|
||||
pSrc[2u * i0] = (r1 + t1);
|
||||
/* (xa + xc) - (xb + xd) */
|
||||
r1 = r1 - t1;
|
||||
/* yb + yd */
|
||||
t2 = (pSrc[(2u * i1) + 1u] >> 4u) + (pSrc[(2u * i3) + 1u] >> 4u);
|
||||
/* ya' = ya + yb + yc + yd */
|
||||
pSrc[(2u * i0) + 1u] = (s1 + t2);
|
||||
|
||||
/* (ya + yc) - (yb + yd) */
|
||||
s1 = s1 - t2;
|
||||
|
||||
/* yb - yd */
|
||||
t1 = (pSrc[(2u * i1) + 1u] >> 4u) - (pSrc[(2u * i3) + 1u] >> 4u);
|
||||
/* xb - xd */
|
||||
t2 = (pSrc[2u * i1] >> 4u) - (pSrc[2u * i3] >> 4u);
|
||||
|
||||
/* index calculation for the coefficients */
|
||||
ia2 = 2u * ia1;
|
||||
co2 = pCoef[ia2 * 2u];
|
||||
si2 = pCoef[(ia2 * 2u) + 1u];
|
||||
|
||||
/* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */
|
||||
pSrc[2u * i1] = (((int32_t) (((q63_t) r1 * co2) >> 32)) +
|
||||
((int32_t) (((q63_t) s1 * si2) >> 32))) << 1u;
|
||||
|
||||
/* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */
|
||||
pSrc[(2u * i1) + 1u] = (((int32_t) (((q63_t) s1 * co2) >> 32)) -
|
||||
((int32_t) (((q63_t) r1 * si2) >> 32))) << 1u;
|
||||
|
||||
/* (xa - xc) + (yb - yd) */
|
||||
r1 = r2 + t1;
|
||||
/* (xa - xc) - (yb - yd) */
|
||||
r2 = r2 - t1;
|
||||
|
||||
/* (ya - yc) - (xb - xd) */
|
||||
s1 = s2 - t2;
|
||||
/* (ya - yc) + (xb - xd) */
|
||||
s2 = s2 + t2;
|
||||
|
||||
co1 = pCoef[ia1 * 2u];
|
||||
si1 = pCoef[(ia1 * 2u) + 1u];
|
||||
|
||||
/* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */
|
||||
pSrc[2u * i2] = (((int32_t) (((q63_t) r1 * co1) >> 32)) +
|
||||
((int32_t) (((q63_t) s1 * si1) >> 32))) << 1u;
|
||||
|
||||
/* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */
|
||||
pSrc[(2u * i2) + 1u] = (((int32_t) (((q63_t) s1 * co1) >> 32)) -
|
||||
((int32_t) (((q63_t) r1 * si1) >> 32))) << 1u;
|
||||
|
||||
/* index calculation for the coefficients */
|
||||
ia3 = 3u * ia1;
|
||||
co3 = pCoef[ia3 * 2u];
|
||||
si3 = pCoef[(ia3 * 2u) + 1u];
|
||||
|
||||
/* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */
|
||||
pSrc[2u * i3] = (((int32_t) (((q63_t) r2 * co3) >> 32)) +
|
||||
((int32_t) (((q63_t) s2 * si3) >> 32))) << 1u;
|
||||
|
||||
/* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */
|
||||
pSrc[(2u * i3) + 1u] = (((int32_t) (((q63_t) s2 * co3) >> 32)) -
|
||||
((int32_t) (((q63_t) r2 * si3) >> 32))) << 1u;
|
||||
|
||||
/* Twiddle coefficients index modifier */
|
||||
ia1 = ia1 + twidCoefModifier;
|
||||
|
||||
/* Updating input index */
|
||||
i0 = i0 + 1u;
|
||||
|
||||
} while(--j);
|
||||
|
||||
/* end of first stage process */
|
||||
|
||||
/* data is in 5.27(q27) format */
|
||||
|
||||
|
||||
/* start of Middle stages process */
|
||||
|
||||
|
||||
/* each stage in middle stages provides two down scaling of the input */
|
||||
|
||||
twidCoefModifier <<= 2u;
|
||||
|
||||
|
||||
for (k = fftLen / 4u; k > 4u; k >>= 2u)
|
||||
{
|
||||
/* Initializations for the first stage */
|
||||
n1 = n2;
|
||||
n2 >>= 2u;
|
||||
ia1 = 0u;
|
||||
|
||||
/* Calculation of first stage */
|
||||
for (j = 0u; j <= (n2 - 1u); j++)
|
||||
{
|
||||
/* index calculation for the coefficients */
|
||||
ia2 = ia1 + ia1;
|
||||
ia3 = ia2 + ia1;
|
||||
co1 = pCoef[ia1 * 2u];
|
||||
si1 = pCoef[(ia1 * 2u) + 1u];
|
||||
co2 = pCoef[ia2 * 2u];
|
||||
si2 = pCoef[(ia2 * 2u) + 1u];
|
||||
co3 = pCoef[ia3 * 2u];
|
||||
si3 = pCoef[(ia3 * 2u) + 1u];
|
||||
/* Twiddle coefficients index modifier */
|
||||
ia1 = ia1 + twidCoefModifier;
|
||||
|
||||
for (i0 = j; i0 < fftLen; i0 += n1)
|
||||
{
|
||||
/* index calculation for the input as, */
|
||||
/* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2u], pSrc[i0 + 3fftLen/4] */
|
||||
i1 = i0 + n2;
|
||||
i2 = i1 + n2;
|
||||
i3 = i2 + n2;
|
||||
|
||||
/* Butterfly implementation */
|
||||
/* xa + xc */
|
||||
r1 = pSrc[2u * i0] + pSrc[2u * i2];
|
||||
/* xa - xc */
|
||||
r2 = pSrc[2u * i0] - pSrc[2u * i2];
|
||||
|
||||
/* ya + yc */
|
||||
s1 = pSrc[(2u * i0) + 1u] + pSrc[(2u * i2) + 1u];
|
||||
/* ya - yc */
|
||||
s2 = pSrc[(2u * i0) + 1u] - pSrc[(2u * i2) + 1u];
|
||||
|
||||
/* xb + xd */
|
||||
t1 = pSrc[2u * i1] + pSrc[2u * i3];
|
||||
|
||||
/* xa' = xa + xb + xc + xd */
|
||||
pSrc[2u * i0] = (r1 + t1) >> 2u;
|
||||
/* xa + xc -(xb + xd) */
|
||||
r1 = r1 - t1;
|
||||
|
||||
/* yb + yd */
|
||||
t2 = pSrc[(2u * i1) + 1u] + pSrc[(2u * i3) + 1u];
|
||||
/* ya' = ya + yb + yc + yd */
|
||||
pSrc[(2u * i0) + 1u] = (s1 + t2) >> 2u;
|
||||
|
||||
/* (ya + yc) - (yb + yd) */
|
||||
s1 = s1 - t2;
|
||||
|
||||
/* (yb - yd) */
|
||||
t1 = pSrc[(2u * i1) + 1u] - pSrc[(2u * i3) + 1u];
|
||||
/* (xb - xd) */
|
||||
t2 = pSrc[2u * i1] - pSrc[2u * i3];
|
||||
|
||||
/* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */
|
||||
pSrc[2u * i1] = (((int32_t) (((q63_t) r1 * co2) >> 32)) +
|
||||
((int32_t) (((q63_t) s1 * si2) >> 32))) >> 1u;
|
||||
|
||||
/* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */
|
||||
pSrc[(2u * i1) + 1u] = (((int32_t) (((q63_t) s1 * co2) >> 32)) -
|
||||
((int32_t) (((q63_t) r1 * si2) >> 32))) >> 1u;
|
||||
|
||||
/* (xa - xc) + (yb - yd) */
|
||||
r1 = r2 + t1;
|
||||
/* (xa - xc) - (yb - yd) */
|
||||
r2 = r2 - t1;
|
||||
|
||||
/* (ya - yc) - (xb - xd) */
|
||||
s1 = s2 - t2;
|
||||
/* (ya - yc) + (xb - xd) */
|
||||
s2 = s2 + t2;
|
||||
|
||||
/* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */
|
||||
pSrc[2u * i2] = (((int32_t) (((q63_t) r1 * co1) >> 32)) +
|
||||
((int32_t) (((q63_t) s1 * si1) >> 32))) >> 1u;
|
||||
|
||||
/* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */
|
||||
pSrc[(2u * i2) + 1u] = (((int32_t) (((q63_t) s1 * co1) >> 32)) -
|
||||
((int32_t) (((q63_t) r1 * si1) >> 32))) >> 1u;
|
||||
|
||||
/* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */
|
||||
pSrc[2u * i3] = (((int32_t) (((q63_t) r2 * co3) >> 32)) +
|
||||
((int32_t) (((q63_t) s2 * si3) >> 32))) >> 1u;
|
||||
|
||||
/* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */
|
||||
pSrc[(2u * i3) + 1u] = (((int32_t) (((q63_t) s2 * co3) >> 32)) -
|
||||
((int32_t) (((q63_t) r2 * si3) >> 32))) >> 1u;
|
||||
}
|
||||
}
|
||||
twidCoefModifier <<= 2u;
|
||||
}
|
||||
|
||||
/* End of Middle stages process */
|
||||
|
||||
/* data is in 11.21(q21) format for the 1024 point as there are 3 middle stages */
|
||||
/* data is in 9.23(q23) format for the 256 point as there are 2 middle stages */
|
||||
/* data is in 7.25(q25) format for the 64 point as there are 1 middle stage */
|
||||
/* data is in 5.27(q27) format for the 16 point as there are no middle stages */
|
||||
|
||||
|
||||
/* start of Last stage process */
|
||||
|
||||
/* Initializations of last stage */
|
||||
n1 = n2;
|
||||
n2 >>= 2u;
|
||||
|
||||
/* Calculations of last stage */
|
||||
for (i0 = 0u; i0 <= (fftLen - n1); i0 += n1)
|
||||
{
|
||||
/* index calculation for the input as, */
|
||||
/* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2u], pSrc[i0 + 3fftLen/4] */
|
||||
i1 = i0 + n2;
|
||||
i2 = i1 + n2;
|
||||
i3 = i2 + n2;
|
||||
|
||||
/* Butterfly implementation */
|
||||
/* xa + xb */
|
||||
r1 = pSrc[2u * i0] + pSrc[2u * i2];
|
||||
/* xa - xb */
|
||||
r2 = pSrc[2u * i0] - pSrc[2u * i2];
|
||||
|
||||
/* ya + yc */
|
||||
s1 = pSrc[(2u * i0) + 1u] + pSrc[(2u * i2) + 1u];
|
||||
/* ya - yc */
|
||||
s2 = pSrc[(2u * i0) + 1u] - pSrc[(2u * i2) + 1u];
|
||||
|
||||
/* xc + xd */
|
||||
t1 = pSrc[2u * i1] + pSrc[2u * i3];
|
||||
/* xa' = xa + xb + xc + xd */
|
||||
pSrc[2u * i0] = (r1 + t1);
|
||||
/* (xa + xb) - (xc + xd) */
|
||||
r1 = r1 - t1;
|
||||
|
||||
/* yb + yd */
|
||||
t2 = pSrc[(2u * i1) + 1u] + pSrc[(2u * i3) + 1u];
|
||||
/* ya' = ya + yb + yc + yd */
|
||||
pSrc[(2u * i0) + 1u] = (s1 + t2);
|
||||
/* (ya + yc) - (yb + yd) */
|
||||
s1 = s1 - t2;
|
||||
|
||||
/* (yb-yd) */
|
||||
t1 = pSrc[(2u * i1) + 1u] - pSrc[(2u * i3) + 1u];
|
||||
/* (xb-xd) */
|
||||
t2 = pSrc[2u * i1] - pSrc[2u * i3];
|
||||
|
||||
/* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */
|
||||
pSrc[2u * i1] = r1;
|
||||
/* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */
|
||||
pSrc[(2u * i1) + 1u] = s1;
|
||||
|
||||
/* (xa+yb-xc-yd) */
|
||||
r1 = r2 + t1;
|
||||
/* (xa-yb-xc+yd) */
|
||||
r2 = r2 - t1;
|
||||
|
||||
/* (ya-xb-yc+xd) */
|
||||
s1 = s2 - t2;
|
||||
/* (ya+xb-yc-xd) */
|
||||
s2 = s2 + t2;
|
||||
|
||||
/* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */
|
||||
pSrc[2u * i2] = r1;
|
||||
/* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */
|
||||
pSrc[(2u * i2) + 1u] = s1;
|
||||
|
||||
/* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */
|
||||
pSrc[2u * i3] = r2;
|
||||
/* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */
|
||||
pSrc[(2u * i3) + 1u] = s2;
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* output is in 11.21(q21) format for the 1024 point */
|
||||
/* output is in 9.23(q23) format for the 256 point */
|
||||
/* output is in 7.25(q25) format for the 64 point */
|
||||
/* output is in 5.27(q27) format for the 16 point */
|
||||
|
||||
/* End of last stage process */
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Core function for the Q31 CIFFT butterfly process.
|
||||
* @param[in, out] *pSrc points to the in-place buffer of Q31 data type.
|
||||
* @param[in] fftLen length of the FFT.
|
||||
* @param[in] *pCoef points to twiddle coefficient buffer.
|
||||
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
|
||||
* @return none.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Radix-4 IFFT algorithm used is :
|
||||
*
|
||||
* CIFFT uses same twiddle coefficients as CFFT Function
|
||||
* x[k] = x[n] + (j)k * x[n + fftLen/4] + (-1)k * x[n+fftLen/2] + (-j)k * x[n+3*fftLen/4]
|
||||
*
|
||||
*
|
||||
* IFFT is implemented with following changes in equations from FFT
|
||||
*
|
||||
* Input real and imaginary data:
|
||||
* x(n) = xa + j * ya
|
||||
* x(n+N/4 ) = xb + j * yb
|
||||
* x(n+N/2 ) = xc + j * yc
|
||||
* x(n+3N 4) = xd + j * yd
|
||||
*
|
||||
*
|
||||
* Output real and imaginary data:
|
||||
* x(4r) = xa'+ j * ya'
|
||||
* x(4r+1) = xb'+ j * yb'
|
||||
* x(4r+2) = xc'+ j * yc'
|
||||
* x(4r+3) = xd'+ j * yd'
|
||||
*
|
||||
*
|
||||
* Twiddle factors for radix-4 IFFT:
|
||||
* Wn = co1 + j * (si1)
|
||||
* W2n = co2 + j * (si2)
|
||||
* W3n = co3 + j * (si3)
|
||||
|
||||
* The real and imaginary output values for the radix-4 butterfly are
|
||||
* xa' = xa + xb + xc + xd
|
||||
* ya' = ya + yb + yc + yd
|
||||
* xb' = (xa-yb-xc+yd)* co1 - (ya+xb-yc-xd)* (si1)
|
||||
* yb' = (ya+xb-yc-xd)* co1 + (xa-yb-xc+yd)* (si1)
|
||||
* xc' = (xa-xb+xc-xd)* co2 - (ya-yb+yc-yd)* (si2)
|
||||
* yc' = (ya-yb+yc-yd)* co2 + (xa-xb+xc-xd)* (si2)
|
||||
* xd' = (xa+yb-xc-yd)* co3 - (ya-xb-yc+xd)* (si3)
|
||||
* yd' = (ya-xb-yc+xd)* co3 + (xa+yb-xc-yd)* (si3)
|
||||
*
|
||||
*/
|
||||
|
||||
void arm_radix4_butterfly_inverse_q31(
|
||||
q31_t * pSrc,
|
||||
uint32_t fftLen,
|
||||
q31_t * pCoef,
|
||||
uint32_t twidCoefModifier)
|
||||
{
|
||||
uint32_t n1, n2, ia1, ia2, ia3, i0, i1, i2, i3, j, k;
|
||||
q31_t t1, t2, r1, r2, s1, s2, co1, co2, co3, si1, si2, si3;
|
||||
|
||||
/* input is be 1.31(q31) format for all FFT sizes */
|
||||
/* Total process is divided into three stages */
|
||||
/* process first stage, middle stages, & last stage */
|
||||
|
||||
/* Start of first stage process */
|
||||
|
||||
/* Initializations for the first stage */
|
||||
n2 = fftLen;
|
||||
n1 = n2;
|
||||
/* n2 = fftLen/4 */
|
||||
n2 >>= 2u;
|
||||
i0 = 0u;
|
||||
ia1 = 0u;
|
||||
|
||||
j = n2;
|
||||
|
||||
do
|
||||
{
|
||||
|
||||
/* input is in 1.31(q31) format and provide 4 guard bits for the input */
|
||||
|
||||
/* index calculation for the input as, */
|
||||
/* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2u], pSrc[i0 + 3fftLen/4] */
|
||||
i1 = i0 + n2;
|
||||
i2 = i1 + n2;
|
||||
i3 = i2 + n2;
|
||||
|
||||
/* Butterfly implementation */
|
||||
/* xa + xc */
|
||||
r1 = (pSrc[2u * i0] >> 4u) + (pSrc[2u * i2] >> 4u);
|
||||
/* xa - xc */
|
||||
r2 = (pSrc[2u * i0] >> 4u) - (pSrc[2u * i2] >> 4u);
|
||||
|
||||
/* ya + yc */
|
||||
s1 = (pSrc[(2u * i0) + 1u] >> 4u) + (pSrc[(2u * i2) + 1u] >> 4u);
|
||||
/* ya - yc */
|
||||
s2 = (pSrc[(2u * i0) + 1u] >> 4u) - (pSrc[(2u * i2) + 1u] >> 4u);
|
||||
|
||||
/* xb + xd */
|
||||
t1 = (pSrc[2u * i1] >> 4u) + (pSrc[2u * i3] >> 4u);
|
||||
|
||||
/* xa' = xa + xb + xc + xd */
|
||||
pSrc[2u * i0] = (r1 + t1);
|
||||
/* (xa + xc) - (xb + xd) */
|
||||
r1 = r1 - t1;
|
||||
/* yb + yd */
|
||||
t2 = (pSrc[(2u * i1) + 1u] >> 4u) + (pSrc[(2u * i3) + 1u] >> 4u);
|
||||
/* ya' = ya + yb + yc + yd */
|
||||
pSrc[(2u * i0) + 1u] = (s1 + t2);
|
||||
|
||||
/* (ya + yc) - (yb + yd) */
|
||||
s1 = s1 - t2;
|
||||
|
||||
/* yb - yd */
|
||||
t1 = (pSrc[(2u * i1) + 1u] >> 4u) - (pSrc[(2u * i3) + 1u] >> 4u);
|
||||
/* xb - xd */
|
||||
t2 = (pSrc[2u * i1] >> 4u) - (pSrc[2u * i3] >> 4u);
|
||||
|
||||
/* index calculation for the coefficients */
|
||||
ia2 = 2u * ia1;
|
||||
co2 = pCoef[ia2 * 2u];
|
||||
si2 = pCoef[(ia2 * 2u) + 1u];
|
||||
|
||||
/* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */
|
||||
pSrc[2u * i1] = (((int32_t) (((q63_t) r1 * co2) >> 32)) -
|
||||
((int32_t) (((q63_t) s1 * si2) >> 32))) << 1u;
|
||||
|
||||
/* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */
|
||||
pSrc[2u * i1 + 1u] = (((int32_t) (((q63_t) s1 * co2) >> 32)) +
|
||||
((int32_t) (((q63_t) r1 * si2) >> 32))) << 1u;
|
||||
|
||||
/* (xa - xc) - (yb - yd) */
|
||||
r1 = r2 - t1;
|
||||
/* (xa - xc) + (yb - yd) */
|
||||
r2 = r2 + t1;
|
||||
|
||||
/* (ya - yc) + (xb - xd) */
|
||||
s1 = s2 + t2;
|
||||
/* (ya - yc) - (xb - xd) */
|
||||
s2 = s2 - t2;
|
||||
|
||||
co1 = pCoef[ia1 * 2u];
|
||||
si1 = pCoef[(ia1 * 2u) + 1u];
|
||||
|
||||
/* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */
|
||||
pSrc[2u * i2] = (((int32_t) (((q63_t) r1 * co1) >> 32)) -
|
||||
((int32_t) (((q63_t) s1 * si1) >> 32))) << 1u;
|
||||
|
||||
/* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */
|
||||
pSrc[(2u * i2) + 1u] = (((int32_t) (((q63_t) s1 * co1) >> 32)) +
|
||||
((int32_t) (((q63_t) r1 * si1) >> 32))) << 1u;
|
||||
|
||||
/* index calculation for the coefficients */
|
||||
ia3 = 3u * ia1;
|
||||
co3 = pCoef[ia3 * 2u];
|
||||
si3 = pCoef[(ia3 * 2u) + 1u];
|
||||
|
||||
/* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */
|
||||
pSrc[2u * i3] = (((int32_t) (((q63_t) r2 * co3) >> 32)) -
|
||||
((int32_t) (((q63_t) s2 * si3) >> 32))) << 1u;
|
||||
|
||||
/* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */
|
||||
pSrc[(2u * i3) + 1u] = (((int32_t) (((q63_t) s2 * co3) >> 32)) +
|
||||
((int32_t) (((q63_t) r2 * si3) >> 32))) << 1u;
|
||||
|
||||
/* Twiddle coefficients index modifier */
|
||||
ia1 = ia1 + twidCoefModifier;
|
||||
|
||||
/* Updating input index */
|
||||
i0 = i0 + 1u;
|
||||
|
||||
} while(--j);
|
||||
|
||||
/* data is in 5.27(q27) format */
|
||||
/* each stage provides two down scaling of the input */
|
||||
|
||||
|
||||
/* Start of Middle stages process */
|
||||
|
||||
twidCoefModifier <<= 2u;
|
||||
|
||||
/* Calculation of second stage to excluding last stage */
|
||||
for (k = fftLen / 4u; k > 4u; k >>= 2u)
|
||||
{
|
||||
/* Initializations for the first stage */
|
||||
n1 = n2;
|
||||
n2 >>= 2u;
|
||||
ia1 = 0u;
|
||||
|
||||
for (j = 0; j <= (n2 - 1u); j++)
|
||||
{
|
||||
/* index calculation for the coefficients */
|
||||
ia2 = ia1 + ia1;
|
||||
ia3 = ia2 + ia1;
|
||||
co1 = pCoef[ia1 * 2u];
|
||||
si1 = pCoef[(ia1 * 2u) + 1u];
|
||||
co2 = pCoef[ia2 * 2u];
|
||||
si2 = pCoef[(ia2 * 2u) + 1u];
|
||||
co3 = pCoef[ia3 * 2u];
|
||||
si3 = pCoef[(ia3 * 2u) + 1u];
|
||||
/* Twiddle coefficients index modifier */
|
||||
ia1 = ia1 + twidCoefModifier;
|
||||
|
||||
for (i0 = j; i0 < fftLen; i0 += n1)
|
||||
{
|
||||
/* index calculation for the input as, */
|
||||
/* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2u], pSrc[i0 + 3fftLen/4] */
|
||||
i1 = i0 + n2;
|
||||
i2 = i1 + n2;
|
||||
i3 = i2 + n2;
|
||||
|
||||
/* Butterfly implementation */
|
||||
/* xa + xc */
|
||||
r1 = pSrc[2u * i0] + pSrc[2u * i2];
|
||||
/* xa - xc */
|
||||
r2 = pSrc[2u * i0] - pSrc[2u * i2];
|
||||
|
||||
/* ya + yc */
|
||||
s1 = pSrc[(2u * i0) + 1u] + pSrc[(2u * i2) + 1u];
|
||||
/* ya - yc */
|
||||
s2 = pSrc[(2u * i0) + 1u] - pSrc[(2u * i2) + 1u];
|
||||
|
||||
/* xb + xd */
|
||||
t1 = pSrc[2u * i1] + pSrc[2u * i3];
|
||||
|
||||
/* xa' = xa + xb + xc + xd */
|
||||
pSrc[2u * i0] = (r1 + t1) >> 2u;
|
||||
/* xa + xc -(xb + xd) */
|
||||
r1 = r1 - t1;
|
||||
/* yb + yd */
|
||||
t2 = pSrc[(2u * i1) + 1u] + pSrc[(2u * i3) + 1u];
|
||||
/* ya' = ya + yb + yc + yd */
|
||||
pSrc[(2u * i0) + 1u] = (s1 + t2) >> 2u;
|
||||
|
||||
/* (ya + yc) - (yb + yd) */
|
||||
s1 = s1 - t2;
|
||||
|
||||
/* (yb - yd) */
|
||||
t1 = pSrc[(2u * i1) + 1u] - pSrc[(2u * i3) + 1u];
|
||||
/* (xb - xd) */
|
||||
t2 = pSrc[2u * i1] - pSrc[2u * i3];
|
||||
|
||||
/* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */
|
||||
pSrc[2u * i1] = (((int32_t) (((q63_t) r1 * co2) >> 32u)) -
|
||||
((int32_t) (((q63_t) s1 * si2) >> 32u))) >> 1u;
|
||||
|
||||
/* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */
|
||||
pSrc[(2u * i1) + 1u] =
|
||||
(((int32_t) (((q63_t) s1 * co2) >> 32u)) +
|
||||
((int32_t) (((q63_t) r1 * si2) >> 32u))) >> 1u;
|
||||
|
||||
/* (xa - xc) - (yb - yd) */
|
||||
r1 = r2 - t1;
|
||||
/* (xa - xc) + (yb - yd) */
|
||||
r2 = r2 + t1;
|
||||
|
||||
/* (ya - yc) + (xb - xd) */
|
||||
s1 = s2 + t2;
|
||||
/* (ya - yc) - (xb - xd) */
|
||||
s2 = s2 - t2;
|
||||
|
||||
/* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */
|
||||
pSrc[2u * i2] = (((int32_t) (((q63_t) r1 * co1) >> 32)) -
|
||||
((int32_t) (((q63_t) s1 * si1) >> 32))) >> 1u;
|
||||
|
||||
/* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */
|
||||
pSrc[(2u * i2) + 1u] = (((int32_t) (((q63_t) s1 * co1) >> 32)) +
|
||||
((int32_t) (((q63_t) r1 * si1) >> 32))) >> 1u;
|
||||
|
||||
/* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */
|
||||
pSrc[(2u * i3)] = (((int32_t) (((q63_t) r2 * co3) >> 32)) -
|
||||
((int32_t) (((q63_t) s2 * si3) >> 32))) >> 1u;
|
||||
|
||||
/* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */
|
||||
pSrc[(2u * i3) + 1u] = (((int32_t) (((q63_t) s2 * co3) >> 32)) +
|
||||
((int32_t) (((q63_t) r2 * si3) >> 32))) >> 1u;
|
||||
}
|
||||
}
|
||||
twidCoefModifier <<= 2u;
|
||||
}
|
||||
|
||||
/* End of Middle stages process */
|
||||
|
||||
/* data is in 11.21(q21) format for the 1024 point as there are 3 middle stages */
|
||||
/* data is in 9.23(q23) format for the 256 point as there are 2 middle stages */
|
||||
/* data is in 7.25(q25) format for the 64 point as there are 1 middle stage */
|
||||
/* data is in 5.27(q27) format for the 16 point as there are no middle stages */
|
||||
|
||||
|
||||
/* Start of last stage process */
|
||||
|
||||
|
||||
/* Initializations of last stage */
|
||||
n1 = n2;
|
||||
n2 >>= 2u;
|
||||
|
||||
/* Calculations of last stage */
|
||||
for (i0 = 0u; i0 <= (fftLen - n1); i0 += n1)
|
||||
{
|
||||
/* index calculation for the input as, */
|
||||
/* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2u], pSrc[i0 + 3fftLen/4] */
|
||||
i1 = i0 + n2;
|
||||
i2 = i1 + n2;
|
||||
i3 = i2 + n2;
|
||||
|
||||
/* Butterfly implementation */
|
||||
/* xa + xc */
|
||||
r1 = pSrc[2u * i0] + pSrc[2u * i2];
|
||||
/* xa - xc */
|
||||
r2 = pSrc[2u * i0] - pSrc[2u * i2];
|
||||
|
||||
/* ya + yc */
|
||||
s1 = pSrc[(2u * i0) + 1u] + pSrc[(2u * i2) + 1u];
|
||||
/* ya - yc */
|
||||
s2 = pSrc[(2u * i0) + 1u] - pSrc[(2u * i2) + 1u];
|
||||
|
||||
/* xc + xd */
|
||||
t1 = pSrc[2u * i1] + pSrc[2u * i3];
|
||||
/* xa' = xa + xb + xc + xd */
|
||||
pSrc[2u * i0] = (r1 + t1);
|
||||
/* (xa + xb) - (xc + xd) */
|
||||
r1 = r1 - t1;
|
||||
|
||||
/* yb + yd */
|
||||
t2 = pSrc[(2u * i1) + 1u] + pSrc[(2u * i3) + 1u];
|
||||
/* ya' = ya + yb + yc + yd */
|
||||
pSrc[(2u * i0) + 1u] = (s1 + t2);
|
||||
/* (ya + yc) - (yb + yd) */
|
||||
s1 = s1 - t2;
|
||||
|
||||
/* (yb-yd) */
|
||||
t1 = pSrc[(2u * i1) + 1u] - pSrc[(2u * i3) + 1u];
|
||||
/* (xb-xd) */
|
||||
t2 = pSrc[2u * i1] - pSrc[2u * i3];
|
||||
|
||||
/* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */
|
||||
pSrc[2u * i1] = r1;
|
||||
/* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */
|
||||
pSrc[(2u * i1) + 1u] = s1;
|
||||
|
||||
/* (xa - xc) - (yb-yd) */
|
||||
r1 = r2 - t1;
|
||||
|
||||
/* (xa - xc) + (yb-yd) */
|
||||
r2 = r2 + t1;
|
||||
|
||||
/* (ya - yc) + (xb-xd) */
|
||||
s1 = s2 + t2;
|
||||
|
||||
/* (ya - yc) - (xb-xd) */
|
||||
s2 = s2 - t2;
|
||||
|
||||
/* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */
|
||||
pSrc[2u * i2] = r1;
|
||||
/* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */
|
||||
pSrc[(2u * i2) + 1u] = s1;
|
||||
|
||||
/* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */
|
||||
pSrc[2u * i3] = r2;
|
||||
/* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */
|
||||
pSrc[(2u * i3) + 1u] = s2;
|
||||
|
||||
}
|
||||
|
||||
/* output is in 11.21(q21) format for the 1024 point */
|
||||
/* output is in 9.23(q23) format for the 256 point */
|
||||
/* output is in 7.25(q25) format for the 64 point */
|
||||
/* output is in 5.27(q27) format for the 16 point */
|
||||
|
||||
/* End of last stage process */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @brief In-place bit reversal function.
|
||||
* @param[in, out] *pSrc points to the in-place buffer of Q31 data type.
|
||||
* @param[in] fftLen length of the FFT.
|
||||
* @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table
|
||||
* @param[in] *pBitRevTab points to bit reversal table.
|
||||
* @return none.
|
||||
*/
|
||||
|
||||
void arm_bitreversal_q31(
|
||||
q31_t * pSrc,
|
||||
uint32_t fftLen,
|
||||
uint16_t bitRevFactor,
|
||||
uint16_t * pBitRevTable)
|
||||
{
|
||||
uint32_t fftLenBy2, fftLenBy2p1, i, j;
|
||||
q31_t in;
|
||||
|
||||
/* Initializations */
|
||||
j = 0u;
|
||||
fftLenBy2 = fftLen / 2u;
|
||||
fftLenBy2p1 = (fftLen / 2u) + 1u;
|
||||
|
||||
/* Bit Reversal Implementation */
|
||||
for (i = 0u; i <= (fftLenBy2 - 2u); i += 2u)
|
||||
{
|
||||
if(i < j)
|
||||
{
|
||||
/* pSrc[i] <-> pSrc[j]; */
|
||||
in = pSrc[2u * i];
|
||||
pSrc[2u * i] = pSrc[2u * j];
|
||||
pSrc[2u * j] = in;
|
||||
|
||||
/* pSrc[i+1u] <-> pSrc[j+1u] */
|
||||
in = pSrc[(2u * i) + 1u];
|
||||
pSrc[(2u * i) + 1u] = pSrc[(2u * j) + 1u];
|
||||
pSrc[(2u * j) + 1u] = in;
|
||||
|
||||
/* pSrc[i+fftLenBy2p1] <-> pSrc[j+fftLenBy2p1] */
|
||||
in = pSrc[2u * (i + fftLenBy2p1)];
|
||||
pSrc[2u * (i + fftLenBy2p1)] = pSrc[2u * (j + fftLenBy2p1)];
|
||||
pSrc[2u * (j + fftLenBy2p1)] = in;
|
||||
|
||||
/* pSrc[i+fftLenBy2p1+1u] <-> pSrc[j+fftLenBy2p1+1u] */
|
||||
in = pSrc[(2u * (i + fftLenBy2p1)) + 1u];
|
||||
pSrc[(2u * (i + fftLenBy2p1)) + 1u] =
|
||||
pSrc[(2u * (j + fftLenBy2p1)) + 1u];
|
||||
pSrc[(2u * (j + fftLenBy2p1)) + 1u] = in;
|
||||
|
||||
}
|
||||
|
||||
/* pSrc[i+1u] <-> pSrc[j+1u] */
|
||||
in = pSrc[2u * (i + 1u)];
|
||||
pSrc[2u * (i + 1u)] = pSrc[2u * (j + fftLenBy2)];
|
||||
pSrc[2u * (j + fftLenBy2)] = in;
|
||||
|
||||
/* pSrc[i+2u] <-> pSrc[j+2u] */
|
||||
in = pSrc[(2u * (i + 1u)) + 1u];
|
||||
pSrc[(2u * (i + 1u)) + 1u] = pSrc[(2u * (j + fftLenBy2)) + 1u];
|
||||
pSrc[(2u * (j + fftLenBy2)) + 1u] = in;
|
||||
|
||||
/* Reading the index for the bit reversal */
|
||||
j = *pBitRevTable;
|
||||
|
||||
/* Updating the bit reversal index depending on the fft length */
|
||||
pBitRevTable += bitRevFactor;
|
||||
}
|
||||
}
|
@ -0,0 +1,450 @@
|
||||
/* ----------------------------------------------------------------------
|
||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
||||
*
|
||||
* $Date: 15. July 2011
|
||||
* $Revision: V1.0.10
|
||||
*
|
||||
* Project: CMSIS DSP Library
|
||||
* Title: arm_dct4_f32.c
|
||||
*
|
||||
* Description: Processing function of DCT4 & IDCT4 F32.
|
||||
*
|
||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
||||
*
|
||||
* Version 1.0.10 2011/7/15
|
||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
||||
*
|
||||
* Version 1.0.3 2010/11/29
|
||||
* Re-organized the CMSIS folders and updated documentation.
|
||||
*
|
||||
* Version 1.0.2 2010/11/11
|
||||
* Documentation updated.
|
||||
*
|
||||
* Version 1.0.1 2010/10/05
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 1.0.0 2010/09/20
|
||||
* Production release and review comments incorporated.
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#include "arm_math.h"
|
||||
|
||||
/**
|
||||
* @ingroup groupTransforms
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup DCT4_IDCT4 DCT Type IV Functions
|
||||
* Representation of signals by minimum number of values is important for storage and transmission.
|
||||
* The possibility of large discontinuity between the beginning and end of a period of a signal
|
||||
* in DFT can be avoided by extending the signal so that it is even-symmetric.
|
||||
* Discrete Cosine Transform (DCT) is constructed such that its energy is heavily concentrated in the lower part of the
|
||||
* spectrum and is very widely used in signal and image coding applications.
|
||||
* The family of DCTs (DCT type- 1,2,3,4) is the outcome of different combinations of homogeneous boundary conditions.
|
||||
* DCT has an excellent energy-packing capability, hence has many applications and in data compression in particular.
|
||||
*
|
||||
* DCT is essentially the Discrete Fourier Transform(DFT) of an even-extended real signal.
|
||||
* Reordering of the input data makes the computation of DCT just a problem of
|
||||
* computing the DFT of a real signal with a few additional operations.
|
||||
* This approach provides regular, simple, and very efficient DCT algorithms for practical hardware and software implementations.
|
||||
*
|
||||
* DCT type-II can be implemented using Fast fourier transform (FFT) internally, as the transform is applied on real values, Real FFT can be used.
|
||||
* DCT4 is implemented using DCT2 as their implementations are similar except with some added pre-processing and post-processing.
|
||||
* DCT2 implementation can be described in the following steps:
|
||||
* - Re-ordering input
|
||||
* - Calculating Real FFT
|
||||
* - Multiplication of weights and Real FFT output and getting real part from the product.
|
||||
*
|
||||
* This process is explained by the block diagram below:
|
||||
* \image html DCT4.gif "Discrete Cosine Transform - type-IV"
|
||||
*
|
||||
* \par Algorithm:
|
||||
* The N-point type-IV DCT is defined as a real, linear transformation by the formula:
|
||||
* \image html DCT4Equation.gif
|
||||
* where <code>k = 0,1,2,.....N-1</code>
|
||||
*\par
|
||||
* Its inverse is defined as follows:
|
||||
* \image html IDCT4Equation.gif
|
||||
* where <code>n = 0,1,2,.....N-1</code>
|
||||
*\par
|
||||
* The DCT4 matrices become involutory (i.e. they are self-inverse) by multiplying with an overall scale factor of sqrt(2/N).
|
||||
* The symmetry of the transform matrix indicates that the fast algorithms for the forward
|
||||
* and inverse transform computation are identical.
|
||||
* Note that the implementation of Inverse DCT4 and DCT4 is same, hence same process function can be used for both.
|
||||
*
|
||||
* \par Lengths supported by the transform:
|
||||
* As DCT4 internally uses Real FFT, it supports all the lengths supported by arm_rfft_f32().
|
||||
* The library provides separate functions for Q15, Q31, and floating-point data types.
|
||||
* \par Instance Structure
|
||||
* The instances for Real FFT and FFT, cosine values table and twiddle factor table are stored in an instance data structure.
|
||||
* A separate instance structure must be defined for each transform.
|
||||
* There are separate instance structure declarations for each of the 3 supported data types.
|
||||
*
|
||||
* \par Initialization Functions
|
||||
* There is also an associated initialization function for each data type.
|
||||
* The initialization function performs the following operations:
|
||||
* - Sets the values of the internal structure fields.
|
||||
* - Initializes Real FFT as its process function is used internally in DCT4, by calling arm_rfft_init_f32().
|
||||
* \par
|
||||
* Use of the initialization function is optional.
|
||||
* However, if the initialization function is used, then the instance structure cannot be placed into a const data section.
|
||||
* To place an instance structure into a const data section, the instance structure must be manually initialized.
|
||||
* Manually initialize the instance structure as follows:
|
||||
* <pre>
|
||||
*arm_dct4_instance_f32 S = {N, Nby2, normalize, pTwiddle, pCosFactor, pRfft, pCfft};
|
||||
*arm_dct4_instance_q31 S = {N, Nby2, normalize, pTwiddle, pCosFactor, pRfft, pCfft};
|
||||
*arm_dct4_instance_q15 S = {N, Nby2, normalize, pTwiddle, pCosFactor, pRfft, pCfft};
|
||||
* </pre>
|
||||
* where \c N is the length of the DCT4; \c Nby2 is half of the length of the DCT4;
|
||||
* \c normalize is normalizing factor used and is equal to <code>sqrt(2/N)</code>;
|
||||
* \c pTwiddle points to the twiddle factor table;
|
||||
* \c pCosFactor points to the cosFactor table;
|
||||
* \c pRfft points to the real FFT instance;
|
||||
* \c pCfft points to the complex FFT instance;
|
||||
* The CFFT and RFFT structures also needs to be initialized, refer to arm_cfft_radix4_f32()
|
||||
* and arm_rfft_f32() respectively for details regarding static initialization.
|
||||
*
|
||||
* \par Fixed-Point Behavior
|
||||
* Care must be taken when using the fixed-point versions of the DCT4 transform functions.
|
||||
* In particular, the overflow and saturation behavior of the accumulator used in each function must be considered.
|
||||
* Refer to the function specific documentation below for usage guidelines.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup DCT4_IDCT4
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Processing function for the floating-point DCT4/IDCT4.
|
||||
* @param[in] *S points to an instance of the floating-point DCT4/IDCT4 structure.
|
||||
* @param[in] *pState points to state buffer.
|
||||
* @param[in,out] *pInlineBuffer points to the in-place input and output buffer.
|
||||
* @return none.
|
||||
*/
|
||||
|
||||
void arm_dct4_f32(
|
||||
const arm_dct4_instance_f32 * S,
|
||||
float32_t * pState,
|
||||
float32_t * pInlineBuffer)
|
||||
{
|
||||
uint32_t i; /* Loop counter */
|
||||
float32_t *weights = S->pTwiddle; /* Pointer to the Weights table */
|
||||
float32_t *cosFact = S->pCosFactor; /* Pointer to the cos factors table */
|
||||
float32_t *pS1, *pS2, *pbuff; /* Temporary pointers for input buffer and pState buffer */
|
||||
float32_t in; /* Temporary variable */
|
||||
|
||||
|
||||
/* DCT4 computation involves DCT2 (which is calculated using RFFT)
|
||||
* along with some pre-processing and post-processing.
|
||||
* Computational procedure is explained as follows:
|
||||
* (a) Pre-processing involves multiplying input with cos factor,
|
||||
* r(n) = 2 * u(n) * cos(pi*(2*n+1)/(4*n))
|
||||
* where,
|
||||
* r(n) -- output of preprocessing
|
||||
* u(n) -- input to preprocessing(actual Source buffer)
|
||||
* (b) Calculation of DCT2 using FFT is divided into three steps:
|
||||
* Step1: Re-ordering of even and odd elements of input.
|
||||
* Step2: Calculating FFT of the re-ordered input.
|
||||
* Step3: Taking the real part of the product of FFT output and weights.
|
||||
* (c) Post-processing - DCT4 can be obtained from DCT2 output using the following equation:
|
||||
* Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0)
|
||||
* where,
|
||||
* Y4 -- DCT4 output, Y2 -- DCT2 output
|
||||
* (d) Multiplying the output with the normalizing factor sqrt(2/N).
|
||||
*/
|
||||
|
||||
/*-------- Pre-processing ------------*/
|
||||
/* Multiplying input with cos factor i.e. r(n) = 2 * x(n) * cos(pi*(2*n+1)/(4*n)) */
|
||||
arm_scale_f32(pInlineBuffer, 2.0f, pInlineBuffer, S->N);
|
||||
arm_mult_f32(pInlineBuffer, cosFact, pInlineBuffer, S->N);
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* Step1: Re-ordering of even and odd elements as,
|
||||
* pState[i] = pInlineBuffer[2*i] and
|
||||
* pState[N-i-1] = pInlineBuffer[2*i+1] where i = 0 to N/2
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
/* pS1 initialized to pState */
|
||||
pS1 = pState;
|
||||
|
||||
/* pS2 initialized to pState+N-1, so that it points to the end of the state buffer */
|
||||
pS2 = pState + (S->N - 1u);
|
||||
|
||||
/* pbuff initialized to input buffer */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
#ifndef ARM_MATH_CM0
|
||||
|
||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
||||
|
||||
/* Initializing the loop counter to N/2 >> 2 for loop unrolling by 4 */
|
||||
i = (uint32_t) S->Nby2 >> 2u;
|
||||
|
||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
||||
** a second loop below computes the remaining 1 to 3 samples. */
|
||||
do
|
||||
{
|
||||
/* Re-ordering of even and odd elements */
|
||||
/* pState[i] = pInlineBuffer[2*i] */
|
||||
*pS1++ = *pbuff++;
|
||||
/* pState[N-i-1] = pInlineBuffer[2*i+1] */
|
||||
*pS2-- = *pbuff++;
|
||||
|
||||
*pS1++ = *pbuff++;
|
||||
*pS2-- = *pbuff++;
|
||||
|
||||
*pS1++ = *pbuff++;
|
||||
*pS2-- = *pbuff++;
|
||||
|
||||
*pS1++ = *pbuff++;
|
||||
*pS2-- = *pbuff++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
/* pbuff initialized to input buffer */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
/* pS1 initialized to pState */
|
||||
pS1 = pState;
|
||||
|
||||
/* Initializing the loop counter to N/4 instead of N for loop unrolling */
|
||||
i = (uint32_t) S->N >> 2u;
|
||||
|
||||
/* Processing with loop unrolling 4 times as N is always multiple of 4.
|
||||
* Compute 4 outputs at a time */
|
||||
do
|
||||
{
|
||||
/* Writing the re-ordered output back to inplace input buffer */
|
||||
*pbuff++ = *pS1++;
|
||||
*pbuff++ = *pS1++;
|
||||
*pbuff++ = *pS1++;
|
||||
*pbuff++ = *pS1++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
|
||||
/* ---------------------------------------------------------
|
||||
* Step2: Calculate RFFT for N-point input
|
||||
* ---------------------------------------------------------- */
|
||||
/* pInlineBuffer is real input of length N , pState is the complex output of length 2N */
|
||||
arm_rfft_f32(S->pRfft, pInlineBuffer, pState);
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
* Step3: Multiply the FFT output with the weights.
|
||||
*----------------------------------------------------------------------*/
|
||||
arm_cmplx_mult_cmplx_f32(pState, weights, pState, S->N);
|
||||
|
||||
/* ----------- Post-processing ---------- */
|
||||
/* DCT-IV can be obtained from DCT-II by the equation,
|
||||
* Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0)
|
||||
* Hence, Y4(0) = Y2(0)/2 */
|
||||
/* Getting only real part from the output and Converting to DCT-IV */
|
||||
|
||||
/* Initializing the loop counter to N >> 2 for loop unrolling by 4 */
|
||||
i = ((uint32_t) S->N - 1u) >> 2u;
|
||||
|
||||
/* pbuff initialized to input buffer. */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
/* pS1 initialized to pState */
|
||||
pS1 = pState;
|
||||
|
||||
/* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */
|
||||
in = *pS1++ * (float32_t) 0.5;
|
||||
/* input buffer acts as inplace, so output values are stored in the input itself. */
|
||||
*pbuff++ = in;
|
||||
|
||||
/* pState pointer is incremented twice as the real values are located alternatively in the array */
|
||||
pS1++;
|
||||
|
||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
||||
** a second loop below computes the remaining 1 to 3 samples. */
|
||||
do
|
||||
{
|
||||
/* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */
|
||||
/* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
/* points to the next real value */
|
||||
pS1++;
|
||||
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
pS1++;
|
||||
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
pS1++;
|
||||
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
pS1++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
||||
** No loop unrolling is used. */
|
||||
i = ((uint32_t) S->N - 1u) % 0x4u;
|
||||
|
||||
while(i > 0u)
|
||||
{
|
||||
/* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */
|
||||
/* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
/* points to the next real value */
|
||||
pS1++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
}
|
||||
|
||||
|
||||
/*------------ Normalizing the output by multiplying with the normalizing factor ----------*/
|
||||
|
||||
/* Initializing the loop counter to N/4 instead of N for loop unrolling */
|
||||
i = (uint32_t) S->N >> 2u;
|
||||
|
||||
/* pbuff initialized to the pInlineBuffer(now contains the output values) */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
/* Processing with loop unrolling 4 times as N is always multiple of 4. Compute 4 outputs at a time */
|
||||
do
|
||||
{
|
||||
/* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */
|
||||
in = *pbuff;
|
||||
*pbuff++ = in * S->normalize;
|
||||
|
||||
in = *pbuff;
|
||||
*pbuff++ = in * S->normalize;
|
||||
|
||||
in = *pbuff;
|
||||
*pbuff++ = in * S->normalize;
|
||||
|
||||
in = *pbuff;
|
||||
*pbuff++ = in * S->normalize;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
|
||||
#else
|
||||
|
||||
/* Run the below code for Cortex-M0 */
|
||||
|
||||
/* Initializing the loop counter to N/2 */
|
||||
i = (uint32_t) S->Nby2;
|
||||
|
||||
do
|
||||
{
|
||||
/* Re-ordering of even and odd elements */
|
||||
/* pState[i] = pInlineBuffer[2*i] */
|
||||
*pS1++ = *pbuff++;
|
||||
/* pState[N-i-1] = pInlineBuffer[2*i+1] */
|
||||
*pS2-- = *pbuff++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
/* pbuff initialized to input buffer */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
/* pS1 initialized to pState */
|
||||
pS1 = pState;
|
||||
|
||||
/* Initializing the loop counter */
|
||||
i = (uint32_t) S->N;
|
||||
|
||||
do
|
||||
{
|
||||
/* Writing the re-ordered output back to inplace input buffer */
|
||||
*pbuff++ = *pS1++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
|
||||
/* ---------------------------------------------------------
|
||||
* Step2: Calculate RFFT for N-point input
|
||||
* ---------------------------------------------------------- */
|
||||
/* pInlineBuffer is real input of length N , pState is the complex output of length 2N */
|
||||
arm_rfft_f32(S->pRfft, pInlineBuffer, pState);
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
* Step3: Multiply the FFT output with the weights.
|
||||
*----------------------------------------------------------------------*/
|
||||
arm_cmplx_mult_cmplx_f32(pState, weights, pState, S->N);
|
||||
|
||||
/* ----------- Post-processing ---------- */
|
||||
/* DCT-IV can be obtained from DCT-II by the equation,
|
||||
* Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0)
|
||||
* Hence, Y4(0) = Y2(0)/2 */
|
||||
/* Getting only real part from the output and Converting to DCT-IV */
|
||||
|
||||
/* pbuff initialized to input buffer. */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
/* pS1 initialized to pState */
|
||||
pS1 = pState;
|
||||
|
||||
/* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */
|
||||
in = *pS1++ * (float32_t) 0.5;
|
||||
/* input buffer acts as inplace, so output values are stored in the input itself. */
|
||||
*pbuff++ = in;
|
||||
|
||||
/* pState pointer is incremented twice as the real values are located alternatively in the array */
|
||||
pS1++;
|
||||
|
||||
/* Initializing the loop counter */
|
||||
i = ((uint32_t) S->N - 1u);
|
||||
|
||||
do
|
||||
{
|
||||
/* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */
|
||||
/* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
/* points to the next real value */
|
||||
pS1++;
|
||||
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
|
||||
/*------------ Normalizing the output by multiplying with the normalizing factor ----------*/
|
||||
|
||||
/* Initializing the loop counter */
|
||||
i = (uint32_t) S->N;
|
||||
|
||||
/* pbuff initialized to the pInlineBuffer(now contains the output values) */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
do
|
||||
{
|
||||
/* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */
|
||||
in = *pbuff;
|
||||
*pbuff++ = in * S->normalize;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
#endif /* #ifndef ARM_MATH_CM0 */
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @} end of DCT4_IDCT4 group
|
||||
*/
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,383 @@
|
||||
/* ----------------------------------------------------------------------
|
||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
||||
*
|
||||
* $Date: 15. July 2011
|
||||
* $Revision: V1.0.10
|
||||
*
|
||||
* Project: CMSIS DSP Library
|
||||
* Title: arm_dct4_q15.c
|
||||
*
|
||||
* Description: Processing function of DCT4 & IDCT4 Q15.
|
||||
*
|
||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
||||
*
|
||||
* Version 1.0.10 2011/7/15
|
||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
||||
*
|
||||
* Version 1.0.3 2010/11/29
|
||||
* Re-organized the CMSIS folders and updated documentation.
|
||||
*
|
||||
* Version 1.0.2 2010/11/11
|
||||
* Documentation updated.
|
||||
*
|
||||
* Version 1.0.1 2010/10/05
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 1.0.0 2010/09/20
|
||||
* Production release and review comments incorporated.
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#include "arm_math.h"
|
||||
|
||||
/**
|
||||
* @addtogroup DCT4_IDCT4
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Processing function for the Q15 DCT4/IDCT4.
|
||||
* @param[in] *S points to an instance of the Q15 DCT4 structure.
|
||||
* @param[in] *pState points to state buffer.
|
||||
* @param[in,out] *pInlineBuffer points to the in-place input and output buffer.
|
||||
* @return none.
|
||||
*
|
||||
* \par Input an output formats:
|
||||
* Internally inputs are downscaled in the RFFT process function to avoid overflows.
|
||||
* Number of bits downscaled, depends on the size of the transform.
|
||||
* The input and output formats for different DCT sizes and number of bits to upscale are mentioned in the table below:
|
||||
*
|
||||
* \image html dct4FormatsQ15Table.gif
|
||||
*/
|
||||
|
||||
void arm_dct4_q15(
|
||||
const arm_dct4_instance_q15 * S,
|
||||
q15_t * pState,
|
||||
q15_t * pInlineBuffer)
|
||||
{
|
||||
uint32_t i; /* Loop counter */
|
||||
q15_t *weights = S->pTwiddle; /* Pointer to the Weights table */
|
||||
q15_t *cosFact = S->pCosFactor; /* Pointer to the cos factors table */
|
||||
q15_t *pS1, *pS2, *pbuff; /* Temporary pointers for input buffer and pState buffer */
|
||||
q15_t in; /* Temporary variable */
|
||||
|
||||
|
||||
/* DCT4 computation involves DCT2 (which is calculated using RFFT)
|
||||
* along with some pre-processing and post-processing.
|
||||
* Computational procedure is explained as follows:
|
||||
* (a) Pre-processing involves multiplying input with cos factor,
|
||||
* r(n) = 2 * u(n) * cos(pi*(2*n+1)/(4*n))
|
||||
* where,
|
||||
* r(n) -- output of preprocessing
|
||||
* u(n) -- input to preprocessing(actual Source buffer)
|
||||
* (b) Calculation of DCT2 using FFT is divided into three steps:
|
||||
* Step1: Re-ordering of even and odd elements of input.
|
||||
* Step2: Calculating FFT of the re-ordered input.
|
||||
* Step3: Taking the real part of the product of FFT output and weights.
|
||||
* (c) Post-processing - DCT4 can be obtained from DCT2 output using the following equation:
|
||||
* Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0)
|
||||
* where,
|
||||
* Y4 -- DCT4 output, Y2 -- DCT2 output
|
||||
* (d) Multiplying the output with the normalizing factor sqrt(2/N).
|
||||
*/
|
||||
|
||||
/*-------- Pre-processing ------------*/
|
||||
/* Multiplying input with cos factor i.e. r(n) = 2 * x(n) * cos(pi*(2*n+1)/(4*n)) */
|
||||
arm_mult_q15(pInlineBuffer, cosFact, pInlineBuffer, S->N);
|
||||
arm_shift_q15(pInlineBuffer, 1, pInlineBuffer, S->N);
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* Step1: Re-ordering of even and odd elements as
|
||||
* pState[i] = pInlineBuffer[2*i] and
|
||||
* pState[N-i-1] = pInlineBuffer[2*i+1] where i = 0 to N/2
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
/* pS1 initialized to pState */
|
||||
pS1 = pState;
|
||||
|
||||
/* pS2 initialized to pState+N-1, so that it points to the end of the state buffer */
|
||||
pS2 = pState + (S->N - 1u);
|
||||
|
||||
/* pbuff initialized to input buffer */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
|
||||
#ifndef ARM_MATH_CM0
|
||||
|
||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
||||
|
||||
/* Initializing the loop counter to N/2 >> 2 for loop unrolling by 4 */
|
||||
i = (uint32_t) S->Nby2 >> 2u;
|
||||
|
||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
||||
** a second loop below computes the remaining 1 to 3 samples. */
|
||||
do
|
||||
{
|
||||
/* Re-ordering of even and odd elements */
|
||||
/* pState[i] = pInlineBuffer[2*i] */
|
||||
*pS1++ = *pbuff++;
|
||||
/* pState[N-i-1] = pInlineBuffer[2*i+1] */
|
||||
*pS2-- = *pbuff++;
|
||||
|
||||
*pS1++ = *pbuff++;
|
||||
*pS2-- = *pbuff++;
|
||||
|
||||
*pS1++ = *pbuff++;
|
||||
*pS2-- = *pbuff++;
|
||||
|
||||
*pS1++ = *pbuff++;
|
||||
*pS2-- = *pbuff++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
/* pbuff initialized to input buffer */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
/* pS1 initialized to pState */
|
||||
pS1 = pState;
|
||||
|
||||
/* Initializing the loop counter to N/4 instead of N for loop unrolling */
|
||||
i = (uint32_t) S->N >> 2u;
|
||||
|
||||
/* Processing with loop unrolling 4 times as N is always multiple of 4.
|
||||
* Compute 4 outputs at a time */
|
||||
do
|
||||
{
|
||||
/* Writing the re-ordered output back to inplace input buffer */
|
||||
*pbuff++ = *pS1++;
|
||||
*pbuff++ = *pS1++;
|
||||
*pbuff++ = *pS1++;
|
||||
*pbuff++ = *pS1++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
|
||||
/* ---------------------------------------------------------
|
||||
* Step2: Calculate RFFT for N-point input
|
||||
* ---------------------------------------------------------- */
|
||||
/* pInlineBuffer is real input of length N , pState is the complex output of length 2N */
|
||||
arm_rfft_q15(S->pRfft, pInlineBuffer, pState);
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
* Step3: Multiply the FFT output with the weights.
|
||||
*----------------------------------------------------------------------*/
|
||||
arm_cmplx_mult_cmplx_q15(pState, weights, pState, S->N);
|
||||
|
||||
/* The output of complex multiplication is in 3.13 format.
|
||||
* Hence changing the format of N (i.e. 2*N elements) complex numbers to 1.15 format by shifting left by 2 bits. */
|
||||
arm_shift_q15(pState, 2, pState, S->N * 2);
|
||||
|
||||
/* ----------- Post-processing ---------- */
|
||||
/* DCT-IV can be obtained from DCT-II by the equation,
|
||||
* Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0)
|
||||
* Hence, Y4(0) = Y2(0)/2 */
|
||||
/* Getting only real part from the output and Converting to DCT-IV */
|
||||
|
||||
/* Initializing the loop counter to N >> 2 for loop unrolling by 4 */
|
||||
i = ((uint32_t) S->N - 1u) >> 2u;
|
||||
|
||||
/* pbuff initialized to input buffer. */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
/* pS1 initialized to pState */
|
||||
pS1 = pState;
|
||||
|
||||
/* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */
|
||||
in = *pS1++ >> 1u;
|
||||
/* input buffer acts as inplace, so output values are stored in the input itself. */
|
||||
*pbuff++ = in;
|
||||
|
||||
/* pState pointer is incremented twice as the real values are located alternatively in the array */
|
||||
pS1++;
|
||||
|
||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
||||
** a second loop below computes the remaining 1 to 3 samples. */
|
||||
do
|
||||
{
|
||||
/* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */
|
||||
/* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
/* points to the next real value */
|
||||
pS1++;
|
||||
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
pS1++;
|
||||
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
pS1++;
|
||||
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
pS1++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
||||
** No loop unrolling is used. */
|
||||
i = ((uint32_t) S->N - 1u) % 0x4u;
|
||||
|
||||
while(i > 0u)
|
||||
{
|
||||
/* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */
|
||||
/* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
/* points to the next real value */
|
||||
pS1++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
}
|
||||
|
||||
|
||||
/*------------ Normalizing the output by multiplying with the normalizing factor ----------*/
|
||||
|
||||
/* Initializing the loop counter to N/4 instead of N for loop unrolling */
|
||||
i = (uint32_t) S->N >> 2u;
|
||||
|
||||
/* pbuff initialized to the pInlineBuffer(now contains the output values) */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
/* Processing with loop unrolling 4 times as N is always multiple of 4. Compute 4 outputs at a time */
|
||||
do
|
||||
{
|
||||
/* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */
|
||||
in = *pbuff;
|
||||
*pbuff++ = ((q15_t) (((q31_t) in * S->normalize) >> 15));
|
||||
|
||||
in = *pbuff;
|
||||
*pbuff++ = ((q15_t) (((q31_t) in * S->normalize) >> 15));
|
||||
|
||||
in = *pbuff;
|
||||
*pbuff++ = ((q15_t) (((q31_t) in * S->normalize) >> 15));
|
||||
|
||||
in = *pbuff;
|
||||
*pbuff++ = ((q15_t) (((q31_t) in * S->normalize) >> 15));
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
|
||||
#else
|
||||
|
||||
/* Run the below code for Cortex-M0 */
|
||||
|
||||
/* Initializing the loop counter to N/2 */
|
||||
i = (uint32_t) S->Nby2;
|
||||
|
||||
do
|
||||
{
|
||||
/* Re-ordering of even and odd elements */
|
||||
/* pState[i] = pInlineBuffer[2*i] */
|
||||
*pS1++ = *pbuff++;
|
||||
/* pState[N-i-1] = pInlineBuffer[2*i+1] */
|
||||
*pS2-- = *pbuff++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
/* pbuff initialized to input buffer */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
/* pS1 initialized to pState */
|
||||
pS1 = pState;
|
||||
|
||||
/* Initializing the loop counter */
|
||||
i = (uint32_t) S->N;
|
||||
|
||||
do
|
||||
{
|
||||
/* Writing the re-ordered output back to inplace input buffer */
|
||||
*pbuff++ = *pS1++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
|
||||
/* ---------------------------------------------------------
|
||||
* Step2: Calculate RFFT for N-point input
|
||||
* ---------------------------------------------------------- */
|
||||
/* pInlineBuffer is real input of length N , pState is the complex output of length 2N */
|
||||
arm_rfft_q15(S->pRfft, pInlineBuffer, pState);
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
* Step3: Multiply the FFT output with the weights.
|
||||
*----------------------------------------------------------------------*/
|
||||
arm_cmplx_mult_cmplx_q15(pState, weights, pState, S->N);
|
||||
|
||||
/* The output of complex multiplication is in 3.13 format.
|
||||
* Hence changing the format of N (i.e. 2*N elements) complex numbers to 1.15 format by shifting left by 2 bits. */
|
||||
arm_shift_q15(pState, 2, pState, S->N * 2);
|
||||
|
||||
/* ----------- Post-processing ---------- */
|
||||
/* DCT-IV can be obtained from DCT-II by the equation,
|
||||
* Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0)
|
||||
* Hence, Y4(0) = Y2(0)/2 */
|
||||
/* Getting only real part from the output and Converting to DCT-IV */
|
||||
|
||||
/* Initializing the loop counter */
|
||||
i = ((uint32_t) S->N - 1u);
|
||||
|
||||
/* pbuff initialized to input buffer. */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
/* pS1 initialized to pState */
|
||||
pS1 = pState;
|
||||
|
||||
/* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */
|
||||
in = *pS1++ >> 1u;
|
||||
/* input buffer acts as inplace, so output values are stored in the input itself. */
|
||||
*pbuff++ = in;
|
||||
|
||||
/* pState pointer is incremented twice as the real values are located alternatively in the array */
|
||||
pS1++;
|
||||
|
||||
do
|
||||
{
|
||||
/* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */
|
||||
/* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
/* points to the next real value */
|
||||
pS1++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
/*------------ Normalizing the output by multiplying with the normalizing factor ----------*/
|
||||
|
||||
/* Initializing the loop counter */
|
||||
i = (uint32_t) S->N;
|
||||
|
||||
/* pbuff initialized to the pInlineBuffer(now contains the output values) */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
do
|
||||
{
|
||||
/* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */
|
||||
in = *pbuff;
|
||||
*pbuff++ = ((q15_t) (((q31_t) in * S->normalize) >> 15));
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
#endif /* #ifndef ARM_MATH_CM0 */
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @} end of DCT4_IDCT4 group
|
||||
*/
|
@ -0,0 +1,384 @@
|
||||
/* ----------------------------------------------------------------------
|
||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
||||
*
|
||||
* $Date: 15. July 2011
|
||||
* $Revision: V1.0.10
|
||||
*
|
||||
* Project: CMSIS DSP Library
|
||||
* Title: arm_dct4_q31.c
|
||||
*
|
||||
* Description: Processing function of DCT4 & IDCT4 Q31.
|
||||
*
|
||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
||||
*
|
||||
* Version 1.0.10 2011/7/15
|
||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
||||
*
|
||||
* Version 1.0.3 2010/11/29
|
||||
* Re-organized the CMSIS folders and updated documentation.
|
||||
*
|
||||
* Version 1.0.2 2010/11/11
|
||||
* Documentation updated.
|
||||
*
|
||||
* Version 1.0.1 2010/10/05
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 1.0.0 2010/09/20
|
||||
* Production release and review comments incorporated.
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#include "arm_math.h"
|
||||
|
||||
/**
|
||||
* @addtogroup DCT4_IDCT4
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Processing function for the Q31 DCT4/IDCT4.
|
||||
* @param[in] *S points to an instance of the Q31 DCT4 structure.
|
||||
* @param[in] *pState points to state buffer.
|
||||
* @param[in,out] *pInlineBuffer points to the in-place input and output buffer.
|
||||
* @return none.
|
||||
* \par Input an output formats:
|
||||
* Input samples need to be downscaled by 1 bit to avoid saturations in the Q31 DCT process,
|
||||
* as the conversion from DCT2 to DCT4 involves one subtraction.
|
||||
* Internally inputs are downscaled in the RFFT process function to avoid overflows.
|
||||
* Number of bits downscaled, depends on the size of the transform.
|
||||
* The input and output formats for different DCT sizes and number of bits to upscale are mentioned in the table below:
|
||||
*
|
||||
* \image html dct4FormatsQ31Table.gif
|
||||
*/
|
||||
|
||||
void arm_dct4_q31(
|
||||
const arm_dct4_instance_q31 * S,
|
||||
q31_t * pState,
|
||||
q31_t * pInlineBuffer)
|
||||
{
|
||||
uint16_t i; /* Loop counter */
|
||||
q31_t *weights = S->pTwiddle; /* Pointer to the Weights table */
|
||||
q31_t *cosFact = S->pCosFactor; /* Pointer to the cos factors table */
|
||||
q31_t *pS1, *pS2, *pbuff; /* Temporary pointers for input buffer and pState buffer */
|
||||
q31_t in; /* Temporary variable */
|
||||
|
||||
|
||||
/* DCT4 computation involves DCT2 (which is calculated using RFFT)
|
||||
* along with some pre-processing and post-processing.
|
||||
* Computational procedure is explained as follows:
|
||||
* (a) Pre-processing involves multiplying input with cos factor,
|
||||
* r(n) = 2 * u(n) * cos(pi*(2*n+1)/(4*n))
|
||||
* where,
|
||||
* r(n) -- output of preprocessing
|
||||
* u(n) -- input to preprocessing(actual Source buffer)
|
||||
* (b) Calculation of DCT2 using FFT is divided into three steps:
|
||||
* Step1: Re-ordering of even and odd elements of input.
|
||||
* Step2: Calculating FFT of the re-ordered input.
|
||||
* Step3: Taking the real part of the product of FFT output and weights.
|
||||
* (c) Post-processing - DCT4 can be obtained from DCT2 output using the following equation:
|
||||
* Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0)
|
||||
* where,
|
||||
* Y4 -- DCT4 output, Y2 -- DCT2 output
|
||||
* (d) Multiplying the output with the normalizing factor sqrt(2/N).
|
||||
*/
|
||||
|
||||
/*-------- Pre-processing ------------*/
|
||||
/* Multiplying input with cos factor i.e. r(n) = 2 * x(n) * cos(pi*(2*n+1)/(4*n)) */
|
||||
arm_mult_q31(pInlineBuffer, cosFact, pInlineBuffer, S->N);
|
||||
arm_shift_q31(pInlineBuffer, 1, pInlineBuffer, S->N);
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* Step1: Re-ordering of even and odd elements as
|
||||
* pState[i] = pInlineBuffer[2*i] and
|
||||
* pState[N-i-1] = pInlineBuffer[2*i+1] where i = 0 to N/2
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
/* pS1 initialized to pState */
|
||||
pS1 = pState;
|
||||
|
||||
/* pS2 initialized to pState+N-1, so that it points to the end of the state buffer */
|
||||
pS2 = pState + (S->N - 1u);
|
||||
|
||||
/* pbuff initialized to input buffer */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
#ifndef ARM_MATH_CM0
|
||||
|
||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
||||
|
||||
/* Initializing the loop counter to N/2 >> 2 for loop unrolling by 4 */
|
||||
i = S->Nby2 >> 2u;
|
||||
|
||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
||||
** a second loop below computes the remaining 1 to 3 samples. */
|
||||
do
|
||||
{
|
||||
/* Re-ordering of even and odd elements */
|
||||
/* pState[i] = pInlineBuffer[2*i] */
|
||||
*pS1++ = *pbuff++;
|
||||
/* pState[N-i-1] = pInlineBuffer[2*i+1] */
|
||||
*pS2-- = *pbuff++;
|
||||
|
||||
*pS1++ = *pbuff++;
|
||||
*pS2-- = *pbuff++;
|
||||
|
||||
*pS1++ = *pbuff++;
|
||||
*pS2-- = *pbuff++;
|
||||
|
||||
*pS1++ = *pbuff++;
|
||||
*pS2-- = *pbuff++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
/* pbuff initialized to input buffer */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
/* pS1 initialized to pState */
|
||||
pS1 = pState;
|
||||
|
||||
/* Initializing the loop counter to N/4 instead of N for loop unrolling */
|
||||
i = S->N >> 2u;
|
||||
|
||||
/* Processing with loop unrolling 4 times as N is always multiple of 4.
|
||||
* Compute 4 outputs at a time */
|
||||
do
|
||||
{
|
||||
/* Writing the re-ordered output back to inplace input buffer */
|
||||
*pbuff++ = *pS1++;
|
||||
*pbuff++ = *pS1++;
|
||||
*pbuff++ = *pS1++;
|
||||
*pbuff++ = *pS1++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
|
||||
/* ---------------------------------------------------------
|
||||
* Step2: Calculate RFFT for N-point input
|
||||
* ---------------------------------------------------------- */
|
||||
/* pInlineBuffer is real input of length N , pState is the complex output of length 2N */
|
||||
arm_rfft_q31(S->pRfft, pInlineBuffer, pState);
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
* Step3: Multiply the FFT output with the weights.
|
||||
*----------------------------------------------------------------------*/
|
||||
arm_cmplx_mult_cmplx_q31(pState, weights, pState, S->N);
|
||||
|
||||
/* The output of complex multiplication is in 3.29 format.
|
||||
* Hence changing the format of N (i.e. 2*N elements) complex numbers to 1.31 format by shifting left by 2 bits. */
|
||||
arm_shift_q31(pState, 2, pState, S->N * 2);
|
||||
|
||||
/* ----------- Post-processing ---------- */
|
||||
/* DCT-IV can be obtained from DCT-II by the equation,
|
||||
* Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0)
|
||||
* Hence, Y4(0) = Y2(0)/2 */
|
||||
/* Getting only real part from the output and Converting to DCT-IV */
|
||||
|
||||
/* Initializing the loop counter to N >> 2 for loop unrolling by 4 */
|
||||
i = (S->N - 1u) >> 2u;
|
||||
|
||||
/* pbuff initialized to input buffer. */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
/* pS1 initialized to pState */
|
||||
pS1 = pState;
|
||||
|
||||
/* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */
|
||||
in = *pS1++ >> 1u;
|
||||
/* input buffer acts as inplace, so output values are stored in the input itself. */
|
||||
*pbuff++ = in;
|
||||
|
||||
/* pState pointer is incremented twice as the real values are located alternatively in the array */
|
||||
pS1++;
|
||||
|
||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
||||
** a second loop below computes the remaining 1 to 3 samples. */
|
||||
do
|
||||
{
|
||||
/* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */
|
||||
/* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
/* points to the next real value */
|
||||
pS1++;
|
||||
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
pS1++;
|
||||
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
pS1++;
|
||||
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
pS1++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
||||
** No loop unrolling is used. */
|
||||
i = (S->N - 1u) % 0x4u;
|
||||
|
||||
while(i > 0u)
|
||||
{
|
||||
/* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */
|
||||
/* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
/* points to the next real value */
|
||||
pS1++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
}
|
||||
|
||||
|
||||
/*------------ Normalizing the output by multiplying with the normalizing factor ----------*/
|
||||
|
||||
/* Initializing the loop counter to N/4 instead of N for loop unrolling */
|
||||
i = S->N >> 2u;
|
||||
|
||||
/* pbuff initialized to the pInlineBuffer(now contains the output values) */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
/* Processing with loop unrolling 4 times as N is always multiple of 4. Compute 4 outputs at a time */
|
||||
do
|
||||
{
|
||||
/* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */
|
||||
in = *pbuff;
|
||||
*pbuff++ = ((q31_t) (((q63_t) in * S->normalize) >> 31));
|
||||
|
||||
in = *pbuff;
|
||||
*pbuff++ = ((q31_t) (((q63_t) in * S->normalize) >> 31));
|
||||
|
||||
in = *pbuff;
|
||||
*pbuff++ = ((q31_t) (((q63_t) in * S->normalize) >> 31));
|
||||
|
||||
in = *pbuff;
|
||||
*pbuff++ = ((q31_t) (((q63_t) in * S->normalize) >> 31));
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
|
||||
#else
|
||||
|
||||
/* Run the below code for Cortex-M0 */
|
||||
|
||||
/* Initializing the loop counter to N/2 */
|
||||
i = S->Nby2;
|
||||
|
||||
do
|
||||
{
|
||||
/* Re-ordering of even and odd elements */
|
||||
/* pState[i] = pInlineBuffer[2*i] */
|
||||
*pS1++ = *pbuff++;
|
||||
/* pState[N-i-1] = pInlineBuffer[2*i+1] */
|
||||
*pS2-- = *pbuff++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
/* pbuff initialized to input buffer */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
/* pS1 initialized to pState */
|
||||
pS1 = pState;
|
||||
|
||||
/* Initializing the loop counter */
|
||||
i = S->N;
|
||||
|
||||
do
|
||||
{
|
||||
/* Writing the re-ordered output back to inplace input buffer */
|
||||
*pbuff++ = *pS1++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
|
||||
/* ---------------------------------------------------------
|
||||
* Step2: Calculate RFFT for N-point input
|
||||
* ---------------------------------------------------------- */
|
||||
/* pInlineBuffer is real input of length N , pState is the complex output of length 2N */
|
||||
arm_rfft_q31(S->pRfft, pInlineBuffer, pState);
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
* Step3: Multiply the FFT output with the weights.
|
||||
*----------------------------------------------------------------------*/
|
||||
arm_cmplx_mult_cmplx_q31(pState, weights, pState, S->N);
|
||||
|
||||
/* The output of complex multiplication is in 3.29 format.
|
||||
* Hence changing the format of N (i.e. 2*N elements) complex numbers to 1.31 format by shifting left by 2 bits. */
|
||||
arm_shift_q31(pState, 2, pState, S->N * 2);
|
||||
|
||||
/* ----------- Post-processing ---------- */
|
||||
/* DCT-IV can be obtained from DCT-II by the equation,
|
||||
* Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0)
|
||||
* Hence, Y4(0) = Y2(0)/2 */
|
||||
/* Getting only real part from the output and Converting to DCT-IV */
|
||||
|
||||
/* pbuff initialized to input buffer. */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
/* pS1 initialized to pState */
|
||||
pS1 = pState;
|
||||
|
||||
/* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */
|
||||
in = *pS1++ >> 1u;
|
||||
/* input buffer acts as inplace, so output values are stored in the input itself. */
|
||||
*pbuff++ = in;
|
||||
|
||||
/* pState pointer is incremented twice as the real values are located alternatively in the array */
|
||||
pS1++;
|
||||
|
||||
/* Initializing the loop counter */
|
||||
i = (S->N - 1u);
|
||||
|
||||
while(i > 0u)
|
||||
{
|
||||
/* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */
|
||||
/* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */
|
||||
in = *pS1++ - in;
|
||||
*pbuff++ = in;
|
||||
/* points to the next real value */
|
||||
pS1++;
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
}
|
||||
|
||||
|
||||
/*------------ Normalizing the output by multiplying with the normalizing factor ----------*/
|
||||
|
||||
/* Initializing the loop counter */
|
||||
i = S->N;
|
||||
|
||||
/* pbuff initialized to the pInlineBuffer(now contains the output values) */
|
||||
pbuff = pInlineBuffer;
|
||||
|
||||
do
|
||||
{
|
||||
/* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */
|
||||
in = *pbuff;
|
||||
*pbuff++ = ((q31_t) (((q63_t) in * S->normalize) >> 31));
|
||||
|
||||
/* Decrement the loop counter */
|
||||
i--;
|
||||
} while(i > 0u);
|
||||
|
||||
#endif /* #ifndef ARM_MATH_CM0 */
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @} end of DCT4_IDCT4 group
|
||||
*/
|
@ -0,0 +1,383 @@
|
||||
/* ----------------------------------------------------------------------
|
||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
||||
*
|
||||
* $Date: 15. July 2011
|
||||
* $Revision: V1.0.10
|
||||
*
|
||||
* Project: CMSIS DSP Library
|
||||
* Title: arm_rfft_f32.c
|
||||
*
|
||||
* Description: RFFT & RIFFT Floating point process function
|
||||
*
|
||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
||||
*
|
||||
* Version 1.0.10 2011/7/15
|
||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
||||
*
|
||||
* Version 1.0.3 2010/11/29
|
||||
* Re-organized the CMSIS folders and updated documentation.
|
||||
*
|
||||
* Version 1.0.2 2010/11/11
|
||||
* Documentation updated.
|
||||
*
|
||||
* Version 1.0.1 2010/10/05
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 1.0.0 2010/09/20
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 0.0.7 2010/06/10
|
||||
* Misra-C changes done
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#include "arm_math.h"
|
||||
|
||||
/**
|
||||
* @ingroup groupTransforms
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup RFFT_RIFFT Real FFT Functions
|
||||
*
|
||||
* \par
|
||||
* Complex FFT/IFFT typically assumes complex input and output. However many applications use real valued data in time domain.
|
||||
* Real FFT/IFFT efficiently process real valued sequences with the advantage of requirement of low memory and with less complexity.
|
||||
*
|
||||
* \par
|
||||
* This set of functions implements Real Fast Fourier Transforms(RFFT) and Real Inverse Fast Fourier Transform(RIFFT)
|
||||
* for Q15, Q31, and floating-point data types.
|
||||
*
|
||||
*
|
||||
* \par Algorithm:
|
||||
*
|
||||
* <b>Real Fast Fourier Transform:</b>
|
||||
* \par
|
||||
* Real FFT of N-point is calculated using CFFT of N/2-point and Split RFFT process as shown below figure.
|
||||
* \par
|
||||
* \image html RFFT.gif "Real Fast Fourier Transform"
|
||||
* \par
|
||||
* The RFFT functions operate on blocks of input and output data and each call to the function processes
|
||||
* <code>fftLenR</code> samples through the transform. <code>pSrc</code> points to input array containing <code>fftLenR</code> values.
|
||||
* <code>pDst</code> points to output array containing <code>2*fftLenR</code> values. \n
|
||||
* Input for real FFT is in the order of
|
||||
* <pre>{real[0], real[1], real[2], real[3], ..}</pre>
|
||||
* Output for real FFT is complex and are in the order of
|
||||
* <pre>{real(0), imag(0), real(1), imag(1), ...}</pre>
|
||||
*
|
||||
* <b>Real Inverse Fast Fourier Transform:</b>
|
||||
* \par
|
||||
* Real IFFT of N-point is calculated using Split RIFFT process and CFFT of N/2-point as shown below figure.
|
||||
* \par
|
||||
* \image html RIFFT.gif "Real Inverse Fast Fourier Transform"
|
||||
* \par
|
||||
* The RIFFT functions operate on blocks of input and output data and each call to the function processes
|
||||
* <code>2*fftLenR</code> samples through the transform. <code>pSrc</code> points to input array containing <code>2*fftLenR</code> values.
|
||||
* <code>pDst</code> points to output array containing <code>fftLenR</code> values. \n
|
||||
* Input for real IFFT is complex and are in the order of
|
||||
* <pre>{real(0), imag(0), real(1), imag(1), ...}</pre>
|
||||
* Output for real IFFT is real and in the order of
|
||||
* <pre>{real[0], real[1], real[2], real[3], ..}</pre>
|
||||
*
|
||||
* \par Lengths supported by the transform:
|
||||
* \par
|
||||
* Real FFT/IFFT supports the lengths [128, 512, 2048], as it internally uses CFFT/CIFFT.
|
||||
*
|
||||
* \par Instance Structure
|
||||
* A separate instance structure must be defined for each Instance but the twiddle factors can be reused.
|
||||
* There are separate instance structure declarations for each of the 3 supported data types.
|
||||
*
|
||||
* \par Initialization Functions
|
||||
* There is also an associated initialization function for each data type.
|
||||
* The initialization function performs the following operations:
|
||||
* - Sets the values of the internal structure fields.
|
||||
* - Initializes twiddle factor tables.
|
||||
* - Initializes CFFT data structure fields.
|
||||
* \par
|
||||
* Use of the initialization function is optional.
|
||||
* However, if the initialization function is used, then the instance structure cannot be placed into a const data section.
|
||||
* To place an instance structure into a const data section, the instance structure must be manually initialized.
|
||||
* Manually initialize the instance structure as follows:
|
||||
* <pre>
|
||||
*arm_rfft_instance_f32 S = {fftLenReal, fftLenBy2, ifftFlagR, bitReverseFlagR, twidCoefRModifier, pTwiddleAReal, pTwiddleBReal, pCfft};
|
||||
*arm_rfft_instance_q31 S = {fftLenReal, fftLenBy2, ifftFlagR, bitReverseFlagR, twidCoefRModifier, pTwiddleAReal, pTwiddleBReal, pCfft};
|
||||
*arm_rfft_instance_q15 S = {fftLenReal, fftLenBy2, ifftFlagR, bitReverseFlagR, twidCoefRModifier, pTwiddleAReal, pTwiddleBReal, pCfft};
|
||||
* </pre>
|
||||
* where <code>fftLenReal</code> length of RFFT/RIFFT; <code>fftLenBy2</code> length of CFFT/CIFFT.
|
||||
* <code>ifftFlagR</code> Flag for selection of RFFT or RIFFT(Set ifftFlagR to calculate RIFFT otherwise calculates RFFT);
|
||||
* <code>bitReverseFlagR</code> Flag for selection of output order(Set bitReverseFlagR to output in normal order otherwise output in bit reversed order);
|
||||
* <code>twidCoefRModifier</code> modifier for twiddle factor table which supports 128, 512, 2048 RFFT lengths with same table;
|
||||
* <code>pTwiddleAReal</code>points to A array of twiddle coefficients; <code>pTwiddleBReal</code>points to B array of twiddle coefficients;
|
||||
* <code>pCfft</code> points to the CFFT Instance structure. The CFFT structure also needs to be initialized, refer to arm_cfft_radix4_f32() for details regarding
|
||||
* static initialization of cfft structure.
|
||||
*
|
||||
* \par Fixed-Point Behavior
|
||||
* Care must be taken when using the fixed-point versions of the RFFT/RIFFT function.
|
||||
* Refer to the function specific documentation below for usage guidelines.
|
||||
*/
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
* Internal functions prototypes
|
||||
*--------------------------------------------------------------------*/
|
||||
|
||||
void arm_split_rfft_f32(
|
||||
float32_t * pSrc,
|
||||
uint32_t fftLen,
|
||||
float32_t * pATable,
|
||||
float32_t * pBTable,
|
||||
float32_t * pDst,
|
||||
uint32_t modifier);
|
||||
void arm_split_rifft_f32(
|
||||
float32_t * pSrc,
|
||||
uint32_t fftLen,
|
||||
float32_t * pATable,
|
||||
float32_t * pBTable,
|
||||
float32_t * pDst,
|
||||
uint32_t modifier);
|
||||
|
||||
/**
|
||||
* @addtogroup RFFT_RIFFT
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Processing function for the floating-point RFFT/RIFFT.
|
||||
* @param[in] *S points to an instance of the floating-point RFFT/RIFFT structure.
|
||||
* @param[in] *pSrc points to the input buffer.
|
||||
* @param[out] *pDst points to the output buffer.
|
||||
* @return none.
|
||||
*/
|
||||
|
||||
void arm_rfft_f32(
|
||||
const arm_rfft_instance_f32 * S,
|
||||
float32_t * pSrc,
|
||||
float32_t * pDst)
|
||||
{
|
||||
const arm_cfft_radix4_instance_f32 *S_CFFT = S->pCfft;
|
||||
|
||||
|
||||
/* Calculation of Real IFFT of input */
|
||||
if(S->ifftFlagR == 1u)
|
||||
{
|
||||
/* Real IFFT core process */
|
||||
arm_split_rifft_f32(pSrc, S->fftLenBy2, S->pTwiddleAReal,
|
||||
S->pTwiddleBReal, pDst, S->twidCoefRModifier);
|
||||
|
||||
|
||||
/* Complex radix-4 IFFT process */
|
||||
arm_radix4_butterfly_inverse_f32(pDst, S_CFFT->fftLen,
|
||||
S_CFFT->pTwiddle,
|
||||
S_CFFT->twidCoefModifier,
|
||||
S_CFFT->onebyfftLen);
|
||||
|
||||
/* Bit reversal process */
|
||||
if(S->bitReverseFlagR == 1u)
|
||||
{
|
||||
arm_bitreversal_f32(pDst, S_CFFT->fftLen,
|
||||
S_CFFT->bitRevFactor, S_CFFT->pBitRevTable);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
/* Calculation of RFFT of input */
|
||||
|
||||
/* Complex radix-4 FFT process */
|
||||
arm_radix4_butterfly_f32(pSrc, S_CFFT->fftLen,
|
||||
S_CFFT->pTwiddle, S_CFFT->twidCoefModifier);
|
||||
|
||||
/* Bit reversal process */
|
||||
if(S->bitReverseFlagR == 1u)
|
||||
{
|
||||
arm_bitreversal_f32(pSrc, S_CFFT->fftLen,
|
||||
S_CFFT->bitRevFactor, S_CFFT->pBitRevTable);
|
||||
}
|
||||
|
||||
|
||||
/* Real FFT core process */
|
||||
arm_split_rfft_f32(pSrc, S->fftLenBy2, S->pTwiddleAReal,
|
||||
S->pTwiddleBReal, pDst, S->twidCoefRModifier);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @} end of RFFT_RIFFT group
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Core Real FFT process
|
||||
* @param[in] *pSrc points to the input buffer.
|
||||
* @param[in] fftLen length of FFT.
|
||||
* @param[in] *pATable points to the twiddle Coef A buffer.
|
||||
* @param[in] *pBTable points to the twiddle Coef B buffer.
|
||||
* @param[out] *pDst points to the output buffer.
|
||||
* @param[in] modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
|
||||
* @return none.
|
||||
*/
|
||||
|
||||
void arm_split_rfft_f32(
|
||||
float32_t * pSrc,
|
||||
uint32_t fftLen,
|
||||
float32_t * pATable,
|
||||
float32_t * pBTable,
|
||||
float32_t * pDst,
|
||||
uint32_t modifier)
|
||||
{
|
||||
uint32_t i; /* Loop Counter */
|
||||
float32_t outR, outI; /* Temporary variables for output */
|
||||
float32_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */
|
||||
float32_t CoefA1, CoefA2, CoefB1; /* Temporary variables for twiddle coefficients */
|
||||
float32_t *pDst1 = &pDst[2], *pDst2 = &pDst[(4u * fftLen) - 1u]; /* temp pointers for output buffer */
|
||||
float32_t *pSrc1 = &pSrc[2], *pSrc2 = &pSrc[(2u * fftLen) - 1u]; /* temp pointers for input buffer */
|
||||
|
||||
|
||||
pSrc[2u * fftLen] = pSrc[0];
|
||||
pSrc[(2u * fftLen) + 1u] = pSrc[1];
|
||||
|
||||
/* Init coefficient pointers */
|
||||
pCoefA = &pATable[modifier * 2u];
|
||||
pCoefB = &pBTable[modifier * 2u];
|
||||
|
||||
i = fftLen - 1u;
|
||||
|
||||
while(i > 0u)
|
||||
{
|
||||
/*
|
||||
outR = (pSrc[2 * i] * pATable[2 * i] - pSrc[2 * i + 1] * pATable[2 * i + 1]
|
||||
+ pSrc[2 * n - 2 * i] * pBTable[2 * i] +
|
||||
pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1]);
|
||||
*/
|
||||
|
||||
/* outI = (pIn[2 * i + 1] * pATable[2 * i] + pIn[2 * i] * pATable[2 * i + 1] +
|
||||
pIn[2 * n - 2 * i] * pBTable[2 * i + 1] -
|
||||
pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); */
|
||||
|
||||
/* read pATable[2 * i] */
|
||||
CoefA1 = *pCoefA++;
|
||||
/* pATable[2 * i + 1] */
|
||||
CoefA2 = *pCoefA;
|
||||
|
||||
/* pSrc[2 * i] * pATable[2 * i] */
|
||||
outR = *pSrc1 * CoefA1;
|
||||
/* pSrc[2 * i] * CoefA2 */
|
||||
outI = *pSrc1++ * CoefA2;
|
||||
|
||||
/* (pSrc[2 * i + 1] + pSrc[2 * fftLen - 2 * i + 1]) * CoefA2 */
|
||||
outR -= (*pSrc1 + *pSrc2) * CoefA2;
|
||||
/* pSrc[2 * i + 1] * CoefA1 */
|
||||
outI += *pSrc1++ * CoefA1;
|
||||
|
||||
CoefB1 = *pCoefB;
|
||||
|
||||
/* pSrc[2 * fftLen - 2 * i + 1] * CoefB1 */
|
||||
outI -= *pSrc2-- * CoefB1;
|
||||
/* pSrc[2 * fftLen - 2 * i] * CoefA2 */
|
||||
outI -= *pSrc2 * CoefA2;
|
||||
|
||||
/* pSrc[2 * fftLen - 2 * i] * CoefB1 */
|
||||
outR += *pSrc2-- * CoefB1;
|
||||
|
||||
/* write output */
|
||||
*pDst1++ = outR;
|
||||
*pDst1++ = outI;
|
||||
|
||||
/* write complex conjugate output */
|
||||
*pDst2-- = -outI;
|
||||
*pDst2-- = outR;
|
||||
|
||||
/* update coefficient pointer */
|
||||
pCoefB = pCoefB + (modifier * 2u);
|
||||
pCoefA = pCoefA + ((modifier * 2u) - 1u);
|
||||
|
||||
i--;
|
||||
|
||||
}
|
||||
|
||||
pDst[2u * fftLen] = pSrc[0] - pSrc[1];
|
||||
pDst[(2u * fftLen) + 1u] = 0.0f;
|
||||
|
||||
pDst[0] = pSrc[0] + pSrc[1];
|
||||
pDst[1] = 0.0f;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Core Real IFFT process
|
||||
* @param[in] *pSrc points to the input buffer.
|
||||
* @param[in] fftLen length of FFT.
|
||||
* @param[in] *pATable points to the twiddle Coef A buffer.
|
||||
* @param[in] *pBTable points to the twiddle Coef B buffer.
|
||||
* @param[out] *pDst points to the output buffer.
|
||||
* @param[in] modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
|
||||
* @return none.
|
||||
*/
|
||||
|
||||
void arm_split_rifft_f32(
|
||||
float32_t * pSrc,
|
||||
uint32_t fftLen,
|
||||
float32_t * pATable,
|
||||
float32_t * pBTable,
|
||||
float32_t * pDst,
|
||||
uint32_t modifier)
|
||||
{
|
||||
float32_t outR, outI; /* Temporary variables for output */
|
||||
float32_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */
|
||||
float32_t CoefA1, CoefA2, CoefB1; /* Temporary variables for twiddle coefficients */
|
||||
float32_t *pSrc1 = &pSrc[0], *pSrc2 = &pSrc[(2u * fftLen) + 1u];
|
||||
|
||||
pCoefA = &pATable[0];
|
||||
pCoefB = &pBTable[0];
|
||||
|
||||
while(fftLen > 0u)
|
||||
{
|
||||
/*
|
||||
outR = (pIn[2 * i] * pATable[2 * i] + pIn[2 * i + 1] * pATable[2 * i + 1] +
|
||||
pIn[2 * n - 2 * i] * pBTable[2 * i] -
|
||||
pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1]);
|
||||
|
||||
outI = (pIn[2 * i + 1] * pATable[2 * i] - pIn[2 * i] * pATable[2 * i + 1] -
|
||||
pIn[2 * n - 2 * i] * pBTable[2 * i + 1] -
|
||||
pIn[2 * n - 2 * i + 1] * pBTable[2 * i]);
|
||||
|
||||
*/
|
||||
|
||||
CoefA1 = *pCoefA++;
|
||||
CoefA2 = *pCoefA;
|
||||
|
||||
/* outR = (pSrc[2 * i] * CoefA1 */
|
||||
outR = *pSrc1 * CoefA1;
|
||||
|
||||
/* - pSrc[2 * i] * CoefA2 */
|
||||
outI = -(*pSrc1++) * CoefA2;
|
||||
|
||||
/* (pSrc[2 * i + 1] + pSrc[2 * fftLen - 2 * i + 1]) * CoefA2 */
|
||||
outR += (*pSrc1 + *pSrc2) * CoefA2;
|
||||
|
||||
/* pSrc[2 * i + 1] * CoefA1 */
|
||||
outI += (*pSrc1++) * CoefA1;
|
||||
|
||||
CoefB1 = *pCoefB;
|
||||
|
||||
/* - pSrc[2 * fftLen - 2 * i + 1] * CoefB1 */
|
||||
outI -= *pSrc2-- * CoefB1;
|
||||
|
||||
/* pSrc[2 * fftLen - 2 * i] * CoefB1 */
|
||||
outR += *pSrc2 * CoefB1;
|
||||
|
||||
/* pSrc[2 * fftLen - 2 * i] * CoefA2 */
|
||||
outI += *pSrc2-- * CoefA2;
|
||||
|
||||
/* write output */
|
||||
*pDst++ = outR;
|
||||
*pDst++ = outI;
|
||||
|
||||
/* update coefficient pointer */
|
||||
pCoefB = pCoefB + (modifier * 2u);
|
||||
pCoefA = pCoefA + ((modifier * 2u) - 1u);
|
||||
|
||||
/* Decrement loop count */
|
||||
fftLen--;
|
||||
}
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,688 @@
|
||||
/* ----------------------------------------------------------------------
|
||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
||||
*
|
||||
* $Date: 15. July 2011
|
||||
* $Revision: V1.0.10
|
||||
*
|
||||
* Project: CMSIS DSP Library
|
||||
* Title: arm_rfft_init_q15.c
|
||||
*
|
||||
* Description: RFFT & RIFFT Q15 initialisation function
|
||||
*
|
||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
||||
*
|
||||
* Version 1.0.10 2011/7/15
|
||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
||||
*
|
||||
* Version 1.0.3 2010/11/29
|
||||
* Re-organized the CMSIS folders and updated documentation.
|
||||
*
|
||||
* Version 1.0.2 2010/11/11
|
||||
* Documentation updated.
|
||||
*
|
||||
* Version 1.0.1 2010/10/05
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 1.0.0 2010/09/20
|
||||
* Production release and review comments incorporated
|
||||
*
|
||||
* Version 0.0.7 2010/06/10
|
||||
* Misra-C changes done
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
|
||||
#include "arm_math.h"
|
||||
|
||||
/**
|
||||
* @ingroup groupTransforms
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup RFFT_RIFFT
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* \par
|
||||
* Generation floating point real_CoefA array:
|
||||
* \par
|
||||
* n = 1024
|
||||
* <pre>for (i = 0; i < n; i++)
|
||||
* {
|
||||
* pATable[2 * i] = 0.5 * (1.0 - sin (2 * PI / (double) (2 * n) * (double) i));
|
||||
* pATable[2 * i + 1] = 0.5 * (-1.0 * cos (2 * PI / (double) (2 * n) * (double) i));
|
||||
* } </pre>
|
||||
* \par
|
||||
* Convert to fixed point Q15 format
|
||||
* round(pATable[i] * pow(2, 15))
|
||||
*/
|
||||
|
||||
|
||||
static const q15_t realCoefAQ15[2048] = {
|
||||
|
||||
0x4000, 0xc000, 0x3fce, 0xc000, 0x3f9b, 0xc000, 0x3f69, 0xc001,
|
||||
0x3f37, 0xc001, 0x3f05, 0xc002, 0x3ed2, 0xc003, 0x3ea0, 0xc004,
|
||||
0x3e6e, 0xc005, 0x3e3c, 0xc006, 0x3e09, 0xc008, 0x3dd7, 0xc009,
|
||||
0x3da5, 0xc00b, 0x3d73, 0xc00d, 0x3d40, 0xc00f, 0x3d0e, 0xc011,
|
||||
0x3cdc, 0xc014, 0x3caa, 0xc016, 0x3c78, 0xc019, 0x3c45, 0xc01c,
|
||||
0x3c13, 0xc01f, 0x3be1, 0xc022, 0x3baf, 0xc025, 0x3b7d, 0xc029,
|
||||
0x3b4b, 0xc02c, 0x3b19, 0xc030, 0x3ae6, 0xc034, 0x3ab4, 0xc038,
|
||||
0x3a82, 0xc03c, 0x3a50, 0xc041, 0x3a1e, 0xc045, 0x39ec, 0xc04a,
|
||||
0x39ba, 0xc04f, 0x3988, 0xc054, 0x3956, 0xc059, 0x3924, 0xc05e,
|
||||
0x38f2, 0xc064, 0x38c0, 0xc069, 0x388e, 0xc06f, 0x385c, 0xc075,
|
||||
0x382a, 0xc07b, 0x37f9, 0xc081, 0x37c7, 0xc088, 0x3795, 0xc08e,
|
||||
0x3763, 0xc095, 0x3731, 0xc09c, 0x36ff, 0xc0a3, 0x36ce, 0xc0aa,
|
||||
0x369c, 0xc0b1, 0x366a, 0xc0b9, 0x3639, 0xc0c0, 0x3607, 0xc0c8,
|
||||
0x35d5, 0xc0d0, 0x35a4, 0xc0d8, 0x3572, 0xc0e0, 0x3540, 0xc0e9,
|
||||
0x350f, 0xc0f1, 0x34dd, 0xc0fa, 0x34ac, 0xc103, 0x347b, 0xc10c,
|
||||
0x3449, 0xc115, 0x3418, 0xc11e, 0x33e6, 0xc128, 0x33b5, 0xc131,
|
||||
0x3384, 0xc13b, 0x3352, 0xc145, 0x3321, 0xc14f, 0x32f0, 0xc159,
|
||||
0x32bf, 0xc163, 0x328e, 0xc16e, 0x325c, 0xc178, 0x322b, 0xc183,
|
||||
0x31fa, 0xc18e, 0x31c9, 0xc199, 0x3198, 0xc1a4, 0x3167, 0xc1b0,
|
||||
0x3136, 0xc1bb, 0x3105, 0xc1c7, 0x30d5, 0xc1d3, 0x30a4, 0xc1df,
|
||||
0x3073, 0xc1eb, 0x3042, 0xc1f7, 0x3012, 0xc204, 0x2fe1, 0xc210,
|
||||
0x2fb0, 0xc21d, 0x2f80, 0xc22a, 0x2f4f, 0xc237, 0x2f1f, 0xc244,
|
||||
0x2eee, 0xc251, 0x2ebe, 0xc25f, 0x2e8d, 0xc26d, 0x2e5d, 0xc27a,
|
||||
0x2e2d, 0xc288, 0x2dfc, 0xc296, 0x2dcc, 0xc2a5, 0x2d9c, 0xc2b3,
|
||||
0x2d6c, 0xc2c1, 0x2d3c, 0xc2d0, 0x2d0c, 0xc2df, 0x2cdc, 0xc2ee,
|
||||
0x2cac, 0xc2fd, 0x2c7c, 0xc30c, 0x2c4c, 0xc31c, 0x2c1c, 0xc32b,
|
||||
0x2bed, 0xc33b, 0x2bbd, 0xc34b, 0x2b8d, 0xc35b, 0x2b5e, 0xc36b,
|
||||
0x2b2e, 0xc37b, 0x2aff, 0xc38c, 0x2acf, 0xc39c, 0x2aa0, 0xc3ad,
|
||||
0x2a70, 0xc3be, 0x2a41, 0xc3cf, 0x2a12, 0xc3e0, 0x29e3, 0xc3f1,
|
||||
0x29b4, 0xc403, 0x2984, 0xc414, 0x2955, 0xc426, 0x2926, 0xc438,
|
||||
0x28f7, 0xc44a, 0x28c9, 0xc45c, 0x289a, 0xc46e, 0x286b, 0xc481,
|
||||
0x283c, 0xc493, 0x280e, 0xc4a6, 0x27df, 0xc4b9, 0x27b1, 0xc4cc,
|
||||
0x2782, 0xc4df, 0x2754, 0xc4f2, 0x2725, 0xc506, 0x26f7, 0xc51a,
|
||||
0x26c9, 0xc52d, 0x269b, 0xc541, 0x266d, 0xc555, 0x263f, 0xc569,
|
||||
0x2611, 0xc57e, 0x25e3, 0xc592, 0x25b5, 0xc5a7, 0x2587, 0xc5bb,
|
||||
0x2559, 0xc5d0, 0x252c, 0xc5e5, 0x24fe, 0xc5fa, 0x24d0, 0xc610,
|
||||
0x24a3, 0xc625, 0x2476, 0xc63b, 0x2448, 0xc650, 0x241b, 0xc666,
|
||||
0x23ee, 0xc67c, 0x23c1, 0xc692, 0x2394, 0xc6a8, 0x2367, 0xc6bf,
|
||||
0x233a, 0xc6d5, 0x230d, 0xc6ec, 0x22e0, 0xc703, 0x22b3, 0xc71a,
|
||||
0x2287, 0xc731, 0x225a, 0xc748, 0x222d, 0xc75f, 0x2201, 0xc777,
|
||||
0x21d5, 0xc78f, 0x21a8, 0xc7a6, 0x217c, 0xc7be, 0x2150, 0xc7d6,
|
||||
0x2124, 0xc7ee, 0x20f8, 0xc807, 0x20cc, 0xc81f, 0x20a0, 0xc838,
|
||||
0x2074, 0xc850, 0x2049, 0xc869, 0x201d, 0xc882, 0x1ff1, 0xc89b,
|
||||
0x1fc6, 0xc8b5, 0x1f9b, 0xc8ce, 0x1f6f, 0xc8e8, 0x1f44, 0xc901,
|
||||
0x1f19, 0xc91b, 0x1eee, 0xc935, 0x1ec3, 0xc94f, 0x1e98, 0xc969,
|
||||
0x1e6d, 0xc983, 0x1e42, 0xc99e, 0x1e18, 0xc9b8, 0x1ded, 0xc9d3,
|
||||
0x1dc3, 0xc9ee, 0x1d98, 0xca09, 0x1d6e, 0xca24, 0x1d44, 0xca3f,
|
||||
0x1d19, 0xca5b, 0x1cef, 0xca76, 0x1cc5, 0xca92, 0x1c9b, 0xcaad,
|
||||
0x1c72, 0xcac9, 0x1c48, 0xcae5, 0x1c1e, 0xcb01, 0x1bf5, 0xcb1e,
|
||||
0x1bcb, 0xcb3a, 0x1ba2, 0xcb56, 0x1b78, 0xcb73, 0x1b4f, 0xcb90,
|
||||
0x1b26, 0xcbad, 0x1afd, 0xcbca, 0x1ad4, 0xcbe7, 0x1aab, 0xcc04,
|
||||
0x1a82, 0xcc21, 0x1a5a, 0xcc3f, 0x1a31, 0xcc5d, 0x1a08, 0xcc7a,
|
||||
0x19e0, 0xcc98, 0x19b8, 0xccb6, 0x198f, 0xccd4, 0x1967, 0xccf3,
|
||||
0x193f, 0xcd11, 0x1917, 0xcd30, 0x18ef, 0xcd4e, 0x18c8, 0xcd6d,
|
||||
0x18a0, 0xcd8c, 0x1878, 0xcdab, 0x1851, 0xcdca, 0x182a, 0xcde9,
|
||||
0x1802, 0xce08, 0x17db, 0xce28, 0x17b4, 0xce47, 0x178d, 0xce67,
|
||||
0x1766, 0xce87, 0x173f, 0xcea7, 0x1719, 0xcec7, 0x16f2, 0xcee7,
|
||||
0x16cb, 0xcf07, 0x16a5, 0xcf28, 0x167f, 0xcf48, 0x1659, 0xcf69,
|
||||
0x1632, 0xcf8a, 0x160c, 0xcfab, 0x15e6, 0xcfcc, 0x15c1, 0xcfed,
|
||||
0x159b, 0xd00e, 0x1575, 0xd030, 0x1550, 0xd051, 0x152a, 0xd073,
|
||||
0x1505, 0xd094, 0x14e0, 0xd0b6, 0x14bb, 0xd0d8, 0x1496, 0xd0fa,
|
||||
0x1471, 0xd11c, 0x144c, 0xd13e, 0x1428, 0xd161, 0x1403, 0xd183,
|
||||
0x13df, 0xd1a6, 0x13ba, 0xd1c9, 0x1396, 0xd1eb, 0x1372, 0xd20e,
|
||||
0x134e, 0xd231, 0x132a, 0xd255, 0x1306, 0xd278, 0x12e2, 0xd29b,
|
||||
0x12bf, 0xd2bf, 0x129b, 0xd2e2, 0x1278, 0xd306, 0x1255, 0xd32a,
|
||||
0x1231, 0xd34e, 0x120e, 0xd372, 0x11eb, 0xd396, 0x11c9, 0xd3ba,
|
||||
0x11a6, 0xd3df, 0x1183, 0xd403, 0x1161, 0xd428, 0x113e, 0xd44c,
|
||||
0x111c, 0xd471, 0x10fa, 0xd496, 0x10d8, 0xd4bb, 0x10b6, 0xd4e0,
|
||||
0x1094, 0xd505, 0x1073, 0xd52a, 0x1051, 0xd550, 0x1030, 0xd575,
|
||||
0x100e, 0xd59b, 0xfed, 0xd5c1, 0xfcc, 0xd5e6, 0xfab, 0xd60c,
|
||||
0xf8a, 0xd632, 0xf69, 0xd659, 0xf48, 0xd67f, 0xf28, 0xd6a5,
|
||||
0xf07, 0xd6cb, 0xee7, 0xd6f2, 0xec7, 0xd719, 0xea7, 0xd73f,
|
||||
0xe87, 0xd766, 0xe67, 0xd78d, 0xe47, 0xd7b4, 0xe28, 0xd7db,
|
||||
0xe08, 0xd802, 0xde9, 0xd82a, 0xdca, 0xd851, 0xdab, 0xd878,
|
||||
0xd8c, 0xd8a0, 0xd6d, 0xd8c8, 0xd4e, 0xd8ef, 0xd30, 0xd917,
|
||||
0xd11, 0xd93f, 0xcf3, 0xd967, 0xcd4, 0xd98f, 0xcb6, 0xd9b8,
|
||||
0xc98, 0xd9e0, 0xc7a, 0xda08, 0xc5d, 0xda31, 0xc3f, 0xda5a,
|
||||
0xc21, 0xda82, 0xc04, 0xdaab, 0xbe7, 0xdad4, 0xbca, 0xdafd,
|
||||
0xbad, 0xdb26, 0xb90, 0xdb4f, 0xb73, 0xdb78, 0xb56, 0xdba2,
|
||||
0xb3a, 0xdbcb, 0xb1e, 0xdbf5, 0xb01, 0xdc1e, 0xae5, 0xdc48,
|
||||
0xac9, 0xdc72, 0xaad, 0xdc9b, 0xa92, 0xdcc5, 0xa76, 0xdcef,
|
||||
0xa5b, 0xdd19, 0xa3f, 0xdd44, 0xa24, 0xdd6e, 0xa09, 0xdd98,
|
||||
0x9ee, 0xddc3, 0x9d3, 0xdded, 0x9b8, 0xde18, 0x99e, 0xde42,
|
||||
0x983, 0xde6d, 0x969, 0xde98, 0x94f, 0xdec3, 0x935, 0xdeee,
|
||||
0x91b, 0xdf19, 0x901, 0xdf44, 0x8e8, 0xdf6f, 0x8ce, 0xdf9b,
|
||||
0x8b5, 0xdfc6, 0x89b, 0xdff1, 0x882, 0xe01d, 0x869, 0xe049,
|
||||
0x850, 0xe074, 0x838, 0xe0a0, 0x81f, 0xe0cc, 0x807, 0xe0f8,
|
||||
0x7ee, 0xe124, 0x7d6, 0xe150, 0x7be, 0xe17c, 0x7a6, 0xe1a8,
|
||||
0x78f, 0xe1d5, 0x777, 0xe201, 0x75f, 0xe22d, 0x748, 0xe25a,
|
||||
0x731, 0xe287, 0x71a, 0xe2b3, 0x703, 0xe2e0, 0x6ec, 0xe30d,
|
||||
0x6d5, 0xe33a, 0x6bf, 0xe367, 0x6a8, 0xe394, 0x692, 0xe3c1,
|
||||
0x67c, 0xe3ee, 0x666, 0xe41b, 0x650, 0xe448, 0x63b, 0xe476,
|
||||
0x625, 0xe4a3, 0x610, 0xe4d0, 0x5fa, 0xe4fe, 0x5e5, 0xe52c,
|
||||
0x5d0, 0xe559, 0x5bb, 0xe587, 0x5a7, 0xe5b5, 0x592, 0xe5e3,
|
||||
0x57e, 0xe611, 0x569, 0xe63f, 0x555, 0xe66d, 0x541, 0xe69b,
|
||||
0x52d, 0xe6c9, 0x51a, 0xe6f7, 0x506, 0xe725, 0x4f2, 0xe754,
|
||||
0x4df, 0xe782, 0x4cc, 0xe7b1, 0x4b9, 0xe7df, 0x4a6, 0xe80e,
|
||||
0x493, 0xe83c, 0x481, 0xe86b, 0x46e, 0xe89a, 0x45c, 0xe8c9,
|
||||
0x44a, 0xe8f7, 0x438, 0xe926, 0x426, 0xe955, 0x414, 0xe984,
|
||||
0x403, 0xe9b4, 0x3f1, 0xe9e3, 0x3e0, 0xea12, 0x3cf, 0xea41,
|
||||
0x3be, 0xea70, 0x3ad, 0xeaa0, 0x39c, 0xeacf, 0x38c, 0xeaff,
|
||||
0x37b, 0xeb2e, 0x36b, 0xeb5e, 0x35b, 0xeb8d, 0x34b, 0xebbd,
|
||||
0x33b, 0xebed, 0x32b, 0xec1c, 0x31c, 0xec4c, 0x30c, 0xec7c,
|
||||
0x2fd, 0xecac, 0x2ee, 0xecdc, 0x2df, 0xed0c, 0x2d0, 0xed3c,
|
||||
0x2c1, 0xed6c, 0x2b3, 0xed9c, 0x2a5, 0xedcc, 0x296, 0xedfc,
|
||||
0x288, 0xee2d, 0x27a, 0xee5d, 0x26d, 0xee8d, 0x25f, 0xeebe,
|
||||
0x251, 0xeeee, 0x244, 0xef1f, 0x237, 0xef4f, 0x22a, 0xef80,
|
||||
0x21d, 0xefb0, 0x210, 0xefe1, 0x204, 0xf012, 0x1f7, 0xf042,
|
||||
0x1eb, 0xf073, 0x1df, 0xf0a4, 0x1d3, 0xf0d5, 0x1c7, 0xf105,
|
||||
0x1bb, 0xf136, 0x1b0, 0xf167, 0x1a4, 0xf198, 0x199, 0xf1c9,
|
||||
0x18e, 0xf1fa, 0x183, 0xf22b, 0x178, 0xf25c, 0x16e, 0xf28e,
|
||||
0x163, 0xf2bf, 0x159, 0xf2f0, 0x14f, 0xf321, 0x145, 0xf352,
|
||||
0x13b, 0xf384, 0x131, 0xf3b5, 0x128, 0xf3e6, 0x11e, 0xf418,
|
||||
0x115, 0xf449, 0x10c, 0xf47b, 0x103, 0xf4ac, 0xfa, 0xf4dd,
|
||||
0xf1, 0xf50f, 0xe9, 0xf540, 0xe0, 0xf572, 0xd8, 0xf5a4,
|
||||
0xd0, 0xf5d5, 0xc8, 0xf607, 0xc0, 0xf639, 0xb9, 0xf66a,
|
||||
0xb1, 0xf69c, 0xaa, 0xf6ce, 0xa3, 0xf6ff, 0x9c, 0xf731,
|
||||
0x95, 0xf763, 0x8e, 0xf795, 0x88, 0xf7c7, 0x81, 0xf7f9,
|
||||
0x7b, 0xf82a, 0x75, 0xf85c, 0x6f, 0xf88e, 0x69, 0xf8c0,
|
||||
0x64, 0xf8f2, 0x5e, 0xf924, 0x59, 0xf956, 0x54, 0xf988,
|
||||
0x4f, 0xf9ba, 0x4a, 0xf9ec, 0x45, 0xfa1e, 0x41, 0xfa50,
|
||||
0x3c, 0xfa82, 0x38, 0xfab4, 0x34, 0xfae6, 0x30, 0xfb19,
|
||||
0x2c, 0xfb4b, 0x29, 0xfb7d, 0x25, 0xfbaf, 0x22, 0xfbe1,
|
||||
0x1f, 0xfc13, 0x1c, 0xfc45, 0x19, 0xfc78, 0x16, 0xfcaa,
|
||||
0x14, 0xfcdc, 0x11, 0xfd0e, 0xf, 0xfd40, 0xd, 0xfd73,
|
||||
0xb, 0xfda5, 0x9, 0xfdd7, 0x8, 0xfe09, 0x6, 0xfe3c,
|
||||
0x5, 0xfe6e, 0x4, 0xfea0, 0x3, 0xfed2, 0x2, 0xff05,
|
||||
0x1, 0xff37, 0x1, 0xff69, 0x0, 0xff9b, 0x0, 0xffce,
|
||||
0x0, 0x0, 0x0, 0x32, 0x0, 0x65, 0x1, 0x97,
|
||||
0x1, 0xc9, 0x2, 0xfb, 0x3, 0x12e, 0x4, 0x160,
|
||||
0x5, 0x192, 0x6, 0x1c4, 0x8, 0x1f7, 0x9, 0x229,
|
||||
0xb, 0x25b, 0xd, 0x28d, 0xf, 0x2c0, 0x11, 0x2f2,
|
||||
0x14, 0x324, 0x16, 0x356, 0x19, 0x388, 0x1c, 0x3bb,
|
||||
0x1f, 0x3ed, 0x22, 0x41f, 0x25, 0x451, 0x29, 0x483,
|
||||
0x2c, 0x4b5, 0x30, 0x4e7, 0x34, 0x51a, 0x38, 0x54c,
|
||||
0x3c, 0x57e, 0x41, 0x5b0, 0x45, 0x5e2, 0x4a, 0x614,
|
||||
0x4f, 0x646, 0x54, 0x678, 0x59, 0x6aa, 0x5e, 0x6dc,
|
||||
0x64, 0x70e, 0x69, 0x740, 0x6f, 0x772, 0x75, 0x7a4,
|
||||
0x7b, 0x7d6, 0x81, 0x807, 0x88, 0x839, 0x8e, 0x86b,
|
||||
0x95, 0x89d, 0x9c, 0x8cf, 0xa3, 0x901, 0xaa, 0x932,
|
||||
0xb1, 0x964, 0xb9, 0x996, 0xc0, 0x9c7, 0xc8, 0x9f9,
|
||||
0xd0, 0xa2b, 0xd8, 0xa5c, 0xe0, 0xa8e, 0xe9, 0xac0,
|
||||
0xf1, 0xaf1, 0xfa, 0xb23, 0x103, 0xb54, 0x10c, 0xb85,
|
||||
0x115, 0xbb7, 0x11e, 0xbe8, 0x128, 0xc1a, 0x131, 0xc4b,
|
||||
0x13b, 0xc7c, 0x145, 0xcae, 0x14f, 0xcdf, 0x159, 0xd10,
|
||||
0x163, 0xd41, 0x16e, 0xd72, 0x178, 0xda4, 0x183, 0xdd5,
|
||||
0x18e, 0xe06, 0x199, 0xe37, 0x1a4, 0xe68, 0x1b0, 0xe99,
|
||||
0x1bb, 0xeca, 0x1c7, 0xefb, 0x1d3, 0xf2b, 0x1df, 0xf5c,
|
||||
0x1eb, 0xf8d, 0x1f7, 0xfbe, 0x204, 0xfee, 0x210, 0x101f,
|
||||
0x21d, 0x1050, 0x22a, 0x1080, 0x237, 0x10b1, 0x244, 0x10e1,
|
||||
0x251, 0x1112, 0x25f, 0x1142, 0x26d, 0x1173, 0x27a, 0x11a3,
|
||||
0x288, 0x11d3, 0x296, 0x1204, 0x2a5, 0x1234, 0x2b3, 0x1264,
|
||||
0x2c1, 0x1294, 0x2d0, 0x12c4, 0x2df, 0x12f4, 0x2ee, 0x1324,
|
||||
0x2fd, 0x1354, 0x30c, 0x1384, 0x31c, 0x13b4, 0x32b, 0x13e4,
|
||||
0x33b, 0x1413, 0x34b, 0x1443, 0x35b, 0x1473, 0x36b, 0x14a2,
|
||||
0x37b, 0x14d2, 0x38c, 0x1501, 0x39c, 0x1531, 0x3ad, 0x1560,
|
||||
0x3be, 0x1590, 0x3cf, 0x15bf, 0x3e0, 0x15ee, 0x3f1, 0x161d,
|
||||
0x403, 0x164c, 0x414, 0x167c, 0x426, 0x16ab, 0x438, 0x16da,
|
||||
0x44a, 0x1709, 0x45c, 0x1737, 0x46e, 0x1766, 0x481, 0x1795,
|
||||
0x493, 0x17c4, 0x4a6, 0x17f2, 0x4b9, 0x1821, 0x4cc, 0x184f,
|
||||
0x4df, 0x187e, 0x4f2, 0x18ac, 0x506, 0x18db, 0x51a, 0x1909,
|
||||
0x52d, 0x1937, 0x541, 0x1965, 0x555, 0x1993, 0x569, 0x19c1,
|
||||
0x57e, 0x19ef, 0x592, 0x1a1d, 0x5a7, 0x1a4b, 0x5bb, 0x1a79,
|
||||
0x5d0, 0x1aa7, 0x5e5, 0x1ad4, 0x5fa, 0x1b02, 0x610, 0x1b30,
|
||||
0x625, 0x1b5d, 0x63b, 0x1b8a, 0x650, 0x1bb8, 0x666, 0x1be5,
|
||||
0x67c, 0x1c12, 0x692, 0x1c3f, 0x6a8, 0x1c6c, 0x6bf, 0x1c99,
|
||||
0x6d5, 0x1cc6, 0x6ec, 0x1cf3, 0x703, 0x1d20, 0x71a, 0x1d4d,
|
||||
0x731, 0x1d79, 0x748, 0x1da6, 0x75f, 0x1dd3, 0x777, 0x1dff,
|
||||
0x78f, 0x1e2b, 0x7a6, 0x1e58, 0x7be, 0x1e84, 0x7d6, 0x1eb0,
|
||||
0x7ee, 0x1edc, 0x807, 0x1f08, 0x81f, 0x1f34, 0x838, 0x1f60,
|
||||
0x850, 0x1f8c, 0x869, 0x1fb7, 0x882, 0x1fe3, 0x89b, 0x200f,
|
||||
0x8b5, 0x203a, 0x8ce, 0x2065, 0x8e8, 0x2091, 0x901, 0x20bc,
|
||||
0x91b, 0x20e7, 0x935, 0x2112, 0x94f, 0x213d, 0x969, 0x2168,
|
||||
0x983, 0x2193, 0x99e, 0x21be, 0x9b8, 0x21e8, 0x9d3, 0x2213,
|
||||
0x9ee, 0x223d, 0xa09, 0x2268, 0xa24, 0x2292, 0xa3f, 0x22bc,
|
||||
0xa5b, 0x22e7, 0xa76, 0x2311, 0xa92, 0x233b, 0xaad, 0x2365,
|
||||
0xac9, 0x238e, 0xae5, 0x23b8, 0xb01, 0x23e2, 0xb1e, 0x240b,
|
||||
0xb3a, 0x2435, 0xb56, 0x245e, 0xb73, 0x2488, 0xb90, 0x24b1,
|
||||
0xbad, 0x24da, 0xbca, 0x2503, 0xbe7, 0x252c, 0xc04, 0x2555,
|
||||
0xc21, 0x257e, 0xc3f, 0x25a6, 0xc5d, 0x25cf, 0xc7a, 0x25f8,
|
||||
0xc98, 0x2620, 0xcb6, 0x2648, 0xcd4, 0x2671, 0xcf3, 0x2699,
|
||||
0xd11, 0x26c1, 0xd30, 0x26e9, 0xd4e, 0x2711, 0xd6d, 0x2738,
|
||||
0xd8c, 0x2760, 0xdab, 0x2788, 0xdca, 0x27af, 0xde9, 0x27d6,
|
||||
0xe08, 0x27fe, 0xe28, 0x2825, 0xe47, 0x284c, 0xe67, 0x2873,
|
||||
0xe87, 0x289a, 0xea7, 0x28c1, 0xec7, 0x28e7, 0xee7, 0x290e,
|
||||
0xf07, 0x2935, 0xf28, 0x295b, 0xf48, 0x2981, 0xf69, 0x29a7,
|
||||
0xf8a, 0x29ce, 0xfab, 0x29f4, 0xfcc, 0x2a1a, 0xfed, 0x2a3f,
|
||||
0x100e, 0x2a65, 0x1030, 0x2a8b, 0x1051, 0x2ab0, 0x1073, 0x2ad6,
|
||||
0x1094, 0x2afb, 0x10b6, 0x2b20, 0x10d8, 0x2b45, 0x10fa, 0x2b6a,
|
||||
0x111c, 0x2b8f, 0x113e, 0x2bb4, 0x1161, 0x2bd8, 0x1183, 0x2bfd,
|
||||
0x11a6, 0x2c21, 0x11c9, 0x2c46, 0x11eb, 0x2c6a, 0x120e, 0x2c8e,
|
||||
0x1231, 0x2cb2, 0x1255, 0x2cd6, 0x1278, 0x2cfa, 0x129b, 0x2d1e,
|
||||
0x12bf, 0x2d41, 0x12e2, 0x2d65, 0x1306, 0x2d88, 0x132a, 0x2dab,
|
||||
0x134e, 0x2dcf, 0x1372, 0x2df2, 0x1396, 0x2e15, 0x13ba, 0x2e37,
|
||||
0x13df, 0x2e5a, 0x1403, 0x2e7d, 0x1428, 0x2e9f, 0x144c, 0x2ec2,
|
||||
0x1471, 0x2ee4, 0x1496, 0x2f06, 0x14bb, 0x2f28, 0x14e0, 0x2f4a,
|
||||
0x1505, 0x2f6c, 0x152a, 0x2f8d, 0x1550, 0x2faf, 0x1575, 0x2fd0,
|
||||
0x159b, 0x2ff2, 0x15c1, 0x3013, 0x15e6, 0x3034, 0x160c, 0x3055,
|
||||
0x1632, 0x3076, 0x1659, 0x3097, 0x167f, 0x30b8, 0x16a5, 0x30d8,
|
||||
0x16cb, 0x30f9, 0x16f2, 0x3119, 0x1719, 0x3139, 0x173f, 0x3159,
|
||||
0x1766, 0x3179, 0x178d, 0x3199, 0x17b4, 0x31b9, 0x17db, 0x31d8,
|
||||
0x1802, 0x31f8, 0x182a, 0x3217, 0x1851, 0x3236, 0x1878, 0x3255,
|
||||
0x18a0, 0x3274, 0x18c8, 0x3293, 0x18ef, 0x32b2, 0x1917, 0x32d0,
|
||||
0x193f, 0x32ef, 0x1967, 0x330d, 0x198f, 0x332c, 0x19b8, 0x334a,
|
||||
0x19e0, 0x3368, 0x1a08, 0x3386, 0x1a31, 0x33a3, 0x1a5a, 0x33c1,
|
||||
0x1a82, 0x33df, 0x1aab, 0x33fc, 0x1ad4, 0x3419, 0x1afd, 0x3436,
|
||||
0x1b26, 0x3453, 0x1b4f, 0x3470, 0x1b78, 0x348d, 0x1ba2, 0x34aa,
|
||||
0x1bcb, 0x34c6, 0x1bf5, 0x34e2, 0x1c1e, 0x34ff, 0x1c48, 0x351b,
|
||||
0x1c72, 0x3537, 0x1c9b, 0x3553, 0x1cc5, 0x356e, 0x1cef, 0x358a,
|
||||
0x1d19, 0x35a5, 0x1d44, 0x35c1, 0x1d6e, 0x35dc, 0x1d98, 0x35f7,
|
||||
0x1dc3, 0x3612, 0x1ded, 0x362d, 0x1e18, 0x3648, 0x1e42, 0x3662,
|
||||
0x1e6d, 0x367d, 0x1e98, 0x3697, 0x1ec3, 0x36b1, 0x1eee, 0x36cb,
|
||||
0x1f19, 0x36e5, 0x1f44, 0x36ff, 0x1f6f, 0x3718, 0x1f9b, 0x3732,
|
||||
0x1fc6, 0x374b, 0x1ff1, 0x3765, 0x201d, 0x377e, 0x2049, 0x3797,
|
||||
0x2074, 0x37b0, 0x20a0, 0x37c8, 0x20cc, 0x37e1, 0x20f8, 0x37f9,
|
||||
0x2124, 0x3812, 0x2150, 0x382a, 0x217c, 0x3842, 0x21a8, 0x385a,
|
||||
0x21d5, 0x3871, 0x2201, 0x3889, 0x222d, 0x38a1, 0x225a, 0x38b8,
|
||||
0x2287, 0x38cf, 0x22b3, 0x38e6, 0x22e0, 0x38fd, 0x230d, 0x3914,
|
||||
0x233a, 0x392b, 0x2367, 0x3941, 0x2394, 0x3958, 0x23c1, 0x396e,
|
||||
0x23ee, 0x3984, 0x241b, 0x399a, 0x2448, 0x39b0, 0x2476, 0x39c5,
|
||||
0x24a3, 0x39db, 0x24d0, 0x39f0, 0x24fe, 0x3a06, 0x252c, 0x3a1b,
|
||||
0x2559, 0x3a30, 0x2587, 0x3a45, 0x25b5, 0x3a59, 0x25e3, 0x3a6e,
|
||||
0x2611, 0x3a82, 0x263f, 0x3a97, 0x266d, 0x3aab, 0x269b, 0x3abf,
|
||||
0x26c9, 0x3ad3, 0x26f7, 0x3ae6, 0x2725, 0x3afa, 0x2754, 0x3b0e,
|
||||
0x2782, 0x3b21, 0x27b1, 0x3b34, 0x27df, 0x3b47, 0x280e, 0x3b5a,
|
||||
0x283c, 0x3b6d, 0x286b, 0x3b7f, 0x289a, 0x3b92, 0x28c9, 0x3ba4,
|
||||
0x28f7, 0x3bb6, 0x2926, 0x3bc8, 0x2955, 0x3bda, 0x2984, 0x3bec,
|
||||
0x29b4, 0x3bfd, 0x29e3, 0x3c0f, 0x2a12, 0x3c20, 0x2a41, 0x3c31,
|
||||
0x2a70, 0x3c42, 0x2aa0, 0x3c53, 0x2acf, 0x3c64, 0x2aff, 0x3c74,
|
||||
0x2b2e, 0x3c85, 0x2b5e, 0x3c95, 0x2b8d, 0x3ca5, 0x2bbd, 0x3cb5,
|
||||
0x2bed, 0x3cc5, 0x2c1c, 0x3cd5, 0x2c4c, 0x3ce4, 0x2c7c, 0x3cf4,
|
||||
0x2cac, 0x3d03, 0x2cdc, 0x3d12, 0x2d0c, 0x3d21, 0x2d3c, 0x3d30,
|
||||
0x2d6c, 0x3d3f, 0x2d9c, 0x3d4d, 0x2dcc, 0x3d5b, 0x2dfc, 0x3d6a,
|
||||
0x2e2d, 0x3d78, 0x2e5d, 0x3d86, 0x2e8d, 0x3d93, 0x2ebe, 0x3da1,
|
||||
0x2eee, 0x3daf, 0x2f1f, 0x3dbc, 0x2f4f, 0x3dc9, 0x2f80, 0x3dd6,
|
||||
0x2fb0, 0x3de3, 0x2fe1, 0x3df0, 0x3012, 0x3dfc, 0x3042, 0x3e09,
|
||||
0x3073, 0x3e15, 0x30a4, 0x3e21, 0x30d5, 0x3e2d, 0x3105, 0x3e39,
|
||||
0x3136, 0x3e45, 0x3167, 0x3e50, 0x3198, 0x3e5c, 0x31c9, 0x3e67,
|
||||
0x31fa, 0x3e72, 0x322b, 0x3e7d, 0x325c, 0x3e88, 0x328e, 0x3e92,
|
||||
0x32bf, 0x3e9d, 0x32f0, 0x3ea7, 0x3321, 0x3eb1, 0x3352, 0x3ebb,
|
||||
0x3384, 0x3ec5, 0x33b5, 0x3ecf, 0x33e6, 0x3ed8, 0x3418, 0x3ee2,
|
||||
0x3449, 0x3eeb, 0x347b, 0x3ef4, 0x34ac, 0x3efd, 0x34dd, 0x3f06,
|
||||
0x350f, 0x3f0f, 0x3540, 0x3f17, 0x3572, 0x3f20, 0x35a4, 0x3f28,
|
||||
0x35d5, 0x3f30, 0x3607, 0x3f38, 0x3639, 0x3f40, 0x366a, 0x3f47,
|
||||
0x369c, 0x3f4f, 0x36ce, 0x3f56, 0x36ff, 0x3f5d, 0x3731, 0x3f64,
|
||||
0x3763, 0x3f6b, 0x3795, 0x3f72, 0x37c7, 0x3f78, 0x37f9, 0x3f7f,
|
||||
0x382a, 0x3f85, 0x385c, 0x3f8b, 0x388e, 0x3f91, 0x38c0, 0x3f97,
|
||||
0x38f2, 0x3f9c, 0x3924, 0x3fa2, 0x3956, 0x3fa7, 0x3988, 0x3fac,
|
||||
0x39ba, 0x3fb1, 0x39ec, 0x3fb6, 0x3a1e, 0x3fbb, 0x3a50, 0x3fbf,
|
||||
0x3a82, 0x3fc4, 0x3ab4, 0x3fc8, 0x3ae6, 0x3fcc, 0x3b19, 0x3fd0,
|
||||
0x3b4b, 0x3fd4, 0x3b7d, 0x3fd7, 0x3baf, 0x3fdb, 0x3be1, 0x3fde,
|
||||
0x3c13, 0x3fe1, 0x3c45, 0x3fe4, 0x3c78, 0x3fe7, 0x3caa, 0x3fea,
|
||||
0x3cdc, 0x3fec, 0x3d0e, 0x3fef, 0x3d40, 0x3ff1, 0x3d73, 0x3ff3,
|
||||
0x3da5, 0x3ff5, 0x3dd7, 0x3ff7, 0x3e09, 0x3ff8, 0x3e3c, 0x3ffa,
|
||||
0x3e6e, 0x3ffb, 0x3ea0, 0x3ffc, 0x3ed2, 0x3ffd, 0x3f05, 0x3ffe,
|
||||
0x3f37, 0x3fff, 0x3f69, 0x3fff, 0x3f9b, 0x4000, 0x3fce, 0x4000
|
||||
};
|
||||
|
||||
/**
|
||||
* \par
|
||||
* Generation of real_CoefB array:
|
||||
* \par
|
||||
* n = 1024
|
||||
* <pre>for (i = 0; i < n; i++)
|
||||
* {
|
||||
* pBTable[2 * i] = 0.5 * (1.0 + sin (2 * PI / (double) (2 * n) * (double) i));
|
||||
* pBTable[2 * i + 1] = 0.5 * (1.0 * cos (2 * PI / (double) (2 * n) * (double) i));
|
||||
* } </pre>
|
||||
* \par
|
||||
* Convert to fixed point Q15 format
|
||||
* round(pBTable[i] * pow(2, 15))
|
||||
*
|
||||
*/
|
||||
|
||||
static const q15_t realCoefBQ15[2048] = {
|
||||
0x4000, 0x4000, 0x4032, 0x4000, 0x4065, 0x4000, 0x4097, 0x3fff,
|
||||
0x40c9, 0x3fff, 0x40fb, 0x3ffe, 0x412e, 0x3ffd, 0x4160, 0x3ffc,
|
||||
0x4192, 0x3ffb, 0x41c4, 0x3ffa, 0x41f7, 0x3ff8, 0x4229, 0x3ff7,
|
||||
0x425b, 0x3ff5, 0x428d, 0x3ff3, 0x42c0, 0x3ff1, 0x42f2, 0x3fef,
|
||||
0x4324, 0x3fec, 0x4356, 0x3fea, 0x4388, 0x3fe7, 0x43bb, 0x3fe4,
|
||||
0x43ed, 0x3fe1, 0x441f, 0x3fde, 0x4451, 0x3fdb, 0x4483, 0x3fd7,
|
||||
0x44b5, 0x3fd4, 0x44e7, 0x3fd0, 0x451a, 0x3fcc, 0x454c, 0x3fc8,
|
||||
0x457e, 0x3fc4, 0x45b0, 0x3fbf, 0x45e2, 0x3fbb, 0x4614, 0x3fb6,
|
||||
0x4646, 0x3fb1, 0x4678, 0x3fac, 0x46aa, 0x3fa7, 0x46dc, 0x3fa2,
|
||||
0x470e, 0x3f9c, 0x4740, 0x3f97, 0x4772, 0x3f91, 0x47a4, 0x3f8b,
|
||||
0x47d6, 0x3f85, 0x4807, 0x3f7f, 0x4839, 0x3f78, 0x486b, 0x3f72,
|
||||
0x489d, 0x3f6b, 0x48cf, 0x3f64, 0x4901, 0x3f5d, 0x4932, 0x3f56,
|
||||
0x4964, 0x3f4f, 0x4996, 0x3f47, 0x49c7, 0x3f40, 0x49f9, 0x3f38,
|
||||
0x4a2b, 0x3f30, 0x4a5c, 0x3f28, 0x4a8e, 0x3f20, 0x4ac0, 0x3f17,
|
||||
0x4af1, 0x3f0f, 0x4b23, 0x3f06, 0x4b54, 0x3efd, 0x4b85, 0x3ef4,
|
||||
0x4bb7, 0x3eeb, 0x4be8, 0x3ee2, 0x4c1a, 0x3ed8, 0x4c4b, 0x3ecf,
|
||||
0x4c7c, 0x3ec5, 0x4cae, 0x3ebb, 0x4cdf, 0x3eb1, 0x4d10, 0x3ea7,
|
||||
0x4d41, 0x3e9d, 0x4d72, 0x3e92, 0x4da4, 0x3e88, 0x4dd5, 0x3e7d,
|
||||
0x4e06, 0x3e72, 0x4e37, 0x3e67, 0x4e68, 0x3e5c, 0x4e99, 0x3e50,
|
||||
0x4eca, 0x3e45, 0x4efb, 0x3e39, 0x4f2b, 0x3e2d, 0x4f5c, 0x3e21,
|
||||
0x4f8d, 0x3e15, 0x4fbe, 0x3e09, 0x4fee, 0x3dfc, 0x501f, 0x3df0,
|
||||
0x5050, 0x3de3, 0x5080, 0x3dd6, 0x50b1, 0x3dc9, 0x50e1, 0x3dbc,
|
||||
0x5112, 0x3daf, 0x5142, 0x3da1, 0x5173, 0x3d93, 0x51a3, 0x3d86,
|
||||
0x51d3, 0x3d78, 0x5204, 0x3d6a, 0x5234, 0x3d5b, 0x5264, 0x3d4d,
|
||||
0x5294, 0x3d3f, 0x52c4, 0x3d30, 0x52f4, 0x3d21, 0x5324, 0x3d12,
|
||||
0x5354, 0x3d03, 0x5384, 0x3cf4, 0x53b4, 0x3ce4, 0x53e4, 0x3cd5,
|
||||
0x5413, 0x3cc5, 0x5443, 0x3cb5, 0x5473, 0x3ca5, 0x54a2, 0x3c95,
|
||||
0x54d2, 0x3c85, 0x5501, 0x3c74, 0x5531, 0x3c64, 0x5560, 0x3c53,
|
||||
0x5590, 0x3c42, 0x55bf, 0x3c31, 0x55ee, 0x3c20, 0x561d, 0x3c0f,
|
||||
0x564c, 0x3bfd, 0x567c, 0x3bec, 0x56ab, 0x3bda, 0x56da, 0x3bc8,
|
||||
0x5709, 0x3bb6, 0x5737, 0x3ba4, 0x5766, 0x3b92, 0x5795, 0x3b7f,
|
||||
0x57c4, 0x3b6d, 0x57f2, 0x3b5a, 0x5821, 0x3b47, 0x584f, 0x3b34,
|
||||
0x587e, 0x3b21, 0x58ac, 0x3b0e, 0x58db, 0x3afa, 0x5909, 0x3ae6,
|
||||
0x5937, 0x3ad3, 0x5965, 0x3abf, 0x5993, 0x3aab, 0x59c1, 0x3a97,
|
||||
0x59ef, 0x3a82, 0x5a1d, 0x3a6e, 0x5a4b, 0x3a59, 0x5a79, 0x3a45,
|
||||
0x5aa7, 0x3a30, 0x5ad4, 0x3a1b, 0x5b02, 0x3a06, 0x5b30, 0x39f0,
|
||||
0x5b5d, 0x39db, 0x5b8a, 0x39c5, 0x5bb8, 0x39b0, 0x5be5, 0x399a,
|
||||
0x5c12, 0x3984, 0x5c3f, 0x396e, 0x5c6c, 0x3958, 0x5c99, 0x3941,
|
||||
0x5cc6, 0x392b, 0x5cf3, 0x3914, 0x5d20, 0x38fd, 0x5d4d, 0x38e6,
|
||||
0x5d79, 0x38cf, 0x5da6, 0x38b8, 0x5dd3, 0x38a1, 0x5dff, 0x3889,
|
||||
0x5e2b, 0x3871, 0x5e58, 0x385a, 0x5e84, 0x3842, 0x5eb0, 0x382a,
|
||||
0x5edc, 0x3812, 0x5f08, 0x37f9, 0x5f34, 0x37e1, 0x5f60, 0x37c8,
|
||||
0x5f8c, 0x37b0, 0x5fb7, 0x3797, 0x5fe3, 0x377e, 0x600f, 0x3765,
|
||||
0x603a, 0x374b, 0x6065, 0x3732, 0x6091, 0x3718, 0x60bc, 0x36ff,
|
||||
0x60e7, 0x36e5, 0x6112, 0x36cb, 0x613d, 0x36b1, 0x6168, 0x3697,
|
||||
0x6193, 0x367d, 0x61be, 0x3662, 0x61e8, 0x3648, 0x6213, 0x362d,
|
||||
0x623d, 0x3612, 0x6268, 0x35f7, 0x6292, 0x35dc, 0x62bc, 0x35c1,
|
||||
0x62e7, 0x35a5, 0x6311, 0x358a, 0x633b, 0x356e, 0x6365, 0x3553,
|
||||
0x638e, 0x3537, 0x63b8, 0x351b, 0x63e2, 0x34ff, 0x640b, 0x34e2,
|
||||
0x6435, 0x34c6, 0x645e, 0x34aa, 0x6488, 0x348d, 0x64b1, 0x3470,
|
||||
0x64da, 0x3453, 0x6503, 0x3436, 0x652c, 0x3419, 0x6555, 0x33fc,
|
||||
0x657e, 0x33df, 0x65a6, 0x33c1, 0x65cf, 0x33a3, 0x65f8, 0x3386,
|
||||
0x6620, 0x3368, 0x6648, 0x334a, 0x6671, 0x332c, 0x6699, 0x330d,
|
||||
0x66c1, 0x32ef, 0x66e9, 0x32d0, 0x6711, 0x32b2, 0x6738, 0x3293,
|
||||
0x6760, 0x3274, 0x6788, 0x3255, 0x67af, 0x3236, 0x67d6, 0x3217,
|
||||
0x67fe, 0x31f8, 0x6825, 0x31d8, 0x684c, 0x31b9, 0x6873, 0x3199,
|
||||
0x689a, 0x3179, 0x68c1, 0x3159, 0x68e7, 0x3139, 0x690e, 0x3119,
|
||||
0x6935, 0x30f9, 0x695b, 0x30d8, 0x6981, 0x30b8, 0x69a7, 0x3097,
|
||||
0x69ce, 0x3076, 0x69f4, 0x3055, 0x6a1a, 0x3034, 0x6a3f, 0x3013,
|
||||
0x6a65, 0x2ff2, 0x6a8b, 0x2fd0, 0x6ab0, 0x2faf, 0x6ad6, 0x2f8d,
|
||||
0x6afb, 0x2f6c, 0x6b20, 0x2f4a, 0x6b45, 0x2f28, 0x6b6a, 0x2f06,
|
||||
0x6b8f, 0x2ee4, 0x6bb4, 0x2ec2, 0x6bd8, 0x2e9f, 0x6bfd, 0x2e7d,
|
||||
0x6c21, 0x2e5a, 0x6c46, 0x2e37, 0x6c6a, 0x2e15, 0x6c8e, 0x2df2,
|
||||
0x6cb2, 0x2dcf, 0x6cd6, 0x2dab, 0x6cfa, 0x2d88, 0x6d1e, 0x2d65,
|
||||
0x6d41, 0x2d41, 0x6d65, 0x2d1e, 0x6d88, 0x2cfa, 0x6dab, 0x2cd6,
|
||||
0x6dcf, 0x2cb2, 0x6df2, 0x2c8e, 0x6e15, 0x2c6a, 0x6e37, 0x2c46,
|
||||
0x6e5a, 0x2c21, 0x6e7d, 0x2bfd, 0x6e9f, 0x2bd8, 0x6ec2, 0x2bb4,
|
||||
0x6ee4, 0x2b8f, 0x6f06, 0x2b6a, 0x6f28, 0x2b45, 0x6f4a, 0x2b20,
|
||||
0x6f6c, 0x2afb, 0x6f8d, 0x2ad6, 0x6faf, 0x2ab0, 0x6fd0, 0x2a8b,
|
||||
0x6ff2, 0x2a65, 0x7013, 0x2a3f, 0x7034, 0x2a1a, 0x7055, 0x29f4,
|
||||
0x7076, 0x29ce, 0x7097, 0x29a7, 0x70b8, 0x2981, 0x70d8, 0x295b,
|
||||
0x70f9, 0x2935, 0x7119, 0x290e, 0x7139, 0x28e7, 0x7159, 0x28c1,
|
||||
0x7179, 0x289a, 0x7199, 0x2873, 0x71b9, 0x284c, 0x71d8, 0x2825,
|
||||
0x71f8, 0x27fe, 0x7217, 0x27d6, 0x7236, 0x27af, 0x7255, 0x2788,
|
||||
0x7274, 0x2760, 0x7293, 0x2738, 0x72b2, 0x2711, 0x72d0, 0x26e9,
|
||||
0x72ef, 0x26c1, 0x730d, 0x2699, 0x732c, 0x2671, 0x734a, 0x2648,
|
||||
0x7368, 0x2620, 0x7386, 0x25f8, 0x73a3, 0x25cf, 0x73c1, 0x25a6,
|
||||
0x73df, 0x257e, 0x73fc, 0x2555, 0x7419, 0x252c, 0x7436, 0x2503,
|
||||
0x7453, 0x24da, 0x7470, 0x24b1, 0x748d, 0x2488, 0x74aa, 0x245e,
|
||||
0x74c6, 0x2435, 0x74e2, 0x240b, 0x74ff, 0x23e2, 0x751b, 0x23b8,
|
||||
0x7537, 0x238e, 0x7553, 0x2365, 0x756e, 0x233b, 0x758a, 0x2311,
|
||||
0x75a5, 0x22e7, 0x75c1, 0x22bc, 0x75dc, 0x2292, 0x75f7, 0x2268,
|
||||
0x7612, 0x223d, 0x762d, 0x2213, 0x7648, 0x21e8, 0x7662, 0x21be,
|
||||
0x767d, 0x2193, 0x7697, 0x2168, 0x76b1, 0x213d, 0x76cb, 0x2112,
|
||||
0x76e5, 0x20e7, 0x76ff, 0x20bc, 0x7718, 0x2091, 0x7732, 0x2065,
|
||||
0x774b, 0x203a, 0x7765, 0x200f, 0x777e, 0x1fe3, 0x7797, 0x1fb7,
|
||||
0x77b0, 0x1f8c, 0x77c8, 0x1f60, 0x77e1, 0x1f34, 0x77f9, 0x1f08,
|
||||
0x7812, 0x1edc, 0x782a, 0x1eb0, 0x7842, 0x1e84, 0x785a, 0x1e58,
|
||||
0x7871, 0x1e2b, 0x7889, 0x1dff, 0x78a1, 0x1dd3, 0x78b8, 0x1da6,
|
||||
0x78cf, 0x1d79, 0x78e6, 0x1d4d, 0x78fd, 0x1d20, 0x7914, 0x1cf3,
|
||||
0x792b, 0x1cc6, 0x7941, 0x1c99, 0x7958, 0x1c6c, 0x796e, 0x1c3f,
|
||||
0x7984, 0x1c12, 0x799a, 0x1be5, 0x79b0, 0x1bb8, 0x79c5, 0x1b8a,
|
||||
0x79db, 0x1b5d, 0x79f0, 0x1b30, 0x7a06, 0x1b02, 0x7a1b, 0x1ad4,
|
||||
0x7a30, 0x1aa7, 0x7a45, 0x1a79, 0x7a59, 0x1a4b, 0x7a6e, 0x1a1d,
|
||||
0x7a82, 0x19ef, 0x7a97, 0x19c1, 0x7aab, 0x1993, 0x7abf, 0x1965,
|
||||
0x7ad3, 0x1937, 0x7ae6, 0x1909, 0x7afa, 0x18db, 0x7b0e, 0x18ac,
|
||||
0x7b21, 0x187e, 0x7b34, 0x184f, 0x7b47, 0x1821, 0x7b5a, 0x17f2,
|
||||
0x7b6d, 0x17c4, 0x7b7f, 0x1795, 0x7b92, 0x1766, 0x7ba4, 0x1737,
|
||||
0x7bb6, 0x1709, 0x7bc8, 0x16da, 0x7bda, 0x16ab, 0x7bec, 0x167c,
|
||||
0x7bfd, 0x164c, 0x7c0f, 0x161d, 0x7c20, 0x15ee, 0x7c31, 0x15bf,
|
||||
0x7c42, 0x1590, 0x7c53, 0x1560, 0x7c64, 0x1531, 0x7c74, 0x1501,
|
||||
0x7c85, 0x14d2, 0x7c95, 0x14a2, 0x7ca5, 0x1473, 0x7cb5, 0x1443,
|
||||
0x7cc5, 0x1413, 0x7cd5, 0x13e4, 0x7ce4, 0x13b4, 0x7cf4, 0x1384,
|
||||
0x7d03, 0x1354, 0x7d12, 0x1324, 0x7d21, 0x12f4, 0x7d30, 0x12c4,
|
||||
0x7d3f, 0x1294, 0x7d4d, 0x1264, 0x7d5b, 0x1234, 0x7d6a, 0x1204,
|
||||
0x7d78, 0x11d3, 0x7d86, 0x11a3, 0x7d93, 0x1173, 0x7da1, 0x1142,
|
||||
0x7daf, 0x1112, 0x7dbc, 0x10e1, 0x7dc9, 0x10b1, 0x7dd6, 0x1080,
|
||||
0x7de3, 0x1050, 0x7df0, 0x101f, 0x7dfc, 0xfee, 0x7e09, 0xfbe,
|
||||
0x7e15, 0xf8d, 0x7e21, 0xf5c, 0x7e2d, 0xf2b, 0x7e39, 0xefb,
|
||||
0x7e45, 0xeca, 0x7e50, 0xe99, 0x7e5c, 0xe68, 0x7e67, 0xe37,
|
||||
0x7e72, 0xe06, 0x7e7d, 0xdd5, 0x7e88, 0xda4, 0x7e92, 0xd72,
|
||||
0x7e9d, 0xd41, 0x7ea7, 0xd10, 0x7eb1, 0xcdf, 0x7ebb, 0xcae,
|
||||
0x7ec5, 0xc7c, 0x7ecf, 0xc4b, 0x7ed8, 0xc1a, 0x7ee2, 0xbe8,
|
||||
0x7eeb, 0xbb7, 0x7ef4, 0xb85, 0x7efd, 0xb54, 0x7f06, 0xb23,
|
||||
0x7f0f, 0xaf1, 0x7f17, 0xac0, 0x7f20, 0xa8e, 0x7f28, 0xa5c,
|
||||
0x7f30, 0xa2b, 0x7f38, 0x9f9, 0x7f40, 0x9c7, 0x7f47, 0x996,
|
||||
0x7f4f, 0x964, 0x7f56, 0x932, 0x7f5d, 0x901, 0x7f64, 0x8cf,
|
||||
0x7f6b, 0x89d, 0x7f72, 0x86b, 0x7f78, 0x839, 0x7f7f, 0x807,
|
||||
0x7f85, 0x7d6, 0x7f8b, 0x7a4, 0x7f91, 0x772, 0x7f97, 0x740,
|
||||
0x7f9c, 0x70e, 0x7fa2, 0x6dc, 0x7fa7, 0x6aa, 0x7fac, 0x678,
|
||||
0x7fb1, 0x646, 0x7fb6, 0x614, 0x7fbb, 0x5e2, 0x7fbf, 0x5b0,
|
||||
0x7fc4, 0x57e, 0x7fc8, 0x54c, 0x7fcc, 0x51a, 0x7fd0, 0x4e7,
|
||||
0x7fd4, 0x4b5, 0x7fd7, 0x483, 0x7fdb, 0x451, 0x7fde, 0x41f,
|
||||
0x7fe1, 0x3ed, 0x7fe4, 0x3bb, 0x7fe7, 0x388, 0x7fea, 0x356,
|
||||
0x7fec, 0x324, 0x7fef, 0x2f2, 0x7ff1, 0x2c0, 0x7ff3, 0x28d,
|
||||
0x7ff5, 0x25b, 0x7ff7, 0x229, 0x7ff8, 0x1f7, 0x7ffa, 0x1c4,
|
||||
0x7ffb, 0x192, 0x7ffc, 0x160, 0x7ffd, 0x12e, 0x7ffe, 0xfb,
|
||||
0x7fff, 0xc9, 0x7fff, 0x97, 0x7fff, 0x65, 0x7fff, 0x32,
|
||||
0x7fff, 0x0, 0x7fff, 0xffce, 0x7fff, 0xff9b, 0x7fff, 0xff69,
|
||||
0x7fff, 0xff37, 0x7ffe, 0xff05, 0x7ffd, 0xfed2, 0x7ffc, 0xfea0,
|
||||
0x7ffb, 0xfe6e, 0x7ffa, 0xfe3c, 0x7ff8, 0xfe09, 0x7ff7, 0xfdd7,
|
||||
0x7ff5, 0xfda5, 0x7ff3, 0xfd73, 0x7ff1, 0xfd40, 0x7fef, 0xfd0e,
|
||||
0x7fec, 0xfcdc, 0x7fea, 0xfcaa, 0x7fe7, 0xfc78, 0x7fe4, 0xfc45,
|
||||
0x7fe1, 0xfc13, 0x7fde, 0xfbe1, 0x7fdb, 0xfbaf, 0x7fd7, 0xfb7d,
|
||||
0x7fd4, 0xfb4b, 0x7fd0, 0xfb19, 0x7fcc, 0xfae6, 0x7fc8, 0xfab4,
|
||||
0x7fc4, 0xfa82, 0x7fbf, 0xfa50, 0x7fbb, 0xfa1e, 0x7fb6, 0xf9ec,
|
||||
0x7fb1, 0xf9ba, 0x7fac, 0xf988, 0x7fa7, 0xf956, 0x7fa2, 0xf924,
|
||||
0x7f9c, 0xf8f2, 0x7f97, 0xf8c0, 0x7f91, 0xf88e, 0x7f8b, 0xf85c,
|
||||
0x7f85, 0xf82a, 0x7f7f, 0xf7f9, 0x7f78, 0xf7c7, 0x7f72, 0xf795,
|
||||
0x7f6b, 0xf763, 0x7f64, 0xf731, 0x7f5d, 0xf6ff, 0x7f56, 0xf6ce,
|
||||
0x7f4f, 0xf69c, 0x7f47, 0xf66a, 0x7f40, 0xf639, 0x7f38, 0xf607,
|
||||
0x7f30, 0xf5d5, 0x7f28, 0xf5a4, 0x7f20, 0xf572, 0x7f17, 0xf540,
|
||||
0x7f0f, 0xf50f, 0x7f06, 0xf4dd, 0x7efd, 0xf4ac, 0x7ef4, 0xf47b,
|
||||
0x7eeb, 0xf449, 0x7ee2, 0xf418, 0x7ed8, 0xf3e6, 0x7ecf, 0xf3b5,
|
||||
0x7ec5, 0xf384, 0x7ebb, 0xf352, 0x7eb1, 0xf321, 0x7ea7, 0xf2f0,
|
||||
0x7e9d, 0xf2bf, 0x7e92, 0xf28e, 0x7e88, 0xf25c, 0x7e7d, 0xf22b,
|
||||
0x7e72, 0xf1fa, 0x7e67, 0xf1c9, 0x7e5c, 0xf198, 0x7e50, 0xf167,
|
||||
0x7e45, 0xf136, 0x7e39, 0xf105, 0x7e2d, 0xf0d5, 0x7e21, 0xf0a4,
|
||||
0x7e15, 0xf073, 0x7e09, 0xf042, 0x7dfc, 0xf012, 0x7df0, 0xefe1,
|
||||
0x7de3, 0xefb0, 0x7dd6, 0xef80, 0x7dc9, 0xef4f, 0x7dbc, 0xef1f,
|
||||
0x7daf, 0xeeee, 0x7da1, 0xeebe, 0x7d93, 0xee8d, 0x7d86, 0xee5d,
|
||||
0x7d78, 0xee2d, 0x7d6a, 0xedfc, 0x7d5b, 0xedcc, 0x7d4d, 0xed9c,
|
||||
0x7d3f, 0xed6c, 0x7d30, 0xed3c, 0x7d21, 0xed0c, 0x7d12, 0xecdc,
|
||||
0x7d03, 0xecac, 0x7cf4, 0xec7c, 0x7ce4, 0xec4c, 0x7cd5, 0xec1c,
|
||||
0x7cc5, 0xebed, 0x7cb5, 0xebbd, 0x7ca5, 0xeb8d, 0x7c95, 0xeb5e,
|
||||
0x7c85, 0xeb2e, 0x7c74, 0xeaff, 0x7c64, 0xeacf, 0x7c53, 0xeaa0,
|
||||
0x7c42, 0xea70, 0x7c31, 0xea41, 0x7c20, 0xea12, 0x7c0f, 0xe9e3,
|
||||
0x7bfd, 0xe9b4, 0x7bec, 0xe984, 0x7bda, 0xe955, 0x7bc8, 0xe926,
|
||||
0x7bb6, 0xe8f7, 0x7ba4, 0xe8c9, 0x7b92, 0xe89a, 0x7b7f, 0xe86b,
|
||||
0x7b6d, 0xe83c, 0x7b5a, 0xe80e, 0x7b47, 0xe7df, 0x7b34, 0xe7b1,
|
||||
0x7b21, 0xe782, 0x7b0e, 0xe754, 0x7afa, 0xe725, 0x7ae6, 0xe6f7,
|
||||
0x7ad3, 0xe6c9, 0x7abf, 0xe69b, 0x7aab, 0xe66d, 0x7a97, 0xe63f,
|
||||
0x7a82, 0xe611, 0x7a6e, 0xe5e3, 0x7a59, 0xe5b5, 0x7a45, 0xe587,
|
||||
0x7a30, 0xe559, 0x7a1b, 0xe52c, 0x7a06, 0xe4fe, 0x79f0, 0xe4d0,
|
||||
0x79db, 0xe4a3, 0x79c5, 0xe476, 0x79b0, 0xe448, 0x799a, 0xe41b,
|
||||
0x7984, 0xe3ee, 0x796e, 0xe3c1, 0x7958, 0xe394, 0x7941, 0xe367,
|
||||
0x792b, 0xe33a, 0x7914, 0xe30d, 0x78fd, 0xe2e0, 0x78e6, 0xe2b3,
|
||||
0x78cf, 0xe287, 0x78b8, 0xe25a, 0x78a1, 0xe22d, 0x7889, 0xe201,
|
||||
0x7871, 0xe1d5, 0x785a, 0xe1a8, 0x7842, 0xe17c, 0x782a, 0xe150,
|
||||
0x7812, 0xe124, 0x77f9, 0xe0f8, 0x77e1, 0xe0cc, 0x77c8, 0xe0a0,
|
||||
0x77b0, 0xe074, 0x7797, 0xe049, 0x777e, 0xe01d, 0x7765, 0xdff1,
|
||||
0x774b, 0xdfc6, 0x7732, 0xdf9b, 0x7718, 0xdf6f, 0x76ff, 0xdf44,
|
||||
0x76e5, 0xdf19, 0x76cb, 0xdeee, 0x76b1, 0xdec3, 0x7697, 0xde98,
|
||||
0x767d, 0xde6d, 0x7662, 0xde42, 0x7648, 0xde18, 0x762d, 0xdded,
|
||||
0x7612, 0xddc3, 0x75f7, 0xdd98, 0x75dc, 0xdd6e, 0x75c1, 0xdd44,
|
||||
0x75a5, 0xdd19, 0x758a, 0xdcef, 0x756e, 0xdcc5, 0x7553, 0xdc9b,
|
||||
0x7537, 0xdc72, 0x751b, 0xdc48, 0x74ff, 0xdc1e, 0x74e2, 0xdbf5,
|
||||
0x74c6, 0xdbcb, 0x74aa, 0xdba2, 0x748d, 0xdb78, 0x7470, 0xdb4f,
|
||||
0x7453, 0xdb26, 0x7436, 0xdafd, 0x7419, 0xdad4, 0x73fc, 0xdaab,
|
||||
0x73df, 0xda82, 0x73c1, 0xda5a, 0x73a3, 0xda31, 0x7386, 0xda08,
|
||||
0x7368, 0xd9e0, 0x734a, 0xd9b8, 0x732c, 0xd98f, 0x730d, 0xd967,
|
||||
0x72ef, 0xd93f, 0x72d0, 0xd917, 0x72b2, 0xd8ef, 0x7293, 0xd8c8,
|
||||
0x7274, 0xd8a0, 0x7255, 0xd878, 0x7236, 0xd851, 0x7217, 0xd82a,
|
||||
0x71f8, 0xd802, 0x71d8, 0xd7db, 0x71b9, 0xd7b4, 0x7199, 0xd78d,
|
||||
0x7179, 0xd766, 0x7159, 0xd73f, 0x7139, 0xd719, 0x7119, 0xd6f2,
|
||||
0x70f9, 0xd6cb, 0x70d8, 0xd6a5, 0x70b8, 0xd67f, 0x7097, 0xd659,
|
||||
0x7076, 0xd632, 0x7055, 0xd60c, 0x7034, 0xd5e6, 0x7013, 0xd5c1,
|
||||
0x6ff2, 0xd59b, 0x6fd0, 0xd575, 0x6faf, 0xd550, 0x6f8d, 0xd52a,
|
||||
0x6f6c, 0xd505, 0x6f4a, 0xd4e0, 0x6f28, 0xd4bb, 0x6f06, 0xd496,
|
||||
0x6ee4, 0xd471, 0x6ec2, 0xd44c, 0x6e9f, 0xd428, 0x6e7d, 0xd403,
|
||||
0x6e5a, 0xd3df, 0x6e37, 0xd3ba, 0x6e15, 0xd396, 0x6df2, 0xd372,
|
||||
0x6dcf, 0xd34e, 0x6dab, 0xd32a, 0x6d88, 0xd306, 0x6d65, 0xd2e2,
|
||||
0x6d41, 0xd2bf, 0x6d1e, 0xd29b, 0x6cfa, 0xd278, 0x6cd6, 0xd255,
|
||||
0x6cb2, 0xd231, 0x6c8e, 0xd20e, 0x6c6a, 0xd1eb, 0x6c46, 0xd1c9,
|
||||
0x6c21, 0xd1a6, 0x6bfd, 0xd183, 0x6bd8, 0xd161, 0x6bb4, 0xd13e,
|
||||
0x6b8f, 0xd11c, 0x6b6a, 0xd0fa, 0x6b45, 0xd0d8, 0x6b20, 0xd0b6,
|
||||
0x6afb, 0xd094, 0x6ad6, 0xd073, 0x6ab0, 0xd051, 0x6a8b, 0xd030,
|
||||
0x6a65, 0xd00e, 0x6a3f, 0xcfed, 0x6a1a, 0xcfcc, 0x69f4, 0xcfab,
|
||||
0x69ce, 0xcf8a, 0x69a7, 0xcf69, 0x6981, 0xcf48, 0x695b, 0xcf28,
|
||||
0x6935, 0xcf07, 0x690e, 0xcee7, 0x68e7, 0xcec7, 0x68c1, 0xcea7,
|
||||
0x689a, 0xce87, 0x6873, 0xce67, 0x684c, 0xce47, 0x6825, 0xce28,
|
||||
0x67fe, 0xce08, 0x67d6, 0xcde9, 0x67af, 0xcdca, 0x6788, 0xcdab,
|
||||
0x6760, 0xcd8c, 0x6738, 0xcd6d, 0x6711, 0xcd4e, 0x66e9, 0xcd30,
|
||||
0x66c1, 0xcd11, 0x6699, 0xccf3, 0x6671, 0xccd4, 0x6648, 0xccb6,
|
||||
0x6620, 0xcc98, 0x65f8, 0xcc7a, 0x65cf, 0xcc5d, 0x65a6, 0xcc3f,
|
||||
0x657e, 0xcc21, 0x6555, 0xcc04, 0x652c, 0xcbe7, 0x6503, 0xcbca,
|
||||
0x64da, 0xcbad, 0x64b1, 0xcb90, 0x6488, 0xcb73, 0x645e, 0xcb56,
|
||||
0x6435, 0xcb3a, 0x640b, 0xcb1e, 0x63e2, 0xcb01, 0x63b8, 0xcae5,
|
||||
0x638e, 0xcac9, 0x6365, 0xcaad, 0x633b, 0xca92, 0x6311, 0xca76,
|
||||
0x62e7, 0xca5b, 0x62bc, 0xca3f, 0x6292, 0xca24, 0x6268, 0xca09,
|
||||
0x623d, 0xc9ee, 0x6213, 0xc9d3, 0x61e8, 0xc9b8, 0x61be, 0xc99e,
|
||||
0x6193, 0xc983, 0x6168, 0xc969, 0x613d, 0xc94f, 0x6112, 0xc935,
|
||||
0x60e7, 0xc91b, 0x60bc, 0xc901, 0x6091, 0xc8e8, 0x6065, 0xc8ce,
|
||||
0x603a, 0xc8b5, 0x600f, 0xc89b, 0x5fe3, 0xc882, 0x5fb7, 0xc869,
|
||||
0x5f8c, 0xc850, 0x5f60, 0xc838, 0x5f34, 0xc81f, 0x5f08, 0xc807,
|
||||
0x5edc, 0xc7ee, 0x5eb0, 0xc7d6, 0x5e84, 0xc7be, 0x5e58, 0xc7a6,
|
||||
0x5e2b, 0xc78f, 0x5dff, 0xc777, 0x5dd3, 0xc75f, 0x5da6, 0xc748,
|
||||
0x5d79, 0xc731, 0x5d4d, 0xc71a, 0x5d20, 0xc703, 0x5cf3, 0xc6ec,
|
||||
0x5cc6, 0xc6d5, 0x5c99, 0xc6bf, 0x5c6c, 0xc6a8, 0x5c3f, 0xc692,
|
||||
0x5c12, 0xc67c, 0x5be5, 0xc666, 0x5bb8, 0xc650, 0x5b8a, 0xc63b,
|
||||
0x5b5d, 0xc625, 0x5b30, 0xc610, 0x5b02, 0xc5fa, 0x5ad4, 0xc5e5,
|
||||
0x5aa7, 0xc5d0, 0x5a79, 0xc5bb, 0x5a4b, 0xc5a7, 0x5a1d, 0xc592,
|
||||
0x59ef, 0xc57e, 0x59c1, 0xc569, 0x5993, 0xc555, 0x5965, 0xc541,
|
||||
0x5937, 0xc52d, 0x5909, 0xc51a, 0x58db, 0xc506, 0x58ac, 0xc4f2,
|
||||
0x587e, 0xc4df, 0x584f, 0xc4cc, 0x5821, 0xc4b9, 0x57f2, 0xc4a6,
|
||||
0x57c4, 0xc493, 0x5795, 0xc481, 0x5766, 0xc46e, 0x5737, 0xc45c,
|
||||
0x5709, 0xc44a, 0x56da, 0xc438, 0x56ab, 0xc426, 0x567c, 0xc414,
|
||||
0x564c, 0xc403, 0x561d, 0xc3f1, 0x55ee, 0xc3e0, 0x55bf, 0xc3cf,
|
||||
0x5590, 0xc3be, 0x5560, 0xc3ad, 0x5531, 0xc39c, 0x5501, 0xc38c,
|
||||
0x54d2, 0xc37b, 0x54a2, 0xc36b, 0x5473, 0xc35b, 0x5443, 0xc34b,
|
||||
0x5413, 0xc33b, 0x53e4, 0xc32b, 0x53b4, 0xc31c, 0x5384, 0xc30c,
|
||||
0x5354, 0xc2fd, 0x5324, 0xc2ee, 0x52f4, 0xc2df, 0x52c4, 0xc2d0,
|
||||
0x5294, 0xc2c1, 0x5264, 0xc2b3, 0x5234, 0xc2a5, 0x5204, 0xc296,
|
||||
0x51d3, 0xc288, 0x51a3, 0xc27a, 0x5173, 0xc26d, 0x5142, 0xc25f,
|
||||
0x5112, 0xc251, 0x50e1, 0xc244, 0x50b1, 0xc237, 0x5080, 0xc22a,
|
||||
0x5050, 0xc21d, 0x501f, 0xc210, 0x4fee, 0xc204, 0x4fbe, 0xc1f7,
|
||||
0x4f8d, 0xc1eb, 0x4f5c, 0xc1df, 0x4f2b, 0xc1d3, 0x4efb, 0xc1c7,
|
||||
0x4eca, 0xc1bb, 0x4e99, 0xc1b0, 0x4e68, 0xc1a4, 0x4e37, 0xc199,
|
||||
0x4e06, 0xc18e, 0x4dd5, 0xc183, 0x4da4, 0xc178, 0x4d72, 0xc16e,
|
||||
0x4d41, 0xc163, 0x4d10, 0xc159, 0x4cdf, 0xc14f, 0x4cae, 0xc145,
|
||||
0x4c7c, 0xc13b, 0x4c4b, 0xc131, 0x4c1a, 0xc128, 0x4be8, 0xc11e,
|
||||
0x4bb7, 0xc115, 0x4b85, 0xc10c, 0x4b54, 0xc103, 0x4b23, 0xc0fa,
|
||||
0x4af1, 0xc0f1, 0x4ac0, 0xc0e9, 0x4a8e, 0xc0e0, 0x4a5c, 0xc0d8,
|
||||
0x4a2b, 0xc0d0, 0x49f9, 0xc0c8, 0x49c7, 0xc0c0, 0x4996, 0xc0b9,
|
||||
0x4964, 0xc0b1, 0x4932, 0xc0aa, 0x4901, 0xc0a3, 0x48cf, 0xc09c,
|
||||
0x489d, 0xc095, 0x486b, 0xc08e, 0x4839, 0xc088, 0x4807, 0xc081,
|
||||
0x47d6, 0xc07b, 0x47a4, 0xc075, 0x4772, 0xc06f, 0x4740, 0xc069,
|
||||
0x470e, 0xc064, 0x46dc, 0xc05e, 0x46aa, 0xc059, 0x4678, 0xc054,
|
||||
0x4646, 0xc04f, 0x4614, 0xc04a, 0x45e2, 0xc045, 0x45b0, 0xc041,
|
||||
0x457e, 0xc03c, 0x454c, 0xc038, 0x451a, 0xc034, 0x44e7, 0xc030,
|
||||
0x44b5, 0xc02c, 0x4483, 0xc029, 0x4451, 0xc025, 0x441f, 0xc022,
|
||||
0x43ed, 0xc01f, 0x43bb, 0xc01c, 0x4388, 0xc019, 0x4356, 0xc016,
|
||||
0x4324, 0xc014, 0x42f2, 0xc011, 0x42c0, 0xc00f, 0x428d, 0xc00d,
|
||||
0x425b, 0xc00b, 0x4229, 0xc009, 0x41f7, 0xc008, 0x41c4, 0xc006,
|
||||
0x4192, 0xc005, 0x4160, 0xc004, 0x412e, 0xc003, 0x40fb, 0xc002,
|
||||
0x40c9, 0xc001, 0x4097, 0xc001, 0x4065, 0xc000, 0x4032, 0xc000
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Initialization function for the Q15 RFFT/RIFFT.
|
||||
* @param[in, out] *S points to an instance of the Q15 RFFT/RIFFT structure.
|
||||
* @param[in] *S_CFFT points to an instance of the Q15 CFFT/CIFFT structure.
|
||||
* @param[in] fftLenReal length of the FFT.
|
||||
* @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform.
|
||||
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output.
|
||||
* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLenReal</code> is not a supported value.
|
||||
*
|
||||
* \par Description:
|
||||
* \par
|
||||
* The parameter <code>fftLenReal</code> Specifies length of RFFT/RIFFT Process. Supported FFT Lengths are 128, 512, 2048.
|
||||
* \par
|
||||
* The parameter <code>ifftFlagR</code> controls whether a forward or inverse transform is computed.
|
||||
* Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated.
|
||||
* \par
|
||||
* The parameter <code>bitReverseFlag</code> controls whether output is in normal order or bit reversed order.
|
||||
* Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order.
|
||||
* \par
|
||||
* This function also initializes Twiddle factor table.
|
||||
*/
|
||||
|
||||
arm_status arm_rfft_init_q15(
|
||||
arm_rfft_instance_q15 * S,
|
||||
arm_cfft_radix4_instance_q15 * S_CFFT,
|
||||
uint32_t fftLenReal,
|
||||
uint32_t ifftFlagR,
|
||||
uint32_t bitReverseFlag)
|
||||
{
|
||||
|
||||
/* Initialise the default arm status */
|
||||
arm_status status = ARM_MATH_SUCCESS;
|
||||
|
||||
/* Initialize the Real FFT length */
|
||||
S->fftLenReal = (uint16_t) fftLenReal;
|
||||
|
||||
/* Initialize the Complex FFT length */
|
||||
S->fftLenBy2 = (uint16_t) fftLenReal / 2u;
|
||||
|
||||
/* Initialize the Twiddle coefficientA pointer */
|
||||
S->pTwiddleAReal = (q15_t *) realCoefAQ15;
|
||||
|
||||
/* Initialize the Twiddle coefficientB pointer */
|
||||
S->pTwiddleBReal = (q15_t *) realCoefBQ15;
|
||||
|
||||
/* Initialize the Flag for selection of RFFT or RIFFT */
|
||||
S->ifftFlagR = (uint8_t) ifftFlagR;
|
||||
|
||||
/* Initialize the Flag for calculation Bit reversal or not */
|
||||
S->bitReverseFlagR = (uint8_t) bitReverseFlag;
|
||||
|
||||
/* Initialization of coef modifier depending on the FFT length */
|
||||
switch (S->fftLenReal)
|
||||
{
|
||||
case 2048u:
|
||||
S->twidCoefRModifier = 1u;
|
||||
break;
|
||||
case 512u:
|
||||
S->twidCoefRModifier = 4u;
|
||||
break;
|
||||
case 128u:
|
||||
S->twidCoefRModifier = 16u;
|
||||
break;
|
||||
default:
|
||||
/* Reporting argument error if rfftSize is not valid value */
|
||||
status = ARM_MATH_ARGUMENT_ERROR;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Init Complex FFT Instance */
|
||||
S->pCfft = S_CFFT;
|
||||
|
||||
if(S->ifftFlagR)
|
||||
{
|
||||
/* Initializes the CIFFT Module for fftLenreal/2 length */
|
||||
arm_cfft_radix4_init_q15(S->pCfft, S->fftLenBy2, 1u, 1u);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Initializes the CFFT Module for fftLenreal/2 length */
|
||||
arm_cfft_radix4_init_q15(S->pCfft, S->fftLenBy2, 0u, 1u);
|
||||
}
|
||||
|
||||
/* return the status of RFFT Init function */
|
||||
return (status);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @} end of RFFT_RIFFT group
|
||||
*/
|
@ -0,0 +1,681 @@
|
||||
/* ----------------------------------------------------------------------
|
||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
||||
*
|
||||
* $Date: 15. July 2011
|
||||
* $Revision: V1.0.10
|
||||
*
|
||||
* Project: CMSIS DSP Library
|
||||
* Title: arm_rfft_init_q31.c
|
||||
*
|
||||
* Description: RFFT & RIFFT Q31 initialisation function
|
||||
*
|
||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
||||
*
|
||||
* Version 1.0.10 2011/7/15
|
||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
||||
*
|
||||
* Version 1.0.3 2010/11/29
|
||||
* Re-organized the CMSIS folders and updated documentation.
|
||||
*
|
||||
* Version 1.0.2 2010/11/11
|
||||
* Documentation updated.
|
||||
*
|
||||
* Version 1.0.1 2010/10/05
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 1.0.0 2010/09/20
|
||||
* Production release and review comments incorporated
|
||||
*
|
||||
* Version 0.0.7 2010/06/10
|
||||
* Misra-C changes done
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#include "arm_math.h"
|
||||
|
||||
/**
|
||||
* @ingroup groupTransforms
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup RFFT_RIFFT
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \par
|
||||
* Generation floating point realCoefAQ31 array:
|
||||
* \par
|
||||
* n = 1024
|
||||
* <pre>for (i = 0; i < n; i++)
|
||||
* {
|
||||
* pATable[2 * i] = 0.5 * (1.0 - sin (2 * PI / (double) (2 * n) * (double) i));
|
||||
* pATable[2 * i + 1] = 0.5 * (-1.0 * cos (2 * PI / (double) (2 * n) * (double) i));
|
||||
* }</pre>
|
||||
* \par
|
||||
* Convert to fixed point Q31 format
|
||||
* round(pATable[i] * pow(2, 31))
|
||||
*/
|
||||
|
||||
|
||||
const q31_t realCoefAQ31[1024] = {
|
||||
0x40000000, 0xc0000000, 0x3f9b783c, 0xc0004ef5,
|
||||
0x3f36f170, 0xc0013bd3, 0x3ed26c94, 0xc002c697,
|
||||
0x3e6deaa1, 0xc004ef3f, 0x3e096c8d, 0xc007b5c4,
|
||||
0x3da4f351, 0xc00b1a20, 0x3d407fe6, 0xc00f1c4a,
|
||||
0x3cdc1342, 0xc013bc39, 0x3c77ae5e, 0xc018f9e1,
|
||||
0x3c135231, 0xc01ed535, 0x3baeffb3, 0xc0254e27,
|
||||
0x3b4ab7db, 0xc02c64a6, 0x3ae67ba2, 0xc03418a2,
|
||||
0x3a824bfd, 0xc03c6a07, 0x3a1e29e5, 0xc04558c0,
|
||||
0x39ba1651, 0xc04ee4b8, 0x39561237, 0xc0590dd8,
|
||||
0x38f21e8e, 0xc063d405, 0x388e3c4d, 0xc06f3726,
|
||||
0x382a6c6a, 0xc07b371e, 0x37c6afdc, 0xc087d3d0,
|
||||
0x37630799, 0xc0950d1d, 0x36ff7496, 0xc0a2e2e3,
|
||||
0x369bf7c9, 0xc0b15502, 0x36389228, 0xc0c06355,
|
||||
0x35d544a7, 0xc0d00db6, 0x3572103d, 0xc0e05401,
|
||||
0x350ef5de, 0xc0f1360b, 0x34abf67e, 0xc102b3ac,
|
||||
0x34491311, 0xc114ccb9, 0x33e64c8c, 0xc1278104,
|
||||
0x3383a3e2, 0xc13ad060, 0x33211a07, 0xc14eba9d,
|
||||
0x32beafed, 0xc1633f8a, 0x325c6688, 0xc1785ef4,
|
||||
0x31fa3ecb, 0xc18e18a7, 0x319839a6, 0xc1a46c6e,
|
||||
0x3136580d, 0xc1bb5a11, 0x30d49af1, 0xc1d2e158,
|
||||
0x30730342, 0xc1eb0209, 0x301191f3, 0xc203bbe8,
|
||||
0x2fb047f2, 0xc21d0eb8, 0x2f4f2630, 0xc236fa3b,
|
||||
0x2eee2d9d, 0xc2517e31, 0x2e8d5f29, 0xc26c9a58,
|
||||
0x2e2cbbc1, 0xc2884e6e, 0x2dcc4454, 0xc2a49a2e,
|
||||
0x2d6bf9d1, 0xc2c17d52, 0x2d0bdd25, 0xc2def794,
|
||||
0x2cabef3d, 0xc2fd08a9, 0x2c4c3106, 0xc31bb049,
|
||||
0x2beca36c, 0xc33aee27, 0x2b8d475b, 0xc35ac1f7,
|
||||
0x2b2e1dbe, 0xc37b2b6a, 0x2acf277f, 0xc39c2a2f,
|
||||
0x2a70658a, 0xc3bdbdf6, 0x2a11d8c8, 0xc3dfe66c,
|
||||
0x29b38223, 0xc402a33c, 0x29556282, 0xc425f410,
|
||||
0x28f77acf, 0xc449d892, 0x2899cbf1, 0xc46e5069,
|
||||
0x283c56cf, 0xc4935b3c, 0x27df1c50, 0xc4b8f8ad,
|
||||
0x27821d59, 0xc4df2862, 0x27255ad1, 0xc505e9fb,
|
||||
0x26c8d59c, 0xc52d3d18, 0x266c8e9f, 0xc555215a,
|
||||
0x261086bc, 0xc57d965d, 0x25b4bed8, 0xc5a69bbe,
|
||||
0x255937d5, 0xc5d03118, 0x24fdf294, 0xc5fa5603,
|
||||
0x24a2eff6, 0xc6250a18, 0x244830dd, 0xc6504ced,
|
||||
0x23edb628, 0xc67c1e18, 0x239380b6, 0xc6a87d2d,
|
||||
0x23399167, 0xc6d569be, 0x22dfe917, 0xc702e35c,
|
||||
0x228688a4, 0xc730e997, 0x222d70eb, 0xc75f7bfe,
|
||||
0x21d4a2c8, 0xc78e9a1d, 0x217c1f15, 0xc7be4381,
|
||||
0x2123e6ad, 0xc7ee77b3, 0x20cbfa6a, 0xc81f363d,
|
||||
0x20745b24, 0xc8507ea7, 0x201d09b4, 0xc8825077,
|
||||
0x1fc606f1, 0xc8b4ab32, 0x1f6f53b3, 0xc8e78e5b,
|
||||
0x1f18f0ce, 0xc91af976, 0x1ec2df18, 0xc94eec03,
|
||||
0x1e6d1f65, 0xc9836582, 0x1e17b28a, 0xc9b86572,
|
||||
0x1dc29958, 0xc9edeb50, 0x1d6dd4a2, 0xca23f698,
|
||||
0x1d196538, 0xca5a86c4, 0x1cc54bec, 0xca919b4e,
|
||||
0x1c71898d, 0xcac933ae, 0x1c1e1ee9, 0xcb014f5b,
|
||||
0x1bcb0cce, 0xcb39edca, 0x1b785409, 0xcb730e70,
|
||||
0x1b25f566, 0xcbacb0bf, 0x1ad3f1b1, 0xcbe6d42b,
|
||||
0x1a8249b4, 0xcc217822, 0x1a30fe38, 0xcc5c9c14,
|
||||
0x19e01006, 0xcc983f70, 0x198f7fe6, 0xccd461a2,
|
||||
0x193f4e9e, 0xcd110216, 0x18ef7cf4, 0xcd4e2037,
|
||||
0x18a00bae, 0xcd8bbb6d, 0x1850fb8e, 0xcdc9d320,
|
||||
0x18024d59, 0xce0866b8, 0x17b401d1, 0xce47759a,
|
||||
0x176619b6, 0xce86ff2a, 0x171895c9, 0xcec702cb,
|
||||
0x16cb76c9, 0xcf077fe1, 0x167ebd74, 0xcf4875ca,
|
||||
0x16326a88, 0xcf89e3e8, 0x15e67ec1, 0xcfcbc999,
|
||||
0x159afadb, 0xd00e2639, 0x154fdf8f, 0xd050f926,
|
||||
0x15052d97, 0xd09441bb, 0x14bae5ab, 0xd0d7ff51,
|
||||
0x14710883, 0xd11c3142, 0x142796d5, 0xd160d6e5,
|
||||
0x13de9156, 0xd1a5ef90, 0x1395f8ba, 0xd1eb7a9a,
|
||||
0x134dcdb4, 0xd2317756, 0x130610f7, 0xd277e518,
|
||||
0x12bec333, 0xd2bec333, 0x1277e518, 0xd30610f7,
|
||||
0x12317756, 0xd34dcdb4, 0x11eb7a9a, 0xd395f8ba,
|
||||
0x11a5ef90, 0xd3de9156, 0x1160d6e5, 0xd42796d5,
|
||||
0x111c3142, 0xd4710883, 0x10d7ff51, 0xd4bae5ab,
|
||||
0x109441bb, 0xd5052d97, 0x1050f926, 0xd54fdf8f,
|
||||
0x100e2639, 0xd59afadb, 0xfcbc999, 0xd5e67ec1,
|
||||
0xf89e3e8, 0xd6326a88, 0xf4875ca, 0xd67ebd74,
|
||||
0xf077fe1, 0xd6cb76c9, 0xec702cb, 0xd71895c9,
|
||||
0xe86ff2a, 0xd76619b6, 0xe47759a, 0xd7b401d1,
|
||||
0xe0866b8, 0xd8024d59, 0xdc9d320, 0xd850fb8e,
|
||||
0xd8bbb6d, 0xd8a00bae, 0xd4e2037, 0xd8ef7cf4,
|
||||
0xd110216, 0xd93f4e9e, 0xcd461a2, 0xd98f7fe6,
|
||||
0xc983f70, 0xd9e01006, 0xc5c9c14, 0xda30fe38,
|
||||
0xc217822, 0xda8249b4, 0xbe6d42b, 0xdad3f1b1,
|
||||
0xbacb0bf, 0xdb25f566, 0xb730e70, 0xdb785409,
|
||||
0xb39edca, 0xdbcb0cce, 0xb014f5b, 0xdc1e1ee9,
|
||||
0xac933ae, 0xdc71898d, 0xa919b4e, 0xdcc54bec,
|
||||
0xa5a86c4, 0xdd196538, 0xa23f698, 0xdd6dd4a2,
|
||||
0x9edeb50, 0xddc29958, 0x9b86572, 0xde17b28a,
|
||||
0x9836582, 0xde6d1f65, 0x94eec03, 0xdec2df18,
|
||||
0x91af976, 0xdf18f0ce, 0x8e78e5b, 0xdf6f53b3,
|
||||
0x8b4ab32, 0xdfc606f1, 0x8825077, 0xe01d09b4,
|
||||
0x8507ea7, 0xe0745b24, 0x81f363d, 0xe0cbfa6a,
|
||||
0x7ee77b3, 0xe123e6ad, 0x7be4381, 0xe17c1f15,
|
||||
0x78e9a1d, 0xe1d4a2c8, 0x75f7bfe, 0xe22d70eb,
|
||||
0x730e997, 0xe28688a4, 0x702e35c, 0xe2dfe917,
|
||||
0x6d569be, 0xe3399167, 0x6a87d2d, 0xe39380b6,
|
||||
0x67c1e18, 0xe3edb628, 0x6504ced, 0xe44830dd,
|
||||
0x6250a18, 0xe4a2eff6, 0x5fa5603, 0xe4fdf294,
|
||||
0x5d03118, 0xe55937d5, 0x5a69bbe, 0xe5b4bed8,
|
||||
0x57d965d, 0xe61086bc, 0x555215a, 0xe66c8e9f,
|
||||
0x52d3d18, 0xe6c8d59c, 0x505e9fb, 0xe7255ad1,
|
||||
0x4df2862, 0xe7821d59, 0x4b8f8ad, 0xe7df1c50,
|
||||
0x4935b3c, 0xe83c56cf, 0x46e5069, 0xe899cbf1,
|
||||
0x449d892, 0xe8f77acf, 0x425f410, 0xe9556282,
|
||||
0x402a33c, 0xe9b38223, 0x3dfe66c, 0xea11d8c8,
|
||||
0x3bdbdf6, 0xea70658a, 0x39c2a2f, 0xeacf277f,
|
||||
0x37b2b6a, 0xeb2e1dbe, 0x35ac1f7, 0xeb8d475b,
|
||||
0x33aee27, 0xebeca36c, 0x31bb049, 0xec4c3106,
|
||||
0x2fd08a9, 0xecabef3d, 0x2def794, 0xed0bdd25,
|
||||
0x2c17d52, 0xed6bf9d1, 0x2a49a2e, 0xedcc4454,
|
||||
0x2884e6e, 0xee2cbbc1, 0x26c9a58, 0xee8d5f29,
|
||||
0x2517e31, 0xeeee2d9d, 0x236fa3b, 0xef4f2630,
|
||||
0x21d0eb8, 0xefb047f2, 0x203bbe8, 0xf01191f3,
|
||||
0x1eb0209, 0xf0730342, 0x1d2e158, 0xf0d49af1,
|
||||
0x1bb5a11, 0xf136580d, 0x1a46c6e, 0xf19839a6,
|
||||
0x18e18a7, 0xf1fa3ecb, 0x1785ef4, 0xf25c6688,
|
||||
0x1633f8a, 0xf2beafed, 0x14eba9d, 0xf3211a07,
|
||||
0x13ad060, 0xf383a3e2, 0x1278104, 0xf3e64c8c,
|
||||
0x114ccb9, 0xf4491311, 0x102b3ac, 0xf4abf67e,
|
||||
0xf1360b, 0xf50ef5de, 0xe05401, 0xf572103d,
|
||||
0xd00db6, 0xf5d544a7, 0xc06355, 0xf6389228,
|
||||
0xb15502, 0xf69bf7c9, 0xa2e2e3, 0xf6ff7496,
|
||||
0x950d1d, 0xf7630799, 0x87d3d0, 0xf7c6afdc,
|
||||
0x7b371e, 0xf82a6c6a, 0x6f3726, 0xf88e3c4d,
|
||||
0x63d405, 0xf8f21e8e, 0x590dd8, 0xf9561237,
|
||||
0x4ee4b8, 0xf9ba1651, 0x4558c0, 0xfa1e29e5,
|
||||
0x3c6a07, 0xfa824bfd, 0x3418a2, 0xfae67ba2,
|
||||
0x2c64a6, 0xfb4ab7db, 0x254e27, 0xfbaeffb3,
|
||||
0x1ed535, 0xfc135231, 0x18f9e1, 0xfc77ae5e,
|
||||
0x13bc39, 0xfcdc1342, 0xf1c4a, 0xfd407fe6,
|
||||
0xb1a20, 0xfda4f351, 0x7b5c4, 0xfe096c8d,
|
||||
0x4ef3f, 0xfe6deaa1, 0x2c697, 0xfed26c94,
|
||||
0x13bd3, 0xff36f170, 0x4ef5, 0xff9b783c,
|
||||
0x0, 0x0, 0x4ef5, 0x6487c4,
|
||||
0x13bd3, 0xc90e90, 0x2c697, 0x12d936c,
|
||||
0x4ef3f, 0x192155f, 0x7b5c4, 0x1f69373,
|
||||
0xb1a20, 0x25b0caf, 0xf1c4a, 0x2bf801a,
|
||||
0x13bc39, 0x323ecbe, 0x18f9e1, 0x38851a2,
|
||||
0x1ed535, 0x3ecadcf, 0x254e27, 0x451004d,
|
||||
0x2c64a6, 0x4b54825, 0x3418a2, 0x519845e,
|
||||
0x3c6a07, 0x57db403, 0x4558c0, 0x5e1d61b,
|
||||
0x4ee4b8, 0x645e9af, 0x590dd8, 0x6a9edc9,
|
||||
0x63d405, 0x70de172, 0x6f3726, 0x771c3b3,
|
||||
0x7b371e, 0x7d59396, 0x87d3d0, 0x8395024,
|
||||
0x950d1d, 0x89cf867, 0xa2e2e3, 0x9008b6a,
|
||||
0xb15502, 0x9640837, 0xc06355, 0x9c76dd8,
|
||||
0xd00db6, 0xa2abb59, 0xe05401, 0xa8defc3,
|
||||
0xf1360b, 0xaf10a22, 0x102b3ac, 0xb540982,
|
||||
0x114ccb9, 0xbb6ecef, 0x1278104, 0xc19b374,
|
||||
0x13ad060, 0xc7c5c1e, 0x14eba9d, 0xcdee5f9,
|
||||
0x1633f8a, 0xd415013, 0x1785ef4, 0xda39978,
|
||||
0x18e18a7, 0xe05c135, 0x1a46c6e, 0xe67c65a,
|
||||
0x1bb5a11, 0xec9a7f3, 0x1d2e158, 0xf2b650f,
|
||||
0x1eb0209, 0xf8cfcbe, 0x203bbe8, 0xfee6e0d,
|
||||
0x21d0eb8, 0x104fb80e, 0x236fa3b, 0x10b0d9d0,
|
||||
0x2517e31, 0x1111d263, 0x26c9a58, 0x1172a0d7,
|
||||
0x2884e6e, 0x11d3443f, 0x2a49a2e, 0x1233bbac,
|
||||
0x2c17d52, 0x1294062f, 0x2def794, 0x12f422db,
|
||||
0x2fd08a9, 0x135410c3, 0x31bb049, 0x13b3cefa,
|
||||
0x33aee27, 0x14135c94, 0x35ac1f7, 0x1472b8a5,
|
||||
0x37b2b6a, 0x14d1e242, 0x39c2a2f, 0x1530d881,
|
||||
0x3bdbdf6, 0x158f9a76, 0x3dfe66c, 0x15ee2738,
|
||||
0x402a33c, 0x164c7ddd, 0x425f410, 0x16aa9d7e,
|
||||
0x449d892, 0x17088531, 0x46e5069, 0x1766340f,
|
||||
0x4935b3c, 0x17c3a931, 0x4b8f8ad, 0x1820e3b0,
|
||||
0x4df2862, 0x187de2a7, 0x505e9fb, 0x18daa52f,
|
||||
0x52d3d18, 0x19372a64, 0x555215a, 0x19937161,
|
||||
0x57d965d, 0x19ef7944, 0x5a69bbe, 0x1a4b4128,
|
||||
0x5d03118, 0x1aa6c82b, 0x5fa5603, 0x1b020d6c,
|
||||
0x6250a18, 0x1b5d100a, 0x6504ced, 0x1bb7cf23,
|
||||
0x67c1e18, 0x1c1249d8, 0x6a87d2d, 0x1c6c7f4a,
|
||||
0x6d569be, 0x1cc66e99, 0x702e35c, 0x1d2016e9,
|
||||
0x730e997, 0x1d79775c, 0x75f7bfe, 0x1dd28f15,
|
||||
0x78e9a1d, 0x1e2b5d38, 0x7be4381, 0x1e83e0eb,
|
||||
0x7ee77b3, 0x1edc1953, 0x81f363d, 0x1f340596,
|
||||
0x8507ea7, 0x1f8ba4dc, 0x8825077, 0x1fe2f64c,
|
||||
0x8b4ab32, 0x2039f90f, 0x8e78e5b, 0x2090ac4d,
|
||||
0x91af976, 0x20e70f32, 0x94eec03, 0x213d20e8,
|
||||
0x9836582, 0x2192e09b, 0x9b86572, 0x21e84d76,
|
||||
0x9edeb50, 0x223d66a8, 0xa23f698, 0x22922b5e,
|
||||
0xa5a86c4, 0x22e69ac8, 0xa919b4e, 0x233ab414,
|
||||
0xac933ae, 0x238e7673, 0xb014f5b, 0x23e1e117,
|
||||
0xb39edca, 0x2434f332, 0xb730e70, 0x2487abf7,
|
||||
0xbacb0bf, 0x24da0a9a, 0xbe6d42b, 0x252c0e4f,
|
||||
0xc217822, 0x257db64c, 0xc5c9c14, 0x25cf01c8,
|
||||
0xc983f70, 0x261feffa, 0xcd461a2, 0x2670801a,
|
||||
0xd110216, 0x26c0b162, 0xd4e2037, 0x2710830c,
|
||||
0xd8bbb6d, 0x275ff452, 0xdc9d320, 0x27af0472,
|
||||
0xe0866b8, 0x27fdb2a7, 0xe47759a, 0x284bfe2f,
|
||||
0xe86ff2a, 0x2899e64a, 0xec702cb, 0x28e76a37,
|
||||
0xf077fe1, 0x29348937, 0xf4875ca, 0x2981428c,
|
||||
0xf89e3e8, 0x29cd9578, 0xfcbc999, 0x2a19813f,
|
||||
0x100e2639, 0x2a650525, 0x1050f926, 0x2ab02071,
|
||||
0x109441bb, 0x2afad269, 0x10d7ff51, 0x2b451a55,
|
||||
0x111c3142, 0x2b8ef77d, 0x1160d6e5, 0x2bd8692b,
|
||||
0x11a5ef90, 0x2c216eaa, 0x11eb7a9a, 0x2c6a0746,
|
||||
0x12317756, 0x2cb2324c, 0x1277e518, 0x2cf9ef09,
|
||||
0x12bec333, 0x2d413ccd, 0x130610f7, 0x2d881ae8,
|
||||
0x134dcdb4, 0x2dce88aa, 0x1395f8ba, 0x2e148566,
|
||||
0x13de9156, 0x2e5a1070, 0x142796d5, 0x2e9f291b,
|
||||
0x14710883, 0x2ee3cebe, 0x14bae5ab, 0x2f2800af,
|
||||
0x15052d97, 0x2f6bbe45, 0x154fdf8f, 0x2faf06da,
|
||||
0x159afadb, 0x2ff1d9c7, 0x15e67ec1, 0x30343667,
|
||||
0x16326a88, 0x30761c18, 0x167ebd74, 0x30b78a36,
|
||||
0x16cb76c9, 0x30f8801f, 0x171895c9, 0x3138fd35,
|
||||
0x176619b6, 0x317900d6, 0x17b401d1, 0x31b88a66,
|
||||
0x18024d59, 0x31f79948, 0x1850fb8e, 0x32362ce0,
|
||||
0x18a00bae, 0x32744493, 0x18ef7cf4, 0x32b1dfc9,
|
||||
0x193f4e9e, 0x32eefdea, 0x198f7fe6, 0x332b9e5e,
|
||||
0x19e01006, 0x3367c090, 0x1a30fe38, 0x33a363ec,
|
||||
0x1a8249b4, 0x33de87de, 0x1ad3f1b1, 0x34192bd5,
|
||||
0x1b25f566, 0x34534f41, 0x1b785409, 0x348cf190,
|
||||
0x1bcb0cce, 0x34c61236, 0x1c1e1ee9, 0x34feb0a5,
|
||||
0x1c71898d, 0x3536cc52, 0x1cc54bec, 0x356e64b2,
|
||||
0x1d196538, 0x35a5793c, 0x1d6dd4a2, 0x35dc0968,
|
||||
0x1dc29958, 0x361214b0, 0x1e17b28a, 0x36479a8e,
|
||||
0x1e6d1f65, 0x367c9a7e, 0x1ec2df18, 0x36b113fd,
|
||||
0x1f18f0ce, 0x36e5068a, 0x1f6f53b3, 0x371871a5,
|
||||
0x1fc606f1, 0x374b54ce, 0x201d09b4, 0x377daf89,
|
||||
0x20745b24, 0x37af8159, 0x20cbfa6a, 0x37e0c9c3,
|
||||
0x2123e6ad, 0x3811884d, 0x217c1f15, 0x3841bc7f,
|
||||
0x21d4a2c8, 0x387165e3, 0x222d70eb, 0x38a08402,
|
||||
0x228688a4, 0x38cf1669, 0x22dfe917, 0x38fd1ca4,
|
||||
0x23399167, 0x392a9642, 0x239380b6, 0x395782d3,
|
||||
0x23edb628, 0x3983e1e8, 0x244830dd, 0x39afb313,
|
||||
0x24a2eff6, 0x39daf5e8, 0x24fdf294, 0x3a05a9fd,
|
||||
0x255937d5, 0x3a2fcee8, 0x25b4bed8, 0x3a596442,
|
||||
0x261086bc, 0x3a8269a3, 0x266c8e9f, 0x3aaadea6,
|
||||
0x26c8d59c, 0x3ad2c2e8, 0x27255ad1, 0x3afa1605,
|
||||
0x27821d59, 0x3b20d79e, 0x27df1c50, 0x3b470753,
|
||||
0x283c56cf, 0x3b6ca4c4, 0x2899cbf1, 0x3b91af97,
|
||||
0x28f77acf, 0x3bb6276e, 0x29556282, 0x3bda0bf0,
|
||||
0x29b38223, 0x3bfd5cc4, 0x2a11d8c8, 0x3c201994,
|
||||
0x2a70658a, 0x3c42420a, 0x2acf277f, 0x3c63d5d1,
|
||||
0x2b2e1dbe, 0x3c84d496, 0x2b8d475b, 0x3ca53e09,
|
||||
0x2beca36c, 0x3cc511d9, 0x2c4c3106, 0x3ce44fb7,
|
||||
0x2cabef3d, 0x3d02f757, 0x2d0bdd25, 0x3d21086c,
|
||||
0x2d6bf9d1, 0x3d3e82ae, 0x2dcc4454, 0x3d5b65d2,
|
||||
0x2e2cbbc1, 0x3d77b192, 0x2e8d5f29, 0x3d9365a8,
|
||||
0x2eee2d9d, 0x3dae81cf, 0x2f4f2630, 0x3dc905c5,
|
||||
0x2fb047f2, 0x3de2f148, 0x301191f3, 0x3dfc4418,
|
||||
0x30730342, 0x3e14fdf7, 0x30d49af1, 0x3e2d1ea8,
|
||||
0x3136580d, 0x3e44a5ef, 0x319839a6, 0x3e5b9392,
|
||||
0x31fa3ecb, 0x3e71e759, 0x325c6688, 0x3e87a10c,
|
||||
0x32beafed, 0x3e9cc076, 0x33211a07, 0x3eb14563,
|
||||
0x3383a3e2, 0x3ec52fa0, 0x33e64c8c, 0x3ed87efc,
|
||||
0x34491311, 0x3eeb3347, 0x34abf67e, 0x3efd4c54,
|
||||
0x350ef5de, 0x3f0ec9f5, 0x3572103d, 0x3f1fabff,
|
||||
0x35d544a7, 0x3f2ff24a, 0x36389228, 0x3f3f9cab,
|
||||
0x369bf7c9, 0x3f4eaafe, 0x36ff7496, 0x3f5d1d1d,
|
||||
0x37630799, 0x3f6af2e3, 0x37c6afdc, 0x3f782c30,
|
||||
0x382a6c6a, 0x3f84c8e2, 0x388e3c4d, 0x3f90c8da,
|
||||
0x38f21e8e, 0x3f9c2bfb, 0x39561237, 0x3fa6f228,
|
||||
0x39ba1651, 0x3fb11b48, 0x3a1e29e5, 0x3fbaa740,
|
||||
0x3a824bfd, 0x3fc395f9, 0x3ae67ba2, 0x3fcbe75e,
|
||||
0x3b4ab7db, 0x3fd39b5a, 0x3baeffb3, 0x3fdab1d9,
|
||||
0x3c135231, 0x3fe12acb, 0x3c77ae5e, 0x3fe7061f,
|
||||
0x3cdc1342, 0x3fec43c7, 0x3d407fe6, 0x3ff0e3b6,
|
||||
0x3da4f351, 0x3ff4e5e0, 0x3e096c8d, 0x3ff84a3c,
|
||||
0x3e6deaa1, 0x3ffb10c1, 0x3ed26c94, 0x3ffd3969,
|
||||
0x3f36f170, 0x3ffec42d, 0x3f9b783c, 0x3fffb10b
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* \par
|
||||
* Generation of realCoefBQ31 array:
|
||||
* \par
|
||||
* n = 512
|
||||
* <pre>for (i = 0; i < n; i++)
|
||||
* {
|
||||
* pBTable[2 * i] = 0.5 * (1.0 + sin (2 * PI / (double) (2 * n) * (double) i));
|
||||
* pBTable[2 * i + 1] = 0.5 * (1.0 * cos (2 * PI / (double) (2 * n) * (double) i));
|
||||
* } </pre>
|
||||
* \par
|
||||
* Convert to fixed point Q31 format
|
||||
* round(pBTable[i] * pow(2, 31))
|
||||
*
|
||||
*/
|
||||
|
||||
const q31_t realCoefBQ31[1024] = {
|
||||
0x40000000, 0x40000000, 0x406487c4, 0x3fffb10b,
|
||||
0x40c90e90, 0x3ffec42d, 0x412d936c, 0x3ffd3969,
|
||||
0x4192155f, 0x3ffb10c1, 0x41f69373, 0x3ff84a3c,
|
||||
0x425b0caf, 0x3ff4e5e0, 0x42bf801a, 0x3ff0e3b6,
|
||||
0x4323ecbe, 0x3fec43c7, 0x438851a2, 0x3fe7061f,
|
||||
0x43ecadcf, 0x3fe12acb, 0x4451004d, 0x3fdab1d9,
|
||||
0x44b54825, 0x3fd39b5a, 0x4519845e, 0x3fcbe75e,
|
||||
0x457db403, 0x3fc395f9, 0x45e1d61b, 0x3fbaa740,
|
||||
0x4645e9af, 0x3fb11b48, 0x46a9edc9, 0x3fa6f228,
|
||||
0x470de172, 0x3f9c2bfb, 0x4771c3b3, 0x3f90c8da,
|
||||
0x47d59396, 0x3f84c8e2, 0x48395024, 0x3f782c30,
|
||||
0x489cf867, 0x3f6af2e3, 0x49008b6a, 0x3f5d1d1d,
|
||||
0x49640837, 0x3f4eaafe, 0x49c76dd8, 0x3f3f9cab,
|
||||
0x4a2abb59, 0x3f2ff24a, 0x4a8defc3, 0x3f1fabff,
|
||||
0x4af10a22, 0x3f0ec9f5, 0x4b540982, 0x3efd4c54,
|
||||
0x4bb6ecef, 0x3eeb3347, 0x4c19b374, 0x3ed87efc,
|
||||
0x4c7c5c1e, 0x3ec52fa0, 0x4cdee5f9, 0x3eb14563,
|
||||
0x4d415013, 0x3e9cc076, 0x4da39978, 0x3e87a10c,
|
||||
0x4e05c135, 0x3e71e759, 0x4e67c65a, 0x3e5b9392,
|
||||
0x4ec9a7f3, 0x3e44a5ef, 0x4f2b650f, 0x3e2d1ea8,
|
||||
0x4f8cfcbe, 0x3e14fdf7, 0x4fee6e0d, 0x3dfc4418,
|
||||
0x504fb80e, 0x3de2f148, 0x50b0d9d0, 0x3dc905c5,
|
||||
0x5111d263, 0x3dae81cf, 0x5172a0d7, 0x3d9365a8,
|
||||
0x51d3443f, 0x3d77b192, 0x5233bbac, 0x3d5b65d2,
|
||||
0x5294062f, 0x3d3e82ae, 0x52f422db, 0x3d21086c,
|
||||
0x535410c3, 0x3d02f757, 0x53b3cefa, 0x3ce44fb7,
|
||||
0x54135c94, 0x3cc511d9, 0x5472b8a5, 0x3ca53e09,
|
||||
0x54d1e242, 0x3c84d496, 0x5530d881, 0x3c63d5d1,
|
||||
0x558f9a76, 0x3c42420a, 0x55ee2738, 0x3c201994,
|
||||
0x564c7ddd, 0x3bfd5cc4, 0x56aa9d7e, 0x3bda0bf0,
|
||||
0x57088531, 0x3bb6276e, 0x5766340f, 0x3b91af97,
|
||||
0x57c3a931, 0x3b6ca4c4, 0x5820e3b0, 0x3b470753,
|
||||
0x587de2a7, 0x3b20d79e, 0x58daa52f, 0x3afa1605,
|
||||
0x59372a64, 0x3ad2c2e8, 0x59937161, 0x3aaadea6,
|
||||
0x59ef7944, 0x3a8269a3, 0x5a4b4128, 0x3a596442,
|
||||
0x5aa6c82b, 0x3a2fcee8, 0x5b020d6c, 0x3a05a9fd,
|
||||
0x5b5d100a, 0x39daf5e8, 0x5bb7cf23, 0x39afb313,
|
||||
0x5c1249d8, 0x3983e1e8, 0x5c6c7f4a, 0x395782d3,
|
||||
0x5cc66e99, 0x392a9642, 0x5d2016e9, 0x38fd1ca4,
|
||||
0x5d79775c, 0x38cf1669, 0x5dd28f15, 0x38a08402,
|
||||
0x5e2b5d38, 0x387165e3, 0x5e83e0eb, 0x3841bc7f,
|
||||
0x5edc1953, 0x3811884d, 0x5f340596, 0x37e0c9c3,
|
||||
0x5f8ba4dc, 0x37af8159, 0x5fe2f64c, 0x377daf89,
|
||||
0x6039f90f, 0x374b54ce, 0x6090ac4d, 0x371871a5,
|
||||
0x60e70f32, 0x36e5068a, 0x613d20e8, 0x36b113fd,
|
||||
0x6192e09b, 0x367c9a7e, 0x61e84d76, 0x36479a8e,
|
||||
0x623d66a8, 0x361214b0, 0x62922b5e, 0x35dc0968,
|
||||
0x62e69ac8, 0x35a5793c, 0x633ab414, 0x356e64b2,
|
||||
0x638e7673, 0x3536cc52, 0x63e1e117, 0x34feb0a5,
|
||||
0x6434f332, 0x34c61236, 0x6487abf7, 0x348cf190,
|
||||
0x64da0a9a, 0x34534f41, 0x652c0e4f, 0x34192bd5,
|
||||
0x657db64c, 0x33de87de, 0x65cf01c8, 0x33a363ec,
|
||||
0x661feffa, 0x3367c090, 0x6670801a, 0x332b9e5e,
|
||||
0x66c0b162, 0x32eefdea, 0x6710830c, 0x32b1dfc9,
|
||||
0x675ff452, 0x32744493, 0x67af0472, 0x32362ce0,
|
||||
0x67fdb2a7, 0x31f79948, 0x684bfe2f, 0x31b88a66,
|
||||
0x6899e64a, 0x317900d6, 0x68e76a37, 0x3138fd35,
|
||||
0x69348937, 0x30f8801f, 0x6981428c, 0x30b78a36,
|
||||
0x69cd9578, 0x30761c18, 0x6a19813f, 0x30343667,
|
||||
0x6a650525, 0x2ff1d9c7, 0x6ab02071, 0x2faf06da,
|
||||
0x6afad269, 0x2f6bbe45, 0x6b451a55, 0x2f2800af,
|
||||
0x6b8ef77d, 0x2ee3cebe, 0x6bd8692b, 0x2e9f291b,
|
||||
0x6c216eaa, 0x2e5a1070, 0x6c6a0746, 0x2e148566,
|
||||
0x6cb2324c, 0x2dce88aa, 0x6cf9ef09, 0x2d881ae8,
|
||||
0x6d413ccd, 0x2d413ccd, 0x6d881ae8, 0x2cf9ef09,
|
||||
0x6dce88aa, 0x2cb2324c, 0x6e148566, 0x2c6a0746,
|
||||
0x6e5a1070, 0x2c216eaa, 0x6e9f291b, 0x2bd8692b,
|
||||
0x6ee3cebe, 0x2b8ef77d, 0x6f2800af, 0x2b451a55,
|
||||
0x6f6bbe45, 0x2afad269, 0x6faf06da, 0x2ab02071,
|
||||
0x6ff1d9c7, 0x2a650525, 0x70343667, 0x2a19813f,
|
||||
0x70761c18, 0x29cd9578, 0x70b78a36, 0x2981428c,
|
||||
0x70f8801f, 0x29348937, 0x7138fd35, 0x28e76a37,
|
||||
0x717900d6, 0x2899e64a, 0x71b88a66, 0x284bfe2f,
|
||||
0x71f79948, 0x27fdb2a7, 0x72362ce0, 0x27af0472,
|
||||
0x72744493, 0x275ff452, 0x72b1dfc9, 0x2710830c,
|
||||
0x72eefdea, 0x26c0b162, 0x732b9e5e, 0x2670801a,
|
||||
0x7367c090, 0x261feffa, 0x73a363ec, 0x25cf01c8,
|
||||
0x73de87de, 0x257db64c, 0x74192bd5, 0x252c0e4f,
|
||||
0x74534f41, 0x24da0a9a, 0x748cf190, 0x2487abf7,
|
||||
0x74c61236, 0x2434f332, 0x74feb0a5, 0x23e1e117,
|
||||
0x7536cc52, 0x238e7673, 0x756e64b2, 0x233ab414,
|
||||
0x75a5793c, 0x22e69ac8, 0x75dc0968, 0x22922b5e,
|
||||
0x761214b0, 0x223d66a8, 0x76479a8e, 0x21e84d76,
|
||||
0x767c9a7e, 0x2192e09b, 0x76b113fd, 0x213d20e8,
|
||||
0x76e5068a, 0x20e70f32, 0x771871a5, 0x2090ac4d,
|
||||
0x774b54ce, 0x2039f90f, 0x777daf89, 0x1fe2f64c,
|
||||
0x77af8159, 0x1f8ba4dc, 0x77e0c9c3, 0x1f340596,
|
||||
0x7811884d, 0x1edc1953, 0x7841bc7f, 0x1e83e0eb,
|
||||
0x787165e3, 0x1e2b5d38, 0x78a08402, 0x1dd28f15,
|
||||
0x78cf1669, 0x1d79775c, 0x78fd1ca4, 0x1d2016e9,
|
||||
0x792a9642, 0x1cc66e99, 0x795782d3, 0x1c6c7f4a,
|
||||
0x7983e1e8, 0x1c1249d8, 0x79afb313, 0x1bb7cf23,
|
||||
0x79daf5e8, 0x1b5d100a, 0x7a05a9fd, 0x1b020d6c,
|
||||
0x7a2fcee8, 0x1aa6c82b, 0x7a596442, 0x1a4b4128,
|
||||
0x7a8269a3, 0x19ef7944, 0x7aaadea6, 0x19937161,
|
||||
0x7ad2c2e8, 0x19372a64, 0x7afa1605, 0x18daa52f,
|
||||
0x7b20d79e, 0x187de2a7, 0x7b470753, 0x1820e3b0,
|
||||
0x7b6ca4c4, 0x17c3a931, 0x7b91af97, 0x1766340f,
|
||||
0x7bb6276e, 0x17088531, 0x7bda0bf0, 0x16aa9d7e,
|
||||
0x7bfd5cc4, 0x164c7ddd, 0x7c201994, 0x15ee2738,
|
||||
0x7c42420a, 0x158f9a76, 0x7c63d5d1, 0x1530d881,
|
||||
0x7c84d496, 0x14d1e242, 0x7ca53e09, 0x1472b8a5,
|
||||
0x7cc511d9, 0x14135c94, 0x7ce44fb7, 0x13b3cefa,
|
||||
0x7d02f757, 0x135410c3, 0x7d21086c, 0x12f422db,
|
||||
0x7d3e82ae, 0x1294062f, 0x7d5b65d2, 0x1233bbac,
|
||||
0x7d77b192, 0x11d3443f, 0x7d9365a8, 0x1172a0d7,
|
||||
0x7dae81cf, 0x1111d263, 0x7dc905c5, 0x10b0d9d0,
|
||||
0x7de2f148, 0x104fb80e, 0x7dfc4418, 0xfee6e0d,
|
||||
0x7e14fdf7, 0xf8cfcbe, 0x7e2d1ea8, 0xf2b650f,
|
||||
0x7e44a5ef, 0xec9a7f3, 0x7e5b9392, 0xe67c65a,
|
||||
0x7e71e759, 0xe05c135, 0x7e87a10c, 0xda39978,
|
||||
0x7e9cc076, 0xd415013, 0x7eb14563, 0xcdee5f9,
|
||||
0x7ec52fa0, 0xc7c5c1e, 0x7ed87efc, 0xc19b374,
|
||||
0x7eeb3347, 0xbb6ecef, 0x7efd4c54, 0xb540982,
|
||||
0x7f0ec9f5, 0xaf10a22, 0x7f1fabff, 0xa8defc3,
|
||||
0x7f2ff24a, 0xa2abb59, 0x7f3f9cab, 0x9c76dd8,
|
||||
0x7f4eaafe, 0x9640837, 0x7f5d1d1d, 0x9008b6a,
|
||||
0x7f6af2e3, 0x89cf867, 0x7f782c30, 0x8395024,
|
||||
0x7f84c8e2, 0x7d59396, 0x7f90c8da, 0x771c3b3,
|
||||
0x7f9c2bfb, 0x70de172, 0x7fa6f228, 0x6a9edc9,
|
||||
0x7fb11b48, 0x645e9af, 0x7fbaa740, 0x5e1d61b,
|
||||
0x7fc395f9, 0x57db403, 0x7fcbe75e, 0x519845e,
|
||||
0x7fd39b5a, 0x4b54825, 0x7fdab1d9, 0x451004d,
|
||||
0x7fe12acb, 0x3ecadcf, 0x7fe7061f, 0x38851a2,
|
||||
0x7fec43c7, 0x323ecbe, 0x7ff0e3b6, 0x2bf801a,
|
||||
0x7ff4e5e0, 0x25b0caf, 0x7ff84a3c, 0x1f69373,
|
||||
0x7ffb10c1, 0x192155f, 0x7ffd3969, 0x12d936c,
|
||||
0x7ffec42d, 0xc90e90, 0x7fffb10b, 0x6487c4,
|
||||
0x7fffffff, 0x0, 0x7fffb10b, 0xff9b783c,
|
||||
0x7ffec42d, 0xff36f170, 0x7ffd3969, 0xfed26c94,
|
||||
0x7ffb10c1, 0xfe6deaa1, 0x7ff84a3c, 0xfe096c8d,
|
||||
0x7ff4e5e0, 0xfda4f351, 0x7ff0e3b6, 0xfd407fe6,
|
||||
0x7fec43c7, 0xfcdc1342, 0x7fe7061f, 0xfc77ae5e,
|
||||
0x7fe12acb, 0xfc135231, 0x7fdab1d9, 0xfbaeffb3,
|
||||
0x7fd39b5a, 0xfb4ab7db, 0x7fcbe75e, 0xfae67ba2,
|
||||
0x7fc395f9, 0xfa824bfd, 0x7fbaa740, 0xfa1e29e5,
|
||||
0x7fb11b48, 0xf9ba1651, 0x7fa6f228, 0xf9561237,
|
||||
0x7f9c2bfb, 0xf8f21e8e, 0x7f90c8da, 0xf88e3c4d,
|
||||
0x7f84c8e2, 0xf82a6c6a, 0x7f782c30, 0xf7c6afdc,
|
||||
0x7f6af2e3, 0xf7630799, 0x7f5d1d1d, 0xf6ff7496,
|
||||
0x7f4eaafe, 0xf69bf7c9, 0x7f3f9cab, 0xf6389228,
|
||||
0x7f2ff24a, 0xf5d544a7, 0x7f1fabff, 0xf572103d,
|
||||
0x7f0ec9f5, 0xf50ef5de, 0x7efd4c54, 0xf4abf67e,
|
||||
0x7eeb3347, 0xf4491311, 0x7ed87efc, 0xf3e64c8c,
|
||||
0x7ec52fa0, 0xf383a3e2, 0x7eb14563, 0xf3211a07,
|
||||
0x7e9cc076, 0xf2beafed, 0x7e87a10c, 0xf25c6688,
|
||||
0x7e71e759, 0xf1fa3ecb, 0x7e5b9392, 0xf19839a6,
|
||||
0x7e44a5ef, 0xf136580d, 0x7e2d1ea8, 0xf0d49af1,
|
||||
0x7e14fdf7, 0xf0730342, 0x7dfc4418, 0xf01191f3,
|
||||
0x7de2f148, 0xefb047f2, 0x7dc905c5, 0xef4f2630,
|
||||
0x7dae81cf, 0xeeee2d9d, 0x7d9365a8, 0xee8d5f29,
|
||||
0x7d77b192, 0xee2cbbc1, 0x7d5b65d2, 0xedcc4454,
|
||||
0x7d3e82ae, 0xed6bf9d1, 0x7d21086c, 0xed0bdd25,
|
||||
0x7d02f757, 0xecabef3d, 0x7ce44fb7, 0xec4c3106,
|
||||
0x7cc511d9, 0xebeca36c, 0x7ca53e09, 0xeb8d475b,
|
||||
0x7c84d496, 0xeb2e1dbe, 0x7c63d5d1, 0xeacf277f,
|
||||
0x7c42420a, 0xea70658a, 0x7c201994, 0xea11d8c8,
|
||||
0x7bfd5cc4, 0xe9b38223, 0x7bda0bf0, 0xe9556282,
|
||||
0x7bb6276e, 0xe8f77acf, 0x7b91af97, 0xe899cbf1,
|
||||
0x7b6ca4c4, 0xe83c56cf, 0x7b470753, 0xe7df1c50,
|
||||
0x7b20d79e, 0xe7821d59, 0x7afa1605, 0xe7255ad1,
|
||||
0x7ad2c2e8, 0xe6c8d59c, 0x7aaadea6, 0xe66c8e9f,
|
||||
0x7a8269a3, 0xe61086bc, 0x7a596442, 0xe5b4bed8,
|
||||
0x7a2fcee8, 0xe55937d5, 0x7a05a9fd, 0xe4fdf294,
|
||||
0x79daf5e8, 0xe4a2eff6, 0x79afb313, 0xe44830dd,
|
||||
0x7983e1e8, 0xe3edb628, 0x795782d3, 0xe39380b6,
|
||||
0x792a9642, 0xe3399167, 0x78fd1ca4, 0xe2dfe917,
|
||||
0x78cf1669, 0xe28688a4, 0x78a08402, 0xe22d70eb,
|
||||
0x787165e3, 0xe1d4a2c8, 0x7841bc7f, 0xe17c1f15,
|
||||
0x7811884d, 0xe123e6ad, 0x77e0c9c3, 0xe0cbfa6a,
|
||||
0x77af8159, 0xe0745b24, 0x777daf89, 0xe01d09b4,
|
||||
0x774b54ce, 0xdfc606f1, 0x771871a5, 0xdf6f53b3,
|
||||
0x76e5068a, 0xdf18f0ce, 0x76b113fd, 0xdec2df18,
|
||||
0x767c9a7e, 0xde6d1f65, 0x76479a8e, 0xde17b28a,
|
||||
0x761214b0, 0xddc29958, 0x75dc0968, 0xdd6dd4a2,
|
||||
0x75a5793c, 0xdd196538, 0x756e64b2, 0xdcc54bec,
|
||||
0x7536cc52, 0xdc71898d, 0x74feb0a5, 0xdc1e1ee9,
|
||||
0x74c61236, 0xdbcb0cce, 0x748cf190, 0xdb785409,
|
||||
0x74534f41, 0xdb25f566, 0x74192bd5, 0xdad3f1b1,
|
||||
0x73de87de, 0xda8249b4, 0x73a363ec, 0xda30fe38,
|
||||
0x7367c090, 0xd9e01006, 0x732b9e5e, 0xd98f7fe6,
|
||||
0x72eefdea, 0xd93f4e9e, 0x72b1dfc9, 0xd8ef7cf4,
|
||||
0x72744493, 0xd8a00bae, 0x72362ce0, 0xd850fb8e,
|
||||
0x71f79948, 0xd8024d59, 0x71b88a66, 0xd7b401d1,
|
||||
0x717900d6, 0xd76619b6, 0x7138fd35, 0xd71895c9,
|
||||
0x70f8801f, 0xd6cb76c9, 0x70b78a36, 0xd67ebd74,
|
||||
0x70761c18, 0xd6326a88, 0x70343667, 0xd5e67ec1,
|
||||
0x6ff1d9c7, 0xd59afadb, 0x6faf06da, 0xd54fdf8f,
|
||||
0x6f6bbe45, 0xd5052d97, 0x6f2800af, 0xd4bae5ab,
|
||||
0x6ee3cebe, 0xd4710883, 0x6e9f291b, 0xd42796d5,
|
||||
0x6e5a1070, 0xd3de9156, 0x6e148566, 0xd395f8ba,
|
||||
0x6dce88aa, 0xd34dcdb4, 0x6d881ae8, 0xd30610f7,
|
||||
0x6d413ccd, 0xd2bec333, 0x6cf9ef09, 0xd277e518,
|
||||
0x6cb2324c, 0xd2317756, 0x6c6a0746, 0xd1eb7a9a,
|
||||
0x6c216eaa, 0xd1a5ef90, 0x6bd8692b, 0xd160d6e5,
|
||||
0x6b8ef77d, 0xd11c3142, 0x6b451a55, 0xd0d7ff51,
|
||||
0x6afad269, 0xd09441bb, 0x6ab02071, 0xd050f926,
|
||||
0x6a650525, 0xd00e2639, 0x6a19813f, 0xcfcbc999,
|
||||
0x69cd9578, 0xcf89e3e8, 0x6981428c, 0xcf4875ca,
|
||||
0x69348937, 0xcf077fe1, 0x68e76a37, 0xcec702cb,
|
||||
0x6899e64a, 0xce86ff2a, 0x684bfe2f, 0xce47759a,
|
||||
0x67fdb2a7, 0xce0866b8, 0x67af0472, 0xcdc9d320,
|
||||
0x675ff452, 0xcd8bbb6d, 0x6710830c, 0xcd4e2037,
|
||||
0x66c0b162, 0xcd110216, 0x6670801a, 0xccd461a2,
|
||||
0x661feffa, 0xcc983f70, 0x65cf01c8, 0xcc5c9c14,
|
||||
0x657db64c, 0xcc217822, 0x652c0e4f, 0xcbe6d42b,
|
||||
0x64da0a9a, 0xcbacb0bf, 0x6487abf7, 0xcb730e70,
|
||||
0x6434f332, 0xcb39edca, 0x63e1e117, 0xcb014f5b,
|
||||
0x638e7673, 0xcac933ae, 0x633ab414, 0xca919b4e,
|
||||
0x62e69ac8, 0xca5a86c4, 0x62922b5e, 0xca23f698,
|
||||
0x623d66a8, 0xc9edeb50, 0x61e84d76, 0xc9b86572,
|
||||
0x6192e09b, 0xc9836582, 0x613d20e8, 0xc94eec03,
|
||||
0x60e70f32, 0xc91af976, 0x6090ac4d, 0xc8e78e5b,
|
||||
0x6039f90f, 0xc8b4ab32, 0x5fe2f64c, 0xc8825077,
|
||||
0x5f8ba4dc, 0xc8507ea7, 0x5f340596, 0xc81f363d,
|
||||
0x5edc1953, 0xc7ee77b3, 0x5e83e0eb, 0xc7be4381,
|
||||
0x5e2b5d38, 0xc78e9a1d, 0x5dd28f15, 0xc75f7bfe,
|
||||
0x5d79775c, 0xc730e997, 0x5d2016e9, 0xc702e35c,
|
||||
0x5cc66e99, 0xc6d569be, 0x5c6c7f4a, 0xc6a87d2d,
|
||||
0x5c1249d8, 0xc67c1e18, 0x5bb7cf23, 0xc6504ced,
|
||||
0x5b5d100a, 0xc6250a18, 0x5b020d6c, 0xc5fa5603,
|
||||
0x5aa6c82b, 0xc5d03118, 0x5a4b4128, 0xc5a69bbe,
|
||||
0x59ef7944, 0xc57d965d, 0x59937161, 0xc555215a,
|
||||
0x59372a64, 0xc52d3d18, 0x58daa52f, 0xc505e9fb,
|
||||
0x587de2a7, 0xc4df2862, 0x5820e3b0, 0xc4b8f8ad,
|
||||
0x57c3a931, 0xc4935b3c, 0x5766340f, 0xc46e5069,
|
||||
0x57088531, 0xc449d892, 0x56aa9d7e, 0xc425f410,
|
||||
0x564c7ddd, 0xc402a33c, 0x55ee2738, 0xc3dfe66c,
|
||||
0x558f9a76, 0xc3bdbdf6, 0x5530d881, 0xc39c2a2f,
|
||||
0x54d1e242, 0xc37b2b6a, 0x5472b8a5, 0xc35ac1f7,
|
||||
0x54135c94, 0xc33aee27, 0x53b3cefa, 0xc31bb049,
|
||||
0x535410c3, 0xc2fd08a9, 0x52f422db, 0xc2def794,
|
||||
0x5294062f, 0xc2c17d52, 0x5233bbac, 0xc2a49a2e,
|
||||
0x51d3443f, 0xc2884e6e, 0x5172a0d7, 0xc26c9a58,
|
||||
0x5111d263, 0xc2517e31, 0x50b0d9d0, 0xc236fa3b,
|
||||
0x504fb80e, 0xc21d0eb8, 0x4fee6e0d, 0xc203bbe8,
|
||||
0x4f8cfcbe, 0xc1eb0209, 0x4f2b650f, 0xc1d2e158,
|
||||
0x4ec9a7f3, 0xc1bb5a11, 0x4e67c65a, 0xc1a46c6e,
|
||||
0x4e05c135, 0xc18e18a7, 0x4da39978, 0xc1785ef4,
|
||||
0x4d415013, 0xc1633f8a, 0x4cdee5f9, 0xc14eba9d,
|
||||
0x4c7c5c1e, 0xc13ad060, 0x4c19b374, 0xc1278104,
|
||||
0x4bb6ecef, 0xc114ccb9, 0x4b540982, 0xc102b3ac,
|
||||
0x4af10a22, 0xc0f1360b, 0x4a8defc3, 0xc0e05401,
|
||||
0x4a2abb59, 0xc0d00db6, 0x49c76dd8, 0xc0c06355,
|
||||
0x49640837, 0xc0b15502, 0x49008b6a, 0xc0a2e2e3,
|
||||
0x489cf867, 0xc0950d1d, 0x48395024, 0xc087d3d0,
|
||||
0x47d59396, 0xc07b371e, 0x4771c3b3, 0xc06f3726,
|
||||
0x470de172, 0xc063d405, 0x46a9edc9, 0xc0590dd8,
|
||||
0x4645e9af, 0xc04ee4b8, 0x45e1d61b, 0xc04558c0,
|
||||
0x457db403, 0xc03c6a07, 0x4519845e, 0xc03418a2,
|
||||
0x44b54825, 0xc02c64a6, 0x4451004d, 0xc0254e27,
|
||||
0x43ecadcf, 0xc01ed535, 0x438851a2, 0xc018f9e1,
|
||||
0x4323ecbe, 0xc013bc39, 0x42bf801a, 0xc00f1c4a,
|
||||
0x425b0caf, 0xc00b1a20, 0x41f69373, 0xc007b5c4,
|
||||
0x4192155f, 0xc004ef3f, 0x412d936c, 0xc002c697,
|
||||
0x40c90e90, 0xc0013bd3, 0x406487c4, 0xc0004ef5
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Initialization function for the Q31 RFFT/RIFFT.
|
||||
* @param[in, out] *S points to an instance of the Q31 RFFT/RIFFT structure.
|
||||
* @param[in, out] *S_CFFT points to an instance of the Q31 CFFT/CIFFT structure.
|
||||
* @param[in] fftLenReal length of the FFT.
|
||||
* @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform.
|
||||
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output.
|
||||
* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLenReal</code> is not a supported value.
|
||||
*
|
||||
* \par Description:
|
||||
* \par
|
||||
* The parameter <code>fftLenReal</code> Specifies length of RFFT/RIFFT Process. Supported FFT Lengths are 128, 512, 2048.
|
||||
* \par
|
||||
* The parameter <code>ifftFlagR</code> controls whether a forward or inverse transform is computed.
|
||||
* Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated.
|
||||
* \par
|
||||
* The parameter <code>bitReverseFlag</code> controls whether output is in normal order or bit reversed order.
|
||||
* Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order.
|
||||
* \par
|
||||
* This function also initializes Twiddle factor table.
|
||||
*/
|
||||
|
||||
arm_status arm_rfft_init_q31(
|
||||
arm_rfft_instance_q31 * S,
|
||||
arm_cfft_radix4_instance_q31 * S_CFFT,
|
||||
uint32_t fftLenReal,
|
||||
uint32_t ifftFlagR,
|
||||
uint32_t bitReverseFlag)
|
||||
{
|
||||
/* Initialise the default arm status */
|
||||
arm_status status = ARM_MATH_SUCCESS;
|
||||
|
||||
/* Initialize the Real FFT length */
|
||||
S->fftLenReal = (uint16_t) fftLenReal;
|
||||
|
||||
/* Initialize the Complex FFT length */
|
||||
S->fftLenBy2 = (uint16_t) fftLenReal / 2u;
|
||||
|
||||
/* Initialize the Twiddle coefficientA pointer */
|
||||
S->pTwiddleAReal = (q31_t *) realCoefAQ31;
|
||||
|
||||
/* Initialize the Twiddle coefficientB pointer */
|
||||
S->pTwiddleBReal = (q31_t *) realCoefBQ31;
|
||||
|
||||
/* Initialize the Flag for selection of RFFT or RIFFT */
|
||||
S->ifftFlagR = (uint8_t) ifftFlagR;
|
||||
|
||||
/* Initialize the Flag for calculation Bit reversal or not */
|
||||
S->bitReverseFlagR = (uint8_t) bitReverseFlag;
|
||||
|
||||
/* Initialization of coef modifier depending on the FFT length */
|
||||
switch (S->fftLenReal)
|
||||
{
|
||||
case 512u:
|
||||
S->twidCoefRModifier = 2u;
|
||||
break;
|
||||
case 128u:
|
||||
S->twidCoefRModifier = 8u;
|
||||
break;
|
||||
default:
|
||||
/* Reporting argument error if rfftSize is not valid value */
|
||||
status = ARM_MATH_ARGUMENT_ERROR;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Init Complex FFT Instance */
|
||||
S->pCfft = S_CFFT;
|
||||
|
||||
if(S->ifftFlagR)
|
||||
{
|
||||
/* Initializes the CIFFT Module for fftLenreal/2 length */
|
||||
arm_cfft_radix4_init_q31(S->pCfft, (uint16_t) S->fftLenBy2, 1u, 1u);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Initializes the CFFT Module for fftLenreal/2 length */
|
||||
arm_cfft_radix4_init_q31(S->pCfft, (uint16_t) S->fftLenBy2, 0u, 1u);
|
||||
}
|
||||
|
||||
/* return the status of RFFT Init function */
|
||||
return (status);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @} end of RFFT_RIFFT group
|
||||
*/
|
@ -0,0 +1,457 @@
|
||||
/* ----------------------------------------------------------------------
|
||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
||||
*
|
||||
* $Date: 15. July 2011
|
||||
* $Revision: V1.0.10
|
||||
*
|
||||
* Project: CMSIS DSP Library
|
||||
* Title: arm_rfft_q15.c
|
||||
*
|
||||
* Description: RFFT & RIFFT Q15 process function
|
||||
*
|
||||
*
|
||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
||||
*
|
||||
* Version 1.0.10 2011/7/15
|
||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
||||
*
|
||||
* Version 1.0.3 2010/11/29
|
||||
* Re-organized the CMSIS folders and updated documentation.
|
||||
*
|
||||
* Version 1.0.2 2010/11/11
|
||||
* Documentation updated.
|
||||
*
|
||||
* Version 1.0.1 2010/10/05
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 1.0.0 2010/09/20
|
||||
* Production release and review comments incorporated
|
||||
*
|
||||
* Version 0.0.7 2010/06/10
|
||||
* Misra-C changes done
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
|
||||
#include "arm_math.h"
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
* Internal functions prototypes
|
||||
--------------------------------------------------------------------*/
|
||||
|
||||
void arm_split_rfft_q15(
|
||||
q15_t * pSrc,
|
||||
uint32_t fftLen,
|
||||
q15_t * pATable,
|
||||
q15_t * pBTable,
|
||||
q15_t * pDst,
|
||||
uint32_t modifier);
|
||||
|
||||
void arm_split_rifft_q15(
|
||||
q15_t * pSrc,
|
||||
uint32_t fftLen,
|
||||
q15_t * pATable,
|
||||
q15_t * pBTable,
|
||||
q15_t * pDst,
|
||||
uint32_t modifier);
|
||||
|
||||
/**
|
||||
* @addtogroup RFFT_RIFFT
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Processing function for the Q15 RFFT/RIFFT.
|
||||
* @param[in] *S points to an instance of the Q15 RFFT/RIFFT structure.
|
||||
* @param[in] *pSrc points to the input buffer.
|
||||
* @param[out] *pDst points to the output buffer.
|
||||
* @return none.
|
||||
*
|
||||
* \par Input an output formats:
|
||||
* \par
|
||||
* Internally input is downscaled by 2 for every stage to avoid saturations inside CFFT/CIFFT process.
|
||||
* Hence the output format is different for different RFFT sizes.
|
||||
* The input and output formats for different RFFT sizes and number of bits to upscale are mentioned in the tables below for RFFT and RIFFT:
|
||||
* \par
|
||||
* \image html RFFTQ15.gif "Input and Output Formats for Q15 RFFT"
|
||||
* \par
|
||||
* \image html RIFFTQ15.gif "Input and Output Formats for Q15 RIFFT"
|
||||
*/
|
||||
|
||||
void arm_rfft_q15(
|
||||
const arm_rfft_instance_q15 * S,
|
||||
q15_t * pSrc,
|
||||
q15_t * pDst)
|
||||
{
|
||||
const arm_cfft_radix4_instance_q15 *S_CFFT = S->pCfft;
|
||||
|
||||
/* Calculation of RIFFT of input */
|
||||
if(S->ifftFlagR == 1u)
|
||||
{
|
||||
/* Real IFFT core process */
|
||||
arm_split_rifft_q15(pSrc, S->fftLenBy2, S->pTwiddleAReal,
|
||||
S->pTwiddleBReal, pDst, S->twidCoefRModifier);
|
||||
|
||||
/* Complex readix-4 IFFT process */
|
||||
arm_radix4_butterfly_inverse_q15(pDst, S_CFFT->fftLen,
|
||||
S_CFFT->pTwiddle,
|
||||
S_CFFT->twidCoefModifier);
|
||||
|
||||
/* Bit reversal process */
|
||||
if(S->bitReverseFlagR == 1u)
|
||||
{
|
||||
arm_bitreversal_q15(pDst, S_CFFT->fftLen,
|
||||
S_CFFT->bitRevFactor, S_CFFT->pBitRevTable);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Calculation of RFFT of input */
|
||||
|
||||
/* Complex readix-4 FFT process */
|
||||
arm_radix4_butterfly_q15(pSrc, S_CFFT->fftLen,
|
||||
S_CFFT->pTwiddle, S_CFFT->twidCoefModifier);
|
||||
|
||||
/* Bit reversal process */
|
||||
if(S->bitReverseFlagR == 1u)
|
||||
{
|
||||
arm_bitreversal_q15(pSrc, S_CFFT->fftLen,
|
||||
S_CFFT->bitRevFactor, S_CFFT->pBitRevTable);
|
||||
}
|
||||
|
||||
arm_split_rfft_q15(pSrc, S->fftLenBy2, S->pTwiddleAReal,
|
||||
S->pTwiddleBReal, pDst, S->twidCoefRModifier);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @} end of RFFT_RIFFT group
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Core Real FFT process
|
||||
* @param *pSrc points to the input buffer.
|
||||
* @param fftLen length of FFT.
|
||||
* @param *pATable points to the A twiddle Coef buffer.
|
||||
* @param *pBTable points to the B twiddle Coef buffer.
|
||||
* @param *pDst points to the output buffer.
|
||||
* @param modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
|
||||
* @return none.
|
||||
* The function implements a Real FFT
|
||||
*/
|
||||
|
||||
void arm_split_rfft_q15(
|
||||
q15_t * pSrc,
|
||||
uint32_t fftLen,
|
||||
q15_t * pATable,
|
||||
q15_t * pBTable,
|
||||
q15_t * pDst,
|
||||
uint32_t modifier)
|
||||
{
|
||||
uint32_t i; /* Loop Counter */
|
||||
q31_t outR, outI; /* Temporary variables for output */
|
||||
q15_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */
|
||||
q15_t *pSrc1, *pSrc2;
|
||||
|
||||
|
||||
pSrc[2u * fftLen] = pSrc[0];
|
||||
pSrc[(2u * fftLen) + 1u] = pSrc[1];
|
||||
|
||||
pCoefA = &pATable[modifier * 2u];
|
||||
pCoefB = &pBTable[modifier * 2u];
|
||||
|
||||
pSrc1 = &pSrc[2];
|
||||
pSrc2 = &pSrc[(2u * fftLen) - 2u];
|
||||
|
||||
#ifndef ARM_MATH_CM0
|
||||
|
||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
||||
|
||||
i = 1u;
|
||||
|
||||
while(i < fftLen)
|
||||
{
|
||||
/*
|
||||
outR = (pSrc[2 * i] * pATable[2 * i] - pSrc[2 * i + 1] * pATable[2 * i + 1]
|
||||
+ pSrc[2 * n - 2 * i] * pBTable[2 * i] +
|
||||
pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1]);
|
||||
*/
|
||||
|
||||
/* outI = (pIn[2 * i + 1] * pATable[2 * i] + pIn[2 * i] * pATable[2 * i + 1] +
|
||||
pIn[2 * n - 2 * i] * pBTable[2 * i + 1] -
|
||||
pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); */
|
||||
|
||||
|
||||
#ifndef ARM_MATH_BIG_ENDIAN
|
||||
|
||||
/* pSrc[2 * i] * pATable[2 * i] - pSrc[2 * i + 1] * pATable[2 * i + 1] */
|
||||
outR = __SMUSD(*__SIMD32(pSrc1), *__SIMD32(pCoefA));
|
||||
|
||||
#else
|
||||
|
||||
/* -(pSrc[2 * i + 1] * pATable[2 * i + 1] - pSrc[2 * i] * pATable[2 * i]) */
|
||||
outR = -(__SMUSD(*__SIMD32(pSrc1), *__SIMD32(pCoefA)));
|
||||
|
||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
||||
|
||||
/* pSrc[2 * n - 2 * i] * pBTable[2 * i] +
|
||||
pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1]) */
|
||||
outR = __SMLAD(*__SIMD32(pSrc2), *__SIMD32(pCoefB), outR) >> 15u;
|
||||
|
||||
/* pIn[2 * n - 2 * i] * pBTable[2 * i + 1] -
|
||||
pIn[2 * n - 2 * i + 1] * pBTable[2 * i] */
|
||||
|
||||
#ifndef ARM_MATH_BIG_ENDIAN
|
||||
|
||||
outI = __SMUSDX(*__SIMD32(pSrc2)--, *__SIMD32(pCoefB));
|
||||
|
||||
#else
|
||||
|
||||
outI = __SMUSDX(*__SIMD32(pCoefB), *__SIMD32(pSrc2)--);
|
||||
|
||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
||||
|
||||
/* (pIn[2 * i + 1] * pATable[2 * i] + pIn[2 * i] * pATable[2 * i + 1] */
|
||||
outI = __SMLADX(*__SIMD32(pSrc1)++, *__SIMD32(pCoefA), outI);
|
||||
|
||||
/* write output */
|
||||
pDst[2u * i] = (q15_t) outR;
|
||||
pDst[(2u * i) + 1u] = outI >> 15u;
|
||||
|
||||
/* write complex conjugate output */
|
||||
pDst[(4u * fftLen) - (2u * i)] = (q15_t) outR;
|
||||
pDst[((4u * fftLen) - (2u * i)) + 1u] = -(outI >> 15u);
|
||||
|
||||
/* update coefficient pointer */
|
||||
pCoefB = pCoefB + (2u * modifier);
|
||||
pCoefA = pCoefA + (2u * modifier);
|
||||
|
||||
i++;
|
||||
|
||||
}
|
||||
|
||||
pDst[2u * fftLen] = pSrc[0] - pSrc[1];
|
||||
pDst[(2u * fftLen) + 1u] = 0;
|
||||
|
||||
pDst[0] = pSrc[0] + pSrc[1];
|
||||
pDst[1] = 0;
|
||||
|
||||
|
||||
#else
|
||||
|
||||
/* Run the below code for Cortex-M0 */
|
||||
|
||||
i = 1u;
|
||||
|
||||
while(i < fftLen)
|
||||
{
|
||||
/*
|
||||
outR = (pSrc[2 * i] * pATable[2 * i] - pSrc[2 * i + 1] * pATable[2 * i + 1]
|
||||
+ pSrc[2 * n - 2 * i] * pBTable[2 * i] +
|
||||
pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1]);
|
||||
*/
|
||||
|
||||
outR = *pSrc1 * *pCoefA;
|
||||
outR = outR - (*(pSrc1 + 1) * *(pCoefA + 1));
|
||||
outR = outR + (*pSrc2 * *pCoefB);
|
||||
outR = (outR + (*(pSrc2 + 1) * *(pCoefB + 1))) >> 15;
|
||||
|
||||
|
||||
/* outI = (pIn[2 * i + 1] * pATable[2 * i] + pIn[2 * i] * pATable[2 * i + 1] +
|
||||
pIn[2 * n - 2 * i] * pBTable[2 * i + 1] -
|
||||
pIn[2 * n - 2 * i + 1] * pBTable[2 * i]);
|
||||
*/
|
||||
|
||||
outI = *pSrc2 * *(pCoefB + 1);
|
||||
outI = outI - (*(pSrc2 + 1) * *pCoefB);
|
||||
outI = outI + (*(pSrc1 + 1) * *pCoefA);
|
||||
outI = outI + (*pSrc1 * *(pCoefA + 1));
|
||||
|
||||
/* update input pointers */
|
||||
pSrc1 += 2u;
|
||||
pSrc2 -= 2u;
|
||||
|
||||
/* write output */
|
||||
pDst[2u * i] = (q15_t) outR;
|
||||
pDst[(2u * i) + 1u] = outI >> 15u;
|
||||
|
||||
/* write complex conjugate output */
|
||||
pDst[(4u * fftLen) - (2u * i)] = (q15_t) outR;
|
||||
pDst[((4u * fftLen) - (2u * i)) + 1u] = -(outI >> 15u);
|
||||
|
||||
/* update coefficient pointer */
|
||||
pCoefB = pCoefB + (2u * modifier);
|
||||
pCoefA = pCoefA + (2u * modifier);
|
||||
|
||||
i++;
|
||||
|
||||
}
|
||||
|
||||
pDst[2u * fftLen] = pSrc[0] - pSrc[1];
|
||||
pDst[(2u * fftLen) + 1u] = 0;
|
||||
|
||||
pDst[0] = pSrc[0] + pSrc[1];
|
||||
pDst[1] = 0;
|
||||
|
||||
#endif /* #ifndef ARM_MATH_CM0 */
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Core Real IFFT process
|
||||
* @param[in] *pSrc points to the input buffer.
|
||||
* @param[in] fftLen length of FFT.
|
||||
* @param[in] *pATable points to the twiddle Coef A buffer.
|
||||
* @param[in] *pBTable points to the twiddle Coef B buffer.
|
||||
* @param[out] *pDst points to the output buffer.
|
||||
* @param[in] modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
|
||||
* @return none.
|
||||
* The function implements a Real IFFT
|
||||
*/
|
||||
void arm_split_rifft_q15(
|
||||
q15_t * pSrc,
|
||||
uint32_t fftLen,
|
||||
q15_t * pATable,
|
||||
q15_t * pBTable,
|
||||
q15_t * pDst,
|
||||
uint32_t modifier)
|
||||
{
|
||||
uint32_t i; /* Loop Counter */
|
||||
q31_t outR, outI; /* Temporary variables for output */
|
||||
q15_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */
|
||||
q15_t *pSrc1, *pSrc2;
|
||||
q15_t *pDst1 = &pDst[0];
|
||||
|
||||
pCoefA = &pATable[0];
|
||||
pCoefB = &pBTable[0];
|
||||
|
||||
pSrc1 = &pSrc[0];
|
||||
pSrc2 = &pSrc[2u * fftLen];
|
||||
|
||||
#ifndef ARM_MATH_CM0
|
||||
|
||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
||||
|
||||
i = fftLen;
|
||||
|
||||
while(i > 0u)
|
||||
{
|
||||
|
||||
/*
|
||||
outR = (pIn[2 * i] * pATable[2 * i] + pIn[2 * i + 1] * pATable[2 * i + 1] +
|
||||
pIn[2 * n - 2 * i] * pBTable[2 * i] -
|
||||
pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1]);
|
||||
|
||||
outI = (pIn[2 * i + 1] * pATable[2 * i] - pIn[2 * i] * pATable[2 * i + 1] -
|
||||
pIn[2 * n - 2 * i] * pBTable[2 * i + 1] -
|
||||
pIn[2 * n - 2 * i + 1] * pBTable[2 * i]);
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ARM_MATH_BIG_ENDIAN
|
||||
|
||||
/* pIn[2 * n - 2 * i] * pBTable[2 * i] -
|
||||
pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1]) */
|
||||
outR = __SMUSD(*__SIMD32(pSrc2), *__SIMD32(pCoefB));
|
||||
|
||||
#else
|
||||
|
||||
/* -(-pIn[2 * n - 2 * i] * pBTable[2 * i] +
|
||||
pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1])) */
|
||||
outR = -(__SMUSD(*__SIMD32(pSrc2), *__SIMD32(pCoefB)));
|
||||
|
||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
||||
|
||||
/* pIn[2 * i] * pATable[2 * i] + pIn[2 * i + 1] * pATable[2 * i + 1] +
|
||||
pIn[2 * n - 2 * i] * pBTable[2 * i] */
|
||||
outR = __SMLAD(*__SIMD32(pSrc1), *__SIMD32(pCoefA), outR) >> 15u;
|
||||
|
||||
/*
|
||||
-pIn[2 * n - 2 * i] * pBTable[2 * i + 1] +
|
||||
pIn[2 * n - 2 * i + 1] * pBTable[2 * i] */
|
||||
outI = __SMUADX(*__SIMD32(pSrc2)--, *__SIMD32(pCoefB));
|
||||
|
||||
/* pIn[2 * i + 1] * pATable[2 * i] - pIn[2 * i] * pATable[2 * i + 1] */
|
||||
|
||||
#ifndef ARM_MATH_BIG_ENDIAN
|
||||
|
||||
outI = __SMLSDX(*__SIMD32(pCoefA), *__SIMD32(pSrc1)++, -outI);
|
||||
|
||||
#else
|
||||
|
||||
outI = __SMLSDX(*__SIMD32(pSrc1)++, *__SIMD32(pCoefA), -outI);
|
||||
|
||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
||||
/* write output */
|
||||
|
||||
#ifndef ARM_MATH_BIG_ENDIAN
|
||||
|
||||
*__SIMD32(pDst1)++ = __PKHBT(outR, (outI >> 15u), 16);
|
||||
|
||||
#else
|
||||
|
||||
*__SIMD32(pDst1)++ = __PKHBT((outI >> 15u), outR, 16);
|
||||
|
||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
||||
|
||||
/* update coefficient pointer */
|
||||
pCoefB = pCoefB + (2u * modifier);
|
||||
pCoefA = pCoefA + (2u * modifier);
|
||||
|
||||
i--;
|
||||
|
||||
}
|
||||
|
||||
|
||||
#else
|
||||
|
||||
/* Run the below code for Cortex-M0 */
|
||||
|
||||
i = fftLen;
|
||||
|
||||
while(i > 0u)
|
||||
{
|
||||
|
||||
/*
|
||||
outR = (pIn[2 * i] * pATable[2 * i] + pIn[2 * i + 1] * pATable[2 * i + 1] +
|
||||
pIn[2 * n - 2 * i] * pBTable[2 * i] -
|
||||
pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1]);
|
||||
*/
|
||||
|
||||
outR = *pSrc2 * *pCoefB;
|
||||
outR = outR - (*(pSrc2 + 1) * *(pCoefB + 1));
|
||||
outR = outR + (*pSrc1 * *pCoefA);
|
||||
outR = (outR + (*(pSrc1 + 1) * *(pCoefA + 1))) >> 15;
|
||||
|
||||
/*
|
||||
outI = (pIn[2 * i + 1] * pATable[2 * i] - pIn[2 * i] * pATable[2 * i + 1] -
|
||||
pIn[2 * n - 2 * i] * pBTable[2 * i + 1] -
|
||||
pIn[2 * n - 2 * i + 1] * pBTable[2 * i]);
|
||||
*/
|
||||
|
||||
outI = *(pSrc1 + 1) * *pCoefA;
|
||||
outI = outI - (*pSrc1 * *(pCoefA + 1));
|
||||
outI = outI - (*pSrc2 * *(pCoefB + 1));
|
||||
outI = outI - (*(pSrc2 + 1) * *(pCoefB));
|
||||
|
||||
/* update input pointers */
|
||||
pSrc1 += 2u;
|
||||
pSrc2 -= 2u;
|
||||
|
||||
/* write output */
|
||||
*pDst1++ = (q15_t) outR;
|
||||
*pDst1++ = (q15_t) (outI >> 15);
|
||||
|
||||
/* update coefficient pointer */
|
||||
pCoefB = pCoefB + (2u * modifier);
|
||||
pCoefA = pCoefA + (2u * modifier);
|
||||
|
||||
i--;
|
||||
|
||||
}
|
||||
|
||||
#endif /* #ifndef ARM_MATH_CM0 */
|
||||
|
||||
}
|
@ -0,0 +1,326 @@
|
||||
/* ----------------------------------------------------------------------
|
||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
||||
*
|
||||
* $Date: 15. July 2011
|
||||
* $Revision: V1.0.10
|
||||
*
|
||||
* Project: CMSIS DSP Library
|
||||
* Title: arm_rfft_q31.c
|
||||
*
|
||||
* Description: RFFT & RIFFT Q31 process function
|
||||
*
|
||||
*
|
||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
||||
*
|
||||
* Version 1.0.10 2011/7/15
|
||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
||||
*
|
||||
* Version 1.0.3 2010/11/29
|
||||
* Re-organized the CMSIS folders and updated documentation.
|
||||
*
|
||||
* Version 1.0.2 2010/11/11
|
||||
* Documentation updated.
|
||||
*
|
||||
* Version 1.0.1 2010/10/05
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 1.0.0 2010/09/20
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 0.0.7 2010/06/10
|
||||
* Misra-C changes done
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#include "arm_math.h"
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
* Internal functions prototypes
|
||||
--------------------------------------------------------------------*/
|
||||
|
||||
void arm_split_rfft_q31(
|
||||
q31_t * pSrc,
|
||||
uint32_t fftLen,
|
||||
q31_t * pATable,
|
||||
q31_t * pBTable,
|
||||
q31_t * pDst,
|
||||
uint32_t modifier);
|
||||
|
||||
void arm_split_rifft_q31(
|
||||
q31_t * pSrc,
|
||||
uint32_t fftLen,
|
||||
q31_t * pATable,
|
||||
q31_t * pBTable,
|
||||
q31_t * pDst,
|
||||
uint32_t modifier);
|
||||
|
||||
/**
|
||||
* @addtogroup RFFT_RIFFT
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Processing function for the Q31 RFFT/RIFFT.
|
||||
* @param[in] *S points to an instance of the Q31 RFFT/RIFFT structure.
|
||||
* @param[in] *pSrc points to the input buffer.
|
||||
* @param[out] *pDst points to the output buffer.
|
||||
* @return none.
|
||||
*
|
||||
* \par Input an output formats:
|
||||
* \par
|
||||
* Internally input is downscaled by 2 for every stage to avoid saturations inside CFFT/CIFFT process.
|
||||
* Hence the output format is different for different RFFT sizes.
|
||||
* The input and output formats for different RFFT sizes and number of bits to upscale are mentioned in the tables below for RFFT and RIFFT:
|
||||
* \par
|
||||
* \image html RFFTQ31.gif "Input and Output Formats for Q31 RFFT"
|
||||
*
|
||||
* \par
|
||||
* \image html RIFFTQ31.gif "Input and Output Formats for Q31 RIFFT"
|
||||
*/
|
||||
|
||||
void arm_rfft_q31(
|
||||
const arm_rfft_instance_q31 * S,
|
||||
q31_t * pSrc,
|
||||
q31_t * pDst)
|
||||
{
|
||||
const arm_cfft_radix4_instance_q31 *S_CFFT = S->pCfft;
|
||||
|
||||
/* Calculation of RIFFT of input */
|
||||
if(S->ifftFlagR == 1u)
|
||||
{
|
||||
/* Real IFFT core process */
|
||||
arm_split_rifft_q31(pSrc, S->fftLenBy2, S->pTwiddleAReal,
|
||||
S->pTwiddleBReal, pDst, S->twidCoefRModifier);
|
||||
|
||||
/* Complex readix-4 IFFT process */
|
||||
arm_radix4_butterfly_inverse_q31(pDst, S_CFFT->fftLen,
|
||||
S_CFFT->pTwiddle,
|
||||
S_CFFT->twidCoefModifier);
|
||||
/* Bit reversal process */
|
||||
if(S->bitReverseFlagR == 1u)
|
||||
{
|
||||
arm_bitreversal_q31(pDst, S_CFFT->fftLen,
|
||||
S_CFFT->bitRevFactor, S_CFFT->pBitRevTable);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Calculation of RFFT of input */
|
||||
|
||||
/* Complex readix-4 FFT process */
|
||||
arm_radix4_butterfly_q31(pSrc, S_CFFT->fftLen,
|
||||
S_CFFT->pTwiddle, S_CFFT->twidCoefModifier);
|
||||
|
||||
/* Bit reversal process */
|
||||
if(S->bitReverseFlagR == 1u)
|
||||
{
|
||||
arm_bitreversal_q31(pSrc, S_CFFT->fftLen,
|
||||
S_CFFT->bitRevFactor, S_CFFT->pBitRevTable);
|
||||
}
|
||||
|
||||
/* Real FFT core process */
|
||||
arm_split_rfft_q31(pSrc, S->fftLenBy2, S->pTwiddleAReal,
|
||||
S->pTwiddleBReal, pDst, S->twidCoefRModifier);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @} end of RFFT_RIFFT group
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Core Real FFT process
|
||||
* @param[in] *pSrc points to the input buffer.
|
||||
* @param[in] fftLen length of FFT.
|
||||
* @param[in] *pATable points to the twiddle Coef A buffer.
|
||||
* @param[in] *pBTable points to the twiddle Coef B buffer.
|
||||
* @param[out] *pDst points to the output buffer.
|
||||
* @param[in] modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
|
||||
* @return none.
|
||||
*/
|
||||
|
||||
void arm_split_rfft_q31(
|
||||
q31_t * pSrc,
|
||||
uint32_t fftLen,
|
||||
q31_t * pATable,
|
||||
q31_t * pBTable,
|
||||
q31_t * pDst,
|
||||
uint32_t modifier)
|
||||
{
|
||||
uint32_t i; /* Loop Counter */
|
||||
q31_t outR, outI; /* Temporary variables for output */
|
||||
q31_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */
|
||||
q31_t CoefA1, CoefA2, CoefB1; /* Temporary variables for twiddle coefficients */
|
||||
q31_t *pOut1 = &pDst[2], *pOut2 = &pDst[(4u * fftLen) - 1u];
|
||||
q31_t *pIn1 = &pSrc[2], *pIn2 = &pSrc[(2u * fftLen) - 1u];
|
||||
|
||||
pSrc[2u * fftLen] = pSrc[0];
|
||||
pSrc[(2u * fftLen) + 1u] = pSrc[1];
|
||||
|
||||
/* Init coefficient pointers */
|
||||
pCoefA = &pATable[modifier * 2u];
|
||||
pCoefB = &pBTable[modifier * 2u];
|
||||
|
||||
i = fftLen - 1u;
|
||||
|
||||
while(i > 0u)
|
||||
{
|
||||
/*
|
||||
outR = (pSrc[2 * i] * pATable[2 * i] - pSrc[2 * i + 1] * pATable[2 * i + 1]
|
||||
+ pSrc[2 * n - 2 * i] * pBTable[2 * i] +
|
||||
pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1]);
|
||||
*/
|
||||
|
||||
/* outI = (pIn[2 * i + 1] * pATable[2 * i] + pIn[2 * i] * pATable[2 * i + 1] +
|
||||
pIn[2 * n - 2 * i] * pBTable[2 * i + 1] -
|
||||
pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); */
|
||||
|
||||
CoefA1 = *pCoefA++;
|
||||
CoefA2 = *pCoefA;
|
||||
|
||||
/* outR = (pSrc[2 * i] * pATable[2 * i] */
|
||||
outR = ((int32_t) (((q63_t) * pIn1 * CoefA1) >> 32));
|
||||
|
||||
/* outI = pIn[2 * i] * pATable[2 * i + 1] */
|
||||
outI = ((int32_t) (((q63_t) * pIn1++ * CoefA2) >> 32));
|
||||
|
||||
/* - pSrc[2 * i + 1] * pATable[2 * i + 1] */
|
||||
outR =
|
||||
(q31_t) ((((q63_t) outR << 32) + ((q63_t) * pIn1 * (-CoefA2))) >> 32);
|
||||
|
||||
/* (pIn[2 * i + 1] * pATable[2 * i] */
|
||||
outI =
|
||||
(q31_t) ((((q63_t) outI << 32) + ((q63_t) * pIn1++ * (CoefA1))) >> 32);
|
||||
|
||||
/* pSrc[2 * n - 2 * i] * pBTable[2 * i] */
|
||||
outR =
|
||||
(q31_t) ((((q63_t) outR << 32) + ((q63_t) * pIn2 * (-CoefA2))) >> 32);
|
||||
CoefB1 = *pCoefB;
|
||||
|
||||
/* pIn[2 * n - 2 * i] * pBTable[2 * i + 1] */
|
||||
outI =
|
||||
(q31_t) ((((q63_t) outI << 32) + ((q63_t) * pIn2-- * (-CoefB1))) >> 32);
|
||||
|
||||
/* pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1] */
|
||||
outR =
|
||||
(q31_t) ((((q63_t) outR << 32) + ((q63_t) * pIn2 * (CoefB1))) >> 32);
|
||||
|
||||
/* pIn[2 * n - 2 * i + 1] * pBTable[2 * i] */
|
||||
outI =
|
||||
(q31_t) ((((q63_t) outI << 32) + ((q63_t) * pIn2-- * (-CoefA2))) >> 32);
|
||||
|
||||
/* write output */
|
||||
*pOut1++ = (outR << 1u);
|
||||
*pOut1++ = (outI << 1u);
|
||||
|
||||
/* write complex conjugate output */
|
||||
*pOut2-- = -(outI << 1u);
|
||||
*pOut2-- = (outR << 1u);
|
||||
|
||||
/* update coefficient pointer */
|
||||
pCoefB = pCoefB + (modifier * 2u);
|
||||
pCoefA = pCoefA + ((modifier * 2u) - 1u);
|
||||
|
||||
i--;
|
||||
|
||||
}
|
||||
|
||||
pDst[2u * fftLen] = pSrc[0] - pSrc[1];
|
||||
pDst[(2u * fftLen) + 1u] = 0;
|
||||
|
||||
pDst[0] = pSrc[0] + pSrc[1];
|
||||
pDst[1] = 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Core Real IFFT process
|
||||
* @param[in] *pSrc points to the input buffer.
|
||||
* @param[in] fftLen length of FFT.
|
||||
* @param[in] *pATable points to the twiddle Coef A buffer.
|
||||
* @param[in] *pBTable points to the twiddle Coef B buffer.
|
||||
* @param[out] *pDst points to the output buffer.
|
||||
* @param[in] modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
|
||||
* @return none.
|
||||
*/
|
||||
|
||||
void arm_split_rifft_q31(
|
||||
q31_t * pSrc,
|
||||
uint32_t fftLen,
|
||||
q31_t * pATable,
|
||||
q31_t * pBTable,
|
||||
q31_t * pDst,
|
||||
uint32_t modifier)
|
||||
{
|
||||
q31_t outR, outI; /* Temporary variables for output */
|
||||
q31_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */
|
||||
q31_t CoefA1, CoefA2, CoefB1; /* Temporary variables for twiddle coefficients */
|
||||
q31_t *pIn1 = &pSrc[0], *pIn2 = &pSrc[(2u * fftLen) + 1u];
|
||||
|
||||
pCoefA = &pATable[0];
|
||||
pCoefB = &pBTable[0];
|
||||
|
||||
while(fftLen > 0u)
|
||||
{
|
||||
/*
|
||||
outR = (pIn[2 * i] * pATable[2 * i] + pIn[2 * i + 1] * pATable[2 * i + 1] +
|
||||
pIn[2 * n - 2 * i] * pBTable[2 * i] -
|
||||
pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1]);
|
||||
|
||||
outI = (pIn[2 * i + 1] * pATable[2 * i] - pIn[2 * i] * pATable[2 * i + 1] -
|
||||
pIn[2 * n - 2 * i] * pBTable[2 * i + 1] -
|
||||
pIn[2 * n - 2 * i + 1] * pBTable[2 * i]);
|
||||
|
||||
*/
|
||||
CoefA1 = *pCoefA++;
|
||||
CoefA2 = *pCoefA;
|
||||
|
||||
/* outR = (pIn[2 * i] * pATable[2 * i] */
|
||||
outR = ((int32_t) (((q63_t) * pIn1 * CoefA1) >> 32));
|
||||
|
||||
/* - pIn[2 * i] * pATable[2 * i + 1] */
|
||||
outI = -((int32_t) (((q63_t) * pIn1++ * CoefA2) >> 32));
|
||||
|
||||
/* pIn[2 * i + 1] * pATable[2 * i + 1] */
|
||||
outR =
|
||||
(q31_t) ((((q63_t) outR << 32) + ((q63_t) * pIn1 * (CoefA2))) >> 32);
|
||||
|
||||
/* pIn[2 * i + 1] * pATable[2 * i] */
|
||||
outI =
|
||||
(q31_t) ((((q63_t) outI << 32) + ((q63_t) * pIn1++ * (CoefA1))) >> 32);
|
||||
|
||||
/* pIn[2 * n - 2 * i] * pBTable[2 * i] */
|
||||
outR =
|
||||
(q31_t) ((((q63_t) outR << 32) + ((q63_t) * pIn2 * (CoefA2))) >> 32);
|
||||
|
||||
CoefB1 = *pCoefB;
|
||||
|
||||
/* pIn[2 * n - 2 * i] * pBTable[2 * i + 1] */
|
||||
outI =
|
||||
(q31_t) ((((q63_t) outI << 32) - ((q63_t) * pIn2-- * (CoefB1))) >> 32);
|
||||
|
||||
/* pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1] */
|
||||
outR =
|
||||
(q31_t) ((((q63_t) outR << 32) + ((q63_t) * pIn2 * (CoefB1))) >> 32);
|
||||
|
||||
/* pIn[2 * n - 2 * i + 1] * pBTable[2 * i] */
|
||||
outI =
|
||||
(q31_t) ((((q63_t) outI << 32) + ((q63_t) * pIn2-- * (CoefA2))) >> 32);
|
||||
|
||||
/* write output */
|
||||
*pDst++ = (outR << 1u);
|
||||
*pDst++ = (outI << 1u);
|
||||
|
||||
/* update coefficient pointer */
|
||||
pCoefB = pCoefB + (modifier * 2u);
|
||||
pCoefA = pCoefA + ((modifier * 2u) - 1u);
|
||||
|
||||
/* Decrement loop count */
|
||||
fftLen--;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
Reference in New Issue
Block a user