add some code
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include "dsps_fft2r_platform.h"
|
||||
|
||||
#if (dsps_bit_rev_lookup_fc32_ae32_enabled == 1)
|
||||
#if (dsps_fft2r_fc32_aes3_enabled == 1)
|
||||
|
||||
// This is matrix multipliction function for ESP32 processor.
|
||||
.text
|
||||
.align 4
|
||||
.global dsps_bit_rev_lookup_fc32_aes3
|
||||
.type dsps_bit_rev_lookup_fc32_aes3,@function
|
||||
|
||||
dsps_bit_rev_lookup_fc32_aes3:
|
||||
//esp_err_t dsps_bit_rev_lookup_fc32_aes3(float *data, int reverse_size, uint16_t *reverse_tab)
|
||||
|
||||
entry a1, 16
|
||||
// data - a2
|
||||
// reverse_size - a3
|
||||
// reverse_tab - a4
|
||||
loopnez a3, .__loop_end_radix2_reorder_lookup_table
|
||||
l16ui a5, a4, 0 // Load first addr shift
|
||||
l16ui a6, a4, 2 // Load second addr shift
|
||||
addi a4, a4, 4 // Table addr update
|
||||
|
||||
add.n a5, a5, a2
|
||||
add.n a6, a6, a2
|
||||
|
||||
EE.LDF.64.IP f0, f2, a5, 0
|
||||
EE.LDF.64.IP f1, f3, a6, 0
|
||||
|
||||
EE.STF.64.IP f0, f2, a6, 0
|
||||
EE.STF.64.IP f1, f3, a5, 0
|
||||
|
||||
.__loop_end_radix2_reorder_lookup_table:
|
||||
|
||||
movi.n a2, 0 // return status ESP_OK
|
||||
retw.n
|
||||
|
||||
#endif // dsps_fft2r_fc32_aes3_enabled
|
||||
#endif // dsps_bit_rev_lookup_fc32_ae32_enabled
|
||||
@@ -0,0 +1,590 @@
|
||||
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
|
||||
#include <stdint.h>
|
||||
#include "dsps_fft_tables.h"
|
||||
|
||||
|
||||
const uint16_t bitrev2r_table_16_fc32[] = {
|
||||
8, 64, 16, 32, 24, 96, 40, 80, 56, 112, 88, 104,
|
||||
};
|
||||
|
||||
const uint16_t bitrev2r_table_32_fc32[] = {
|
||||
8, 128, 16, 64, 24, 192, 40, 160, 48, 96, 56, 224, 72, 144, 88, 208,
|
||||
104, 176, 120, 240, 152, 200, 184, 232,
|
||||
};
|
||||
|
||||
const uint16_t bitrev2r_table_64_fc32[] = {
|
||||
8, 256, 16, 128, 24, 384, 32, 64, 40, 320, 48, 192, 56, 448, 72, 288,
|
||||
80, 160, 88, 416, 104, 352, 112, 224, 120, 480, 136, 272, 152, 400, 168, 336,
|
||||
176, 208, 184, 464, 200, 304, 216, 432, 232, 368, 248, 496, 280, 392, 296, 328,
|
||||
312, 456, 344, 424, 376, 488, 440, 472,
|
||||
};
|
||||
|
||||
const uint16_t bitrev2r_table_128_fc32[] = {
|
||||
8, 512, 16, 256, 24, 768, 32, 128, 40, 640, 48, 384, 56, 896, 72, 576,
|
||||
80, 320, 88, 832, 96, 192, 104, 704, 112, 448, 120, 960, 136, 544, 144, 288,
|
||||
152, 800, 168, 672, 176, 416, 184, 928, 200, 608, 208, 352, 216, 864, 232, 736,
|
||||
240, 480, 248, 992, 264, 528, 280, 784, 296, 656, 304, 400, 312, 912, 328, 592,
|
||||
344, 848, 360, 720, 368, 464, 376, 976, 392, 560, 408, 816, 424, 688, 440, 944,
|
||||
456, 624, 472, 880, 488, 752, 504, 1008, 536, 776, 552, 648, 568, 904, 600, 840,
|
||||
616, 712, 632, 968, 664, 808, 696, 936, 728, 872, 760, 1000, 824, 920, 888, 984,
|
||||
};
|
||||
|
||||
const uint16_t bitrev2r_table_256_fc32[] = {
|
||||
8, 1024, 16, 512, 24, 1536, 32, 256, 40, 1280, 48, 768, 56, 1792, 64, 128,
|
||||
72, 1152, 80, 640, 88, 1664, 96, 384, 104, 1408, 112, 896, 120, 1920, 136, 1088,
|
||||
144, 576, 152, 1600, 160, 320, 168, 1344, 176, 832, 184, 1856, 200, 1216, 208, 704,
|
||||
216, 1728, 224, 448, 232, 1472, 240, 960, 248, 1984, 264, 1056, 272, 544, 280, 1568,
|
||||
296, 1312, 304, 800, 312, 1824, 328, 1184, 336, 672, 344, 1696, 352, 416, 360, 1440,
|
||||
368, 928, 376, 1952, 392, 1120, 400, 608, 408, 1632, 424, 1376, 432, 864, 440, 1888,
|
||||
456, 1248, 464, 736, 472, 1760, 488, 1504, 496, 992, 504, 2016, 520, 1040, 536, 1552,
|
||||
552, 1296, 560, 784, 568, 1808, 584, 1168, 592, 656, 600, 1680, 616, 1424, 624, 912,
|
||||
632, 1936, 648, 1104, 664, 1616, 680, 1360, 688, 848, 696, 1872, 712, 1232, 728, 1744,
|
||||
744, 1488, 752, 976, 760, 2000, 776, 1072, 792, 1584, 808, 1328, 824, 1840, 840, 1200,
|
||||
856, 1712, 872, 1456, 880, 944, 888, 1968, 904, 1136, 920, 1648, 936, 1392, 952, 1904,
|
||||
968, 1264, 984, 1776, 1000, 1520, 1016, 2032, 1048, 1544, 1064, 1288, 1080, 1800, 1096, 1160,
|
||||
1112, 1672, 1128, 1416, 1144, 1928, 1176, 1608, 1192, 1352, 1208, 1864, 1240, 1736, 1256, 1480,
|
||||
1272, 1992, 1304, 1576, 1336, 1832, 1368, 1704, 1384, 1448, 1400, 1960, 1432, 1640, 1464, 1896,
|
||||
1496, 1768, 1528, 2024, 1592, 1816, 1624, 1688, 1656, 1944, 1720, 1880, 1784, 2008, 1912, 1976,
|
||||
};
|
||||
|
||||
const uint16_t bitrev2r_table_512_fc32[] = {
|
||||
8, 2048, 16, 1024, 24, 3072, 32, 512, 40, 2560, 48, 1536, 56, 3584, 64, 256,
|
||||
72, 2304, 80, 1280, 88, 3328, 96, 768, 104, 2816, 112, 1792, 120, 3840, 136, 2176,
|
||||
144, 1152, 152, 3200, 160, 640, 168, 2688, 176, 1664, 184, 3712, 192, 384, 200, 2432,
|
||||
208, 1408, 216, 3456, 224, 896, 232, 2944, 240, 1920, 248, 3968, 264, 2112, 272, 1088,
|
||||
280, 3136, 288, 576, 296, 2624, 304, 1600, 312, 3648, 328, 2368, 336, 1344, 344, 3392,
|
||||
352, 832, 360, 2880, 368, 1856, 376, 3904, 392, 2240, 400, 1216, 408, 3264, 416, 704,
|
||||
424, 2752, 432, 1728, 440, 3776, 456, 2496, 464, 1472, 472, 3520, 480, 960, 488, 3008,
|
||||
496, 1984, 504, 4032, 520, 2080, 528, 1056, 536, 3104, 552, 2592, 560, 1568, 568, 3616,
|
||||
584, 2336, 592, 1312, 600, 3360, 608, 800, 616, 2848, 624, 1824, 632, 3872, 648, 2208,
|
||||
656, 1184, 664, 3232, 680, 2720, 688, 1696, 696, 3744, 712, 2464, 720, 1440, 728, 3488,
|
||||
736, 928, 744, 2976, 752, 1952, 760, 4000, 776, 2144, 784, 1120, 792, 3168, 808, 2656,
|
||||
816, 1632, 824, 3680, 840, 2400, 848, 1376, 856, 3424, 872, 2912, 880, 1888, 888, 3936,
|
||||
904, 2272, 912, 1248, 920, 3296, 936, 2784, 944, 1760, 952, 3808, 968, 2528, 976, 1504,
|
||||
984, 3552, 1000, 3040, 1008, 2016, 1016, 4064, 1032, 2064, 1048, 3088, 1064, 2576, 1072, 1552,
|
||||
1080, 3600, 1096, 2320, 1104, 1296, 1112, 3344, 1128, 2832, 1136, 1808, 1144, 3856, 1160, 2192,
|
||||
1176, 3216, 1192, 2704, 1200, 1680, 1208, 3728, 1224, 2448, 1232, 1424, 1240, 3472, 1256, 2960,
|
||||
1264, 1936, 1272, 3984, 1288, 2128, 1304, 3152, 1320, 2640, 1328, 1616, 1336, 3664, 1352, 2384,
|
||||
1368, 3408, 1384, 2896, 1392, 1872, 1400, 3920, 1416, 2256, 1432, 3280, 1448, 2768, 1456, 1744,
|
||||
1464, 3792, 1480, 2512, 1496, 3536, 1512, 3024, 1520, 2000, 1528, 4048, 1544, 2096, 1560, 3120,
|
||||
1576, 2608, 1592, 3632, 1608, 2352, 1624, 3376, 1640, 2864, 1648, 1840, 1656, 3888, 1672, 2224,
|
||||
1688, 3248, 1704, 2736, 1720, 3760, 1736, 2480, 1752, 3504, 1768, 2992, 1776, 1968, 1784, 4016,
|
||||
1800, 2160, 1816, 3184, 1832, 2672, 1848, 3696, 1864, 2416, 1880, 3440, 1896, 2928, 1912, 3952,
|
||||
1928, 2288, 1944, 3312, 1960, 2800, 1976, 3824, 1992, 2544, 2008, 3568, 2024, 3056, 2040, 4080,
|
||||
2072, 3080, 2088, 2568, 2104, 3592, 2120, 2312, 2136, 3336, 2152, 2824, 2168, 3848, 2200, 3208,
|
||||
2216, 2696, 2232, 3720, 2248, 2440, 2264, 3464, 2280, 2952, 2296, 3976, 2328, 3144, 2344, 2632,
|
||||
2360, 3656, 2392, 3400, 2408, 2888, 2424, 3912, 2456, 3272, 2472, 2760, 2488, 3784, 2520, 3528,
|
||||
2536, 3016, 2552, 4040, 2584, 3112, 2616, 3624, 2648, 3368, 2664, 2856, 2680, 3880, 2712, 3240,
|
||||
2744, 3752, 2776, 3496, 2792, 2984, 2808, 4008, 2840, 3176, 2872, 3688, 2904, 3432, 2936, 3944,
|
||||
2968, 3304, 3000, 3816, 3032, 3560, 3064, 4072, 3128, 3608, 3160, 3352, 3192, 3864, 3256, 3736,
|
||||
3288, 3480, 3320, 3992, 3384, 3672, 3448, 3928, 3512, 3800, 3576, 4056, 3704, 3896, 3832, 4024,
|
||||
};
|
||||
|
||||
const uint16_t bitrev2r_table_1024_fc32[] = {
|
||||
8, 4096, 16, 2048, 24, 6144, 32, 1024, 40, 5120, 48, 3072, 56, 7168, 64, 512,
|
||||
72, 4608, 80, 2560, 88, 6656, 96, 1536, 104, 5632, 112, 3584, 120, 7680, 128, 256,
|
||||
136, 4352, 144, 2304, 152, 6400, 160, 1280, 168, 5376, 176, 3328, 184, 7424, 192, 768,
|
||||
200, 4864, 208, 2816, 216, 6912, 224, 1792, 232, 5888, 240, 3840, 248, 7936, 264, 4224,
|
||||
272, 2176, 280, 6272, 288, 1152, 296, 5248, 304, 3200, 312, 7296, 320, 640, 328, 4736,
|
||||
336, 2688, 344, 6784, 352, 1664, 360, 5760, 368, 3712, 376, 7808, 392, 4480, 400, 2432,
|
||||
408, 6528, 416, 1408, 424, 5504, 432, 3456, 440, 7552, 448, 896, 456, 4992, 464, 2944,
|
||||
472, 7040, 480, 1920, 488, 6016, 496, 3968, 504, 8064, 520, 4160, 528, 2112, 536, 6208,
|
||||
544, 1088, 552, 5184, 560, 3136, 568, 7232, 584, 4672, 592, 2624, 600, 6720, 608, 1600,
|
||||
616, 5696, 624, 3648, 632, 7744, 648, 4416, 656, 2368, 664, 6464, 672, 1344, 680, 5440,
|
||||
688, 3392, 696, 7488, 704, 832, 712, 4928, 720, 2880, 728, 6976, 736, 1856, 744, 5952,
|
||||
752, 3904, 760, 8000, 776, 4288, 784, 2240, 792, 6336, 800, 1216, 808, 5312, 816, 3264,
|
||||
824, 7360, 840, 4800, 848, 2752, 856, 6848, 864, 1728, 872, 5824, 880, 3776, 888, 7872,
|
||||
904, 4544, 912, 2496, 920, 6592, 928, 1472, 936, 5568, 944, 3520, 952, 7616, 968, 5056,
|
||||
976, 3008, 984, 7104, 992, 1984, 1000, 6080, 1008, 4032, 1016, 8128, 1032, 4128, 1040, 2080,
|
||||
1048, 6176, 1064, 5152, 1072, 3104, 1080, 7200, 1096, 4640, 1104, 2592, 1112, 6688, 1120, 1568,
|
||||
1128, 5664, 1136, 3616, 1144, 7712, 1160, 4384, 1168, 2336, 1176, 6432, 1184, 1312, 1192, 5408,
|
||||
1200, 3360, 1208, 7456, 1224, 4896, 1232, 2848, 1240, 6944, 1248, 1824, 1256, 5920, 1264, 3872,
|
||||
1272, 7968, 1288, 4256, 1296, 2208, 1304, 6304, 1320, 5280, 1328, 3232, 1336, 7328, 1352, 4768,
|
||||
1360, 2720, 1368, 6816, 1376, 1696, 1384, 5792, 1392, 3744, 1400, 7840, 1416, 4512, 1424, 2464,
|
||||
1432, 6560, 1448, 5536, 1456, 3488, 1464, 7584, 1480, 5024, 1488, 2976, 1496, 7072, 1504, 1952,
|
||||
1512, 6048, 1520, 4000, 1528, 8096, 1544, 4192, 1552, 2144, 1560, 6240, 1576, 5216, 1584, 3168,
|
||||
1592, 7264, 1608, 4704, 1616, 2656, 1624, 6752, 1640, 5728, 1648, 3680, 1656, 7776, 1672, 4448,
|
||||
1680, 2400, 1688, 6496, 1704, 5472, 1712, 3424, 1720, 7520, 1736, 4960, 1744, 2912, 1752, 7008,
|
||||
1760, 1888, 1768, 5984, 1776, 3936, 1784, 8032, 1800, 4320, 1808, 2272, 1816, 6368, 1832, 5344,
|
||||
1840, 3296, 1848, 7392, 1864, 4832, 1872, 2784, 1880, 6880, 1896, 5856, 1904, 3808, 1912, 7904,
|
||||
1928, 4576, 1936, 2528, 1944, 6624, 1960, 5600, 1968, 3552, 1976, 7648, 1992, 5088, 2000, 3040,
|
||||
2008, 7136, 2024, 6112, 2032, 4064, 2040, 8160, 2056, 4112, 2072, 6160, 2088, 5136, 2096, 3088,
|
||||
2104, 7184, 2120, 4624, 2128, 2576, 2136, 6672, 2152, 5648, 2160, 3600, 2168, 7696, 2184, 4368,
|
||||
2192, 2320, 2200, 6416, 2216, 5392, 2224, 3344, 2232, 7440, 2248, 4880, 2256, 2832, 2264, 6928,
|
||||
2280, 5904, 2288, 3856, 2296, 7952, 2312, 4240, 2328, 6288, 2344, 5264, 2352, 3216, 2360, 7312,
|
||||
2376, 4752, 2384, 2704, 2392, 6800, 2408, 5776, 2416, 3728, 2424, 7824, 2440, 4496, 2456, 6544,
|
||||
2472, 5520, 2480, 3472, 2488, 7568, 2504, 5008, 2512, 2960, 2520, 7056, 2536, 6032, 2544, 3984,
|
||||
2552, 8080, 2568, 4176, 2584, 6224, 2600, 5200, 2608, 3152, 2616, 7248, 2632, 4688, 2648, 6736,
|
||||
2664, 5712, 2672, 3664, 2680, 7760, 2696, 4432, 2712, 6480, 2728, 5456, 2736, 3408, 2744, 7504,
|
||||
2760, 4944, 2768, 2896, 2776, 6992, 2792, 5968, 2800, 3920, 2808, 8016, 2824, 4304, 2840, 6352,
|
||||
2856, 5328, 2864, 3280, 2872, 7376, 2888, 4816, 2904, 6864, 2920, 5840, 2928, 3792, 2936, 7888,
|
||||
2952, 4560, 2968, 6608, 2984, 5584, 2992, 3536, 3000, 7632, 3016, 5072, 3032, 7120, 3048, 6096,
|
||||
3056, 4048, 3064, 8144, 3080, 4144, 3096, 6192, 3112, 5168, 3128, 7216, 3144, 4656, 3160, 6704,
|
||||
3176, 5680, 3184, 3632, 3192, 7728, 3208, 4400, 3224, 6448, 3240, 5424, 3248, 3376, 3256, 7472,
|
||||
3272, 4912, 3288, 6960, 3304, 5936, 3312, 3888, 3320, 7984, 3336, 4272, 3352, 6320, 3368, 5296,
|
||||
3384, 7344, 3400, 4784, 3416, 6832, 3432, 5808, 3440, 3760, 3448, 7856, 3464, 4528, 3480, 6576,
|
||||
3496, 5552, 3512, 7600, 3528, 5040, 3544, 7088, 3560, 6064, 3568, 4016, 3576, 8112, 3592, 4208,
|
||||
3608, 6256, 3624, 5232, 3640, 7280, 3656, 4720, 3672, 6768, 3688, 5744, 3704, 7792, 3720, 4464,
|
||||
3736, 6512, 3752, 5488, 3768, 7536, 3784, 4976, 3800, 7024, 3816, 6000, 3824, 3952, 3832, 8048,
|
||||
3848, 4336, 3864, 6384, 3880, 5360, 3896, 7408, 3912, 4848, 3928, 6896, 3944, 5872, 3960, 7920,
|
||||
3976, 4592, 3992, 6640, 4008, 5616, 4024, 7664, 4040, 5104, 4056, 7152, 4072, 6128, 4088, 8176,
|
||||
4120, 6152, 4136, 5128, 4152, 7176, 4168, 4616, 4184, 6664, 4200, 5640, 4216, 7688, 4232, 4360,
|
||||
4248, 6408, 4264, 5384, 4280, 7432, 4296, 4872, 4312, 6920, 4328, 5896, 4344, 7944, 4376, 6280,
|
||||
4392, 5256, 4408, 7304, 4424, 4744, 4440, 6792, 4456, 5768, 4472, 7816, 4504, 6536, 4520, 5512,
|
||||
4536, 7560, 4552, 5000, 4568, 7048, 4584, 6024, 4600, 8072, 4632, 6216, 4648, 5192, 4664, 7240,
|
||||
4696, 6728, 4712, 5704, 4728, 7752, 4760, 6472, 4776, 5448, 4792, 7496, 4808, 4936, 4824, 6984,
|
||||
4840, 5960, 4856, 8008, 4888, 6344, 4904, 5320, 4920, 7368, 4952, 6856, 4968, 5832, 4984, 7880,
|
||||
5016, 6600, 5032, 5576, 5048, 7624, 5080, 7112, 5096, 6088, 5112, 8136, 5144, 6184, 5176, 7208,
|
||||
5208, 6696, 5224, 5672, 5240, 7720, 5272, 6440, 5288, 5416, 5304, 7464, 5336, 6952, 5352, 5928,
|
||||
5368, 7976, 5400, 6312, 5432, 7336, 5464, 6824, 5480, 5800, 5496, 7848, 5528, 6568, 5560, 7592,
|
||||
5592, 7080, 5608, 6056, 5624, 8104, 5656, 6248, 5688, 7272, 5720, 6760, 5752, 7784, 5784, 6504,
|
||||
5816, 7528, 5848, 7016, 5864, 5992, 5880, 8040, 5912, 6376, 5944, 7400, 5976, 6888, 6008, 7912,
|
||||
6040, 6632, 6072, 7656, 6104, 7144, 6136, 8168, 6200, 7192, 6232, 6680, 6264, 7704, 6296, 6424,
|
||||
6328, 7448, 6360, 6936, 6392, 7960, 6456, 7320, 6488, 6808, 6520, 7832, 6584, 7576, 6616, 7064,
|
||||
6648, 8088, 6712, 7256, 6776, 7768, 6840, 7512, 6872, 7000, 6904, 8024, 6968, 7384, 7032, 7896,
|
||||
7096, 7640, 7160, 8152, 7288, 7736, 7352, 7480, 7416, 7992, 7544, 7864, 7672, 8120, 7928, 8056,
|
||||
};
|
||||
|
||||
const uint16_t bitrev2r_table_2048_fc32[] = {
|
||||
8, 8192, 16, 4096, 24, 12288, 32, 2048, 40, 10240, 48, 6144, 56, 14336, 64, 1024,
|
||||
72, 9216, 80, 5120, 88, 13312, 96, 3072, 104, 11264, 112, 7168, 120, 15360, 128, 512,
|
||||
136, 8704, 144, 4608, 152, 12800, 160, 2560, 168, 10752, 176, 6656, 184, 14848, 192, 1536,
|
||||
200, 9728, 208, 5632, 216, 13824, 224, 3584, 232, 11776, 240, 7680, 248, 15872, 264, 8448,
|
||||
272, 4352, 280, 12544, 288, 2304, 296, 10496, 304, 6400, 312, 14592, 320, 1280, 328, 9472,
|
||||
336, 5376, 344, 13568, 352, 3328, 360, 11520, 368, 7424, 376, 15616, 384, 768, 392, 8960,
|
||||
400, 4864, 408, 13056, 416, 2816, 424, 11008, 432, 6912, 440, 15104, 448, 1792, 456, 9984,
|
||||
464, 5888, 472, 14080, 480, 3840, 488, 12032, 496, 7936, 504, 16128, 520, 8320, 528, 4224,
|
||||
536, 12416, 544, 2176, 552, 10368, 560, 6272, 568, 14464, 576, 1152, 584, 9344, 592, 5248,
|
||||
600, 13440, 608, 3200, 616, 11392, 624, 7296, 632, 15488, 648, 8832, 656, 4736, 664, 12928,
|
||||
672, 2688, 680, 10880, 688, 6784, 696, 14976, 704, 1664, 712, 9856, 720, 5760, 728, 13952,
|
||||
736, 3712, 744, 11904, 752, 7808, 760, 16000, 776, 8576, 784, 4480, 792, 12672, 800, 2432,
|
||||
808, 10624, 816, 6528, 824, 14720, 832, 1408, 840, 9600, 848, 5504, 856, 13696, 864, 3456,
|
||||
872, 11648, 880, 7552, 888, 15744, 904, 9088, 912, 4992, 920, 13184, 928, 2944, 936, 11136,
|
||||
944, 7040, 952, 15232, 960, 1920, 968, 10112, 976, 6016, 984, 14208, 992, 3968, 1000, 12160,
|
||||
1008, 8064, 1016, 16256, 1032, 8256, 1040, 4160, 1048, 12352, 1056, 2112, 1064, 10304, 1072, 6208,
|
||||
1080, 14400, 1096, 9280, 1104, 5184, 1112, 13376, 1120, 3136, 1128, 11328, 1136, 7232, 1144, 15424,
|
||||
1160, 8768, 1168, 4672, 1176, 12864, 1184, 2624, 1192, 10816, 1200, 6720, 1208, 14912, 1216, 1600,
|
||||
1224, 9792, 1232, 5696, 1240, 13888, 1248, 3648, 1256, 11840, 1264, 7744, 1272, 15936, 1288, 8512,
|
||||
1296, 4416, 1304, 12608, 1312, 2368, 1320, 10560, 1328, 6464, 1336, 14656, 1352, 9536, 1360, 5440,
|
||||
1368, 13632, 1376, 3392, 1384, 11584, 1392, 7488, 1400, 15680, 1416, 9024, 1424, 4928, 1432, 13120,
|
||||
1440, 2880, 1448, 11072, 1456, 6976, 1464, 15168, 1472, 1856, 1480, 10048, 1488, 5952, 1496, 14144,
|
||||
1504, 3904, 1512, 12096, 1520, 8000, 1528, 16192, 1544, 8384, 1552, 4288, 1560, 12480, 1568, 2240,
|
||||
1576, 10432, 1584, 6336, 1592, 14528, 1608, 9408, 1616, 5312, 1624, 13504, 1632, 3264, 1640, 11456,
|
||||
1648, 7360, 1656, 15552, 1672, 8896, 1680, 4800, 1688, 12992, 1696, 2752, 1704, 10944, 1712, 6848,
|
||||
1720, 15040, 1736, 9920, 1744, 5824, 1752, 14016, 1760, 3776, 1768, 11968, 1776, 7872, 1784, 16064,
|
||||
1800, 8640, 1808, 4544, 1816, 12736, 1824, 2496, 1832, 10688, 1840, 6592, 1848, 14784, 1864, 9664,
|
||||
1872, 5568, 1880, 13760, 1888, 3520, 1896, 11712, 1904, 7616, 1912, 15808, 1928, 9152, 1936, 5056,
|
||||
1944, 13248, 1952, 3008, 1960, 11200, 1968, 7104, 1976, 15296, 1992, 10176, 2000, 6080, 2008, 14272,
|
||||
2016, 4032, 2024, 12224, 2032, 8128, 2040, 16320, 2056, 8224, 2064, 4128, 2072, 12320, 2088, 10272,
|
||||
2096, 6176, 2104, 14368, 2120, 9248, 2128, 5152, 2136, 13344, 2144, 3104, 2152, 11296, 2160, 7200,
|
||||
2168, 15392, 2184, 8736, 2192, 4640, 2200, 12832, 2208, 2592, 2216, 10784, 2224, 6688, 2232, 14880,
|
||||
2248, 9760, 2256, 5664, 2264, 13856, 2272, 3616, 2280, 11808, 2288, 7712, 2296, 15904, 2312, 8480,
|
||||
2320, 4384, 2328, 12576, 2344, 10528, 2352, 6432, 2360, 14624, 2376, 9504, 2384, 5408, 2392, 13600,
|
||||
2400, 3360, 2408, 11552, 2416, 7456, 2424, 15648, 2440, 8992, 2448, 4896, 2456, 13088, 2464, 2848,
|
||||
2472, 11040, 2480, 6944, 2488, 15136, 2504, 10016, 2512, 5920, 2520, 14112, 2528, 3872, 2536, 12064,
|
||||
2544, 7968, 2552, 16160, 2568, 8352, 2576, 4256, 2584, 12448, 2600, 10400, 2608, 6304, 2616, 14496,
|
||||
2632, 9376, 2640, 5280, 2648, 13472, 2656, 3232, 2664, 11424, 2672, 7328, 2680, 15520, 2696, 8864,
|
||||
2704, 4768, 2712, 12960, 2728, 10912, 2736, 6816, 2744, 15008, 2760, 9888, 2768, 5792, 2776, 13984,
|
||||
2784, 3744, 2792, 11936, 2800, 7840, 2808, 16032, 2824, 8608, 2832, 4512, 2840, 12704, 2856, 10656,
|
||||
2864, 6560, 2872, 14752, 2888, 9632, 2896, 5536, 2904, 13728, 2912, 3488, 2920, 11680, 2928, 7584,
|
||||
2936, 15776, 2952, 9120, 2960, 5024, 2968, 13216, 2984, 11168, 2992, 7072, 3000, 15264, 3016, 10144,
|
||||
3024, 6048, 3032, 14240, 3040, 4000, 3048, 12192, 3056, 8096, 3064, 16288, 3080, 8288, 3088, 4192,
|
||||
3096, 12384, 3112, 10336, 3120, 6240, 3128, 14432, 3144, 9312, 3152, 5216, 3160, 13408, 3176, 11360,
|
||||
3184, 7264, 3192, 15456, 3208, 8800, 3216, 4704, 3224, 12896, 3240, 10848, 3248, 6752, 3256, 14944,
|
||||
3272, 9824, 3280, 5728, 3288, 13920, 3296, 3680, 3304, 11872, 3312, 7776, 3320, 15968, 3336, 8544,
|
||||
3344, 4448, 3352, 12640, 3368, 10592, 3376, 6496, 3384, 14688, 3400, 9568, 3408, 5472, 3416, 13664,
|
||||
3432, 11616, 3440, 7520, 3448, 15712, 3464, 9056, 3472, 4960, 3480, 13152, 3496, 11104, 3504, 7008,
|
||||
3512, 15200, 3528, 10080, 3536, 5984, 3544, 14176, 3552, 3936, 3560, 12128, 3568, 8032, 3576, 16224,
|
||||
3592, 8416, 3600, 4320, 3608, 12512, 3624, 10464, 3632, 6368, 3640, 14560, 3656, 9440, 3664, 5344,
|
||||
3672, 13536, 3688, 11488, 3696, 7392, 3704, 15584, 3720, 8928, 3728, 4832, 3736, 13024, 3752, 10976,
|
||||
3760, 6880, 3768, 15072, 3784, 9952, 3792, 5856, 3800, 14048, 3816, 12000, 3824, 7904, 3832, 16096,
|
||||
3848, 8672, 3856, 4576, 3864, 12768, 3880, 10720, 3888, 6624, 3896, 14816, 3912, 9696, 3920, 5600,
|
||||
3928, 13792, 3944, 11744, 3952, 7648, 3960, 15840, 3976, 9184, 3984, 5088, 3992, 13280, 4008, 11232,
|
||||
4016, 7136, 4024, 15328, 4040, 10208, 4048, 6112, 4056, 14304, 4072, 12256, 4080, 8160, 4088, 16352,
|
||||
4104, 8208, 4120, 12304, 4136, 10256, 4144, 6160, 4152, 14352, 4168, 9232, 4176, 5136, 4184, 13328,
|
||||
4200, 11280, 4208, 7184, 4216, 15376, 4232, 8720, 4240, 4624, 4248, 12816, 4264, 10768, 4272, 6672,
|
||||
4280, 14864, 4296, 9744, 4304, 5648, 4312, 13840, 4328, 11792, 4336, 7696, 4344, 15888, 4360, 8464,
|
||||
4376, 12560, 4392, 10512, 4400, 6416, 4408, 14608, 4424, 9488, 4432, 5392, 4440, 13584, 4456, 11536,
|
||||
4464, 7440, 4472, 15632, 4488, 8976, 4496, 4880, 4504, 13072, 4520, 11024, 4528, 6928, 4536, 15120,
|
||||
4552, 10000, 4560, 5904, 4568, 14096, 4584, 12048, 4592, 7952, 4600, 16144, 4616, 8336, 4632, 12432,
|
||||
4648, 10384, 4656, 6288, 4664, 14480, 4680, 9360, 4688, 5264, 4696, 13456, 4712, 11408, 4720, 7312,
|
||||
4728, 15504, 4744, 8848, 4760, 12944, 4776, 10896, 4784, 6800, 4792, 14992, 4808, 9872, 4816, 5776,
|
||||
4824, 13968, 4840, 11920, 4848, 7824, 4856, 16016, 4872, 8592, 4888, 12688, 4904, 10640, 4912, 6544,
|
||||
4920, 14736, 4936, 9616, 4944, 5520, 4952, 13712, 4968, 11664, 4976, 7568, 4984, 15760, 5000, 9104,
|
||||
5016, 13200, 5032, 11152, 5040, 7056, 5048, 15248, 5064, 10128, 5072, 6032, 5080, 14224, 5096, 12176,
|
||||
5104, 8080, 5112, 16272, 5128, 8272, 5144, 12368, 5160, 10320, 5168, 6224, 5176, 14416, 5192, 9296,
|
||||
5208, 13392, 5224, 11344, 5232, 7248, 5240, 15440, 5256, 8784, 5272, 12880, 5288, 10832, 5296, 6736,
|
||||
5304, 14928, 5320, 9808, 5328, 5712, 5336, 13904, 5352, 11856, 5360, 7760, 5368, 15952, 5384, 8528,
|
||||
5400, 12624, 5416, 10576, 5424, 6480, 5432, 14672, 5448, 9552, 5464, 13648, 5480, 11600, 5488, 7504,
|
||||
5496, 15696, 5512, 9040, 5528, 13136, 5544, 11088, 5552, 6992, 5560, 15184, 5576, 10064, 5584, 5968,
|
||||
5592, 14160, 5608, 12112, 5616, 8016, 5624, 16208, 5640, 8400, 5656, 12496, 5672, 10448, 5680, 6352,
|
||||
5688, 14544, 5704, 9424, 5720, 13520, 5736, 11472, 5744, 7376, 5752, 15568, 5768, 8912, 5784, 13008,
|
||||
5800, 10960, 5808, 6864, 5816, 15056, 5832, 9936, 5848, 14032, 5864, 11984, 5872, 7888, 5880, 16080,
|
||||
5896, 8656, 5912, 12752, 5928, 10704, 5936, 6608, 5944, 14800, 5960, 9680, 5976, 13776, 5992, 11728,
|
||||
6000, 7632, 6008, 15824, 6024, 9168, 6040, 13264, 6056, 11216, 6064, 7120, 6072, 15312, 6088, 10192,
|
||||
6104, 14288, 6120, 12240, 6128, 8144, 6136, 16336, 6152, 8240, 6168, 12336, 6184, 10288, 6200, 14384,
|
||||
6216, 9264, 6232, 13360, 6248, 11312, 6256, 7216, 6264, 15408, 6280, 8752, 6296, 12848, 6312, 10800,
|
||||
6320, 6704, 6328, 14896, 6344, 9776, 6360, 13872, 6376, 11824, 6384, 7728, 6392, 15920, 6408, 8496,
|
||||
6424, 12592, 6440, 10544, 6456, 14640, 6472, 9520, 6488, 13616, 6504, 11568, 6512, 7472, 6520, 15664,
|
||||
6536, 9008, 6552, 13104, 6568, 11056, 6576, 6960, 6584, 15152, 6600, 10032, 6616, 14128, 6632, 12080,
|
||||
6640, 7984, 6648, 16176, 6664, 8368, 6680, 12464, 6696, 10416, 6712, 14512, 6728, 9392, 6744, 13488,
|
||||
6760, 11440, 6768, 7344, 6776, 15536, 6792, 8880, 6808, 12976, 6824, 10928, 6840, 15024, 6856, 9904,
|
||||
6872, 14000, 6888, 11952, 6896, 7856, 6904, 16048, 6920, 8624, 6936, 12720, 6952, 10672, 6968, 14768,
|
||||
6984, 9648, 7000, 13744, 7016, 11696, 7024, 7600, 7032, 15792, 7048, 9136, 7064, 13232, 7080, 11184,
|
||||
7096, 15280, 7112, 10160, 7128, 14256, 7144, 12208, 7152, 8112, 7160, 16304, 7176, 8304, 7192, 12400,
|
||||
7208, 10352, 7224, 14448, 7240, 9328, 7256, 13424, 7272, 11376, 7288, 15472, 7304, 8816, 7320, 12912,
|
||||
7336, 10864, 7352, 14960, 7368, 9840, 7384, 13936, 7400, 11888, 7408, 7792, 7416, 15984, 7432, 8560,
|
||||
7448, 12656, 7464, 10608, 7480, 14704, 7496, 9584, 7512, 13680, 7528, 11632, 7544, 15728, 7560, 9072,
|
||||
7576, 13168, 7592, 11120, 7608, 15216, 7624, 10096, 7640, 14192, 7656, 12144, 7664, 8048, 7672, 16240,
|
||||
7688, 8432, 7704, 12528, 7720, 10480, 7736, 14576, 7752, 9456, 7768, 13552, 7784, 11504, 7800, 15600,
|
||||
7816, 8944, 7832, 13040, 7848, 10992, 7864, 15088, 7880, 9968, 7896, 14064, 7912, 12016, 7928, 16112,
|
||||
7944, 8688, 7960, 12784, 7976, 10736, 7992, 14832, 8008, 9712, 8024, 13808, 8040, 11760, 8056, 15856,
|
||||
8072, 9200, 8088, 13296, 8104, 11248, 8120, 15344, 8136, 10224, 8152, 14320, 8168, 12272, 8184, 16368,
|
||||
8216, 12296, 8232, 10248, 8248, 14344, 8264, 9224, 8280, 13320, 8296, 11272, 8312, 15368, 8328, 8712,
|
||||
8344, 12808, 8360, 10760, 8376, 14856, 8392, 9736, 8408, 13832, 8424, 11784, 8440, 15880, 8472, 12552,
|
||||
8488, 10504, 8504, 14600, 8520, 9480, 8536, 13576, 8552, 11528, 8568, 15624, 8584, 8968, 8600, 13064,
|
||||
8616, 11016, 8632, 15112, 8648, 9992, 8664, 14088, 8680, 12040, 8696, 16136, 8728, 12424, 8744, 10376,
|
||||
8760, 14472, 8776, 9352, 8792, 13448, 8808, 11400, 8824, 15496, 8856, 12936, 8872, 10888, 8888, 14984,
|
||||
8904, 9864, 8920, 13960, 8936, 11912, 8952, 16008, 8984, 12680, 9000, 10632, 9016, 14728, 9032, 9608,
|
||||
9048, 13704, 9064, 11656, 9080, 15752, 9112, 13192, 9128, 11144, 9144, 15240, 9160, 10120, 9176, 14216,
|
||||
9192, 12168, 9208, 16264, 9240, 12360, 9256, 10312, 9272, 14408, 9304, 13384, 9320, 11336, 9336, 15432,
|
||||
9368, 12872, 9384, 10824, 9400, 14920, 9416, 9800, 9432, 13896, 9448, 11848, 9464, 15944, 9496, 12616,
|
||||
9512, 10568, 9528, 14664, 9560, 13640, 9576, 11592, 9592, 15688, 9624, 13128, 9640, 11080, 9656, 15176,
|
||||
9672, 10056, 9688, 14152, 9704, 12104, 9720, 16200, 9752, 12488, 9768, 10440, 9784, 14536, 9816, 13512,
|
||||
9832, 11464, 9848, 15560, 9880, 13000, 9896, 10952, 9912, 15048, 9944, 14024, 9960, 11976, 9976, 16072,
|
||||
10008, 12744, 10024, 10696, 10040, 14792, 10072, 13768, 10088, 11720, 10104, 15816, 10136, 13256, 10152, 11208,
|
||||
10168, 15304, 10200, 14280, 10216, 12232, 10232, 16328, 10264, 12328, 10296, 14376, 10328, 13352, 10344, 11304,
|
||||
10360, 15400, 10392, 12840, 10408, 10792, 10424, 14888, 10456, 13864, 10472, 11816, 10488, 15912, 10520, 12584,
|
||||
10552, 14632, 10584, 13608, 10600, 11560, 10616, 15656, 10648, 13096, 10664, 11048, 10680, 15144, 10712, 14120,
|
||||
10728, 12072, 10744, 16168, 10776, 12456, 10808, 14504, 10840, 13480, 10856, 11432, 10872, 15528, 10904, 12968,
|
||||
10936, 15016, 10968, 13992, 10984, 11944, 11000, 16040, 11032, 12712, 11064, 14760, 11096, 13736, 11112, 11688,
|
||||
11128, 15784, 11160, 13224, 11192, 15272, 11224, 14248, 11240, 12200, 11256, 16296, 11288, 12392, 11320, 14440,
|
||||
11352, 13416, 11384, 15464, 11416, 12904, 11448, 14952, 11480, 13928, 11496, 11880, 11512, 15976, 11544, 12648,
|
||||
11576, 14696, 11608, 13672, 11640, 15720, 11672, 13160, 11704, 15208, 11736, 14184, 11752, 12136, 11768, 16232,
|
||||
11800, 12520, 11832, 14568, 11864, 13544, 11896, 15592, 11928, 13032, 11960, 15080, 11992, 14056, 12024, 16104,
|
||||
12056, 12776, 12088, 14824, 12120, 13800, 12152, 15848, 12184, 13288, 12216, 15336, 12248, 14312, 12280, 16360,
|
||||
12344, 14360, 12376, 13336, 12408, 15384, 12440, 12824, 12472, 14872, 12504, 13848, 12536, 15896, 12600, 14616,
|
||||
12632, 13592, 12664, 15640, 12696, 13080, 12728, 15128, 12760, 14104, 12792, 16152, 12856, 14488, 12888, 13464,
|
||||
12920, 15512, 12984, 15000, 13016, 13976, 13048, 16024, 13112, 14744, 13144, 13720, 13176, 15768, 13240, 15256,
|
||||
13272, 14232, 13304, 16280, 13368, 14424, 13432, 15448, 13496, 14936, 13528, 13912, 13560, 15960, 13624, 14680,
|
||||
13688, 15704, 13752, 15192, 13784, 14168, 13816, 16216, 13880, 14552, 13944, 15576, 14008, 15064, 14072, 16088,
|
||||
14136, 14808, 14200, 15832, 14264, 15320, 14328, 16344, 14456, 15416, 14520, 14904, 14584, 15928, 14712, 15672,
|
||||
14776, 15160, 14840, 16184, 14968, 15544, 15096, 16056, 15224, 15800, 15352, 16312, 15608, 15992, 15864, 16248,
|
||||
};
|
||||
|
||||
const uint16_t bitrev2r_table_4096_fc32[] = {
|
||||
8, 16384, 16, 8192, 24, 24576, 32, 4096, 40, 20480, 48, 12288, 56, 28672, 64, 2048,
|
||||
72, 18432, 80, 10240, 88, 26624, 96, 6144, 104, 22528, 112, 14336, 120, 30720, 128, 1024,
|
||||
136, 17408, 144, 9216, 152, 25600, 160, 5120, 168, 21504, 176, 13312, 184, 29696, 192, 3072,
|
||||
200, 19456, 208, 11264, 216, 27648, 224, 7168, 232, 23552, 240, 15360, 248, 31744, 256, 512,
|
||||
264, 16896, 272, 8704, 280, 25088, 288, 4608, 296, 20992, 304, 12800, 312, 29184, 320, 2560,
|
||||
328, 18944, 336, 10752, 344, 27136, 352, 6656, 360, 23040, 368, 14848, 376, 31232, 384, 1536,
|
||||
392, 17920, 400, 9728, 408, 26112, 416, 5632, 424, 22016, 432, 13824, 440, 30208, 448, 3584,
|
||||
456, 19968, 464, 11776, 472, 28160, 480, 7680, 488, 24064, 496, 15872, 504, 32256, 520, 16640,
|
||||
528, 8448, 536, 24832, 544, 4352, 552, 20736, 560, 12544, 568, 28928, 576, 2304, 584, 18688,
|
||||
592, 10496, 600, 26880, 608, 6400, 616, 22784, 624, 14592, 632, 30976, 640, 1280, 648, 17664,
|
||||
656, 9472, 664, 25856, 672, 5376, 680, 21760, 688, 13568, 696, 29952, 704, 3328, 712, 19712,
|
||||
720, 11520, 728, 27904, 736, 7424, 744, 23808, 752, 15616, 760, 32000, 776, 17152, 784, 8960,
|
||||
792, 25344, 800, 4864, 808, 21248, 816, 13056, 824, 29440, 832, 2816, 840, 19200, 848, 11008,
|
||||
856, 27392, 864, 6912, 872, 23296, 880, 15104, 888, 31488, 896, 1792, 904, 18176, 912, 9984,
|
||||
920, 26368, 928, 5888, 936, 22272, 944, 14080, 952, 30464, 960, 3840, 968, 20224, 976, 12032,
|
||||
984, 28416, 992, 7936, 1000, 24320, 1008, 16128, 1016, 32512, 1032, 16512, 1040, 8320, 1048, 24704,
|
||||
1056, 4224, 1064, 20608, 1072, 12416, 1080, 28800, 1088, 2176, 1096, 18560, 1104, 10368, 1112, 26752,
|
||||
1120, 6272, 1128, 22656, 1136, 14464, 1144, 30848, 1160, 17536, 1168, 9344, 1176, 25728, 1184, 5248,
|
||||
1192, 21632, 1200, 13440, 1208, 29824, 1216, 3200, 1224, 19584, 1232, 11392, 1240, 27776, 1248, 7296,
|
||||
1256, 23680, 1264, 15488, 1272, 31872, 1288, 17024, 1296, 8832, 1304, 25216, 1312, 4736, 1320, 21120,
|
||||
1328, 12928, 1336, 29312, 1344, 2688, 1352, 19072, 1360, 10880, 1368, 27264, 1376, 6784, 1384, 23168,
|
||||
1392, 14976, 1400, 31360, 1408, 1664, 1416, 18048, 1424, 9856, 1432, 26240, 1440, 5760, 1448, 22144,
|
||||
1456, 13952, 1464, 30336, 1472, 3712, 1480, 20096, 1488, 11904, 1496, 28288, 1504, 7808, 1512, 24192,
|
||||
1520, 16000, 1528, 32384, 1544, 16768, 1552, 8576, 1560, 24960, 1568, 4480, 1576, 20864, 1584, 12672,
|
||||
1592, 29056, 1600, 2432, 1608, 18816, 1616, 10624, 1624, 27008, 1632, 6528, 1640, 22912, 1648, 14720,
|
||||
1656, 31104, 1672, 17792, 1680, 9600, 1688, 25984, 1696, 5504, 1704, 21888, 1712, 13696, 1720, 30080,
|
||||
1728, 3456, 1736, 19840, 1744, 11648, 1752, 28032, 1760, 7552, 1768, 23936, 1776, 15744, 1784, 32128,
|
||||
1800, 17280, 1808, 9088, 1816, 25472, 1824, 4992, 1832, 21376, 1840, 13184, 1848, 29568, 1856, 2944,
|
||||
1864, 19328, 1872, 11136, 1880, 27520, 1888, 7040, 1896, 23424, 1904, 15232, 1912, 31616, 1928, 18304,
|
||||
1936, 10112, 1944, 26496, 1952, 6016, 1960, 22400, 1968, 14208, 1976, 30592, 1984, 3968, 1992, 20352,
|
||||
2000, 12160, 2008, 28544, 2016, 8064, 2024, 24448, 2032, 16256, 2040, 32640, 2056, 16448, 2064, 8256,
|
||||
2072, 24640, 2080, 4160, 2088, 20544, 2096, 12352, 2104, 28736, 2120, 18496, 2128, 10304, 2136, 26688,
|
||||
2144, 6208, 2152, 22592, 2160, 14400, 2168, 30784, 2184, 17472, 2192, 9280, 2200, 25664, 2208, 5184,
|
||||
2216, 21568, 2224, 13376, 2232, 29760, 2240, 3136, 2248, 19520, 2256, 11328, 2264, 27712, 2272, 7232,
|
||||
2280, 23616, 2288, 15424, 2296, 31808, 2312, 16960, 2320, 8768, 2328, 25152, 2336, 4672, 2344, 21056,
|
||||
2352, 12864, 2360, 29248, 2368, 2624, 2376, 19008, 2384, 10816, 2392, 27200, 2400, 6720, 2408, 23104,
|
||||
2416, 14912, 2424, 31296, 2440, 17984, 2448, 9792, 2456, 26176, 2464, 5696, 2472, 22080, 2480, 13888,
|
||||
2488, 30272, 2496, 3648, 2504, 20032, 2512, 11840, 2520, 28224, 2528, 7744, 2536, 24128, 2544, 15936,
|
||||
2552, 32320, 2568, 16704, 2576, 8512, 2584, 24896, 2592, 4416, 2600, 20800, 2608, 12608, 2616, 28992,
|
||||
2632, 18752, 2640, 10560, 2648, 26944, 2656, 6464, 2664, 22848, 2672, 14656, 2680, 31040, 2696, 17728,
|
||||
2704, 9536, 2712, 25920, 2720, 5440, 2728, 21824, 2736, 13632, 2744, 30016, 2752, 3392, 2760, 19776,
|
||||
2768, 11584, 2776, 27968, 2784, 7488, 2792, 23872, 2800, 15680, 2808, 32064, 2824, 17216, 2832, 9024,
|
||||
2840, 25408, 2848, 4928, 2856, 21312, 2864, 13120, 2872, 29504, 2888, 19264, 2896, 11072, 2904, 27456,
|
||||
2912, 6976, 2920, 23360, 2928, 15168, 2936, 31552, 2952, 18240, 2960, 10048, 2968, 26432, 2976, 5952,
|
||||
2984, 22336, 2992, 14144, 3000, 30528, 3008, 3904, 3016, 20288, 3024, 12096, 3032, 28480, 3040, 8000,
|
||||
3048, 24384, 3056, 16192, 3064, 32576, 3080, 16576, 3088, 8384, 3096, 24768, 3104, 4288, 3112, 20672,
|
||||
3120, 12480, 3128, 28864, 3144, 18624, 3152, 10432, 3160, 26816, 3168, 6336, 3176, 22720, 3184, 14528,
|
||||
3192, 30912, 3208, 17600, 3216, 9408, 3224, 25792, 3232, 5312, 3240, 21696, 3248, 13504, 3256, 29888,
|
||||
3272, 19648, 3280, 11456, 3288, 27840, 3296, 7360, 3304, 23744, 3312, 15552, 3320, 31936, 3336, 17088,
|
||||
3344, 8896, 3352, 25280, 3360, 4800, 3368, 21184, 3376, 12992, 3384, 29376, 3400, 19136, 3408, 10944,
|
||||
3416, 27328, 3424, 6848, 3432, 23232, 3440, 15040, 3448, 31424, 3464, 18112, 3472, 9920, 3480, 26304,
|
||||
3488, 5824, 3496, 22208, 3504, 14016, 3512, 30400, 3520, 3776, 3528, 20160, 3536, 11968, 3544, 28352,
|
||||
3552, 7872, 3560, 24256, 3568, 16064, 3576, 32448, 3592, 16832, 3600, 8640, 3608, 25024, 3616, 4544,
|
||||
3624, 20928, 3632, 12736, 3640, 29120, 3656, 18880, 3664, 10688, 3672, 27072, 3680, 6592, 3688, 22976,
|
||||
3696, 14784, 3704, 31168, 3720, 17856, 3728, 9664, 3736, 26048, 3744, 5568, 3752, 21952, 3760, 13760,
|
||||
3768, 30144, 3784, 19904, 3792, 11712, 3800, 28096, 3808, 7616, 3816, 24000, 3824, 15808, 3832, 32192,
|
||||
3848, 17344, 3856, 9152, 3864, 25536, 3872, 5056, 3880, 21440, 3888, 13248, 3896, 29632, 3912, 19392,
|
||||
3920, 11200, 3928, 27584, 3936, 7104, 3944, 23488, 3952, 15296, 3960, 31680, 3976, 18368, 3984, 10176,
|
||||
3992, 26560, 4000, 6080, 4008, 22464, 4016, 14272, 4024, 30656, 4040, 20416, 4048, 12224, 4056, 28608,
|
||||
4064, 8128, 4072, 24512, 4080, 16320, 4088, 32704, 4104, 16416, 4112, 8224, 4120, 24608, 4136, 20512,
|
||||
4144, 12320, 4152, 28704, 4168, 18464, 4176, 10272, 4184, 26656, 4192, 6176, 4200, 22560, 4208, 14368,
|
||||
4216, 30752, 4232, 17440, 4240, 9248, 4248, 25632, 4256, 5152, 4264, 21536, 4272, 13344, 4280, 29728,
|
||||
4296, 19488, 4304, 11296, 4312, 27680, 4320, 7200, 4328, 23584, 4336, 15392, 4344, 31776, 4360, 16928,
|
||||
4368, 8736, 4376, 25120, 4384, 4640, 4392, 21024, 4400, 12832, 4408, 29216, 4424, 18976, 4432, 10784,
|
||||
4440, 27168, 4448, 6688, 4456, 23072, 4464, 14880, 4472, 31264, 4488, 17952, 4496, 9760, 4504, 26144,
|
||||
4512, 5664, 4520, 22048, 4528, 13856, 4536, 30240, 4552, 20000, 4560, 11808, 4568, 28192, 4576, 7712,
|
||||
4584, 24096, 4592, 15904, 4600, 32288, 4616, 16672, 4624, 8480, 4632, 24864, 4648, 20768, 4656, 12576,
|
||||
4664, 28960, 4680, 18720, 4688, 10528, 4696, 26912, 4704, 6432, 4712, 22816, 4720, 14624, 4728, 31008,
|
||||
4744, 17696, 4752, 9504, 4760, 25888, 4768, 5408, 4776, 21792, 4784, 13600, 4792, 29984, 4808, 19744,
|
||||
4816, 11552, 4824, 27936, 4832, 7456, 4840, 23840, 4848, 15648, 4856, 32032, 4872, 17184, 4880, 8992,
|
||||
4888, 25376, 4904, 21280, 4912, 13088, 4920, 29472, 4936, 19232, 4944, 11040, 4952, 27424, 4960, 6944,
|
||||
4968, 23328, 4976, 15136, 4984, 31520, 5000, 18208, 5008, 10016, 5016, 26400, 5024, 5920, 5032, 22304,
|
||||
5040, 14112, 5048, 30496, 5064, 20256, 5072, 12064, 5080, 28448, 5088, 7968, 5096, 24352, 5104, 16160,
|
||||
5112, 32544, 5128, 16544, 5136, 8352, 5144, 24736, 5160, 20640, 5168, 12448, 5176, 28832, 5192, 18592,
|
||||
5200, 10400, 5208, 26784, 5216, 6304, 5224, 22688, 5232, 14496, 5240, 30880, 5256, 17568, 5264, 9376,
|
||||
5272, 25760, 5288, 21664, 5296, 13472, 5304, 29856, 5320, 19616, 5328, 11424, 5336, 27808, 5344, 7328,
|
||||
5352, 23712, 5360, 15520, 5368, 31904, 5384, 17056, 5392, 8864, 5400, 25248, 5416, 21152, 5424, 12960,
|
||||
5432, 29344, 5448, 19104, 5456, 10912, 5464, 27296, 5472, 6816, 5480, 23200, 5488, 15008, 5496, 31392,
|
||||
5512, 18080, 5520, 9888, 5528, 26272, 5536, 5792, 5544, 22176, 5552, 13984, 5560, 30368, 5576, 20128,
|
||||
5584, 11936, 5592, 28320, 5600, 7840, 5608, 24224, 5616, 16032, 5624, 32416, 5640, 16800, 5648, 8608,
|
||||
5656, 24992, 5672, 20896, 5680, 12704, 5688, 29088, 5704, 18848, 5712, 10656, 5720, 27040, 5728, 6560,
|
||||
5736, 22944, 5744, 14752, 5752, 31136, 5768, 17824, 5776, 9632, 5784, 26016, 5800, 21920, 5808, 13728,
|
||||
5816, 30112, 5832, 19872, 5840, 11680, 5848, 28064, 5856, 7584, 5864, 23968, 5872, 15776, 5880, 32160,
|
||||
5896, 17312, 5904, 9120, 5912, 25504, 5928, 21408, 5936, 13216, 5944, 29600, 5960, 19360, 5968, 11168,
|
||||
5976, 27552, 5984, 7072, 5992, 23456, 6000, 15264, 6008, 31648, 6024, 18336, 6032, 10144, 6040, 26528,
|
||||
6056, 22432, 6064, 14240, 6072, 30624, 6088, 20384, 6096, 12192, 6104, 28576, 6112, 8096, 6120, 24480,
|
||||
6128, 16288, 6136, 32672, 6152, 16480, 6160, 8288, 6168, 24672, 6184, 20576, 6192, 12384, 6200, 28768,
|
||||
6216, 18528, 6224, 10336, 6232, 26720, 6248, 22624, 6256, 14432, 6264, 30816, 6280, 17504, 6288, 9312,
|
||||
6296, 25696, 6312, 21600, 6320, 13408, 6328, 29792, 6344, 19552, 6352, 11360, 6360, 27744, 6368, 7264,
|
||||
6376, 23648, 6384, 15456, 6392, 31840, 6408, 16992, 6416, 8800, 6424, 25184, 6440, 21088, 6448, 12896,
|
||||
6456, 29280, 6472, 19040, 6480, 10848, 6488, 27232, 6496, 6752, 6504, 23136, 6512, 14944, 6520, 31328,
|
||||
6536, 18016, 6544, 9824, 6552, 26208, 6568, 22112, 6576, 13920, 6584, 30304, 6600, 20064, 6608, 11872,
|
||||
6616, 28256, 6624, 7776, 6632, 24160, 6640, 15968, 6648, 32352, 6664, 16736, 6672, 8544, 6680, 24928,
|
||||
6696, 20832, 6704, 12640, 6712, 29024, 6728, 18784, 6736, 10592, 6744, 26976, 6760, 22880, 6768, 14688,
|
||||
6776, 31072, 6792, 17760, 6800, 9568, 6808, 25952, 6824, 21856, 6832, 13664, 6840, 30048, 6856, 19808,
|
||||
6864, 11616, 6872, 28000, 6880, 7520, 6888, 23904, 6896, 15712, 6904, 32096, 6920, 17248, 6928, 9056,
|
||||
6936, 25440, 6952, 21344, 6960, 13152, 6968, 29536, 6984, 19296, 6992, 11104, 7000, 27488, 7016, 23392,
|
||||
7024, 15200, 7032, 31584, 7048, 18272, 7056, 10080, 7064, 26464, 7080, 22368, 7088, 14176, 7096, 30560,
|
||||
7112, 20320, 7120, 12128, 7128, 28512, 7136, 8032, 7144, 24416, 7152, 16224, 7160, 32608, 7176, 16608,
|
||||
7184, 8416, 7192, 24800, 7208, 20704, 7216, 12512, 7224, 28896, 7240, 18656, 7248, 10464, 7256, 26848,
|
||||
7272, 22752, 7280, 14560, 7288, 30944, 7304, 17632, 7312, 9440, 7320, 25824, 7336, 21728, 7344, 13536,
|
||||
7352, 29920, 7368, 19680, 7376, 11488, 7384, 27872, 7400, 23776, 7408, 15584, 7416, 31968, 7432, 17120,
|
||||
7440, 8928, 7448, 25312, 7464, 21216, 7472, 13024, 7480, 29408, 7496, 19168, 7504, 10976, 7512, 27360,
|
||||
7528, 23264, 7536, 15072, 7544, 31456, 7560, 18144, 7568, 9952, 7576, 26336, 7592, 22240, 7600, 14048,
|
||||
7608, 30432, 7624, 20192, 7632, 12000, 7640, 28384, 7648, 7904, 7656, 24288, 7664, 16096, 7672, 32480,
|
||||
7688, 16864, 7696, 8672, 7704, 25056, 7720, 20960, 7728, 12768, 7736, 29152, 7752, 18912, 7760, 10720,
|
||||
7768, 27104, 7784, 23008, 7792, 14816, 7800, 31200, 7816, 17888, 7824, 9696, 7832, 26080, 7848, 21984,
|
||||
7856, 13792, 7864, 30176, 7880, 19936, 7888, 11744, 7896, 28128, 7912, 24032, 7920, 15840, 7928, 32224,
|
||||
7944, 17376, 7952, 9184, 7960, 25568, 7976, 21472, 7984, 13280, 7992, 29664, 8008, 19424, 8016, 11232,
|
||||
8024, 27616, 8040, 23520, 8048, 15328, 8056, 31712, 8072, 18400, 8080, 10208, 8088, 26592, 8104, 22496,
|
||||
8112, 14304, 8120, 30688, 8136, 20448, 8144, 12256, 8152, 28640, 8168, 24544, 8176, 16352, 8184, 32736,
|
||||
8200, 16400, 8216, 24592, 8232, 20496, 8240, 12304, 8248, 28688, 8264, 18448, 8272, 10256, 8280, 26640,
|
||||
8296, 22544, 8304, 14352, 8312, 30736, 8328, 17424, 8336, 9232, 8344, 25616, 8360, 21520, 8368, 13328,
|
||||
8376, 29712, 8392, 19472, 8400, 11280, 8408, 27664, 8424, 23568, 8432, 15376, 8440, 31760, 8456, 16912,
|
||||
8464, 8720, 8472, 25104, 8488, 21008, 8496, 12816, 8504, 29200, 8520, 18960, 8528, 10768, 8536, 27152,
|
||||
8552, 23056, 8560, 14864, 8568, 31248, 8584, 17936, 8592, 9744, 8600, 26128, 8616, 22032, 8624, 13840,
|
||||
8632, 30224, 8648, 19984, 8656, 11792, 8664, 28176, 8680, 24080, 8688, 15888, 8696, 32272, 8712, 16656,
|
||||
8728, 24848, 8744, 20752, 8752, 12560, 8760, 28944, 8776, 18704, 8784, 10512, 8792, 26896, 8808, 22800,
|
||||
8816, 14608, 8824, 30992, 8840, 17680, 8848, 9488, 8856, 25872, 8872, 21776, 8880, 13584, 8888, 29968,
|
||||
8904, 19728, 8912, 11536, 8920, 27920, 8936, 23824, 8944, 15632, 8952, 32016, 8968, 17168, 8984, 25360,
|
||||
9000, 21264, 9008, 13072, 9016, 29456, 9032, 19216, 9040, 11024, 9048, 27408, 9064, 23312, 9072, 15120,
|
||||
9080, 31504, 9096, 18192, 9104, 10000, 9112, 26384, 9128, 22288, 9136, 14096, 9144, 30480, 9160, 20240,
|
||||
9168, 12048, 9176, 28432, 9192, 24336, 9200, 16144, 9208, 32528, 9224, 16528, 9240, 24720, 9256, 20624,
|
||||
9264, 12432, 9272, 28816, 9288, 18576, 9296, 10384, 9304, 26768, 9320, 22672, 9328, 14480, 9336, 30864,
|
||||
9352, 17552, 9368, 25744, 9384, 21648, 9392, 13456, 9400, 29840, 9416, 19600, 9424, 11408, 9432, 27792,
|
||||
9448, 23696, 9456, 15504, 9464, 31888, 9480, 17040, 9496, 25232, 9512, 21136, 9520, 12944, 9528, 29328,
|
||||
9544, 19088, 9552, 10896, 9560, 27280, 9576, 23184, 9584, 14992, 9592, 31376, 9608, 18064, 9616, 9872,
|
||||
9624, 26256, 9640, 22160, 9648, 13968, 9656, 30352, 9672, 20112, 9680, 11920, 9688, 28304, 9704, 24208,
|
||||
9712, 16016, 9720, 32400, 9736, 16784, 9752, 24976, 9768, 20880, 9776, 12688, 9784, 29072, 9800, 18832,
|
||||
9808, 10640, 9816, 27024, 9832, 22928, 9840, 14736, 9848, 31120, 9864, 17808, 9880, 26000, 9896, 21904,
|
||||
9904, 13712, 9912, 30096, 9928, 19856, 9936, 11664, 9944, 28048, 9960, 23952, 9968, 15760, 9976, 32144,
|
||||
9992, 17296, 10008, 25488, 10024, 21392, 10032, 13200, 10040, 29584, 10056, 19344, 10064, 11152, 10072, 27536,
|
||||
10088, 23440, 10096, 15248, 10104, 31632, 10120, 18320, 10136, 26512, 10152, 22416, 10160, 14224, 10168, 30608,
|
||||
10184, 20368, 10192, 12176, 10200, 28560, 10216, 24464, 10224, 16272, 10232, 32656, 10248, 16464, 10264, 24656,
|
||||
10280, 20560, 10288, 12368, 10296, 28752, 10312, 18512, 10328, 26704, 10344, 22608, 10352, 14416, 10360, 30800,
|
||||
10376, 17488, 10392, 25680, 10408, 21584, 10416, 13392, 10424, 29776, 10440, 19536, 10448, 11344, 10456, 27728,
|
||||
10472, 23632, 10480, 15440, 10488, 31824, 10504, 16976, 10520, 25168, 10536, 21072, 10544, 12880, 10552, 29264,
|
||||
10568, 19024, 10576, 10832, 10584, 27216, 10600, 23120, 10608, 14928, 10616, 31312, 10632, 18000, 10648, 26192,
|
||||
10664, 22096, 10672, 13904, 10680, 30288, 10696, 20048, 10704, 11856, 10712, 28240, 10728, 24144, 10736, 15952,
|
||||
10744, 32336, 10760, 16720, 10776, 24912, 10792, 20816, 10800, 12624, 10808, 29008, 10824, 18768, 10840, 26960,
|
||||
10856, 22864, 10864, 14672, 10872, 31056, 10888, 17744, 10904, 25936, 10920, 21840, 10928, 13648, 10936, 30032,
|
||||
10952, 19792, 10960, 11600, 10968, 27984, 10984, 23888, 10992, 15696, 11000, 32080, 11016, 17232, 11032, 25424,
|
||||
11048, 21328, 11056, 13136, 11064, 29520, 11080, 19280, 11096, 27472, 11112, 23376, 11120, 15184, 11128, 31568,
|
||||
11144, 18256, 11160, 26448, 11176, 22352, 11184, 14160, 11192, 30544, 11208, 20304, 11216, 12112, 11224, 28496,
|
||||
11240, 24400, 11248, 16208, 11256, 32592, 11272, 16592, 11288, 24784, 11304, 20688, 11312, 12496, 11320, 28880,
|
||||
11336, 18640, 11352, 26832, 11368, 22736, 11376, 14544, 11384, 30928, 11400, 17616, 11416, 25808, 11432, 21712,
|
||||
11440, 13520, 11448, 29904, 11464, 19664, 11480, 27856, 11496, 23760, 11504, 15568, 11512, 31952, 11528, 17104,
|
||||
11544, 25296, 11560, 21200, 11568, 13008, 11576, 29392, 11592, 19152, 11608, 27344, 11624, 23248, 11632, 15056,
|
||||
11640, 31440, 11656, 18128, 11672, 26320, 11688, 22224, 11696, 14032, 11704, 30416, 11720, 20176, 11728, 11984,
|
||||
11736, 28368, 11752, 24272, 11760, 16080, 11768, 32464, 11784, 16848, 11800, 25040, 11816, 20944, 11824, 12752,
|
||||
11832, 29136, 11848, 18896, 11864, 27088, 11880, 22992, 11888, 14800, 11896, 31184, 11912, 17872, 11928, 26064,
|
||||
11944, 21968, 11952, 13776, 11960, 30160, 11976, 19920, 11992, 28112, 12008, 24016, 12016, 15824, 12024, 32208,
|
||||
12040, 17360, 12056, 25552, 12072, 21456, 12080, 13264, 12088, 29648, 12104, 19408, 12120, 27600, 12136, 23504,
|
||||
12144, 15312, 12152, 31696, 12168, 18384, 12184, 26576, 12200, 22480, 12208, 14288, 12216, 30672, 12232, 20432,
|
||||
12248, 28624, 12264, 24528, 12272, 16336, 12280, 32720, 12296, 16432, 12312, 24624, 12328, 20528, 12344, 28720,
|
||||
12360, 18480, 12376, 26672, 12392, 22576, 12400, 14384, 12408, 30768, 12424, 17456, 12440, 25648, 12456, 21552,
|
||||
12464, 13360, 12472, 29744, 12488, 19504, 12504, 27696, 12520, 23600, 12528, 15408, 12536, 31792, 12552, 16944,
|
||||
12568, 25136, 12584, 21040, 12592, 12848, 12600, 29232, 12616, 18992, 12632, 27184, 12648, 23088, 12656, 14896,
|
||||
12664, 31280, 12680, 17968, 12696, 26160, 12712, 22064, 12720, 13872, 12728, 30256, 12744, 20016, 12760, 28208,
|
||||
12776, 24112, 12784, 15920, 12792, 32304, 12808, 16688, 12824, 24880, 12840, 20784, 12856, 28976, 12872, 18736,
|
||||
12888, 26928, 12904, 22832, 12912, 14640, 12920, 31024, 12936, 17712, 12952, 25904, 12968, 21808, 12976, 13616,
|
||||
12984, 30000, 13000, 19760, 13016, 27952, 13032, 23856, 13040, 15664, 13048, 32048, 13064, 17200, 13080, 25392,
|
||||
13096, 21296, 13112, 29488, 13128, 19248, 13144, 27440, 13160, 23344, 13168, 15152, 13176, 31536, 13192, 18224,
|
||||
13208, 26416, 13224, 22320, 13232, 14128, 13240, 30512, 13256, 20272, 13272, 28464, 13288, 24368, 13296, 16176,
|
||||
13304, 32560, 13320, 16560, 13336, 24752, 13352, 20656, 13368, 28848, 13384, 18608, 13400, 26800, 13416, 22704,
|
||||
13424, 14512, 13432, 30896, 13448, 17584, 13464, 25776, 13480, 21680, 13496, 29872, 13512, 19632, 13528, 27824,
|
||||
13544, 23728, 13552, 15536, 13560, 31920, 13576, 17072, 13592, 25264, 13608, 21168, 13624, 29360, 13640, 19120,
|
||||
13656, 27312, 13672, 23216, 13680, 15024, 13688, 31408, 13704, 18096, 13720, 26288, 13736, 22192, 13744, 14000,
|
||||
13752, 30384, 13768, 20144, 13784, 28336, 13800, 24240, 13808, 16048, 13816, 32432, 13832, 16816, 13848, 25008,
|
||||
13864, 20912, 13880, 29104, 13896, 18864, 13912, 27056, 13928, 22960, 13936, 14768, 13944, 31152, 13960, 17840,
|
||||
13976, 26032, 13992, 21936, 14008, 30128, 14024, 19888, 14040, 28080, 14056, 23984, 14064, 15792, 14072, 32176,
|
||||
14088, 17328, 14104, 25520, 14120, 21424, 14136, 29616, 14152, 19376, 14168, 27568, 14184, 23472, 14192, 15280,
|
||||
14200, 31664, 14216, 18352, 14232, 26544, 14248, 22448, 14264, 30640, 14280, 20400, 14296, 28592, 14312, 24496,
|
||||
14320, 16304, 14328, 32688, 14344, 16496, 14360, 24688, 14376, 20592, 14392, 28784, 14408, 18544, 14424, 26736,
|
||||
14440, 22640, 14456, 30832, 14472, 17520, 14488, 25712, 14504, 21616, 14520, 29808, 14536, 19568, 14552, 27760,
|
||||
14568, 23664, 14576, 15472, 14584, 31856, 14600, 17008, 14616, 25200, 14632, 21104, 14648, 29296, 14664, 19056,
|
||||
14680, 27248, 14696, 23152, 14704, 14960, 14712, 31344, 14728, 18032, 14744, 26224, 14760, 22128, 14776, 30320,
|
||||
14792, 20080, 14808, 28272, 14824, 24176, 14832, 15984, 14840, 32368, 14856, 16752, 14872, 24944, 14888, 20848,
|
||||
14904, 29040, 14920, 18800, 14936, 26992, 14952, 22896, 14968, 31088, 14984, 17776, 15000, 25968, 15016, 21872,
|
||||
15032, 30064, 15048, 19824, 15064, 28016, 15080, 23920, 15088, 15728, 15096, 32112, 15112, 17264, 15128, 25456,
|
||||
15144, 21360, 15160, 29552, 15176, 19312, 15192, 27504, 15208, 23408, 15224, 31600, 15240, 18288, 15256, 26480,
|
||||
15272, 22384, 15288, 30576, 15304, 20336, 15320, 28528, 15336, 24432, 15344, 16240, 15352, 32624, 15368, 16624,
|
||||
15384, 24816, 15400, 20720, 15416, 28912, 15432, 18672, 15448, 26864, 15464, 22768, 15480, 30960, 15496, 17648,
|
||||
15512, 25840, 15528, 21744, 15544, 29936, 15560, 19696, 15576, 27888, 15592, 23792, 15608, 31984, 15624, 17136,
|
||||
15640, 25328, 15656, 21232, 15672, 29424, 15688, 19184, 15704, 27376, 15720, 23280, 15736, 31472, 15752, 18160,
|
||||
15768, 26352, 15784, 22256, 15800, 30448, 15816, 20208, 15832, 28400, 15848, 24304, 15856, 16112, 15864, 32496,
|
||||
15880, 16880, 15896, 25072, 15912, 20976, 15928, 29168, 15944, 18928, 15960, 27120, 15976, 23024, 15992, 31216,
|
||||
16008, 17904, 16024, 26096, 16040, 22000, 16056, 30192, 16072, 19952, 16088, 28144, 16104, 24048, 16120, 32240,
|
||||
16136, 17392, 16152, 25584, 16168, 21488, 16184, 29680, 16200, 19440, 16216, 27632, 16232, 23536, 16248, 31728,
|
||||
16264, 18416, 16280, 26608, 16296, 22512, 16312, 30704, 16328, 20464, 16344, 28656, 16360, 24560, 16376, 32752,
|
||||
16408, 24584, 16424, 20488, 16440, 28680, 16456, 18440, 16472, 26632, 16488, 22536, 16504, 30728, 16520, 17416,
|
||||
16536, 25608, 16552, 21512, 16568, 29704, 16584, 19464, 16600, 27656, 16616, 23560, 16632, 31752, 16648, 16904,
|
||||
16664, 25096, 16680, 21000, 16696, 29192, 16712, 18952, 16728, 27144, 16744, 23048, 16760, 31240, 16776, 17928,
|
||||
16792, 26120, 16808, 22024, 16824, 30216, 16840, 19976, 16856, 28168, 16872, 24072, 16888, 32264, 16920, 24840,
|
||||
16936, 20744, 16952, 28936, 16968, 18696, 16984, 26888, 17000, 22792, 17016, 30984, 17032, 17672, 17048, 25864,
|
||||
17064, 21768, 17080, 29960, 17096, 19720, 17112, 27912, 17128, 23816, 17144, 32008, 17176, 25352, 17192, 21256,
|
||||
17208, 29448, 17224, 19208, 17240, 27400, 17256, 23304, 17272, 31496, 17288, 18184, 17304, 26376, 17320, 22280,
|
||||
17336, 30472, 17352, 20232, 17368, 28424, 17384, 24328, 17400, 32520, 17432, 24712, 17448, 20616, 17464, 28808,
|
||||
17480, 18568, 17496, 26760, 17512, 22664, 17528, 30856, 17560, 25736, 17576, 21640, 17592, 29832, 17608, 19592,
|
||||
17624, 27784, 17640, 23688, 17656, 31880, 17688, 25224, 17704, 21128, 17720, 29320, 17736, 19080, 17752, 27272,
|
||||
17768, 23176, 17784, 31368, 17800, 18056, 17816, 26248, 17832, 22152, 17848, 30344, 17864, 20104, 17880, 28296,
|
||||
17896, 24200, 17912, 32392, 17944, 24968, 17960, 20872, 17976, 29064, 17992, 18824, 18008, 27016, 18024, 22920,
|
||||
18040, 31112, 18072, 25992, 18088, 21896, 18104, 30088, 18120, 19848, 18136, 28040, 18152, 23944, 18168, 32136,
|
||||
18200, 25480, 18216, 21384, 18232, 29576, 18248, 19336, 18264, 27528, 18280, 23432, 18296, 31624, 18328, 26504,
|
||||
18344, 22408, 18360, 30600, 18376, 20360, 18392, 28552, 18408, 24456, 18424, 32648, 18456, 24648, 18472, 20552,
|
||||
18488, 28744, 18520, 26696, 18536, 22600, 18552, 30792, 18584, 25672, 18600, 21576, 18616, 29768, 18632, 19528,
|
||||
18648, 27720, 18664, 23624, 18680, 31816, 18712, 25160, 18728, 21064, 18744, 29256, 18760, 19016, 18776, 27208,
|
||||
18792, 23112, 18808, 31304, 18840, 26184, 18856, 22088, 18872, 30280, 18888, 20040, 18904, 28232, 18920, 24136,
|
||||
18936, 32328, 18968, 24904, 18984, 20808, 19000, 29000, 19032, 26952, 19048, 22856, 19064, 31048, 19096, 25928,
|
||||
19112, 21832, 19128, 30024, 19144, 19784, 19160, 27976, 19176, 23880, 19192, 32072, 19224, 25416, 19240, 21320,
|
||||
19256, 29512, 19288, 27464, 19304, 23368, 19320, 31560, 19352, 26440, 19368, 22344, 19384, 30536, 19400, 20296,
|
||||
19416, 28488, 19432, 24392, 19448, 32584, 19480, 24776, 19496, 20680, 19512, 28872, 19544, 26824, 19560, 22728,
|
||||
19576, 30920, 19608, 25800, 19624, 21704, 19640, 29896, 19672, 27848, 19688, 23752, 19704, 31944, 19736, 25288,
|
||||
19752, 21192, 19768, 29384, 19800, 27336, 19816, 23240, 19832, 31432, 19864, 26312, 19880, 22216, 19896, 30408,
|
||||
19912, 20168, 19928, 28360, 19944, 24264, 19960, 32456, 19992, 25032, 20008, 20936, 20024, 29128, 20056, 27080,
|
||||
20072, 22984, 20088, 31176, 20120, 26056, 20136, 21960, 20152, 30152, 20184, 28104, 20200, 24008, 20216, 32200,
|
||||
20248, 25544, 20264, 21448, 20280, 29640, 20312, 27592, 20328, 23496, 20344, 31688, 20376, 26568, 20392, 22472,
|
||||
20408, 30664, 20440, 28616, 20456, 24520, 20472, 32712, 20504, 24616, 20536, 28712, 20568, 26664, 20584, 22568,
|
||||
20600, 30760, 20632, 25640, 20648, 21544, 20664, 29736, 20696, 27688, 20712, 23592, 20728, 31784, 20760, 25128,
|
||||
20776, 21032, 20792, 29224, 20824, 27176, 20840, 23080, 20856, 31272, 20888, 26152, 20904, 22056, 20920, 30248,
|
||||
20952, 28200, 20968, 24104, 20984, 32296, 21016, 24872, 21048, 28968, 21080, 26920, 21096, 22824, 21112, 31016,
|
||||
21144, 25896, 21160, 21800, 21176, 29992, 21208, 27944, 21224, 23848, 21240, 32040, 21272, 25384, 21304, 29480,
|
||||
21336, 27432, 21352, 23336, 21368, 31528, 21400, 26408, 21416, 22312, 21432, 30504, 21464, 28456, 21480, 24360,
|
||||
21496, 32552, 21528, 24744, 21560, 28840, 21592, 26792, 21608, 22696, 21624, 30888, 21656, 25768, 21688, 29864,
|
||||
21720, 27816, 21736, 23720, 21752, 31912, 21784, 25256, 21816, 29352, 21848, 27304, 21864, 23208, 21880, 31400,
|
||||
21912, 26280, 21928, 22184, 21944, 30376, 21976, 28328, 21992, 24232, 22008, 32424, 22040, 25000, 22072, 29096,
|
||||
22104, 27048, 22120, 22952, 22136, 31144, 22168, 26024, 22200, 30120, 22232, 28072, 22248, 23976, 22264, 32168,
|
||||
22296, 25512, 22328, 29608, 22360, 27560, 22376, 23464, 22392, 31656, 22424, 26536, 22456, 30632, 22488, 28584,
|
||||
22504, 24488, 22520, 32680, 22552, 24680, 22584, 28776, 22616, 26728, 22648, 30824, 22680, 25704, 22712, 29800,
|
||||
22744, 27752, 22760, 23656, 22776, 31848, 22808, 25192, 22840, 29288, 22872, 27240, 22888, 23144, 22904, 31336,
|
||||
22936, 26216, 22968, 30312, 23000, 28264, 23016, 24168, 23032, 32360, 23064, 24936, 23096, 29032, 23128, 26984,
|
||||
23160, 31080, 23192, 25960, 23224, 30056, 23256, 28008, 23272, 23912, 23288, 32104, 23320, 25448, 23352, 29544,
|
||||
23384, 27496, 23416, 31592, 23448, 26472, 23480, 30568, 23512, 28520, 23528, 24424, 23544, 32616, 23576, 24808,
|
||||
23608, 28904, 23640, 26856, 23672, 30952, 23704, 25832, 23736, 29928, 23768, 27880, 23800, 31976, 23832, 25320,
|
||||
23864, 29416, 23896, 27368, 23928, 31464, 23960, 26344, 23992, 30440, 24024, 28392, 24040, 24296, 24056, 32488,
|
||||
24088, 25064, 24120, 29160, 24152, 27112, 24184, 31208, 24216, 26088, 24248, 30184, 24280, 28136, 24312, 32232,
|
||||
24344, 25576, 24376, 29672, 24408, 27624, 24440, 31720, 24472, 26600, 24504, 30696, 24536, 28648, 24568, 32744,
|
||||
24632, 28696, 24664, 26648, 24696, 30744, 24728, 25624, 24760, 29720, 24792, 27672, 24824, 31768, 24856, 25112,
|
||||
24888, 29208, 24920, 27160, 24952, 31256, 24984, 26136, 25016, 30232, 25048, 28184, 25080, 32280, 25144, 28952,
|
||||
25176, 26904, 25208, 31000, 25240, 25880, 25272, 29976, 25304, 27928, 25336, 32024, 25400, 29464, 25432, 27416,
|
||||
25464, 31512, 25496, 26392, 25528, 30488, 25560, 28440, 25592, 32536, 25656, 28824, 25688, 26776, 25720, 30872,
|
||||
25784, 29848, 25816, 27800, 25848, 31896, 25912, 29336, 25944, 27288, 25976, 31384, 26008, 26264, 26040, 30360,
|
||||
26072, 28312, 26104, 32408, 26168, 29080, 26200, 27032, 26232, 31128, 26296, 30104, 26328, 28056, 26360, 32152,
|
||||
26424, 29592, 26456, 27544, 26488, 31640, 26552, 30616, 26584, 28568, 26616, 32664, 26680, 28760, 26744, 30808,
|
||||
26808, 29784, 26840, 27736, 26872, 31832, 26936, 29272, 26968, 27224, 27000, 31320, 27064, 30296, 27096, 28248,
|
||||
27128, 32344, 27192, 29016, 27256, 31064, 27320, 30040, 27352, 27992, 27384, 32088, 27448, 29528, 27512, 31576,
|
||||
27576, 30552, 27608, 28504, 27640, 32600, 27704, 28888, 27768, 30936, 27832, 29912, 27896, 31960, 27960, 29400,
|
||||
28024, 31448, 28088, 30424, 28120, 28376, 28152, 32472, 28216, 29144, 28280, 31192, 28344, 30168, 28408, 32216,
|
||||
28472, 29656, 28536, 31704, 28600, 30680, 28664, 32728, 28792, 30776, 28856, 29752, 28920, 31800, 28984, 29240,
|
||||
29048, 31288, 29112, 30264, 29176, 32312, 29304, 31032, 29368, 30008, 29432, 32056, 29560, 31544, 29624, 30520,
|
||||
29688, 32568, 29816, 30904, 29944, 31928, 30072, 31416, 30136, 30392, 30200, 32440, 30328, 31160, 30456, 32184,
|
||||
30584, 31672, 30712, 32696, 30968, 31864, 31096, 31352, 31224, 32376, 31480, 32120, 31736, 32632, 32248, 32504,
|
||||
};
|
||||
|
||||
void dsps_fft2r_rev_tables_init_fc32(void)
|
||||
{
|
||||
dsps_fft2r_rev_tables_fc32[0] = (uint16_t *)bitrev2r_table_16_fc32;
|
||||
dsps_fft2r_rev_tables_fc32[1] = (uint16_t *)bitrev2r_table_32_fc32;
|
||||
dsps_fft2r_rev_tables_fc32[2] = (uint16_t *)bitrev2r_table_64_fc32;
|
||||
dsps_fft2r_rev_tables_fc32[3] = (uint16_t *)bitrev2r_table_128_fc32;
|
||||
dsps_fft2r_rev_tables_fc32[4] = (uint16_t *)bitrev2r_table_256_fc32;
|
||||
dsps_fft2r_rev_tables_fc32[5] = (uint16_t *)bitrev2r_table_512_fc32;
|
||||
dsps_fft2r_rev_tables_fc32[6] = (uint16_t *)bitrev2r_table_1024_fc32;
|
||||
dsps_fft2r_rev_tables_fc32[7] = (uint16_t *)bitrev2r_table_2048_fc32;
|
||||
dsps_fft2r_rev_tables_fc32[8] = (uint16_t *)bitrev2r_table_4096_fc32;
|
||||
|
||||
}
|
||||
|
||||
uint16_t *dsps_fft2r_rev_tables_fc32[] = {
|
||||
(uint16_t *)bitrev2r_table_16_fc32,
|
||||
(uint16_t *)bitrev2r_table_32_fc32,
|
||||
(uint16_t *)bitrev2r_table_64_fc32,
|
||||
(uint16_t *)bitrev2r_table_128_fc32,
|
||||
(uint16_t *)bitrev2r_table_256_fc32,
|
||||
(uint16_t *)bitrev2r_table_512_fc32,
|
||||
(uint16_t *)bitrev2r_table_1024_fc32,
|
||||
(uint16_t *)bitrev2r_table_2048_fc32,
|
||||
(uint16_t *)bitrev2r_table_4096_fc32,
|
||||
};
|
||||
|
||||
const uint16_t bitrev2r_table_16_fc32_size = 6;
|
||||
const uint16_t bitrev2r_table_32_fc32_size = 12;
|
||||
const uint16_t bitrev2r_table_64_fc32_size = 28;
|
||||
const uint16_t bitrev2r_table_128_fc32_size = 56;
|
||||
const uint16_t bitrev2r_table_256_fc32_size = 120;
|
||||
const uint16_t bitrev2r_table_512_fc32_size = 240;
|
||||
const uint16_t bitrev2r_table_1024_fc32_size = 496;
|
||||
const uint16_t bitrev2r_table_2048_fc32_size = 992;
|
||||
const uint16_t bitrev2r_table_4096_fc32_size = 2016;
|
||||
|
||||
const uint16_t dsps_fft2r_rev_tables_fc32_size[] = {
|
||||
(const uint16_t)6, // bitrev2r_table_16_fc32_size,
|
||||
(const uint16_t)12, // bitrev2r_table_32_fc32_size,
|
||||
(const uint16_t)28, // bitrev2r_table_64_fc32_size,
|
||||
(const uint16_t)56, // bitrev2r_table_128_fc32_size,
|
||||
(const uint16_t)120, // bitrev2r_table_256_fc32_size,
|
||||
(const uint16_t)240, // bitrev2r_table_512_fc32_size,
|
||||
(const uint16_t)496, // bitrev2r_table_1024_fc32_size,
|
||||
(const uint16_t)992, // bitrev2r_table_2048_fc32_size,
|
||||
(const uint16_t)2016,// bitrev2r_table_4096_fc32_size,
|
||||
};
|
||||
@@ -0,0 +1,63 @@
|
||||
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include "dsps_fft2r.h"
|
||||
#include "dsp_common.h"
|
||||
#include "dsp_types.h"
|
||||
#include <math.h>
|
||||
#include "esp_attr.h"
|
||||
#include "dsps_fft2r_platform.h"
|
||||
|
||||
#if (dsps_bit_rev_lookup_fc32_ae32_enabled == 1)
|
||||
|
||||
esp_err_t dsps_bit_rev_lookup_fc32_ae32(float *data, int reverse_size, uint16_t *reverse_tab)
|
||||
{
|
||||
int idx_0, idx_1;
|
||||
int idx_2, idx_3;
|
||||
|
||||
float *data_i;
|
||||
|
||||
asm volatile ("addi %0, %1, 4" : "=a" (data_i) : "a" (data)); ///data_i = &data[1];
|
||||
asm volatile ("srli %0, %0, 1" : "+a" (reverse_size)); /// reverse_size >>= 1;
|
||||
asm volatile ("loopnez %0, __loop_end_radix2_reorder_lookup_table" :: "a" (reverse_size)); ///for (i = 0; i < reverse_size; i++) {
|
||||
asm volatile ("l16ui %0, %1, 0" : "=a" (idx_0) : "a" (reverse_tab)); //idx_0 = *(reverse_tab + 0); ///idx_0 = reverse_tab[i * 2 + 0];
|
||||
asm volatile ("l16ui %0, %1, 2" : "=a" (idx_1) : "a" (reverse_tab)); //idx_1 = *(reverse_tab + 1); ///idx_1 = reverse_tab[i * 2 + 1];
|
||||
asm volatile ("l16ui %0, %1, 4" : "=a" (idx_2) : "a" (reverse_tab)); //idx_2 = *(reverse_tab + 2); ///idx_2 = reverse_tab[i * 2 + 2];
|
||||
asm volatile ("l16ui %0, %1, 6" : "=a" (idx_3) : "a" (reverse_tab)); //idx_3 = *(reverse_tab + 3); ///idx_3 = reverse_tab[i * 2 + 3];
|
||||
asm volatile ("addi %0, %0, 8" : "+a" (reverse_tab)); // reverse_tab += 4;
|
||||
|
||||
asm volatile ("lsx f0, %0, %1" :: "a" (data), "a" (idx_0)); // f0 = *(data + idx_0); //f0 = data[idx_0 + 0];
|
||||
asm volatile ("lsx f2, %0, %1" :: "a" (data_i), "a" (idx_0)); // f2 = *(data_i + idx_0); //f2 = data[idx_0 + 1];
|
||||
asm volatile ("lsx f1, %0, %1" :: "a" (data), "a" (idx_1)); //f1 = *(data + idx_1); //f1 = data[idx_1 + 0];
|
||||
asm volatile ("lsx f3, %0, %1" :: "a" (data_i), "a" (idx_1)); //f3 = *(data_i + idx_1); //f3 = data[idx_1 + 1];
|
||||
|
||||
asm volatile ("ssx f0, %0, %1" :: "a" (data), "a" (idx_1)); //*(data + idx_1) = f0; //data[idx_1 + 0] = f0;
|
||||
asm volatile ("ssx f2, %0, %1" :: "a" (data_i), "a" (idx_1)); //*(data_i + idx_1) = f2; //data[idx_1 + 1] = f2;
|
||||
asm volatile ("ssx f1, %0, %1" :: "a" (data), "a" (idx_0)); //*(data + idx_0) = f1; //data[idx_0 + 0] = f1;
|
||||
asm volatile ("ssx f3, %0, %1" :: "a" (data_i), "a" (idx_0)); //*(data_i + idx_0) = f3;//data[idx_0 + 1] = f3;
|
||||
|
||||
asm volatile ("lsx f0, %0, %1" :: "a" (data), "a" (idx_2)); // f0 = *(data + idx_2); //f0 = data[idx_2 + 0];
|
||||
asm volatile ("lsx f2, %0, %1" :: "a" (data_i), "a" (idx_2)); // f2 = *(data_i + idx_2); //f2 = data[idx_2 + 1];
|
||||
asm volatile ("lsx f1, %0, %1" :: "a" (data), "a" (idx_3)); //f1 = *(data + idx_3); //f1 = data[idx_3 + 0];
|
||||
asm volatile ("lsx f3, %0, %1" :: "a" (data_i), "a" (idx_3)); //f3 = *(data_i + idx_3); //f3 = data[idx_3 + 1];
|
||||
|
||||
asm volatile ("ssx f0, %0, %1" :: "a" (data), "a" (idx_3)); //*(data + idx_3) = f0; //data[idx_3 + 0] = f0;
|
||||
asm volatile ("ssx f2, %0, %1" :: "a" (data_i), "a" (idx_3)); //*(data_i + idx_3) = f2; //data[idx_3 + 1] = f2;
|
||||
asm volatile ("ssx f1, %0, %1" :: "a" (data), "a" (idx_2)); //*(data + idx_2) = f1; //data[idx_2 + 0] = f1;
|
||||
asm volatile ("ssx f3, %0, %1" :: "a" (data_i), "a" (idx_2)); //*(data_i + idx_2) = f3; //data[idx_2 + 1] = f3;
|
||||
//}
|
||||
asm volatile("__loop_end_radix2_reorder_lookup_table: nop");
|
||||
return ESP_OK;
|
||||
}
|
||||
#endif // dsps_bit_rev_lookup_fc32_ae32_enabled
|
||||
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2018-2025 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileContributor: 2024 f4lcOn @ Libera Chat IRC
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
|
||||
#include "dsps_fft2r_platform.h"
|
||||
#if (dsps_fft2r_fc32_ae32_enabled == 1)
|
||||
|
||||
.text
|
||||
.align 4
|
||||
.global dsps_fft2r_fc32_ae32_
|
||||
.type dsps_fft2r_fc32_ae32_,@function
|
||||
|
||||
// The function implements the following C code:
|
||||
//esp_err_t dsps_fft2r_fc32_ansi(float *data, int N)
|
||||
//{
|
||||
// float *w = dsps_fft_w_table_fc32;
|
||||
//
|
||||
// int ie, ia, m;
|
||||
// float re_temp, im_temp;
|
||||
// float c, s;
|
||||
// int N2 = N;
|
||||
// ie = 1;
|
||||
// for (int N2 = N/2; N2 > 0; N2 >>= 1) {
|
||||
// ia = 0;
|
||||
// for (int j = 0; j < ie; j++) {
|
||||
// c = w[2 * j];
|
||||
// s = w[2 * j + 1];
|
||||
// for (int i = 0; i < N2; i++) {
|
||||
// m = ia + N2;
|
||||
// re_temp = c * data[2 * m] + s * data[2 * m + 1];
|
||||
// im_temp = c * data[2 * m + 1] - s * data[2 * m];
|
||||
// data[2 * m] = data[2 * ia] - re_temp;
|
||||
// data[2 * m + 1] = data[2 * ia + 1] - im_temp;
|
||||
// data[2 * ia] = data[2 * ia] + re_temp;
|
||||
// data[2 * ia + 1] = data[2 * ia + 1] + im_temp;
|
||||
// ia++;
|
||||
// }
|
||||
// ia += N2;
|
||||
// }
|
||||
// ie <<= 1;
|
||||
// }
|
||||
// return result;
|
||||
//}
|
||||
|
||||
|
||||
dsps_fft2r_fc32_ae32_:
|
||||
//esp_err_t dsps_fft2r_fc32_ansi(float *data, int N, float* dsps_fft_w_table_fc32)
|
||||
|
||||
entry a1, 16
|
||||
|
||||
// Array increment for floating point data should be 4
|
||||
// data - a2
|
||||
// N - a3
|
||||
// dsps_fft_w_table_fc32 - a4
|
||||
|
||||
// a6 - k, main loop counter; N2 - for (int N2 = N/2; N2 > 0; N2 >>= 1)
|
||||
// a7 - ie
|
||||
// a8 - j
|
||||
// a10 - (j*2)<<2, or a10 - j<<3
|
||||
// f0 - c or w[2 * j]
|
||||
// f1 - s or w[2 * j + 1]
|
||||
// a11 - ia
|
||||
// a12 - m
|
||||
// a13 - ia pointer
|
||||
// a14 - m pointer
|
||||
// f6 - re_temp
|
||||
// f7 - im_temp
|
||||
|
||||
srli a6, a3, 1 // a6 = N2 = N/2
|
||||
movi.n a7, 1 // a7 - ie
|
||||
|
||||
.fft2r_l1:
|
||||
movi.n a8, 0 // a8 - j
|
||||
movi.n a11,0 // a11 = ia = 0;
|
||||
|
||||
.fft2r_l2: // loop for j, a8 - j
|
||||
addx8 a10, a8, a4 // a8 - shift for cos () -- c = w[2 * j]; -- pointer to cos
|
||||
lsi f0, a10, 0
|
||||
lsi f1, a10, 4
|
||||
|
||||
loopnez a6, .fft2r_l3
|
||||
add.n a12, a11, a6 // a12 = m = ia + N2
|
||||
addx8 a14, a12, a2 // a14 - pointer for m*2
|
||||
addx8 a13, a11, a2 // a13 - pointer for ia*2
|
||||
|
||||
lsi f4, a14, 0 // data[2 * m]
|
||||
mul.s f6, f0, f4 // re_temp = c * data[2 * m]
|
||||
lsi f5, a14, 4 // data[2 * m + 1]
|
||||
mul.s f7, f0, f5 // im_temp = c * data[2 * m + 1]
|
||||
|
||||
lsi f2, a13, 0 // data[2 * ia]
|
||||
madd.s f6, f1, f5 // re_temp += s * data[2 * m + 1];
|
||||
lsi f3, a13, 4 // data[2 * ia + 1]
|
||||
msub.s f7, f1, f4 // im_temp -= s * data[2 * m];
|
||||
|
||||
addi a11, a11, 1 // ia++
|
||||
|
||||
sub.s f8, f2, f6 // = data[2 * ia] - re_temp;
|
||||
add.s f10, f2, f6 // = data[2 * ia] + re_temp;
|
||||
sub.s f9, f3, f7 // = data[2 * ia + 1] - im_temp;
|
||||
add.s f11, f3, f7 // = data[2 * ia + 1] + im_temp;
|
||||
|
||||
ssi f8, a14, 0
|
||||
ssi f10, a13, 0
|
||||
ssi f9, a14, 4
|
||||
ssi f11, a13, 4
|
||||
.fft2r_l3:
|
||||
add.n a11, a11, a6
|
||||
|
||||
addi.n a8, a8, 1 // j++
|
||||
bne a8, a7, .fft2r_l2
|
||||
slli a7, a7, 1 // ie = ie<<1
|
||||
// main loop: for (int k = N/2; k > 0; k >>= 1)
|
||||
srli a6, a6, 1 // a6 = a6>>1
|
||||
bnez a6, .fft2r_l1 // Jump if > 0
|
||||
|
||||
movi.n a2, 0 // return status ESP_OK
|
||||
retw.n
|
||||
|
||||
#endif // dsps_fft2r_fc32_ae32_enabled
|
||||
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2018-2025 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileContributor: 2024 f4lcOn @ Libera Chat IRC
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include "dsps_fft2r_platform.h"
|
||||
#if (dsps_fft2r_fc32_aes3_enabled == 1)
|
||||
|
||||
.text
|
||||
.align 4
|
||||
.global dsps_fft2r_fc32_aes3_
|
||||
.type dsps_fft2r_fc32_aes3_,@function
|
||||
|
||||
// The function implements the following C code:
|
||||
//esp_err_t dsps_fft2r_fc32_ansi(float *data, int N)
|
||||
//{
|
||||
// float *w = dsps_fft_w_table_fc32;
|
||||
//
|
||||
// int ie, ia, m;
|
||||
// float re_temp, im_temp;
|
||||
// float c, s;
|
||||
// int N2 = N;
|
||||
// ie = 1;
|
||||
// for (int N2 = N/2; N2 > 0; N2 >>= 1) {
|
||||
// ia = 0;
|
||||
// for (int j = 0; j < ie; j++) {
|
||||
// c = w[2 * j];
|
||||
// s = w[2 * j + 1];
|
||||
// for (int i = 0; i < N2; i++) {
|
||||
// m = ia + N2;
|
||||
// re_temp = c * data[2 * m] + s * data[2 * m + 1];
|
||||
// im_temp = c * data[2 * m + 1] - s * data[2 * m];
|
||||
// data[2 * m] = data[2 * ia] - re_temp;
|
||||
// data[2 * m + 1] = data[2 * ia + 1] - im_temp;
|
||||
// data[2 * ia] = data[2 * ia] + re_temp;
|
||||
// data[2 * ia + 1] = data[2 * ia + 1] + im_temp;
|
||||
// ia++;
|
||||
// }
|
||||
// ia += N2;
|
||||
// }
|
||||
// ie <<= 1;
|
||||
// }
|
||||
// return result;
|
||||
//}
|
||||
|
||||
|
||||
dsps_fft2r_fc32_aes3_:
|
||||
//esp_err_t dsps_fft2r_fc32_ansi(float *data, int N, float* dsps_fft_w_table_fc32)
|
||||
|
||||
entry a1, 16
|
||||
|
||||
// Array increment for floating point data should be 4
|
||||
// data - a2
|
||||
// N - a3
|
||||
// dsps_fft_w_table_fc32 - a4
|
||||
|
||||
// a6 - k, main loop counter; N2 - for (int N2 = N/2; N2 > 0; N2 >>= 1)
|
||||
// a7 - ie
|
||||
// a8 - j
|
||||
// a10 - (j*2)<<2, or a10 - j<<3
|
||||
// f0 - c or w[2 * j]
|
||||
// f1 - s or w[2 * j + 1]
|
||||
// a11 - ia
|
||||
// a12 - m
|
||||
// a13 - ia pointer
|
||||
// a14 - m pointer
|
||||
// f6 - re_temp
|
||||
// f7 - im_temp
|
||||
|
||||
srli a6, a3, 1 // a6 = N2 = N/2
|
||||
movi.n a7, 1 // a7 - ie
|
||||
|
||||
.fft2r_l1:
|
||||
movi.n a8, 0 // a8 - j
|
||||
movi.n a11,0 // a11 = ia = 0;
|
||||
|
||||
.fft2r_l2: // loop for j, a8 - j
|
||||
addx8 a10, a8, a4 // a8 - shift for cos () -- c = w[2 * j]; -- pointer to cos
|
||||
ee.ldf.64.ip f1, f0, a10, 0
|
||||
add.n a12, a11, a6 // a12 = m = ia + N2
|
||||
addx8 a14, a12, a2 // a14 - pointer for m*2
|
||||
|
||||
loopnez a6, .fft2r_l3
|
||||
ee.ldf.64.ip f5, f4, a14, 0 // data[2 * m], data[2 * m + 1]
|
||||
mul.s f6, f0, f4 // re_temp = c * data[2 * m]
|
||||
mul.s f7, f0, f5 // im_temp = c * data[2 * m + 1]
|
||||
|
||||
addx8 a13, a11, a2 // a13 - pointer for ia*2
|
||||
ee.ldf.64.ip f3, f2, a13, 0 // data[2 * ia], data[2 * ia + 1]
|
||||
|
||||
madd.s f6, f1, f5 // re_temp += s * data[2 * m + 1];
|
||||
msub.s f7, f1, f4 // im_temp -= s * data[2 * m];
|
||||
|
||||
addi a11, a11, 1 // ia++
|
||||
add.n a12, a11, a6 // a12 = m = ia + N2
|
||||
|
||||
sub.s f8, f2, f6 // = data[2 * ia] - re_temp;
|
||||
sub.s f9, f3, f7 // = data[2 * ia + 1] - im_temp;
|
||||
add.s f10, f2, f6 // = data[2 * ia] + re_temp;
|
||||
add.s f11, f3, f7 // = data[2 * ia + 1] + im_temp;
|
||||
|
||||
ee.stf.64.ip f9, f8, a14, 0
|
||||
addx8 a14, a12, a2 // a14 - pointer for m*2
|
||||
ee.stf.64.ip f11, f10, a13, 0
|
||||
.fft2r_l3:
|
||||
add.n a11, a11, a6
|
||||
|
||||
addi.n a8, a8, 1 // j++
|
||||
bne a8, a7, .fft2r_l2
|
||||
slli a7, a7, 1 // ie = ie<<1
|
||||
// main loop: for (int k = N/2; k > 0; k >>= 1)
|
||||
srli a6, a6, 1 // a6 = a6>>1
|
||||
bnez a6, .fft2r_l1 // Jump if > 0
|
||||
|
||||
movi.n a2, 0 // return status ESP_OK
|
||||
retw.n
|
||||
|
||||
#endif // dsps_fft2r_fc32_aes3_enabled
|
||||
@@ -0,0 +1,366 @@
|
||||
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include "dsps_fft2r.h"
|
||||
#include "dsp_common.h"
|
||||
#include "dsp_types.h"
|
||||
#include <math.h>
|
||||
#include "esp_attr.h"
|
||||
#include "esp_log.h"
|
||||
#include <string.h>
|
||||
#include <malloc.h>
|
||||
|
||||
|
||||
static const char *TAG = "fftr2_ansi";
|
||||
|
||||
float *dsps_fft_w_table_fc32;
|
||||
int dsps_fft_w_table_size;
|
||||
uint8_t dsps_fft2r_initialized = 0;
|
||||
uint8_t dsps_fft2r_mem_allocated = 0;
|
||||
|
||||
uint16_t *dsps_fft2r_ram_rev_table = NULL;
|
||||
|
||||
#ifdef CONFIG_IDF_TARGET_ESP32S3
|
||||
extern float *dsps_fft2r_w_table_fc32_1024;
|
||||
#endif // CONFIG_IDF_TARGET_ESP32S3
|
||||
|
||||
unsigned short reverse(unsigned short x, unsigned short N, int order);
|
||||
|
||||
esp_err_t dsps_fft2r_init_fc32(float *fft_table_buff, int table_size)
|
||||
{
|
||||
esp_err_t result = ESP_OK;
|
||||
if (dsps_fft2r_initialized != 0) {
|
||||
return result;
|
||||
}
|
||||
if (table_size > CONFIG_DSP_MAX_FFT_SIZE) {
|
||||
return ESP_ERR_DSP_PARAM_OUTOFRANGE;
|
||||
}
|
||||
if (table_size == 0) {
|
||||
return result;
|
||||
}
|
||||
if (fft_table_buff != NULL) {
|
||||
if (dsps_fft2r_mem_allocated) {
|
||||
return ESP_ERR_DSP_REINITIALIZED;
|
||||
}
|
||||
dsps_fft_w_table_fc32 = fft_table_buff;
|
||||
dsps_fft_w_table_size = table_size;
|
||||
} else {
|
||||
if (!dsps_fft2r_mem_allocated) {
|
||||
#if CONFIG_IDF_TARGET_ESP32S3
|
||||
if (table_size <= 1024) {
|
||||
dsps_fft_w_table_fc32 = dsps_fft2r_w_table_fc32_1024;
|
||||
} else {
|
||||
dsps_fft_w_table_fc32 = (float *)memalign(16, sizeof(float) * table_size);
|
||||
}
|
||||
#else
|
||||
dsps_fft_w_table_fc32 = (float *)malloc(table_size * sizeof(float));
|
||||
#endif
|
||||
if (dsps_fft_w_table_fc32 == NULL) {
|
||||
return ESP_ERR_DSP_PARAM_OUTOFRANGE;
|
||||
}
|
||||
}
|
||||
dsps_fft_w_table_size = table_size;
|
||||
dsps_fft2r_mem_allocated = 1;
|
||||
|
||||
}
|
||||
|
||||
// FFT ram_rev table allocated
|
||||
int pow = dsp_power_of_two(table_size);
|
||||
if ((pow > 3) && (pow < 13)) {
|
||||
dsps_fft2r_ram_rev_table = (uint16_t *)malloc(2 * dsps_fft2r_rev_tables_fc32_size[pow - 4] * sizeof(uint16_t));
|
||||
if (dsps_fft2r_ram_rev_table == NULL) {
|
||||
return ESP_ERR_DSP_PARAM_OUTOFRANGE;
|
||||
}
|
||||
memcpy(dsps_fft2r_ram_rev_table, dsps_fft2r_rev_tables_fc32[pow - 4], 2 * dsps_fft2r_rev_tables_fc32_size[pow - 4] * sizeof(uint16_t));
|
||||
dsps_fft2r_rev_tables_fc32[pow - 4] = dsps_fft2r_ram_rev_table;
|
||||
}
|
||||
|
||||
result = dsps_gen_w_r2_fc32(dsps_fft_w_table_fc32, dsps_fft_w_table_size);
|
||||
if (result != ESP_OK) {
|
||||
return result;
|
||||
}
|
||||
result = dsps_bit_rev_fc32_ansi(dsps_fft_w_table_fc32, dsps_fft_w_table_size >> 1);
|
||||
if (result != ESP_OK) {
|
||||
return result;
|
||||
}
|
||||
dsps_fft2r_initialized = 1;
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
void dsps_fft2r_deinit_fc32()
|
||||
{
|
||||
if (dsps_fft2r_mem_allocated) {
|
||||
#if CONFIG_IDF_TARGET_ESP32S3
|
||||
if (dsps_fft_w_table_fc32 != dsps_fft2r_w_table_fc32_1024) {
|
||||
free(dsps_fft_w_table_fc32);
|
||||
}
|
||||
#else
|
||||
free(dsps_fft_w_table_fc32);
|
||||
#endif
|
||||
}
|
||||
if (dsps_fft2r_ram_rev_table != NULL) {
|
||||
free(dsps_fft2r_ram_rev_table);
|
||||
dsps_fft2r_ram_rev_table = NULL;
|
||||
}
|
||||
// Re init bitrev table for next use
|
||||
dsps_fft2r_rev_tables_init_fc32();
|
||||
dsps_fft2r_mem_allocated = 0;
|
||||
dsps_fft2r_initialized = 0;
|
||||
}
|
||||
|
||||
esp_err_t dsps_fft2r_fc32_ansi_(float *data, int N, float *w)
|
||||
{
|
||||
if (!dsp_is_power_of_two(N)) {
|
||||
return ESP_ERR_DSP_INVALID_LENGTH;
|
||||
}
|
||||
if (!dsps_fft2r_initialized) {
|
||||
return ESP_ERR_DSP_UNINITIALIZED;
|
||||
}
|
||||
|
||||
esp_err_t result = ESP_OK;
|
||||
|
||||
int ie, ia, m;
|
||||
float re_temp, im_temp;
|
||||
float c, s;
|
||||
ie = 1;
|
||||
for (int N2 = N / 2; N2 > 0; N2 >>= 1) {
|
||||
ia = 0;
|
||||
for (int j = 0; j < ie; j++) {
|
||||
c = w[2 * j];
|
||||
s = w[2 * j + 1];
|
||||
for (int i = 0; i < N2; i++) {
|
||||
m = ia + N2;
|
||||
re_temp = c * data[2 * m] + s * data[2 * m + 1];
|
||||
im_temp = c * data[2 * m + 1] - s * data[2 * m];
|
||||
data[2 * m] = data[2 * ia] - re_temp;
|
||||
data[2 * m + 1] = data[2 * ia + 1] - im_temp;
|
||||
data[2 * ia] = data[2 * ia] + re_temp;
|
||||
data[2 * ia + 1] = data[2 * ia + 1] + im_temp;
|
||||
ia++;
|
||||
}
|
||||
ia += N2;
|
||||
}
|
||||
ie <<= 1;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
unsigned short reverse(unsigned short x, unsigned short N, int order)
|
||||
{
|
||||
unsigned short b = x;
|
||||
|
||||
b = (b & 0xff00) >> 8 | (b & 0x00fF) << 8;
|
||||
b = (b & 0xf0F0) >> 4 | (b & 0x0f0F) << 4;
|
||||
b = (b & 0xCCCC) >> 2 | (b & 0x3333) << 2;
|
||||
b = (b & 0xAAAA) >> 1 | (b & 0x5555) << 1;
|
||||
return b >> (16 - order);
|
||||
}
|
||||
|
||||
esp_err_t dsps_bit_rev_fc32_ansi(float *data, int N)
|
||||
{
|
||||
if (!dsp_is_power_of_two(N)) {
|
||||
return ESP_ERR_DSP_INVALID_LENGTH;
|
||||
}
|
||||
|
||||
esp_err_t result = ESP_OK;
|
||||
|
||||
int j, k;
|
||||
float r_temp, i_temp;
|
||||
j = 0;
|
||||
for (int i = 1; i < (N - 1); i++) {
|
||||
k = N >> 1;
|
||||
while (k <= j) {
|
||||
j -= k;
|
||||
k >>= 1;
|
||||
}
|
||||
j += k;
|
||||
if (i < j) {
|
||||
r_temp = data[j * 2];
|
||||
data[j * 2] = data[i * 2];
|
||||
data[i * 2] = r_temp;
|
||||
i_temp = data[j * 2 + 1];
|
||||
data[j * 2 + 1] = data[i * 2 + 1];
|
||||
data[i * 2 + 1] = i_temp;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
esp_err_t dsps_gen_w_r2_fc32(float *w, int N)
|
||||
{
|
||||
if (!dsp_is_power_of_two(N)) {
|
||||
return ESP_ERR_DSP_INVALID_LENGTH;
|
||||
}
|
||||
|
||||
esp_err_t result = ESP_OK;
|
||||
|
||||
int i;
|
||||
float e = M_PI * 2.0 / N;
|
||||
|
||||
for (i = 0; i < (N >> 1); i++) {
|
||||
w[2 * i] = cosf(i * e);
|
||||
w[2 * i + 1] = sinf(i * e);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
esp_err_t dsps_cplx2reC_fc32_ansi(float *data, int N)
|
||||
{
|
||||
if (!dsp_is_power_of_two(N)) {
|
||||
return ESP_ERR_DSP_INVALID_LENGTH;
|
||||
}
|
||||
esp_err_t result = ESP_OK;
|
||||
|
||||
int i;
|
||||
int n2 = N << 1;
|
||||
|
||||
float rkl = 0;
|
||||
float rkh = 0;
|
||||
float rnl = 0;
|
||||
float rnh = 0;
|
||||
float ikl = 0;
|
||||
float ikh = 0;
|
||||
float inl = 0;
|
||||
float inh = 0;
|
||||
|
||||
for (i = 0; i < (N / 4); i++) {
|
||||
rkl = data[i * 2 + 0 + 2];
|
||||
ikl = data[i * 2 + 1 + 2];
|
||||
rnl = data[n2 - i * 2 - 2];
|
||||
inl = data[n2 - i * 2 - 1];
|
||||
|
||||
rkh = data[i * 2 + 0 + 2 + N];
|
||||
ikh = data[i * 2 + 1 + 2 + N];
|
||||
rnh = data[n2 - i * 2 - 2 - N];
|
||||
inh = data[n2 - i * 2 - 1 - N];
|
||||
|
||||
data[i * 2 + 0 + 2] = rkl + rnl;
|
||||
data[i * 2 + 1 + 2] = ikl - inl;
|
||||
|
||||
data[n2 - i * 2 - 1 - N] = inh - ikh;
|
||||
data[n2 - i * 2 - 2 - N] = rkh + rnh;
|
||||
|
||||
data[i * 2 + 0 + 2 + N] = ikl + inl;
|
||||
data[i * 2 + 1 + 2 + N] = rnl - rkl;
|
||||
|
||||
data[n2 - i * 2 - 1] = rkh - rnh;
|
||||
data[n2 - i * 2 - 2] = ikh + inh;
|
||||
}
|
||||
data[N] = data[1];
|
||||
data[1] = 0;
|
||||
data[N + 1] = 0;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
esp_err_t dsps_gen_bitrev2r_table(int N, int step, char *name_ext)
|
||||
{
|
||||
if (!dsp_is_power_of_two(N)) {
|
||||
return ESP_ERR_DSP_INVALID_LENGTH;
|
||||
}
|
||||
|
||||
int j, k;
|
||||
j = 0;
|
||||
int items_count = 0;
|
||||
ESP_LOGD(TAG, "const uint16_t bitrev2r_table_%i_%s[] = { ", N, name_ext);
|
||||
for (int i = 1; i < (N - 1); i++) {
|
||||
k = N >> 1;
|
||||
while (k <= j) {
|
||||
j -= k;
|
||||
k >>= 1;
|
||||
}
|
||||
j += k;
|
||||
if (i < j) {
|
||||
ESP_LOGD(TAG, "%i, %i, ", i * step, j * step);
|
||||
items_count++;
|
||||
if ((items_count % 8) == 0) {
|
||||
ESP_LOGD(TAG, " ");
|
||||
}
|
||||
}
|
||||
}
|
||||
ESP_LOGD(TAG, "};");
|
||||
ESP_LOGD(TAG, "const uint16_t bitrev2r_table_%i_%s_size = %i;\n", N, name_ext, items_count);
|
||||
|
||||
ESP_LOGD(TAG, "extern const uint16_t bitrev2r_table_%i_%s[];", N, name_ext);
|
||||
ESP_LOGD(TAG, "extern const uint16_t bitrev2r_table_%i_%s_size;\n", N, name_ext);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t dsps_bit_rev2r_fc32(float *data, int N)
|
||||
{
|
||||
uint16_t *table;
|
||||
uint16_t table_size;
|
||||
switch (N) {
|
||||
case 16:
|
||||
table = (uint16_t *)dsps_fft2r_rev_tables_fc32[0];
|
||||
table_size = dsps_fft2r_rev_tables_fc32_size[0];
|
||||
break;
|
||||
case 32:
|
||||
table = (uint16_t *)dsps_fft2r_rev_tables_fc32[1];
|
||||
table_size = dsps_fft2r_rev_tables_fc32_size[1];
|
||||
break;
|
||||
case 64:
|
||||
table = (uint16_t *)dsps_fft2r_rev_tables_fc32[2];
|
||||
table_size = dsps_fft2r_rev_tables_fc32_size[2];
|
||||
break;
|
||||
case 128:
|
||||
table = (uint16_t *)dsps_fft2r_rev_tables_fc32[3];
|
||||
table_size = dsps_fft2r_rev_tables_fc32_size[3];
|
||||
break;
|
||||
case 256:
|
||||
table = (uint16_t *)dsps_fft2r_rev_tables_fc32[4];
|
||||
table_size = dsps_fft2r_rev_tables_fc32_size[4];
|
||||
break;
|
||||
case 512:
|
||||
table = (uint16_t *)dsps_fft2r_rev_tables_fc32[5];
|
||||
table_size = dsps_fft2r_rev_tables_fc32_size[5];
|
||||
break;
|
||||
case 1024:
|
||||
table = (uint16_t *)dsps_fft2r_rev_tables_fc32[6];
|
||||
table_size = dsps_fft2r_rev_tables_fc32_size[6];
|
||||
break;
|
||||
case 2048:
|
||||
table = (uint16_t *)dsps_fft2r_rev_tables_fc32[7];
|
||||
table_size = dsps_fft2r_rev_tables_fc32_size[7];
|
||||
break;
|
||||
case 4096:
|
||||
table = (uint16_t *)dsps_fft2r_rev_tables_fc32[8];
|
||||
table_size = dsps_fft2r_rev_tables_fc32_size[8];
|
||||
break;
|
||||
|
||||
default:
|
||||
return dsps_bit_rev_fc32(data, N);
|
||||
break;
|
||||
}
|
||||
return dsps_bit_rev_lookup_fc32(data, table_size, table);
|
||||
}
|
||||
|
||||
esp_err_t dsps_bit_rev_lookup_fc32_ansi(float *data, int reverse_size, uint16_t *reverse_tab)
|
||||
{
|
||||
float r_temp, i_temp;
|
||||
for (int n = 0 ; n < reverse_size ; n++) {
|
||||
uint16_t i = reverse_tab[n * 2 + 0] >> 2;
|
||||
uint16_t j = reverse_tab[n * 2 + 1] >> 2;
|
||||
r_temp = data[j];
|
||||
data[j] = data[i];
|
||||
data[i] = r_temp;
|
||||
i_temp = data[j + 1];
|
||||
data[j + 1] = data[i + 1];
|
||||
data[i + 1] = i_temp;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
// Copyright 2024 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include "dsps_fft2r_platform.h"
|
||||
|
||||
#if (dsps_fft2r_fc32_arp4_enabled == 1)
|
||||
|
||||
// This is matrix multipliction function for esp32p4 processor.
|
||||
.text
|
||||
.align 4
|
||||
.global dsps_fft2r_fc32_arp4_
|
||||
.type dsps_fft2r_fc32_arp4_,@function
|
||||
|
||||
dsps_fft2r_fc32_arp4_:
|
||||
//esp_err_t dsps_fft2r_fc32_arp4_(float *data, int N, float* dsps_fft_w_table_fc32)
|
||||
|
||||
add sp,sp,-16
|
||||
#
|
||||
srli t6, a1, 1 // a6 = N2 = N/2
|
||||
li t0, 1 // a7 - ie
|
||||
|
||||
.fft2r_l1:
|
||||
li t1, 0 // a8 - j
|
||||
li t4, 0 // a11 = ia = 0;
|
||||
|
||||
.fft2r_l2: // loop for j, a8 - j
|
||||
|
||||
slli t3, t1, 3 // a10 = j<<3 // shift for cos () -- c = w[2 * j];
|
||||
add t3, t3, a2 // a10 - pointer to cos
|
||||
flw fa0, 0(t3)
|
||||
flw fa1, 4(t3)
|
||||
|
||||
esp.lp.setup 0, t6, .fft2r_l3 // .fft2r_l3 - label to the last executed instruction
|
||||
add t5, t4, t6 // a12 = m = ia + N2
|
||||
|
||||
slli a4, t5, 3 // a14 - pointer for m*2
|
||||
slli a3, t4, 3 // a13 - pointer for ia*2
|
||||
add a4, a4, a0 // pointers to data arrays
|
||||
add a3, a3, a0 //
|
||||
|
||||
flw fa4, 0(a4)
|
||||
flw fa5, 4(a4)
|
||||
flw fa2, 0(a3)
|
||||
flw fa3, 4(a3)
|
||||
|
||||
fmul.s ft6, fa0, fa4 // re_temp = c * data[2 * m]
|
||||
fmul.s ft7, fa0, fa5 // im_temp = c * data[2 * m + 1]
|
||||
fmadd.s ft6, fa1, fa5, ft6 // re_temp += s * data[2 * m + 1];
|
||||
fnmsub.s ft7, fa1, fa4, ft7 // im_temp -= s * data[2 * m];
|
||||
fsub.s ft8, fa2, ft6 // = data[2 * ia] - re_temp;
|
||||
fsub.s ft9, fa3, ft7 // = data[2 * ia + 1] - im_temp;
|
||||
|
||||
fadd.s ft10, fa2, ft6 // = data[2 * ia] + re_temp;
|
||||
fadd.s ft11, fa3, ft7 // = data[2 * ia + 1] + im_temp;
|
||||
|
||||
fsw ft8, 0(a4)
|
||||
fsw ft9, 4(a4)
|
||||
fsw ft10, 0(a3)
|
||||
fsw ft11, 4(a3)
|
||||
|
||||
.fft2r_l3: add t4, t4, 1 // ia++
|
||||
|
||||
add t4, t4, t6
|
||||
add t1, t1, 1 // j++
|
||||
|
||||
BNE t1, t0, .fft2r_l2
|
||||
slli t0, t0, 1 // ie = ie<<1
|
||||
srli t6, t6, 1 // a6 = a6>>1
|
||||
BNEZ t6, .fft2r_l1// Jump if > 0
|
||||
|
||||
#
|
||||
add sp,sp,16
|
||||
li a0,0
|
||||
ret
|
||||
|
||||
#endif // dsps_fft2r_fc32_arp4_enabled
|
||||
@@ -0,0 +1,407 @@
|
||||
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
|
||||
#include <stdint.h>
|
||||
#include "dsps_fft_tables.h"
|
||||
|
||||
|
||||
const uint16_t bitrev4r_table_16_fc32[] = {
|
||||
8, 32, 16, 64, 24, 96, 48, 72, 56, 104, 88, 112,
|
||||
};
|
||||
extern const uint16_t bitrev4r_table_16_fc32[];
|
||||
extern const uint16_t bitrev4r_table_16_fc32_size;
|
||||
|
||||
const uint16_t bitrev4r_table_64_fc32[] = {
|
||||
8, 128, 16, 256, 24, 384, 40, 160, 48, 288, 56, 416, 72, 192, 80, 320,
|
||||
88, 448, 104, 224, 112, 352, 120, 480, 144, 264, 152, 392, 176, 296, 184, 424,
|
||||
208, 328, 216, 456, 240, 360, 248, 488, 280, 400, 312, 432, 344, 464, 376, 496,
|
||||
};
|
||||
extern const uint16_t bitrev4r_table_64_fc32[];
|
||||
extern const uint16_t bitrev4r_table_64_fc32_size;
|
||||
|
||||
const uint16_t bitrev4r_table_256_fc32[] = {
|
||||
8, 512, 16, 1024, 24, 1536, 32, 128, 40, 640, 48, 1152, 56, 1664, 64, 256,
|
||||
72, 768, 80, 1280, 88, 1792, 96, 384, 104, 896, 112, 1408, 120, 1920, 136, 544,
|
||||
144, 1056, 152, 1568, 168, 672, 176, 1184, 184, 1696, 192, 288, 200, 800, 208, 1312,
|
||||
216, 1824, 224, 416, 232, 928, 240, 1440, 248, 1952, 264, 576, 272, 1088, 280, 1600,
|
||||
296, 704, 304, 1216, 312, 1728, 328, 832, 336, 1344, 344, 1856, 352, 448, 360, 960,
|
||||
368, 1472, 376, 1984, 392, 608, 400, 1120, 408, 1632, 424, 736, 432, 1248, 440, 1760,
|
||||
456, 864, 464, 1376, 472, 1888, 488, 992, 496, 1504, 504, 2016, 528, 1032, 536, 1544,
|
||||
552, 648, 560, 1160, 568, 1672, 584, 776, 592, 1288, 600, 1800, 616, 904, 624, 1416,
|
||||
632, 1928, 656, 1064, 664, 1576, 688, 1192, 696, 1704, 712, 808, 720, 1320, 728, 1832,
|
||||
744, 936, 752, 1448, 760, 1960, 784, 1096, 792, 1608, 816, 1224, 824, 1736, 848, 1352,
|
||||
856, 1864, 872, 968, 880, 1480, 888, 1992, 912, 1128, 920, 1640, 944, 1256, 952, 1768,
|
||||
976, 1384, 984, 1896, 1008, 1512, 1016, 2024, 1048, 1552, 1072, 1168, 1080, 1680, 1104, 1296,
|
||||
1112, 1808, 1136, 1424, 1144, 1936, 1176, 1584, 1208, 1712, 1232, 1328, 1240, 1840, 1264, 1456,
|
||||
1272, 1968, 1304, 1616, 1336, 1744, 1368, 1872, 1392, 1488, 1400, 2000, 1432, 1648, 1464, 1776,
|
||||
1496, 1904, 1528, 2032, 1592, 1688, 1624, 1816, 1656, 1944, 1752, 1848, 1784, 1976, 1912, 2008,
|
||||
};
|
||||
extern const uint16_t bitrev4r_table_256_fc32[];
|
||||
extern const uint16_t bitrev4r_table_256_fc32_size;
|
||||
|
||||
const uint16_t bitrev4r_table_1024_fc32[] = {
|
||||
8, 2048, 16, 4096, 24, 6144, 32, 512, 40, 2560, 48, 4608, 56, 6656, 64, 1024,
|
||||
72, 3072, 80, 5120, 88, 7168, 96, 1536, 104, 3584, 112, 5632, 120, 7680, 136, 2176,
|
||||
144, 4224, 152, 6272, 160, 640, 168, 2688, 176, 4736, 184, 6784, 192, 1152, 200, 3200,
|
||||
208, 5248, 216, 7296, 224, 1664, 232, 3712, 240, 5760, 248, 7808, 264, 2304, 272, 4352,
|
||||
280, 6400, 288, 768, 296, 2816, 304, 4864, 312, 6912, 320, 1280, 328, 3328, 336, 5376,
|
||||
344, 7424, 352, 1792, 360, 3840, 368, 5888, 376, 7936, 392, 2432, 400, 4480, 408, 6528,
|
||||
416, 896, 424, 2944, 432, 4992, 440, 7040, 448, 1408, 456, 3456, 464, 5504, 472, 7552,
|
||||
480, 1920, 488, 3968, 496, 6016, 504, 8064, 520, 2080, 528, 4128, 536, 6176, 552, 2592,
|
||||
560, 4640, 568, 6688, 576, 1056, 584, 3104, 592, 5152, 600, 7200, 608, 1568, 616, 3616,
|
||||
624, 5664, 632, 7712, 648, 2208, 656, 4256, 664, 6304, 680, 2720, 688, 4768, 696, 6816,
|
||||
704, 1184, 712, 3232, 720, 5280, 728, 7328, 736, 1696, 744, 3744, 752, 5792, 760, 7840,
|
||||
776, 2336, 784, 4384, 792, 6432, 808, 2848, 816, 4896, 824, 6944, 832, 1312, 840, 3360,
|
||||
848, 5408, 856, 7456, 864, 1824, 872, 3872, 880, 5920, 888, 7968, 904, 2464, 912, 4512,
|
||||
920, 6560, 936, 2976, 944, 5024, 952, 7072, 960, 1440, 968, 3488, 976, 5536, 984, 7584,
|
||||
992, 1952, 1000, 4000, 1008, 6048, 1016, 8096, 1032, 2112, 1040, 4160, 1048, 6208, 1064, 2624,
|
||||
1072, 4672, 1080, 6720, 1096, 3136, 1104, 5184, 1112, 7232, 1120, 1600, 1128, 3648, 1136, 5696,
|
||||
1144, 7744, 1160, 2240, 1168, 4288, 1176, 6336, 1192, 2752, 1200, 4800, 1208, 6848, 1224, 3264,
|
||||
1232, 5312, 1240, 7360, 1248, 1728, 1256, 3776, 1264, 5824, 1272, 7872, 1288, 2368, 1296, 4416,
|
||||
1304, 6464, 1320, 2880, 1328, 4928, 1336, 6976, 1352, 3392, 1360, 5440, 1368, 7488, 1376, 1856,
|
||||
1384, 3904, 1392, 5952, 1400, 8000, 1416, 2496, 1424, 4544, 1432, 6592, 1448, 3008, 1456, 5056,
|
||||
1464, 7104, 1480, 3520, 1488, 5568, 1496, 7616, 1504, 1984, 1512, 4032, 1520, 6080, 1528, 8128,
|
||||
1544, 2144, 1552, 4192, 1560, 6240, 1576, 2656, 1584, 4704, 1592, 6752, 1608, 3168, 1616, 5216,
|
||||
1624, 7264, 1640, 3680, 1648, 5728, 1656, 7776, 1672, 2272, 1680, 4320, 1688, 6368, 1704, 2784,
|
||||
1712, 4832, 1720, 6880, 1736, 3296, 1744, 5344, 1752, 7392, 1768, 3808, 1776, 5856, 1784, 7904,
|
||||
1800, 2400, 1808, 4448, 1816, 6496, 1832, 2912, 1840, 4960, 1848, 7008, 1864, 3424, 1872, 5472,
|
||||
1880, 7520, 1896, 3936, 1904, 5984, 1912, 8032, 1928, 2528, 1936, 4576, 1944, 6624, 1960, 3040,
|
||||
1968, 5088, 1976, 7136, 1992, 3552, 2000, 5600, 2008, 7648, 2024, 4064, 2032, 6112, 2040, 8160,
|
||||
2064, 4104, 2072, 6152, 2088, 2568, 2096, 4616, 2104, 6664, 2120, 3080, 2128, 5128, 2136, 7176,
|
||||
2152, 3592, 2160, 5640, 2168, 7688, 2192, 4232, 2200, 6280, 2216, 2696, 2224, 4744, 2232, 6792,
|
||||
2248, 3208, 2256, 5256, 2264, 7304, 2280, 3720, 2288, 5768, 2296, 7816, 2320, 4360, 2328, 6408,
|
||||
2344, 2824, 2352, 4872, 2360, 6920, 2376, 3336, 2384, 5384, 2392, 7432, 2408, 3848, 2416, 5896,
|
||||
2424, 7944, 2448, 4488, 2456, 6536, 2472, 2952, 2480, 5000, 2488, 7048, 2504, 3464, 2512, 5512,
|
||||
2520, 7560, 2536, 3976, 2544, 6024, 2552, 8072, 2576, 4136, 2584, 6184, 2608, 4648, 2616, 6696,
|
||||
2632, 3112, 2640, 5160, 2648, 7208, 2664, 3624, 2672, 5672, 2680, 7720, 2704, 4264, 2712, 6312,
|
||||
2736, 4776, 2744, 6824, 2760, 3240, 2768, 5288, 2776, 7336, 2792, 3752, 2800, 5800, 2808, 7848,
|
||||
2832, 4392, 2840, 6440, 2864, 4904, 2872, 6952, 2888, 3368, 2896, 5416, 2904, 7464, 2920, 3880,
|
||||
2928, 5928, 2936, 7976, 2960, 4520, 2968, 6568, 2992, 5032, 3000, 7080, 3016, 3496, 3024, 5544,
|
||||
3032, 7592, 3048, 4008, 3056, 6056, 3064, 8104, 3088, 4168, 3096, 6216, 3120, 4680, 3128, 6728,
|
||||
3152, 5192, 3160, 7240, 3176, 3656, 3184, 5704, 3192, 7752, 3216, 4296, 3224, 6344, 3248, 4808,
|
||||
3256, 6856, 3280, 5320, 3288, 7368, 3304, 3784, 3312, 5832, 3320, 7880, 3344, 4424, 3352, 6472,
|
||||
3376, 4936, 3384, 6984, 3408, 5448, 3416, 7496, 3432, 3912, 3440, 5960, 3448, 8008, 3472, 4552,
|
||||
3480, 6600, 3504, 5064, 3512, 7112, 3536, 5576, 3544, 7624, 3560, 4040, 3568, 6088, 3576, 8136,
|
||||
3600, 4200, 3608, 6248, 3632, 4712, 3640, 6760, 3664, 5224, 3672, 7272, 3696, 5736, 3704, 7784,
|
||||
3728, 4328, 3736, 6376, 3760, 4840, 3768, 6888, 3792, 5352, 3800, 7400, 3824, 5864, 3832, 7912,
|
||||
3856, 4456, 3864, 6504, 3888, 4968, 3896, 7016, 3920, 5480, 3928, 7528, 3952, 5992, 3960, 8040,
|
||||
3984, 4584, 3992, 6632, 4016, 5096, 4024, 7144, 4048, 5608, 4056, 7656, 4080, 6120, 4088, 8168,
|
||||
4120, 6160, 4144, 4624, 4152, 6672, 4176, 5136, 4184, 7184, 4208, 5648, 4216, 7696, 4248, 6288,
|
||||
4272, 4752, 4280, 6800, 4304, 5264, 4312, 7312, 4336, 5776, 4344, 7824, 4376, 6416, 4400, 4880,
|
||||
4408, 6928, 4432, 5392, 4440, 7440, 4464, 5904, 4472, 7952, 4504, 6544, 4528, 5008, 4536, 7056,
|
||||
4560, 5520, 4568, 7568, 4592, 6032, 4600, 8080, 4632, 6192, 4664, 6704, 4688, 5168, 4696, 7216,
|
||||
4720, 5680, 4728, 7728, 4760, 6320, 4792, 6832, 4816, 5296, 4824, 7344, 4848, 5808, 4856, 7856,
|
||||
4888, 6448, 4920, 6960, 4944, 5424, 4952, 7472, 4976, 5936, 4984, 7984, 5016, 6576, 5048, 7088,
|
||||
5072, 5552, 5080, 7600, 5104, 6064, 5112, 8112, 5144, 6224, 5176, 6736, 5208, 7248, 5232, 5712,
|
||||
5240, 7760, 5272, 6352, 5304, 6864, 5336, 7376, 5360, 5840, 5368, 7888, 5400, 6480, 5432, 6992,
|
||||
5464, 7504, 5488, 5968, 5496, 8016, 5528, 6608, 5560, 7120, 5592, 7632, 5616, 6096, 5624, 8144,
|
||||
5656, 6256, 5688, 6768, 5720, 7280, 5752, 7792, 5784, 6384, 5816, 6896, 5848, 7408, 5880, 7920,
|
||||
5912, 6512, 5944, 7024, 5976, 7536, 6008, 8048, 6040, 6640, 6072, 7152, 6104, 7664, 6136, 8176,
|
||||
6200, 6680, 6232, 7192, 6264, 7704, 6328, 6808, 6360, 7320, 6392, 7832, 6456, 6936, 6488, 7448,
|
||||
6520, 7960, 6584, 7064, 6616, 7576, 6648, 8088, 6744, 7224, 6776, 7736, 6872, 7352, 6904, 7864,
|
||||
7000, 7480, 7032, 7992, 7128, 7608, 7160, 8120, 7288, 7768, 7416, 7896, 7544, 8024, 7672, 8152,
|
||||
};
|
||||
extern const uint16_t bitrev4r_table_1024_fc32[];
|
||||
extern const uint16_t bitrev4r_table_1024_fc32_size;
|
||||
|
||||
const uint16_t bitrev4r_table_4096_fc32[] = {
|
||||
8, 8192, 16, 16384, 24, 24576, 32, 2048, 40, 10240, 48, 18432, 56, 26624, 64, 4096,
|
||||
72, 12288, 80, 20480, 88, 28672, 96, 6144, 104, 14336, 112, 22528, 120, 30720, 128, 512,
|
||||
136, 8704, 144, 16896, 152, 25088, 160, 2560, 168, 10752, 176, 18944, 184, 27136, 192, 4608,
|
||||
200, 12800, 208, 20992, 216, 29184, 224, 6656, 232, 14848, 240, 23040, 248, 31232, 256, 1024,
|
||||
264, 9216, 272, 17408, 280, 25600, 288, 3072, 296, 11264, 304, 19456, 312, 27648, 320, 5120,
|
||||
328, 13312, 336, 21504, 344, 29696, 352, 7168, 360, 15360, 368, 23552, 376, 31744, 384, 1536,
|
||||
392, 9728, 400, 17920, 408, 26112, 416, 3584, 424, 11776, 432, 19968, 440, 28160, 448, 5632,
|
||||
456, 13824, 464, 22016, 472, 30208, 480, 7680, 488, 15872, 496, 24064, 504, 32256, 520, 8320,
|
||||
528, 16512, 536, 24704, 544, 2176, 552, 10368, 560, 18560, 568, 26752, 576, 4224, 584, 12416,
|
||||
592, 20608, 600, 28800, 608, 6272, 616, 14464, 624, 22656, 632, 30848, 648, 8832, 656, 17024,
|
||||
664, 25216, 672, 2688, 680, 10880, 688, 19072, 696, 27264, 704, 4736, 712, 12928, 720, 21120,
|
||||
728, 29312, 736, 6784, 744, 14976, 752, 23168, 760, 31360, 768, 1152, 776, 9344, 784, 17536,
|
||||
792, 25728, 800, 3200, 808, 11392, 816, 19584, 824, 27776, 832, 5248, 840, 13440, 848, 21632,
|
||||
856, 29824, 864, 7296, 872, 15488, 880, 23680, 888, 31872, 896, 1664, 904, 9856, 912, 18048,
|
||||
920, 26240, 928, 3712, 936, 11904, 944, 20096, 952, 28288, 960, 5760, 968, 13952, 976, 22144,
|
||||
984, 30336, 992, 7808, 1000, 16000, 1008, 24192, 1016, 32384, 1032, 8448, 1040, 16640, 1048, 24832,
|
||||
1056, 2304, 1064, 10496, 1072, 18688, 1080, 26880, 1088, 4352, 1096, 12544, 1104, 20736, 1112, 28928,
|
||||
1120, 6400, 1128, 14592, 1136, 22784, 1144, 30976, 1160, 8960, 1168, 17152, 1176, 25344, 1184, 2816,
|
||||
1192, 11008, 1200, 19200, 1208, 27392, 1216, 4864, 1224, 13056, 1232, 21248, 1240, 29440, 1248, 6912,
|
||||
1256, 15104, 1264, 23296, 1272, 31488, 1288, 9472, 1296, 17664, 1304, 25856, 1312, 3328, 1320, 11520,
|
||||
1328, 19712, 1336, 27904, 1344, 5376, 1352, 13568, 1360, 21760, 1368, 29952, 1376, 7424, 1384, 15616,
|
||||
1392, 23808, 1400, 32000, 1408, 1792, 1416, 9984, 1424, 18176, 1432, 26368, 1440, 3840, 1448, 12032,
|
||||
1456, 20224, 1464, 28416, 1472, 5888, 1480, 14080, 1488, 22272, 1496, 30464, 1504, 7936, 1512, 16128,
|
||||
1520, 24320, 1528, 32512, 1544, 8576, 1552, 16768, 1560, 24960, 1568, 2432, 1576, 10624, 1584, 18816,
|
||||
1592, 27008, 1600, 4480, 1608, 12672, 1616, 20864, 1624, 29056, 1632, 6528, 1640, 14720, 1648, 22912,
|
||||
1656, 31104, 1672, 9088, 1680, 17280, 1688, 25472, 1696, 2944, 1704, 11136, 1712, 19328, 1720, 27520,
|
||||
1728, 4992, 1736, 13184, 1744, 21376, 1752, 29568, 1760, 7040, 1768, 15232, 1776, 23424, 1784, 31616,
|
||||
1800, 9600, 1808, 17792, 1816, 25984, 1824, 3456, 1832, 11648, 1840, 19840, 1848, 28032, 1856, 5504,
|
||||
1864, 13696, 1872, 21888, 1880, 30080, 1888, 7552, 1896, 15744, 1904, 23936, 1912, 32128, 1928, 10112,
|
||||
1936, 18304, 1944, 26496, 1952, 3968, 1960, 12160, 1968, 20352, 1976, 28544, 1984, 6016, 1992, 14208,
|
||||
2000, 22400, 2008, 30592, 2016, 8064, 2024, 16256, 2032, 24448, 2040, 32640, 2056, 8224, 2064, 16416,
|
||||
2072, 24608, 2088, 10272, 2096, 18464, 2104, 26656, 2112, 4128, 2120, 12320, 2128, 20512, 2136, 28704,
|
||||
2144, 6176, 2152, 14368, 2160, 22560, 2168, 30752, 2184, 8736, 2192, 16928, 2200, 25120, 2208, 2592,
|
||||
2216, 10784, 2224, 18976, 2232, 27168, 2240, 4640, 2248, 12832, 2256, 21024, 2264, 29216, 2272, 6688,
|
||||
2280, 14880, 2288, 23072, 2296, 31264, 2312, 9248, 2320, 17440, 2328, 25632, 2336, 3104, 2344, 11296,
|
||||
2352, 19488, 2360, 27680, 2368, 5152, 2376, 13344, 2384, 21536, 2392, 29728, 2400, 7200, 2408, 15392,
|
||||
2416, 23584, 2424, 31776, 2440, 9760, 2448, 17952, 2456, 26144, 2464, 3616, 2472, 11808, 2480, 20000,
|
||||
2488, 28192, 2496, 5664, 2504, 13856, 2512, 22048, 2520, 30240, 2528, 7712, 2536, 15904, 2544, 24096,
|
||||
2552, 32288, 2568, 8352, 2576, 16544, 2584, 24736, 2600, 10400, 2608, 18592, 2616, 26784, 2624, 4256,
|
||||
2632, 12448, 2640, 20640, 2648, 28832, 2656, 6304, 2664, 14496, 2672, 22688, 2680, 30880, 2696, 8864,
|
||||
2704, 17056, 2712, 25248, 2728, 10912, 2736, 19104, 2744, 27296, 2752, 4768, 2760, 12960, 2768, 21152,
|
||||
2776, 29344, 2784, 6816, 2792, 15008, 2800, 23200, 2808, 31392, 2824, 9376, 2832, 17568, 2840, 25760,
|
||||
2848, 3232, 2856, 11424, 2864, 19616, 2872, 27808, 2880, 5280, 2888, 13472, 2896, 21664, 2904, 29856,
|
||||
2912, 7328, 2920, 15520, 2928, 23712, 2936, 31904, 2952, 9888, 2960, 18080, 2968, 26272, 2976, 3744,
|
||||
2984, 11936, 2992, 20128, 3000, 28320, 3008, 5792, 3016, 13984, 3024, 22176, 3032, 30368, 3040, 7840,
|
||||
3048, 16032, 3056, 24224, 3064, 32416, 3080, 8480, 3088, 16672, 3096, 24864, 3112, 10528, 3120, 18720,
|
||||
3128, 26912, 3136, 4384, 3144, 12576, 3152, 20768, 3160, 28960, 3168, 6432, 3176, 14624, 3184, 22816,
|
||||
3192, 31008, 3208, 8992, 3216, 17184, 3224, 25376, 3240, 11040, 3248, 19232, 3256, 27424, 3264, 4896,
|
||||
3272, 13088, 3280, 21280, 3288, 29472, 3296, 6944, 3304, 15136, 3312, 23328, 3320, 31520, 3336, 9504,
|
||||
3344, 17696, 3352, 25888, 3368, 11552, 3376, 19744, 3384, 27936, 3392, 5408, 3400, 13600, 3408, 21792,
|
||||
3416, 29984, 3424, 7456, 3432, 15648, 3440, 23840, 3448, 32032, 3464, 10016, 3472, 18208, 3480, 26400,
|
||||
3488, 3872, 3496, 12064, 3504, 20256, 3512, 28448, 3520, 5920, 3528, 14112, 3536, 22304, 3544, 30496,
|
||||
3552, 7968, 3560, 16160, 3568, 24352, 3576, 32544, 3592, 8608, 3600, 16800, 3608, 24992, 3624, 10656,
|
||||
3632, 18848, 3640, 27040, 3648, 4512, 3656, 12704, 3664, 20896, 3672, 29088, 3680, 6560, 3688, 14752,
|
||||
3696, 22944, 3704, 31136, 3720, 9120, 3728, 17312, 3736, 25504, 3752, 11168, 3760, 19360, 3768, 27552,
|
||||
3776, 5024, 3784, 13216, 3792, 21408, 3800, 29600, 3808, 7072, 3816, 15264, 3824, 23456, 3832, 31648,
|
||||
3848, 9632, 3856, 17824, 3864, 26016, 3880, 11680, 3888, 19872, 3896, 28064, 3904, 5536, 3912, 13728,
|
||||
3920, 21920, 3928, 30112, 3936, 7584, 3944, 15776, 3952, 23968, 3960, 32160, 3976, 10144, 3984, 18336,
|
||||
3992, 26528, 4008, 12192, 4016, 20384, 4024, 28576, 4032, 6048, 4040, 14240, 4048, 22432, 4056, 30624,
|
||||
4064, 8096, 4072, 16288, 4080, 24480, 4088, 32672, 4104, 8256, 4112, 16448, 4120, 24640, 4136, 10304,
|
||||
4144, 18496, 4152, 26688, 4168, 12352, 4176, 20544, 4184, 28736, 4192, 6208, 4200, 14400, 4208, 22592,
|
||||
4216, 30784, 4232, 8768, 4240, 16960, 4248, 25152, 4264, 10816, 4272, 19008, 4280, 27200, 4288, 4672,
|
||||
4296, 12864, 4304, 21056, 4312, 29248, 4320, 6720, 4328, 14912, 4336, 23104, 4344, 31296, 4360, 9280,
|
||||
4368, 17472, 4376, 25664, 4392, 11328, 4400, 19520, 4408, 27712, 4416, 5184, 4424, 13376, 4432, 21568,
|
||||
4440, 29760, 4448, 7232, 4456, 15424, 4464, 23616, 4472, 31808, 4488, 9792, 4496, 17984, 4504, 26176,
|
||||
4520, 11840, 4528, 20032, 4536, 28224, 4544, 5696, 4552, 13888, 4560, 22080, 4568, 30272, 4576, 7744,
|
||||
4584, 15936, 4592, 24128, 4600, 32320, 4616, 8384, 4624, 16576, 4632, 24768, 4648, 10432, 4656, 18624,
|
||||
4664, 26816, 4680, 12480, 4688, 20672, 4696, 28864, 4704, 6336, 4712, 14528, 4720, 22720, 4728, 30912,
|
||||
4744, 8896, 4752, 17088, 4760, 25280, 4776, 10944, 4784, 19136, 4792, 27328, 4808, 12992, 4816, 21184,
|
||||
4824, 29376, 4832, 6848, 4840, 15040, 4848, 23232, 4856, 31424, 4872, 9408, 4880, 17600, 4888, 25792,
|
||||
4904, 11456, 4912, 19648, 4920, 27840, 4928, 5312, 4936, 13504, 4944, 21696, 4952, 29888, 4960, 7360,
|
||||
4968, 15552, 4976, 23744, 4984, 31936, 5000, 9920, 5008, 18112, 5016, 26304, 5032, 11968, 5040, 20160,
|
||||
5048, 28352, 5056, 5824, 5064, 14016, 5072, 22208, 5080, 30400, 5088, 7872, 5096, 16064, 5104, 24256,
|
||||
5112, 32448, 5128, 8512, 5136, 16704, 5144, 24896, 5160, 10560, 5168, 18752, 5176, 26944, 5192, 12608,
|
||||
5200, 20800, 5208, 28992, 5216, 6464, 5224, 14656, 5232, 22848, 5240, 31040, 5256, 9024, 5264, 17216,
|
||||
5272, 25408, 5288, 11072, 5296, 19264, 5304, 27456, 5320, 13120, 5328, 21312, 5336, 29504, 5344, 6976,
|
||||
5352, 15168, 5360, 23360, 5368, 31552, 5384, 9536, 5392, 17728, 5400, 25920, 5416, 11584, 5424, 19776,
|
||||
5432, 27968, 5448, 13632, 5456, 21824, 5464, 30016, 5472, 7488, 5480, 15680, 5488, 23872, 5496, 32064,
|
||||
5512, 10048, 5520, 18240, 5528, 26432, 5544, 12096, 5552, 20288, 5560, 28480, 5568, 5952, 5576, 14144,
|
||||
5584, 22336, 5592, 30528, 5600, 8000, 5608, 16192, 5616, 24384, 5624, 32576, 5640, 8640, 5648, 16832,
|
||||
5656, 25024, 5672, 10688, 5680, 18880, 5688, 27072, 5704, 12736, 5712, 20928, 5720, 29120, 5728, 6592,
|
||||
5736, 14784, 5744, 22976, 5752, 31168, 5768, 9152, 5776, 17344, 5784, 25536, 5800, 11200, 5808, 19392,
|
||||
5816, 27584, 5832, 13248, 5840, 21440, 5848, 29632, 5856, 7104, 5864, 15296, 5872, 23488, 5880, 31680,
|
||||
5896, 9664, 5904, 17856, 5912, 26048, 5928, 11712, 5936, 19904, 5944, 28096, 5960, 13760, 5968, 21952,
|
||||
5976, 30144, 5984, 7616, 5992, 15808, 6000, 24000, 6008, 32192, 6024, 10176, 6032, 18368, 6040, 26560,
|
||||
6056, 12224, 6064, 20416, 6072, 28608, 6088, 14272, 6096, 22464, 6104, 30656, 6112, 8128, 6120, 16320,
|
||||
6128, 24512, 6136, 32704, 6152, 8288, 6160, 16480, 6168, 24672, 6184, 10336, 6192, 18528, 6200, 26720,
|
||||
6216, 12384, 6224, 20576, 6232, 28768, 6248, 14432, 6256, 22624, 6264, 30816, 6280, 8800, 6288, 16992,
|
||||
6296, 25184, 6312, 10848, 6320, 19040, 6328, 27232, 6344, 12896, 6352, 21088, 6360, 29280, 6368, 6752,
|
||||
6376, 14944, 6384, 23136, 6392, 31328, 6408, 9312, 6416, 17504, 6424, 25696, 6440, 11360, 6448, 19552,
|
||||
6456, 27744, 6472, 13408, 6480, 21600, 6488, 29792, 6496, 7264, 6504, 15456, 6512, 23648, 6520, 31840,
|
||||
6536, 9824, 6544, 18016, 6552, 26208, 6568, 11872, 6576, 20064, 6584, 28256, 6600, 13920, 6608, 22112,
|
||||
6616, 30304, 6624, 7776, 6632, 15968, 6640, 24160, 6648, 32352, 6664, 8416, 6672, 16608, 6680, 24800,
|
||||
6696, 10464, 6704, 18656, 6712, 26848, 6728, 12512, 6736, 20704, 6744, 28896, 6760, 14560, 6768, 22752,
|
||||
6776, 30944, 6792, 8928, 6800, 17120, 6808, 25312, 6824, 10976, 6832, 19168, 6840, 27360, 6856, 13024,
|
||||
6864, 21216, 6872, 29408, 6888, 15072, 6896, 23264, 6904, 31456, 6920, 9440, 6928, 17632, 6936, 25824,
|
||||
6952, 11488, 6960, 19680, 6968, 27872, 6984, 13536, 6992, 21728, 7000, 29920, 7008, 7392, 7016, 15584,
|
||||
7024, 23776, 7032, 31968, 7048, 9952, 7056, 18144, 7064, 26336, 7080, 12000, 7088, 20192, 7096, 28384,
|
||||
7112, 14048, 7120, 22240, 7128, 30432, 7136, 7904, 7144, 16096, 7152, 24288, 7160, 32480, 7176, 8544,
|
||||
7184, 16736, 7192, 24928, 7208, 10592, 7216, 18784, 7224, 26976, 7240, 12640, 7248, 20832, 7256, 29024,
|
||||
7272, 14688, 7280, 22880, 7288, 31072, 7304, 9056, 7312, 17248, 7320, 25440, 7336, 11104, 7344, 19296,
|
||||
7352, 27488, 7368, 13152, 7376, 21344, 7384, 29536, 7400, 15200, 7408, 23392, 7416, 31584, 7432, 9568,
|
||||
7440, 17760, 7448, 25952, 7464, 11616, 7472, 19808, 7480, 28000, 7496, 13664, 7504, 21856, 7512, 30048,
|
||||
7528, 15712, 7536, 23904, 7544, 32096, 7560, 10080, 7568, 18272, 7576, 26464, 7592, 12128, 7600, 20320,
|
||||
7608, 28512, 7624, 14176, 7632, 22368, 7640, 30560, 7648, 8032, 7656, 16224, 7664, 24416, 7672, 32608,
|
||||
7688, 8672, 7696, 16864, 7704, 25056, 7720, 10720, 7728, 18912, 7736, 27104, 7752, 12768, 7760, 20960,
|
||||
7768, 29152, 7784, 14816, 7792, 23008, 7800, 31200, 7816, 9184, 7824, 17376, 7832, 25568, 7848, 11232,
|
||||
7856, 19424, 7864, 27616, 7880, 13280, 7888, 21472, 7896, 29664, 7912, 15328, 7920, 23520, 7928, 31712,
|
||||
7944, 9696, 7952, 17888, 7960, 26080, 7976, 11744, 7984, 19936, 7992, 28128, 8008, 13792, 8016, 21984,
|
||||
8024, 30176, 8040, 15840, 8048, 24032, 8056, 32224, 8072, 10208, 8080, 18400, 8088, 26592, 8104, 12256,
|
||||
8112, 20448, 8120, 28640, 8136, 14304, 8144, 22496, 8152, 30688, 8168, 16352, 8176, 24544, 8184, 32736,
|
||||
8208, 16392, 8216, 24584, 8232, 10248, 8240, 18440, 8248, 26632, 8264, 12296, 8272, 20488, 8280, 28680,
|
||||
8296, 14344, 8304, 22536, 8312, 30728, 8328, 8712, 8336, 16904, 8344, 25096, 8360, 10760, 8368, 18952,
|
||||
8376, 27144, 8392, 12808, 8400, 21000, 8408, 29192, 8424, 14856, 8432, 23048, 8440, 31240, 8456, 9224,
|
||||
8464, 17416, 8472, 25608, 8488, 11272, 8496, 19464, 8504, 27656, 8520, 13320, 8528, 21512, 8536, 29704,
|
||||
8552, 15368, 8560, 23560, 8568, 31752, 8584, 9736, 8592, 17928, 8600, 26120, 8616, 11784, 8624, 19976,
|
||||
8632, 28168, 8648, 13832, 8656, 22024, 8664, 30216, 8680, 15880, 8688, 24072, 8696, 32264, 8720, 16520,
|
||||
8728, 24712, 8744, 10376, 8752, 18568, 8760, 26760, 8776, 12424, 8784, 20616, 8792, 28808, 8808, 14472,
|
||||
8816, 22664, 8824, 30856, 8848, 17032, 8856, 25224, 8872, 10888, 8880, 19080, 8888, 27272, 8904, 12936,
|
||||
8912, 21128, 8920, 29320, 8936, 14984, 8944, 23176, 8952, 31368, 8968, 9352, 8976, 17544, 8984, 25736,
|
||||
9000, 11400, 9008, 19592, 9016, 27784, 9032, 13448, 9040, 21640, 9048, 29832, 9064, 15496, 9072, 23688,
|
||||
9080, 31880, 9096, 9864, 9104, 18056, 9112, 26248, 9128, 11912, 9136, 20104, 9144, 28296, 9160, 13960,
|
||||
9168, 22152, 9176, 30344, 9192, 16008, 9200, 24200, 9208, 32392, 9232, 16648, 9240, 24840, 9256, 10504,
|
||||
9264, 18696, 9272, 26888, 9288, 12552, 9296, 20744, 9304, 28936, 9320, 14600, 9328, 22792, 9336, 30984,
|
||||
9360, 17160, 9368, 25352, 9384, 11016, 9392, 19208, 9400, 27400, 9416, 13064, 9424, 21256, 9432, 29448,
|
||||
9448, 15112, 9456, 23304, 9464, 31496, 9488, 17672, 9496, 25864, 9512, 11528, 9520, 19720, 9528, 27912,
|
||||
9544, 13576, 9552, 21768, 9560, 29960, 9576, 15624, 9584, 23816, 9592, 32008, 9608, 9992, 9616, 18184,
|
||||
9624, 26376, 9640, 12040, 9648, 20232, 9656, 28424, 9672, 14088, 9680, 22280, 9688, 30472, 9704, 16136,
|
||||
9712, 24328, 9720, 32520, 9744, 16776, 9752, 24968, 9768, 10632, 9776, 18824, 9784, 27016, 9800, 12680,
|
||||
9808, 20872, 9816, 29064, 9832, 14728, 9840, 22920, 9848, 31112, 9872, 17288, 9880, 25480, 9896, 11144,
|
||||
9904, 19336, 9912, 27528, 9928, 13192, 9936, 21384, 9944, 29576, 9960, 15240, 9968, 23432, 9976, 31624,
|
||||
10000, 17800, 10008, 25992, 10024, 11656, 10032, 19848, 10040, 28040, 10056, 13704, 10064, 21896, 10072, 30088,
|
||||
10088, 15752, 10096, 23944, 10104, 32136, 10128, 18312, 10136, 26504, 10152, 12168, 10160, 20360, 10168, 28552,
|
||||
10184, 14216, 10192, 22408, 10200, 30600, 10216, 16264, 10224, 24456, 10232, 32648, 10256, 16424, 10264, 24616,
|
||||
10288, 18472, 10296, 26664, 10312, 12328, 10320, 20520, 10328, 28712, 10344, 14376, 10352, 22568, 10360, 30760,
|
||||
10384, 16936, 10392, 25128, 10408, 10792, 10416, 18984, 10424, 27176, 10440, 12840, 10448, 21032, 10456, 29224,
|
||||
10472, 14888, 10480, 23080, 10488, 31272, 10512, 17448, 10520, 25640, 10536, 11304, 10544, 19496, 10552, 27688,
|
||||
10568, 13352, 10576, 21544, 10584, 29736, 10600, 15400, 10608, 23592, 10616, 31784, 10640, 17960, 10648, 26152,
|
||||
10664, 11816, 10672, 20008, 10680, 28200, 10696, 13864, 10704, 22056, 10712, 30248, 10728, 15912, 10736, 24104,
|
||||
10744, 32296, 10768, 16552, 10776, 24744, 10800, 18600, 10808, 26792, 10824, 12456, 10832, 20648, 10840, 28840,
|
||||
10856, 14504, 10864, 22696, 10872, 30888, 10896, 17064, 10904, 25256, 10928, 19112, 10936, 27304, 10952, 12968,
|
||||
10960, 21160, 10968, 29352, 10984, 15016, 10992, 23208, 11000, 31400, 11024, 17576, 11032, 25768, 11048, 11432,
|
||||
11056, 19624, 11064, 27816, 11080, 13480, 11088, 21672, 11096, 29864, 11112, 15528, 11120, 23720, 11128, 31912,
|
||||
11152, 18088, 11160, 26280, 11176, 11944, 11184, 20136, 11192, 28328, 11208, 13992, 11216, 22184, 11224, 30376,
|
||||
11240, 16040, 11248, 24232, 11256, 32424, 11280, 16680, 11288, 24872, 11312, 18728, 11320, 26920, 11336, 12584,
|
||||
11344, 20776, 11352, 28968, 11368, 14632, 11376, 22824, 11384, 31016, 11408, 17192, 11416, 25384, 11440, 19240,
|
||||
11448, 27432, 11464, 13096, 11472, 21288, 11480, 29480, 11496, 15144, 11504, 23336, 11512, 31528, 11536, 17704,
|
||||
11544, 25896, 11568, 19752, 11576, 27944, 11592, 13608, 11600, 21800, 11608, 29992, 11624, 15656, 11632, 23848,
|
||||
11640, 32040, 11664, 18216, 11672, 26408, 11688, 12072, 11696, 20264, 11704, 28456, 11720, 14120, 11728, 22312,
|
||||
11736, 30504, 11752, 16168, 11760, 24360, 11768, 32552, 11792, 16808, 11800, 25000, 11824, 18856, 11832, 27048,
|
||||
11848, 12712, 11856, 20904, 11864, 29096, 11880, 14760, 11888, 22952, 11896, 31144, 11920, 17320, 11928, 25512,
|
||||
11952, 19368, 11960, 27560, 11976, 13224, 11984, 21416, 11992, 29608, 12008, 15272, 12016, 23464, 12024, 31656,
|
||||
12048, 17832, 12056, 26024, 12080, 19880, 12088, 28072, 12104, 13736, 12112, 21928, 12120, 30120, 12136, 15784,
|
||||
12144, 23976, 12152, 32168, 12176, 18344, 12184, 26536, 12208, 20392, 12216, 28584, 12232, 14248, 12240, 22440,
|
||||
12248, 30632, 12264, 16296, 12272, 24488, 12280, 32680, 12304, 16456, 12312, 24648, 12336, 18504, 12344, 26696,
|
||||
12368, 20552, 12376, 28744, 12392, 14408, 12400, 22600, 12408, 30792, 12432, 16968, 12440, 25160, 12464, 19016,
|
||||
12472, 27208, 12488, 12872, 12496, 21064, 12504, 29256, 12520, 14920, 12528, 23112, 12536, 31304, 12560, 17480,
|
||||
12568, 25672, 12592, 19528, 12600, 27720, 12616, 13384, 12624, 21576, 12632, 29768, 12648, 15432, 12656, 23624,
|
||||
12664, 31816, 12688, 17992, 12696, 26184, 12720, 20040, 12728, 28232, 12744, 13896, 12752, 22088, 12760, 30280,
|
||||
12776, 15944, 12784, 24136, 12792, 32328, 12816, 16584, 12824, 24776, 12848, 18632, 12856, 26824, 12880, 20680,
|
||||
12888, 28872, 12904, 14536, 12912, 22728, 12920, 30920, 12944, 17096, 12952, 25288, 12976, 19144, 12984, 27336,
|
||||
13008, 21192, 13016, 29384, 13032, 15048, 13040, 23240, 13048, 31432, 13072, 17608, 13080, 25800, 13104, 19656,
|
||||
13112, 27848, 13128, 13512, 13136, 21704, 13144, 29896, 13160, 15560, 13168, 23752, 13176, 31944, 13200, 18120,
|
||||
13208, 26312, 13232, 20168, 13240, 28360, 13256, 14024, 13264, 22216, 13272, 30408, 13288, 16072, 13296, 24264,
|
||||
13304, 32456, 13328, 16712, 13336, 24904, 13360, 18760, 13368, 26952, 13392, 20808, 13400, 29000, 13416, 14664,
|
||||
13424, 22856, 13432, 31048, 13456, 17224, 13464, 25416, 13488, 19272, 13496, 27464, 13520, 21320, 13528, 29512,
|
||||
13544, 15176, 13552, 23368, 13560, 31560, 13584, 17736, 13592, 25928, 13616, 19784, 13624, 27976, 13648, 21832,
|
||||
13656, 30024, 13672, 15688, 13680, 23880, 13688, 32072, 13712, 18248, 13720, 26440, 13744, 20296, 13752, 28488,
|
||||
13768, 14152, 13776, 22344, 13784, 30536, 13800, 16200, 13808, 24392, 13816, 32584, 13840, 16840, 13848, 25032,
|
||||
13872, 18888, 13880, 27080, 13904, 20936, 13912, 29128, 13928, 14792, 13936, 22984, 13944, 31176, 13968, 17352,
|
||||
13976, 25544, 14000, 19400, 14008, 27592, 14032, 21448, 14040, 29640, 14056, 15304, 14064, 23496, 14072, 31688,
|
||||
14096, 17864, 14104, 26056, 14128, 19912, 14136, 28104, 14160, 21960, 14168, 30152, 14184, 15816, 14192, 24008,
|
||||
14200, 32200, 14224, 18376, 14232, 26568, 14256, 20424, 14264, 28616, 14288, 22472, 14296, 30664, 14312, 16328,
|
||||
14320, 24520, 14328, 32712, 14352, 16488, 14360, 24680, 14384, 18536, 14392, 26728, 14416, 20584, 14424, 28776,
|
||||
14448, 22632, 14456, 30824, 14480, 17000, 14488, 25192, 14512, 19048, 14520, 27240, 14544, 21096, 14552, 29288,
|
||||
14568, 14952, 14576, 23144, 14584, 31336, 14608, 17512, 14616, 25704, 14640, 19560, 14648, 27752, 14672, 21608,
|
||||
14680, 29800, 14696, 15464, 14704, 23656, 14712, 31848, 14736, 18024, 14744, 26216, 14768, 20072, 14776, 28264,
|
||||
14800, 22120, 14808, 30312, 14824, 15976, 14832, 24168, 14840, 32360, 14864, 16616, 14872, 24808, 14896, 18664,
|
||||
14904, 26856, 14928, 20712, 14936, 28904, 14960, 22760, 14968, 30952, 14992, 17128, 15000, 25320, 15024, 19176,
|
||||
15032, 27368, 15056, 21224, 15064, 29416, 15088, 23272, 15096, 31464, 15120, 17640, 15128, 25832, 15152, 19688,
|
||||
15160, 27880, 15184, 21736, 15192, 29928, 15208, 15592, 15216, 23784, 15224, 31976, 15248, 18152, 15256, 26344,
|
||||
15280, 20200, 15288, 28392, 15312, 22248, 15320, 30440, 15336, 16104, 15344, 24296, 15352, 32488, 15376, 16744,
|
||||
15384, 24936, 15408, 18792, 15416, 26984, 15440, 20840, 15448, 29032, 15472, 22888, 15480, 31080, 15504, 17256,
|
||||
15512, 25448, 15536, 19304, 15544, 27496, 15568, 21352, 15576, 29544, 15600, 23400, 15608, 31592, 15632, 17768,
|
||||
15640, 25960, 15664, 19816, 15672, 28008, 15696, 21864, 15704, 30056, 15728, 23912, 15736, 32104, 15760, 18280,
|
||||
15768, 26472, 15792, 20328, 15800, 28520, 15824, 22376, 15832, 30568, 15848, 16232, 15856, 24424, 15864, 32616,
|
||||
15888, 16872, 15896, 25064, 15920, 18920, 15928, 27112, 15952, 20968, 15960, 29160, 15984, 23016, 15992, 31208,
|
||||
16016, 17384, 16024, 25576, 16048, 19432, 16056, 27624, 16080, 21480, 16088, 29672, 16112, 23528, 16120, 31720,
|
||||
16144, 17896, 16152, 26088, 16176, 19944, 16184, 28136, 16208, 21992, 16216, 30184, 16240, 24040, 16248, 32232,
|
||||
16272, 18408, 16280, 26600, 16304, 20456, 16312, 28648, 16336, 22504, 16344, 30696, 16368, 24552, 16376, 32744,
|
||||
16408, 24592, 16432, 18448, 16440, 26640, 16464, 20496, 16472, 28688, 16496, 22544, 16504, 30736, 16528, 16912,
|
||||
16536, 25104, 16560, 18960, 16568, 27152, 16592, 21008, 16600, 29200, 16624, 23056, 16632, 31248, 16656, 17424,
|
||||
16664, 25616, 16688, 19472, 16696, 27664, 16720, 21520, 16728, 29712, 16752, 23568, 16760, 31760, 16784, 17936,
|
||||
16792, 26128, 16816, 19984, 16824, 28176, 16848, 22032, 16856, 30224, 16880, 24080, 16888, 32272, 16920, 24720,
|
||||
16944, 18576, 16952, 26768, 16976, 20624, 16984, 28816, 17008, 22672, 17016, 30864, 17048, 25232, 17072, 19088,
|
||||
17080, 27280, 17104, 21136, 17112, 29328, 17136, 23184, 17144, 31376, 17168, 17552, 17176, 25744, 17200, 19600,
|
||||
17208, 27792, 17232, 21648, 17240, 29840, 17264, 23696, 17272, 31888, 17296, 18064, 17304, 26256, 17328, 20112,
|
||||
17336, 28304, 17360, 22160, 17368, 30352, 17392, 24208, 17400, 32400, 17432, 24848, 17456, 18704, 17464, 26896,
|
||||
17488, 20752, 17496, 28944, 17520, 22800, 17528, 30992, 17560, 25360, 17584, 19216, 17592, 27408, 17616, 21264,
|
||||
17624, 29456, 17648, 23312, 17656, 31504, 17688, 25872, 17712, 19728, 17720, 27920, 17744, 21776, 17752, 29968,
|
||||
17776, 23824, 17784, 32016, 17808, 18192, 17816, 26384, 17840, 20240, 17848, 28432, 17872, 22288, 17880, 30480,
|
||||
17904, 24336, 17912, 32528, 17944, 24976, 17968, 18832, 17976, 27024, 18000, 20880, 18008, 29072, 18032, 22928,
|
||||
18040, 31120, 18072, 25488, 18096, 19344, 18104, 27536, 18128, 21392, 18136, 29584, 18160, 23440, 18168, 31632,
|
||||
18200, 26000, 18224, 19856, 18232, 28048, 18256, 21904, 18264, 30096, 18288, 23952, 18296, 32144, 18328, 26512,
|
||||
18352, 20368, 18360, 28560, 18384, 22416, 18392, 30608, 18416, 24464, 18424, 32656, 18456, 24624, 18488, 26672,
|
||||
18512, 20528, 18520, 28720, 18544, 22576, 18552, 30768, 18584, 25136, 18608, 18992, 18616, 27184, 18640, 21040,
|
||||
18648, 29232, 18672, 23088, 18680, 31280, 18712, 25648, 18736, 19504, 18744, 27696, 18768, 21552, 18776, 29744,
|
||||
18800, 23600, 18808, 31792, 18840, 26160, 18864, 20016, 18872, 28208, 18896, 22064, 18904, 30256, 18928, 24112,
|
||||
18936, 32304, 18968, 24752, 19000, 26800, 19024, 20656, 19032, 28848, 19056, 22704, 19064, 30896, 19096, 25264,
|
||||
19128, 27312, 19152, 21168, 19160, 29360, 19184, 23216, 19192, 31408, 19224, 25776, 19248, 19632, 19256, 27824,
|
||||
19280, 21680, 19288, 29872, 19312, 23728, 19320, 31920, 19352, 26288, 19376, 20144, 19384, 28336, 19408, 22192,
|
||||
19416, 30384, 19440, 24240, 19448, 32432, 19480, 24880, 19512, 26928, 19536, 20784, 19544, 28976, 19568, 22832,
|
||||
19576, 31024, 19608, 25392, 19640, 27440, 19664, 21296, 19672, 29488, 19696, 23344, 19704, 31536, 19736, 25904,
|
||||
19768, 27952, 19792, 21808, 19800, 30000, 19824, 23856, 19832, 32048, 19864, 26416, 19888, 20272, 19896, 28464,
|
||||
19920, 22320, 19928, 30512, 19952, 24368, 19960, 32560, 19992, 25008, 20024, 27056, 20048, 20912, 20056, 29104,
|
||||
20080, 22960, 20088, 31152, 20120, 25520, 20152, 27568, 20176, 21424, 20184, 29616, 20208, 23472, 20216, 31664,
|
||||
20248, 26032, 20280, 28080, 20304, 21936, 20312, 30128, 20336, 23984, 20344, 32176, 20376, 26544, 20408, 28592,
|
||||
20432, 22448, 20440, 30640, 20464, 24496, 20472, 32688, 20504, 24656, 20536, 26704, 20568, 28752, 20592, 22608,
|
||||
20600, 30800, 20632, 25168, 20664, 27216, 20688, 21072, 20696, 29264, 20720, 23120, 20728, 31312, 20760, 25680,
|
||||
20792, 27728, 20816, 21584, 20824, 29776, 20848, 23632, 20856, 31824, 20888, 26192, 20920, 28240, 20944, 22096,
|
||||
20952, 30288, 20976, 24144, 20984, 32336, 21016, 24784, 21048, 26832, 21080, 28880, 21104, 22736, 21112, 30928,
|
||||
21144, 25296, 21176, 27344, 21208, 29392, 21232, 23248, 21240, 31440, 21272, 25808, 21304, 27856, 21328, 21712,
|
||||
21336, 29904, 21360, 23760, 21368, 31952, 21400, 26320, 21432, 28368, 21456, 22224, 21464, 30416, 21488, 24272,
|
||||
21496, 32464, 21528, 24912, 21560, 26960, 21592, 29008, 21616, 22864, 21624, 31056, 21656, 25424, 21688, 27472,
|
||||
21720, 29520, 21744, 23376, 21752, 31568, 21784, 25936, 21816, 27984, 21848, 30032, 21872, 23888, 21880, 32080,
|
||||
21912, 26448, 21944, 28496, 21968, 22352, 21976, 30544, 22000, 24400, 22008, 32592, 22040, 25040, 22072, 27088,
|
||||
22104, 29136, 22128, 22992, 22136, 31184, 22168, 25552, 22200, 27600, 22232, 29648, 22256, 23504, 22264, 31696,
|
||||
22296, 26064, 22328, 28112, 22360, 30160, 22384, 24016, 22392, 32208, 22424, 26576, 22456, 28624, 22488, 30672,
|
||||
22512, 24528, 22520, 32720, 22552, 24688, 22584, 26736, 22616, 28784, 22648, 30832, 22680, 25200, 22712, 27248,
|
||||
22744, 29296, 22768, 23152, 22776, 31344, 22808, 25712, 22840, 27760, 22872, 29808, 22896, 23664, 22904, 31856,
|
||||
22936, 26224, 22968, 28272, 23000, 30320, 23024, 24176, 23032, 32368, 23064, 24816, 23096, 26864, 23128, 28912,
|
||||
23160, 30960, 23192, 25328, 23224, 27376, 23256, 29424, 23288, 31472, 23320, 25840, 23352, 27888, 23384, 29936,
|
||||
23408, 23792, 23416, 31984, 23448, 26352, 23480, 28400, 23512, 30448, 23536, 24304, 23544, 32496, 23576, 24944,
|
||||
23608, 26992, 23640, 29040, 23672, 31088, 23704, 25456, 23736, 27504, 23768, 29552, 23800, 31600, 23832, 25968,
|
||||
23864, 28016, 23896, 30064, 23928, 32112, 23960, 26480, 23992, 28528, 24024, 30576, 24048, 24432, 24056, 32624,
|
||||
24088, 25072, 24120, 27120, 24152, 29168, 24184, 31216, 24216, 25584, 24248, 27632, 24280, 29680, 24312, 31728,
|
||||
24344, 26096, 24376, 28144, 24408, 30192, 24440, 32240, 24472, 26608, 24504, 28656, 24536, 30704, 24568, 32752,
|
||||
24632, 26648, 24664, 28696, 24696, 30744, 24728, 25112, 24760, 27160, 24792, 29208, 24824, 31256, 24856, 25624,
|
||||
24888, 27672, 24920, 29720, 24952, 31768, 24984, 26136, 25016, 28184, 25048, 30232, 25080, 32280, 25144, 26776,
|
||||
25176, 28824, 25208, 30872, 25272, 27288, 25304, 29336, 25336, 31384, 25368, 25752, 25400, 27800, 25432, 29848,
|
||||
25464, 31896, 25496, 26264, 25528, 28312, 25560, 30360, 25592, 32408, 25656, 26904, 25688, 28952, 25720, 31000,
|
||||
25784, 27416, 25816, 29464, 25848, 31512, 25912, 27928, 25944, 29976, 25976, 32024, 26008, 26392, 26040, 28440,
|
||||
26072, 30488, 26104, 32536, 26168, 27032, 26200, 29080, 26232, 31128, 26296, 27544, 26328, 29592, 26360, 31640,
|
||||
26424, 28056, 26456, 30104, 26488, 32152, 26552, 28568, 26584, 30616, 26616, 32664, 26712, 28728, 26744, 30776,
|
||||
26808, 27192, 26840, 29240, 26872, 31288, 26936, 27704, 26968, 29752, 27000, 31800, 27064, 28216, 27096, 30264,
|
||||
27128, 32312, 27224, 28856, 27256, 30904, 27352, 29368, 27384, 31416, 27448, 27832, 27480, 29880, 27512, 31928,
|
||||
27576, 28344, 27608, 30392, 27640, 32440, 27736, 28984, 27768, 31032, 27864, 29496, 27896, 31544, 27992, 30008,
|
||||
28024, 32056, 28088, 28472, 28120, 30520, 28152, 32568, 28248, 29112, 28280, 31160, 28376, 29624, 28408, 31672,
|
||||
28504, 30136, 28536, 32184, 28632, 30648, 28664, 32696, 28792, 30808, 28888, 29272, 28920, 31320, 29016, 29784,
|
||||
29048, 31832, 29144, 30296, 29176, 32344, 29304, 30936, 29432, 31448, 29528, 29912, 29560, 31960, 29656, 30424,
|
||||
29688, 32472, 29816, 31064, 29944, 31576, 30072, 32088, 30168, 30552, 30200, 32600, 30328, 31192, 30456, 31704,
|
||||
30584, 32216, 30712, 32728, 30968, 31352, 31096, 31864, 31224, 32376, 31608, 31992, 31736, 32504, 32248, 32632,
|
||||
};
|
||||
extern const uint16_t bitrev4r_table_4096_fc32[];
|
||||
extern const uint16_t bitrev4r_table_4096_fc32_size;
|
||||
|
||||
|
||||
void dsps_fft4r_rev_tables_init_fc32(void)
|
||||
{
|
||||
dsps_fft4r_rev_tables_fc32[0] = (uint16_t *)bitrev4r_table_16_fc32;
|
||||
dsps_fft4r_rev_tables_fc32[1] = (uint16_t *)bitrev4r_table_64_fc32;
|
||||
dsps_fft4r_rev_tables_fc32[2] = (uint16_t *)bitrev4r_table_256_fc32;
|
||||
dsps_fft4r_rev_tables_fc32[3] = (uint16_t *)bitrev4r_table_1024_fc32;
|
||||
dsps_fft4r_rev_tables_fc32[4] = (uint16_t *)bitrev4r_table_4096_fc32;
|
||||
|
||||
}
|
||||
|
||||
uint16_t *dsps_fft4r_rev_tables_fc32[] = {
|
||||
(uint16_t *)bitrev4r_table_16_fc32,
|
||||
(uint16_t *)bitrev4r_table_64_fc32,
|
||||
(uint16_t *)bitrev4r_table_256_fc32,
|
||||
(uint16_t *)bitrev4r_table_1024_fc32,
|
||||
(uint16_t *)bitrev4r_table_4096_fc32,
|
||||
};
|
||||
|
||||
const uint16_t bitrev4r_table_16_fc32_size = 6;
|
||||
const uint16_t bitrev4r_table_64_fc32_size = 24;
|
||||
const uint16_t bitrev4r_table_256_fc32_size = 120;
|
||||
const uint16_t bitrev4r_table_1024_fc32_size = 480;
|
||||
const uint16_t bitrev4r_table_4096_fc32_size = 2016;
|
||||
|
||||
const uint16_t dsps_fft4r_rev_tables_fc32_size[] = {
|
||||
(const uint16_t)6, // bitrev4r_table_16_fc32_size,
|
||||
(const uint16_t)24, // bitrev4r_table_64_fc32_size,
|
||||
(const uint16_t)120, // bitrev4r_table_256_fc32_size,
|
||||
(const uint16_t)480, // bitrev4r_table_1024_fc32_size,
|
||||
(const uint16_t)2016,// bitrev4r_table_4096_fc32_size,
|
||||
};
|
||||
@@ -0,0 +1,134 @@
|
||||
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include "dsps_fft2r.h"
|
||||
#include "dsps_fft4r.h"
|
||||
#include "dsp_common.h"
|
||||
#include "dsp_types.h"
|
||||
#include <math.h>
|
||||
#include "esp_attr.h"
|
||||
|
||||
#include "dsps_fft4r_platform.h"
|
||||
|
||||
|
||||
#if (dsps_cplx2real_fc32_ae32_enabled == 1)
|
||||
esp_err_t dsps_cplx2real_fc32_ae32_(float *data, int fft_points, float *table, int table_size)
|
||||
{
|
||||
float *ptr_inv;
|
||||
|
||||
int wind_step = table_size / (fft_points);
|
||||
|
||||
float *win0 = table + wind_step;
|
||||
float *win1 = table + wind_step * 2;
|
||||
|
||||
////0 & 1 => dc frequency
|
||||
///fft_points * 2 + 0 & fft_points * 2 + 1 => Nyquist frequency
|
||||
asm volatile ("const.s f14, 0"); //f14 = 0f;
|
||||
asm volatile ("lsi f0, %0, 0" :: "a" (data)); //f0 = *data;
|
||||
asm volatile ("lsi f1, %0, 4" :: "a" (data)); //f1 = *(data + 1);
|
||||
asm volatile ("addx8 %0, %1, %2" : "=a" (ptr_inv) : "a" (fft_points), "a" (data)); //ptr_inv = data + fft_points * 2;
|
||||
asm volatile ("add.s f6, f0, f1"); //f6 = f0 + f1;
|
||||
asm volatile ("sub.s f7, f0, f1"); //f7 = f0 - f1;
|
||||
|
||||
asm volatile ("srli %0, %0, 2" : "+a" (fft_points)); //fft_points >>= 2;
|
||||
|
||||
asm volatile ("const.s f14, 3"); //f14 = 0.5f;, this is for multiply 0.5
|
||||
asm volatile ("neg.s f15, f14"); //f15 = -f14;
|
||||
|
||||
asm volatile ("ssi f6, %0, 0" :: "a" (data)); //*data = f6;
|
||||
asm volatile ("ssi f7, %0, 4" :: "a" (data)); //*ptr_inv = f7;
|
||||
asm volatile ("addi %0, %0, -16" : "+a" (ptr_inv)); //ptr_inv -= 4; ///here increase address by -4 because float load/store not support negective immediate offset
|
||||
|
||||
asm volatile ("loopnez %0, __loop_end_fftr_real_post_proc" :: "a" (fft_points)); //for (k = 0; k < fft_points; k++) {
|
||||
asm volatile ("lsi f1, %0, 12" :: "a" (data)); //f1 = *(data + 3);
|
||||
asm volatile ("lsi f3, %0, 12" :: "a" (ptr_inv)); //f3 = *(ptr_inv + 3);
|
||||
asm volatile ("lsi f0, %0, 8" :: "a" (data)); //f0 = *(data + 2);
|
||||
asm volatile ("lsi f2, %0, 8" :: "a" (ptr_inv)); //f2 = *(ptr_inv + 2);
|
||||
|
||||
asm volatile ("lsi f7, %0, 20" :: "a" (data)); //f7 = *(data + 5);
|
||||
asm volatile ("lsi f9, %0, 4" :: "a" (ptr_inv)); //f9 = *(ptr_inv + 1);
|
||||
|
||||
asm volatile ("lsi f6, %0, 16" :: "a" (data)); //f6 = *(data + 4);
|
||||
asm volatile ("lsi f8, %0, 0" :: "a" (ptr_inv)); //f8 = *ptr_inv;
|
||||
asm volatile ("sub.s f5, f1, f3"); //f5 = f1 - f3;
|
||||
asm volatile ("add.s f4, f0, f2"); //f4 = f0 + f2;
|
||||
asm volatile ("sub.s f11, f7, f9"); //f11 = f7 - f9;
|
||||
asm volatile ("add.s f10, f6, f8"); //f10 = f6 + f8;
|
||||
|
||||
asm volatile ("add.s f1, f1, f3"); //f1 = f1 + f3;
|
||||
asm volatile ("sub.s f0, f0, f2"); //f0 = f0 - f2;
|
||||
|
||||
asm volatile ("lsi f12, %0, 4" :: "a" (win0)); //f12 = *(win + 1);
|
||||
asm volatile ("add.s f7, f7, f9"); //f7 = f7 + f9;
|
||||
asm volatile ("sub.s f6, f6, f8"); //f6 = f6 - f8;
|
||||
asm volatile ("lsi f13, %0, 4" :: "a" (win1)); //f13 = *(win + 3);
|
||||
|
||||
asm volatile ("mul.s f3, f1, f12"); //f3 = f1 * f12;
|
||||
asm volatile ("mul.s f2, f0, f12"); //f2 = f0 * f12;
|
||||
asm volatile ("lsi f12, %0, 0" :: "a" (win0)); //f12 = *(win + 0);
|
||||
|
||||
asm volatile ("mul.s f9, f7, f13"); //f9 = f7 * f13;
|
||||
asm volatile ("mul.s f8, f6, f13"); //f8 = f6 * f13;
|
||||
|
||||
asm volatile ("lsi f13, %0, 0" :: "a" (win1)); //f13 = *(win + 2);
|
||||
|
||||
asm volatile ("madd.s f3, f0, f12"); //f3 += f0 * f12;
|
||||
asm volatile ("msub.s f2, f1, f12"); //f2 -= f1 * f12;
|
||||
asm volatile ("madd.s f9, f6, f13"); //f9 += f6 * f13;
|
||||
asm volatile ("msub.s f8, f7, f13"); //f8 -= f7 * f13;
|
||||
asm volatile ("addx8 %0, %1, %0" : "+a" (win0) : "a" (wind_step)); //win0 += 8 * wind_step;
|
||||
asm volatile ("addx8 %0, %1, %0" : "+a" (win1) : "a" (wind_step)); //win1 += 8 * wind_step;
|
||||
// Here we have tw1: f2,f3 and tw2: f8,f9
|
||||
|
||||
asm volatile ("sub.s f1, f5, f3"); //f1 = f5 - f3;
|
||||
asm volatile ("sub.s f0, f4, f2"); //f0 = f4 - f2;
|
||||
|
||||
asm volatile ("add.s f3, f3, f5"); //f3 = f3 + f5;
|
||||
asm volatile ("add.s f2, f4, f2"); //f2 = f4 + f2;
|
||||
|
||||
asm volatile ("sub.s f7, f11, f9"); //f7 = f11 - f9;
|
||||
asm volatile ("sub.s f6, f10, f8"); //f6 = f10 - f8;
|
||||
asm volatile ("add.s f9, f9, f11"); //f9 = f9 + f11;
|
||||
asm volatile ("add.s f8, f10, f8"); //f8 = f10 + f8;
|
||||
|
||||
asm volatile ("mul.s f1, f1, f14"); //f1 *= f14;
|
||||
asm volatile ("mul.s f0, f0, f14"); //f0 *= f14;
|
||||
|
||||
asm volatile ("mul.s f3, f3, f15"); //f3 *= -f14;
|
||||
asm volatile ("mul.s f2, f2, f14"); //f2 *= f14;
|
||||
|
||||
asm volatile ("mul.s f7, f7, f14"); //f7 *= f14;
|
||||
asm volatile ("mul.s f6, f6, f14"); //f6 *= f14;
|
||||
asm volatile ("mul.s f9, f9, f15"); //f9 *= -f14;
|
||||
asm volatile ("mul.s f8, f8, f14"); //f8 *= f14;
|
||||
|
||||
asm volatile ("ssi f1, %0, 12" :: "a" (data)); //*(data + 3) = f1;
|
||||
asm volatile ("ssi f0, %0, 8" :: "a" (data)); //*(data + 2) = f0;
|
||||
|
||||
asm volatile ("ssi f3, %0, 12" :: "a" (ptr_inv)); //*(ptr_inv + 3) = f3;
|
||||
asm volatile ("ssi f2, %0, 8" :: "a" (ptr_inv)); //*(ptr_inv + 2) = f2;
|
||||
|
||||
asm volatile ("ssi f7, %0, 20" :: "a" (data)); //*(data + 5) = f7;
|
||||
asm volatile ("ssi f6, %0, 16" :: "a" (data)); //*(data + 4) = f6;
|
||||
asm volatile ("addi %0, %0, 16" : "+a" (data)); //data += 4;
|
||||
|
||||
asm volatile ("ssi f9, %0, 4" :: "a" (ptr_inv)); //*(ptr_inv + 1) = f9;
|
||||
asm volatile ("ssi f8, %0, 0" :: "a" (ptr_inv)); //*ptr_inv = f8;
|
||||
asm volatile ("addi %0, %0, -16" : "+a" (ptr_inv)); //ptr_inv -= 4;
|
||||
//}
|
||||
asm volatile ("__loop_end_fftr_real_post_proc: nop");
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
#endif // dsps_cplx2real_fc32_ae32_enabled
|
||||
@@ -0,0 +1,213 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2018-2025 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileContributor: 2024 f4lcOn @ Libera Chat IRC
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
|
||||
#include "dsp_err_codes.h"
|
||||
|
||||
#include "dsps_fft4r_platform.h"
|
||||
#if (dsps_fft4r_fc32_ae32_enabled == 1)
|
||||
|
||||
.section .text # placed in IRAM instead of FLASH .text
|
||||
.global dsps_fft4r_fc32_ae32_
|
||||
.type dsps_fft4r_fc32_ae32_,@function
|
||||
|
||||
// The function implements the following C code:
|
||||
// esp_err_t dsps_fft4r_fc32_ansi_(float *data, int length, float *table, int table_size)
|
||||
// {
|
||||
// if (0 == dsps_fft4r_initialized) {
|
||||
// return ESP_ERR_DSP_UNINITIALIZED;
|
||||
// }
|
||||
//
|
||||
// uint log2N = dsp_power_of_two(length);
|
||||
// if ((log2N & 0x01) != 0) {
|
||||
// return ESP_ERR_DSP_INVALID_LENGTH;
|
||||
// }
|
||||
// uint log4N = log2N >> 1;
|
||||
//
|
||||
// fc32_t bfly[4];
|
||||
// uint m = 2;
|
||||
// uint wind_step = table_size / length;
|
||||
// while (1) { ///radix 4
|
||||
// if (log4N == 0) {
|
||||
// break;
|
||||
// }
|
||||
// length = length >> 2;
|
||||
// for (int j = 0; j < m; j += 2) { // j: which FFT of this step
|
||||
// int start_index = j * (length << 1); // n: n-point FFT
|
||||
//
|
||||
// fc32_t *ptrc0 = (fc32_t *)data + start_index;
|
||||
// fc32_t *ptrc1 = ptrc0 + length;
|
||||
// fc32_t *ptrc2 = ptrc1 + length;
|
||||
// fc32_t *ptrc3 = ptrc2 + length;
|
||||
//
|
||||
// fc32_t *winc0 = (fc32_t *)table;
|
||||
// fc32_t *winc1 = winc0;
|
||||
// fc32_t *winc2 = winc0;
|
||||
//
|
||||
// for (int k = 0; k < length; k++) {
|
||||
// fc32_t in0 = *ptrc0;
|
||||
// fc32_t in2 = *ptrc2;
|
||||
// fc32_t in1 = *ptrc1;
|
||||
// fc32_t in3 = *ptrc3;
|
||||
//
|
||||
// bfly[0].re = in0.re + in2.re + in1.re + in3.re;
|
||||
// bfly[0].im = in0.im + in2.im + in1.im + in3.im;
|
||||
//
|
||||
// bfly[1].re = in0.re - in2.re + in1.im - in3.im;
|
||||
// bfly[1].im = in0.im - in2.im - in1.re + in3.re;
|
||||
//
|
||||
// bfly[2].re = in0.re + in2.re - in1.re - in3.re;
|
||||
// bfly[2].im = in0.im + in2.im - in1.im - in3.im;
|
||||
//
|
||||
// bfly[3].re = in0.re - in2.re - in1.im + in3.im;
|
||||
// bfly[3].im = in0.im - in2.im + in1.re - in3.re;
|
||||
//
|
||||
// *ptrc0 = bfly[0];
|
||||
// ptrc1->re = bfly[1].re * winc0->re + bfly[1].im * winc0->im;
|
||||
// ptrc1->im = bfly[1].im * winc0->re - bfly[1].re * winc0->im;
|
||||
// ptrc2->re = bfly[2].re * winc1->re + bfly[2].im * winc1->im;
|
||||
// ptrc2->im = bfly[2].im * winc1->re - bfly[2].re * winc1->im;
|
||||
// ptrc3->re = bfly[3].re * winc2->re + bfly[3].im * winc2->im;
|
||||
// ptrc3->im = bfly[3].im * winc2->re - bfly[3].re * winc2->im;
|
||||
//
|
||||
// winc0 += 1 * wind_step;
|
||||
// winc1 += 2 * wind_step;
|
||||
// winc2 += 3 * wind_step;
|
||||
//
|
||||
// ptrc0++;
|
||||
// ptrc1++;
|
||||
// ptrc2++;
|
||||
// ptrc3++;
|
||||
// }
|
||||
// }
|
||||
// m = m << 2;
|
||||
// wind_step = wind_step << 2;
|
||||
// log4N--;
|
||||
// }
|
||||
// return ESP_OK;
|
||||
// }
|
||||
|
||||
// esp_err_t dsps_fft4r_fc32_ae32_(data, N, dsps_fft4r_w_table_fc32, dsps_fft4r_w_table_size)
|
||||
|
||||
.ret_DSP_INVALID_LENGTH:
|
||||
movi.n a2, ESP_ERR_DSP_INVALID_LENGTH
|
||||
retw.n
|
||||
|
||||
.align 4
|
||||
dsps_fft4r_fc32_ae32_:
|
||||
|
||||
entry a1, 16 # no auto vars on stack
|
||||
|
||||
bltui a3, 4, .ret_DSP_INVALID_LENGTH # if N < 4 : return(ESP_ERR_DSP_INVALID_LENGTH)
|
||||
|
||||
addi.n a6, a3, -1
|
||||
and a6, a3, a6
|
||||
bnez a6, .ret_DSP_INVALID_LENGTH # if N not power of 2 : return(ESP_ERR_DSP_INVALID_LENGTH)
|
||||
|
||||
nsau a6, a3 # inline dsp_power_of_two(N)
|
||||
movi.n a7, 31
|
||||
xor a6, a6, a7
|
||||
|
||||
bbsi a6, 0, .ret_DSP_INVALID_LENGTH # if N not power of 4 : return(ESP_ERR_DSP_INVALID_LENGTH)
|
||||
|
||||
srli a7, a6, 1 # log4N = dsp_power_of_two(N) >> 1;
|
||||
|
||||
addi.n a6, a6, -1
|
||||
ssr a6
|
||||
srl a6, a5 # w_step = table_size >> (dsp_power_of_two(N) - 1)
|
||||
|
||||
movi.n a5, 2 # m = 2
|
||||
|
||||
.stage:
|
||||
srli a3, a3, 2 # N >>= 2
|
||||
|
||||
movi.n a8, 0 # j = 0
|
||||
|
||||
.group:
|
||||
mov.n a9, a4 # w0 = w
|
||||
mov.n a10, a4 # w1 = w
|
||||
mov.n a11, a4 # w2 = w
|
||||
|
||||
mul16u a12, a8, a3
|
||||
slli a12, a12, 1 # start_index = (j * N) << 1
|
||||
|
||||
addx8 a12, a12, a2 # p0 = data + (start_index << 1)
|
||||
addx8 a13, a3, a12 # p1 = p0 + (N << 1)
|
||||
addx8 a14, a3, a13 # p2 = p1 + (N << 1)
|
||||
addx8 a15, a3, a14 # p3 = p2 + (N << 1)
|
||||
|
||||
loopnez a3, .bf4_loop_end # for (uint k = 0; k < N; k++)
|
||||
lsi f1, a12, 4 # f1 = in0.im = *(p0 + 1)
|
||||
lsi f3, a14, 4 # f3 = in2.im = *(p2 + 1)
|
||||
lsi f0, a12, 0 # f0 = in0.re = *p0
|
||||
lsi f2, a14, 0 # f2 = in2.re = *p2
|
||||
add.s f5, f1, f3 # f5 = in0.im + in2.im
|
||||
sub.s f7, f1, f3 # f7 = in0.im - in2.im
|
||||
lsi f1, a13, 4 # f1 = in1.im = *(p1 + 1)
|
||||
lsi f3, a15, 4 # f3 = in3.im = *(p3 + 1)
|
||||
add.s f4, f0, f2 # f4 = in0.re + in2.re
|
||||
sub.s f6, f0, f2 # f6 = in0.re - in2.re
|
||||
add.s f9, f1, f3 # f9 = in1.im + in3.im
|
||||
sub.s f11, f1, f3 # f11 = in1.im - in3.im
|
||||
lsi f0, a13, 0 # f0 = in1.re = *p1
|
||||
lsi f2, a15, 0 # f2 = in3.re = *p3
|
||||
lsi f12, a9, 0 # f12 = w0->re
|
||||
lsi f13, a10, 0 # f13 = w1->re
|
||||
lsi f14, a11, 0 # f14 = w2->re
|
||||
add.s f8, f0, f2 # f8 = in1.re + in3.re
|
||||
sub.s f10, f0, f2 # f10 = in1.re - in3.re
|
||||
sub.s f1, f5, f9 # f1 = bf2.im = in0.im + in2.im - in1.im - in3.im
|
||||
add.s f5, f5, f9 # f5 = bf0.im = in0.im + in2.im + in1.im + in3.im
|
||||
add.s f2, f6, f11 # f2 = bf1.re = in0.re - in2.re + in1.im - in3.im
|
||||
sub.s f6, f6, f11 # f6 = bf3.re = in0.re - in2.re - in1.im + in3.im
|
||||
sub.s f0, f4, f8 # f0 = bf2.re = in0.re + in2.re - in1.re - in3.re
|
||||
add.s f4, f4, f8 # f4 = bf0.re = in0.re + in2.re + in1.re + in3.re
|
||||
sub.s f3, f7, f10 # f3 = bf1.im = in0.im - in2.im - in1.re + in3.re
|
||||
add.s f7, f7, f10 # f7 = bf3.im = in0.im - in2.im + in1.re - in3.re
|
||||
ssi f5, a12, 4 # *(p0 + 1) = f5 = bf0.im
|
||||
ssip f4, a12, 8 # *p0 = f4 = bf0.re , p0 += 2
|
||||
mul.s f5, f3, f12 # f5 = bf1.im * w0->re
|
||||
mul.s f4, f2, f12 # f4 = bf1.re * w0->re
|
||||
mul.s f9, f1, f13 # f9 = bf2.im * w1->re
|
||||
mul.s f8, f0, f13 # f8 = bf2.re * w1->re
|
||||
mul.s f11, f7, f14 # f11 = bf3.im * w2->re
|
||||
mul.s f10, f6, f14 # f10 = bf3.re * w2->re
|
||||
lsi f12, a9, 4 # f12 = w0->im
|
||||
lsi f13, a10, 4 # f13 = w1->im
|
||||
lsi f14, a11, 4 # f14 = w2->im
|
||||
addx4 a9, a6, a9 # w0 += m
|
||||
addx8 a10, a6, a10 # w1 += 2 * m
|
||||
addx4 a11, a6, a11
|
||||
addx8 a11, a6, a11 # w2 += 3 * m
|
||||
msub.s f5, f2, f12 # f5 = bf1.im * w0->re - bf1.re * w0->im
|
||||
madd.s f4, f3, f12 # f4 = bf1.re * w0->re + bf1.im * w0->im
|
||||
msub.s f9, f0, f13 # f9 = bf2.im * w1->re - bf2.re * w1->im
|
||||
madd.s f8, f1, f13 # f8 = bf2.re * w1->re + bf2.im * w1->im
|
||||
msub.s f11, f6, f14 # f11 = bf3.im * w2->re - bf3.re * w2->im
|
||||
madd.s f10, f7, f14 # f10 = bf3.re * w2->re + bf3.im * w2->im
|
||||
ssi f5, a13, 4 # *(p1 + 1) = f5
|
||||
ssip f4, a13, 8 # *p1 = f4, p1 += 2
|
||||
ssi f9, a14, 4 # *(p2 + 1) = f9
|
||||
ssip f8, a14, 8 # *p2 = f8, p2 += 2
|
||||
ssi f11, a15, 4 # *(p3 + 1) = f11
|
||||
ssip f10, a15, 8 # *p3 = f10, p3 += 2
|
||||
.bf4_loop_end:
|
||||
|
||||
addi.n a8, a8, 2 # j += 2
|
||||
bgeu a8, a5, .stage_next # if j >= m
|
||||
j .group
|
||||
|
||||
.stage_next:
|
||||
slli a5, a5, 2 # m <<= 2
|
||||
slli a6, a6, 2 # w_step <<= 2
|
||||
addi.n a7, a7, -1 # log4N--
|
||||
bnez a7, .stage # if log4N > 0
|
||||
|
||||
movi.n a2, DSP_OK # return(DSP_OK)
|
||||
retw.n
|
||||
|
||||
#endif // dsps_fft4r_fc32_ae32_enabled
|
||||
@@ -0,0 +1,205 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2018-2025 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileContributor: 2024 f4lcOn @ Libera Chat IRC
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
|
||||
#include "dsp_err_codes.h"
|
||||
|
||||
#include "dsps_fft4r_platform.h"
|
||||
#if (dsps_fft4r_fc32_aes3_enabled == 1)
|
||||
|
||||
.section .text
|
||||
.global dsps_fft4r_fc32_aes3_
|
||||
.type dsps_fft4r_fc32_aes3_,@function
|
||||
|
||||
// The function implements the following C code:
|
||||
// esp_err_t dsps_fft4r_fc32_ansi_(float *data, int length, float *table, int table_size)
|
||||
// {
|
||||
// if (0 == dsps_fft4r_initialized) {
|
||||
// return ESP_ERR_DSP_UNINITIALIZED;
|
||||
// }
|
||||
//
|
||||
// uint log2N = dsp_power_of_two(length);
|
||||
// if ((log2N & 0x01) != 0) {
|
||||
// return ESP_ERR_DSP_INVALID_LENGTH;
|
||||
// }
|
||||
// uint log4N = log2N >> 1;
|
||||
//
|
||||
// fc32_t bfly[4];
|
||||
// uint m = 2;
|
||||
// uint wind_step = table_size / length;
|
||||
// while (1) { ///radix 4
|
||||
// if (log4N == 0) {
|
||||
// break;
|
||||
// }
|
||||
// length = length >> 2;
|
||||
// for (int j = 0; j < m; j += 2) { // j: which FFT of this step
|
||||
// int start_index = j * (length << 1); // n: n-point FFT
|
||||
//
|
||||
// fc32_t *ptrc0 = (fc32_t *)data + start_index;
|
||||
// fc32_t *ptrc1 = ptrc0 + length;
|
||||
// fc32_t *ptrc2 = ptrc1 + length;
|
||||
// fc32_t *ptrc3 = ptrc2 + length;
|
||||
//
|
||||
// fc32_t *winc0 = (fc32_t *)table;
|
||||
// fc32_t *winc1 = winc0;
|
||||
// fc32_t *winc2 = winc0;
|
||||
//
|
||||
// for (int k = 0; k < length; k++) {
|
||||
// fc32_t in0 = *ptrc0;
|
||||
// fc32_t in2 = *ptrc2;
|
||||
// fc32_t in1 = *ptrc1;
|
||||
// fc32_t in3 = *ptrc3;
|
||||
//
|
||||
// bfly[0].re = in0.re + in2.re + in1.re + in3.re;
|
||||
// bfly[0].im = in0.im + in2.im + in1.im + in3.im;
|
||||
//
|
||||
// bfly[1].re = in0.re - in2.re + in1.im - in3.im;
|
||||
// bfly[1].im = in0.im - in2.im - in1.re + in3.re;
|
||||
//
|
||||
// bfly[2].re = in0.re + in2.re - in1.re - in3.re;
|
||||
// bfly[2].im = in0.im + in2.im - in1.im - in3.im;
|
||||
//
|
||||
// bfly[3].re = in0.re - in2.re - in1.im + in3.im;
|
||||
// bfly[3].im = in0.im - in2.im + in1.re - in3.re;
|
||||
//
|
||||
// *ptrc0 = bfly[0];
|
||||
// ptrc1->re = bfly[1].re * winc0->re + bfly[1].im * winc0->im;
|
||||
// ptrc1->im = bfly[1].im * winc0->re - bfly[1].re * winc0->im;
|
||||
// ptrc2->re = bfly[2].re * winc1->re + bfly[2].im * winc1->im;
|
||||
// ptrc2->im = bfly[2].im * winc1->re - bfly[2].re * winc1->im;
|
||||
// ptrc3->re = bfly[3].re * winc2->re + bfly[3].im * winc2->im;
|
||||
// ptrc3->im = bfly[3].im * winc2->re - bfly[3].re * winc2->im;
|
||||
//
|
||||
// winc0 += 1 * wind_step;
|
||||
// winc1 += 2 * wind_step;
|
||||
// winc2 += 3 * wind_step;
|
||||
//
|
||||
// ptrc0++;
|
||||
// ptrc1++;
|
||||
// ptrc2++;
|
||||
// ptrc3++;
|
||||
// }
|
||||
// }
|
||||
// m = m << 2;
|
||||
// wind_step = wind_step << 2;
|
||||
// log4N--;
|
||||
// }
|
||||
// return ESP_OK;
|
||||
// }
|
||||
|
||||
// esp_err_t dsps_fft4r_fc32_aes3_(data, N, dsps_fft4r_w_table_fc32, dsps_fft4r_w_table_size)
|
||||
|
||||
.ret_DSP_INVALID_LENGTH:
|
||||
movi.n a2, ESP_ERR_DSP_INVALID_LENGTH
|
||||
retw.n
|
||||
|
||||
.align 4
|
||||
dsps_fft4r_fc32_aes3_:
|
||||
|
||||
entry a1, 16 # no auto vars on stack
|
||||
|
||||
bltui a3, 4, .ret_DSP_INVALID_LENGTH # if N < 4 : return(ESP_ERR_DSP_INVALID_LENGTH)
|
||||
|
||||
addi.n a6, a3, -1
|
||||
and a6, a3, a6
|
||||
bnez a6, .ret_DSP_INVALID_LENGTH # if N not power of 2 : return(ESP_ERR_DSP_INVALID_LENGTH)
|
||||
|
||||
nsau a6, a3 # inline dsp_power_of_two(N)
|
||||
movi.n a7, 31
|
||||
xor a6, a6, a7
|
||||
|
||||
bbsi a6, 0, .ret_DSP_INVALID_LENGTH # if N not power of 4 : return(ESP_ERR_DSP_INVALID_LENGTH)
|
||||
|
||||
srli a7, a6, 1 # log4N = dsp_power_of_two(N) >> 1;
|
||||
|
||||
addi.n a6, a6, -1
|
||||
ssr a6
|
||||
srl a6, a5 # w_step = table_size >> (dsp_power_of_two(N) - 1)
|
||||
|
||||
movi.n a5, 2 # m = 2
|
||||
|
||||
.stage:
|
||||
srli a3, a3, 2 # N >>= 2
|
||||
|
||||
movi.n a8, 0 # j = 0
|
||||
|
||||
.group:
|
||||
mov.n a9, a4 # w0 = w
|
||||
mov.n a10, a4 # w1 = w
|
||||
mov.n a11, a4 # w2 = w
|
||||
|
||||
mul16u a12, a8, a3
|
||||
slli a12, a12, 1 # start_index = (j * N) << 1
|
||||
|
||||
addx8 a12, a12, a2 # p0 = data + (start_index << 1)
|
||||
addx8 a13, a3, a12 # p1 = p0 + (N << 1)
|
||||
addx8 a14, a3, a13 # p2 = p1 + (N << 1)
|
||||
addx8 a15, a3, a14 # p3 = p2 + (N << 1)
|
||||
|
||||
loopnez a3, .bf4_loop_end # for (uint k = 0; k < N; k++)
|
||||
ee.ldf.64.ip f1, f0, a12, 0 # f0 = in0.re = *p0, f1 = in0.im = *(p0 + 1)
|
||||
ee.ldf.64.ip f3, f2, a14, 0 # f2 = in2.re = *p2, f3 = in2.im = *(p2 + 1)
|
||||
add.s f5, f1, f3 # f5 = in0.im + in2.im
|
||||
sub.s f7, f1, f3 # f7 = in0.im - in2.im
|
||||
add.s f4, f0, f2 # f4 = in0.re + in2.re
|
||||
sub.s f6, f0, f2 # f6 = in0.re - in2.re
|
||||
ee.ldf.64.ip f1, f0, a13, 0 # f0 = in1.re = *p1, f1 = in1.im = *(p1 + 1)
|
||||
ee.ldf.64.ip f3, f2, a15, 0 # f2 = in3.re = *p3, f3 = in3.im = *(p3 + 1)
|
||||
add.s f9, f1, f3 # f9 = in1.im + in3.im
|
||||
sub.s f11, f1, f3 # f11 = in1.im - in3.im
|
||||
lsi f12, a9, 0 # f12 = w0->re
|
||||
lsi f13, a10, 0 # f13 = w1->re
|
||||
lsi f14, a11, 0 # f14 = w2->re
|
||||
add.s f8, f0, f2 # f8 = in1.re + in3.re
|
||||
sub.s f10, f0, f2 # f10 = in1.re - in3.re
|
||||
sub.s f1, f5, f9 # f1 = bf2.im = in0.im + in2.im - in1.im - in3.im
|
||||
add.s f5, f5, f9 # f5 = bf0.im = in0.im + in2.im + in1.im + in3.im
|
||||
add.s f2, f6, f11 # f2 = bf1.re = in0.re - in2.re + in1.im - in3.im
|
||||
sub.s f6, f6, f11 # f6 = bf3.re = in0.re - in2.re - in1.im + in3.im
|
||||
sub.s f0, f4, f8 # f0 = bf2.re = in0.re + in2.re - in1.re - in3.re
|
||||
add.s f4, f4, f8 # f4 = bf0.re = in0.re + in2.re + in1.re + in3.re
|
||||
sub.s f3, f7, f10 # f3 = bf1.im = in0.im - in2.im - in1.re + in3.re
|
||||
add.s f7, f7, f10 # f7 = bf3.im = in0.im - in2.im + in1.re - in3.re
|
||||
mul.s f10, f6, f14 # f10 = bf3.re * w2->re
|
||||
ee.stf.64.ip f5, f4, a12, 8 # *p0 = f4 = bf0.re, *(p0 + 1) = f5 = bf0.im, p0 += 2
|
||||
mul.s f4, f2, f12 # f4 = bf1.re * w0->re
|
||||
mul.s f11, f7, f14 # f11 = bf3.im * w2->re
|
||||
mul.s f5, f3, f12 # f5 = bf1.im * w0->re
|
||||
mul.s f8, f0, f13 # f8 = bf2.re * w1->re
|
||||
mul.s f9, f1, f13 # f9 = bf2.im * w1->re
|
||||
lsi f12, a9, 4 # f12 = w0->im
|
||||
lsi f13, a10, 4 # f13 = w1->im
|
||||
lsi f14, a11, 4 # f14 = w2->im
|
||||
msub.s f5, f2, f12 # f5 = bf1.im * w0->re - bf1.re * w0->im
|
||||
madd.s f4, f3, f12 # f4 = bf1.re * w0->re + bf1.im * w0->im
|
||||
msub.s f9, f0, f13 # f9 = bf2.im * w1->re - bf2.re * w1->im
|
||||
madd.s f8, f1, f13 # f8 = bf2.re * w1->re + bf2.im * w1->im
|
||||
msub.s f11, f6, f14 # f11 = bf3.im * w2->re - bf3.re * w2->im
|
||||
madd.s f10, f7, f14 # f10 = bf3.re * w2->re + bf3.im * w2->im
|
||||
addx4 a9, a6, a9 # w0 += w_step
|
||||
addx8 a10, a6, a10 # w1 += 2 * w_step
|
||||
addx4 a11, a6, a11
|
||||
addx8 a11, a6, a11 # w2 += 3 * w_step
|
||||
ee.stf.64.ip f5, f4, a13, 8 # *p1 = f4, *(p1 + 1) = f5, p1 += 2
|
||||
ee.stf.64.ip f9, f8, a14, 8 # *p2 = f8, *(p2 + 1) = f9, p2 += 2
|
||||
ee.stf.64.ip f11, f10, a15, 8 # *p3 = f10, *(p3 + 1) = f11, p3 += 2
|
||||
.bf4_loop_end:
|
||||
|
||||
addi.n a8, a8, 2 # j += 2
|
||||
bgeu a8, a5, .stage_next # if j >= m
|
||||
j .group
|
||||
|
||||
.stage_next:
|
||||
slli a5, a5, 2 # m <<= 2
|
||||
slli a6, a6, 2 # w_step <<= 2
|
||||
addi.n a7, a7, -1 # log4N--
|
||||
bnez a7, .stage # if log4N > 0
|
||||
|
||||
movi.n a2, DSP_OK # return(DSP_OK)
|
||||
retw.n
|
||||
|
||||
#endif // dsps_fft4r_fc32_aes3_enabled
|
||||
@@ -0,0 +1,331 @@
|
||||
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include "dsps_fft2r.h"
|
||||
#include "dsps_fft4r.h"
|
||||
#include "dsp_common.h"
|
||||
#include "dsp_types.h"
|
||||
#include <math.h>
|
||||
#include "esp_attr.h"
|
||||
#include "esp_log.h"
|
||||
#include <string.h>
|
||||
#include <malloc.h>
|
||||
|
||||
static const char *TAG = "fftr4 ansi";
|
||||
|
||||
float *dsps_fft4r_w_table_fc32;
|
||||
int dsps_fft4r_w_table_size;
|
||||
uint8_t dsps_fft4r_initialized = 0;
|
||||
uint8_t dsps_fft4r_mem_allocated = 0;
|
||||
//float* win2;
|
||||
uint16_t *dsps_fft4r_ram_rev_table = NULL;
|
||||
|
||||
esp_err_t dsps_fft4r_init_fc32(float *fft_table_buff, int max_fft_size)
|
||||
{
|
||||
esp_err_t result = ESP_OK;
|
||||
if (dsps_fft4r_initialized != 0) {
|
||||
return result;
|
||||
}
|
||||
if (max_fft_size > CONFIG_DSP_MAX_FFT_SIZE) {
|
||||
return ESP_ERR_DSP_PARAM_OUTOFRANGE;
|
||||
}
|
||||
if (max_fft_size == 0) {
|
||||
return result;
|
||||
}
|
||||
if (fft_table_buff != NULL) {
|
||||
if (dsps_fft4r_mem_allocated) {
|
||||
return ESP_ERR_DSP_REINITIALIZED;
|
||||
}
|
||||
dsps_fft4r_w_table_fc32 = fft_table_buff;
|
||||
dsps_fft4r_w_table_size = max_fft_size * 2;
|
||||
} else {
|
||||
if (!dsps_fft4r_mem_allocated) {
|
||||
dsps_fft4r_w_table_fc32 = (float *)malloc(max_fft_size * sizeof(float) * 4);
|
||||
if (NULL == dsps_fft4r_w_table_fc32) {
|
||||
return ESP_ERR_DSP_PARAM_OUTOFRANGE;
|
||||
}
|
||||
}
|
||||
dsps_fft4r_w_table_size = max_fft_size * 2;
|
||||
dsps_fft4r_mem_allocated = 1;
|
||||
}
|
||||
|
||||
// FFT ram_rev table allocated
|
||||
int pow = dsp_power_of_two(max_fft_size) >> 1;
|
||||
if ((pow >= 2) && (pow <= 6)) {
|
||||
dsps_fft4r_ram_rev_table = (uint16_t *)malloc(2 * dsps_fft4r_rev_tables_fc32_size[pow - 2] * sizeof(uint16_t));
|
||||
if (NULL == dsps_fft4r_ram_rev_table) {
|
||||
return ESP_ERR_DSP_PARAM_OUTOFRANGE;
|
||||
}
|
||||
memcpy(dsps_fft4r_ram_rev_table, dsps_fft4r_rev_tables_fc32[pow - 2], 2 * dsps_fft4r_rev_tables_fc32_size[pow - 2] * sizeof(uint16_t));
|
||||
dsps_fft4r_rev_tables_fc32[pow - 2] = dsps_fft4r_ram_rev_table;
|
||||
}
|
||||
|
||||
for (int i = 0; i < dsps_fft4r_w_table_size; i++) {
|
||||
float angle = 2 * M_PI * i / (float)dsps_fft4r_w_table_size;
|
||||
dsps_fft4r_w_table_fc32[2 * i + 0] = cosf(angle);
|
||||
dsps_fft4r_w_table_fc32[2 * i + 1] = sinf(angle);
|
||||
}
|
||||
|
||||
dsps_fft4r_initialized = 1;
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
void dsps_fft4r_deinit_fc32()
|
||||
{
|
||||
if (dsps_fft4r_mem_allocated) {
|
||||
free(dsps_fft4r_w_table_fc32);
|
||||
}
|
||||
if (dsps_fft4r_ram_rev_table != NULL) {
|
||||
free(dsps_fft4r_ram_rev_table);
|
||||
dsps_fft4r_ram_rev_table = NULL;
|
||||
}
|
||||
// Re init bitrev table for next use
|
||||
dsps_fft4r_rev_tables_init_fc32();
|
||||
|
||||
dsps_fft4r_mem_allocated = 0;
|
||||
dsps_fft4r_initialized = 0;
|
||||
}
|
||||
|
||||
esp_err_t dsps_bit_rev4r_direct_fc32_ansi(float *data, int N)
|
||||
{
|
||||
if (!dsp_is_power_of_two(N)) {
|
||||
return ESP_ERR_DSP_INVALID_LENGTH;
|
||||
}
|
||||
if (0 == dsps_fft4r_initialized) {
|
||||
return ESP_ERR_DSP_UNINITIALIZED;
|
||||
}
|
||||
esp_err_t result = ESP_OK;
|
||||
int log2N = dsp_power_of_two(N);
|
||||
int log4N = log2N >> 1;
|
||||
if ((log2N & 0x01) != 0) {
|
||||
return ESP_ERR_DSP_INVALID_LENGTH;
|
||||
}
|
||||
float r_temp, i_temp;
|
||||
for (int i = 0; i < N; i++) {
|
||||
int cnt;
|
||||
int xx;
|
||||
int bits2;
|
||||
xx = 0;
|
||||
cnt = log4N;
|
||||
int j = i;
|
||||
while (cnt > 0) {
|
||||
bits2 = j & 0x3;
|
||||
xx = (xx << 2) + bits2;
|
||||
j = j >> 2;
|
||||
cnt--;
|
||||
}
|
||||
if (i < xx) {
|
||||
r_temp = data[i * 2 + 0];
|
||||
i_temp = data[i * 2 + 1];
|
||||
data[i * 2 + 0] = data[xx * 2 + 0];
|
||||
data[i * 2 + 1] = data[xx * 2 + 1];
|
||||
data[xx * 2 + 0] = r_temp;
|
||||
data[xx * 2 + 1] = i_temp;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
esp_err_t dsps_fft4r_fc32_ansi_(float *data, int length, float *table, int table_size)
|
||||
{
|
||||
if (0 == dsps_fft4r_initialized) {
|
||||
return ESP_ERR_DSP_UNINITIALIZED;
|
||||
}
|
||||
|
||||
fc32_t bfly[4];
|
||||
int log2N = dsp_power_of_two(length);
|
||||
int log4N = log2N >> 1;
|
||||
if ((log2N & 0x01) != 0) {
|
||||
return ESP_ERR_DSP_INVALID_LENGTH;
|
||||
}
|
||||
|
||||
int m = 2;
|
||||
int wind_step = table_size / length;
|
||||
while (1) { ///radix 4
|
||||
if (log4N == 0) {
|
||||
break;
|
||||
}
|
||||
length = length >> 2;
|
||||
for (int j = 0; j < m; j += 2) { // j: which FFT of this step
|
||||
int start_index = j * (length << 1); // n: n-point FFT
|
||||
|
||||
fc32_t *ptrc0 = (fc32_t *)data + start_index;
|
||||
fc32_t *ptrc1 = ptrc0 + length;
|
||||
fc32_t *ptrc2 = ptrc1 + length;
|
||||
fc32_t *ptrc3 = ptrc2 + length;
|
||||
|
||||
fc32_t *winc0 = (fc32_t *)table;
|
||||
fc32_t *winc1 = winc0;
|
||||
fc32_t *winc2 = winc0;
|
||||
|
||||
for (int k = 0; k < length; k++) {
|
||||
fc32_t in0 = *ptrc0;
|
||||
fc32_t in2 = *ptrc2;
|
||||
fc32_t in1 = *ptrc1;
|
||||
fc32_t in3 = *ptrc3;
|
||||
|
||||
bfly[0].re = in0.re + in2.re + in1.re + in3.re;
|
||||
bfly[0].im = in0.im + in2.im + in1.im + in3.im;
|
||||
|
||||
bfly[1].re = in0.re - in2.re + in1.im - in3.im;
|
||||
bfly[1].im = in0.im - in2.im - in1.re + in3.re;
|
||||
|
||||
bfly[2].re = in0.re + in2.re - in1.re - in3.re;
|
||||
bfly[2].im = in0.im + in2.im - in1.im - in3.im;
|
||||
|
||||
bfly[3].re = in0.re - in2.re - in1.im + in3.im;
|
||||
bfly[3].im = in0.im - in2.im + in1.re - in3.re;
|
||||
|
||||
|
||||
|
||||
*ptrc0 = bfly[0];
|
||||
ptrc1->re = bfly[1].re * winc0->re + bfly[1].im * winc0->im;
|
||||
ptrc1->im = bfly[1].im * winc0->re - bfly[1].re * winc0->im;
|
||||
ptrc2->re = bfly[2].re * winc1->re + bfly[2].im * winc1->im;
|
||||
ptrc2->im = bfly[2].im * winc1->re - bfly[2].re * winc1->im;
|
||||
ptrc3->re = bfly[3].re * winc2->re + bfly[3].im * winc2->im;
|
||||
ptrc3->im = bfly[3].im * winc2->re - bfly[3].re * winc2->im;
|
||||
|
||||
winc0 += 1 * wind_step;
|
||||
winc1 += 2 * wind_step;
|
||||
winc2 += 3 * wind_step;
|
||||
|
||||
ptrc0++;
|
||||
ptrc1++;
|
||||
ptrc2++;
|
||||
ptrc3++;
|
||||
}
|
||||
}
|
||||
m = m << 2;
|
||||
wind_step = wind_step << 2;
|
||||
log4N--;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t dsps_cplx2real_fc32_ansi_(float *data, int N, float *table, int table_size)
|
||||
{
|
||||
if (0 == dsps_fft4r_initialized) {
|
||||
return ESP_ERR_DSP_UNINITIALIZED;
|
||||
}
|
||||
int wind_step = table_size / (N);
|
||||
fc32_t *result = (fc32_t *)data;
|
||||
// Original formula...
|
||||
// result[0].re = result[0].re + result[0].im;
|
||||
// result[N].re = result[0].re - result[0].im;
|
||||
// result[0].im = 0;
|
||||
// result[N].im = 0;
|
||||
// Optimized one:
|
||||
float tmp_re = result[0].re;
|
||||
result[0].re = tmp_re + result[0].im;
|
||||
result[0].im = tmp_re - result[0].im;
|
||||
|
||||
fc32_t f1k, f2k;
|
||||
for (int k = 1; k <= N / 2 ; k++ ) {
|
||||
fc32_t fpk = result[k];
|
||||
fc32_t fpnk = result[N - k];
|
||||
f1k.re = fpk.re + fpnk.re;
|
||||
f1k.im = fpk.im - fpnk.im;
|
||||
f2k.re = fpk.re - fpnk.re;
|
||||
f2k.im = fpk.im + fpnk.im;
|
||||
|
||||
float c = -table[k * wind_step + 1];
|
||||
float s = -table[k * wind_step + 0];
|
||||
fc32_t tw;
|
||||
tw.re = c * f2k.re - s * f2k.im;
|
||||
tw.im = s * f2k.re + c * f2k.im;
|
||||
|
||||
result[k].re = 0.5 * (f1k.re + tw.re);
|
||||
result[k].im = 0.5 * (f1k.im + tw.im);
|
||||
result[N - k].re = 0.5 * (f1k.re - tw.re);
|
||||
result[N - k].im = 0.5 * (tw.im - f1k.im);
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t dsps_gen_bitrev4r_table(int N, int step, char *name_ext)
|
||||
{
|
||||
if (!dsp_is_power_of_two(N)) {
|
||||
return ESP_ERR_DSP_INVALID_LENGTH;
|
||||
}
|
||||
|
||||
int items_count = 0;
|
||||
ESP_LOGD(TAG, "const uint16_t bitrev4r_table_%i_%s[] = { ", N, name_ext);
|
||||
int log2N = dsp_power_of_two(N);
|
||||
int log4N = log2N >> 1;
|
||||
|
||||
for (int i = 1; i < N - 1; i++) {
|
||||
int cnt;
|
||||
int xx;
|
||||
int bits2;
|
||||
xx = 0;
|
||||
cnt = log4N;
|
||||
int j = i;
|
||||
while (cnt > 0) {
|
||||
bits2 = j & 0x3;
|
||||
xx = (xx << 2) + bits2;
|
||||
j = j >> 2;
|
||||
cnt--;
|
||||
}
|
||||
if (i < xx) {
|
||||
ESP_LOGD(TAG, "%i, %i, ", i * step, xx * step);
|
||||
items_count++;
|
||||
if ((items_count % 8) == 0) {
|
||||
ESP_LOGD(TAG, " ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ESP_LOGD(TAG, "};");
|
||||
ESP_LOGD(TAG, "const uint16_t bitrev4r_table_%i_%s_size = %i;\n", N, name_ext, items_count);
|
||||
|
||||
ESP_LOGD(TAG, "extern const uint16_t bitrev4r_table_%i_%s[];", N, name_ext);
|
||||
ESP_LOGD(TAG, "extern const uint16_t bitrev4r_table_%i_%s_size;\n", N, name_ext);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t dsps_bit_rev4r_fc32(float *data, int N)
|
||||
{
|
||||
uint16_t *table;
|
||||
uint16_t table_size;
|
||||
switch (N) {
|
||||
case 16:
|
||||
table = (uint16_t *)dsps_fft4r_rev_tables_fc32[0];
|
||||
table_size = dsps_fft4r_rev_tables_fc32_size[0];
|
||||
break;
|
||||
case 64:
|
||||
table = (uint16_t *)dsps_fft4r_rev_tables_fc32[1];
|
||||
table_size = dsps_fft4r_rev_tables_fc32_size[1];
|
||||
break;
|
||||
case 256:
|
||||
table = (uint16_t *)dsps_fft4r_rev_tables_fc32[2];
|
||||
table_size = dsps_fft4r_rev_tables_fc32_size[2];
|
||||
break;
|
||||
case 1024:
|
||||
table = (uint16_t *)dsps_fft4r_rev_tables_fc32[3];
|
||||
table_size = dsps_fft4r_rev_tables_fc32_size[3];
|
||||
break;
|
||||
case 4096:
|
||||
table = (uint16_t *)dsps_fft4r_rev_tables_fc32[4];
|
||||
table_size = dsps_fft4r_rev_tables_fc32_size[4];
|
||||
break;
|
||||
|
||||
default:
|
||||
return dsps_bit_rev4r_direct_fc32_ansi(data, N);
|
||||
break;
|
||||
}
|
||||
|
||||
return dsps_bit_rev_lookup_fc32(data, table_size, table);
|
||||
}
|
||||
@@ -0,0 +1,164 @@
|
||||
// Copyright 2024 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include "dsps_fft4r_platform.h"
|
||||
|
||||
#if (dsps_fft4r_fc32_arp4_enabled == 1)
|
||||
|
||||
// This is matrix multipliction function for esp32p4 processor.
|
||||
.text
|
||||
.align 4
|
||||
.global dsps_fft4r_fc32_arp4_
|
||||
.type dsps_fft4r_fc32_arp4_,@function
|
||||
|
||||
dsps_fft4r_fc32_arp4_:
|
||||
//esp_err_t dsps_fft4r_fc32_arp4_(float *data, int N, float *table, int wind_step)
|
||||
|
||||
// wind_step - a3
|
||||
// m - t0
|
||||
// j - t1
|
||||
add sp,sp,-16
|
||||
#
|
||||
srli t6, a1, 1 // t6 = log4N = N/2
|
||||
li t0, 2 // t0 - m
|
||||
|
||||
slli a3, a3, 3 // wind_step = complex step = 8 bytes
|
||||
|
||||
.fft2r_l1:
|
||||
li t1, 0 // t1 - j
|
||||
srli a1, a1, 2 // a1 = length = length >> 2;
|
||||
.fft2r_l2: // loop for j, t1 - j
|
||||
slli t2, a1, 4 // t2 = length << 1 << 3 (8 bytes for one complex sample)
|
||||
slli t3, a1, 3 // t2 = length << 1 << 3 (8 bytes for one complex sample)
|
||||
// start_index = j * (length << 1); // n: n-point FFT
|
||||
mul t2,t2,t1
|
||||
add a4, a0, t2 // fc32_t *ptrc0
|
||||
add a5, a4, t3 // fc32_t *ptrc1
|
||||
add a6, a5, t3 // fc32_t *ptrc2
|
||||
add a7, a6, t3 // fc32_t *ptrc3
|
||||
|
||||
# flw fa0, 0(a4)
|
||||
# fsw fa0, 0(t3)
|
||||
# add t3, t3, 4
|
||||
mv t2, a2 // winc0
|
||||
mv t3, a2 // winc0
|
||||
mv t4, a2 // winc0
|
||||
|
||||
esp.lp.setup 0, a1, .fft2r_l3 // .fft2r_l3 - label to the last executed instruction
|
||||
|
||||
flw fa0, 0(a4) // in0.re
|
||||
flw fa4, 0(a6) // in2.re
|
||||
fadd.s ft0, fa0, fa4 // in0.re + in2.re
|
||||
flw fa1, 4(a4) // in0.im
|
||||
fsub.s ft1, fa0, fa4 // in0.re - in2.re
|
||||
flw fa5, 4(a6) // in2.im
|
||||
fadd.s ft2, fa1, fa5 // in0.im + in2.im
|
||||
flw fa2, 0(a5) // in1.re
|
||||
fsub.s ft3, fa1, fa5 // in0.im - in2.im
|
||||
flw fa6, 0(a7) // in3.re
|
||||
fadd.s ft4, fa2, fa6 // in1.re + in3.re
|
||||
flw fa3, 4(a5) // in1.im
|
||||
fsub.s ft5, fa2, fa6 // in1.re - in3.re
|
||||
flw fa7, 4(a7) // in3.im
|
||||
fadd.s ft6, fa3, fa7 // in1.im + in3.im
|
||||
fsub.s ft7, fa3, fa7 // in1.im - in3.im
|
||||
|
||||
# bfly[0].re = ft0 + ft4;
|
||||
fadd.s fa0, ft0, ft4;
|
||||
# bfly[0].im = ft2 + ft6;
|
||||
fadd.s fa1, ft2, ft6;
|
||||
# bfly[1].re = ft1 + ft7;
|
||||
fadd.s fa2, ft1, ft7;
|
||||
# bfly[1].im = ft3 - ft5;
|
||||
fsub.s fa3, ft3, ft5;
|
||||
# bfly[2].re = ft0 - ft5;
|
||||
fsub.s fa4, ft0, ft4;
|
||||
flw ft0, 0(t2) // winc0->re
|
||||
# bfly[2].im = ft2 - ft7;
|
||||
fsub.s fa5, ft2, ft6;
|
||||
flw ft2, 0(t3) // winc1->re
|
||||
# bfly[3].re = ft1 - ft6;
|
||||
fsub.s fa6, ft1, ft7;
|
||||
flw ft1, 4(t2) // winc0->im
|
||||
# bfly[3].im = ft3 + ft5;
|
||||
fadd.s fa7, ft3, ft5;
|
||||
|
||||
// *ptrc0 = bfly[0];
|
||||
fsw fa0, 0(a4) // in0.re
|
||||
fsw fa1, 4(a4) // in0.im
|
||||
|
||||
flw ft3, 4(t3) // winc1->im
|
||||
|
||||
// ptrc1->re = bfly[1].re * winc0->re + bfly[1].im * winc0->im;
|
||||
// ptrc1->im = bfly[1].im * winc0->re - bfly[1].re * winc0->im;
|
||||
// ptrc2->re = bfly[2].re * winc1->re + bfly[2].im * winc1->im;
|
||||
fmul.s fa0, fa2, ft0
|
||||
add t2, t2, a3 // winc0 += 1 * wind_step;
|
||||
fmul.s fa1, fa3, ft0
|
||||
fmul.s ft0, fa4, ft2
|
||||
fmul.s ft2, fa5, ft2
|
||||
|
||||
flw ft4, 0(t4) // winc2->re
|
||||
flw ft5, 4(t4) // winc3->im
|
||||
|
||||
fmadd.s fa0, fa3, ft1, fa0
|
||||
add t3, t3, a3 // winc1 += 2 * wind_step;
|
||||
fnmsub.s fa1, fa2, ft1, fa1
|
||||
add t3, t3, a3 //
|
||||
fmul.s fa2, fa6, ft4
|
||||
fmul.s fa3, fa7, ft4
|
||||
|
||||
|
||||
add t4, t4, a3 // winc2 += 3 * wind_step;
|
||||
fmadd.s ft0, fa5, ft3, ft0
|
||||
add t4, t4, a3 //
|
||||
fnmsub.s ft2, fa4, ft3, ft2
|
||||
|
||||
fmadd.s ft3, fa7, ft5, fa2
|
||||
add t4, t4, a3 //
|
||||
fnmsub.s fa3, fa6, ft5, fa3
|
||||
|
||||
fsw fa0, 0(a5) // in1.re
|
||||
add a4, a4, 8
|
||||
fsw fa1, 4(a5) // in1.im
|
||||
add a5, a5, 8
|
||||
fsw ft0, 0(a6) // in2.re
|
||||
// ptrc2->im = bfly[2].im * winc1->re - bfly[2].re * winc1->im;
|
||||
fsw ft2, 4(a6) // in2.re
|
||||
// ptrc3->re = bfly[3].re * winc2->re + bfly[3].im * winc2->im;
|
||||
add a6, a6, 8
|
||||
|
||||
fsw ft3, 0(a7) // in2.re
|
||||
// ptrc3->im = bfly[3].im * winc2->re - bfly[3].re * winc2->im;
|
||||
fsw fa3, 4(a7) // in2.re
|
||||
|
||||
add a7, a7, 8
|
||||
|
||||
// Temp solution
|
||||
|
||||
.fft2r_l3: nop
|
||||
add t1, t1, 2 // j+=2
|
||||
BNE t1, t0, .fft2r_l2
|
||||
|
||||
slli t0, t0, 2 // t0 = m = m<<2
|
||||
srli t6, t6, 2 // t6 = log4N >>= 2
|
||||
slli a3, a3, 2 // wind_step = wind_step << 2;
|
||||
BNEZ t6, .fft2r_l1// Jump if > 0
|
||||
|
||||
#
|
||||
add sp,sp,16
|
||||
li a0,0
|
||||
ret
|
||||
|
||||
#endif // dsps_fft4r_fc32_arp4_enabled
|
||||
Reference in New Issue
Block a user