1 /** @file wls_radix4Fft.c
2   *
3   * @brief This file contains fixed-point radix-4 FFT function
4   *
5   * Copyright 2023-2024 NXP
6   *
7   * SPDX-License-Identifier: BSD-3-Clause
8   *
9   */
10 
11 /************************************************************************
12 * DFW fixed-point radix-4 FFT function
13 ************************************************************************/
14 
15 #include <osa.h>
16 #if CONFIG_WLS_CSI_PROC
17 
18 #include <stdio.h>
19 #include "wls_param_defines.h"
20 #include "wls_radix4Fft.h"
21 //#include "math.h"
22 
23 //#define ARM_DEBUG
24 #if defined(MAX_FFT_SIZE_2048)
25 const INT16 radix4FftTwiddleArr[2 * MAX_FFT_SIZE] = { 0x7FFF, 0x0000, 0x7FFF, 0x0065, 0x7FFF, 0x00C9, 0x7FFF, 0x012E, 0x7FFE, 0x0192, 0x7FFC, 0x01F7, 0x7FFA, 0x025B, 0x7FF8, 0x02C0, 0x7FF6, 0x0324, 0x7FF4, 0x0389,
26 								0x7FF1, 0x03ED, 0x7FED, 0x0452, 0x7FEA, 0x04B6, 0x7FE6, 0x051B, 0x7FE2, 0x057F, 0x7FDD, 0x05E3, 0x7FD9, 0x0648, 0x7FD3, 0x06AC, 0x7FCE, 0x0711, 0x7FC8, 0x0775,
27 								0x7FC2, 0x07D9, 0x7FBC, 0x083E, 0x7FB5, 0x08A2, 0x7FAE, 0x0906, 0x7FA7, 0x096B, 0x7FA0, 0x09CF, 0x7F98, 0x0A33, 0x7F90, 0x0A97, 0x7F87, 0x0AFB, 0x7F7E, 0x0B60,
28 								0x7F75, 0x0BC4, 0x7F6C, 0x0C28, 0x7F62, 0x0C8C, 0x7F58, 0x0CF0, 0x7F4E, 0x0D54, 0x7F43, 0x0DB8, 0x7F38, 0x0E1C, 0x7F2D, 0x0E80, 0x7F22, 0x0EE4, 0x7F16, 0x0F47,
29 								0x7F0A, 0x0FAB, 0x7EFD, 0x100F, 0x7EF0, 0x1073, 0x7EE3, 0x10D6, 0x7ED6, 0x113A, 0x7EC8, 0x119E, 0x7EBA, 0x1201, 0x7EAC, 0x1265, 0x7E9D, 0x12C8, 0x7E8E, 0x132B,
30 								0x7E7F, 0x138F, 0x7E70, 0x13F2, 0x7E60, 0x1455, 0x7E50, 0x14B9, 0x7E3F, 0x151C, 0x7E2F, 0x157F, 0x7E1E, 0x15E2, 0x7E0C, 0x1645, 0x7DFB, 0x16A8, 0x7DE9, 0x170B,
31 								0x7DD6, 0x176E, 0x7DC4, 0x17D1, 0x7DB1, 0x1833, 0x7D9E, 0x1896, 0x7D8A, 0x18F9, 0x7D77, 0x195B, 0x7D63, 0x19BE, 0x7D4E, 0x1A20, 0x7D3A, 0x1A83, 0x7D25, 0x1AE5,
32 								0x7D0F, 0x1B47, 0x7CFA, 0x1BA9, 0x7CE4, 0x1C0C, 0x7CCE, 0x1C6E, 0x7CB7, 0x1CD0, 0x7CA0, 0x1D31, 0x7C89, 0x1D93, 0x7C72, 0x1DF5, 0x7C5A, 0x1E57, 0x7C42, 0x1EB8,
33 								0x7C2A, 0x1F1A, 0x7C11, 0x1F7B, 0x7BF9, 0x1FDD, 0x7BDF, 0x203E, 0x7BC6, 0x209F, 0x7BAC, 0x2101, 0x7B92, 0x2162, 0x7B78, 0x21C3, 0x7B5D, 0x2224, 0x7B42, 0x2284,
34 								0x7B27, 0x22E5, 0x7B0B, 0x2346, 0x7AEF, 0x23A7, 0x7AD3, 0x2407, 0x7AB7, 0x2467, 0x7A9A, 0x24C8, 0x7A7D, 0x2528, 0x7A60, 0x2588, 0x7A42, 0x25E8, 0x7A24, 0x2648,
35 								0x7A06, 0x26A8, 0x79E7, 0x2708, 0x79C9, 0x2768, 0x79AA, 0x27C7, 0x798A, 0x2827, 0x796A, 0x2886, 0x794A, 0x28E5, 0x792A, 0x2945, 0x790A, 0x29A4, 0x78E9, 0x2A03,
36 								0x78C8, 0x2A62, 0x78A6, 0x2AC1, 0x7885, 0x2B1F, 0x7863, 0x2B7E, 0x7840, 0x2BDC, 0x781E, 0x2C3B, 0x77FB, 0x2C99, 0x77D8, 0x2CF7, 0x77B4, 0x2D55, 0x7790, 0x2DB3,
37 								0x776C, 0x2E11, 0x7748, 0x2E6F, 0x7723, 0x2ECC, 0x76FE, 0x2F2A, 0x76D9, 0x2F87, 0x76B4, 0x2FE5, 0x768E, 0x3042, 0x7668, 0x309F, 0x7642, 0x30FC, 0x761B, 0x3159,
38 								0x75F4, 0x31B5, 0x75CD, 0x3212, 0x75A6, 0x326E, 0x757E, 0x32CB, 0x7556, 0x3327, 0x752D, 0x3383, 0x7505, 0x33DF, 0x74DC, 0x343B, 0x74B3, 0x3497, 0x7489, 0x34F2,
39 								0x7460, 0x354E, 0x7436, 0x35A9, 0x740B, 0x3604, 0x73E1, 0x365F, 0x73B6, 0x36BA, 0x738B, 0x3715, 0x735F, 0x3770, 0x7334, 0x37CA, 0x7308, 0x3825, 0x72DC, 0x387F,
40 								0x72AF, 0x38D9, 0x7282, 0x3933, 0x7255, 0x398D, 0x7228, 0x39E7, 0x71FA, 0x3A40, 0x71CC, 0x3A9A, 0x719E, 0x3AF3, 0x7170, 0x3B4C, 0x7141, 0x3BA5, 0x7112, 0x3BFE,
41 								0x70E3, 0x3C57, 0x70B3, 0x3CAF, 0x7083, 0x3D08, 0x7053, 0x3D60, 0x7023, 0x3DB8, 0x6FF2, 0x3E10, 0x6FC2, 0x3E68, 0x6F90, 0x3EC0, 0x6F5F, 0x3F17, 0x6F2D, 0x3F6F,
42 								0x6EFB, 0x3FC6, 0x6EC9, 0x401D, 0x6E97, 0x4074, 0x6E64, 0x40CB, 0x6E31, 0x4121, 0x6DFE, 0x4178, 0x6DCA, 0x41CE, 0x6D96, 0x4224, 0x6D62, 0x427A, 0x6D2E, 0x42D0,
43 								0x6CF9, 0x4326, 0x6CC4, 0x437B, 0x6C8F, 0x43D1, 0x6C5A, 0x4426, 0x6C24, 0x447B, 0x6BEE, 0x44D0, 0x6BB8, 0x4524, 0x6B82, 0x4579, 0x6B4B, 0x45CD, 0x6B14, 0x4621,
44 								0x6ADD, 0x4675, 0x6AA5, 0x46C9, 0x6A6E, 0x471D, 0x6A36, 0x4770, 0x69FD, 0x47C4, 0x69C5, 0x4817, 0x698C, 0x486A, 0x6953, 0x48BD, 0x691A, 0x490F, 0x68E0, 0x4962,
45 								0x68A7, 0x49B4, 0x686D, 0x4A06, 0x6832, 0x4A58, 0x67F8, 0x4AAA, 0x67BD, 0x4AFB, 0x6782, 0x4B4D, 0x6747, 0x4B9E, 0x670B, 0x4BEF, 0x66D0, 0x4C40, 0x6693, 0x4C91,
46 								0x6657, 0x4CE1, 0x661B, 0x4D31, 0x65DE, 0x4D81, 0x65A1, 0x4DD1, 0x6564, 0x4E21, 0x6526, 0x4E71, 0x64E9, 0x4EC0, 0x64AB, 0x4F0F, 0x646C, 0x4F5E, 0x642E, 0x4FAD,
47 								0x63EF, 0x4FFB, 0x63B0, 0x504A, 0x6371, 0x5098, 0x6332, 0x50E6, 0x62F2, 0x5134, 0x62B2, 0x5181, 0x6272, 0x51CF, 0x6232, 0x521C, 0x61F1, 0x5269, 0x61B0, 0x52B6,
48 								0x616F, 0x5303, 0x612E, 0x534F, 0x60EC, 0x539B, 0x60AA, 0x53E7, 0x6068, 0x5433, 0x6026, 0x547F, 0x5FE4, 0x54CA, 0x5FA1, 0x5515, 0x5F5E, 0x5560, 0x5F1B, 0x55AB,
49 								0x5ED7, 0x55F6, 0x5E94, 0x5640, 0x5E50, 0x568A, 0x5E0C, 0x56D4, 0x5DC8, 0x571E, 0x5D83, 0x5767, 0x5D3E, 0x57B1, 0x5CF9, 0x57FA, 0x5CB4, 0x5843, 0x5C6F, 0x588C,
50 								0x5C29, 0x58D4, 0x5BE3, 0x591C, 0x5B9D, 0x5964, 0x5B57, 0x59AC, 0x5B10, 0x59F4, 0x5AC9, 0x5A3B, 0x5A82, 0x5A82, 0x5A3B, 0x5AC9, 0x59F4, 0x5B10, 0x59AC, 0x5B57,
51 								0x5964, 0x5B9D, 0x591C, 0x5BE3, 0x58D4, 0x5C29, 0x588C, 0x5C6F, 0x5843, 0x5CB4, 0x57FA, 0x5CF9, 0x57B1, 0x5D3E, 0x5767, 0x5D83, 0x571E, 0x5DC8, 0x56D4, 0x5E0C,
52 								0x568A, 0x5E50, 0x5640, 0x5E94, 0x55F6, 0x5ED7, 0x55AB, 0x5F1B, 0x5560, 0x5F5E, 0x5515, 0x5FA1, 0x54CA, 0x5FE4, 0x547F, 0x6026, 0x5433, 0x6068, 0x53E7, 0x60AA,
53 								0x539B, 0x60EC, 0x534F, 0x612E, 0x5303, 0x616F, 0x52B6, 0x61B0, 0x5269, 0x61F1, 0x521C, 0x6232, 0x51CF, 0x6272, 0x5181, 0x62B2, 0x5134, 0x62F2, 0x50E6, 0x6332,
54 								0x5098, 0x6371, 0x504A, 0x63B0, 0x4FFB, 0x63EF, 0x4FAD, 0x642E, 0x4F5E, 0x646C, 0x4F0F, 0x64AB, 0x4EC0, 0x64E9, 0x4E71, 0x6526, 0x4E21, 0x6564, 0x4DD1, 0x65A1,
55 								0x4D81, 0x65DE, 0x4D31, 0x661B, 0x4CE1, 0x6657, 0x4C91, 0x6693, 0x4C40, 0x66D0, 0x4BEF, 0x670B, 0x4B9E, 0x6747, 0x4B4D, 0x6782, 0x4AFB, 0x67BD, 0x4AAA, 0x67F8,
56 								0x4A58, 0x6832, 0x4A06, 0x686D, 0x49B4, 0x68A7, 0x4962, 0x68E0, 0x490F, 0x691A, 0x48BD, 0x6953, 0x486A, 0x698C, 0x4817, 0x69C5, 0x47C4, 0x69FD, 0x4770, 0x6A36,
57 								0x471D, 0x6A6E, 0x46C9, 0x6AA5, 0x4675, 0x6ADD, 0x4621, 0x6B14, 0x45CD, 0x6B4B, 0x4579, 0x6B82, 0x4524, 0x6BB8, 0x44D0, 0x6BEE, 0x447B, 0x6C24, 0x4426, 0x6C5A,
58 								0x43D1, 0x6C8F, 0x437B, 0x6CC4, 0x4326, 0x6CF9, 0x42D0, 0x6D2E, 0x427A, 0x6D62, 0x4224, 0x6D96, 0x41CE, 0x6DCA, 0x4178, 0x6DFE, 0x4121, 0x6E31, 0x40CB, 0x6E64,
59 								0x4074, 0x6E97, 0x401D, 0x6EC9, 0x3FC6, 0x6EFB, 0x3F6F, 0x6F2D, 0x3F17, 0x6F5F, 0x3EC0, 0x6F90, 0x3E68, 0x6FC2, 0x3E10, 0x6FF2, 0x3DB8, 0x7023, 0x3D60, 0x7053,
60 								0x3D08, 0x7083, 0x3CAF, 0x70B3, 0x3C57, 0x70E3, 0x3BFE, 0x7112, 0x3BA5, 0x7141, 0x3B4C, 0x7170, 0x3AF3, 0x719E, 0x3A9A, 0x71CC, 0x3A40, 0x71FA, 0x39E7, 0x7228,
61 								0x398D, 0x7255, 0x3933, 0x7282, 0x38D9, 0x72AF, 0x387F, 0x72DC, 0x3825, 0x7308, 0x37CA, 0x7334, 0x3770, 0x735F, 0x3715, 0x738B, 0x36BA, 0x73B6, 0x365F, 0x73E1,
62 								0x3604, 0x740B, 0x35A9, 0x7436, 0x354E, 0x7460, 0x34F2, 0x7489, 0x3497, 0x74B3, 0x343B, 0x74DC, 0x33DF, 0x7505, 0x3383, 0x752D, 0x3327, 0x7556, 0x32CB, 0x757E,
63 								0x326E, 0x75A6, 0x3212, 0x75CD, 0x31B5, 0x75F4, 0x3159, 0x761B, 0x30FC, 0x7642, 0x309F, 0x7668, 0x3042, 0x768E, 0x2FE5, 0x76B4, 0x2F87, 0x76D9, 0x2F2A, 0x76FE,
64 								0x2ECC, 0x7723, 0x2E6F, 0x7748, 0x2E11, 0x776C, 0x2DB3, 0x7790, 0x2D55, 0x77B4, 0x2CF7, 0x77D8, 0x2C99, 0x77FB, 0x2C3B, 0x781E, 0x2BDC, 0x7840, 0x2B7E, 0x7863,
65 								0x2B1F, 0x7885, 0x2AC1, 0x78A6, 0x2A62, 0x78C8, 0x2A03, 0x78E9, 0x29A4, 0x790A, 0x2945, 0x792A, 0x28E5, 0x794A, 0x2886, 0x796A, 0x2827, 0x798A, 0x27C7, 0x79AA,
66 								0x2768, 0x79C9, 0x2708, 0x79E7, 0x26A8, 0x7A06, 0x2648, 0x7A24, 0x25E8, 0x7A42, 0x2588, 0x7A60, 0x2528, 0x7A7D, 0x24C8, 0x7A9A, 0x2467, 0x7AB7, 0x2407, 0x7AD3,
67 								0x23A7, 0x7AEF, 0x2346, 0x7B0B, 0x22E5, 0x7B27, 0x2284, 0x7B42, 0x2224, 0x7B5D, 0x21C3, 0x7B78, 0x2162, 0x7B92, 0x2101, 0x7BAC, 0x209F, 0x7BC6, 0x203E, 0x7BDF,
68 								0x1FDD, 0x7BF9, 0x1F7B, 0x7C11, 0x1F1A, 0x7C2A, 0x1EB8, 0x7C42, 0x1E57, 0x7C5A, 0x1DF5, 0x7C72, 0x1D93, 0x7C89, 0x1D31, 0x7CA0, 0x1CD0, 0x7CB7, 0x1C6E, 0x7CCE,
69 								0x1C0C, 0x7CE4, 0x1BA9, 0x7CFA, 0x1B47, 0x7D0F, 0x1AE5, 0x7D25, 0x1A83, 0x7D3A, 0x1A20, 0x7D4E, 0x19BE, 0x7D63, 0x195B, 0x7D77, 0x18F9, 0x7D8A, 0x1896, 0x7D9E,
70 								0x1833, 0x7DB1, 0x17D1, 0x7DC4, 0x176E, 0x7DD6, 0x170B, 0x7DE9, 0x16A8, 0x7DFB, 0x1645, 0x7E0C, 0x15E2, 0x7E1E, 0x157F, 0x7E2F, 0x151C, 0x7E3F, 0x14B9, 0x7E50,
71 								0x1455, 0x7E60, 0x13F2, 0x7E70, 0x138F, 0x7E7F, 0x132B, 0x7E8E, 0x12C8, 0x7E9D, 0x1265, 0x7EAC, 0x1201, 0x7EBA, 0x119E, 0x7EC8, 0x113A, 0x7ED6, 0x10D6, 0x7EE3,
72 								0x1073, 0x7EF0, 0x100F, 0x7EFD, 0x0FAB, 0x7F0A, 0x0F47, 0x7F16, 0x0EE4, 0x7F22, 0x0E80, 0x7F2D, 0x0E1C, 0x7F38, 0x0DB8, 0x7F43, 0x0D54, 0x7F4E, 0x0CF0, 0x7F58,
73 								0x0C8C, 0x7F62, 0x0C28, 0x7F6C, 0x0BC4, 0x7F75, 0x0B60, 0x7F7E, 0x0AFB, 0x7F87, 0x0A97, 0x7F90, 0x0A33, 0x7F98, 0x09CF, 0x7FA0, 0x096B, 0x7FA7, 0x0906, 0x7FAE,
74 								0x08A2, 0x7FB5, 0x083E, 0x7FBC, 0x07D9, 0x7FC2, 0x0775, 0x7FC8, 0x0711, 0x7FCE, 0x06AC, 0x7FD3, 0x0648, 0x7FD9, 0x05E3, 0x7FDD, 0x057F, 0x7FE2, 0x051B, 0x7FE6,
75 								0x04B6, 0x7FEA, 0x0452, 0x7FED, 0x03ED, 0x7FF1, 0x0389, 0x7FF4, 0x0324, 0x7FF6, 0x02C0, 0x7FF8, 0x025B, 0x7FFA, 0x01F7, 0x7FFC, 0x0192, 0x7FFE, 0x012E, 0x7FFF,
76 								0x00C9, 0x7FFF, 0x0065, 0x7FFF, 0x0000, 0x7FFF, 0xFF9B, 0x7FFF, 0xFF37, 0x7FFF, 0xFED2, 0x7FFF, 0xFE6E, 0x7FFE, 0xFE09, 0x7FFC, 0xFDA5, 0x7FFA, 0xFD40, 0x7FF8,
77 								0xFCDC, 0x7FF6, 0xFC77, 0x7FF4, 0xFC13, 0x7FF1, 0xFBAE, 0x7FED, 0xFB4A, 0x7FEA, 0xFAE5, 0x7FE6, 0xFA81, 0x7FE2, 0xFA1D, 0x7FDD, 0xF9B8, 0x7FD9, 0xF954, 0x7FD3,
78 								0xF8EF, 0x7FCE, 0xF88B, 0x7FC8, 0xF827, 0x7FC2, 0xF7C2, 0x7FBC, 0xF75E, 0x7FB5, 0xF6FA, 0x7FAE, 0xF695, 0x7FA7, 0xF631, 0x7FA0, 0xF5CD, 0x7F98, 0xF569, 0x7F90,
79 								0xF505, 0x7F87, 0xF4A0, 0x7F7E, 0xF43C, 0x7F75, 0xF3D8, 0x7F6C, 0xF374, 0x7F62, 0xF310, 0x7F58, 0xF2AC, 0x7F4E, 0xF248, 0x7F43, 0xF1E4, 0x7F38, 0xF180, 0x7F2D,
80 								0xF11C, 0x7F22, 0xF0B9, 0x7F16, 0xF055, 0x7F0A, 0xEFF1, 0x7EFD, 0xEF8D, 0x7EF0, 0xEF2A, 0x7EE3, 0xEEC6, 0x7ED6, 0xEE62, 0x7EC8, 0xEDFF, 0x7EBA, 0xED9B, 0x7EAC,
81 								0xED38, 0x7E9D, 0xECD5, 0x7E8E, 0xEC71, 0x7E7F, 0xEC0E, 0x7E70, 0xEBAB, 0x7E60, 0xEB47, 0x7E50, 0xEAE4, 0x7E3F, 0xEA81, 0x7E2F, 0xEA1E, 0x7E1E, 0xE9BB, 0x7E0C,
82 								0xE958, 0x7DFB, 0xE8F5, 0x7DE9, 0xE892, 0x7DD6, 0xE82F, 0x7DC4, 0xE7CD, 0x7DB1, 0xE76A, 0x7D9E, 0xE707, 0x7D8A, 0xE6A5, 0x7D77, 0xE642, 0x7D63, 0xE5E0, 0x7D4E,
83 								0xE57D, 0x7D3A, 0xE51B, 0x7D25, 0xE4B9, 0x7D0F, 0xE457, 0x7CFA, 0xE3F4, 0x7CE4, 0xE392, 0x7CCE, 0xE330, 0x7CB7, 0xE2CF, 0x7CA0, 0xE26D, 0x7C89, 0xE20B, 0x7C72,
84 								0xE1A9, 0x7C5A, 0xE148, 0x7C42, 0xE0E6, 0x7C2A, 0xE085, 0x7C11, 0xE023, 0x7BF9, 0xDFC2, 0x7BDF, 0xDF61, 0x7BC6, 0xDEFF, 0x7BAC, 0xDE9E, 0x7B92, 0xDE3D, 0x7B78,
85 								0xDDDC, 0x7B5D, 0xDD7C, 0x7B42, 0xDD1B, 0x7B27, 0xDCBA, 0x7B0B, 0xDC59, 0x7AEF, 0xDBF9, 0x7AD3, 0xDB99, 0x7AB7, 0xDB38, 0x7A9A, 0xDAD8, 0x7A7D, 0xDA78, 0x7A60,
86 								0xDA18, 0x7A42, 0xD9B8, 0x7A24, 0xD958, 0x7A06, 0xD8F8, 0x79E7, 0xD898, 0x79C9, 0xD839, 0x79AA, 0xD7D9, 0x798A, 0xD77A, 0x796A, 0xD71B, 0x794A, 0xD6BB, 0x792A,
87 								0xD65C, 0x790A, 0xD5FD, 0x78E9, 0xD59E, 0x78C8, 0xD53F, 0x78A6, 0xD4E1, 0x7885, 0xD482, 0x7863, 0xD424, 0x7840, 0xD3C5, 0x781E, 0xD367, 0x77FB, 0xD309, 0x77D8,
88 								0xD2AB, 0x77B4, 0xD24D, 0x7790, 0xD1EF, 0x776C, 0xD191, 0x7748, 0xD134, 0x7723, 0xD0D6, 0x76FE, 0xD079, 0x76D9, 0xD01B, 0x76B4, 0xCFBE, 0x768E, 0xCF61, 0x7668,
89 								0xCF04, 0x7642, 0xCEA7, 0x761B, 0xCE4B, 0x75F4, 0xCDEE, 0x75CD, 0xCD92, 0x75A6, 0xCD35, 0x757E, 0xCCD9, 0x7556, 0xCC7D, 0x752D, 0xCC21, 0x7505, 0xCBC5, 0x74DC,
90 								0xCB69, 0x74B3, 0xCB0E, 0x7489, 0xCAB2, 0x7460, 0xCA57, 0x7436, 0xC9FC, 0x740B, 0xC9A1, 0x73E1, 0xC946, 0x73B6, 0xC8EB, 0x738B, 0xC890, 0x735F, 0xC836, 0x7334,
91 								0xC7DB, 0x7308, 0xC781, 0x72DC, 0xC727, 0x72AF, 0xC6CD, 0x7282, 0xC673, 0x7255, 0xC619, 0x7228, 0xC5C0, 0x71FA, 0xC566, 0x71CC, 0xC50D, 0x719E, 0xC4B4, 0x7170,
92 								0xC45B, 0x7141, 0xC402, 0x7112, 0xC3A9, 0x70E3, 0xC351, 0x70B3, 0xC2F8, 0x7083, 0xC2A0, 0x7053, 0xC248, 0x7023, 0xC1F0, 0x6FF2, 0xC198, 0x6FC2, 0xC140, 0x6F90,
93 								0xC0E9, 0x6F5F, 0xC091, 0x6F2D, 0xC03A, 0x6EFB, 0xBFE3, 0x6EC9, 0xBF8C, 0x6E97, 0xBF35, 0x6E64, 0xBEDF, 0x6E31, 0xBE88, 0x6DFE, 0xBE32, 0x6DCA, 0xBDDC, 0x6D96,
94 								0xBD86, 0x6D62, 0xBD30, 0x6D2E, 0xBCDA, 0x6CF9, 0xBC85, 0x6CC4, 0xBC2F, 0x6C8F, 0xBBDA, 0x6C5A, 0xBB85, 0x6C24, 0xBB30, 0x6BEE, 0xBADC, 0x6BB8, 0xBA87, 0x6B82,
95 								0xBA33, 0x6B4B, 0xB9DF, 0x6B14, 0xB98B, 0x6ADD, 0xB937, 0x6AA5, 0xB8E3, 0x6A6E, 0xB890, 0x6A36, 0xB83C, 0x69FD, 0xB7E9, 0x69C5, 0xB796, 0x698C, 0xB743, 0x6953,
96 								0xB6F1, 0x691A, 0xB69E, 0x68E0, 0xB64C, 0x68A7, 0xB5FA, 0x686D, 0xB5A8, 0x6832, 0xB556, 0x67F8, 0xB505, 0x67BD, 0xB4B3, 0x6782, 0xB462, 0x6747, 0xB411, 0x670B,
97 								0xB3C0, 0x66D0, 0xB36F, 0x6693, 0xB31F, 0x6657, 0xB2CF, 0x661B, 0xB27F, 0x65DE, 0xB22F, 0x65A1, 0xB1DF, 0x6564, 0xB18F, 0x6526, 0xB140, 0x64E9, 0xB0F1, 0x64AB,
98 								0xB0A2, 0x646C, 0xB053, 0x642E, 0xB005, 0x63EF, 0xAFB6, 0x63B0, 0xAF68, 0x6371, 0xAF1A, 0x6332, 0xAECC, 0x62F2, 0xAE7F, 0x62B2, 0xAE31, 0x6272, 0xADE4, 0x6232,
99 								0xAD97, 0x61F1, 0xAD4A, 0x61B0, 0xACFD, 0x616F, 0xACB1, 0x612E, 0xAC65, 0x60EC, 0xAC19, 0x60AA, 0xABCD, 0x6068, 0xAB81, 0x6026, 0xAB36, 0x5FE4, 0xAAEB, 0x5FA1,
100 								0xAAA0, 0x5F5E, 0xAA55, 0x5F1B, 0xAA0A, 0x5ED7, 0xA9C0, 0x5E94, 0xA976, 0x5E50, 0xA92C, 0x5E0C, 0xA8E2, 0x5DC8, 0xA899, 0x5D83, 0xA84F, 0x5D3E, 0xA806, 0x5CF9,
101 								0xA7BD, 0x5CB4, 0xA774, 0x5C6F, 0xA72C, 0x5C29, 0xA6E4, 0x5BE3, 0xA69C, 0x5B9D, 0xA654, 0x5B57, 0xA60C, 0x5B10, 0xA5C5, 0x5AC9, 0xA57E, 0x5A82, 0xA537, 0x5A3B,
102 								0xA4F0, 0x59F4, 0xA4A9, 0x59AC, 0xA463, 0x5964, 0xA41D, 0x591C, 0xA3D7, 0x58D4, 0xA391, 0x588C, 0xA34C, 0x5843, 0xA307, 0x57FA, 0xA2C2, 0x57B1, 0xA27D, 0x5767,
103 								0xA238, 0x571E, 0xA1F4, 0x56D4, 0xA1B0, 0x568A, 0xA16C, 0x5640, 0xA129, 0x55F6, 0xA0E5, 0x55AB, 0xA0A2, 0x5560, 0xA05F, 0x5515, 0xA01C, 0x54CA, 0x9FDA, 0x547F,
104 								0x9F98, 0x5433, 0x9F56, 0x53E7, 0x9F14, 0x539B, 0x9ED2, 0x534F, 0x9E91, 0x5303, 0x9E50, 0x52B6, 0x9E0F, 0x5269, 0x9DCE, 0x521C, 0x9D8E, 0x51CF, 0x9D4E, 0x5181,
105 								0x9D0E, 0x5134, 0x9CCE, 0x50E6, 0x9C8F, 0x5098, 0x9C50, 0x504A, 0x9C11, 0x4FFB, 0x9BD2, 0x4FAD, 0x9B94, 0x4F5E, 0x9B55, 0x4F0F, 0x9B17, 0x4EC0, 0x9ADA, 0x4E71,
106 								0x9A9C, 0x4E21, 0x9A5F, 0x4DD1, 0x9A22, 0x4D81, 0x99E5, 0x4D31, 0x99A9, 0x4CE1, 0x996D, 0x4C91, 0x9930, 0x4C40, 0x98F5, 0x4BEF, 0x98B9, 0x4B9E, 0x987E, 0x4B4D,
107 								0x9843, 0x4AFB, 0x9808, 0x4AAA, 0x97CE, 0x4A58, 0x9793, 0x4A06, 0x9759, 0x49B4, 0x9720, 0x4962, 0x96E6, 0x490F, 0x96AD, 0x48BD, 0x9674, 0x486A, 0x963B, 0x4817,
108 								0x9603, 0x47C4, 0x95CA, 0x4770, 0x9592, 0x471D, 0x955B, 0x46C9, 0x9523, 0x4675, 0x94EC, 0x4621, 0x94B5, 0x45CD, 0x947E, 0x4579, 0x9448, 0x4524, 0x9412, 0x44D0,
109 								0x93DC, 0x447B, 0x93A6, 0x4426, 0x9371, 0x43D1, 0x933C, 0x437B, 0x9307, 0x4326, 0x92D2, 0x42D0, 0x929E, 0x427A, 0x926A, 0x4224, 0x9236, 0x41CE, 0x9202, 0x4178,
110 								0x91CF, 0x4121, 0x919C, 0x40CB, 0x9169, 0x4074, 0x9137, 0x401D, 0x9105, 0x3FC6, 0x90D3, 0x3F6F, 0x90A1, 0x3F17, 0x9070, 0x3EC0, 0x903E, 0x3E68, 0x900E, 0x3E10,
111 								0x8FDD, 0x3DB8, 0x8FAD, 0x3D60, 0x8F7D, 0x3D08, 0x8F4D, 0x3CAF, 0x8F1D, 0x3C57, 0x8EEE, 0x3BFE, 0x8EBF, 0x3BA5, 0x8E90, 0x3B4C, 0x8E62, 0x3AF3, 0x8E34, 0x3A9A,
112 								0x8E06, 0x3A40, 0x8DD8, 0x39E7, 0x8DAB, 0x398D, 0x8D7E, 0x3933, 0x8D51, 0x38D9, 0x8D24, 0x387F, 0x8CF8, 0x3825, 0x8CCC, 0x37CA, 0x8CA1, 0x3770, 0x8C75, 0x3715,
113 								0x8C4A, 0x36BA, 0x8C1F, 0x365F, 0x8BF5, 0x3604, 0x8BCA, 0x35A9, 0x8BA0, 0x354E, 0x8B77, 0x34F2, 0x8B4D, 0x3497, 0x8B24, 0x343B, 0x8AFB, 0x33DF, 0x8AD3, 0x3383,
114 								0x8AAA, 0x3327, 0x8A82, 0x32CB, 0x8A5A, 0x326E, 0x8A33, 0x3212, 0x8A0C, 0x31B5, 0x89E5, 0x3159, 0x89BE, 0x30FC, 0x8998, 0x309F, 0x8972, 0x3042, 0x894C, 0x2FE5,
115 								0x8927, 0x2F87, 0x8902, 0x2F2A, 0x88DD, 0x2ECC, 0x88B8, 0x2E6F, 0x8894, 0x2E11, 0x8870, 0x2DB3, 0x884C, 0x2D55, 0x8828, 0x2CF7, 0x8805, 0x2C99, 0x87E2, 0x2C3B,
116 								0x87C0, 0x2BDC, 0x879D, 0x2B7E, 0x877B, 0x2B1F, 0x875A, 0x2AC1, 0x8738, 0x2A62, 0x8717, 0x2A03, 0x86F6, 0x29A4, 0x86D6, 0x2945, 0x86B6, 0x28E5, 0x8696, 0x2886,
117 								0x8676, 0x2827, 0x8656, 0x27C7, 0x8637, 0x2768, 0x8619, 0x2708, 0x85FA, 0x26A8, 0x85DC, 0x2648, 0x85BE, 0x25E8, 0x85A0, 0x2588, 0x8583, 0x2528, 0x8566, 0x24C8,
118 								0x8549, 0x2467, 0x852D, 0x2407, 0x8511, 0x23A7, 0x84F5, 0x2346, 0x84D9, 0x22E5, 0x84BE, 0x2284, 0x84A3, 0x2224, 0x8488, 0x21C3, 0x846E, 0x2162, 0x8454, 0x2101,
119 								0x843A, 0x209F, 0x8421, 0x203E, 0x8407, 0x1FDD, 0x83EF, 0x1F7B, 0x83D6, 0x1F1A, 0x83BE, 0x1EB8, 0x83A6, 0x1E57, 0x838E, 0x1DF5, 0x8377, 0x1D93, 0x8360, 0x1D31,
120 								0x8349, 0x1CD0, 0x8332, 0x1C6E, 0x831C, 0x1C0C, 0x8306, 0x1BA9, 0x82F1, 0x1B47, 0x82DB, 0x1AE5, 0x82C6, 0x1A83, 0x82B2, 0x1A20, 0x829D, 0x19BE, 0x8289, 0x195B,
121 								0x8276, 0x18F9, 0x8262, 0x1896, 0x824F, 0x1833, 0x823C, 0x17D1, 0x822A, 0x176E, 0x8217, 0x170B, 0x8205, 0x16A8, 0x81F4, 0x1645, 0x81E2, 0x15E2, 0x81D1, 0x157F,
122 								0x81C1, 0x151C, 0x81B0, 0x14B9, 0x81A0, 0x1455, 0x8190, 0x13F2, 0x8181, 0x138F, 0x8172, 0x132B, 0x8163, 0x12C8, 0x8154, 0x1265, 0x8146, 0x1201, 0x8138, 0x119E,
123 								0x812A, 0x113A, 0x811D, 0x10D6, 0x8110, 0x1073, 0x8103, 0x100F, 0x80F6, 0x0FAB, 0x80EA, 0x0F47, 0x80DE, 0x0EE4, 0x80D3, 0x0E80, 0x80C8, 0x0E1C, 0x80BD, 0x0DB8,
124 								0x80B2, 0x0D54, 0x80A8, 0x0CF0, 0x809E, 0x0C8C, 0x8094, 0x0C28, 0x808B, 0x0BC4, 0x8082, 0x0B60, 0x8079, 0x0AFB, 0x8070, 0x0A97, 0x8068, 0x0A33, 0x8060, 0x09CF,
125 								0x8059, 0x096B, 0x8052, 0x0906, 0x804B, 0x08A2, 0x8044, 0x083E, 0x803E, 0x07D9, 0x8038, 0x0775, 0x8032, 0x0711, 0x802D, 0x06AC, 0x8027, 0x0648, 0x8023, 0x05E3,
126 								0x801E, 0x057F, 0x801A, 0x051B, 0x8016, 0x04B6, 0x8013, 0x0452, 0x800F, 0x03ED, 0x800C, 0x0389, 0x800A, 0x0324, 0x8008, 0x02C0, 0x8006, 0x025B, 0x8004, 0x01F7,
127 								0x8002, 0x0192, 0x8001, 0x012E, 0x8001, 0x00C9, 0x8000, 0x0065, 0x8000, 0x0000, 0x8000, 0xFF9B, 0x8001, 0xFF37, 0x8001, 0xFED2, 0x8002, 0xFE6E, 0x8004, 0xFE09,
128 								0x8006, 0xFDA5, 0x8008, 0xFD40, 0x800A, 0xFCDC, 0x800C, 0xFC77, 0x800F, 0xFC13, 0x8013, 0xFBAE, 0x8016, 0xFB4A, 0x801A, 0xFAE5, 0x801E, 0xFA81, 0x8023, 0xFA1D,
129 								0x8027, 0xF9B8, 0x802D, 0xF954, 0x8032, 0xF8EF, 0x8038, 0xF88B, 0x803E, 0xF827, 0x8044, 0xF7C2, 0x804B, 0xF75E, 0x8052, 0xF6FA, 0x8059, 0xF695, 0x8060, 0xF631,
130 								0x8068, 0xF5CD, 0x8070, 0xF569, 0x8079, 0xF505, 0x8082, 0xF4A0, 0x808B, 0xF43C, 0x8094, 0xF3D8, 0x809E, 0xF374, 0x80A8, 0xF310, 0x80B2, 0xF2AC, 0x80BD, 0xF248,
131 								0x80C8, 0xF1E4, 0x80D3, 0xF180, 0x80DE, 0xF11C, 0x80EA, 0xF0B9, 0x80F6, 0xF055, 0x8103, 0xEFF1, 0x8110, 0xEF8D, 0x811D, 0xEF2A, 0x812A, 0xEEC6, 0x8138, 0xEE62,
132 								0x8146, 0xEDFF, 0x8154, 0xED9B, 0x8163, 0xED38, 0x8172, 0xECD5, 0x8181, 0xEC71, 0x8190, 0xEC0E, 0x81A0, 0xEBAB, 0x81B0, 0xEB47, 0x81C1, 0xEAE4, 0x81D1, 0xEA81,
133 								0x81E2, 0xEA1E, 0x81F4, 0xE9BB, 0x8205, 0xE958, 0x8217, 0xE8F5, 0x822A, 0xE892, 0x823C, 0xE82F, 0x824F, 0xE7CD, 0x8262, 0xE76A, 0x8276, 0xE707, 0x8289, 0xE6A5,
134 								0x829D, 0xE642, 0x82B2, 0xE5E0, 0x82C6, 0xE57D, 0x82DB, 0xE51B, 0x82F1, 0xE4B9, 0x8306, 0xE457, 0x831C, 0xE3F4, 0x8332, 0xE392, 0x8349, 0xE330, 0x8360, 0xE2CF,
135 								0x8377, 0xE26D, 0x838E, 0xE20B, 0x83A6, 0xE1A9, 0x83BE, 0xE148, 0x83D6, 0xE0E6, 0x83EF, 0xE085, 0x8407, 0xE023, 0x8421, 0xDFC2, 0x843A, 0xDF61, 0x8454, 0xDEFF,
136 								0x846E, 0xDE9E, 0x8488, 0xDE3D, 0x84A3, 0xDDDC, 0x84BE, 0xDD7C, 0x84D9, 0xDD1B, 0x84F5, 0xDCBA, 0x8511, 0xDC59, 0x852D, 0xDBF9, 0x8549, 0xDB99, 0x8566, 0xDB38,
137 								0x8583, 0xDAD8, 0x85A0, 0xDA78, 0x85BE, 0xDA18, 0x85DC, 0xD9B8, 0x85FA, 0xD958, 0x8619, 0xD8F8, 0x8637, 0xD898, 0x8656, 0xD839, 0x8676, 0xD7D9, 0x8696, 0xD77A,
138 								0x86B6, 0xD71B, 0x86D6, 0xD6BB, 0x86F6, 0xD65C, 0x8717, 0xD5FD, 0x8738, 0xD59E, 0x875A, 0xD53F, 0x877B, 0xD4E1, 0x879D, 0xD482, 0x87C0, 0xD424, 0x87E2, 0xD3C5,
139 								0x8805, 0xD367, 0x8828, 0xD309, 0x884C, 0xD2AB, 0x8870, 0xD24D, 0x8894, 0xD1EF, 0x88B8, 0xD191, 0x88DD, 0xD134, 0x8902, 0xD0D6, 0x8927, 0xD079, 0x894C, 0xD01B,
140 								0x8972, 0xCFBE, 0x8998, 0xCF61, 0x89BE, 0xCF04, 0x89E5, 0xCEA7, 0x8A0C, 0xCE4B, 0x8A33, 0xCDEE, 0x8A5A, 0xCD92, 0x8A82, 0xCD35, 0x8AAA, 0xCCD9, 0x8AD3, 0xCC7D,
141 								0x8AFB, 0xCC21, 0x8B24, 0xCBC5, 0x8B4D, 0xCB69, 0x8B77, 0xCB0E, 0x8BA0, 0xCAB2, 0x8BCA, 0xCA57, 0x8BF5, 0xC9FC, 0x8C1F, 0xC9A1, 0x8C4A, 0xC946, 0x8C75, 0xC8EB,
142 								0x8CA1, 0xC890, 0x8CCC, 0xC836, 0x8CF8, 0xC7DB, 0x8D24, 0xC781, 0x8D51, 0xC727, 0x8D7E, 0xC6CD, 0x8DAB, 0xC673, 0x8DD8, 0xC619, 0x8E06, 0xC5C0, 0x8E34, 0xC566,
143 								0x8E62, 0xC50D, 0x8E90, 0xC4B4, 0x8EBF, 0xC45B, 0x8EEE, 0xC402, 0x8F1D, 0xC3A9, 0x8F4D, 0xC351, 0x8F7D, 0xC2F8, 0x8FAD, 0xC2A0, 0x8FDD, 0xC248, 0x900E, 0xC1F0,
144 								0x903E, 0xC198, 0x9070, 0xC140, 0x90A1, 0xC0E9, 0x90D3, 0xC091, 0x9105, 0xC03A, 0x9137, 0xBFE3, 0x9169, 0xBF8C, 0x919C, 0xBF35, 0x91CF, 0xBEDF, 0x9202, 0xBE88,
145 								0x9236, 0xBE32, 0x926A, 0xBDDC, 0x929E, 0xBD86, 0x92D2, 0xBD30, 0x9307, 0xBCDA, 0x933C, 0xBC85, 0x9371, 0xBC2F, 0x93A6, 0xBBDA, 0x93DC, 0xBB85, 0x9412, 0xBB30,
146 								0x9448, 0xBADC, 0x947E, 0xBA87, 0x94B5, 0xBA33, 0x94EC, 0xB9DF, 0x9523, 0xB98B, 0x955B, 0xB937, 0x9592, 0xB8E3, 0x95CA, 0xB890, 0x9603, 0xB83C, 0x963B, 0xB7E9,
147 								0x9674, 0xB796, 0x96AD, 0xB743, 0x96E6, 0xB6F1, 0x9720, 0xB69E, 0x9759, 0xB64C, 0x9793, 0xB5FA, 0x97CE, 0xB5A8, 0x9808, 0xB556, 0x9843, 0xB505, 0x987E, 0xB4B3,
148 								0x98B9, 0xB462, 0x98F5, 0xB411, 0x9930, 0xB3C0, 0x996D, 0xB36F, 0x99A9, 0xB31F, 0x99E5, 0xB2CF, 0x9A22, 0xB27F, 0x9A5F, 0xB22F, 0x9A9C, 0xB1DF, 0x9ADA, 0xB18F,
149 								0x9B17, 0xB140, 0x9B55, 0xB0F1, 0x9B94, 0xB0A2, 0x9BD2, 0xB053, 0x9C11, 0xB005, 0x9C50, 0xAFB6, 0x9C8F, 0xAF68, 0x9CCE, 0xAF1A, 0x9D0E, 0xAECC, 0x9D4E, 0xAE7F,
150 								0x9D8E, 0xAE31, 0x9DCE, 0xADE4, 0x9E0F, 0xAD97, 0x9E50, 0xAD4A, 0x9E91, 0xACFD, 0x9ED2, 0xACB1, 0x9F14, 0xAC65, 0x9F56, 0xAC19, 0x9F98, 0xABCD, 0x9FDA, 0xAB81,
151 								0xA01C, 0xAB36, 0xA05F, 0xAAEB, 0xA0A2, 0xAAA0, 0xA0E5, 0xAA55, 0xA129, 0xAA0A, 0xA16C, 0xA9C0, 0xA1B0, 0xA976, 0xA1F4, 0xA92C, 0xA238, 0xA8E2, 0xA27D, 0xA899,
152 								0xA2C2, 0xA84F, 0xA307, 0xA806, 0xA34C, 0xA7BD, 0xA391, 0xA774, 0xA3D7, 0xA72C, 0xA41D, 0xA6E4, 0xA463, 0xA69C, 0xA4A9, 0xA654, 0xA4F0, 0xA60C, 0xA537, 0xA5C5,
153 								0xA57E, 0xA57E, 0xA5C5, 0xA537, 0xA60C, 0xA4F0, 0xA654, 0xA4A9, 0xA69C, 0xA463, 0xA6E4, 0xA41D, 0xA72C, 0xA3D7, 0xA774, 0xA391, 0xA7BD, 0xA34C, 0xA806, 0xA307,
154 								0xA84F, 0xA2C2, 0xA899, 0xA27D, 0xA8E2, 0xA238, 0xA92C, 0xA1F4, 0xA976, 0xA1B0, 0xA9C0, 0xA16C, 0xAA0A, 0xA129, 0xAA55, 0xA0E5, 0xAAA0, 0xA0A2, 0xAAEB, 0xA05F,
155 								0xAB36, 0xA01C, 0xAB81, 0x9FDA, 0xABCD, 0x9F98, 0xAC19, 0x9F56, 0xAC65, 0x9F14, 0xACB1, 0x9ED2, 0xACFD, 0x9E91, 0xAD4A, 0x9E50, 0xAD97, 0x9E0F, 0xADE4, 0x9DCE,
156 								0xAE31, 0x9D8E, 0xAE7F, 0x9D4E, 0xAECC, 0x9D0E, 0xAF1A, 0x9CCE, 0xAF68, 0x9C8F, 0xAFB6, 0x9C50, 0xB005, 0x9C11, 0xB053, 0x9BD2, 0xB0A2, 0x9B94, 0xB0F1, 0x9B55,
157 								0xB140, 0x9B17, 0xB18F, 0x9ADA, 0xB1DF, 0x9A9C, 0xB22F, 0x9A5F, 0xB27F, 0x9A22, 0xB2CF, 0x99E5, 0xB31F, 0x99A9, 0xB36F, 0x996D, 0xB3C0, 0x9930, 0xB411, 0x98F5,
158 								0xB462, 0x98B9, 0xB4B3, 0x987E, 0xB505, 0x9843, 0xB556, 0x9808, 0xB5A8, 0x97CE, 0xB5FA, 0x9793, 0xB64C, 0x9759, 0xB69E, 0x9720, 0xB6F1, 0x96E6, 0xB743, 0x96AD,
159 								0xB796, 0x9674, 0xB7E9, 0x963B, 0xB83C, 0x9603, 0xB890, 0x95CA, 0xB8E3, 0x9592, 0xB937, 0x955B, 0xB98B, 0x9523, 0xB9DF, 0x94EC, 0xBA33, 0x94B5, 0xBA87, 0x947E,
160 								0xBADC, 0x9448, 0xBB30, 0x9412, 0xBB85, 0x93DC, 0xBBDA, 0x93A6, 0xBC2F, 0x9371, 0xBC85, 0x933C, 0xBCDA, 0x9307, 0xBD30, 0x92D2, 0xBD86, 0x929E, 0xBDDC, 0x926A,
161 								0xBE32, 0x9236, 0xBE88, 0x9202, 0xBEDF, 0x91CF, 0xBF35, 0x919C, 0xBF8C, 0x9169, 0xBFE3, 0x9137, 0xC03A, 0x9105, 0xC091, 0x90D3, 0xC0E9, 0x90A1, 0xC140, 0x9070,
162 								0xC198, 0x903E, 0xC1F0, 0x900E, 0xC248, 0x8FDD, 0xC2A0, 0x8FAD, 0xC2F8, 0x8F7D, 0xC351, 0x8F4D, 0xC3A9, 0x8F1D, 0xC402, 0x8EEE, 0xC45B, 0x8EBF, 0xC4B4, 0x8E90,
163 								0xC50D, 0x8E62, 0xC566, 0x8E34, 0xC5C0, 0x8E06, 0xC619, 0x8DD8, 0xC673, 0x8DAB, 0xC6CD, 0x8D7E, 0xC727, 0x8D51, 0xC781, 0x8D24, 0xC7DB, 0x8CF8, 0xC836, 0x8CCC,
164 								0xC890, 0x8CA1, 0xC8EB, 0x8C75, 0xC946, 0x8C4A, 0xC9A1, 0x8C1F, 0xC9FC, 0x8BF5, 0xCA57, 0x8BCA, 0xCAB2, 0x8BA0, 0xCB0E, 0x8B77, 0xCB69, 0x8B4D, 0xCBC5, 0x8B24,
165 								0xCC21, 0x8AFB, 0xCC7D, 0x8AD3, 0xCCD9, 0x8AAA, 0xCD35, 0x8A82, 0xCD92, 0x8A5A, 0xCDEE, 0x8A33, 0xCE4B, 0x8A0C, 0xCEA7, 0x89E5, 0xCF04, 0x89BE, 0xCF61, 0x8998,
166 								0xCFBE, 0x8972, 0xD01B, 0x894C, 0xD079, 0x8927, 0xD0D6, 0x8902, 0xD134, 0x88DD, 0xD191, 0x88B8, 0xD1EF, 0x8894, 0xD24D, 0x8870, 0xD2AB, 0x884C, 0xD309, 0x8828,
167 								0xD367, 0x8805, 0xD3C5, 0x87E2, 0xD424, 0x87C0, 0xD482, 0x879D, 0xD4E1, 0x877B, 0xD53F, 0x875A, 0xD59E, 0x8738, 0xD5FD, 0x8717, 0xD65C, 0x86F6, 0xD6BB, 0x86D6,
168 								0xD71B, 0x86B6, 0xD77A, 0x8696, 0xD7D9, 0x8676, 0xD839, 0x8656, 0xD898, 0x8637, 0xD8F8, 0x8619, 0xD958, 0x85FA, 0xD9B8, 0x85DC, 0xDA18, 0x85BE, 0xDA78, 0x85A0,
169 								0xDAD8, 0x8583, 0xDB38, 0x8566, 0xDB99, 0x8549, 0xDBF9, 0x852D, 0xDC59, 0x8511, 0xDCBA, 0x84F5, 0xDD1B, 0x84D9, 0xDD7C, 0x84BE, 0xDDDC, 0x84A3, 0xDE3D, 0x8488,
170 								0xDE9E, 0x846E, 0xDEFF, 0x8454, 0xDF61, 0x843A, 0xDFC2, 0x8421, 0xE023, 0x8407, 0xE085, 0x83EF, 0xE0E6, 0x83D6, 0xE148, 0x83BE, 0xE1A9, 0x83A6, 0xE20B, 0x838E,
171 								0xE26D, 0x8377, 0xE2CF, 0x8360, 0xE330, 0x8349, 0xE392, 0x8332, 0xE3F4, 0x831C, 0xE457, 0x8306, 0xE4B9, 0x82F1, 0xE51B, 0x82DB, 0xE57D, 0x82C6, 0xE5E0, 0x82B2,
172 								0xE642, 0x829D, 0xE6A5, 0x8289, 0xE707, 0x8276, 0xE76A, 0x8262, 0xE7CD, 0x824F, 0xE82F, 0x823C, 0xE892, 0x822A, 0xE8F5, 0x8217, 0xE958, 0x8205, 0xE9BB, 0x81F4,
173 								0xEA1E, 0x81E2, 0xEA81, 0x81D1, 0xEAE4, 0x81C1, 0xEB47, 0x81B0, 0xEBAB, 0x81A0, 0xEC0E, 0x8190, 0xEC71, 0x8181, 0xECD5, 0x8172, 0xED38, 0x8163, 0xED9B, 0x8154,
174 								0xEDFF, 0x8146, 0xEE62, 0x8138, 0xEEC6, 0x812A, 0xEF2A, 0x811D, 0xEF8D, 0x8110, 0xEFF1, 0x8103, 0xF055, 0x80F6, 0xF0B9, 0x80EA, 0xF11C, 0x80DE, 0xF180, 0x80D3,
175 								0xF1E4, 0x80C8, 0xF248, 0x80BD, 0xF2AC, 0x80B2, 0xF310, 0x80A8, 0xF374, 0x809E, 0xF3D8, 0x8094, 0xF43C, 0x808B, 0xF4A0, 0x8082, 0xF505, 0x8079, 0xF569, 0x8070,
176 								0xF5CD, 0x8068, 0xF631, 0x8060, 0xF695, 0x8059, 0xF6FA, 0x8052, 0xF75E, 0x804B, 0xF7C2, 0x8044, 0xF827, 0x803E, 0xF88B, 0x8038, 0xF8EF, 0x8032, 0xF954, 0x802D,
177 								0xF9B8, 0x8027, 0xFA1D, 0x8023, 0xFA81, 0x801E, 0xFAE5, 0x801A, 0xFB4A, 0x8016, 0xFBAE, 0x8013, 0xFC13, 0x800F, 0xFC77, 0x800C, 0xFCDC, 0x800A, 0xFD40, 0x8008,
178 								0xFDA5, 0x8006, 0xFE09, 0x8004, 0xFE6E, 0x8002, 0xFED2, 0x8001, 0xFF37, 0x8001, 0xFF9B, 0x8000, 0x0000, 0x8000, 0x0065, 0x8000, 0x00C9, 0x8001, 0x012E, 0x8001,
179 								0x0192, 0x8002, 0x01F7, 0x8004, 0x025B, 0x8006, 0x02C0, 0x8008, 0x0324, 0x800A, 0x0389, 0x800C, 0x03ED, 0x800F, 0x0452, 0x8013, 0x04B6, 0x8016, 0x051B, 0x801A,
180 								0x057F, 0x801E, 0x05E3, 0x8023, 0x0648, 0x8027, 0x06AC, 0x802D, 0x0711, 0x8032, 0x0775, 0x8038, 0x07D9, 0x803E, 0x083E, 0x8044, 0x08A2, 0x804B, 0x0906, 0x8052,
181 								0x096B, 0x8059, 0x09CF, 0x8060, 0x0A33, 0x8068, 0x0A97, 0x8070, 0x0AFB, 0x8079, 0x0B60, 0x8082, 0x0BC4, 0x808B, 0x0C28, 0x8094, 0x0C8C, 0x809E, 0x0CF0, 0x80A8,
182 								0x0D54, 0x80B2, 0x0DB8, 0x80BD, 0x0E1C, 0x80C8, 0x0E80, 0x80D3, 0x0EE4, 0x80DE, 0x0F47, 0x80EA, 0x0FAB, 0x80F6, 0x100F, 0x8103, 0x1073, 0x8110, 0x10D6, 0x811D,
183 								0x113A, 0x812A, 0x119E, 0x8138, 0x1201, 0x8146, 0x1265, 0x8154, 0x12C8, 0x8163, 0x132B, 0x8172, 0x138F, 0x8181, 0x13F2, 0x8190, 0x1455, 0x81A0, 0x14B9, 0x81B0,
184 								0x151C, 0x81C1, 0x157F, 0x81D1, 0x15E2, 0x81E2, 0x1645, 0x81F4, 0x16A8, 0x8205, 0x170B, 0x8217, 0x176E, 0x822A, 0x17D1, 0x823C, 0x1833, 0x824F, 0x1896, 0x8262,
185 								0x18F9, 0x8276, 0x195B, 0x8289, 0x19BE, 0x829D, 0x1A20, 0x82B2, 0x1A83, 0x82C6, 0x1AE5, 0x82DB, 0x1B47, 0x82F1, 0x1BA9, 0x8306, 0x1C0C, 0x831C, 0x1C6E, 0x8332,
186 								0x1CD0, 0x8349, 0x1D31, 0x8360, 0x1D93, 0x8377, 0x1DF5, 0x838E, 0x1E57, 0x83A6, 0x1EB8, 0x83BE, 0x1F1A, 0x83D6, 0x1F7B, 0x83EF, 0x1FDD, 0x8407, 0x203E, 0x8421,
187 								0x209F, 0x843A, 0x2101, 0x8454, 0x2162, 0x846E, 0x21C3, 0x8488, 0x2224, 0x84A3, 0x2284, 0x84BE, 0x22E5, 0x84D9, 0x2346, 0x84F5, 0x23A7, 0x8511, 0x2407, 0x852D,
188 								0x2467, 0x8549, 0x24C8, 0x8566, 0x2528, 0x8583, 0x2588, 0x85A0, 0x25E8, 0x85BE, 0x2648, 0x85DC, 0x26A8, 0x85FA, 0x2708, 0x8619, 0x2768, 0x8637, 0x27C7, 0x8656,
189 								0x2827, 0x8676, 0x2886, 0x8696, 0x28E5, 0x86B6, 0x2945, 0x86D6, 0x29A4, 0x86F6, 0x2A03, 0x8717, 0x2A62, 0x8738, 0x2AC1, 0x875A, 0x2B1F, 0x877B, 0x2B7E, 0x879D,
190 								0x2BDC, 0x87C0, 0x2C3B, 0x87E2, 0x2C99, 0x8805, 0x2CF7, 0x8828, 0x2D55, 0x884C, 0x2DB3, 0x8870, 0x2E11, 0x8894, 0x2E6F, 0x88B8, 0x2ECC, 0x88DD, 0x2F2A, 0x8902,
191 								0x2F87, 0x8927, 0x2FE5, 0x894C, 0x3042, 0x8972, 0x309F, 0x8998, 0x30FC, 0x89BE, 0x3159, 0x89E5, 0x31B5, 0x8A0C, 0x3212, 0x8A33, 0x326E, 0x8A5A, 0x32CB, 0x8A82,
192 								0x3327, 0x8AAA, 0x3383, 0x8AD3, 0x33DF, 0x8AFB, 0x343B, 0x8B24, 0x3497, 0x8B4D, 0x34F2, 0x8B77, 0x354E, 0x8BA0, 0x35A9, 0x8BCA, 0x3604, 0x8BF5, 0x365F, 0x8C1F,
193 								0x36BA, 0x8C4A, 0x3715, 0x8C75, 0x3770, 0x8CA1, 0x37CA, 0x8CCC, 0x3825, 0x8CF8, 0x387F, 0x8D24, 0x38D9, 0x8D51, 0x3933, 0x8D7E, 0x398D, 0x8DAB, 0x39E7, 0x8DD8,
194 								0x3A40, 0x8E06, 0x3A9A, 0x8E34, 0x3AF3, 0x8E62, 0x3B4C, 0x8E90, 0x3BA5, 0x8EBF, 0x3BFE, 0x8EEE, 0x3C57, 0x8F1D, 0x3CAF, 0x8F4D, 0x3D08, 0x8F7D, 0x3D60, 0x8FAD,
195 								0x3DB8, 0x8FDD, 0x3E10, 0x900E, 0x3E68, 0x903E, 0x3EC0, 0x9070, 0x3F17, 0x90A1, 0x3F6F, 0x90D3, 0x3FC6, 0x9105, 0x401D, 0x9137, 0x4074, 0x9169, 0x40CB, 0x919C,
196 								0x4121, 0x91CF, 0x4178, 0x9202, 0x41CE, 0x9236, 0x4224, 0x926A, 0x427A, 0x929E, 0x42D0, 0x92D2, 0x4326, 0x9307, 0x437B, 0x933C, 0x43D1, 0x9371, 0x4426, 0x93A6,
197 								0x447B, 0x93DC, 0x44D0, 0x9412, 0x4524, 0x9448, 0x4579, 0x947E, 0x45CD, 0x94B5, 0x4621, 0x94EC, 0x4675, 0x9523, 0x46C9, 0x955B, 0x471D, 0x9592, 0x4770, 0x95CA,
198 								0x47C4, 0x9603, 0x4817, 0x963B, 0x486A, 0x9674, 0x48BD, 0x96AD, 0x490F, 0x96E6, 0x4962, 0x9720, 0x49B4, 0x9759, 0x4A06, 0x9793, 0x4A58, 0x97CE, 0x4AAA, 0x9808,
199 								0x4AFB, 0x9843, 0x4B4D, 0x987E, 0x4B9E, 0x98B9, 0x4BEF, 0x98F5, 0x4C40, 0x9930, 0x4C91, 0x996D, 0x4CE1, 0x99A9, 0x4D31, 0x99E5, 0x4D81, 0x9A22, 0x4DD1, 0x9A5F,
200 								0x4E21, 0x9A9C, 0x4E71, 0x9ADA, 0x4EC0, 0x9B17, 0x4F0F, 0x9B55, 0x4F5E, 0x9B94, 0x4FAD, 0x9BD2, 0x4FFB, 0x9C11, 0x504A, 0x9C50, 0x5098, 0x9C8F, 0x50E6, 0x9CCE,
201 								0x5134, 0x9D0E, 0x5181, 0x9D4E, 0x51CF, 0x9D8E, 0x521C, 0x9DCE, 0x5269, 0x9E0F, 0x52B6, 0x9E50, 0x5303, 0x9E91, 0x534F, 0x9ED2, 0x539B, 0x9F14, 0x53E7, 0x9F56,
202 								0x5433, 0x9F98, 0x547F, 0x9FDA, 0x54CA, 0xA01C, 0x5515, 0xA05F, 0x5560, 0xA0A2, 0x55AB, 0xA0E5, 0x55F6, 0xA129, 0x5640, 0xA16C, 0x568A, 0xA1B0, 0x56D4, 0xA1F4,
203 								0x571E, 0xA238, 0x5767, 0xA27D, 0x57B1, 0xA2C2, 0x57FA, 0xA307, 0x5843, 0xA34C, 0x588C, 0xA391, 0x58D4, 0xA3D7, 0x591C, 0xA41D, 0x5964, 0xA463, 0x59AC, 0xA4A9,
204 								0x59F4, 0xA4F0, 0x5A3B, 0xA537, 0x5A82, 0xA57E, 0x5AC9, 0xA5C5, 0x5B10, 0xA60C, 0x5B57, 0xA654, 0x5B9D, 0xA69C, 0x5BE3, 0xA6E4, 0x5C29, 0xA72C, 0x5C6F, 0xA774,
205 								0x5CB4, 0xA7BD, 0x5CF9, 0xA806, 0x5D3E, 0xA84F, 0x5D83, 0xA899, 0x5DC8, 0xA8E2, 0x5E0C, 0xA92C, 0x5E50, 0xA976, 0x5E94, 0xA9C0, 0x5ED7, 0xAA0A, 0x5F1B, 0xAA55,
206 								0x5F5E, 0xAAA0, 0x5FA1, 0xAAEB, 0x5FE4, 0xAB36, 0x6026, 0xAB81, 0x6068, 0xABCD, 0x60AA, 0xAC19, 0x60EC, 0xAC65, 0x612E, 0xACB1, 0x616F, 0xACFD, 0x61B0, 0xAD4A,
207 								0x61F1, 0xAD97, 0x6232, 0xADE4, 0x6272, 0xAE31, 0x62B2, 0xAE7F, 0x62F2, 0xAECC, 0x6332, 0xAF1A, 0x6371, 0xAF68, 0x63B0, 0xAFB6, 0x63EF, 0xB005, 0x642E, 0xB053,
208 								0x646C, 0xB0A2, 0x64AB, 0xB0F1, 0x64E9, 0xB140, 0x6526, 0xB18F, 0x6564, 0xB1DF, 0x65A1, 0xB22F, 0x65DE, 0xB27F, 0x661B, 0xB2CF, 0x6657, 0xB31F, 0x6693, 0xB36F,
209 								0x66D0, 0xB3C0, 0x670B, 0xB411, 0x6747, 0xB462, 0x6782, 0xB4B3, 0x67BD, 0xB505, 0x67F8, 0xB556, 0x6832, 0xB5A8, 0x686D, 0xB5FA, 0x68A7, 0xB64C, 0x68E0, 0xB69E,
210 								0x691A, 0xB6F1, 0x6953, 0xB743, 0x698C, 0xB796, 0x69C5, 0xB7E9, 0x69FD, 0xB83C, 0x6A36, 0xB890, 0x6A6E, 0xB8E3, 0x6AA5, 0xB937, 0x6ADD, 0xB98B, 0x6B14, 0xB9DF,
211 								0x6B4B, 0xBA33, 0x6B82, 0xBA87, 0x6BB8, 0xBADC, 0x6BEE, 0xBB30, 0x6C24, 0xBB85, 0x6C5A, 0xBBDA, 0x6C8F, 0xBC2F, 0x6CC4, 0xBC85, 0x6CF9, 0xBCDA, 0x6D2E, 0xBD30,
212 								0x6D62, 0xBD86, 0x6D96, 0xBDDC, 0x6DCA, 0xBE32, 0x6DFE, 0xBE88, 0x6E31, 0xBEDF, 0x6E64, 0xBF35, 0x6E97, 0xBF8C, 0x6EC9, 0xBFE3, 0x6EFB, 0xC03A, 0x6F2D, 0xC091,
213 								0x6F5F, 0xC0E9, 0x6F90, 0xC140, 0x6FC2, 0xC198, 0x6FF2, 0xC1F0, 0x7023, 0xC248, 0x7053, 0xC2A0, 0x7083, 0xC2F8, 0x70B3, 0xC351, 0x70E3, 0xC3A9, 0x7112, 0xC402,
214 								0x7141, 0xC45B, 0x7170, 0xC4B4, 0x719E, 0xC50D, 0x71CC, 0xC566, 0x71FA, 0xC5C0, 0x7228, 0xC619, 0x7255, 0xC673, 0x7282, 0xC6CD, 0x72AF, 0xC727, 0x72DC, 0xC781,
215 								0x7308, 0xC7DB, 0x7334, 0xC836, 0x735F, 0xC890, 0x738B, 0xC8EB, 0x73B6, 0xC946, 0x73E1, 0xC9A1, 0x740B, 0xC9FC, 0x7436, 0xCA57, 0x7460, 0xCAB2, 0x7489, 0xCB0E,
216 								0x74B3, 0xCB69, 0x74DC, 0xCBC5, 0x7505, 0xCC21, 0x752D, 0xCC7D, 0x7556, 0xCCD9, 0x757E, 0xCD35, 0x75A6, 0xCD92, 0x75CD, 0xCDEE, 0x75F4, 0xCE4B, 0x761B, 0xCEA7,
217 								0x7642, 0xCF04, 0x7668, 0xCF61, 0x768E, 0xCFBE, 0x76B4, 0xD01B, 0x76D9, 0xD079, 0x76FE, 0xD0D6, 0x7723, 0xD134, 0x7748, 0xD191, 0x776C, 0xD1EF, 0x7790, 0xD24D,
218 								0x77B4, 0xD2AB, 0x77D8, 0xD309, 0x77FB, 0xD367, 0x781E, 0xD3C5, 0x7840, 0xD424, 0x7863, 0xD482, 0x7885, 0xD4E1, 0x78A6, 0xD53F, 0x78C8, 0xD59E, 0x78E9, 0xD5FD,
219 								0x790A, 0xD65C, 0x792A, 0xD6BB, 0x794A, 0xD71B, 0x796A, 0xD77A, 0x798A, 0xD7D9, 0x79AA, 0xD839, 0x79C9, 0xD898, 0x79E7, 0xD8F8, 0x7A06, 0xD958, 0x7A24, 0xD9B8,
220 								0x7A42, 0xDA18, 0x7A60, 0xDA78, 0x7A7D, 0xDAD8, 0x7A9A, 0xDB38, 0x7AB7, 0xDB99, 0x7AD3, 0xDBF9, 0x7AEF, 0xDC59, 0x7B0B, 0xDCBA, 0x7B27, 0xDD1B, 0x7B42, 0xDD7C,
221 								0x7B5D, 0xDDDC, 0x7B78, 0xDE3D, 0x7B92, 0xDE9E, 0x7BAC, 0xDEFF, 0x7BC6, 0xDF61, 0x7BDF, 0xDFC2, 0x7BF9, 0xE023, 0x7C11, 0xE085, 0x7C2A, 0xE0E6, 0x7C42, 0xE148,
222 								0x7C5A, 0xE1A9, 0x7C72, 0xE20B, 0x7C89, 0xE26D, 0x7CA0, 0xE2CF, 0x7CB7, 0xE330, 0x7CCE, 0xE392, 0x7CE4, 0xE3F4, 0x7CFA, 0xE457, 0x7D0F, 0xE4B9, 0x7D25, 0xE51B,
223 								0x7D3A, 0xE57D, 0x7D4E, 0xE5E0, 0x7D63, 0xE642, 0x7D77, 0xE6A5, 0x7D8A, 0xE707, 0x7D9E, 0xE76A, 0x7DB1, 0xE7CD, 0x7DC4, 0xE82F, 0x7DD6, 0xE892, 0x7DE9, 0xE8F5,
224 								0x7DFB, 0xE958, 0x7E0C, 0xE9BB, 0x7E1E, 0xEA1E, 0x7E2F, 0xEA81, 0x7E3F, 0xEAE4, 0x7E50, 0xEB47, 0x7E60, 0xEBAB, 0x7E70, 0xEC0E, 0x7E7F, 0xEC71, 0x7E8E, 0xECD5,
225 								0x7E9D, 0xED38, 0x7EAC, 0xED9B, 0x7EBA, 0xEDFF, 0x7EC8, 0xEE62, 0x7ED6, 0xEEC6, 0x7EE3, 0xEF2A, 0x7EF0, 0xEF8D, 0x7EFD, 0xEFF1, 0x7F0A, 0xF055, 0x7F16, 0xF0B9,
226 								0x7F22, 0xF11C, 0x7F2D, 0xF180, 0x7F38, 0xF1E4, 0x7F43, 0xF248, 0x7F4E, 0xF2AC, 0x7F58, 0xF310, 0x7F62, 0xF374, 0x7F6C, 0xF3D8, 0x7F75, 0xF43C, 0x7F7E, 0xF4A0,
227 								0x7F87, 0xF505, 0x7F90, 0xF569, 0x7F98, 0xF5CD, 0x7FA0, 0xF631, 0x7FA7, 0xF695, 0x7FAE, 0xF6FA, 0x7FB5, 0xF75E, 0x7FBC, 0xF7C2, 0x7FC2, 0xF827, 0x7FC8, 0xF88B,
228 								0x7FCE, 0xF8EF, 0x7FD3, 0xF954, 0x7FD9, 0xF9B8, 0x7FDD, 0xFA1D, 0x7FE2, 0xFA81, 0x7FE6, 0xFAE5, 0x7FEA, 0xFB4A, 0x7FED, 0xFBAE, 0x7FF1, 0xFC13, 0x7FF4, 0xFC77,
229 								0x7FF6, 0xFCDC, 0x7FF8, 0xFD40, 0x7FFA, 0xFDA5, 0x7FFC, 0xFE09, 0x7FFE, 0xFE6E, 0x7FFF, 0xFED2, 0x7FFF, 0xFF37, 0x7FFF, 0xFF9B, };
230 
231 #elif defined(MAX_FFT_SIZE_1024)
232 const INT16 radix4FftTwiddleArr[2*MAX_FFT_SIZE] = {0X7FFF,0X0000,0X7FFF,0X00C9,0X7FFE,0X0192,0X7FFA,0X025B,0X7FF6,0X0324,0X7FF1,0X03ED,0X7FEA,0X04B6,0X7FE2,0X057F,0X7FD9,0X0648,0X7FCE,0X0711,
233 												0X7FC2,0X07D9,0X7FB5,0X08A2,0X7FA7,0X096B,0X7F98,0X0A33,0X7F87,0X0AFB,0X7F75,0X0BC4,0X7F62,0X0C8C,0X7F4E,0X0D54,0X7F38,0X0E1C,0X7F22,0X0EE4,
234 												0X7F0A,0X0FAB,0X7EF0,0X1073,0X7ED6,0X113A,0X7EBA,0X1201,0X7E9D,0X12C8,0X7E7F,0X138F,0X7E60,0X1455,0X7E3F,0X151C,0X7E1E,0X15E2,0X7DFB,0X16A8,
235 												0X7DD6,0X176E,0X7DB1,0X1833,0X7D8A,0X18F9,0X7D63,0X19BE,0X7D3A,0X1A83,0X7D0F,0X1B47,0X7CE4,0X1C0C,0X7CB7,0X1CD0,0X7C89,0X1D93,0X7C5A,0X1E57,
236 												0X7C2A,0X1F1A,0X7BF9,0X1FDD,0X7BC6,0X209F,0X7B92,0X2162,0X7B5D,0X2224,0X7B27,0X22E5,0X7AEF,0X23A7,0X7AB7,0X2467,0X7A7D,0X2528,0X7A42,0X25E8,
237 												0X7A06,0X26A8,0X79C9,0X2768,0X798A,0X2827,0X794A,0X28E5,0X790A,0X29A4,0X78C8,0X2A62,0X7885,0X2B1F,0X7840,0X2BDC,0X77FB,0X2C99,0X77B4,0X2D55,
238 												0X776C,0X2E11,0X7723,0X2ECC,0X76D9,0X2F87,0X768E,0X3042,0X7642,0X30FC,0X75F4,0X31B5,0X75A6,0X326E,0X7556,0X3327,0X7505,0X33DF,0X74B3,0X3497,
239 												0X7460,0X354E,0X740B,0X3604,0X73B6,0X36BA,0X735F,0X3770,0X7308,0X3825,0X72AF,0X38D9,0X7255,0X398D,0X71FA,0X3A40,0X719E,0X3AF3,0X7141,0X3BA5,
240 												0X70E3,0X3C57,0X7083,0X3D08,0X7023,0X3DB8,0X6FC2,0X3E68,0X6F5F,0X3F17,0X6EFB,0X3FC6,0X6E97,0X4074,0X6E31,0X4121,0X6DCA,0X41CE,0X6D62,0X427A,
241 												0X6CF9,0X4326,0X6C8F,0X43D1,0X6C24,0X447B,0X6BB8,0X4524,0X6B4B,0X45CD,0X6ADD,0X4675,0X6A6E,0X471D,0X69FD,0X47C4,0X698C,0X486A,0X691A,0X490F,
242 												0X68A7,0X49B4,0X6832,0X4A58,0X67BD,0X4AFB,0X6747,0X4B9E,0X66D0,0X4C40,0X6657,0X4CE1,0X65DE,0X4D81,0X6564,0X4E21,0X64E9,0X4EC0,0X646C,0X4F5E,
243 												0X63EF,0X4FFB,0X6371,0X5098,0X62F2,0X5134,0X6272,0X51CF,0X61F1,0X5269,0X616F,0X5303,0X60EC,0X539B,0X6068,0X5433,0X5FE4,0X54CA,0X5F5E,0X5560,
244 												0X5ED7,0X55F6,0X5E50,0X568A,0X5DC8,0X571E,0X5D3E,0X57B1,0X5CB4,0X5843,0X5C29,0X58D4,0X5B9D,0X5964,0X5B10,0X59F4,0X5A82,0X5A82,0X59F4,0X5B10,
245 												0X5964,0X5B9D,0X58D4,0X5C29,0X5843,0X5CB4,0X57B1,0X5D3E,0X571E,0X5DC8,0X568A,0X5E50,0X55F6,0X5ED7,0X5560,0X5F5E,0X54CA,0X5FE4,0X5433,0X6068,
246 												0X539B,0X60EC,0X5303,0X616F,0X5269,0X61F1,0X51CF,0X6272,0X5134,0X62F2,0X5098,0X6371,0X4FFB,0X63EF,0X4F5E,0X646C,0X4EC0,0X64E9,0X4E21,0X6564,
247 												0X4D81,0X65DE,0X4CE1,0X6657,0X4C40,0X66D0,0X4B9E,0X6747,0X4AFB,0X67BD,0X4A58,0X6832,0X49B4,0X68A7,0X490F,0X691A,0X486A,0X698C,0X47C4,0X69FD,
248 												0X471D,0X6A6E,0X4675,0X6ADD,0X45CD,0X6B4B,0X4524,0X6BB8,0X447B,0X6C24,0X43D1,0X6C8F,0X4326,0X6CF9,0X427A,0X6D62,0X41CE,0X6DCA,0X4121,0X6E31,
249 												0X4074,0X6E97,0X3FC6,0X6EFB,0X3F17,0X6F5F,0X3E68,0X6FC2,0X3DB8,0X7023,0X3D08,0X7083,0X3C57,0X70E3,0X3BA5,0X7141,0X3AF3,0X719E,0X3A40,0X71FA,
250 												0X398D,0X7255,0X38D9,0X72AF,0X3825,0X7308,0X3770,0X735F,0X36BA,0X73B6,0X3604,0X740B,0X354E,0X7460,0X3497,0X74B3,0X33DF,0X7505,0X3327,0X7556,
251 												0X326E,0X75A6,0X31B5,0X75F4,0X30FC,0X7642,0X3042,0X768E,0X2F87,0X76D9,0X2ECC,0X7723,0X2E11,0X776C,0X2D55,0X77B4,0X2C99,0X77FB,0X2BDC,0X7840,
252 												0X2B1F,0X7885,0X2A62,0X78C8,0X29A4,0X790A,0X28E5,0X794A,0X2827,0X798A,0X2768,0X79C9,0X26A8,0X7A06,0X25E8,0X7A42,0X2528,0X7A7D,0X2467,0X7AB7,
253 												0X23A7,0X7AEF,0X22E5,0X7B27,0X2224,0X7B5D,0X2162,0X7B92,0X209F,0X7BC6,0X1FDD,0X7BF9,0X1F1A,0X7C2A,0X1E57,0X7C5A,0X1D93,0X7C89,0X1CD0,0X7CB7,
254 												0X1C0C,0X7CE4,0X1B47,0X7D0F,0X1A83,0X7D3A,0X19BE,0X7D63,0X18F9,0X7D8A,0X1833,0X7DB1,0X176E,0X7DD6,0X16A8,0X7DFB,0X15E2,0X7E1E,0X151C,0X7E3F,
255 												0X1455,0X7E60,0X138F,0X7E7F,0X12C8,0X7E9D,0X1201,0X7EBA,0X113A,0X7ED6,0X1073,0X7EF0,0X0FAB,0X7F0A,0X0EE4,0X7F22,0X0E1C,0X7F38,0X0D54,0X7F4E,
256 												0X0C8C,0X7F62,0X0BC4,0X7F75,0X0AFB,0X7F87,0X0A33,0X7F98,0X096B,0X7FA7,0X08A2,0X7FB5,0X07D9,0X7FC2,0X0711,0X7FCE,0X0648,0X7FD9,0X057F,0X7FE2,
257 												0X04B6,0X7FEA,0X03ED,0X7FF1,0X0324,0X7FF6,0X025B,0X7FFA,0X0192,0X7FFE,0X00C9,0X7FFF,0X0000,0X7FFF,0XFF37,0X7FFF,0XFE6E,0X7FFE,0XFDA5,0X7FFA,
258 												0XFCDC,0X7FF6,0XFC13,0X7FF1,0XFB4A,0X7FEA,0XFA81,0X7FE2,0XF9B8,0X7FD9,0XF8EF,0X7FCE,0XF827,0X7FC2,0XF75E,0X7FB5,0XF695,0X7FA7,0XF5CD,0X7F98,
259 												0XF505,0X7F87,0XF43C,0X7F75,0XF374,0X7F62,0XF2AC,0X7F4E,0XF1E4,0X7F38,0XF11C,0X7F22,0XF055,0X7F0A,0XEF8D,0X7EF0,0XEEC6,0X7ED6,0XEDFF,0X7EBA,
260 												0XED38,0X7E9D,0XEC71,0X7E7F,0XEBAB,0X7E60,0XEAE4,0X7E3F,0XEA1E,0X7E1E,0XE958,0X7DFB,0XE892,0X7DD6,0XE7CD,0X7DB1,0XE707,0X7D8A,0XE642,0X7D63,
261 												0XE57D,0X7D3A,0XE4B9,0X7D0F,0XE3F4,0X7CE4,0XE330,0X7CB7,0XE26D,0X7C89,0XE1A9,0X7C5A,0XE0E6,0X7C2A,0XE023,0X7BF9,0XDF61,0X7BC6,0XDE9E,0X7B92,
262 												0XDDDC,0X7B5D,0XDD1B,0X7B27,0XDC59,0X7AEF,0XDB99,0X7AB7,0XDAD8,0X7A7D,0XDA18,0X7A42,0XD958,0X7A06,0XD898,0X79C9,0XD7D9,0X798A,0XD71B,0X794A,
263 												0XD65C,0X790A,0XD59E,0X78C8,0XD4E1,0X7885,0XD424,0X7840,0XD367,0X77FB,0XD2AB,0X77B4,0XD1EF,0X776C,0XD134,0X7723,0XD079,0X76D9,0XCFBE,0X768E,
264 												0XCF04,0X7642,0XCE4B,0X75F4,0XCD92,0X75A6,0XCCD9,0X7556,0XCC21,0X7505,0XCB69,0X74B3,0XCAB2,0X7460,0XC9FC,0X740B,0XC946,0X73B6,0XC890,0X735F,
265 												0XC7DB,0X7308,0XC727,0X72AF,0XC673,0X7255,0XC5C0,0X71FA,0XC50D,0X719E,0XC45B,0X7141,0XC3A9,0X70E3,0XC2F8,0X7083,0XC248,0X7023,0XC198,0X6FC2,
266 												0XC0E9,0X6F5F,0XC03A,0X6EFB,0XBF8C,0X6E97,0XBEDF,0X6E31,0XBE32,0X6DCA,0XBD86,0X6D62,0XBCDA,0X6CF9,0XBC2F,0X6C8F,0XBB85,0X6C24,0XBADC,0X6BB8,
267 												0XBA33,0X6B4B,0XB98B,0X6ADD,0XB8E3,0X6A6E,0XB83C,0X69FD,0XB796,0X698C,0XB6F1,0X691A,0XB64C,0X68A7,0XB5A8,0X6832,0XB505,0X67BD,0XB462,0X6747,
268 												0XB3C0,0X66D0,0XB31F,0X6657,0XB27F,0X65DE,0XB1DF,0X6564,0XB140,0X64E9,0XB0A2,0X646C,0XB005,0X63EF,0XAF68,0X6371,0XAECC,0X62F2,0XAE31,0X6272,
269 												0XAD97,0X61F1,0XACFD,0X616F,0XAC65,0X60EC,0XABCD,0X6068,0XAB36,0X5FE4,0XAAA0,0X5F5E,0XAA0A,0X5ED7,0XA976,0X5E50,0XA8E2,0X5DC8,0XA84F,0X5D3E,
270 												0XA7BD,0X5CB4,0XA72C,0X5C29,0XA69C,0X5B9D,0XA60C,0X5B10,0XA57E,0X5A82,0XA4F0,0X59F4,0XA463,0X5964,0XA3D7,0X58D4,0XA34C,0X5843,0XA2C2,0X57B1,
271 												0XA238,0X571E,0XA1B0,0X568A,0XA129,0X55F6,0XA0A2,0X5560,0XA01C,0X54CA,0X9F98,0X5433,0X9F14,0X539B,0X9E91,0X5303,0X9E0F,0X5269,0X9D8E,0X51CF,
272 												0X9D0E,0X5134,0X9C8F,0X5098,0X9C11,0X4FFB,0X9B94,0X4F5E,0X9B17,0X4EC0,0X9A9C,0X4E21,0X9A22,0X4D81,0X99A9,0X4CE1,0X9930,0X4C40,0X98B9,0X4B9E,
273 												0X9843,0X4AFB,0X97CE,0X4A58,0X9759,0X49B4,0X96E6,0X490F,0X9674,0X486A,0X9603,0X47C4,0X9592,0X471D,0X9523,0X4675,0X94B5,0X45CD,0X9448,0X4524,
274 												0X93DC,0X447B,0X9371,0X43D1,0X9307,0X4326,0X929E,0X427A,0X9236,0X41CE,0X91CF,0X4121,0X9169,0X4074,0X9105,0X3FC6,0X90A1,0X3F17,0X903E,0X3E68,
275 												0X8FDD,0X3DB8,0X8F7D,0X3D08,0X8F1D,0X3C57,0X8EBF,0X3BA5,0X8E62,0X3AF3,0X8E06,0X3A40,0X8DAB,0X398D,0X8D51,0X38D9,0X8CF8,0X3825,0X8CA1,0X3770,
276 												0X8C4A,0X36BA,0X8BF5,0X3604,0X8BA0,0X354E,0X8B4D,0X3497,0X8AFB,0X33DF,0X8AAA,0X3327,0X8A5A,0X326E,0X8A0C,0X31B5,0X89BE,0X30FC,0X8972,0X3042,
277 												0X8927,0X2F87,0X88DD,0X2ECC,0X8894,0X2E11,0X884C,0X2D55,0X8805,0X2C99,0X87C0,0X2BDC,0X877B,0X2B1F,0X8738,0X2A62,0X86F6,0X29A4,0X86B6,0X28E5,
278 												0X8676,0X2827,0X8637,0X2768,0X85FA,0X26A8,0X85BE,0X25E8,0X8583,0X2528,0X8549,0X2467,0X8511,0X23A7,0X84D9,0X22E5,0X84A3,0X2224,0X846E,0X2162,
279 												0X843A,0X209F,0X8407,0X1FDD,0X83D6,0X1F1A,0X83A6,0X1E57,0X8377,0X1D93,0X8349,0X1CD0,0X831C,0X1C0C,0X82F1,0X1B47,0X82C6,0X1A83,0X829D,0X19BE,
280 												0X8276,0X18F9,0X824F,0X1833,0X822A,0X176E,0X8205,0X16A8,0X81E2,0X15E2,0X81C1,0X151C,0X81A0,0X1455,0X8181,0X138F,0X8163,0X12C8,0X8146,0X1201,
281 												0X812A,0X113A,0X8110,0X1073,0X80F6,0X0FAB,0X80DE,0X0EE4,0X80C8,0X0E1C,0X80B2,0X0D54,0X809E,0X0C8C,0X808B,0X0BC4,0X8079,0X0AFB,0X8068,0X0A33,
282 												0X8059,0X096B,0X804B,0X08A2,0X803E,0X07D9,0X8032,0X0711,0X8027,0X0648,0X801E,0X057F,0X8016,0X04B6,0X800F,0X03ED,0X800A,0X0324,0X8006,0X025B,
283 												0X8002,0X0192,0X8001,0X00C9,0X8001,0X0000,0X8001,0XFF37,0X8002,0XFE6E,0X8006,0XFDA5,0X800A,0XFCDC,0X800F,0XFC13,0X8016,0XFB4A,0X801E,0XFA81,
284 												0X8027,0XF9B8,0X8032,0XF8EF,0X803E,0XF827,0X804B,0XF75E,0X8059,0XF695,0X8068,0XF5CD,0X8079,0XF505,0X808B,0XF43C,0X809E,0XF374,0X80B2,0XF2AC,
285 												0X80C8,0XF1E4,0X80DE,0XF11C,0X80F6,0XF055,0X8110,0XEF8D,0X812A,0XEEC6,0X8146,0XEDFF,0X8163,0XED38,0X8181,0XEC71,0X81A0,0XEBAB,0X81C1,0XEAE4,
286 												0X81E2,0XEA1E,0X8205,0XE958,0X822A,0XE892,0X824F,0XE7CD,0X8276,0XE707,0X829D,0XE642,0X82C6,0XE57D,0X82F1,0XE4B9,0X831C,0XE3F4,0X8349,0XE330,
287 												0X8377,0XE26D,0X83A6,0XE1A9,0X83D6,0XE0E6,0X8407,0XE023,0X843A,0XDF61,0X846E,0XDE9E,0X84A3,0XDDDC,0X84D9,0XDD1B,0X8511,0XDC59,0X8549,0XDB99,
288 												0X8583,0XDAD8,0X85BE,0XDA18,0X85FA,0XD958,0X8637,0XD898,0X8676,0XD7D9,0X86B6,0XD71B,0X86F6,0XD65C,0X8738,0XD59E,0X877B,0XD4E1,0X87C0,0XD424,
289 												0X8805,0XD367,0X884C,0XD2AB,0X8894,0XD1EF,0X88DD,0XD134,0X8927,0XD079,0X8972,0XCFBE,0X89BE,0XCF04,0X8A0C,0XCE4B,0X8A5A,0XCD92,0X8AAA,0XCCD9,
290 												0X8AFB,0XCC21,0X8B4D,0XCB69,0X8BA0,0XCAB2,0X8BF5,0XC9FC,0X8C4A,0XC946,0X8CA1,0XC890,0X8CF8,0XC7DB,0X8D51,0XC727,0X8DAB,0XC673,0X8E06,0XC5C0,
291 												0X8E62,0XC50D,0X8EBF,0XC45B,0X8F1D,0XC3A9,0X8F7D,0XC2F8,0X8FDD,0XC248,0X903E,0XC198,0X90A1,0XC0E9,0X9105,0XC03A,0X9169,0XBF8C,0X91CF,0XBEDF,
292 												0X9236,0XBE32,0X929E,0XBD86,0X9307,0XBCDA,0X9371,0XBC2F,0X93DC,0XBB85,0X9448,0XBADC,0X94B5,0XBA33,0X9523,0XB98B,0X9592,0XB8E3,0X9603,0XB83C,
293 												0X9674,0XB796,0X96E6,0XB6F1,0X9759,0XB64C,0X97CE,0XB5A8,0X9843,0XB505,0X98B9,0XB462,0X9930,0XB3C0,0X99A9,0XB31F,0X9A22,0XB27F,0X9A9C,0XB1DF,
294 												0X9B17,0XB140,0X9B94,0XB0A2,0X9C11,0XB005,0X9C8F,0XAF68,0X9D0E,0XAECC,0X9D8E,0XAE31,0X9E0F,0XAD97,0X9E91,0XACFD,0X9F14,0XAC65,0X9F98,0XABCD,
295 												0XA01C,0XAB36,0XA0A2,0XAAA0,0XA129,0XAA0A,0XA1B0,0XA976,0XA238,0XA8E2,0XA2C2,0XA84F,0XA34C,0XA7BD,0XA3D7,0XA72C,0XA463,0XA69C,0XA4F0,0XA60C,
296 												0XA57E,0XA57E,0XA60C,0XA4F0,0XA69C,0XA463,0XA72C,0XA3D7,0XA7BD,0XA34C,0XA84F,0XA2C2,0XA8E2,0XA238,0XA976,0XA1B0,0XAA0A,0XA129,0XAAA0,0XA0A2,
297 												0XAB36,0XA01C,0XABCD,0X9F98,0XAC65,0X9F14,0XACFD,0X9E91,0XAD97,0X9E0F,0XAE31,0X9D8E,0XAECC,0X9D0E,0XAF68,0X9C8F,0XB005,0X9C11,0XB0A2,0X9B94,
298 												0XB140,0X9B17,0XB1DF,0X9A9C,0XB27F,0X9A22,0XB31F,0X99A9,0XB3C0,0X9930,0XB462,0X98B9,0XB505,0X9843,0XB5A8,0X97CE,0XB64C,0X9759,0XB6F1,0X96E6,
299 												0XB796,0X9674,0XB83C,0X9603,0XB8E3,0X9592,0XB98B,0X9523,0XBA33,0X94B5,0XBADC,0X9448,0XBB85,0X93DC,0XBC2F,0X9371,0XBCDA,0X9307,0XBD86,0X929E,
300 												0XBE32,0X9236,0XBEDF,0X91CF,0XBF8C,0X9169,0XC03A,0X9105,0XC0E9,0X90A1,0XC198,0X903E,0XC248,0X8FDD,0XC2F8,0X8F7D,0XC3A9,0X8F1D,0XC45B,0X8EBF,
301 												0XC50D,0X8E62,0XC5C0,0X8E06,0XC673,0X8DAB,0XC727,0X8D51,0XC7DB,0X8CF8,0XC890,0X8CA1,0XC946,0X8C4A,0XC9FC,0X8BF5,0XCAB2,0X8BA0,0XCB69,0X8B4D,
302 												0XCC21,0X8AFB,0XCCD9,0X8AAA,0XCD92,0X8A5A,0XCE4B,0X8A0C,0XCF04,0X89BE,0XCFBE,0X8972,0XD079,0X8927,0XD134,0X88DD,0XD1EF,0X8894,0XD2AB,0X884C,
303 												0XD367,0X8805,0XD424,0X87C0,0XD4E1,0X877B,0XD59E,0X8738,0XD65C,0X86F6,0XD71B,0X86B6,0XD7D9,0X8676,0XD898,0X8637,0XD958,0X85FA,0XDA18,0X85BE,
304 												0XDAD8,0X8583,0XDB99,0X8549,0XDC59,0X8511,0XDD1B,0X84D9,0XDDDC,0X84A3,0XDE9E,0X846E,0XDF61,0X843A,0XE023,0X8407,0XE0E6,0X83D6,0XE1A9,0X83A6,
305 												0XE26D,0X8377,0XE330,0X8349,0XE3F4,0X831C,0XE4B9,0X82F1,0XE57D,0X82C6,0XE642,0X829D,0XE707,0X8276,0XE7CD,0X824F,0XE892,0X822A,0XE958,0X8205,
306 												0XEA1E,0X81E2,0XEAE4,0X81C1,0XEBAB,0X81A0,0XEC71,0X8181,0XED38,0X8163,0XEDFF,0X8146,0XEEC6,0X812A,0XEF8D,0X8110,0XF055,0X80F6,0XF11C,0X80DE,
307 												0XF1E4,0X80C8,0XF2AC,0X80B2,0XF374,0X809E,0XF43C,0X808B,0XF505,0X8079,0XF5CD,0X8068,0XF695,0X8059,0XF75E,0X804B,0XF827,0X803E,0XF8EF,0X8032,
308 												0XF9B8,0X8027,0XFA81,0X801E,0XFB4A,0X8016,0XFC13,0X800F,0XFCDC,0X800A,0XFDA5,0X8006,0XFE6E,0X8002,0XFF37,0X8001,0X0000,0X8001,0X00C9,0X8001,
309 												0X0192,0X8002,0X025B,0X8006,0X0324,0X800A,0X03ED,0X800F,0X04B6,0X8016,0X057F,0X801E,0X0648,0X8027,0X0711,0X8032,0X07D9,0X803E,0X08A2,0X804B,
310 												0X096B,0X8059,0X0A33,0X8068,0X0AFB,0X8079,0X0BC4,0X808B,0X0C8C,0X809E,0X0D54,0X80B2,0X0E1C,0X80C8,0X0EE4,0X80DE,0X0FAB,0X80F6,0X1073,0X8110,
311 												0X113A,0X812A,0X1201,0X8146,0X12C8,0X8163,0X138F,0X8181,0X1455,0X81A0,0X151C,0X81C1,0X15E2,0X81E2,0X16A8,0X8205,0X176E,0X822A,0X1833,0X824F,
312 												0X18F9,0X8276,0X19BE,0X829D,0X1A83,0X82C6,0X1B47,0X82F1,0X1C0C,0X831C,0X1CD0,0X8349,0X1D93,0X8377,0X1E57,0X83A6,0X1F1A,0X83D6,0X1FDD,0X8407,
313 												0X209F,0X843A,0X2162,0X846E,0X2224,0X84A3,0X22E5,0X84D9,0X23A7,0X8511,0X2467,0X8549,0X2528,0X8583,0X25E8,0X85BE,0X26A8,0X85FA,0X2768,0X8637,
314 												0X2827,0X8676,0X28E5,0X86B6,0X29A4,0X86F6,0X2A62,0X8738,0X2B1F,0X877B,0X2BDC,0X87C0,0X2C99,0X8805,0X2D55,0X884C,0X2E11,0X8894,0X2ECC,0X88DD,
315 												0X2F87,0X8927,0X3042,0X8972,0X30FC,0X89BE,0X31B5,0X8A0C,0X326E,0X8A5A,0X3327,0X8AAA,0X33DF,0X8AFB,0X3497,0X8B4D,0X354E,0X8BA0,0X3604,0X8BF5,
316 												0X36BA,0X8C4A,0X3770,0X8CA1,0X3825,0X8CF8,0X38D9,0X8D51,0X398D,0X8DAB,0X3A40,0X8E06,0X3AF3,0X8E62,0X3BA5,0X8EBF,0X3C57,0X8F1D,0X3D08,0X8F7D,
317 												0X3DB8,0X8FDD,0X3E68,0X903E,0X3F17,0X90A1,0X3FC6,0X9105,0X4074,0X9169,0X4121,0X91CF,0X41CE,0X9236,0X427A,0X929E,0X4326,0X9307,0X43D1,0X9371,
318 												0X447B,0X93DC,0X4524,0X9448,0X45CD,0X94B5,0X4675,0X9523,0X471D,0X9592,0X47C4,0X9603,0X486A,0X9674,0X490F,0X96E6,0X49B4,0X9759,0X4A58,0X97CE,
319 												0X4AFB,0X9843,0X4B9E,0X98B9,0X4C40,0X9930,0X4CE1,0X99A9,0X4D81,0X9A22,0X4E21,0X9A9C,0X4EC0,0X9B17,0X4F5E,0X9B94,0X4FFB,0X9C11,0X5098,0X9C8F,
320 												0X5134,0X9D0E,0X51CF,0X9D8E,0X5269,0X9E0F,0X5303,0X9E91,0X539B,0X9F14,0X5433,0X9F98,0X54CA,0XA01C,0X5560,0XA0A2,0X55F6,0XA129,0X568A,0XA1B0,
321 												0X571E,0XA238,0X57B1,0XA2C2,0X5843,0XA34C,0X58D4,0XA3D7,0X5964,0XA463,0X59F4,0XA4F0,0X5A82,0XA57E,0X5B10,0XA60C,0X5B9D,0XA69C,0X5C29,0XA72C,
322 												0X5CB4,0XA7BD,0X5D3E,0XA84F,0X5DC8,0XA8E2,0X5E50,0XA976,0X5ED7,0XAA0A,0X5F5E,0XAAA0,0X5FE4,0XAB36,0X6068,0XABCD,0X60EC,0XAC65,0X616F,0XACFD,
323 												0X61F1,0XAD97,0X6272,0XAE31,0X62F2,0XAECC,0X6371,0XAF68,0X63EF,0XB005,0X646C,0XB0A2,0X64E9,0XB140,0X6564,0XB1DF,0X65DE,0XB27F,0X6657,0XB31F,
324 												0X66D0,0XB3C0,0X6747,0XB462,0X67BD,0XB505,0X6832,0XB5A8,0X68A7,0XB64C,0X691A,0XB6F1,0X698C,0XB796,0X69FD,0XB83C,0X6A6E,0XB8E3,0X6ADD,0XB98B,
325 												0X6B4B,0XBA33,0X6BB8,0XBADC,0X6C24,0XBB85,0X6C8F,0XBC2F,0X6CF9,0XBCDA,0X6D62,0XBD86,0X6DCA,0XBE32,0X6E31,0XBEDF,0X6E97,0XBF8C,0X6EFB,0XC03A,
326 												0X6F5F,0XC0E9,0X6FC2,0XC198,0X7023,0XC248,0X7083,0XC2F8,0X70E3,0XC3A9,0X7141,0XC45B,0X719E,0XC50D,0X71FA,0XC5C0,0X7255,0XC673,0X72AF,0XC727,
327 												0X7308,0XC7DB,0X735F,0XC890,0X73B6,0XC946,0X740B,0XC9FC,0X7460,0XCAB2,0X74B3,0XCB69,0X7505,0XCC21,0X7556,0XCCD9,0X75A6,0XCD92,0X75F4,0XCE4B,
328 												0X7642,0XCF04,0X768E,0XCFBE,0X76D9,0XD079,0X7723,0XD134,0X776C,0XD1EF,0X77B4,0XD2AB,0X77FB,0XD367,0X7840,0XD424,0X7885,0XD4E1,0X78C8,0XD59E,
329 												0X790A,0XD65C,0X794A,0XD71B,0X798A,0XD7D9,0X79C9,0XD898,0X7A06,0XD958,0X7A42,0XDA18,0X7A7D,0XDAD8,0X7AB7,0XDB99,0X7AEF,0XDC59,0X7B27,0XDD1B,
330 												0X7B5D,0XDDDC,0X7B92,0XDE9E,0X7BC6,0XDF61,0X7BF9,0XE023,0X7C2A,0XE0E6,0X7C5A,0XE1A9,0X7C89,0XE26D,0X7CB7,0XE330,0X7CE4,0XE3F4,0X7D0F,0XE4B9,
331 												0X7D3A,0XE57D,0X7D63,0XE642,0X7D8A,0XE707,0X7DB1,0XE7CD,0X7DD6,0XE892,0X7DFB,0XE958,0X7E1E,0XEA1E,0X7E3F,0XEAE4,0X7E60,0XEBAB,0X7E7F,0XEC71,
332 												0X7E9D,0XED38,0X7EBA,0XEDFF,0X7ED6,0XEEC6,0X7EF0,0XEF8D,0X7F0A,0XF055,0X7F22,0XF11C,0X7F38,0XF1E4,0X7F4E,0XF2AC,0X7F62,0XF374,0X7F75,0XF43C,
333 												0X7F87,0XF505,0X7F98,0XF5CD,0X7FA7,0XF695,0X7FB5,0XF75E,0X7FC2,0XF827,0X7FCE,0XF8EF,0X7FD9,0XF9B8,0X7FE2,0XFA81,0X7FEA,0XFB4A,0X7FF1,0XFC13,
334 												0X7FF6,0XFCDC,0X7FFA,0XFDA5,0X7FFE,0XFE6E,0X7FFF,0XFF37};
335 #elif defined(MAX_FFT_SIZE_512)
336 const INT16 radix4FftTwiddleArr[2*MAX_FFT_SIZE] = {0X7FFF,0x0000,0x7FFE,0x0192,0x7FF6,0x0324,0x7FEA,0x04B6,0x7FD9,0x0648,0x7FC2,0x07D9,0x7FA7,0x096B,0x7F87,0x0AFB,0x7F62,0x0C8C,0x7F38,0x0E1C,0x7F0A,0x0FAB,0x7ED6,0x113A,0x7E9D,0x12C8,0x7E60,0x1455,0x7E1E,0x15E2,0x7DD6,0x176E,0x7D8A,0x18F9,0x7D3A,0x1A83,0x7CE4,0x1C0C,0x7C89,0x1D93,0x7C2A,0x1F1A,0x7BC6,0x209F,0x7B5D,0x2224,0x7AEF,0x23A7,0x7A7D,0x2528,0x7A06,0x26A8,0x798A,0x2827,0x790A,0x29A4,0x7885,0x2B1F,0x77FB,0x2C99,0x776C,0x2E11,0x76D9,0x2F87,0x7642,0x30FC,0x75A6,0x326E,0x7505,0x33DF,0x7460,0x354E,0x73B6,0x36BA,0x7308,0x3825,0x7255,0x398D,0x719E,0x3AF3,0x70E3,0x3C57,0x7023,0x3DB8,0x6F5F,0x3F17,0x6E97,0x4074,0x6DCA,0x41CE,0x6CF9,0x4326,0x6C24,0x447B,0x6B4B,0x45CD,0x6A6E,0x471D,0x698C,0x486A,0x68A7,0x49B4,0x67BD,0x4AFB,0x66D0,0x4C40,0x65DE,0x4D81,0x64E9,0x4EC0,0x63EF,0x4FFB,0x62F2,0x5134,0x61F1,0x5269,0x60EC,0x539B,0x5FE4,0x54CA,0x5ED7,0x55F6,0x5DC8,0x571E,0x5CB4,0x5843,0x5B9D,0x5964,0x5A82,0x5A82,0x5964,0x5B9D,0x5843,0x5CB4,0x571E,0x5DC8,0x55F6,0x5ED7,0x54CA,0x5FE4,0x539B,0x60EC,0x5269,0x61F1,0x5134,0x62F2,0x4FFB,0x63EF,0x4EC0,0x64E9,0x4D81,0x65DE,0x4C40,0x66D0,0x4AFB,0x67BD,0x49B4,0x68A7,0x486A,0x698C,0x471D,0x6A6E,0x45CD,0x6B4B,0x447B,0x6C24,0x4326,0x6CF9,0x41CE,0x6DCA,0x4074,0x6E97,0x3F17,0x6F5F,0x3DB8,0x7023,0x3C57,0x70E3,0x3AF3,0x719E,0x398D,0x7255,0x3825,0x7308,0x36BA,0x73B6,0x354E,0x7460,0x33DF,0x7505,0x326E,0x75A6,0x30FC,0x7642,0x2F87,0x76D9,0x2E11,0x776C,0x2C99,0x77FB,0x2B1F,0x7885,0x29A4,0x790A,0x2827,0x798A,0x26A8,0x7A06,0x2528,0x7A7D,0x23A7,0x7AEF,0x2224,0x7B5D,0x209F,0x7BC6,0x1F1A,0x7C2A,0x1D93,0x7C89,0x1C0C,0x7CE4,0x1A83,0x7D3A,0x18F9,0x7D8A,0x176E,0x7DD6,0x15E2,0x7E1E,0x1455,0x7E60,0x12C8,0x7E9D,0x113A,0x7ED6,0x0FAB,0x7F0A,0x0E1C,0x7F38,0x0C8C,0x7F62,0x0AFB,0x7F87,0x096B,0x7FA7,0x07D9,0x7FC2,0x0648,0x7FD9,0x04B6,0x7FEA,0x0324,0x7FF6,0x0192,0x7FFE,0x0000,0x7FFF,0xFE6E,0x7FFE,0xFCDC,0x7FF6,0xFB4A,0x7FEA,0xF9B8,0x7FD9,0xF827,0x7FC2,0xF695,0x7FA7,0xF505,0x7F87,0xF374,0x7F62,0xF1E4,0x7F38,0xF055,0x7F0A,0xEEC6,0x7ED6,0xED38,0x7E9D,0xEBAB,0x7E60,0xEA1E,0x7E1E,0xE892,0x7DD6,0xE707,0x7D8A,0xE57D,0x7D3A,0xE3F4,0x7CE4,0xE26D,0x7C89,0xE0E6,0x7C2A,0xDF61,0x7BC6,0xDDDC,0x7B5D,0xDC59,0x7AEF,0xDAD8,0x7A7D,0xD958,0x7A06,0xD7D9,0x798A,0xD65C,0x790A,0xD4E1,0x7885,0xD367,0x77FB,0xD1EF,0x776C,0xD079,0x76D9,0xCF04,0x7642,0xCD92,0x75A6,0xCC21,0x7505,0xCAB2,0x7460,0xC946,0x73B6,0xC7DB,0x7308,0xC673,0x7255,0xC50D,0x719E,0xC3A9,0x70E3,0xC248,0x7023,0xC0E9,0x6F5F,0xBF8C,0x6E97,0xBE32,0x6DCA,0xBCDA,0x6CF9,0xBB85,0x6C24,0xBA33,0x6B4B,0xB8E3,0x6A6E,0xB796,0x698C,0xB64C,0x68A7,0xB505,0x67BD,0xB3C0,0x66D0,0xB27F,0x65DE,0xB140,0x64E9,0xB005,0x63EF,0xAECC,0x62F2,0xAD97,0x61F1,0xAC65,0x60EC,0xAB36,0x5FE4,0xAA0A,0x5ED7,0xA8E2,0x5DC8,0xA7BD,0x5CB4,0xA69C,0x5B9D,0xA57E,0x5A82,0xA463,0x5964,0xA34C,0x5843,0xA238,0x571E,0xA129,0x55F6,0xA01C,0x54CA,0x9F14,0x539B,0x9E0F,0x5269,0x9D0E,0x5134,0x9C11,0x4FFB,0x9B17,0x4EC0,0x9A22,0x4D81,0x9930,0x4C40,0x9843,0x4AFB,0x9759,0x49B4,0x9674,0x486A,0x9592,0x471D,0x94B5,0x45CD,0x93DC,0x447B,0x9307,0x4326,0x9236,0x41CE,0x9169,0x4074,0x90A1,0x3F17,0x8FDD,0x3DB8,0x8F1D,0x3C57,0x8E62,0x3AF3,0x8DAB,0x398D,0x8CF8,0x3825,0x8C4A,0x36BA,0x8BA0,0x354E,0x8AFB,0x33DF,0x8A5A,0x326E,0x89BE,0x30FC,0x8927,0x2F87,0x8894,0x2E11,0x8805,0x2C99,0x877B,0x2B1F,0x86F6,0x29A4,0x8676,0x2827,0x85FA,0x26A8,0x8583,0x2528,0x8511,0x23A7,0x84A3,0x2224,0x843A,0x209F,0x83D6,0x1F1A,0x8377,0x1D93,0x831C,0x1C0C,0x82C6,0x1A83,0x8276,0x18F9,0x822A,0x176E,0x81E2,0x15E2,0x81A0,0x1455,0x8163,0x12C8,0x812A,0x113A,0x80F6,0x0FAB,0x80C8,0x0E1C,0x809E,0x0C8C,0x8079,0x0AFB,0x8059,0x096B,0x803E,0x07D9,0x8027,0x0648,0x8016,0x04B6,0x800A,0x0324,0x8002,0x0192,0x8000,0x0000,0x8002,0xFE6E,0x800A,0xFCDC,0x8016,0xFB4A,0x8027,0xF9B8,0x803E,0xF827,0x8059,0xF695,0x8079,0xF505,0x809E,0xF374,0x80C8,0xF1E4,0x80F6,0xF055,0x812A,0xEEC6,0x8163,0xED38,0x81A0,0xEBAB,0x81E2,0xEA1E,0x822A,0xE892,0x8276,0xE707,0x82C6,0xE57D,0x831C,0xE3F4,0x8377,0xE26D,0x83D6,0xE0E6,0x843A,0xDF61,0x84A3,0xDDDC,0x8511,0xDC59,0x8583,0xDAD8,0x85FA,0xD958,0x8676,0xD7D9,0x86F6,0xD65C,0x877B,0xD4E1,0x8805,0xD367,0x8894,0xD1EF,0x8927,0xD079,0x89BE,0xCF04,0x8A5A,0xCD92,0x8AFB,0xCC21,0x8BA0,0xCAB2,0x8C4A,0xC946,0x8CF8,0xC7DB,0x8DAB,0xC673,0x8E62,0xC50D,0x8F1D,0xC3A9,0x8FDD,0xC248,0x90A1,0xC0E9,0x9169,0xBF8C,0x9236,0xBE32,0x9307,0xBCDA,0x93DC,0xBB85,0x94B5,0xBA33,0x9592,0xB8E3,0x9674,0xB796,0x9759,0xB64C,0x9843,0xB505,0x9930,0xB3C0,0x9A22,0xB27F,0x9B17,0xB140,0x9C11,0xB005,0x9D0E,0xAECC,0x9E0F,0xAD97,0x9F14,0xAC65,0xA01C,0xAB36,0xA129,0xAA0A,0xA238,0xA8E2,0xA34C,0xA7BD,0xA463,0xA69C,0xA57E,0xA57E,0xA69C,0xA463,0xA7BD,0xA34C,0xA8E2,0xA238,0xAA0A,0xA129,0xAB36,0xA01C,0xAC65,0x9F14,0xAD97,0x9E0F,0xAECC,0x9D0E,0xB005,0x9C11,0xB140,0x9B17,0xB27F,0x9A22,0xB3C0,0x9930,0xB505,0x9843,0xB64C,0x9759,0xB796,0x9674,0xB8E3,0x9592,0xBA33,0x94B5,0xBB85,0x93DC,0xBCDA,0x9307,0xBE32,0x9236,0xBF8C,0x9169,0xC0E9,0x90A1,0xC248,0x8FDD,0xC3A9,0x8F1D,0xC50D,0x8E62,0xC673,0x8DAB,0xC7DB,0x8CF8,0xC946,0x8C4A,0xCAB2,0x8BA0,0xCC21,0x8AFB,0xCD92,0x8A5A,0xCF04,0x89BE,0xD079,0x8927,0xD1EF,0x8894,0xD367,0x8805,0xD4E1,0x877B,0xD65C,0x86F6,0xD7D9,0x8676,0xD958,0x85FA,0xDAD8,0x8583,0xDC59,0x8511,0xDDDC,0x84A3,0xDF61,0x843A,0xE0E6,0x83D6,0xE26D,0x8377,0xE3F4,0x831C,0xE57D,0x82C6,0xE707,0x8276,0xE892,0x822A,0xEA1E,0x81E2,0xEBAB,0x81A0,0xED38,0x8163,0xEEC6,0x812A,0xF055,0x80F6,0xF1E4,0x80C8,0xF374,0x809E,0xF505,0x8079,0xF695,0x8059,0xF827,0x803E,0xF9B8,0x8027,0xFB4A,0x8016,0xFCDC,0x800A,0xFE6E,0x8002,0x0000,0x8000,0x0192,0x8002,0x0324,0x800A,0x04B6,0x8016,0x0648,0x8027,0x07D9,0x803E,0x096B,0x8059,0x0AFB,0x8079,0x0C8C,0x809E,0x0E1C,0x80C8,0x0FAB,0x80F6,0x113A,0x812A,0x12C8,0x8163,0x1455,0x81A0,0x15E2,0x81E2,0x176E,0x822A,0x18F9,0x8276,0x1A83,0x82C6,0x1C0C,0x831C,0x1D93,0x8377,0x1F1A,0x83D6,0x209F,0x843A,0x2224,0x84A3,0x23A7,0x8511,0x2528,0x8583,0x26A8,0x85FA,0x2827,0x8676,0x29A4,0x86F6,0x2B1F,0x877B,0x2C99,0x8805,0x2E11,0x8894,0x2F87,0x8927,0x30FC,0x89BE,0x326E,0x8A5A,0x33DF,0x8AFB,0x354E,0x8BA0,0x36BA,0x8C4A,0x3825,0x8CF8,0x398D,0x8DAB,0x3AF3,0x8E62,0x3C57,0x8F1D,0x3DB8,0x8FDD,0x3F17,0x90A1,0x4074,0x9169,0x41CE,0x9236,0x4326,0x9307,0x447B,0x93DC,0x45CD,0x94B5,0x471D,0x9592,0x486A,0x9674,0x49B4,0x9759,0x4AFB,0x9843,0x4C40,0x9930,0x4D81,0x9A22,0x4EC0,0x9B17,0x4FFB,0x9C11,0x5134,0x9D0E,0x5269,0x9E0F,0x539B,0x9F14,0x54CA,0xA01C,0x55F6,0xA129,0x571E,0xA238,0x5843,0xA34C,0x5964,0xA463,0x5A82,0xA57E,0x5B9D,0xA69C,0x5CB4,0xA7BD,0x5DC8,0xA8E2,0x5ED7,0xAA0A,0x5FE4,0xAB36,0x60EC,0xAC65,0x61F1,0xAD97,0x62F2,0xAECC,0x63EF,0xB005,0x64E9,0xB140,0x65DE,0xB27F,0x66D0,0xB3C0,0x67BD,0xB505,0x68A7,0xB64C,0x698C,0xB796,0x6A6E,0xB8E3,0x6B4B,0xBA33,0x6C24,0xBB85,0x6CF9,0xBCDA,0x6DCA,0xBE32,0x6E97,0xBF8C,0x6F5F,0xC0E9,0x7023,0xC248,0x70E3,0xC3A9,0x719E,0xC50D,0x7255,0xC673,0x7308,0xC7DB,0x73B6,0xC946,0x7460,0xCAB2,0x7505,0xCC21,0x75A6,0xCD92,0x7642,0xCF04,0x76D9,0xD079,0x776C,0xD1EF,0x77FB,0xD367,0x7885,0xD4E1,0x790A,0xD65C,0x798A,0xD7D9,0x7A06,0xD958,0x7A7D,0xDAD8,0x7AEF,0xDC59,0x7B5D,0xDDDC,0x7BC6,0xDF61,0x7C2A,0xE0E6,0x7C89,0xE26D,0x7CE4,0xE3F4,0x7D3A,0xE57D,0x7D8A,0xE707,0x7DD6,0xE892,0x7E1E,0xEA1E,0x7E60,0xEBAB,0x7E9D,0xED38,0x7ED6,0xEEC6,0x7F0A,0xF055,0x7F38,0xF1E4,0x7F62,0xF374,0x7F87,0xF505,0x7FA7,0xF695,0x7FC2,0xF827,0x7FD9,0xF9B8,0x7FEA,0xFB4A,0x7FF6,0xFCDC,0x7FFE,0xFE6E};
337 #elif defined(MAX_FFT_SIZE_256)
338 #ifdef TWIDDLE_HALF_SIZE
339 const INT16 radix4FftTwiddleArr[MAX_FFT_SIZE] = {0X7FFF,0x0000,0x7FF6,0x0324,0x7FD9,0x0648,0x7FA7,0x096B,0x7F62,0x0C8C,0x7F0A,0x0FAB,0x7E9D,0x12C8,0x7E1E,0x15E2,0x7D8A,0x18F9,0x7CE4,0x1C0C,0x7C2A,0x1F1A,0x7B5D,0x2224,0x7A7D,0x2528,0x798A,0x2827,0x7885,0x2B1F,0x776C,0x2E11,0x7642,0x30FC,0x7505,0x33DF,0x73B6,0x36BA,0x7255,0x398D,0x70E3,0x3C57,0x6F5F,0x3F17,0x6DCA,0x41CE,0x6C24,0x447B,0x6A6E,0x471D,0x68A7,0x49B4,0x66D0,0x4C40,0x64E9,0x4EC0,0x62F2,0x5134,0x60EC,0x539B,0x5ED7,0x55F6,0x5CB4,0x5843,0x5A82,0x5A82,0x5843,0x5CB4,0x55F6,0x5ED7,0x539B,0x60EC,0x5134,0x62F2,0x4EC0,0x64E9,0x4C40,0x66D0,0x49B4,0x68A7,0x471D,0x6A6E,0x447B,0x6C24,0x41CE,0x6DCA,0x3F17,0x6F5F,0x3C57,0x70E3,0x398D,0x7255,0x36BA,0x73B6,0x33DF,0x7505,0x30FC,0x7642,0x2E11,0x776C,0x2B1F,0x7885,0x2827,0x798A,0x2528,0x7A7D,0x2224,0x7B5D,0x1F1A,0x7C2A,0x1C0C,0x7CE4,0x18F9,0x7D8A,0x15E2,0x7E1E,0x12C8,0x7E9D,0x0FAB,0x7F0A,0x0C8C,0x7F62,0x096B,0x7FA7,0x0648,0x7FD9,0x0324,0x7FF6,0x0000,0x7FFF,0xFCDC,0x7FF6,0xF9B8,0x7FD9,0xF695,0x7FA7,0xF374,0x7F62,0xF055,0x7F0A,0xED38,0x7E9D,0xEA1E,0x7E1E,0xE707,0x7D8A,0xE3F4,0x7CE4,0xE0E6,0x7C2A,0xDDDC,0x7B5D,0xDAD8,0x7A7D,0xD7D9,0x798A,0xD4E1,0x7885,0xD1EF,0x776C,0xCF04,0x7642,0xCC21,0x7505,0xC946,0x73B6,0xC673,0x7255,0xC3A9,0x70E3,0xC0E9,0x6F5F,0xBE32,0x6DCA,0xBB85,0x6C24,0xB8E3,0x6A6E,0xB64C,0x68A7,0xB3C0,0x66D0,0xB140,0x64E9,0xAECC,0x62F2,0xAC65,0x60EC,0xAA0A,0x5ED7,0xA7BD,0x5CB4,0xA57E,0x5A82,0xA34C,0x5843,0xA129,0x55F6,0x9F14,0x539B,0x9D0E,0x5134,0x9B17,0x4EC0,0x9930,0x4C40,0x9759,0x49B4,0x9592,0x471D,0x93DC,0x447B,0x9236,0x41CE,0x90A1,0x3F17,0x8F1D,0x3C57,0x8DAB,0x398D,0x8C4A,0x36BA,0x8AFB,0x33DF,0x89BE,0x30FC,0x8894,0x2E11,0x877B,0x2B1F,0x8676,0x2827,0x8583,0x2528,0x84A3,0x2224,0x83D6,0x1F1A,0x831C,0x1C0C,0x8276,0x18F9,0x81E2,0x15E2,0x8163,0x12C8,0x80F6,0x0FAB,0x809E,0x0C8C,0x8059,0x096B,0x8027,0x0648,0x800A,0x0324};
340 #else
341 const INT16 radix4FftTwiddleArr[2*MAX_FFT_SIZE] = {0X7FFF,0x0000,0x7FF6,0x0324,0x7FD9,0x0648,0x7FA7,0x096B,0x7F62,0x0C8C,0x7F0A,0x0FAB,0x7E9D,0x12C8,0x7E1E,0x15E2,0x7D8A,0x18F9,0x7CE4,0x1C0C,0x7C2A,0x1F1A,0x7B5D,0x2224,0x7A7D,0x2528,0x798A,0x2827,0x7885,0x2B1F,0x776C,0x2E11,0x7642,0x30FC,0x7505,0x33DF,0x73B6,0x36BA,0x7255,0x398D,0x70E3,0x3C57,0x6F5F,0x3F17,0x6DCA,0x41CE,0x6C24,0x447B,0x6A6E,0x471D,0x68A7,0x49B4,0x66D0,0x4C40,0x64E9,0x4EC0,0x62F2,0x5134,0x60EC,0x539B,0x5ED7,0x55F6,0x5CB4,0x5843,0x5A82,0x5A82,0x5843,0x5CB4,0x55F6,0x5ED7,0x539B,0x60EC,0x5134,0x62F2,0x4EC0,0x64E9,0x4C40,0x66D0,0x49B4,0x68A7,0x471D,0x6A6E,0x447B,0x6C24,0x41CE,0x6DCA,0x3F17,0x6F5F,0x3C57,0x70E3,0x398D,0x7255,0x36BA,0x73B6,0x33DF,0x7505,0x30FC,0x7642,0x2E11,0x776C,0x2B1F,0x7885,0x2827,0x798A,0x2528,0x7A7D,0x2224,0x7B5D,0x1F1A,0x7C2A,0x1C0C,0x7CE4,0x18F9,0x7D8A,0x15E2,0x7E1E,0x12C8,0x7E9D,0x0FAB,0x7F0A,0x0C8C,0x7F62,0x096B,0x7FA7,0x0648,0x7FD9,0x0324,0x7FF6,0x0000,0x7FFF,0xFCDC,0x7FF6,0xF9B8,0x7FD9,0xF695,0x7FA7,0xF374,0x7F62,0xF055,0x7F0A,0xED38,0x7E9D,0xEA1E,0x7E1E,0xE707,0x7D8A,0xE3F4,0x7CE4,0xE0E6,0x7C2A,0xDDDC,0x7B5D,0xDAD8,0x7A7D,0xD7D9,0x798A,0xD4E1,0x7885,0xD1EF,0x776C,0xCF04,0x7642,0xCC21,0x7505,0xC946,0x73B6,0xC673,0x7255,0xC3A9,0x70E3,0xC0E9,0x6F5F,0xBE32,0x6DCA,0xBB85,0x6C24,0xB8E3,0x6A6E,0xB64C,0x68A7,0xB3C0,0x66D0,0xB140,0x64E9,0xAECC,0x62F2,0xAC65,0x60EC,0xAA0A,0x5ED7,0xA7BD,0x5CB4,0xA57E,0x5A82,0xA34C,0x5843,0xA129,0x55F6,0x9F14,0x539B,0x9D0E,0x5134,0x9B17,0x4EC0,0x9930,0x4C40,0x9759,0x49B4,0x9592,0x471D,0x93DC,0x447B,0x9236,0x41CE,0x90A1,0x3F17,0x8F1D,0x3C57,0x8DAB,0x398D,0x8C4A,0x36BA,0x8AFB,0x33DF,0x89BE,0x30FC,0x8894,0x2E11,0x877B,0x2B1F,0x8676,0x2827,0x8583,0x2528,0x84A3,0x2224,0x83D6,0x1F1A,0x831C,0x1C0C,0x8276,0x18F9,0x81E2,0x15E2,0x8163,0x12C8,0x80F6,0x0FAB,0x809E,0x0C8C,0x8059,0x096B,0x8027,0x0648,0x800A,0x0324,0x8000,0x0000,0x800A,0xFCDC,0x8027,0xF9B8,0x8059,0xF695,0x809E,0xF374,0x80F6,0xF055,0x8163,0xED38,0x81E2,0xEA1E,0x8276,0xE707,0x831C,0xE3F4,0x83D6,0xE0E6,0x84A3,0xDDDC,0x8583,0xDAD8,0x8676,0xD7D9,0x877B,0xD4E1,0x8894,0xD1EF,0x89BE,0xCF04,0x8AFB,0xCC21,0x8C4A,0xC946,0x8DAB,0xC673,0x8F1D,0xC3A9,0x90A1,0xC0E9,0x9236,0xBE32,0x93DC,0xBB85,0x9592,0xB8E3,0x9759,0xB64C,0x9930,0xB3C0,0x9B17,0xB140,0x9D0E,0xAECC,0x9F14,0xAC65,0xA129,0xAA0A,0xA34C,0xA7BD,0xA57E,0xA57E,0xA7BD,0xA34C,0xAA0A,0xA129,0xAC65,0x9F14,0xAECC,0x9D0E,0xB140,0x9B17,0xB3C0,0x9930,0xB64C,0x9759,0xB8E3,0x9592,0xBB85,0x93DC,0xBE32,0x9236,0xC0E9,0x90A1,0xC3A9,0x8F1D,0xC673,0x8DAB,0xC946,0x8C4A,0xCC21,0x8AFB,0xCF04,0x89BE,0xD1EF,0x8894,0xD4E1,0x877B,0xD7D9,0x8676,0xDAD8,0x8583,0xDDDC,0x84A3,0xE0E6,0x83D6,0xE3F4,0x831C,0xE707,0x8276,0xEA1E,0x81E2,0xED38,0x8163,0xF055,0x80F6,0xF374,0x809E,0xF695,0x8059,0xF9B8,0x8027,0xFCDC,0x800A,0x0000,0x8000,0x0324,0x800A,0x0648,0x8027,0x096B,0x8059,0x0C8C,0x809E,0x0FAB,0x80F6,0x12C8,0x8163,0x15E2,0x81E2,0x18F9,0x8276,0x1C0C,0x831C,0x1F1A,0x83D6,0x2224,0x84A3,0x2528,0x8583,0x2827,0x8676,0x2B1F,0x877B,0x2E11,0x8894,0x30FC,0x89BE,0x33DF,0x8AFB,0x36BA,0x8C4A,0x398D,0x8DAB,0x3C57,0x8F1D,0x3F17,0x90A1,0x41CE,0x9236,0x447B,0x93DC,0x471D,0x9592,0x49B4,0x9759,0x4C40,0x9930,0x4EC0,0x9B17,0x5134,0x9D0E,0x539B,0x9F14,0x55F6,0xA129,0x5843,0xA34C,0x5A82,0xA57E,0x5CB4,0xA7BD,0x5ED7,0xAA0A,0x60EC,0xAC65,0x62F2,0xAECC,0x64E9,0xB140,0x66D0,0xB3C0,0x68A7,0xB64C,0x6A6E,0xB8E3,0x6C24,0xBB85,0x6DCA,0xBE32,0x6F5F,0xC0E9,0x70E3,0xC3A9,0x7255,0xC673,0x73B6,0xC946,0x7505,0xCC21,0x7642,0xCF04,0x776C,0xD1EF,0x7885,0xD4E1,0x798A,0xD7D9,0x7A7D,0xDAD8,0x7B5D,0xDDDC,0x7C2A,0xE0E6,0x7CE4,0xE3F4,0x7D8A,0xE707,0x7E1E,0xEA1E,0x7E9D,0xED38,0x7F0A,0xF055,0x7F62,0xF374,0x7FA7,0xF695,0x7FD9,0xF9B8,0x7FF6,0xFCDC};
342 #endif
343 #endif
344 
345 #ifdef DOUBLE
346 #include <math.h>
347 #define PI 3.141592653589793
348 #endif
349 
350 #if !(defined(ARM_DS5) || defined(W8987))
__clz(int x)351 int __clz(int x){
352 #ifdef ARM_GCC
353 	int ret;
354     asm ("clz %0, %1 ; \n"
355 		: "=r"(ret) :"r"(x));
356 	return ret;
357 #else
358 	int ret = 0;
359 	while(!(x&0x80000000) && (ret<32)){
360 		x<<=1;
361 		ret++;
362 	}
363 	return ret;
364 #endif
365 }
366 #endif
367 
368 
369 
370 #if defined(ARM_GCC) || defined(ARM_DS5)
371 #define REV_IDX(x) reverse(x)
372 #define IDX_LEN 32
reverse(register unsigned int x)373 unsigned int reverse(register unsigned int x){
374 	int ret;
375 #ifdef ARM_DS5
376     __asm ("rbit ret, x");
377 #else
378     asm ("rbit %0, %1 ; \n"
379 		: "=r"(ret) :"r"(x));
380 #endif
381 	return ret;
382 }
383 #else
384 #if (MAX_FFT_SIZE > (1<<8))
385 #define REV_IDX(x) reverse(x)
386 #define IDX_LEN 32
387 #else
388 #define REV_IDX(x) reverse8(x)
389 #define IDX_LEN 8
390 #endif
reverse(register unsigned int x)391 unsigned int reverse(register unsigned int x){
392     x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
393     x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
394     x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
395     x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
396     return((x >> 16) | (x << 16));
397 }
398 
reverse8(unsigned char b)399 unsigned char reverse8(unsigned char b){
400 #ifdef _MSC_VER // 64 bit
401 	b = (unsigned char) ((b * 0x0202020202ULL & 0x010884422010ULL) % 1023);
402 #else // 32 bit
403 	b = ((b * 0x0802LU & 0x22110LU) | (b * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16;
404 #endif
405 	return b;
406 }
407 
408 #endif
409 
410 #if !(defined(ARM_GCC) || defined(ARM_DS5))
411 
412 static const char my_msb_lut[32] = {0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9};
myMsb(unsigned int v)413 int myMsb(unsigned int v){
414 	v |= v >> 1;
415 	v |= v >> 2;
416 	v |= v >> 4;
417 	v |= v >> 8;
418 	v |= v >> 16;
419 	v = (v >> 1) + 1;
420 	return my_msb_lut[((unsigned int)(v * 0x077CB531UL)) >> 27];
421 }
422 
423 #ifdef ARM_DEBUG
424 #define ROUND_CONST15BIT 0x4000
425 #define MAX_POS16BIT 0x7fff
426 #define MIN_NEQ16BIT -0x7fff
427 #define MAX_POS32BIT 0x7fffffff
428 #define MIN_NEQ32BIT -0x7fffffff
429 
radix4Fft16BitTo32BitMultiplier(INT16 x,INT16 y)430 INT32 radix4Fft16BitTo32BitMultiplier(INT16 x, INT16 y){
431 	INT32 temp = x;
432 	temp *=y;
433 
434 	if(temp>MAX_POS32BIT)
435 		return MAX_POS32BIT;
436 	else{
437 		if(temp<MIN_NEQ32BIT)
438 			return MIN_NEQ32BIT;
439 		else
440 			return temp;
441 	}
442 }
443 
radix4Fft32BitAccumulator(INT32 x,INT32 y)444 INT32 radix4Fft32BitAccumulator(INT32 x, INT32 y){
445 	INT32 temp = x + y;
446 
447 	if(temp>MAX_POS32BIT)
448 		return MAX_POS32BIT;
449 	else{
450 		if(temp<MIN_NEQ32BIT)
451 			return MIN_NEQ32BIT;
452 		else
453 			return (INT32)temp;
454 	}
455 }
456 
radix4Fft32BitAccumulatorNeg(INT32 x,INT32 y)457 INT32 radix4Fft32BitAccumulatorNeg(INT32 x, INT32 y){
458 	INT32 temp = x - y;
459 
460 	if(temp>MAX_POS32BIT)
461 		return MAX_POS32BIT;
462 	else{
463 		if(temp<MIN_NEQ32BIT)
464 			return MIN_NEQ32BIT;
465 		else
466 			return (INT32)temp;
467 	}
468 }
469 
radix4Fft32BitTo16BitRounding(INT32 x)470 INT16 radix4Fft32BitTo16BitRounding(INT32 x){
471 	INT32 temp = x;
472 #if defined(BIASED_ROUNDING)
473 	temp += ROUND_CONST15BIT;
474 #elif defined(UNBIASED_ROUNDING)
475 	temp += (ROUND_CONST15BIT-1) +((temp>>15)&0x1);
476 #endif
477 	temp >>=15;
478 
479 	if(temp>MAX_POS16BIT)
480 		return MAX_POS16BIT;
481 	else{
482 		if(temp<MIN_NEQ16BIT)
483 			return MIN_NEQ16BIT;
484 		else
485 			return (INT16)temp;
486 	}
487 }
488 
radix4Fft32BitTo16BitUnsignedRounding(INT32 x,int extraShift)489 unsigned short radix4Fft32BitTo16BitUnsignedRounding(INT32 x, int extraShift){
490 	INT32 temp = x;
491 	temp >>=(15+extraShift);
492 
493 	if(temp>0xffff)
494 		return 0xffff;
495 	else{
496 		if(temp<0)
497 			return 0;
498 		else
499 			return (unsigned short)temp;
500 	}
501 }
502 
radix4Fft16BitAdd(INT16 x,INT16 y)503 INT16 radix4Fft16BitAdd(INT16 x, INT16 y){
504 	INT32 temp = x;
505 	temp +=y;
506 
507 	if(temp>MAX_POS16BIT)
508 		return MAX_POS16BIT;
509 	else{
510 		if(temp<MIN_NEQ16BIT)
511 			return MIN_NEQ16BIT;
512 		else
513 			return (INT16)temp;
514 	}
515 }
516 
radix4Fft16BitSubtract(INT16 x,INT16 y)517 INT16 radix4Fft16BitSubtract(INT16 x, INT16 y){
518 	INT32 temp = x;
519 	temp -=y;
520 
521 	if(temp>MAX_POS16BIT)
522 		return MAX_POS16BIT;
523 	else{
524 		if(temp<MIN_NEQ16BIT)
525 			return MIN_NEQ16BIT;
526 		else
527 			return (INT16)temp;
528 	}
529 }
530 
radix4Fft16BitAddShift(INT16 x,INT16 y)531 INT16 radix4Fft16BitAddShift(INT16 x, INT16 y){
532 	INT32 temp = x;
533 	temp +=y;
534 
535 	return (INT16)(temp>>1);
536 }
537 
radix4Fft16BitSubtractShift(INT16 x,INT16 y)538 INT16 radix4Fft16BitSubtractShift(INT16 x, INT16 y){
539 	INT32 temp = x;
540 	temp -=y;
541 
542 	return (INT16)(temp>>1);
543 }
544 #endif
545 #else
546 #pragma arm
547 #endif
548 
radix4FftRadix4ButterflyTwiddle(INT16 * pSrc,INT16 * pDst,int stride,const INT16 * pCoeff,int coeffStride)549 void radix4FftRadix4ButterflyTwiddle(INT16* pSrc, INT16* pDst, int stride, const INT16* pCoeff, int coeffStride){
550 #if defined(ARM_GCC) || defined(ARM_DS5)
551 #ifdef ARM_DS5
552 	int reg5, reg6, reg7, reg8, reg9, reg10, reg11;
553 	int strideDw = 4*stride;
554 	int coeffStrideDw = 4*coeffStride;
555 
556 	__asm volatile
557 	{
558 		LDR reg11, [pCoeff, coeffStrideDw]!
559 		LDR reg5, [pSrc], strideDw
560 		LDR reg7, [pSrc], strideDw
561 		LDR reg6, [pSrc], strideDw
562 		SMUAD reg10, reg11, reg6
563 		SMUSDX reg9, reg11, reg6
564 		LDR reg11, [pCoeff, coeffStrideDw]!
565 		LSL reg9, reg9, #1
566 		PKHTB reg6, reg9, reg10, ASR #15
567 		SMUAD reg10, reg11, reg7
568 		SMUSDX reg9, reg11, reg7
569 		LDR reg8, [pSrc], strideDw
570 		LDR reg11, [pCoeff, coeffStrideDw]
571 		LSL reg9, reg9, #1
572 		PKHTB reg7, reg9, reg10, ASR #15
573 		SMUAD reg10, reg11, reg8
574 		SMUSDX reg8, reg11, reg8
575 		LSL reg8, reg8, #1
576 		PKHTB reg9, reg8, reg10, ASR #15
577 		QADD16 reg10, reg5, reg7
578 		QSUB16 reg11, reg5, reg7
579 		QADD16 reg8, reg6, reg9
580 		QSUB16 reg9, reg6, reg9
581 		QADD16 reg5, reg10, reg8
582 		QSUB16 reg7, reg10, reg8
583 		QSAX reg6, reg11, reg9
584 		QASX reg8, reg11, reg9
585 		STR reg5, [pDst], strideDw
586 		STR reg6, [pDst], strideDw
587 		STR reg7, [pDst], strideDw
588 		STR reg8, [pDst], strideDw
589 	}
590 #else
591     asm volatile(
592 		"LDR r11, [%[pCoeff], %[coeffStrideDw]]! \n\t"
593 		"LDR r5, [%[pSrc]], %[strideDw] \n\t"
594 		"LDR r7, [%[pSrc]], %[strideDw] \n\t"
595 		"LDR r6, [%[pSrc]], %[strideDw] \n\t"
596 		"SMUAD r10, r11, r6 \n\t"
597 		"SMUSDX r9, r11, r6 \n\t"
598 		"LDR r11, [%[pCoeff], %[coeffStrideDw]]! \n\t"
599 		"LSL r9, r9, #1 \n\t"
600 		"PKHTB r6, r9, r10, ASR #15 \n\t"
601 		"SMUAD r10, r11, r7 \n\t"
602 		"SMUSDX r9, r11, r7 \n\t"
603 		"LDR r8, [%[pSrc]], %[strideDw] \n\t"
604 		"LDR r11, [%[pCoeff], %[coeffStrideDw]] \n\t"
605 		"LSL r9, r9, #1 \n\t"
606 		"PKHTB r7, r9, r10, ASR #15 \n\t"
607 		"SMUAD r10, r11, r8 \n\t"
608 		"SMUSDX r8, r11, r8 \n\t"
609 		"LSL r8, r8, #1 \n\t"
610 		"PKHTB r9, r8, r10, ASR #15 \n\t"
611 		"QADD16 r10, r5, r7 \n\t"
612 		"QSUB16 r11, r5, r7 \n\t"
613 		"QADD16 r8, r6, r9 \n\t"
614 		"QSUB16 r9, r6, r9 \n\t"
615 		"QADD16 r5, r10, r8 \n\t"
616 		"QSUB16 r7, r10, r8 \n\t"
617 		"QSAX r6, r11, r9 \n\t"
618 		"QASX r8, r11, r9 \n\t"
619 		"STR r5, [%[pDst]], %[strideDw] \n\t"
620 		"STR r6, [%[pDst]], %[strideDw] \n\t"
621 		"STR r7, [%[pDst]], %[strideDw] \n\t"
622 		"STR r8, [%[pDst]], %[strideDw] \n\t"
623 		: [pSrc]"+r"(pSrc), [pDst]"+r"(pDst) : [pCoeff]"r"(pCoeff), [strideDw]"r"(4*stride), [coeffStrideDw]"r"(4*coeffStride)
624 		: "r5", "r6", "r7", "r8", "r9", "r10","r11");
625 /*
626 		"SMULBT r8, r6, r11 \n\t"
627 		"SMULTB r9, r6, r11 \n\t"
628 		"QSUB r9, r9, r8 \n\t"
629 */
630 #endif
631 #else
632 	INT16 x1I, x1Q, x2I, x2Q, x3I, x3Q; //  x0I, x0Q,
633 	INT16 z0I, z0Q, z1I, z1Q, z2I, z2Q, z3I, z3Q;
634 	INT16 y0I, y0Q, y1I, y1Q, y2I, y2Q, y3I, y3Q;
635 	INT16 AI, AQ, BI, BQ, CI, CQ, DI, DQ;
636 	INT16 W1I, W1Q, W2I, W2Q, W3I, W3Q; // W0I, W0Q,
637 
638 	unsigned int *loadPtr = (unsigned int *)pSrc;
639 	unsigned int loadTemp;
640 	unsigned int *coeffPtr = (unsigned int *)(pCoeff +2*coeffStride);
641 	unsigned int loadCoeff;
642 	unsigned int *storePtr = (unsigned int *)pDst;
643 	unsigned int storeTemp;
644 
645 	// re-order due to L^4_2 - because of using radix-2 bit-reversal
646 	loadTemp = *loadPtr; loadPtr +=stride;
647 	z0I = (loadTemp&0xffff); z0Q = (loadTemp>>16);
648 	loadTemp = *loadPtr; loadPtr +=stride;
649 	x2I = (loadTemp&0xffff); x2Q = (loadTemp>>16);
650 	loadTemp = *loadPtr; loadPtr +=stride;
651 	x1I = (loadTemp&0xffff); x1Q = (loadTemp>>16);
652 	loadTemp = *loadPtr; loadPtr +=stride;
653 	x3I = (loadTemp&0xffff); x3Q = (loadTemp>>16);
654 
655 	loadCoeff = *coeffPtr; coeffPtr +=coeffStride;
656 	W1I = (loadCoeff&0xffff); W1Q = (loadCoeff>>16);
657 	loadCoeff = *coeffPtr; coeffPtr +=coeffStride;
658 	W2I = (loadCoeff&0xffff); W2Q = (loadCoeff>>16);
659 	loadCoeff = *coeffPtr; coeffPtr +=coeffStride;
660 	W3I = (loadCoeff&0xffff); W3Q = (loadCoeff>>16);
661 
662 	// z0 = W0*x0, z1 = W1*x1, z2 = W2*x2, z3 = W3*x3 assuming W0Q = -exp(1i*2*pi*nk/N)
663 #ifdef ARM_DEBUG
664 	z1I = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulator( radix4Fft16BitTo32BitMultiplier(W1I, x1I), radix4Fft16BitTo32BitMultiplier(W1Q, x1Q))); // r6
665 	z1Q = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulatorNeg( radix4Fft16BitTo32BitMultiplier(W1I, x1Q), radix4Fft16BitTo32BitMultiplier(W1Q, x1I)));
666 	z2I = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulator( radix4Fft16BitTo32BitMultiplier(W2I, x2I), radix4Fft16BitTo32BitMultiplier(W2Q, x2Q))); // r7
667 	z2Q = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulatorNeg( radix4Fft16BitTo32BitMultiplier(W2I, x2Q), radix4Fft16BitTo32BitMultiplier(W2Q, x2I)));
668 	z3I = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulator( radix4Fft16BitTo32BitMultiplier(W3I, x3I), radix4Fft16BitTo32BitMultiplier(W3Q, x3Q))); // r9
669 	z3Q = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulatorNeg( radix4Fft16BitTo32BitMultiplier(W3I, x3Q), radix4Fft16BitTo32BitMultiplier(W3Q, x3I)));
670 #else
671 	z1I = (INT16)((((INT32)W1I*x1I)+((INT32)W1Q*x1Q))>>15);
672 	z1Q = (INT16)((((INT32)W1I*x1Q)-((INT32)W1Q*x1I))>>15);
673 	z2I = (INT16)((((INT32)W2I*x2I)+((INT32)W2Q*x2Q))>>15);
674 	z2Q = (INT16)((((INT32)W2I*x2Q)-((INT32)W2Q*x2I))>>15);
675 	z3I = (INT16)((((INT32)W3I*x3I)+((INT32)W3Q*x3Q))>>15);
676 	z3Q = (INT16)((((INT32)W3I*x3Q)-((INT32)W3Q*x3I))>>15);
677 #endif
678 	// calculate using A = (z0+z2), B = (z0-z2), C = (z1+z3), D = (z1-z3);
679 	// y0 = z0 + z1 + z2 + z3 = A + C
680 	// y1 = z0 -jz1 - z2 +jz3 = B -jD
681 	// y2 = z0 - z1 + z2 - z3 = A - C
682 	// y3 = z0 +jz1 - z2 -jz3 = B +jD
683 #ifdef ARM_DEBUG
684 	AI = radix4Fft16BitAdd(z0I, z2I); AQ = radix4Fft16BitAdd(z0Q, z2Q);
685 	BI = radix4Fft16BitSubtract(z0I, z2I); BQ = radix4Fft16BitSubtract(z0Q, z2Q);
686 	CI = radix4Fft16BitAdd(z1I, z3I); CQ = radix4Fft16BitAdd(z1Q, z3Q);
687 	DI = radix4Fft16BitSubtract(z1I, z3I); DQ = radix4Fft16BitSubtract(z1Q, z3Q);
688 
689 	y0I = radix4Fft16BitAdd(AI, CI); y0Q = radix4Fft16BitAdd(AQ, CQ);
690 	y1I = radix4Fft16BitAdd(BI, DQ); y1Q = radix4Fft16BitSubtract(BQ, DI);
691 	y2I = radix4Fft16BitSubtract(AI, CI); y2Q = radix4Fft16BitSubtract(AQ, CQ);
692 	y3I = radix4Fft16BitSubtract(BI, DQ); y3Q = radix4Fft16BitAdd(BQ, DI);
693 #else
694 	AI = z0I+z2I; AQ = z0Q+z2Q;
695 	BI = z0I-z2I; BQ = z0Q-z2Q;
696 	CI = z1I+z3I; CQ = z1Q+z3Q;
697 	DI = z1I-z3I; DQ = z1Q-z3Q;
698 
699 	y0I = AI+CI; y0Q = AQ+CQ;
700 	y1I = BI+DQ; y1Q = BQ-DI;
701 	y2I = AI-CI; y2Q = AQ-CQ;
702 	y3I = BI-DQ; y3Q = BQ+DI;
703 #endif
704 	storeTemp = (unsigned short)y0Q;
705 	storeTemp<<=16;
706 	storeTemp |=(unsigned short)y0I;
707 	*storePtr = storeTemp; storePtr+=stride;
708 	storeTemp = (unsigned short)y1Q;
709 	storeTemp<<=16;
710 	storeTemp |=(unsigned short)y1I;
711 	*storePtr = storeTemp; storePtr+=stride;
712 	storeTemp = (unsigned short)y2Q;
713 	storeTemp<<=16;
714 	storeTemp |=(unsigned short)y2I;
715 	*storePtr = storeTemp; storePtr+=stride;
716 	storeTemp = (unsigned short)y3Q;
717 	storeTemp<<=16;
718 	storeTemp |=(unsigned short)y3I;
719 	*storePtr = storeTemp; storePtr+=stride;
720 #endif
721 }
722 
radix4IfftRadix4ButterflyTwiddle(INT16 * pSrc,INT16 * pDst,int stride,const INT16 * pCoeff,int coeffStride)723 void radix4IfftRadix4ButterflyTwiddle(INT16* pSrc, INT16* pDst, int stride, const INT16* pCoeff, int coeffStride){
724 #if defined(ARM_GCC) || defined(ARM_DS5)
725 #ifdef ARM_DS5
726     int coeffStrideMult4 = 4*coeffStride;
727     int strideMult4 = 4*stride;
728     int reg5, reg6, reg7, reg8, reg9, reg10, reg11;
729     __asm volatile
730     {
731         LDR reg11, [pCoeff, coeffStrideMult4]!
732         LDR reg5, [pSrc], strideMult4
733         LDR reg7, [pSrc], strideMult4
734         LDR reg6, [pSrc], strideMult4
735         SMUSD reg10, reg11, reg6
736         SMUADX reg9, reg11, reg6
737         LDR reg11, [pCoeff, coeffStrideMult4]!
738         LSL reg9, reg9, #1
739         PKHTB reg6, reg9, reg10, ASR #15
740         SMUSD reg10, reg11, reg7
741         SMUADX reg9, reg11, reg7
742         LDR reg8, [pSrc], strideMult4
743         LDR reg11, [pCoeff, coeffStrideMult4]
744         LSL reg9, reg9, #1
745         PKHTB reg7, reg9, reg10, ASR #15
746         SMUSD reg10, reg11, reg8
747         SMUADX reg8, reg11, reg8
748         LSL reg8, reg8, #1
749         PKHTB reg9, reg8, reg10, ASR #15
750         SHADD16 reg10, reg5, reg7
751         SHSUB16 reg11, reg5, reg7
752         SHADD16 reg8, reg6, reg9
753         SHSUB16 reg9, reg6, reg9
754         SHADD16 reg5, reg10, reg8
755         SHSUB16 reg7, reg10, reg8
756         SHASX reg6, reg11, reg9
757         SHSAX reg8, reg11, reg9
758         STR reg5, [pDst], strideMult4
759         STR reg6, [pDst], strideMult4
760         STR reg7, [pDst], strideMult4
761         STR reg8, [pDst], strideMult4
762     }
763 #else
764     asm volatile(
765 		"LDR r11, [%[pCoeff], %[coeffStrideDw]]! \n\t"
766 		"LDR r5, [%[pSrc]], %[strideDw] \n\t"
767 		"LDR r7, [%[pSrc]], %[strideDw] \n\t"
768 		"LDR r6, [%[pSrc]], %[strideDw] \n\t"
769 		"SMUSD r10, r11, r6 \n\t"
770 		"SMUADX r9, r11, r6 \n\t"
771 		"LDR r11, [%[pCoeff], %[coeffStrideDw]]! \n\t"
772 		"LSL r9, r9, #1 \n\t"
773 		"PKHTB r6, r9, r10, ASR #15 \n\t"
774 		"SMUSD r10, r11, r7 \n\t"
775 		"SMUADX r9, r11, r7 \n\t"
776 		"LDR r8, [%[pSrc]], %[strideDw] \n\t"
777 		"LDR r11, [%[pCoeff], %[coeffStrideDw]] \n\t"
778 		"LSL r9, r9, #1 \n\t"
779 		"PKHTB r7, r9, r10, ASR #15 \n\t"
780 		"SMUSD r10, r11, r8 \n\t"
781 		"SMUADX r8, r11, r8 \n\t"
782 		"LSL r8, r8, #1 \n\t"
783 		"PKHTB r9, r8, r10, ASR #15 \n\t"
784 		"SHADD16 r10, r5, r7 \n\t"
785 		"SHSUB16 r11, r5, r7 \n\t"
786 		"SHADD16 r8, r6, r9 \n\t"
787 		"SHSUB16 r9, r6, r9 \n\t"
788 		"SHADD16 r5, r10, r8 \n\t"
789 		"SHSUB16 r7, r10, r8 \n\t"
790 		"SHASX r6, r11, r9 \n\t"
791 		"SHSAX r8, r11, r9 \n\t"
792 		"STR r5, [%[pDst]], %[strideDw] \n\t"
793 		"STR r6, [%[pDst]], %[strideDw] \n\t"
794 		"STR r7, [%[pDst]], %[strideDw] \n\t"
795 		"STR r8, [%[pDst]], %[strideDw] \n\t"
796 		: [pSrc]"+r"(pSrc), [pDst]"+r"(pDst) : [pCoeff]"r"(pCoeff), [strideDw]"r"(4*stride), [coeffStrideDw]"r"(4*coeffStride)
797 		: "r5", "r6", "r7", "r8", "r9", "r10","r11");
798 /*
799 		"SMULBT r8, r6, r11 \n\t"
800 		"SMULTB r9, r6, r11 \n\t"
801 		"QSUB r9, r9, r8 \n\t"
802 */
803 #endif
804 #else
805 	INT16 x1I, x1Q, x2I, x2Q, x3I, x3Q; //  x0I, x0Q,
806 	INT16 z0I, z0Q, z1I, z1Q, z2I, z2Q, z3I, z3Q;
807 	INT16 y0I, y0Q, y1I, y1Q, y2I, y2Q, y3I, y3Q;
808 	INT16 AI, AQ, BI, BQ, CI, CQ, DI, DQ;
809 	INT16 W1I, W1Q, W2I, W2Q, W3I, W3Q; // W0I, W0Q,
810 
811 	unsigned int *loadPtr = (unsigned int *)pSrc;
812 	unsigned int loadTemp;
813 	unsigned int *coeffPtr = (unsigned int *)(pCoeff +2*coeffStride);
814 	unsigned int loadCoeff;
815 	unsigned int *storePtr = (unsigned int *)pDst;
816 	unsigned int storeTemp;
817 
818 	// re-order due to L^4_2 - because of using radix-2 bit-reversal
819 	loadTemp = *loadPtr; loadPtr +=stride;
820 	z0I = (loadTemp&0xffff); z0Q = (loadTemp>>16);
821 	loadTemp = *loadPtr; loadPtr +=stride;
822 	x2I = (loadTemp&0xffff); x2Q = (loadTemp>>16);
823 	loadTemp = *loadPtr; loadPtr +=stride;
824 	x1I = (loadTemp&0xffff); x1Q = (loadTemp>>16);
825 	loadTemp = *loadPtr; loadPtr +=stride;
826 	x3I = (loadTemp&0xffff); x3Q = (loadTemp>>16);
827 
828 	loadCoeff = *coeffPtr; coeffPtr +=coeffStride;
829 	W1I = (loadCoeff&0xffff); W1Q = (loadCoeff>>16);
830 	loadCoeff = *coeffPtr; coeffPtr +=coeffStride;
831 	W2I = (loadCoeff&0xffff); W2Q = (loadCoeff>>16);
832 	loadCoeff = *coeffPtr; coeffPtr +=coeffStride;
833 	W3I = (loadCoeff&0xffff); W3Q = (loadCoeff>>16);
834 
835 #ifdef ARM_DEBUG
836 	z1I = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulatorNeg( radix4Fft16BitTo32BitMultiplier(W1I, x1I), radix4Fft16BitTo32BitMultiplier(W1Q, x1Q))); // r6
837 	z1Q = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulator( radix4Fft16BitTo32BitMultiplier(W1I, x1Q), radix4Fft16BitTo32BitMultiplier(W1Q, x1I)));
838 	z2I = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulatorNeg( radix4Fft16BitTo32BitMultiplier(W2I, x2I), radix4Fft16BitTo32BitMultiplier(W2Q, x2Q))); // r7
839 	z2Q = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulator( radix4Fft16BitTo32BitMultiplier(W2I, x2Q), radix4Fft16BitTo32BitMultiplier(W2Q, x2I)));
840 	z3I = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulatorNeg( radix4Fft16BitTo32BitMultiplier(W3I, x3I), radix4Fft16BitTo32BitMultiplier(W3Q, x3Q))); // r9
841 	z3Q = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulator( radix4Fft16BitTo32BitMultiplier(W3I, x3Q), radix4Fft16BitTo32BitMultiplier(W3Q, x3I)));
842 #else
843 	z1I = (INT16)( (((INT32)W1I*x1I)-((INT32)W1Q*x1Q))>>15 );
844 	z1Q = (INT16)( (((INT32)W1I*x1Q)+((INT32)W1Q*x1I))>>15 );
845 	z2I = (INT16)( (((INT32)W2I*x2I)-((INT32)W2Q*x2Q))>>15 );
846 	z2Q = (INT16)( (((INT32)W2I*x2Q)+((INT32)W2Q*x2I))>>15 );
847 	z3I = (INT16)( (((INT32)W3I*x3I)-((INT32)W3Q*x3Q))>>15 );
848 	z3Q = (INT16)( (((INT32)W3I*x3Q)+((INT32)W3Q*x3I))>>15 );
849 #endif
850 	// calculate using A = (z0+z2), B = (z0-z2), C = (z1+z3), D = (z1-z3);
851 	// y0 = z0 + z1 + z2 + z3 = A + C
852 	// y1 = z0 -jz1 - z2 +jz3 = B -jD
853 	// y2 = z0 - z1 + z2 - z3 = A - C
854 	// y3 = z0 +jz1 - z2 -jz3 = B +jD
855 #ifdef ARM_DEBUG
856 	AI = radix4Fft16BitAddShift(z0I, z2I); AQ = radix4Fft16BitAddShift(z0Q, z2Q);
857 	BI = radix4Fft16BitSubtractShift(z0I, z2I); BQ = radix4Fft16BitSubtractShift(z0Q, z2Q);
858 	CI = radix4Fft16BitAddShift(z1I, z3I); CQ = radix4Fft16BitAddShift(z1Q, z3Q);
859 	DI = radix4Fft16BitSubtractShift(z1I, z3I); DQ = radix4Fft16BitSubtractShift(z1Q, z3Q);
860 
861 	y0I = radix4Fft16BitAddShift(AI, CI); y0Q = radix4Fft16BitAddShift(AQ, CQ);
862 	y1I = radix4Fft16BitSubtractShift(BI, DQ); y1Q = radix4Fft16BitAddShift(BQ, DI);
863 	y2I = radix4Fft16BitSubtractShift(AI, CI); y2Q = radix4Fft16BitSubtractShift(AQ, CQ);
864 	y3I = radix4Fft16BitAddShift(BI, DQ); y3Q = radix4Fft16BitSubtractShift(BQ, DI);
865 #else
866 	AI = (z0I+z2I)>>1; AQ = (z0Q+z2Q)>>1;
867 	BI = (z0I-z2I)>>1; BQ = (z0Q-z2Q)>>1;
868 	CI = (z1I+z3I)>>1; CQ = (z1Q+z3Q)>>1;
869 	DI = (z1I-z3I)>>1; DQ = (z1Q-z3Q)>>1;
870 
871 	y0I = (AI+CI)>>1; y0Q = (AQ+CQ)>>1;
872 	y1I = (BI-DQ)>>1; y1Q = (BQ+DI)>>1;
873 	y2I = (AI-CI)>>1; y2Q = (AQ-CQ)>>1;
874 	y3I = (BI+DQ)>>1; y3Q = (BQ-DI)>>1;
875 #endif
876 	storeTemp = (unsigned short)y0Q;
877 	storeTemp<<=16;
878 	storeTemp |=(unsigned short)y0I;
879 	*storePtr = storeTemp; storePtr+=stride;
880 	storeTemp = (unsigned short)y1Q;
881 	storeTemp<<=16;
882 	storeTemp |=(unsigned short)y1I;
883 	*storePtr = storeTemp; storePtr+=stride;
884 	storeTemp = (unsigned short)y2Q;
885 	storeTemp<<=16;
886 	storeTemp |=(unsigned short)y2I;
887 	*storePtr = storeTemp; storePtr+=stride;
888 	storeTemp = (unsigned short)y3Q;
889 	storeTemp<<=16;
890 	storeTemp |=(unsigned short)y3I;
891 	*storePtr = storeTemp; storePtr+=stride;
892 #endif
893 }
894 
895 #ifdef FFT_PARALLEL
radix4IfftRadix4ButterflyTwiddleParallel(INT16 * pSrc,INT16 * pDst,int stride,const INT16 * pCoeff,int coeffStride)896 void radix4IfftRadix4ButterflyTwiddleParallel(INT16* pSrc, INT16* pDst, int stride, const INT16* pCoeff, int coeffStride) {
897 
898 	int qq;
899 	INT16 x1I[NUM_PARALLEL], x1Q[NUM_PARALLEL], x2I[NUM_PARALLEL], x2Q[NUM_PARALLEL], x3I[NUM_PARALLEL], x3Q[NUM_PARALLEL]; //  x0I, x0Q,
900 	INT16 z0I[NUM_PARALLEL], z0Q[NUM_PARALLEL], z1I[NUM_PARALLEL], z1Q[NUM_PARALLEL], z2I[NUM_PARALLEL], z2Q[NUM_PARALLEL], z3I[NUM_PARALLEL], z3Q[NUM_PARALLEL];
901 	INT16 y0I[NUM_PARALLEL], y0Q[NUM_PARALLEL], y1I[NUM_PARALLEL], y1Q[NUM_PARALLEL], y2I[NUM_PARALLEL], y2Q[NUM_PARALLEL], y3I[NUM_PARALLEL], y3Q[NUM_PARALLEL];
902 	INT16 AI[NUM_PARALLEL], AQ[NUM_PARALLEL], BI[NUM_PARALLEL], BQ[NUM_PARALLEL], CI[NUM_PARALLEL], CQ[NUM_PARALLEL], DI[NUM_PARALLEL], DQ[NUM_PARALLEL];
903 	INT16 W1I, W1Q, W2I, W2Q, W3I, W3Q; // W0I, W0Q,
904 
905 	unsigned int *loadPtr = (unsigned int *)pSrc;
906 	unsigned int loadTemp;
907 	unsigned int *coeffPtr = (unsigned int *)(pCoeff + 2 * coeffStride);
908 	unsigned int loadCoeff;
909 	unsigned int *storePtr = (unsigned int *)pDst;
910 	unsigned int storeTemp;
911 
912 	// re-order due to L^4_2 - because of using radix-2 bit-reversal
913 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
914 		loadTemp = loadPtr[qq];
915 		z0I[qq] = (loadTemp & 0xffff); z0Q[qq] = (loadTemp >> 16);
916 	}
917 	loadPtr += stride;
918 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
919 		loadTemp = loadPtr[qq];
920 		x2I[qq] = (loadTemp & 0xffff); x2Q[qq] = (loadTemp >> 16);
921 	}
922 	loadPtr += stride;
923 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
924 		loadTemp = loadPtr[qq];
925 		x1I[qq] = (loadTemp & 0xffff); x1Q[qq] = (loadTemp >> 16);
926 	}
927 	loadPtr += stride;
928 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
929 		loadTemp = loadPtr[qq];
930 		x3I[qq] = (loadTemp & 0xffff); x3Q[qq] = (loadTemp >> 16);
931 	}
932 
933 	loadCoeff = *coeffPtr; coeffPtr += coeffStride;
934 	W1I = (loadCoeff & 0xffff); W1Q = (loadCoeff >> 16);
935 	loadCoeff = *coeffPtr; coeffPtr += coeffStride;
936 	W2I = (loadCoeff & 0xffff); W2Q = (loadCoeff >> 16);
937 	loadCoeff = *coeffPtr; coeffPtr += coeffStride;
938 	W3I = (loadCoeff & 0xffff); W3Q = (loadCoeff >> 16);
939 
940 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
941 		z1I[qq] = (INT16)((((INT32)W1I*x1I[qq]) - ((INT32)W1Q*x1Q[qq])) >> 15);
942 		z1Q[qq] = (INT16)((((INT32)W1I*x1Q[qq]) + ((INT32)W1Q*x1I[qq])) >> 15);
943 		z2I[qq] = (INT16)((((INT32)W2I*x2I[qq]) - ((INT32)W2Q*x2Q[qq])) >> 15);
944 		z2Q[qq] = (INT16)((((INT32)W2I*x2Q[qq]) + ((INT32)W2Q*x2I[qq])) >> 15);
945 		z3I[qq] = (INT16)((((INT32)W3I*x3I[qq]) - ((INT32)W3Q*x3Q[qq])) >> 15);
946 		z3Q[qq] = (INT16)((((INT32)W3I*x3Q[qq]) + ((INT32)W3Q*x3I[qq])) >> 15);
947 	}
948 
949 	// calculate using A = (z0+z2), B = (z0-z2), C = (z1+z3), D = (z1-z3);
950 	// y0 = z0 + z1 + z2 + z3 = A + C
951 	// y1 = z0 -jz1 - z2 +jz3 = B -jD
952 	// y2 = z0 - z1 + z2 - z3 = A - C
953 	// y3 = z0 +jz1 - z2 -jz3 = B +jD
954 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
955 		AI[qq] = (z0I[qq] + z2I[qq]) >> 1; AQ[qq] = (z0Q[qq] + z2Q[qq]) >> 1;
956 		BI[qq] = (z0I[qq] - z2I[qq]) >> 1; BQ[qq] = (z0Q[qq] - z2Q[qq]) >> 1;
957 		CI[qq] = (z1I[qq] + z3I[qq]) >> 1; CQ[qq] = (z1Q[qq] + z3Q[qq]) >> 1;
958 		DI[qq] = (z1I[qq] - z3I[qq]) >> 1; DQ[qq] = (z1Q[qq] - z3Q[qq]) >> 1;
959 	}
960 
961 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
962 		y0I[qq] = (AI[qq] + CI[qq]) >> 1; y0Q[qq] = (AQ[qq] + CQ[qq]) >> 1;
963 		y1I[qq] = (BI[qq] - DQ[qq]) >> 1; y1Q[qq] = (BQ[qq] + DI[qq]) >> 1;
964 		y2I[qq] = (AI[qq] - CI[qq]) >> 1; y2Q[qq] = (AQ[qq] - CQ[qq]) >> 1;
965 		y3I[qq] = (BI[qq] + DQ[qq]) >> 1; y3Q[qq] = (BQ[qq] - DI[qq]) >> 1;
966 	}
967 
968 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
969 		storeTemp = (unsigned short)y0Q[qq];
970 		storeTemp <<= 16;
971 		storeTemp |= (unsigned short)y0I[qq];
972 		storePtr[qq] = storeTemp;
973 	}
974 	storePtr += stride;
975 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
976 		storeTemp = (unsigned short)y1Q[qq];
977 		storeTemp <<= 16;
978 		storeTemp |= (unsigned short)y1I[qq];
979 		storePtr[qq] = storeTemp;
980 	}
981 	storePtr += stride;
982 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
983 		storeTemp = (unsigned short)y2Q[qq];
984 		storeTemp <<= 16;
985 		storeTemp |= (unsigned short)y2I[qq];
986 		storePtr[qq] = storeTemp;
987 	}
988 	storePtr += stride;
989 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
990 		storeTemp = (unsigned short)y3Q[qq];
991 		storeTemp <<= 16;
992 		storeTemp |= (unsigned short)y3I[qq];
993 		storePtr[qq] = storeTemp;
994 	}
995 	storePtr += stride;
996 }
997 #endif
998 
radix4FftRadix2ButterflyTwiddle(INT16 * pSrc,INT16 * pDst,int stride,const INT16 * pCoeff,int coeffStride)999 void radix4FftRadix2ButterflyTwiddle(INT16* pSrc, INT16* pDst, int stride, const INT16* pCoeff, int coeffStride){
1000 #if defined(ARM_GCC) || defined(ARM_DS5)
1001 #ifdef ARM_DS5
1002 	int reg5, reg6, reg7, reg8, reg9;
1003 	int strideDw = 4*stride;
1004 	int coeffStrideDw = 4*coeffStride;
1005 
1006 	__asm
1007 	{
1008 		LDR reg7, [pCoeff, coeffStrideDw]
1009 		LDR reg5, [pSrc]
1010 		LDR reg6, [pSrc, strideDw]
1011 		SMUAD reg8, reg7, reg6
1012 		SMUSDX reg9, reg7, reg6
1013 		LSL reg7, reg9, #1
1014 		PKHTB reg6, reg7, reg8, ASR #15
1015 		QADD16 reg7, reg5, reg6
1016 		QSUB16 reg8, reg5, reg6
1017 		STR reg7, [pDst]
1018 		STR reg8, [pDst, strideDw]
1019 	}
1020 #else
1021     asm(
1022 		"LDR r7, [%[pCoeff], %[coeffStrideDw]] \n\t"
1023 		"LDR r5, [%[pSrc]] \n\t"
1024 		"LDR r6, [%[pSrc], %[strideDw]] \n\t"
1025 		"SMUAD r8, r7, r6 \n\t"
1026 		"SMUSDX r9, r7, r6 \n\t"
1027 		"LSL r7, r9, #1 \n\t"
1028 		"PKHTB r6, r7, r8, ASR #15 \n\t"
1029 		"QADD16 r7, r5, r6 \n\t"
1030 		"QSUB16 r8, r5, r6 \n\t"
1031 		"STR r7, [%[pDst]] \n\t"
1032 		"STR r8, [%[pDst], %[strideDw]] \n\t"
1033 		:: [pSrc]"r"(pSrc), [pDst]"r"(pDst), [pCoeff]"r"(pCoeff), [strideDw]"r"(4*stride), [coeffStrideDw]"r"(4*coeffStride)
1034 		: "r5", "r6", "r7", "r8", "r9");
1035 #endif
1036 #else
1037 	INT16 x1I, x1Q; //  x0I, x0Q,
1038 	INT16 z0I, z0Q, z1I, z1Q;
1039 	INT16 y0I, y0Q, y1I, y1Q;
1040 	INT16 W1I, W1Q; // W0I, W0Q,
1041 
1042 	unsigned int *loadPtr = (unsigned int *)pSrc;
1043 	unsigned int loadTemp;
1044 	unsigned int *coeffPtr = (unsigned int *)(pCoeff +2*coeffStride);
1045 	unsigned int loadCoeff;
1046 	unsigned int *storePtr = (unsigned int *)pDst;
1047 	unsigned int storeTemp;
1048 
1049 	// re-order due to L^4_2 - because of using radix-2 bit-reversal
1050 	loadTemp = *loadPtr; loadPtr +=stride;
1051 	z0I = (loadTemp&0xffff); z0Q = (loadTemp>>16);
1052 	loadTemp = *loadPtr; loadPtr +=stride;
1053 	x1I = (loadTemp&0xffff); x1Q = (loadTemp>>16);
1054 
1055 	loadCoeff = *coeffPtr; coeffPtr +=coeffStride;
1056 	W1I = (loadCoeff&0xffff); W1Q = (loadCoeff>>16);
1057 #ifdef ARM_DEBUG
1058 	z1I = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulator( radix4Fft16BitTo32BitMultiplier(W1I, x1I), radix4Fft16BitTo32BitMultiplier(W1Q, x1Q))); // r6
1059 	z1Q = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulatorNeg( radix4Fft16BitTo32BitMultiplier(W1I, x1Q), radix4Fft16BitTo32BitMultiplier(W1Q, x1I)));
1060 	y0I = radix4Fft16BitAdd(z0I, z1I); y0Q = radix4Fft16BitAdd(z0Q, z1Q);
1061 	y1I = radix4Fft16BitSubtract(z0I, z1I); y1Q = radix4Fft16BitSubtract(z0Q, z1Q);
1062 #else
1063 	z1I = (INT16)( (((INT32)W1I*x1I)+((INT32)W1Q*x1Q))>>15 );
1064 	z1Q = (INT16)( (((INT32)W1I*x1Q)-((INT32)W1Q*x1I))>>15 );
1065 	y0I = (z0I+z1I); y0Q = (z0Q+z1Q);
1066 	y1I = (z0I-z1I); y1Q = (z0Q-z1Q);
1067 #endif
1068 	storeTemp = (unsigned short)y0Q;
1069 	storeTemp<<=16;
1070 	storeTemp |=(unsigned short)y0I;
1071 	*storePtr = storeTemp; storePtr+=stride;
1072 	storeTemp = (unsigned short)y1Q;
1073 	storeTemp<<=16;
1074 	storeTemp |=(unsigned short)y1I;
1075 	*storePtr = storeTemp; storePtr+=stride;
1076 #endif
1077 }
1078 
radix4IfftRadix2ButterflyTwiddle(INT16 * pSrc,INT16 * pDst,int stride,const INT16 * pCoeff,int coeffStride)1079 void radix4IfftRadix2ButterflyTwiddle(INT16* pSrc, INT16* pDst, int stride, const INT16* pCoeff, int coeffStride){
1080 #if defined(ARM_GCC) || defined(ARM_DS5)
1081 #ifdef ARM_DS5
1082     int reg5, reg6, reg7, reg8, reg9;
1083     __asm
1084     {
1085         LDR reg7, [pCoeff, (4*coeffStride)]
1086         LDR reg5, [pSrc]
1087         LDR reg6, [pSrc, (4*stride)]
1088         SMUSD reg8, reg7, reg6
1089         SMUADX reg9, reg7, reg6
1090         LSL reg7, reg9, #1
1091         PKHTB reg6, reg7, reg8, ASR #15
1092         SHADD16 reg7, reg5, reg6
1093         SHSUB16 reg8, reg5, reg6
1094         STR reg7, [pDst]
1095         STR reg8, [pDst, (4*stride)]
1096     }
1097 
1098 #else
1099     asm(
1100 		"LDR r7, [%[pCoeff], %[coeffStrideDw]] \n\t"
1101 		"LDR r5, [%[pSrc]] \n\t"
1102 		"LDR r6, [%[pSrc], %[strideDw]] \n\t"
1103 		"SMUSD r8, r7, r6 \n\t"
1104 		"SMUADX r9, r7, r6 \n\t"
1105 		"LSL r7, r9, #1 \n\t"
1106 		"PKHTB r6, r7, r8, ASR #15 \n\t"
1107 		"SHADD16 r7, r5, r6 \n\t"
1108 		"SHSUB16 r8, r5, r6 \n\t"
1109 		"STR r7, [%[pDst]] \n\t"
1110 		"STR r8, [%[pDst], %[strideDw]] \n\t"
1111 		:: [pSrc]"r"(pSrc), [pDst]"r"(pDst), [pCoeff]"r"(pCoeff), [strideDw]"r"(4*stride), [coeffStrideDw]"r"(4*coeffStride)
1112 		: "r5", "r6", "r7", "r8", "r9");
1113 #endif
1114 #else
1115 	INT16 x1I, x1Q; //  x0I, x0Q,
1116 	INT16 z0I, z0Q, z1I, z1Q;
1117 	INT16 y0I, y0Q, y1I, y1Q;
1118 	INT16 W1I, W1Q; // W0I, W0Q,
1119 
1120 	unsigned int *loadPtr = (unsigned int *)pSrc;
1121 	unsigned int loadTemp;
1122 	unsigned int *coeffPtr = (unsigned int *)(pCoeff +2*coeffStride);
1123 	unsigned int loadCoeff;
1124 	unsigned int *storePtr = (unsigned int *)pDst;
1125 	unsigned int storeTemp;
1126 
1127 	// re-order due to L^4_2 - because of using radix-2 bit-reversal
1128 	loadTemp = *loadPtr; loadPtr +=stride;
1129 	z0I = (loadTemp&0xffff); z0Q = (loadTemp>>16);
1130 	loadTemp = *loadPtr; loadPtr +=stride;
1131 	x1I = (loadTemp&0xffff); x1Q = (loadTemp>>16);
1132 
1133 	loadCoeff = *coeffPtr; coeffPtr +=coeffStride;
1134 	W1I = (loadCoeff&0xffff); W1Q = (loadCoeff>>16);
1135 #ifdef ARM_DEBUG
1136 	z1I = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulatorNeg( radix4Fft16BitTo32BitMultiplier(W1I, x1I), radix4Fft16BitTo32BitMultiplier(W1Q, x1Q))); // r6
1137 	z1Q = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulator( radix4Fft16BitTo32BitMultiplier(W1I, x1Q), radix4Fft16BitTo32BitMultiplier(W1Q, x1I)));
1138 
1139 	y0I = radix4Fft16BitAddShift(z0I, z1I); y0Q = radix4Fft16BitAddShift(z0Q, z1Q);
1140 	y1I = radix4Fft16BitSubtractShift(z0I, z1I); y1Q = radix4Fft16BitSubtractShift(z0Q, z1Q);
1141 #else
1142 	z1I = ( (((INT32)W1I*x1I)-((INT32)W1Q*x1Q))>>15 );
1143 	z1Q = ( (((INT32)W1I*x1Q)+((INT32)W1Q*x1I))>>15 );
1144 
1145 	y0I = (z0I+z1I)>>1; y0Q = (z0Q+z1Q)>>1;
1146 	y1I = (z0I-z1I)>>1; y1Q = (z0Q-z1Q)>>1;
1147 
1148 #endif
1149 	storeTemp = (unsigned short)y0Q;
1150 	storeTemp<<=16;
1151 	storeTemp |=(unsigned short)y0I;
1152 	*storePtr = storeTemp; storePtr+=stride;
1153 	storeTemp = (unsigned short)y1Q;
1154 	storeTemp<<=16;
1155 	storeTemp |=(unsigned short)y1I;
1156 	*storePtr = storeTemp; storePtr+=stride;
1157 #endif
1158 }
1159 
1160 #ifdef FFT_PARALLEL
radix4IfftRadix2ButterflyTwiddleParallel(INT16 * pSrc,INT16 * pDst,int stride,const INT16 * pCoeff,int coeffStride)1161 void radix4IfftRadix2ButterflyTwiddleParallel(INT16* pSrc, INT16* pDst, int stride, const INT16* pCoeff, int coeffStride) {
1162 
1163 	int qq;
1164 	INT16 x1I[NUM_PARALLEL], x1Q[NUM_PARALLEL]; //  x0I, x0Q,
1165 	INT16 z0I[NUM_PARALLEL], z0Q[NUM_PARALLEL], z1I[NUM_PARALLEL], z1Q[NUM_PARALLEL];
1166 	INT16 y0I[NUM_PARALLEL], y0Q[NUM_PARALLEL], y1I[NUM_PARALLEL], y1Q[NUM_PARALLEL];
1167 	INT16 W1I, W1Q; // W0I, W0Q,
1168 
1169 	unsigned int *loadPtr = (unsigned int *)pSrc;
1170 	unsigned int loadTemp;
1171 	unsigned int *coeffPtr = (unsigned int *)(pCoeff + 2 * coeffStride);
1172 	unsigned int loadCoeff;
1173 	unsigned int *storePtr = (unsigned int *)pDst;
1174 	unsigned int storeTemp;
1175 
1176 	// re-order due to L^4_2 - because of using radix-2 bit-reversal
1177 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
1178 		loadTemp = loadPtr[qq];
1179 		z0I[qq] = (loadTemp & 0xffff); z0Q[qq] = (loadTemp >> 16);
1180 	}
1181 	loadPtr += stride;
1182 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
1183 		loadTemp = loadPtr[qq];
1184 		x1I[qq] = (loadTemp & 0xffff); x1Q[qq] = (loadTemp >> 16);
1185 	}
1186 	loadPtr += stride;
1187 
1188 	loadCoeff = *coeffPtr; coeffPtr += coeffStride;
1189 	W1I = (loadCoeff & 0xffff); W1Q = (loadCoeff >> 16);
1190 
1191 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
1192 		z1I[qq] = ((((INT32)W1I*x1I[qq]) - ((INT32)W1Q*x1Q[qq])) >> 15);
1193 		z1Q[qq] = ((((INT32)W1I*x1Q[qq]) + ((INT32)W1Q*x1I[qq])) >> 15);
1194 	}
1195 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
1196 		y0I[qq] = (z0I[qq] + z1I[qq]) >> 1; y0Q[qq] = (z0Q[qq] + z1Q[qq]) >> 1;
1197 		y1I[qq] = (z0I[qq] - z1I[qq]) >> 1; y1Q[qq] = (z0Q[qq] - z1Q[qq]) >> 1;
1198 	}
1199 
1200 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
1201 		storeTemp = (unsigned short)y0Q[qq];
1202 		storeTemp <<= 16;
1203 		storeTemp |= (unsigned short)y0I[qq];
1204 		storePtr[qq] = storeTemp;
1205 	}
1206 	storePtr += stride;
1207 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
1208 		storeTemp = (unsigned short)y1Q[qq];
1209 		storeTemp <<= 16;
1210 		storeTemp |= (unsigned short)y1I[qq];
1211 		storePtr[qq] = storeTemp;
1212 	}
1213 	storePtr += stride;
1214 }
1215 #endif
1216 
1217 #if defined(ARM_GCC) || defined(ARM_DS5)
1218 
1219 // first stage of radix-4 butterflies
1220 // no twiddles, no stride, includes bit-reversal
radix4FftStageOne(INT16 * pSrc,INT16 * pDst,int Nfft)1221 void radix4FftStageOne(INT16* pSrc, INT16* pDst, int Nfft){
1222 #ifdef ARM_DS5
1223 	int  reg4, reg5, reg6, reg7, reg8, reg9, reg10;
1224 #endif
1225 	int nn;
1226 	int loopLen;
1227 	unsigned int index1 = 0; // bit-reversal permutation
1228 	int revBitInc = 1<<(1+__clz(Nfft)-2); // -2 for 4 byte LD
1229 
1230 	loopLen = Nfft>>2;
1231 	for(nn=loopLen;nn>0;nn--){
1232 		// first stage does not need saturation
1233 #ifdef ARM_DS5
1234 		__asm volatile
1235 		{
1236 			RBIT reg4, index1
1237 			LDR reg5, [pSrc, reg4]
1238 			ADD index1, index1, revBitInc
1239 			RBIT reg4, index1
1240 			LDR reg6, [pSrc, reg4]
1241 			ADD index1, index1, revBitInc
1242 			RBIT reg4, index1
1243 			LDR reg7, [pSrc, reg4]
1244 			ADD index1, index1, revBitInc
1245 			RBIT reg4, index1
1246 			LDR reg8, [pSrc, reg4]
1247 			ADD index1, index1, revBitInc
1248 			SADD16 reg9, reg5, reg6
1249 			SSUB16 reg10, reg5, reg6
1250 			SADD16 reg4, reg7, reg8
1251 			SSUB16 reg5, reg7, reg8
1252 			SADD16 reg6, reg9, reg4
1253 			SSUB16 reg8, reg9, reg4
1254 			SSAX reg7, reg10, reg5
1255 			SASX reg9, reg10, reg5
1256 			STR reg6, [pDst], #4
1257 			STR reg7, [pDst], #4
1258 			STR reg8, [pDst], #4
1259 			STR reg9, [pDst], #4
1260 		}
1261 ///		STM pDst!, {reg6-reg9}
1262 #else
1263     	asm volatile (
1264 			"RBIT r4, %[index1] \n\t"
1265 			"LDR r5, [%[pSrc], r4] \n\t"
1266 			"ADD %[index1], %[index1], %[revBitInc] \n\t"
1267 			"RBIT r4, %[index1] \n\t"
1268 			"LDR r6, [%[pSrc], r4]\n\t"
1269 			"ADD %[index1], %[index1], %[revBitInc] \n\t"
1270 			"RBIT r4, %[index1] \n\t"
1271 			"LDR r7, [%[pSrc], r4] \n\t"
1272 			"ADD %[index1], %[index1], %[revBitInc] \n\t"
1273 			"RBIT r4, %[index1] \n\t"
1274 			"LDR r8, [%[pSrc], r4] \n\t"
1275 			"ADD %[index1], %[index1], %[revBitInc] \n\t"
1276 			"SADD16 r9, r5, r6 \n\t"
1277 			"SSUB16 r10, r5, r6 \n\t"
1278 			"SADD16 r4, r7, r8 \n\t"
1279 			"SSUB16 r5, r7, r8 \n\t"
1280 			"SADD16 r6, r9, r4 \n\t"
1281 			"SSUB16 r8, r9, r4 \n\t"
1282 			"SSAX r7, r10, r5 \n\t"
1283 			"SASX r9, r10, r5 \n\t"
1284 			"STM %[pDst]!, {r6-r9} \n\t"
1285 			: [pDst]"+r"(pDst), [index1]"+r"(index1) : [pSrc]"r"(pSrc), [revBitInc]"r"(revBitInc)
1286 			: "r4", "r5", "r6", "r7", "r8", "r9","r10","memory");
1287 #endif
1288 	}
1289 }
1290 /*
1291 			"STRD r6, r7, [%[pDst]], #8 \n\t"
1292 			"STRD r8, r9, [%[pDst]], #8 \n\t"
1293 */
radix4IfftStageOne(INT16 * pSrc,INT16 * pDst,int Nfft)1294 void radix4IfftStageOne(INT16* pSrc, INT16* pDst, int Nfft){
1295 
1296 #ifdef ARM_DS5
1297    int reg4, reg5, reg6, reg7, reg8, reg9, reg10;
1298 #endif
1299 	int nn;
1300 	int loopLen;
1301 	unsigned int index1 = 0; // bit-reversal permutation
1302 	int revBitInc = 1<<(1+__clz(Nfft)-2); // -2 for 4 byte LD
1303 
1304 	loopLen = Nfft>>2;
1305 	for(nn=loopLen;nn>0;nn--){
1306 		// first stage does not need saturation
1307 #ifdef ARM_DS5
1308         __asm volatile
1309         {
1310             RBIT reg4, index1
1311             LDR reg5, [pSrc, reg4]
1312             ADD index1, index1, revBitInc
1313             RBIT reg4, index1
1314             LDR reg6, [pSrc, reg4]
1315             ADD index1, index1, revBitInc
1316             RBIT reg4, index1
1317             LDR reg7, [pSrc, reg4]
1318             ADD index1, index1, revBitInc
1319             RBIT reg4, index1
1320             LDR reg8, [pSrc, reg4]
1321             ADD index1, index1, revBitInc
1322             SHADD16 reg9, reg5, reg6
1323             SHSUB16 reg10, reg5, reg6
1324             SHADD16 reg4, reg7, reg8
1325             SHSUB16 reg5, reg7, reg8
1326             SHADD16 reg6, reg9, reg4
1327             SHSUB16 reg8, reg9, reg4
1328             SHASX reg7, reg10, reg5
1329             SHSAX reg9, reg10, reg5
1330 			STR reg6, [pDst], #4
1331 			STR reg7, [pDst], #4
1332 			STR reg8, [pDst], #4
1333 			STR reg9, [pDst], #4
1334         }
1335 //        STM pDst!, {reg6, reg7, reg8, reg9}
1336 #else
1337     	asm volatile (
1338 			"RBIT r4, %[index1] \n\t"
1339 			"LDR r5, [%[pSrc], r4] \n\t"
1340 			"ADD %[index1], %[index1], %[revBitInc] \n\t"
1341 			"RBIT r4, %[index1] \n\t"
1342 			"LDR r6, [%[pSrc], r4]\n\t"
1343 			"ADD %[index1], %[index1], %[revBitInc] \n\t"
1344 			"RBIT r4, %[index1] \n\t"
1345 			"LDR r7, [%[pSrc], r4] \n\t"
1346 			"ADD %[index1], %[index1], %[revBitInc] \n\t"
1347 			"RBIT r4, %[index1] \n\t"
1348 			"LDR r8, [%[pSrc], r4] \n\t"
1349 			"ADD %[index1], %[index1], %[revBitInc] \n\t"
1350 			"SHADD16 r9, r5, r6 \n\t"
1351 			"SHSUB16 r10, r5, r6 \n\t"
1352 			"SHADD16 r4, r7, r8 \n\t"
1353 			"SHSUB16 r5, r7, r8 \n\t"
1354 			"SHADD16 r6, r9, r4 \n\t"
1355 			"SHSUB16 r8, r9, r4 \n\t"
1356 			"SHASX r7, r10, r5 \n\t"
1357 			"SHSAX r9, r10, r5 \n\t"
1358 			"STM %[pDst]!, {r6-r9} \n\t"
1359 			: [pDst]"+r"(pDst), [index1]"+r"(index1) : [pSrc]"r"(pSrc), [revBitInc]"r"(revBitInc)
1360 			: "r4", "r5", "r6", "r7", "r8", "r9","r10","memory");
1361 #endif
1362 	}
1363 }
1364 #else
radix4FftRadix4ButterflyBrev(INT16 * pSrc,INT16 * pDst,unsigned int index1,int log2Nfft)1365 void radix4FftRadix4ButterflyBrev(INT16* pSrc, INT16* pDst, unsigned int index1, int log2Nfft){
1366  	INT16 x0I, x0Q, x1I, x1Q, x2I, x2Q, x3I, x3Q;
1367 	INT16 y0I, y0Q, y1I, y1Q, y2I, y2Q, y3I, y3Q;
1368 	INT16 AI, AQ, BI, BQ, CI, CQ, DI, DQ;
1369 	unsigned int index2;
1370 	unsigned int *loadPtr = (unsigned int*)pSrc;
1371 	unsigned int *storePtr = (unsigned int*)pDst;
1372 	unsigned int loadTemp, storeTemp;
1373 	int bitShift = IDX_LEN-log2Nfft;
1374 
1375 	// re-order due to L^4_2 - because of using radix-2 bit-reversal
1376 	index2 = REV_IDX(index1++);
1377 	index2>>=bitShift;
1378 	loadTemp = loadPtr[index2];
1379 	x0I = (loadTemp&0xffff); x0Q = (loadTemp>>16);
1380 	//x0I = pSrc[2*index2]; x0Q = pSrc[2*index2+1];	// r5
1381 
1382 	index2 = REV_IDX(index1++);
1383 	index2>>=bitShift;
1384 	loadTemp = loadPtr[index2];
1385 	x2I = (loadTemp&0xffff); x2Q = (loadTemp>>16);
1386 	//x2I = pSrc[2*index2]; x2Q = pSrc[2*index2+1];	// r6
1387 
1388 	index2 = REV_IDX(index1++);
1389 	index2>>=bitShift;
1390 	loadTemp = loadPtr[index2];
1391 	x1I = (loadTemp&0xffff); x1Q = (loadTemp>>16);
1392 	//x1I = pSrc[2*index2]; x1Q = pSrc[2*index2+1];	// r7
1393 
1394 	index2 = REV_IDX(index1++);
1395 	index2>>=bitShift;
1396 	loadTemp = loadPtr[index2];
1397 	x3I = (loadTemp&0xffff); x3Q = (loadTemp>>16);
1398 	//x3I = pSrc[2*index2]; x3Q = pSrc[2*index2+1];	// r8
1399 
1400 #ifdef ARM_DEBUG
1401 	AI = radix4Fft16BitAdd(x0I, x2I); AQ = radix4Fft16BitAdd(x0Q, x2Q);				// r4
1402 	BI = radix4Fft16BitSubtract(x0I, x2I); BQ = radix4Fft16BitSubtract(x0Q, x2Q);	// r5
1403 	CI = radix4Fft16BitAdd(x1I, x3I); CQ = radix4Fft16BitAdd(x1Q, x3Q);				// r6
1404 	DI = radix4Fft16BitSubtract(x1I, x3I); DQ = radix4Fft16BitSubtract(x1Q, x3Q);	// r7
1405 
1406 	y0I = radix4Fft16BitAdd(AI, CI); y0Q = radix4Fft16BitAdd(AQ, CQ);				// r8
1407 	y2I = radix4Fft16BitSubtract(AI, CI); y2Q = radix4Fft16BitSubtract(AQ, CQ);		// r4
1408 	y3I = radix4Fft16BitSubtract(BI, DQ); y3Q = radix4Fft16BitAdd(BQ, DI);			// r6
1409 	y1I = radix4Fft16BitAdd(BI, DQ); y1Q = radix4Fft16BitSubtract(BQ, DI);			// r5
1410 #else
1411 	AI = x0I+x2I; AQ = x0Q+x2Q;
1412 	BI = x0I-x2I; BQ = x0Q-x2Q;
1413 	CI = x1I+x3I; CQ = x1Q+x3Q;
1414 	DI = x1I-x3I; DQ = x1Q-x3Q;
1415 
1416 	y0I = AI+CI; y0Q = AQ+CQ;
1417 	y2I = AI-CI; y2Q = AQ-CQ;
1418 	y3I = BI-DQ; y3Q = BQ+DI;
1419 	y1I = BI+DQ; y1Q = BQ-DI;
1420 #endif
1421 
1422 	storeTemp = (unsigned short)y0Q;
1423 	storeTemp<<=16;
1424 	storeTemp |=(unsigned short)y0I;
1425 	*storePtr++ = storeTemp;
1426 	storeTemp = (unsigned short)y1Q;
1427 	storeTemp<<=16;
1428 	storeTemp |=(unsigned short)y1I;
1429 	*storePtr++ = storeTemp;
1430 	storeTemp = (unsigned short)y2Q;
1431 	storeTemp<<=16;
1432 	storeTemp |=(unsigned short)y2I;
1433 	*storePtr++ = storeTemp;
1434 	storeTemp = (unsigned short)y3Q;
1435 	storeTemp<<=16;
1436 	storeTemp |=(unsigned short)y3I;
1437 	*storePtr++ = storeTemp;
1438 }
1439 
radix4IfftRadix4ButterflyBrev(INT16 * pSrc,INT16 * pDst,unsigned int index1,int log2Nfft)1440 void radix4IfftRadix4ButterflyBrev(INT16* pSrc, INT16* pDst, unsigned int index1, int log2Nfft){
1441  	INT16 x0I, x0Q, x1I, x1Q, x2I, x2Q, x3I, x3Q;
1442 	INT16 y0I, y0Q, y1I, y1Q, y2I, y2Q, y3I, y3Q;
1443 	INT16 AI, AQ, BI, BQ, CI, CQ, DI, DQ;
1444 
1445 	unsigned int index2;
1446 	unsigned int *loadPtr = (unsigned int*)pSrc;
1447 	unsigned int *storePtr = (unsigned int*)pDst;
1448 	unsigned int loadTemp, storeTemp;
1449 	int bitShift = IDX_LEN-log2Nfft;
1450 
1451 	// re-order due to L^4_2 - because of using radix-2 bit-reversal
1452 	index2 = REV_IDX(index1++);
1453 	index2>>=bitShift;
1454 	loadTemp = loadPtr[index2];
1455 	x0I = (loadTemp&0xffff); x0Q = (loadTemp>>16);
1456 	//x0I = pSrc[2*index2]; x0Q = pSrc[2*index2+1];	// r5
1457 
1458 	index2 = REV_IDX(index1++);
1459 	index2>>=bitShift;
1460 	loadTemp = loadPtr[index2];
1461 	x2I = (loadTemp&0xffff); x2Q = (loadTemp>>16);
1462 	//x2I = pSrc[2*index2]; x2Q = pSrc[2*index2+1];	// r6
1463 
1464 	index2 = REV_IDX(index1++);
1465 	index2>>=bitShift;
1466 	loadTemp = loadPtr[index2];
1467 	x1I = (loadTemp&0xffff); x1Q = (loadTemp>>16);
1468 	//x1I = pSrc[2*index2]; x1Q = pSrc[2*index2+1];	// r7
1469 
1470 	index2 = REV_IDX(index1++);
1471 	index2>>=bitShift;
1472 	loadTemp = loadPtr[index2];
1473 	x3I = (loadTemp&0xffff); x3Q = (loadTemp>>16);
1474 	//x3I = pSrc[2*index2]; x3Q = pSrc[2*index2+1];	// r8
1475 #ifdef ARM_DEBUG
1476 	AI = radix4Fft16BitAddShift(x0I, x2I); AQ = radix4Fft16BitAddShift(x0Q, x2Q);				// r4
1477 	BI = radix4Fft16BitSubtractShift(x0I, x2I); BQ = radix4Fft16BitSubtractShift(x0Q, x2Q);	// r5
1478 	CI = radix4Fft16BitAddShift(x1I, x3I); CQ = radix4Fft16BitAddShift(x1Q, x3Q);				// r6
1479 	DI = radix4Fft16BitSubtractShift(x1I, x3I); DQ = radix4Fft16BitSubtractShift(x1Q, x3Q);	// r7
1480 	y0I = radix4Fft16BitAddShift(AI, CI); y0Q = radix4Fft16BitAddShift(AQ, CQ);				// r8
1481 	y2I = radix4Fft16BitSubtractShift(AI, CI); y2Q = radix4Fft16BitSubtractShift(AQ, CQ);		// r4
1482 	y3I = radix4Fft16BitAddShift(BI, DQ); y3Q = radix4Fft16BitSubtractShift(BQ, DI);			// r6
1483 	y1I = radix4Fft16BitSubtractShift(BI, DQ); y1Q = radix4Fft16BitAddShift(BQ, DI);			// r5
1484 #else
1485 	AI = (x0I+x2I)>>1; AQ = (x0Q+x2Q)>>1;
1486 	BI = (x0I-x2I)>>1; BQ = (x0Q-x2Q)>>1;
1487 	CI = (x1I+x3I)>>1; CQ = (x1Q+x3Q)>>1;
1488 	DI = (x1I-x3I)>>1; DQ = (x1Q-x3Q)>>1;
1489 	y0I = (AI+CI)>>1; y0Q = (AQ+CQ)>>1;
1490 	y2I = (AI-CI)>>1; y2Q = (AQ-CQ)>>1;
1491 	y3I = (BI+DQ)>>1; y3Q = (BQ-DI)>>1;
1492 	y1I = (BI-DQ)>>1; y1Q = (BQ+DI)>>1;
1493 #endif
1494 
1495 	storeTemp = (unsigned short)y0Q;
1496 	storeTemp<<=16;
1497 	storeTemp |=(unsigned short)y0I;
1498 	*storePtr++ = storeTemp;
1499 	storeTemp = (unsigned short)y1Q;
1500 	storeTemp<<=16;
1501 	storeTemp |=(unsigned short)y1I;
1502 	*storePtr++ = storeTemp;
1503 	storeTemp = (unsigned short)y2Q;
1504 	storeTemp<<=16;
1505 	storeTemp |=(unsigned short)y2I;
1506 	*storePtr++ = storeTemp;
1507 	storeTemp = (unsigned short)y3Q;
1508 	storeTemp<<=16;
1509 	storeTemp |=(unsigned short)y3I;
1510 	*storePtr++ = storeTemp;
1511 }
1512 
radix4FftStageOne(INT16 * pSrc,INT16 * pDst,int Nfft)1513 void radix4FftStageOne(INT16* pSrc, INT16* pDst, int Nfft){
1514 
1515 	int nn;
1516 	int loopLen;
1517 	INT16 *pSrcLoop, *pDstLoop;
1518 	// bit-reversal permutation
1519 	unsigned int index1;
1520 
1521 	int log2Nfft = myMsb(Nfft);
1522 
1523 	loopLen = Nfft>>2;
1524 	pSrcLoop = pSrc;
1525 	pDstLoop = pDst;
1526 	index1 = 0;
1527 	for(nn=0;nn<loopLen;nn++){
1528 		radix4FftRadix4ButterflyBrev(pSrcLoop, pDstLoop, index1, log2Nfft);
1529 		index1 += 4;
1530 		pDstLoop += 2*4;
1531 	}
1532 }
1533 
radix4IfftStageOne(INT16 * pSrc,INT16 * pDst,int Nfft)1534 void radix4IfftStageOne(INT16* pSrc, INT16* pDst, int Nfft){
1535 
1536 	int nn;
1537 	int loopLen;
1538 	INT16 *pSrcLoop, *pDstLoop;
1539 	// bit-reversal permutation
1540 	unsigned int index1;
1541 
1542 	int log2Nfft = myMsb(Nfft);
1543 
1544 	loopLen = Nfft>>2;
1545 	pSrcLoop = pSrc;
1546 	pDstLoop = pDst;
1547 	index1 = 0;
1548 	for(nn=0;nn<loopLen;nn++){
1549 		radix4IfftRadix4ButterflyBrev(pSrcLoop, pDstLoop, index1, log2Nfft);
1550 		index1 += 4;
1551 		pDstLoop += 2*4;
1552 	}
1553 }
1554 #endif
1555 
1556 #ifdef FFT_STRIDE
radix4IfftRadix4ButterflyBrevStride(INT16 * pSrc,INT16 * pDst,unsigned int index1,int log2Nfft)1557 void radix4IfftRadix4ButterflyBrevStride(INT16* pSrc, INT16* pDst, unsigned int index1, int log2Nfft) {
1558 	INT16 x0I, x0Q, x1I, x1Q, x2I, x2Q, x3I, x3Q;
1559 	INT16 y0I, y0Q, y1I, y1Q, y2I, y2Q, y3I, y3Q;
1560 	INT16 AI, AQ, BI, BQ, CI, CQ, DI, DQ;
1561 
1562 	unsigned int index2;
1563 	unsigned int *loadPtr = (unsigned int*)pSrc;
1564 	unsigned int *storePtr = (unsigned int*)pDst;
1565 	unsigned int loadTemp, storeTemp;
1566 	int bitShift = IDX_LEN - log2Nfft;
1567 
1568 	// re-order due to L^4_2 - because of using radix-2 bit-reversal
1569 	index2 = REV_IDX(index1++);
1570 	index2 >>= bitShift;
1571 	loadTemp = loadPtr[NUM_PARALLEL * index2];
1572 	x0I = (loadTemp & 0xffff); x0Q = (loadTemp >> 16);
1573 
1574 	index2 = REV_IDX(index1++);
1575 	index2 >>= bitShift;
1576 	loadTemp = loadPtr[NUM_PARALLEL * index2];
1577 	x2I = (loadTemp & 0xffff); x2Q = (loadTemp >> 16);
1578 
1579 	index2 = REV_IDX(index1++);
1580 	index2 >>= bitShift;
1581 	loadTemp = loadPtr[NUM_PARALLEL * index2];
1582 	x1I = (loadTemp & 0xffff); x1Q = (loadTemp >> 16);
1583 
1584 	index2 = REV_IDX(index1++);
1585 	index2 >>= bitShift;
1586 	loadTemp = loadPtr[NUM_PARALLEL * index2];
1587 	x3I = (loadTemp & 0xffff); x3Q = (loadTemp >> 16);
1588 
1589 	AI = (x0I + x2I) >> 1; AQ = (x0Q + x2Q) >> 1;
1590 	BI = (x0I - x2I) >> 1; BQ = (x0Q - x2Q) >> 1;
1591 	CI = (x1I + x3I) >> 1; CQ = (x1Q + x3Q) >> 1;
1592 	DI = (x1I - x3I) >> 1; DQ = (x1Q - x3Q) >> 1;
1593 	y0I = (AI + CI) >> 1; y0Q = (AQ + CQ) >> 1;
1594 	y2I = (AI - CI) >> 1; y2Q = (AQ - CQ) >> 1;
1595 	y3I = (BI + DQ) >> 1; y3Q = (BQ - DI) >> 1;
1596 	y1I = (BI - DQ) >> 1; y1Q = (BQ + DI) >> 1;
1597 
1598 	storeTemp = (unsigned short)y0Q;
1599 	storeTemp <<= 16;
1600 	storeTemp |= (unsigned short)y0I;
1601 	*storePtr = storeTemp; storePtr+=NUM_PARALLEL;
1602 	storeTemp = (unsigned short)y1Q;
1603 	storeTemp <<= 16;
1604 	storeTemp |= (unsigned short)y1I;
1605 	*storePtr = storeTemp; storePtr+= NUM_PARALLEL;
1606 	storeTemp = (unsigned short)y2Q;
1607 	storeTemp <<= 16;
1608 	storeTemp |= (unsigned short)y2I;
1609 	*storePtr = storeTemp; storePtr+= NUM_PARALLEL;
1610 	storeTemp = (unsigned short)y3Q;
1611 	storeTemp <<= 16;
1612 	storeTemp |= (unsigned short)y3I;
1613 	*storePtr = storeTemp; storePtr+= NUM_PARALLEL;
1614 }
1615 #endif
1616 
1617 #ifdef FFT_PARALLEL
radix4IfftRadix4ButterflyBrevParallel(INT16 * pSrc,INT16 * pDst,unsigned int index1,int log2Nfft)1618 void radix4IfftRadix4ButterflyBrevParallel(INT16* pSrc, INT16* pDst, unsigned int index1, int log2Nfft) {
1619 
1620 	int qq;
1621 	INT16 x0I[NUM_PARALLEL], x0Q[NUM_PARALLEL], x1I[NUM_PARALLEL], x1Q[NUM_PARALLEL], x2I[NUM_PARALLEL], x2Q[NUM_PARALLEL], x3I[NUM_PARALLEL], x3Q[NUM_PARALLEL];
1622 	INT16 y0I[NUM_PARALLEL], y0Q[NUM_PARALLEL], y1I[NUM_PARALLEL], y1Q[NUM_PARALLEL], y2I[NUM_PARALLEL], y2Q[NUM_PARALLEL], y3I[NUM_PARALLEL], y3Q[NUM_PARALLEL];
1623 	INT16 AI[NUM_PARALLEL], AQ[NUM_PARALLEL], BI[NUM_PARALLEL], BQ[NUM_PARALLEL], CI[NUM_PARALLEL], CQ[NUM_PARALLEL], DI[NUM_PARALLEL], DQ[NUM_PARALLEL];
1624 
1625 	unsigned int index2;
1626 	unsigned int *loadPtr = (unsigned int*)pSrc;
1627 	unsigned int *storePtr = (unsigned int*)pDst;
1628 	unsigned int loadTemp, storeTemp;
1629 	int bitShift = 32 - log2Nfft;
1630 
1631 	// re-order due to L^4_2 - because of using radix-2 bit-reversal
1632 	index2 = REV_IDX(index1++);
1633 	index2 >>= bitShift;
1634 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
1635 		loadTemp = loadPtr[NUM_PARALLEL * index2 + qq];
1636 		x0I[qq] = (loadTemp & 0xffff); x0Q[qq] = (loadTemp >> 16);
1637 	}
1638 	index2 = REV_IDX(index1++);
1639 	index2 >>= bitShift;
1640 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
1641 		loadTemp = loadPtr[NUM_PARALLEL * index2 + qq];
1642 		x2I[qq] = (loadTemp & 0xffff); x2Q[qq] = (loadTemp >> 16);
1643 	}
1644 	index2 = REV_IDX(index1++);
1645 	index2 >>= bitShift;
1646 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
1647 		loadTemp = loadPtr[NUM_PARALLEL * index2 + qq];
1648 		x1I[qq] = (loadTemp & 0xffff); x1Q[qq] = (loadTemp >> 16);
1649 	}
1650 	index2 = REV_IDX(index1++);
1651 	index2 >>= bitShift;
1652 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
1653 		loadTemp = loadPtr[NUM_PARALLEL * index2 + qq];
1654 		x3I[qq] = (loadTemp & 0xffff); x3Q[qq] = (loadTemp >> 16);
1655 	}
1656 
1657 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
1658 		AI[qq] = (x0I[qq] + x2I[qq]) >> 1; AQ[qq] = (x0Q[qq] + x2Q[qq]) >> 1;
1659 		BI[qq] = (x0I[qq] - x2I[qq]) >> 1; BQ[qq] = (x0Q[qq] - x2Q[qq]) >> 1;
1660 		CI[qq] = (x1I[qq] + x3I[qq]) >> 1; CQ[qq] = (x1Q[qq] + x3Q[qq]) >> 1;
1661 		DI[qq] = (x1I[qq] - x3I[qq]) >> 1; DQ[qq] = (x1Q[qq] - x3Q[qq]) >> 1;
1662 	}
1663 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
1664 		y0I[qq] = (AI[qq] + CI[qq]) >> 1; y0Q[qq] = (AQ[qq] + CQ[qq]) >> 1;
1665 		y2I[qq] = (AI[qq] - CI[qq]) >> 1; y2Q[qq] = (AQ[qq] - CQ[qq]) >> 1;
1666 		y3I[qq] = (BI[qq] + DQ[qq]) >> 1; y3Q[qq] = (BQ[qq] - DI[qq]) >> 1;
1667 		y1I[qq] = (BI[qq] - DQ[qq]) >> 1; y1Q[qq] = (BQ[qq] + DI[qq]) >> 1;
1668 	}
1669 
1670 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
1671 		storeTemp = (unsigned short)y0Q[qq];
1672 		storeTemp <<= 16;
1673 		storeTemp |= (unsigned short)y0I[qq];
1674 		*storePtr++ = storeTemp;
1675 	}
1676 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
1677 		storeTemp = (unsigned short)y1Q[qq];
1678 		storeTemp <<= 16;
1679 		storeTemp |= (unsigned short)y1I[qq];
1680 		*storePtr++ = storeTemp;
1681 	}
1682 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
1683 		storeTemp = (unsigned short)y2Q[qq];
1684 		storeTemp <<= 16;
1685 		storeTemp |= (unsigned short)y2I[qq];
1686 		*storePtr++ = storeTemp;
1687 	}
1688 	for (qq = 0;qq<NUM_PARALLEL;qq++) {
1689 		storeTemp = (unsigned short)y3Q[qq];
1690 		storeTemp <<= 16;
1691 		storeTemp |= (unsigned short)y3I[qq];
1692 		*storePtr++ = storeTemp;
1693 	}
1694 }
1695 
radix4IfftStageOneParallel(INT16 * pSrc,INT16 * pDst,int Nfft)1696 void radix4IfftStageOneParallel(INT16* pSrc, INT16* pDst, int Nfft) {
1697 
1698 	int nn;
1699 	int loopLen;
1700 	INT16 *pSrcLoop, *pDstLoop;
1701 	// bit-reversal permutation
1702 	unsigned int index1;
1703 
1704 #if defined(ARM_GCC) || defined(ARM_DS5) || defined(ARM_966)
1705 	int log2Nfft = 31 - __clz(Nfft);
1706 #else
1707 	int log2Nfft = myMsb(Nfft);
1708 #endif
1709 
1710 	loopLen = Nfft >> 2;
1711 	pSrcLoop = pSrc;
1712 	pDstLoop = pDst;
1713 	index1 = 0;
1714 	for (nn = 0;nn<loopLen;nn++) {
1715 		radix4IfftRadix4ButterflyBrevParallel(pSrcLoop, pDstLoop, index1, log2Nfft);
1716 		index1 += 4;
1717 		pDstLoop += 2 * 4 * NUM_PARALLEL;
1718 	}
1719 }
1720 #endif // FFT_PARALLEL
1721 
1722 #ifdef FFT_STRIDE
radix4IfftStageOneStride(INT16 * pSrc,INT16 * pDst,int Nfft)1723 void radix4IfftStageOneStride(INT16* pSrc, INT16* pDst, int Nfft) {
1724 
1725 	int nn;
1726 	int loopLen;
1727 	INT16 *pSrcLoop, *pDstLoop;
1728 	// bit-reversal permutation
1729 	unsigned int index1;
1730 
1731 #if defined(ARM_GCC) || defined(ARM_DS5) || defined(ARM_966)
1732 	int log2Nfft = 31 - __clz(Nfft);
1733 #else
1734 	int log2Nfft = myMsb(Nfft);
1735 #endif
1736 
1737 	loopLen = Nfft >> 2;
1738 	pSrcLoop = pSrc;
1739 	pDstLoop = pDst;
1740 	index1 = 0;
1741 	for (nn = 0;nn<loopLen;nn++) {
1742 		radix4IfftRadix4ButterflyBrevStride(pSrcLoop, pDstLoop, index1, log2Nfft);
1743 		index1 += 4;
1744 		pDstLoop += 2 * 4 * NUM_PARALLEL;
1745 	}
1746 }
1747 #endif
1748 
radix4FftMainStages(INT16 * pSrc,INT16 * pDst,int Nfft,const INT16 * pCoeff,int lenCoeff)1749 void radix4FftMainStages(INT16* pSrc, INT16* pDst, int Nfft, const INT16* pCoeff, int lenCoeff){
1750 
1751 	int loop1, loop2;
1752 #if defined(ARM_GCC) || defined(ARM_DS5) || defined(ARM_966)
1753 	int log2Nfft = 31-__clz(Nfft);
1754 #else
1755 	int log2Nfft = myMsb(Nfft);
1756 #endif
1757 	int log4Nfft = log2Nfft>>1;
1758 	int radix2 = log2Nfft&0x1;
1759 
1760 	INT16 *pSrcLoop, *pDstLoop;
1761 	int coeffStride, coeffStrideTemp;
1762 	int ii, mm, nn;
1763 
1764 	loop1 = Nfft>>2;
1765 	loop2 = 1;
1766 
1767 	// next stages
1768 	coeffStrideTemp = lenCoeff>>2;
1769 	for(ii=1;ii<log4Nfft+radix2-1;ii++){
1770 		loop1 >>=2;
1771 		loop2 <<=2;
1772 		coeffStrideTemp>>=2;
1773 		pSrcLoop = pDst;
1774 		pDstLoop = pDst;
1775 
1776 		coeffStride = 0;
1777 		for(mm=0;mm<loop2;mm++){
1778 			for(nn=loop1;nn>0;nn--){
1779 				radix4FftRadix4ButterflyTwiddle(pSrcLoop, pDstLoop, loop2, pCoeff, coeffStride);
1780 				pSrcLoop += 2*4*loop2;
1781 				pDstLoop += 2*4*loop2;
1782 			}
1783 			pSrcLoop += 2 -2*4*loop2*loop1;
1784 			pDstLoop += 2 -2*4*loop2*loop1;
1785 			coeffStride += coeffStrideTemp; // tabel size is fixed
1786 		}
1787 	}
1788 }
1789 
radix4IfftMainStages(INT16 * pSrc,INT16 * pDst,int Nfft,const INT16 * pCoeff,int lenCoeff)1790 void radix4IfftMainStages(INT16* pSrc, INT16* pDst, int Nfft, const INT16* pCoeff, int lenCoeff){
1791 
1792 	int loop1, loop2;
1793 #if defined(ARM_GCC) || defined(ARM_DS5) || defined(ARM_966)
1794 	int log2Nfft = 31-__clz(Nfft);
1795 #else
1796 	int log2Nfft = myMsb(Nfft);
1797 #endif
1798 	int log4Nfft = log2Nfft>>1;
1799 	int radix2 = log2Nfft&0x1;
1800 
1801 	INT16 *pSrcLoop, *pDstLoop;
1802 	int coeffStride, coeffStrideTemp;
1803 	int ii, mm, nn;
1804 
1805 	loop1 = Nfft>>2;
1806 	loop2 = 1;
1807 
1808 	// next stages
1809 	coeffStrideTemp = lenCoeff>>2;
1810 	for(ii=1;ii<log4Nfft+radix2-1;ii++){
1811 		loop1 >>=2;
1812 		loop2 <<=2;
1813 		coeffStrideTemp>>=2;
1814 		pSrcLoop = pDst;
1815 		pDstLoop = pDst;
1816 
1817 		coeffStride = 0;
1818 		for(mm=0;mm<loop2;mm++){
1819 			for(nn=loop1;nn>0;nn--){
1820 				radix4IfftRadix4ButterflyTwiddle(pSrcLoop, pDstLoop, NUM_PARALLEL*loop2, pCoeff, coeffStride);
1821 				pSrcLoop += NUM_PARALLEL * 2*4*loop2;
1822 				pDstLoop += NUM_PARALLEL * 2*4*loop2;
1823 			}
1824 			pSrcLoop += NUM_PARALLEL * (2 -2*4*loop2*loop1);
1825 			pDstLoop += NUM_PARALLEL * (2 -2*4*loop2*loop1);
1826 			coeffStride += coeffStrideTemp; // tabel size is fixed
1827 		}
1828 	}
1829 }
1830 
1831 #ifdef FFT_PARALLEL
radix4IfftMainStagesParallel(INT16 * pSrc,INT16 * pDst,int Nfft,const INT16 * pCoeff,int lenCoeff)1832 void radix4IfftMainStagesParallel(INT16* pSrc, INT16* pDst, int Nfft, const INT16* pCoeff, int lenCoeff) {
1833 
1834 	int loop1, loop2;
1835 #if defined(ARM_GCC) || defined(ARM_DS5) || defined(ARM_966)
1836 	int log2Nfft = 31 - __clz(Nfft);
1837 #else
1838 	int log2Nfft = myMsb(Nfft);
1839 #endif
1840 	int log4Nfft = log2Nfft >> 1;
1841 	int radix2 = log2Nfft & 0x1;
1842 
1843 	INT16 *pSrcLoop, *pDstLoop;
1844 	int coeffStride, coeffStrideTemp;
1845 	int ii, mm, nn;
1846 
1847 	loop1 = Nfft >> 2;
1848 	loop2 = 1;
1849 
1850 	// next stages
1851 	coeffStrideTemp = lenCoeff >> 2;
1852 	for (ii = 1;ii<log4Nfft + radix2 - 1;ii++) {
1853 		loop1 >>= 2;
1854 		loop2 <<= 2;
1855 		coeffStrideTemp >>= 2;
1856 		pSrcLoop = pDst;
1857 		pDstLoop = pDst;
1858 
1859 		coeffStride = 0;
1860 		for (mm = 0;mm<loop2;mm++) {
1861 			for (nn = loop1;nn>0;nn--) {
1862 				radix4IfftRadix4ButterflyTwiddleParallel(pSrcLoop, pDstLoop, NUM_PARALLEL*loop2, pCoeff, coeffStride);
1863 				pSrcLoop += NUM_PARALLEL * 2 * 4 * loop2;
1864 				pDstLoop += NUM_PARALLEL * 2 * 4 * loop2;
1865 			}
1866 			pSrcLoop += NUM_PARALLEL * (2 - 2 * 4 * loop2*loop1);
1867 			pDstLoop += NUM_PARALLEL * (2 - 2 * 4 * loop2*loop1);
1868 			coeffStride += coeffStrideTemp; // tabel size is fixed
1869 		}
1870 	}
1871 }
1872 #endif
1873 
myBitRev(INT16 * pSrc,int Nfft)1874 void myBitRev(INT16* pSrc, int Nfft){
1875 
1876 	int ii, jj; // , mm
1877 	unsigned int tempVal;
1878 	unsigned int *dataPtr = (unsigned int *)pSrc;
1879 #if defined(ARM_GCC) || defined(ARM_DS5) || defined(ARM_966)
1880 	int log2Nfft = 31-__clz(Nfft);
1881 #else
1882 	int log2Nfft = myMsb(Nfft);
1883 #endif
1884 	int bitShift = IDX_LEN-log2Nfft;
1885 
1886 	//jj = 0;
1887 	for(ii=0;ii<Nfft;ii++){
1888 		jj = REV_IDX(ii)>>bitShift;
1889 		if(jj > ii){
1890 			tempVal = dataPtr[jj];
1891 			dataPtr[jj] = dataPtr[ii];
1892 			dataPtr[ii] = tempVal;
1893 		}
1894 	}
1895 }
1896 
radix2IfftMainStages(INT16 * pBfr,int Nfft,const INT16 * pCoeff,int lenCoeff)1897 void radix2IfftMainStages(INT16* pBfr, int Nfft, const INT16* pCoeff, int lenCoeff){
1898 
1899 	int loop1, loop2;
1900 #if defined(ARM_GCC) || defined(ARM_DS5) || defined(ARM_966)
1901 	int log2Nfft = 31-__clz(Nfft);
1902 #else
1903 	int log2Nfft = myMsb(Nfft);
1904 #endif
1905 
1906 	INT16 *pSrcLoop;
1907 	int coeffStride, coeffStrideTemp;
1908 	int ii, mm, nn;
1909 
1910 	loop1 = Nfft>>1;
1911 	loop2 = 1;
1912 
1913 	// next stages
1914 	coeffStrideTemp = lenCoeff>>1;
1915 	for(ii=0;ii<log2Nfft;ii++){
1916 		pSrcLoop = pBfr;
1917 
1918 		coeffStride = 0;
1919 		for(mm=0;mm<loop2;mm++){
1920 			for(nn=loop1;nn>0;nn--){
1921 				radix4IfftRadix2ButterflyTwiddle(pSrcLoop, pSrcLoop, loop2, pCoeff, coeffStride);
1922 				pSrcLoop += 2*2*loop2;
1923 			}
1924 			pSrcLoop += 2 -2*2*loop2*loop1;
1925 			coeffStride += coeffStrideTemp; // tabel size is fixed
1926 		}
1927 		loop1 >>=1;
1928 		loop2 <<=1;
1929 		coeffStrideTemp>>=1;
1930 	}
1931 }
1932 
radix4FftLastStage(INT16 * pSrc,INT16 * pDst,int Nfft,const INT16 * pCoeff,int lenCoeff)1933 void radix4FftLastStage(INT16* pSrc, INT16* pDst, int Nfft, const INT16* pCoeff, int lenCoeff){
1934 
1935 	int mm, loopLen, coeffStride;
1936 #if defined(ARM_GCC) || defined(ARM_DS5) || defined(ARM_966)
1937 	int log2Nfft = 31-__clz(Nfft);
1938 #else
1939 	int log2Nfft = myMsb(Nfft);
1940 #endif
1941 	int log4Nfft = log2Nfft>>1;
1942 	int radix2 = log2Nfft&0x1;
1943 	int coeffStrideTemp = lenCoeff>>(2*log4Nfft+radix2);
1944 	INT16 *pSrcLoop = pDst;
1945 	INT16 *pDstLoop = pDst;
1946 
1947 	if(radix2){
1948 		loopLen = Nfft>>1;
1949 
1950 		coeffStride = 0;
1951 		for(mm=loopLen;mm>0;mm--){
1952 			radix4FftRadix2ButterflyTwiddle(pSrcLoop, pDstLoop, loopLen, pCoeff, coeffStride);
1953 			pSrcLoop += 2;
1954 			pDstLoop += 2;
1955 			coeffStride += coeffStrideTemp;
1956 		}
1957 	}
1958 	else{ // last iteration for even power of two
1959 		loopLen = Nfft>>2;
1960 
1961 		coeffStride = 0;
1962 		for(mm=loopLen;mm>0;mm--){
1963 			radix4FftRadix4ButterflyTwiddle(pSrcLoop, pDstLoop, loopLen, pCoeff, coeffStride);
1964 			pSrcLoop += 2;
1965 			pDstLoop += 2;
1966 			coeffStride += coeffStrideTemp;
1967 		}
1968 	}
1969 }
1970 
radix4IfftLastStage(INT16 * pSrc,INT16 * pDst,int Nfft,const INT16 * pCoeff,int lenCoeff)1971 void radix4IfftLastStage(INT16* pSrc, INT16* pDst, int Nfft, const INT16* pCoeff, int lenCoeff){
1972 
1973 	int mm, loopLen, coeffStride;
1974 #if defined(ARM_GCC) || defined(ARM_DS5) || defined(ARM_966)
1975 	int log2Nfft = 31-__clz(Nfft);
1976 #else
1977 	int log2Nfft = myMsb(Nfft);
1978 #endif
1979 	int log4Nfft = log2Nfft>>1;
1980 	int radix2 = log2Nfft&0x1;
1981 	int coeffStrideTemp = lenCoeff>>(2*log4Nfft+radix2);
1982 	INT16 *pSrcLoop = pDst;
1983 	INT16 *pDstLoop = pDst;
1984 
1985 	if(radix2){
1986 		loopLen = Nfft>>1;
1987 
1988 		coeffStride = 0;
1989 		for(mm=loopLen;mm>0;mm--){
1990 			radix4IfftRadix2ButterflyTwiddle(pSrcLoop, pDstLoop, NUM_PARALLEL*loopLen, pCoeff, coeffStride);
1991 			pSrcLoop += 2 * NUM_PARALLEL;
1992 			pDstLoop += 2 * NUM_PARALLEL;
1993 			coeffStride += coeffStrideTemp;
1994 		}
1995 	}
1996 	else{ // last iteration for even power of two
1997 		loopLen = Nfft>>2;
1998 
1999 		coeffStride = 0;
2000 		for(mm=loopLen;mm>0;mm--){
2001 			radix4IfftRadix4ButterflyTwiddle(pSrcLoop, pDstLoop, NUM_PARALLEL*loopLen, pCoeff, coeffStride);
2002 			pSrcLoop += 2 * NUM_PARALLEL;
2003 			pDstLoop += 2 * NUM_PARALLEL;
2004 			coeffStride += coeffStrideTemp;
2005 		}
2006 	}
2007 }
2008 
2009 #ifdef FFT_PARALLEL
radix4IfftLastStageParallel(INT16 * pSrc,INT16 * pDst,int Nfft,const INT16 * pCoeff,int lenCoeff)2010 void radix4IfftLastStageParallel(INT16* pSrc, INT16* pDst, int Nfft, const INT16* pCoeff, int lenCoeff) {
2011 
2012 	int mm, loopLen, coeffStride;
2013 #if defined(ARM_GCC) || defined(ARM_DS5) || defined(ARM_966)
2014 	int log2Nfft = 31 - __clz(Nfft);
2015 #else
2016 	int log2Nfft = myMsb(Nfft);
2017 #endif
2018 	int log4Nfft = log2Nfft >> 1;
2019 	int radix2 = log2Nfft & 0x1;
2020 	int coeffStrideTemp = lenCoeff >> (2 * log4Nfft + radix2);
2021 	INT16 *pSrcLoop, *pDstLoop;
2022 
2023 	pSrcLoop = pDst;
2024 	pDstLoop = pDst;
2025 
2026 	if (radix2) {
2027 		loopLen = Nfft >> 1;
2028 
2029 		coeffStride = 0;
2030 		for (mm = loopLen;mm>0;mm--) {
2031 			radix4IfftRadix2ButterflyTwiddleParallel(pSrcLoop, pDstLoop, NUM_PARALLEL*loopLen, pCoeff, coeffStride);
2032 			pSrcLoop += 2 * NUM_PARALLEL;
2033 			pDstLoop += 2 * NUM_PARALLEL;
2034 			coeffStride += coeffStrideTemp;
2035 		}
2036 	}
2037 	else { // last iteration for even power of two
2038 		loopLen = Nfft >> 2;
2039 
2040 		coeffStride = 0;
2041 		for (mm = loopLen;mm>0;mm--) {
2042 			radix4IfftRadix4ButterflyTwiddleParallel(pSrcLoop, pDstLoop, NUM_PARALLEL*loopLen, pCoeff, coeffStride);
2043 			pSrcLoop += 2 * NUM_PARALLEL;
2044 			pDstLoop += 2 * NUM_PARALLEL;
2045 			coeffStride += coeffStrideTemp;
2046 		}
2047 	}
2048 }
2049 #endif
2050 
2051 // only uses two buffers, out-of-place in first stage (includes bit-reveral), then in-place
radix4Fft(INT16 * pSrc,INT16 * pDst,int Nfft,const INT16 * pCoeff,int lenCoeff)2052 void radix4Fft(INT16* pSrc, INT16* pDst, int Nfft, const INT16* pCoeff, int lenCoeff){
2053 
2054 	radix4FftStageOne(pSrc, pDst, Nfft);
2055 
2056 	radix4FftMainStages(pSrc, pDst, Nfft, pCoeff, lenCoeff);
2057 
2058 	radix4FftLastStage(pSrc, pDst, Nfft, pCoeff, lenCoeff);
2059 }
2060 
2061 // same as FFT, inverse sign, scale by 2 to number of stages
radix4Ifft(INT16 * pSrc,INT16 * pDst,int Nfft,const INT16 * pCoeff,int lenCoeff)2062 void radix4Ifft(INT16* pSrc, INT16* pDst, int Nfft, const INT16* pCoeff, int lenCoeff){
2063 
2064 	radix4IfftStageOne(pSrc, pDst, Nfft);
2065 
2066 	radix4IfftMainStages(pSrc, pDst, Nfft, pCoeff, lenCoeff);
2067 
2068 	radix4IfftLastStage(pSrc, pDst, Nfft, pCoeff, lenCoeff);
2069 }
2070 
2071 #ifdef FFT_PARALLEL
radix4IfftParallel(INT16 * pSrc,INT16 * pDst,int Nfft,const INT16 * pCoeff,int lenCoeff)2072 void radix4IfftParallel(INT16* pSrc, INT16* pDst, int Nfft, const INT16* pCoeff, int lenCoeff) {
2073 
2074 	radix4IfftStageOneParallel(pSrc, pDst, Nfft);
2075 
2076 	radix4IfftMainStagesParallel(pSrc, pDst, Nfft, pCoeff, lenCoeff);
2077 
2078 	radix4IfftLastStageParallel(pSrc, pDst, Nfft, pCoeff, lenCoeff);
2079 }
2080 #endif
2081 
2082 #ifdef FFT_STRIDE
radix4IfftStride(INT16 * pSrc,INT16 * pDst,int Nfft,const INT16 * pCoeff,int lenCoeff)2083 void radix4IfftStride(INT16* pSrc, INT16* pDst, int Nfft, const INT16* pCoeff, int lenCoeff) {
2084 
2085 	radix4IfftStageOneStride(pSrc, pDst, Nfft);
2086 
2087 	radix4IfftMainStages(pSrc, pDst, Nfft, pCoeff, lenCoeff);
2088 
2089 	radix4IfftLastStage(pSrc, pDst, Nfft, pCoeff, lenCoeff);
2090 }
2091 #endif
2092 
2093 #define FFT_SCALE
radix2Ifft(INT16 * pBfr,int Nfft,const INT16 * pCoeff,int lenCoeff)2094 void radix2Ifft(INT16* pBfr, int Nfft, const INT16* pCoeff, int lenCoeff){
2095 
2096 	int ii, jj, mm, nn;
2097 	int loop1, loop2, coeffStride;
2098 
2099 	INT16 x1I, x1Q, W1I, W1Q;
2100 	INT16 z0I, z0Q, z1I, z1Q;
2101 	INT16 y0I, y0Q, y1I, y1Q;
2102 
2103 	unsigned int loadCoeff;
2104 	unsigned int *coeffPtr;
2105 	unsigned int loadTemp, storeTemp;
2106 	unsigned int *loopPtr;
2107 	unsigned int tempVal0, tempVal1;
2108 	unsigned int *dataPtr = (unsigned int *)pBfr;
2109 
2110 #if defined(ARM_GCC) || defined(ARM_DS5) || defined(ARM_966)
2111 	int log2Nfft = 31-__clz(Nfft);
2112 #else
2113 	int log2Nfft = myMsb(Nfft);
2114 #endif
2115 	int bitShift = IDX_LEN-log2Nfft;
2116 
2117 	// bit-reversal permutation
2118 	for(ii=0;ii<Nfft;ii++){
2119 		jj = REV_IDX(ii)>>bitShift;
2120 		if(jj > ii){ // swap [ii] for [jj]
2121 			tempVal0 = dataPtr[jj];
2122 			tempVal1 = dataPtr[ii];
2123 			dataPtr[ii] = tempVal0;
2124 			dataPtr[jj] = tempVal1;
2125 		}
2126 	}
2127 
2128 	loop1 = Nfft>>1;
2129 	loop2 = 1;
2130 
2131 	// radix-2 stages
2132 	coeffStride = lenCoeff>>1;
2133 	for(ii=0;ii<log2Nfft;ii++){
2134 		loopPtr = (unsigned int *)pBfr;
2135 		coeffPtr = (unsigned int *)pCoeff;
2136 
2137 		for(mm=0;mm<loop2;mm++){
2138 
2139 			loadCoeff = *coeffPtr; coeffPtr += coeffStride;
2140 			W1I = (loadCoeff&0xffff); W1Q = (loadCoeff>>16);
2141 			for(nn=loop1;nn>0;nn--){
2142 				loadTemp = loopPtr[0];
2143 				z0I = (loadTemp&0xffff); z0Q = (loadTemp>>16);
2144 				loadTemp = loopPtr[loop2];
2145 				x1I = (loadTemp&0xffff); x1Q = (loadTemp>>16);
2146 #ifdef ARM_DEBUG
2147 				z1I = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulatorNeg( radix4Fft16BitTo32BitMultiplier(W1I, x1I), radix4Fft16BitTo32BitMultiplier(W1Q, x1Q))); // r6
2148 				z1Q = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulator( radix4Fft16BitTo32BitMultiplier(W1I, x1Q), radix4Fft16BitTo32BitMultiplier(W1Q, x1I)));
2149 
2150 				y0I = radix4Fft16BitAddShift(z0I, z1I); y0Q = radix4Fft16BitAddShift(z0Q, z1Q);
2151 				y1I = radix4Fft16BitSubtractShift(z0I, z1I); y1Q = radix4Fft16BitSubtractShift(z0Q, z1Q);
2152 #else
2153 				z1I = ( (((INT32)W1I*x1I)-((INT32)W1Q*x1Q))>>15 );
2154 				z1Q = ( (((INT32)W1I*x1Q)+((INT32)W1Q*x1I))>>15 );
2155 #ifdef FFT_SCALE
2156 				y0I = (z0I+z1I)>>1; y0Q = (z0Q+z1Q)>>1;
2157 				y1I = (z0I-z1I)>>1; y1Q = (z0Q-z1Q)>>1;
2158 #else
2159 				y0I = (z0I+z1I); y0Q = (z0Q+z1Q);
2160 				y1I = (z0I-z1I); y1Q = (z0Q-z1Q);
2161 #endif
2162 #endif
2163 				storeTemp = (unsigned short)y0Q;
2164 				storeTemp<<=16;
2165 				storeTemp |=(unsigned short)y0I;
2166 				*loopPtr = storeTemp; loopPtr+=loop2;
2167 				storeTemp = (unsigned short)y1Q;
2168 				storeTemp<<=16;
2169 				storeTemp |=(unsigned short)y1I;
2170 				*loopPtr = storeTemp; loopPtr+=loop2;
2171 
2172 			}
2173 			loopPtr += 1 - 2*loop2*loop1;
2174 		}
2175 		loop1 >>=1;
2176 		loop2 <<=1;
2177 		coeffStride>>=1;
2178 	}
2179 }
2180 
2181 const float twiddleTableFlt[2 * MAX_FFT_FLT] = {
2182 	1.00000000f,       0.00000000f,      0.995184720f,     0.0980171412f,      0.980785251f,      0.195090324f,      0.956940353f,      0.290284663f,      0.923879504f,      0.382683456f,      0.881921232f,      0.471396744f,
2183 	0.831469595f,      0.555570245f,      0.773010433f,      0.634393334f,      0.707106769f,      0.707106769f,      0.634393275f,      0.773010433f,      0.555570185f,      0.831469655f,      0.471396655f,      0.881921291f,
2184 	0.382683426f,      0.923879504f,      0.290284634f,      0.956940353f,      0.195090234f,      0.980785310f,     0.0980171338f,      0.995184720f,  -4.37113883e-08f,       1.00000000f,    -0.0980172232f,      0.995184720f,
2185 	-0.195090324f,      0.980785251f,     -0.290284723f,      0.956940293f,     -0.382683516f,      0.923879504f,     -0.471396834f,      0.881921232f,     -0.555570364f,      0.831469536f,     -0.634393275f,      0.773010492f,
2186 	-0.707106769f,      0.707106769f,     -0.773010492f,      0.634393275f,     -0.831469655f,      0.555570185f,     -0.881921351f,      0.471396625f,     -0.923879623f,      0.382683277f,     -0.956940353f,      0.290284723f,
2187 	-0.980785310f,      0.195090309f,     -0.995184720f,     0.0980170965f,      -1.00000000f,  -8.74227766e-08f,     -0.995184720f,    -0.0980172679f,     -0.980785251f,     -0.195090488f,     -0.956940293f,     -0.290284872f,
2188 	-0.923879504f,     -0.382683426f,     -0.881921232f,     -0.471396774f,     -0.831469536f,     -0.555570304f,     -0.773010373f,     -0.634393394f,     -0.707106650f,     -0.707106888f,     -0.634393334f,     -0.773010433f,
2189 	-0.555570006f,     -0.831469774f,     -0.471396685f,     -0.881921291f,     -0.382683128f,     -0.923879683f,     -0.290284544f,     -0.956940353f,     -0.195090383f,     -0.980785251f,    -0.0980169326f,     -0.995184720f,
2190 	1.19248806e-08f,      -1.00000000f,     0.0980174318f,     -0.995184720f,      0.195090413f,     -0.980785251f,      0.290285021f,     -0.956940234f,      0.382683605f,     -0.923879445f,      0.471396714f,     -0.881921291f,
2191 	0.555570424f,     -0.831469476f,      0.634393334f,     -0.773010433f,      0.707107008f,     -0.707106531f,      0.773010552f,     -0.634393156f,      0.831469595f,     -0.555570304f,      0.881921351f,     -0.471396536f,
2192 	0.923879564f,     -0.382683426f,      0.956940413f,     -0.290284395f,      0.980785310f,     -0.195090234f,      0.995184779f,    -0.0980167687f
2193 };
2194 
2195 
radix2FftFlt(float * pBfr,int Nfft,const float * pCoeff,int lenCoeff)2196 void radix2FftFlt(float* pBfr, int Nfft, const float* pCoeff, int lenCoeff) {
2197 
2198 	int ii, jj, mm, nn;
2199 	int loop1, loop2, coeffStride;
2200 
2201 	float x1I, x1Q, W1I, W1Q;
2202 	float z0I, z0Q, z1I, z1Q;
2203 	float y0I, y0Q, y1I, y1Q;
2204 
2205 	const float *coeffPtr;
2206 	float *loopPtr;
2207 	unsigned long long tempVal0, tempVal1;
2208 	unsigned long long *dataPtr = (unsigned long long *)pBfr;
2209 
2210 #if defined(ARM_GCC) || defined(ARM_DS5) || defined(ARM_966)
2211 	int log2Nfft = 31 - __clz(Nfft);
2212 #else
2213 	int log2Nfft = myMsb(Nfft);
2214 #endif
2215 	int bitShift = IDX_LEN - log2Nfft;
2216 
2217 	// bit-reversal permutation
2218 	for (ii = 0;ii<Nfft;ii++) {
2219 		jj = REV_IDX(ii) >> bitShift;
2220 		if (jj > ii) { // swap [ii] for [jj]
2221 			tempVal0 = dataPtr[jj];
2222 			tempVal1 = dataPtr[ii];
2223 			dataPtr[ii] = tempVal0;
2224 			dataPtr[jj] = tempVal1;
2225 		}
2226 	}
2227 
2228 	loop1 = Nfft >> 1;
2229 	loop2 = 1;
2230 
2231 	// radix-2 stages
2232 	coeffStride = lenCoeff >> 1;
2233 	for (ii = 0;ii<log2Nfft;ii++) {
2234 		loopPtr = pBfr;
2235 		coeffPtr = pCoeff;
2236 
2237 		for (mm = 0;mm<loop2;mm++) {
2238 
2239 			W1I = coeffPtr[0]; // cosf(2 * PI * mm * coeffStride / MAX_FFT_FLT); //
2240 			W1Q = coeffPtr[1]; // sinf(2 * PI * mm * coeffStride / MAX_FFT_FLT); //
2241 			coeffPtr += 2 * coeffStride;
2242 			for (nn = loop1;nn>0;nn--) {
2243 				z0I = loopPtr[0];
2244 				z0Q = loopPtr[1];
2245 				x1I = loopPtr[2 * loop2];
2246 				x1Q = loopPtr[2 * loop2 + 1];
2247 
2248 				z1I = ((W1I*x1I) + (W1Q*x1Q));
2249 				z1Q = ((W1I*x1Q) - (W1Q*x1I));
2250 
2251 				y0I = (z0I + z1I); y0Q = (z0Q + z1Q);
2252 				y1I = (z0I - z1I); y1Q = (z0Q - z1Q);
2253 
2254 				loopPtr[0] = y0I;
2255 				loopPtr[1] = y0Q;
2256 				loopPtr += 2 * loop2;
2257 				loopPtr[0] = y1I;
2258 				loopPtr[1] = y1Q;
2259 				loopPtr += 2 * loop2;
2260 			}
2261 			loopPtr += 2 - 4 * loop2*loop1;
2262 		}
2263 		loop1 >>= 1;
2264 		loop2 <<= 1;
2265 		coeffStride >>= 1;
2266 	}
2267 }
2268 
radix2IfftFlt(float * pBfr,int Nfft,const float * pCoeff,int lenCoeff)2269 void radix2IfftFlt(float* pBfr, int Nfft, const float* pCoeff, int lenCoeff) {
2270 
2271 	int ii, jj, mm, nn;
2272 	int loop1, loop2, coeffStride;
2273 
2274 	float x1I, x1Q, W1I, W1Q;
2275 	float z0I, z0Q, z1I, z1Q;
2276 	float y0I, y0Q, y1I, y1Q;
2277 
2278 	const float *coeffPtr;
2279 	float *loopPtr;
2280 	unsigned long long tempVal0, tempVal1;
2281 	unsigned long long *dataPtr = (unsigned long long *)pBfr;
2282 
2283 #if defined(ARM_GCC) || defined(ARM_DS5) || defined(ARM_966)
2284 	int log2Nfft = 31 - __clz(Nfft);
2285 #else
2286 	int log2Nfft = myMsb(Nfft);
2287 #endif
2288 	int bitShift = IDX_LEN - log2Nfft;
2289 
2290 	// bit-reversal permutation
2291 	for (ii = 0;ii<Nfft;ii++) {
2292 		jj = REV_IDX(ii) >> bitShift;
2293 		if (jj > ii) { // swap [ii] for [jj]
2294 			tempVal0 = dataPtr[jj];
2295 			tempVal1 = dataPtr[ii];
2296 			dataPtr[ii] = tempVal0;
2297 			dataPtr[jj] = tempVal1;
2298 		}
2299 	}
2300 
2301 	loop1 = Nfft >> 1;
2302 	loop2 = 1;
2303 
2304 	// radix-2 stages
2305 	coeffStride = lenCoeff >> 1;
2306 	for (ii = 0;ii<log2Nfft;ii++) {
2307 		loopPtr = pBfr;
2308 		coeffPtr = pCoeff;
2309 
2310 		for (mm = 0;mm<loop2;mm++) {
2311 
2312 			W1I = coeffPtr[0]; // cosf(2 * PI * mm * coeffStride / MAX_FFT_FLT); //
2313 			W1Q = coeffPtr[1]; // sinf(2 * PI * mm * coeffStride / MAX_FFT_FLT); //
2314 			coeffPtr += 2*coeffStride;
2315 			for (nn = loop1;nn>0;nn--) {
2316 				z0I = loopPtr[0];
2317 				z0Q = loopPtr[1];
2318 				x1I = loopPtr[2 * loop2];
2319 				x1Q = loopPtr[2 * loop2 + 1];
2320 
2321 				z1I = ((W1I*x1I) - (W1Q*x1Q));
2322 				z1Q = ((W1I*x1Q) + (W1Q*x1I));
2323 #ifdef FFT_SCALE
2324 				y0I = (z0I + z1I)/2; y0Q = (z0Q + z1Q)/2;
2325 				y1I = (z0I - z1I)/2; y1Q = (z0Q - z1Q)/2;
2326 #else
2327 				y0I = (z0I + z1I); y0Q = (z0Q + z1Q);
2328 				y1I = (z0I - z1I); y1Q = (z0Q - z1Q);
2329 #endif
2330 				loopPtr[0] = y0I;
2331 				loopPtr[1] = y0Q;
2332 				loopPtr += 2*loop2;
2333 				loopPtr[0] = y1I;
2334 				loopPtr[1] = y1Q;
2335 				loopPtr += 2*loop2;
2336 			}
2337 			loopPtr += 2 - 4 * loop2*loop1;
2338 		}
2339 		loop1 >>= 1;
2340 		loop2 <<= 1;
2341 		coeffStride >>= 1;
2342 	}
2343 }
2344 
2345 #ifdef FFT_STRIDE
radix2IfftStride(INT16 * pBfr,int Nfft,const INT16 * pCoeff,int lenCoeff)2346 void radix2IfftStride(INT16* pBfr, int Nfft, const INT16* pCoeff, int lenCoeff) {
2347 
2348 	int ii, jj, mm, nn;
2349 	int loop1, loop2, coeffStride;
2350 
2351 	INT16 x1I, x1Q, W1I, W1Q;
2352 	INT16 z0I, z0Q, z1I, z1Q;
2353 	INT16 y0I, y0Q, y1I, y1Q;
2354 
2355 	unsigned int loadCoeff;
2356 	unsigned int *coeffPtr;
2357 	unsigned int loadTemp, storeTemp;
2358 	unsigned int *loopPtr;
2359 	unsigned int tempVal0, tempVal1;
2360 	unsigned int *dataPtr = (unsigned int *)pBfr;
2361 
2362 #if defined(ARM_GCC) || defined(ARM_DS5) || defined(ARM_966)
2363 	int log2Nfft = 31 - __clz(Nfft);
2364 #else
2365 	int log2Nfft = myMsb(Nfft);
2366 #endif
2367 	int bitShift = IDX_LEN - log2Nfft;
2368 
2369 	// bit-reversal permutation
2370 	for (ii = 0;ii<Nfft;ii++) {
2371 		jj = REV_IDX(ii) >> bitShift;
2372 		if (jj > ii) { // swap [ii] for [jj]
2373 			tempVal0 = dataPtr[NUM_PARALLEL*jj];
2374 			tempVal1 = dataPtr[NUM_PARALLEL*ii];
2375 			dataPtr[NUM_PARALLEL*ii] = tempVal0;
2376 			dataPtr[NUM_PARALLEL*jj] = tempVal1;
2377 		}
2378 	}
2379 
2380 	loop1 = Nfft >> 1;
2381 	loop2 = 1;
2382 
2383 	// radix-2 stages
2384 	coeffStride = lenCoeff >> 1;
2385 	for (ii = 0;ii<log2Nfft;ii++) {
2386 		loopPtr = (unsigned int *)pBfr;
2387 		coeffPtr = (unsigned int *)pCoeff;
2388 
2389 		for (mm = 0;mm<loop2;mm++) {
2390 
2391 			loadCoeff = *coeffPtr; coeffPtr += coeffStride;
2392 			W1I = (loadCoeff & 0xffff); W1Q = (loadCoeff >> 16);
2393 			for (nn = loop1;nn>0;nn--) {
2394 				loadTemp = loopPtr[0];
2395 				z0I = (loadTemp & 0xffff); z0Q = (loadTemp >> 16);
2396 				loadTemp = loopPtr[NUM_PARALLEL*loop2];
2397 				x1I = (loadTemp & 0xffff); x1Q = (loadTemp >> 16);
2398 #ifdef ARM_DEBUG
2399 				z1I = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulatorNeg(radix4Fft16BitTo32BitMultiplier(W1I, x1I), radix4Fft16BitTo32BitMultiplier(W1Q, x1Q))); // r6
2400 				z1Q = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulator(radix4Fft16BitTo32BitMultiplier(W1I, x1Q), radix4Fft16BitTo32BitMultiplier(W1Q, x1I)));
2401 
2402 				y0I = radix4Fft16BitAddShift(z0I, z1I); y0Q = radix4Fft16BitAddShift(z0Q, z1Q);
2403 				y1I = radix4Fft16BitSubtractShift(z0I, z1I); y1Q = radix4Fft16BitSubtractShift(z0Q, z1Q);
2404 #else
2405 				z1I = ((((INT32)W1I*x1I) - ((INT32)W1Q*x1Q)) >> 15);
2406 				z1Q = ((((INT32)W1I*x1Q) + ((INT32)W1Q*x1I)) >> 15);
2407 #ifdef FFT_SCALE
2408 				y0I = (z0I + z1I) >> 1; y0Q = (z0Q + z1Q) >> 1;
2409 				y1I = (z0I - z1I) >> 1; y1Q = (z0Q - z1Q) >> 1;
2410 #else
2411 				y0I = (z0I + z1I); y0Q = (z0Q + z1Q);
2412 				y1I = (z0I - z1I); y1Q = (z0Q - z1Q);
2413 #endif
2414 #endif
2415 				storeTemp = (unsigned short)y0Q;
2416 				storeTemp <<= 16;
2417 				storeTemp |= (unsigned short)y0I;
2418 				*loopPtr = storeTemp; loopPtr += NUM_PARALLEL*loop2;
2419 				storeTemp = (unsigned short)y1Q;
2420 				storeTemp <<= 16;
2421 				storeTemp |= (unsigned short)y1I;
2422 				*loopPtr = storeTemp; loopPtr += NUM_PARALLEL*loop2;
2423 
2424 			}
2425 			loopPtr += NUM_PARALLEL * (1 - 2 * loop2*loop1);
2426 		}
2427 		loop1 >>= 1;
2428 		loop2 <<= 1;
2429 		coeffStride >>= 1;
2430 	}
2431 }
2432 #endif
2433 
2434 #ifdef FFT_PARALLEL
radix2IfftParallel(INT16 * pBfr,int Nfft,const INT16 * pCoeff,int lenCoeff)2435 void radix2IfftParallel(INT16* pBfr, int Nfft, const INT16* pCoeff, int lenCoeff) {
2436 
2437 	int ii, jj, qq, mm, nn;
2438 	int loop1, loop2, coeffStride;
2439 
2440 	INT16 x1I, x1Q, W1I, W1Q;
2441 	INT16 z0I, z0Q, z1I, z1Q;
2442 	INT16 y0I, y0Q, y1I, y1Q;
2443 
2444 	unsigned int loadCoeff;
2445 	unsigned int *coeffPtr;
2446 	unsigned int loadTemp, storeTemp;
2447 	unsigned int *loopPtr;
2448 	unsigned int tempVal0, tempVal1;
2449 	unsigned int *dataPtr = (unsigned int *)pBfr;
2450 
2451 #if defined(ARM_GCC) || defined(ARM_DS5) || defined(ARM_966)
2452 	int log2Nfft = 31 - __clz(Nfft);
2453 #else
2454 	int log2Nfft = myMsb(Nfft);
2455 #endif
2456 	int bitShift = IDX_LEN - log2Nfft;
2457 
2458 	// bit-reversal permutation
2459 	for (ii = 0;ii<Nfft;ii++) {
2460 		jj = REV_IDX(ii) >> bitShift;
2461 		if (jj > ii) { // swap [ii] for [jj]
2462 			for (qq = 0;qq < NUM_PARALLEL;qq++) {
2463 				tempVal0 = dataPtr[NUM_PARALLEL*jj + qq];
2464 				tempVal1 = dataPtr[NUM_PARALLEL*ii + qq];
2465 				dataPtr[NUM_PARALLEL*ii + qq] = tempVal0;
2466 				dataPtr[NUM_PARALLEL*jj + qq] = tempVal1;
2467 			}
2468 		}
2469 	}
2470 
2471 	loop1 = Nfft >> 1;
2472 	loop2 = 1;
2473 
2474 	// radix-2 stages
2475 	coeffStride = lenCoeff >> 1;
2476 	for (ii = 0;ii<log2Nfft;ii++) {
2477 		loopPtr = (unsigned int *)pBfr;
2478 		coeffPtr = (unsigned int *)pCoeff;
2479 
2480 		for (mm = 0;mm<loop2;mm++) {
2481 
2482 			loadCoeff = *coeffPtr; coeffPtr += coeffStride;
2483 			W1I = (loadCoeff & 0xffff); W1Q = (loadCoeff >> 16);
2484 			for (nn = loop1;nn>0;nn--) {
2485 				for (qq = 0;qq < NUM_PARALLEL;qq++) {
2486 					loadTemp = loopPtr[qq];
2487 					z0I = (loadTemp & 0xffff); z0Q = (loadTemp >> 16);
2488 					loadTemp = loopPtr[NUM_PARALLEL*loop2 + qq];
2489 					x1I = (loadTemp & 0xffff); x1Q = (loadTemp >> 16);
2490 
2491 					z1I = ((((INT32)W1I*x1I) - ((INT32)W1Q*x1Q)) >> 15);
2492 					z1Q = ((((INT32)W1I*x1Q) + ((INT32)W1Q*x1I)) >> 15);
2493 					y0I = (z0I + z1I) >> 1; y0Q = (z0Q + z1Q) >> 1;
2494 					y1I = (z0I - z1I) >> 1; y1Q = (z0Q - z1Q) >> 1;
2495 
2496 					storeTemp = (unsigned short)y0Q;
2497 					storeTemp <<= 16;
2498 					storeTemp |= (unsigned short)y0I;
2499 					loopPtr[qq] = storeTemp;
2500 					storeTemp = (unsigned short)y1Q;
2501 					storeTemp <<= 16;
2502 					storeTemp |= (unsigned short)y1I;
2503 					loopPtr[NUM_PARALLEL*loop2 + qq] = storeTemp;
2504 				}
2505 				loopPtr += 2*NUM_PARALLEL*loop2;
2506 			}
2507 			loopPtr += NUM_PARALLEL * (1 - 2 * loop2*loop1);
2508 		}
2509 		loop1 >>= 1;
2510 		loop2 <<= 1;
2511 		coeffStride >>= 1;
2512 	}
2513 }
2514 #endif
2515 
2516 // size 64 FFT with only four non-zero inputs, pruned down
radix4Fft4in64(unsigned int * loadPtr,unsigned int * fftOutBfr,const INT16 * pCoeff,int lenCoeff)2517 void radix4Fft4in64(unsigned int *loadPtr, unsigned int *fftOutBfr, const INT16* pCoeff, int lenCoeff){
2518 
2519 	//int Nfft = 64;
2520 
2521 	int mm, coeffStride = 0;
2522 	int coeffStrideTemp = lenCoeff>>(2*3);
2523 	unsigned short *pDst = (unsigned short*)fftOutBfr;
2524 #if defined(ARM_GCC) || defined(ARM_DS5)
2525 	int coeffStrideDw;
2526 	//int coeffStrideTemp = lenCoeff>>3;
2527 	unsigned int z0 = loadPtr[0];
2528 	unsigned int x1 = loadPtr[1];
2529 	unsigned int x2 = loadPtr[2];
2530 	unsigned int x3 = loadPtr[3];
2531 #ifdef ARM_DS5
2532 	INT16*  pCoeffTemp;
2533 	int reg5, reg6, reg7, reg8, reg9;
2534 #endif
2535 #else
2536 	INT16 *pSrc = (INT16*)loadPtr;
2537 	INT16 x1I, x1Q, x2I, x2Q, x3I, x3Q; //  x0I, x0Q,
2538 	INT16 z0I, z0Q, z1I, z1Q, z2I, z2Q, z3I, z3Q;
2539 	INT16 y0I, y0Q, y1I, y1Q, y2I, y2Q, y3I, y3Q;
2540 	INT16 AI, AQ, BI, BQ, CI, CQ, DI, DQ;
2541 	INT16 W1I, W1Q, W2I, W2Q, W3I, W3Q; // W0I, W0Q,
2542 
2543 	z0I = pSrc[0]; z0Q = pSrc[1];
2544 	x1I = pSrc[2]; x1Q = pSrc[2+1];
2545 	x2I = pSrc[4]; x2Q = pSrc[4+1];
2546 	x3I = pSrc[6]; x3Q = pSrc[6+1];
2547 #endif
2548 
2549 	for(mm=0;mm<16;mm++){
2550 #if defined(ARM_GCC) || defined(ARM_DS5)
2551 		coeffStrideDw = 4*coeffStride;
2552 #ifdef ARM_GCC
2553     asm volatile(
2554 		"LDR r5, [%[pCoeff], %[coeffStrideDw]]! \n\t"
2555 		"SMUAD r8, r5, %[x1] \n\t"
2556 		"SMUSDX r9, r5, %[x1] \n\t"
2557 		"LDR r5, [%[pCoeff], %[coeffStrideDw]]! \n\t"
2558 		"LSL r9, r9, #1 \n\t"
2559 		"PKHTB r6, r9, r8, ASR #15 \n\t"
2560 		"SMUAD r8, r5, %[x2] \n\t"
2561 		"SMUSDX r9, r5, %[x2] \n\t"
2562 		"LDR r5, [%[pCoeff], %[coeffStrideDw]] \n\t"
2563 		"LSL r9, r9, #1 \n\t"
2564 		"PKHTB r7, r9, r8, ASR #15 \n\t"
2565 		"SMUAD r8, r5, %[x3] \n\t"
2566 		"SMUSDX r9, r5, %[x3] \n\t"
2567 		"LSL r9, r9, #1 \n\t"
2568 		"PKHTB r5, r9, r8, ASR #15 \n\t"
2569 		"QADD16 r8, %[z0], r7 \n\t"
2570 		"QSUB16 r9, %[z0], r7 \n\t"
2571 		"QADD16 r7, r6, r5 \n\t"
2572 		"QSUB16 r6, r6, r5 \n\t"
2573 		"SHADD16 r5, r8, r7 \n\t"
2574 		"SHSUB16 r7, r8, r7 \n\t"
2575 		"SMUAD r5, r5, r5 \n\t"
2576 		"SMUAD r7, r7, r7 \n\t"
2577 		"ASR r5, r5, #13 \n\t"
2578 		"ASR r7, r7, #13 \n\t"
2579 		"SHASX r8, r9, r6 \n\t"
2580 		"SHSAX r6, r9, r6 \n\t"
2581 		"SMUAD r6, r6, r6 \n\t"
2582 		"SMUAD r8, r8, r8 \n\t"
2583 		"ASR r6, r6, #13 \n\t"
2584 		"ASR r8, r8, #13 \n\t"
2585 		"STRH r7, [%[pDst]], #32 \n\t"
2586 		"STRH r8, [%[pDst]], #32 \n\t"
2587 		"STRH r5, [%[pDst]], #32 \n\t"
2588 		"STRH r6, [%[pDst]], #32 \n\t"
2589 		: [pDst]"+r"(pDst) : [pCoeff]"r"(pCoeff), [coeffStrideDw]"r"(coeffStrideDw), [z0]"r"(z0), [x1]"r"(x1), [x2]"r"(x2), [x3]"r"(x3)
2590 		: "r5", "r6", "r7", "r8", "r9");
2591 #else
2592     pCoeffTemp = pCoeff;
2593         __asm volatile
2594         {
2595             LDR reg5, [pCoeffTemp, coeffStrideDw]!
2596             SMUAD reg8, reg5, x1
2597             SMUSDX reg9, reg5, x1
2598             LDR reg5, [pCoeffTemp, coeffStrideDw]!
2599             LSL reg9, reg9, #1
2600             PKHTB reg6, reg9, reg8, ASR #15
2601             SMUAD reg8, reg5, x2
2602             SMUSDX reg9, reg5, x2
2603             LDR reg5, [pCoeffTemp, coeffStrideDw]
2604             LSL reg9, reg9, #1
2605             PKHTB reg7, reg9, reg8, ASR #15
2606             SMUAD reg8, reg5, x3
2607             SMUSDX reg9, reg5, x3
2608             LSL reg9, reg9, #1
2609             PKHTB reg5, reg9, reg8, ASR #15
2610             QADD16 reg8, z0, reg7
2611             QSUB16 reg9, z0, reg7
2612             QADD16 reg7, reg6, reg5
2613             QSUB16 reg6, reg6, reg5
2614             SHADD16 reg5, reg8, reg7
2615             SHSUB16 reg7, reg8, reg7
2616             SMUAD reg5, reg5, reg5
2617             SMUAD reg7, reg7, reg7
2618             ASR reg5, reg5, #13
2619             ASR reg7, reg7, #13
2620             SHASX reg8, reg9, reg6
2621             SHSAX reg6, reg9, reg6
2622             SMUAD reg6, reg6, reg6
2623             SMUAD reg8, reg8, reg8
2624             ASR reg6, reg6, #13
2625             ASR reg8, reg8, #13
2626             STRH reg7, [pDst], #32
2627             STRH reg8, [pDst], #32
2628             STRH reg5, [pDst], #32
2629             STRH reg6, [pDst], #32
2630         }
2631 #endif
2632 		pDst -= 4*16;
2633 #else
2634 		//W0I = pCoeff[0]; W0Q = pCoeff[1];
2635 		W1I = pCoeff[2*coeffStride]; W1Q = pCoeff[2*coeffStride+1];
2636 		W2I = pCoeff[4*coeffStride]; W2Q = pCoeff[4*coeffStride+1];
2637 		W3I = pCoeff[6*coeffStride]; W3Q = pCoeff[6*coeffStride+1];
2638 		// z0 = W0*x0, z1 = W1*x1, z2 = W2*x2, z3 = W3*x3 assuming W0Q = -exp(1i*2*pi*nk/N)
2639 
2640 #ifdef ARM_DEBUG
2641 		z1I = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulator( radix4Fft16BitTo32BitMultiplier(W1I, x1I), radix4Fft16BitTo32BitMultiplier(W1Q, x1Q)));
2642 		z1Q = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulatorNeg( radix4Fft16BitTo32BitMultiplier(W1I, x1Q), radix4Fft16BitTo32BitMultiplier(W1Q, x1I)));
2643 		z2I = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulator( radix4Fft16BitTo32BitMultiplier(W2I, x2I), radix4Fft16BitTo32BitMultiplier(W2Q, x2Q)));
2644 		z2Q = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulatorNeg( radix4Fft16BitTo32BitMultiplier(W2I, x2Q), radix4Fft16BitTo32BitMultiplier(W2Q, x2I)));
2645 		z3I = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulator( radix4Fft16BitTo32BitMultiplier(W3I, x3I), radix4Fft16BitTo32BitMultiplier(W3Q, x3Q)));
2646 		z3Q = radix4Fft32BitTo16BitRounding(radix4Fft32BitAccumulatorNeg( radix4Fft16BitTo32BitMultiplier(W3I, x3Q), radix4Fft16BitTo32BitMultiplier(W3Q, x3I)));
2647 
2648 		AI = radix4Fft16BitAdd(z0I, z2I); AQ = radix4Fft16BitAdd(z0Q, z2Q);
2649 		BI = radix4Fft16BitSubtract(z0I, z2I); BQ = radix4Fft16BitSubtract(z0Q, z2Q);
2650 		CI = radix4Fft16BitAdd(z1I, z3I); CQ = radix4Fft16BitAdd(z1Q, z3Q);
2651 		DI = radix4Fft16BitSubtract(z1I, z3I); DQ = radix4Fft16BitSubtract(z1Q, z3Q);
2652 
2653 		y0I = radix4Fft16BitAddShift(AI, CI); y0Q = radix4Fft16BitAddShift(AQ, CQ);
2654 		y1I = radix4Fft16BitAddShift(BI, DQ); y1Q = radix4Fft16BitSubtractShift(BQ, DI);
2655 		y2I = radix4Fft16BitSubtractShift(AI, CI); y2Q = radix4Fft16BitSubtractShift(AQ, CQ);
2656 		y3I = radix4Fft16BitSubtractShift(BI, DQ); y3Q = radix4Fft16BitAddShift(BQ, DI);
2657 
2658 		pDst[2*16] = radix4Fft32BitTo16BitUnsignedRounding(radix4Fft32BitAccumulator( radix4Fft16BitTo32BitMultiplier(y0I, y0I), radix4Fft16BitTo32BitMultiplier(y0Q, y0Q)),-2);
2659 		pDst[3*16] = radix4Fft32BitTo16BitUnsignedRounding(radix4Fft32BitAccumulator( radix4Fft16BitTo32BitMultiplier(y1I, y1I), radix4Fft16BitTo32BitMultiplier(y1Q, y1Q)),-2);
2660 		pDst[0] = radix4Fft32BitTo16BitUnsignedRounding(radix4Fft32BitAccumulator( radix4Fft16BitTo32BitMultiplier(y2I, y2I), radix4Fft16BitTo32BitMultiplier(y2Q, y2Q)),-2);
2661 		pDst[16] = radix4Fft32BitTo16BitUnsignedRounding(radix4Fft32BitAccumulator( radix4Fft16BitTo32BitMultiplier(y3I, y3I), radix4Fft16BitTo32BitMultiplier(y3Q, y3Q)),-2);
2662 #else
2663 		z1I = (INT16)( (((INT32)W1I*x1I)+((INT32)W1Q*x1Q))>>15 );
2664 		z1Q = (INT16)( (((INT32)W1I*x1Q)-((INT32)W1Q*x1I))>>15 );
2665 		z2I = (INT16)( (((INT32)W2I*x2I)+((INT32)W2Q*x2Q))>>15 );
2666 		z2Q = (INT16)( (((INT32)W2I*x2Q)-((INT32)W2Q*x2I))>>15 );
2667 		z3I = (INT16)( (((INT32)W3I*x3I)+((INT32)W3Q*x3Q))>>15 );
2668 		z3Q = (INT16)( (((INT32)W3I*x3Q)-((INT32)W3Q*x3I))>>15 );
2669 
2670 		AI = (z0I+z2I); AQ = (z0Q+z2Q);
2671 		BI = (z0I-z2I); BQ = (z0Q-z2Q);
2672 		CI = (z1I+z3I); CQ = (z1Q+z3Q);
2673 		DI = (z1I-z3I); DQ = (z1Q-z3Q);
2674 
2675 		y0I = (AI+CI)>>1; y0Q = (AQ+CQ)>>1;
2676 		y1I = (BI+DQ)>>1; y1Q = (BQ-DI)>>1;
2677 		y2I = (AI-CI)>>1; y2Q = (AQ-CQ)>>1;
2678 		y3I = (BI-DQ)>>1; y3Q = (BQ+DI)>>1;
2679 
2680 		pDst[2*16]	= (INT16) ( (((INT32)y0I*y0I)+((INT32)y0Q*y0Q))>>13 );
2681 		pDst[3*16]	= (INT16) ( (((INT32)y1I*y1I)+((INT32)y1Q*y1Q))>>13 );
2682 		pDst[0]		= (INT16) ( (((INT32)y2I*y2I)+((INT32)y2Q*y2Q))>>13 );
2683 		pDst[16]	= (INT16) ( (((INT32)y3I*y3I)+((INT32)y3Q*y3Q))>>13 );
2684 #endif
2685 
2686 #endif
2687 		//printf("%d | %d | %d | %d\n",pDst[0],pDst[16],pDst[2*16],pDst[3*16]);
2688 		//printf("%d\n",(unsigned int)pDst);
2689 		pDst ++;
2690 		coeffStride += coeffStrideTemp;
2691 	}
2692 }
2693 
2694 #endif  /* CONFIG_WLS_CSI_PROC */
2695