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