├── examples ├── pdm_tft │ ├── .m4.test.skip │ └── pdm_tft.ino ├── pdm_tft_fancy │ ├── .m4.test.skip │ └── pdm_tft_fancy.ino ├── CircuitPlayground │ ├── .cpx_ada.test.only │ └── CircuitPlayground.ino ├── fft_test │ ├── fft_test.ino │ └── signal.h ├── normalized │ ├── normalized.ino │ └── signal.h └── mic_tft │ └── mic_tft.ino ├── .gitignore ├── library.properties ├── README.md ├── .github ├── workflows │ └── githubci.yml ├── PULL_REQUEST_TEMPLATE.md └── ISSUE_TEMPLATE.md ├── arm_common_tables.h ├── license.txt ├── Adafruit_ZeroFFT.h ├── fftutil.c └── fftwindows.c /examples/pdm_tft/.m4.test.skip: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /examples/pdm_tft_fancy/.m4.test.skip: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /examples/CircuitPlayground/.cpx_ada.test.only: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Our handy .gitignore for automation ease 2 | Doxyfile* 3 | doxygen_sqlite3.db 4 | html 5 | -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=Adafruit Zero FFT Library 2 | version=1.0.6 3 | author=Adafruit 4 | maintainer=Adafruit 5 | sentence=FFT library for Arduino Zero / Adafruit Feather M0 (SAMD21 processor). 6 | paragraph=FFT library for the Arduino Zero / Adafruit Feather M0 (SAMD21 processor). 7 | category=Signal Input/Output 8 | url=https://github.com/adafruit/Adafruit_ZeroFFT 9 | architectures=* 10 | depends=Adafruit ILI9341, Adafruit Zero PDM Library, Adafruit Circuit Playground 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Adafruit ZeroFFT Library [![Build Status](https://github.com/adafruit/Adafruit_ZeroFFT/workflows/Arduino%20Library%20CI/badge.svg)](https://github.com/adafruit/Adafruit_ILI9341/actions) 2 | 3 | This is an FFT library for ARM cortex M0+ CPUs 4 | 5 | Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! 6 | 7 | Written by Dean Miller for Adafruit Industries. 8 | MIT license, all text above must be included in any redistribution 9 | -------------------------------------------------------------------------------- /.github/workflows/githubci.yml: -------------------------------------------------------------------------------- 1 | name: Arduino Library CI 2 | 3 | on: [pull_request, push, repository_dispatch] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - uses: actions/setup-python@v4 11 | with: 12 | python-version: '3.x' 13 | - uses: actions/checkout@v3 14 | - uses: actions/checkout@v3 15 | with: 16 | repository: adafruit/ci-arduino 17 | path: ci 18 | 19 | - name: pre-install 20 | run: bash ci/actions_install.sh 21 | 22 | - name: test platforms 23 | run: python3 ci/build_platform.py zero 24 | 25 | - name: clang 26 | run: python3 ci/run-clang-format.py -e "ci/*" -e "bin/*" -r . 27 | 28 | - name: doxygen 29 | env: 30 | GH_REPO_TOKEN: ${{ secrets.GH_REPO_TOKEN }} 31 | PRETTYNAME : "Adafruit Zero FFT Library" 32 | run: bash ci/doxy_gen_and_deploy.sh 33 | -------------------------------------------------------------------------------- /arm_common_tables.h: -------------------------------------------------------------------------------- 1 | /* ---------------------------------------------------------------------- 2 | * Copyright (C) 2010 ARM Limited. All rights reserved. 3 | * 4 | * $Date: 11. November 2010 5 | * $Revision: V1.0.2 6 | * 7 | * Project: CMSIS DSP Library 8 | * Title: arm_common_tables.h 9 | * 10 | * Description: This file has extern declaration for common tables like 11 | * Bitreverse, reciprocal etc which are used across different functions 12 | * 13 | * Target Processor: Cortex-M4/Cortex-M3 14 | * 15 | * Version 1.0.2 2010/11/11 16 | * Documentation updated. 17 | * 18 | * Version 1.0.1 2010/10/05 19 | * Production release and review comments incorporated. 20 | * 21 | * Version 1.0.0 2010/09/20 22 | * Production release and review comments incorporated. 23 | * -------------------------------------------------------------------- */ 24 | 25 | #ifndef _ARM_COMMON_TABLES_H 26 | #define _ARM_COMMON_TABLES_H 27 | 28 | #include "Adafruit_ZeroFFT.h" 29 | 30 | extern const uint16_t armBitRevTable[1024]; 31 | extern const q15_t armRecipTableQ15[64]; 32 | extern const q31_t armRecipTableQ31[64]; 33 | extern const q31_t realCoefAQ31[1024]; 34 | extern const q31_t realCoefBQ31[1024]; 35 | extern const float32_t twiddleCoef[6144]; 36 | extern const q31_t twiddleCoefQ31[6144]; 37 | extern const q15_t twiddleCoefQ15[6144]; 38 | 39 | #endif /* ARM_COMMON_TABLES_H */ 40 | -------------------------------------------------------------------------------- /examples/fft_test/fft_test.ino: -------------------------------------------------------------------------------- 1 | /* This example shows the most basic usage of the Adafruit ZeroFFT library. 2 | * it calculates the FFT and prints out the results along with their corresponding frequency 3 | * 4 | * The signal.h file constains a 200hz sine wave mixed with a weaker 800hz sine wave. 5 | * The signal was generated at a sample rate of 8000hz. 6 | * 7 | * Note that you can print only the value (coment out the other two print statements) and use 8 | * the serial plotter tool to see a graph. 9 | */ 10 | 11 | #include "Adafruit_ZeroFFT.h" 12 | #include "signal.h" 13 | 14 | //the signal in signal.h has 2048 samples. Set this to a value between 16 and 2048 inclusive. 15 | //this must be a power of 2 16 | #define DATA_SIZE 256 17 | 18 | //the sample rate 19 | #define FS 8000 20 | 21 | // the setup routine runs once when you press reset: 22 | void setup() { 23 | Serial.begin(115200); 24 | while(!Serial); //wait for serial to be ready 25 | 26 | //run the FFT 27 | ZeroFFT(signal, DATA_SIZE); 28 | 29 | //data is only meaningful up to sample rate/2, discard the other half 30 | for(int i=0; i maxVal) maxVal = signal[i]; 32 | 33 | //normalize to the maximum returned value 34 | for(int i=0; i 7 | #include "Adafruit_ZeroFFT.h" 8 | 9 | //this must be a power of 2 10 | #define DATA_SIZE 256 11 | 12 | #define NUM_PIXELS 12 13 | 14 | //the sample rate 15 | #define FS 22000 16 | 17 | //the lowest frequency that will register on the meter 18 | #define FREQ_MIN 600 19 | 20 | //the highest frequency that will register on the meter 21 | #define FREQ_MAX 3000 22 | 23 | #define MIN_INDEX FFT_INDEX(FREQ_MIN, FS, DATA_SIZE) 24 | #define MAX_INDEX FFT_INDEX(FREQ_MAX, FS, DATA_SIZE) 25 | 26 | #define SCALE_FACTOR 32 27 | 28 | int16_t pixelData[NUM_PIXELS]; 29 | int16_t inputData[DATA_SIZE]; 30 | 31 | // the setup routine runs once when you press reset: 32 | void setup() { 33 | CircuitPlayground.begin(); 34 | } 35 | 36 | void loop() { 37 | CircuitPlayground.mic.capture(inputData, DATA_SIZE); 38 | 39 | /******************************* 40 | * REMOVE DC OFFSET 41 | ******************************/ 42 | int32_t avg = 0; 43 | int16_t *ptr = inputData; 44 | for(int i=0; i About Arduino menu): **INSERT ARDUINO 43 | VERSION HERE** 44 | 45 | - List the steps to reproduce the problem below (if possible attach a sketch or 46 | copy the sketch code in too): **LIST REPRO STEPS BELOW** 47 | -------------------------------------------------------------------------------- /examples/mic_tft/mic_tft.ino: -------------------------------------------------------------------------------- 1 | #include "Adafruit_ZeroFFT.h" 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | #define STMPE_CS 6 8 | #define TFT_CS 9 9 | #define TFT_DC 10 10 | #define SD_CS 5 11 | 12 | //set this to 0 to disable autoranging and scale to FFT_MAX 13 | #define AUTOSCALE 1 14 | 15 | #if AUTOSCALE == 0 16 | #define FFT_MAX 512 17 | #endif 18 | 19 | /*set this to a power of 2. 20 | * Lower = faster, lower resolution 21 | * Higher = slower, higher resolution 22 | */ 23 | #define DATA_SIZE 1024 24 | 25 | //the sample rate. 26 | #define FS 2360 27 | 28 | #define NUM_REFERENCE_LINES 6 29 | 30 | #define GRAPH_OFFSET 30 31 | 32 | #define GRAPH_WIDTH (tft.width() - 3) 33 | #define GRAPH_HEIGHT (tft.height() - GRAPH_OFFSET) 34 | 35 | #define GRAPH_MIN (tft.height() - 2) 36 | #define GRAPH_MAX (tft.height() - GRAPH_HEIGHT) 37 | static float xScale; 38 | 39 | Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); 40 | 41 | int16_t data[DATA_SIZE]; 42 | 43 | // the setup routine runs once when you press reset: 44 | void setup() { 45 | Serial.begin(115200); 46 | delay(10); 47 | //while(!Serial); 48 | Serial.println("FFT with TFT featherwing!"); 49 | 50 | pinMode(A0, OUTPUT); 51 | digitalWrite(A0, HIGH); 52 | pinMode(A1, OUTPUT); 53 | digitalWrite(A1, LOW); 54 | 55 | tft.begin(); 56 | tft.setRotation(1); 57 | } 58 | 59 | void drawReference(){ 60 | //draw some reference lines 61 | uint16_t refStep = DATA_SIZE / 2 / NUM_REFERENCE_LINES; 62 | tft.setTextSize(2); 63 | tft.setTextColor(ILI9341_RED); 64 | for(int i=0; i maxVal) maxVal = data[i]; 94 | 95 | //normalize to the maximum returned value 96 | for(int i=0; i 22 | 23 | #define FFT_BIN(num, fs, size) \ 24 | (num * \ 25 | ((float)fs / (float)size)) ///< return the center frequency of FFT bin 'num' 26 | ///< based on the sample rate and FFT stize 27 | #define FFT_INDEX(freq, fs, size) \ 28 | ((int)((float)freq / \ 29 | ((float)fs / \ 30 | (float)size))) ///< return the bin index where the specified frequency 31 | ///< 'freq' can be found based on the passed sample 32 | ///< rate and FFT size 33 | 34 | #ifndef ALIGN4 35 | #define ALIGN4 __attribute__((aligned(4))) ///< align to 4 bytes 36 | #endif 37 | 38 | #ifndef q15_t 39 | #define q15_t int16_t ///< a q15 fractional data type 40 | #endif 41 | 42 | #ifndef q31_t 43 | #define q31_t int32_t ///< a q31 fractional data type 44 | #endif 45 | 46 | #ifndef float32_t 47 | #define float32_t float ///< 32 bit floating point data type 48 | #endif 49 | 50 | #define ZERO_FFT_MAX 4096 ///< the maximum allowed FFT size 51 | 52 | #ifdef __cplusplus 53 | extern "C" { 54 | #endif // __cplusplus 55 | 56 | /**************************************************************************/ 57 | /*! 58 | @brief run an FFT on an int16_t array. Note that this is run in place. 59 | @param source the data to FFT 60 | @param length the length of the data. This must be a power of 2 and less 61 | than or equal to ZERO_FFT_MAX 62 | @return 0 on success, -1 on failure 63 | @note The FFT is run in place on the data. A hanning window is applied to 64 | the input data. The complex portion is discarded, and the real values are 65 | returned. 66 | */ 67 | /**************************************************************************/ 68 | extern int ZeroFFT(q15_t *source, uint16_t length); 69 | 70 | extern const q15_t window_hanning_16[]; ///< a hanning window of length 16 71 | extern const q15_t window_hanning_32[]; ///< a hanning window of length 32 72 | extern const q15_t window_hanning_64[]; ///< a hanning window of length 64 73 | extern const q15_t window_hanning_128[]; ///< a hanning window of length 128 74 | extern const q15_t window_hanning_256[]; ///< a hanning window of length 256 75 | extern const q15_t window_hanning_512[]; ///< a hanning window of length 512 76 | extern const q15_t window_hanning_1024[]; ///< a hanning window of length 1024 77 | extern const q15_t window_hanning_2048[]; ///< a hanning window of length 2048 78 | extern const q15_t window_hanning_4096[]; ///< a hanning window of length 4096 79 | 80 | #ifdef __cplusplus 81 | }; 82 | #endif // __cplusplus 83 | #include "arm_common_tables.h" 84 | 85 | #endif /* ADAFRUIT_ZEROFFT_ADAFRUIT_ZEROFFT_H_ */ 86 | -------------------------------------------------------------------------------- /examples/pdm_tft/pdm_tft.ino: -------------------------------------------------------------------------------- 1 | #include "Adafruit_ZeroFFT.h" 2 | #include "Adafruit_ZeroPDM.h" 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | #define SAMPLERATE_HZ 22000 9 | #define DECIMATION 64 10 | 11 | #define STMPE_CS 6 12 | #define TFT_CS 9 13 | #define TFT_DC 10 14 | #define SD_CS 5 15 | 16 | //set this to 0 to disable autoranging and scale to FFT_MAX 17 | #define AUTOSCALE 1 18 | 19 | #if AUTOSCALE == 0 20 | #define FFT_MAX 512 21 | #endif 22 | 23 | /*set this to a power of 2. 24 | * Lower = faster, lower resolution 25 | * Higher = slower, higher resolution 26 | */ 27 | #define DATA_SIZE 1024 28 | 29 | #define NUM_REFERENCE_LINES 6 30 | 31 | #define GRAPH_OFFSET 30 32 | 33 | #define GRAPH_WIDTH (tft.width() - 3) 34 | #define GRAPH_HEIGHT (tft.height() - GRAPH_OFFSET) 35 | 36 | #define GRAPH_MIN (tft.height() - 2) 37 | #define GRAPH_MAX (tft.height() - GRAPH_HEIGHT) 38 | static float xScale; 39 | 40 | Adafruit_ZeroPDM pdm = Adafruit_ZeroPDM(1, 4); 41 | Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); 42 | 43 | int16_t data[DATA_SIZE]; 44 | 45 | // a windowed sinc filter for 44 khz, 64 samples 46 | uint16_t sincfilter[DECIMATION] = {0, 2, 9, 21, 39, 63, 94, 132, 179, 236, 302, 379, 467, 565, 674, 792, 920, 1055, 1196, 1341, 1487, 1633, 1776, 1913, 2042, 2159, 2263, 2352, 2422, 2474, 2506, 2516, 2506, 2474, 2422, 2352, 2263, 2159, 2042, 1913, 1776, 1633, 1487, 1341, 1196, 1055, 920, 792, 674, 565, 467, 379, 302, 236, 179, 132, 94, 63, 39, 21, 9, 2, 0, 0}; 47 | 48 | // a manual loop-unroller! 49 | #define ADAPDM_REPEAT_LOOP_16(X) X X X X X X X X X X X X X X X X 50 | 51 | // the setup routine runs once when you press reset: 52 | void setup() { 53 | Serial.begin(115200); 54 | delay(10); 55 | //while(!Serial); 56 | Serial.println("FFT with TFT featherwing!"); 57 | 58 | // Initialize the PDM/I2S receiver 59 | if (!pdm.begin()) { 60 | Serial.println("Failed to initialize I2S/PDM!"); 61 | while (1); 62 | } 63 | 64 | // Configure PDM receiver, sample rate 65 | if (!pdm.configure(SAMPLERATE_HZ * DECIMATION / 16, true)) { 66 | Serial.println("Failed to configure PDM"); 67 | while (1); 68 | } 69 | Serial.println("PDM configured"); 70 | 71 | tft.begin(); 72 | tft.setRotation(1); 73 | } 74 | 75 | void drawReference(){ 76 | //draw some reference lines 77 | uint16_t refStep = DATA_SIZE / 2 / NUM_REFERENCE_LINES; 78 | tft.setTextSize(2); 79 | tft.setTextColor(ILI9341_RED); 80 | for(int i=0; i>= 1; 108 | } 109 | ) 110 | } 111 | 112 | avg += runningsum; 113 | data[i] = runningsum; 114 | } 115 | 116 | //remove DC offset 117 | avg = avg/DATA_SIZE; 118 | for(int i=0; i maxVal) maxVal = data[i]; 128 | 129 | //normalize to the maximum returned value 130 | for(int i=0; i 5 | #include 6 | #include 7 | 8 | #define SAMPLERATE_HZ 22000 9 | #define DECIMATION 64 10 | 11 | #define STMPE_CS 6 12 | #define TFT_CS 9 13 | #define TFT_DC 10 14 | #define SD_CS 5 15 | 16 | /*set this to a power of 2. 17 | * Lower = faster, lower resolution 18 | * Higher = slower, higher resolution 19 | */ 20 | #define DATA_SIZE 2048 21 | 22 | #define NUM_REFERENCE_LINES 6 23 | 24 | #define GRAPH_OFFSET 30 25 | 26 | #define GRAPH_WIDTH (tft.width() - 3) 27 | #define GRAPH_HEIGHT (tft.height() - GRAPH_OFFSET) 28 | 29 | #define GRAPH_MIN (tft.height() - 2) 30 | #define GRAPH_MAX (tft.height() - GRAPH_HEIGHT) 31 | static float xScale; 32 | 33 | Adafruit_ZeroPDM pdm = Adafruit_ZeroPDM(1, 4); 34 | Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); 35 | 36 | int16_t data[DATA_SIZE]; 37 | int16_t dataOld[320]; 38 | 39 | // a windowed sinc filter for 44 khz, 64 samples 40 | uint16_t sincfilter[DECIMATION] = {0, 2, 9, 21, 39, 63, 94, 132, 179, 236, 302, 379, 467, 565, 674, 792, 920, 1055, 1196, 1341, 1487, 1633, 1776, 1913, 2042, 2159, 2263, 2352, 2422, 2474, 2506, 2516, 2506, 2474, 2422, 2352, 2263, 2159, 2042, 1913, 1776, 1633, 1487, 1341, 1196, 1055, 920, 792, 674, 565, 467, 379, 302, 236, 179, 132, 94, 63, 39, 21, 9, 2, 0, 0}; 41 | 42 | // a manual loop-unroller! 43 | #define ADAPDM_REPEAT_LOOP_16(X) X X X X X X X X X X X X X X X X 44 | 45 | void drawReference(bool withText = false){ 46 | //draw some reference lines 47 | uint16_t refStep = DATA_SIZE / 2 / NUM_REFERENCE_LINES; 48 | tft.setTextSize(2); 49 | tft.setTextColor(ILI9341_RED); 50 | for(int i=0; i>= 1; 110 | } 111 | ) 112 | } 113 | 114 | avg += runningsum; 115 | data[i] = runningsum; 116 | } 117 | 118 | //remove DC offset 119 | avg = avg/DATA_SIZE; 120 | for(int i=0; i maxVal) maxVal = data[i]; 129 | 130 | //normalize to the maximum returned value 131 | int16_t ma = 0; 132 | for(int i=0; i 3) 136 | data[i] = (data[i] + data[i-1] + data[i-2] + data[i - 3]) / 4; 137 | 138 | else data[i] = 0; 139 | } 140 | 141 | //normalize again 142 | maxVal = 0; 143 | for(int i=0; i maxVal) maxVal = data[i]; 144 | 145 | for(int i=0; i pSrc[j]; */ 38 | /* pSrc[i+1u] <-> pSrc[j+1u] */ 39 | in = pSrc[i]; 40 | pSrc[i] = pSrc[j]; 41 | pSrc[j] = in; 42 | 43 | /* pSrc[i + fftLenBy2p1] <-> pSrc[j + fftLenBy2p1]; */ 44 | /* pSrc[i + fftLenBy2p1+1u] <-> pSrc[j + fftLenBy2p1+1u] */ 45 | in = pSrc[i + fftLenBy2p1]; 46 | pSrc[i + fftLenBy2p1] = pSrc[j + fftLenBy2p1]; 47 | pSrc[j + fftLenBy2p1] = in; 48 | } 49 | 50 | /* pSrc[i+1u] <-> pSrc[j+fftLenBy2]; */ 51 | /* pSrc[i+2] <-> pSrc[j+fftLenBy2+1u] */ 52 | in = pSrc[i + 1u]; 53 | pSrc[i + 1u] = pSrc[j + fftLenBy2]; 54 | pSrc[j + fftLenBy2] = in; 55 | 56 | /* Reading the index for the bit reversal */ 57 | j = *pBitRevTab; 58 | 59 | /* Updating the bit reversal index depending on the fft length */ 60 | pBitRevTab += bitRevFactor; 61 | } 62 | } 63 | 64 | void arm_radix2_butterfly_q15(q15_t *pSrc, uint32_t fftLen, q15_t *pCoef, 65 | uint16_t twidCoefModifier) { 66 | int i, j, k, l; 67 | int n1, n2, ia; 68 | q15_t xt, yt, cosVal, sinVal; 69 | 70 | // N = fftLen; 71 | n2 = fftLen; 72 | 73 | n1 = n2; 74 | n2 = n2 >> 1; 75 | ia = 0; 76 | 77 | // loop for groups 78 | for (j = 0; j < n2; j++) { 79 | cosVal = pCoef[ia * 2]; 80 | sinVal = pCoef[(ia * 2) + 1]; 81 | ia = ia + twidCoefModifier; 82 | 83 | // loop for butterfly 84 | for (i = j; i < fftLen; i += n1) { 85 | l = i + n2; 86 | xt = (pSrc[2 * i] >> 2u) - (pSrc[2 * l] >> 2u); 87 | pSrc[2 * i] = ((pSrc[2 * i] >> 2u) + (pSrc[2 * l] >> 2u)) >> 1u; 88 | 89 | yt = (pSrc[2 * i + 1] >> 2u) - (pSrc[2 * l + 1] >> 2u); 90 | pSrc[2 * i + 1] = 91 | ((pSrc[2 * l + 1] >> 2u) + (pSrc[2 * i + 1] >> 2u)) >> 1u; 92 | 93 | pSrc[2u * l] = (((int16_t)(((q31_t)xt * cosVal) >> 16)) + 94 | ((int16_t)(((q31_t)yt * sinVal) >> 16))); 95 | 96 | pSrc[2u * l + 1u] = (((int16_t)(((q31_t)yt * cosVal) >> 16)) - 97 | ((int16_t)(((q31_t)xt * sinVal) >> 16))); 98 | 99 | } // butterfly loop end 100 | 101 | } // groups loop end 102 | 103 | twidCoefModifier = twidCoefModifier << 1u; 104 | 105 | // loop for stage 106 | for (k = fftLen / 2; k > 2; k = k >> 1) { 107 | n1 = n2; 108 | n2 = n2 >> 1; 109 | ia = 0; 110 | 111 | // loop for groups 112 | for (j = 0; j < n2; j++) { 113 | cosVal = pCoef[ia * 2]; 114 | sinVal = pCoef[(ia * 2) + 1]; 115 | ia = ia + twidCoefModifier; 116 | 117 | // loop for butterfly 118 | for (i = j; i < fftLen; i += n1) { 119 | l = i + n2; 120 | xt = pSrc[2 * i] - pSrc[2 * l]; 121 | pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1u; 122 | 123 | yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; 124 | pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1u; 125 | 126 | pSrc[2u * l] = (((int16_t)(((q31_t)xt * cosVal) >> 16)) + 127 | ((int16_t)(((q31_t)yt * sinVal) >> 16))); 128 | 129 | pSrc[2u * l + 1u] = (((int16_t)(((q31_t)yt * cosVal) >> 16)) - 130 | ((int16_t)(((q31_t)xt * sinVal) >> 16))); 131 | 132 | } // butterfly loop end 133 | 134 | } // groups loop end 135 | 136 | twidCoefModifier = twidCoefModifier << 1u; 137 | } // stages loop end 138 | 139 | n1 = n2; 140 | n2 = n2 >> 1; 141 | ia = 0; 142 | 143 | // loop for groups 144 | for (j = 0; j < n2; j++) { 145 | cosVal = pCoef[ia * 2]; 146 | sinVal = pCoef[(ia * 2) + 1]; 147 | 148 | ia = ia + twidCoefModifier; 149 | 150 | // loop for butterfly 151 | for (i = j; i < fftLen; i += n1) { 152 | l = i + n2; 153 | xt = pSrc[2 * i] - pSrc[2 * l]; 154 | pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]); 155 | 156 | yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; 157 | pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]); 158 | 159 | pSrc[2u * l] = xt; 160 | 161 | pSrc[2u * l + 1u] = yt; 162 | 163 | } // butterfly loop end 164 | 165 | } // groups loop end 166 | 167 | twidCoefModifier = twidCoefModifier << 1u; 168 | } 169 | 170 | static inline void applyWindow(q15_t *src, const q15_t *window, uint16_t len) { 171 | while (len--) { 172 | int32_t val = *src * *window++; 173 | *src++ = val >> 15; 174 | } 175 | } 176 | 177 | int ZeroFFT(q15_t *source, uint16_t length) { 178 | uint16_t twidCoefModifier; 179 | uint16_t bitRevFactor; 180 | uint16_t *pBitRevTable; 181 | 182 | q15_t *pSrc = source; 183 | 184 | switch (length) { 185 | 186 | #if ZERO_FFT_MAX == 8192 187 | case 4096u: 188 | /* Initializations of structure parameters for 4096 point FFT */ 189 | 190 | /* Initialise the twiddle coef modifier value */ 191 | twidCoefModifier = 1u; 192 | /* Initialise the bit reversal table modifier */ 193 | bitRevFactor = 1u; 194 | /* Initialise the bit reversal table pointer */ 195 | pBitRevTable = (uint16_t *)armBitRevTable; 196 | 197 | applyWindow(source, window_hanning_4096, 4096); 198 | 199 | break; 200 | #endif 201 | 202 | #if ZERO_FFT_MAX >= 4096 203 | 204 | case 2048u: 205 | /* Initializations of structure parameters for 2048 point FFT */ 206 | 207 | /* Initialise the twiddle coef modifier value */ 208 | twidCoefModifier = 2u; 209 | /* Initialise the bit reversal table modifier */ 210 | bitRevFactor = 2u; 211 | /* Initialise the bit reversal table pointer */ 212 | pBitRevTable = (uint16_t *)&armBitRevTable[1]; 213 | 214 | applyWindow(source, window_hanning_2048, 2048); 215 | 216 | break; 217 | 218 | #endif 219 | 220 | #if ZERO_FFT_MAX >= 2048 221 | case 1024u: 222 | /* Initializations of structure parameters for 1024 point FFT */ 223 | twidCoefModifier = 4u; 224 | bitRevFactor = 4u; 225 | pBitRevTable = (uint16_t *)&armBitRevTable[3]; 226 | 227 | applyWindow(source, window_hanning_1024, 1024); 228 | break; 229 | #endif 230 | 231 | #if ZERO_FFT_MAX >= 1024 232 | case 512u: 233 | /* Initializations of structure parameters for 512 point FFT */ 234 | twidCoefModifier = 8u; 235 | bitRevFactor = 8u; 236 | pBitRevTable = (uint16_t *)&armBitRevTable[7]; 237 | 238 | applyWindow(source, window_hanning_512, 512); 239 | 240 | break; 241 | #endif 242 | 243 | #if ZERO_FFT_MAX >= 512 244 | case 256u: 245 | /* Initializations of structure parameters for 256 point FFT */ 246 | twidCoefModifier = 16u; 247 | bitRevFactor = 16u; 248 | pBitRevTable = (uint16_t *)&armBitRevTable[15]; 249 | 250 | applyWindow(source, window_hanning_256, 256); 251 | 252 | break; 253 | #endif 254 | 255 | case 128u: 256 | /* Initializations of structure parameters for 128 point FFT */ 257 | twidCoefModifier = 32u; 258 | bitRevFactor = 32u; 259 | pBitRevTable = (uint16_t *)&armBitRevTable[31]; 260 | 261 | applyWindow(source, window_hanning_128, 128); 262 | 263 | break; 264 | 265 | case 64u: 266 | /* Initializations of structure parameters for 64 point FFT */ 267 | twidCoefModifier = 64u; 268 | bitRevFactor = 64u; 269 | pBitRevTable = (uint16_t *)&armBitRevTable[63]; 270 | 271 | applyWindow(source, window_hanning_64, 64); 272 | 273 | break; 274 | 275 | case 32u: 276 | /* Initializations of structure parameters for 32 point FFT */ 277 | twidCoefModifier = 128u; 278 | bitRevFactor = 128u; 279 | pBitRevTable = (uint16_t *)&armBitRevTable[127]; 280 | 281 | applyWindow(source, window_hanning_32, 32); 282 | 283 | break; 284 | 285 | case 16u: 286 | /* Initializations of structure parameters for 16 point FFT */ 287 | twidCoefModifier = 256u; 288 | bitRevFactor = 256u; 289 | pBitRevTable = (uint16_t *)&armBitRevTable[255]; 290 | 291 | applyWindow(source, window_hanning_16, 16); 292 | 293 | break; 294 | 295 | default: 296 | /* Reporting argument error if fftSize is not valid value */ 297 | return -1; 298 | break; 299 | } 300 | 301 | // split the data 302 | q15_t *pOut = scratchData; 303 | for (int i = 0; i < length; i++) { 304 | *pOut++ = *pSrc++; // real 305 | *pOut++ = 0; // imaginary 306 | } 307 | 308 | arm_radix2_butterfly_q15(scratchData, length, (q15_t *)twiddleCoefQ15, 309 | twidCoefModifier); 310 | arm_bitreversal_q15(scratchData, length, bitRevFactor, pBitRevTable); 311 | 312 | pSrc = source; 313 | pOut = scratchData; 314 | for (int i = 0; i < length; i++) { 315 | q15_t val = *pOut++; 316 | uint32_t v = abs(val); 317 | *pSrc++ = v; 318 | pOut++; // discard imaginary phase val 319 | } 320 | 321 | return 0; 322 | } 323 | -------------------------------------------------------------------------------- /examples/fft_test/signal.h: -------------------------------------------------------------------------------- 1 | #ifndef _SIGNAL_H 2 | #define _SIGNAL_H 3 | 4 | #include "Adafruit_ZeroFFT.h" 5 | 6 | q15_t signal[] = { 7 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 8 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 9 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 10 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 11 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 12 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 13 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 14 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 15 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 16 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 17 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 18 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 19 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 20 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 21 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 22 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 23 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 24 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 25 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 26 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 27 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 28 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 29 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 30 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 31 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 32 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 33 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 34 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 35 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 36 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 37 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 38 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 39 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 40 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 41 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 42 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 43 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 44 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 45 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 46 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 47 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 48 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 49 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 50 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 51 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 52 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 53 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 54 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 55 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 56 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 57 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 58 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 59 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 60 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 61 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 62 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 63 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 64 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 65 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 66 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 67 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 68 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 69 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 70 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 71 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 72 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 73 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 74 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 75 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 76 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 77 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 78 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 79 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 80 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 81 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 82 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 83 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 84 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 85 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 86 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 87 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 88 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 89 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 90 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 91 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 92 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 93 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 94 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 95 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 96 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 97 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 98 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 99 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 100 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 101 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 102 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 103 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 104 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 105 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 106 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 107 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 108 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 109 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 110 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 111 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 112 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 113 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 114 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 115 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 116 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 117 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 118 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 119 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 120 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 121 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 122 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 123 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 124 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 125 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 126 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 127 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 128 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 129 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 130 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 131 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 132 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 133 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 134 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 135 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 136 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 137 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 138 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 139 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 140 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 141 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 142 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 143 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 144 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 145 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 146 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 147 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 148 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 149 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 150 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 151 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 152 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 153 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 154 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 155 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 156 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 157 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 158 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 159 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 160 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 161 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 162 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 163 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 164 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 165 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 166 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 167 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 168 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 169 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 170 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 171 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 172 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 173 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 174 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 175 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 176 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 177 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 178 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 179 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 180 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 181 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 182 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 183 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 184 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 185 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 186 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 187 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 188 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 189 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 190 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 191 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 192 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 193 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 194 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 195 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 196 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 197 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 198 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 199 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 200 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 201 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 202 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 203 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 204 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 205 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 206 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 207 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 208 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 209 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 210 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 211 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 212 | }; 213 | 214 | #endif 215 | -------------------------------------------------------------------------------- /examples/normalized/signal.h: -------------------------------------------------------------------------------- 1 | #ifndef _SIGNAL_H 2 | #define _SIGNAL_H 3 | 4 | #include "Adafruit_ZeroFFT.h" 5 | 6 | q15_t signal[] = { 7 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 8 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 9 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 10 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 11 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 12 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 13 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 14 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 15 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 16 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 17 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 18 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 19 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 20 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 21 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 22 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 23 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 24 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 25 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 26 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 27 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 28 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 29 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 30 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 31 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 32 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 33 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 34 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 35 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 36 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 37 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 38 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 39 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 40 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 41 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 42 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 43 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 44 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 45 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 46 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 47 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 48 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 49 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 50 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 51 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 52 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 53 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 54 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 55 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 56 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 57 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 58 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 59 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 60 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 61 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 62 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 63 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 64 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 65 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 66 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 67 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 68 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 69 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 70 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 71 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 72 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 73 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 74 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 75 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 76 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 77 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 78 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 79 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 80 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 81 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 82 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 83 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 84 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 85 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 86 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 87 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 88 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 89 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 90 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 91 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 92 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 93 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 94 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 95 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 96 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 97 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 98 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 99 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 100 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 101 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 102 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 103 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 104 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 105 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 106 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 107 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 108 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 109 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 110 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 111 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 112 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 113 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 114 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 115 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 116 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 117 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 118 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 119 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 120 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 121 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 122 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 123 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 124 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 125 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 126 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 127 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 128 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 129 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 130 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 131 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 132 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 133 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 134 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 135 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 136 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 137 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 138 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 139 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 140 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 141 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 142 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 143 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 144 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 145 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 146 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 147 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 148 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 149 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 150 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 151 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 152 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 153 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 154 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 155 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 156 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 157 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 158 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 159 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 160 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 161 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 162 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 163 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 164 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 165 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 166 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 167 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 168 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 169 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 170 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 171 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 172 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 173 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 174 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 175 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 176 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 177 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 178 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 179 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 180 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 181 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 182 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 183 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 184 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 185 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 186 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 187 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 188 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 189 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 190 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 191 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 192 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 193 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 194 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 195 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 196 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 197 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 198 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 199 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 200 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 201 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 202 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 203 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 204 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 205 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 206 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 207 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 18619, 24134, 208 | 26213, 24134, 18619, 11560, 5301, 1754, 1677, 4400, 8100, 10515, 209 | 9830, 5389, -2025, -10475, -17582, -21414, -21207, -17635, -12543, -8229, 210 | -6553, -8229, -12543, -17635, -21207, -21414, -17582, -10475, -2025, 5389, 211 | 9830, 10515, 8100, 4400, 1677, 1754, 5301, 11560, 212 | }; 213 | 214 | #endif 215 | -------------------------------------------------------------------------------- /fftwindows.c: -------------------------------------------------------------------------------- 1 | #include "Adafruit_ZeroFFT.h" 2 | 3 | const q15_t window_hanning_16[] = { 4 | 0, 1416, 5420, 11320, 18096, 24575, 29638, 32408, 5 | 32408, 29638, 24575, 18096, 11320, 5420, 1416, 0, 6 | }; 7 | 8 | const q15_t window_hanning_32[] = { 9 | 0, 335, 1327, 2936, 5095, 7717, 10693, 13902, 17213, 20490, 23598, 10 | 26411, 28814, 30708, 32015, 32682, 32682, 32015, 30708, 28814, 26411, 23598, 11 | 20490, 17213, 13902, 10693, 7717, 5095, 2936, 1327, 335, 0, 12 | }; 13 | 14 | const q15_t window_hanning_64[] = { 15 | 0, 81, 324, 727, 1286, 1995, 2846, 3833, 4943, 6168, 7494, 16 | 8909, 10397, 11946, 13538, 15159, 16791, 18420, 20029, 21601, 23121, 24575, 17 | 25947, 27224, 28393, 29443, 30363, 31144, 31778, 32260, 32584, 32746, 32746, 18 | 32584, 32260, 31778, 31144, 30363, 29443, 28393, 27224, 25947, 24575, 23121, 19 | 21601, 20029, 18420, 16791, 15159, 13538, 11946, 10397, 8909, 7494, 6168, 20 | 4943, 3833, 2846, 1995, 1286, 727, 324, 81, 0, 21 | }; 22 | 23 | const q15_t window_hanning_128[] = { 24 | 0, 20, 80, 180, 319, 498, 716, 972, 1266, 1597, 1964, 25 | 2366, 2803, 3273, 3775, 4308, 4870, 5461, 6078, 6720, 7386, 8075, 26 | 8783, 9510, 10254, 11013, 11785, 12568, 13361, 14161, 14966, 15775, 16586, 27 | 17396, 18203, 19006, 19803, 20591, 21369, 22134, 22886, 23622, 24340, 25038, 28 | 25716, 26370, 27000, 27604, 28181, 28729, 29246, 29732, 30186, 30605, 30990, 29 | 31339, 31652, 31927, 32164, 32362, 32521, 32641, 32721, 32761, 32761, 32721, 30 | 32641, 32521, 32362, 32164, 31927, 31652, 31339, 30990, 30605, 30186, 29732, 31 | 29246, 28729, 28181, 27604, 27000, 26370, 25716, 25038, 24340, 23622, 22886, 32 | 22134, 21369, 20591, 19803, 19006, 18203, 17396, 16586, 15775, 14966, 14161, 33 | 13361, 12568, 11785, 11013, 10254, 9510, 8783, 8075, 7386, 6720, 6078, 34 | 5461, 4870, 4308, 3775, 3273, 2803, 2366, 1964, 1597, 1266, 972, 35 | 716, 498, 319, 180, 80, 20, 0, 36 | }; 37 | 38 | const q15_t window_hanning_256[] = { 39 | 0, 4, 19, 44, 79, 124, 178, 243, 317, 401, 494, 40 | 598, 710, 833, 965, 1106, 1256, 1416, 1585, 1762, 1949, 2144, 41 | 2348, 2561, 2782, 3011, 3248, 3493, 3746, 4007, 4275, 4551, 4834, 42 | 5124, 5420, 5724, 6033, 6349, 6672, 7000, 7333, 7673, 8017, 8367, 43 | 8721, 9080, 9444, 9812, 10183, 10559, 10938, 11320, 11706, 12094, 12485, 44 | 12878, 13273, 13671, 14070, 14470, 14871, 15274, 15677, 16080, 16484, 16888, 45 | 17291, 17694, 18096, 18496, 18896, 19294, 19691, 20085, 20477, 20867, 21253, 46 | 21637, 22018, 22395, 22769, 23139, 23505, 23866, 24223, 24575, 24922, 25264, 47 | 25600, 25931, 26256, 26575, 26888, 27195, 27495, 27788, 28074, 28354, 28626, 48 | 28890, 29147, 29396, 29638, 29871, 30096, 30313, 30521, 30720, 30911, 31094, 49 | 31267, 31431, 31586, 31732, 31868, 31996, 32113, 32221, 32320, 32408, 32488, 50 | 32557, 32616, 32666, 32706, 32735, 32755, 32765, 32765, 32755, 32735, 32706, 51 | 32666, 32616, 32557, 32488, 32408, 32320, 32221, 32113, 31996, 31868, 31732, 52 | 31586, 31431, 31267, 31094, 30911, 30720, 30521, 30313, 30096, 29871, 29638, 53 | 29396, 29147, 28890, 28626, 28354, 28074, 27788, 27495, 27195, 26888, 26575, 54 | 26256, 25931, 25600, 25264, 24922, 24575, 24223, 23866, 23505, 23139, 22769, 55 | 22395, 22018, 21637, 21253, 20867, 20477, 20085, 19691, 19294, 18896, 18496, 56 | 18096, 17694, 17291, 16888, 16484, 16080, 15677, 15274, 14871, 14470, 14070, 57 | 13671, 13273, 12878, 12485, 12094, 11706, 11320, 10938, 10559, 10183, 9812, 58 | 9444, 9080, 8721, 8367, 8017, 7673, 7333, 7000, 6672, 6349, 6033, 59 | 5724, 5420, 5124, 4834, 4551, 4275, 4007, 3746, 3493, 3248, 3011, 60 | 2782, 2561, 2348, 2144, 1949, 1762, 1585, 1416, 1256, 1106, 965, 61 | 833, 710, 598, 494, 401, 317, 243, 178, 124, 79, 44, 62 | 19, 4, 0, 63 | }; 64 | 65 | const q15_t window_hanning_512[] = { 66 | 0, 1, 4, 11, 19, 30, 44, 60, 79, 100, 123, 67 | 149, 178, 208, 242, 277, 316, 356, 399, 445, 492, 543, 68 | 595, 650, 708, 767, 830, 894, 961, 1030, 1102, 1175, 1251, 69 | 1330, 1410, 1493, 1579, 1666, 1756, 1847, 1941, 2038, 2136, 2237, 70 | 2339, 2444, 2551, 2660, 2771, 2884, 2999, 3117, 3236, 3357, 3480, 71 | 3605, 3732, 3861, 3992, 4125, 4259, 4396, 4534, 4674, 4816, 4959, 72 | 5105, 5252, 5400, 5551, 5703, 5856, 6011, 6168, 6326, 6486, 6647, 73 | 6810, 6974, 7140, 7307, 7475, 7645, 7816, 7989, 8162, 8337, 8513, 74 | 8690, 8869, 9048, 9229, 9411, 9594, 9778, 9962, 10148, 10335, 10523, 75 | 10711, 10901, 11091, 11282, 11474, 11666, 11860, 12054, 12248, 12443, 12639, 76 | 12836, 13033, 13230, 13428, 13626, 13825, 14024, 14224, 14424, 14624, 14824, 77 | 15025, 15226, 15427, 15628, 15829, 16030, 16232, 16433, 16635, 16836, 17038, 78 | 17239, 17440, 17641, 17842, 18042, 18242, 18442, 18642, 18841, 19040, 19239, 79 | 19437, 19635, 19832, 20029, 20225, 20420, 20615, 20810, 21003, 21196, 21388, 80 | 21580, 21770, 21960, 22149, 22337, 22525, 22711, 22896, 23080, 23264, 23446, 81 | 23627, 23807, 23986, 24164, 24341, 24517, 24691, 24864, 25035, 25206, 25375, 82 | 25543, 25709, 25874, 26037, 26199, 26360, 26519, 26677, 26832, 26987, 27140, 83 | 27291, 27440, 27588, 27734, 27879, 28021, 28162, 28301, 28439, 28574, 28708, 84 | 28839, 28969, 29097, 29223, 29348, 29470, 29590, 29708, 29824, 29939, 30051, 85 | 30161, 30269, 30375, 30478, 30580, 30679, 30777, 30872, 30965, 31056, 31144, 86 | 31230, 31314, 31396, 31476, 31553, 31628, 31700, 31771, 31839, 31904, 31968, 87 | 32029, 32087, 32144, 32197, 32249, 32298, 32344, 32389, 32430, 32470, 32507, 88 | 32541, 32573, 32603, 32630, 32655, 32677, 32697, 32714, 32729, 32741, 32751, 89 | 32759, 32764, 32766, 32766, 32764, 32759, 32751, 32741, 32729, 32714, 32697, 90 | 32677, 32655, 32630, 32603, 32573, 32541, 32507, 32470, 32430, 32389, 32344, 91 | 32298, 32249, 32197, 32144, 32087, 32029, 31968, 31904, 31839, 31771, 31700, 92 | 31628, 31553, 31476, 31396, 31314, 31230, 31144, 31056, 30965, 30872, 30777, 93 | 30679, 30580, 30478, 30375, 30269, 30161, 30051, 29939, 29824, 29708, 29590, 94 | 29470, 29348, 29223, 29097, 28969, 28839, 28708, 28574, 28439, 28301, 28162, 95 | 28021, 27879, 27734, 27588, 27440, 27291, 27140, 26987, 26832, 26677, 26519, 96 | 26360, 26199, 26037, 25874, 25709, 25543, 25375, 25206, 25035, 24864, 24691, 97 | 24517, 24341, 24164, 23986, 23807, 23627, 23446, 23264, 23080, 22896, 22711, 98 | 22525, 22337, 22149, 21960, 21770, 21580, 21388, 21196, 21003, 20810, 20615, 99 | 20420, 20225, 20029, 19832, 19635, 19437, 19239, 19040, 18841, 18642, 18442, 100 | 18242, 18042, 17842, 17641, 17440, 17239, 17038, 16836, 16635, 16433, 16232, 101 | 16030, 15829, 15628, 15427, 15226, 15025, 14824, 14624, 14424, 14224, 14024, 102 | 13825, 13626, 13428, 13230, 13033, 12836, 12639, 12443, 12248, 12054, 11860, 103 | 11666, 11474, 11282, 11091, 10901, 10711, 10523, 10335, 10148, 9962, 9778, 104 | 9594, 9411, 9229, 9048, 8869, 8690, 8513, 8337, 8162, 7989, 7816, 105 | 7645, 7475, 7307, 7140, 6974, 6810, 6647, 6486, 6326, 6168, 6011, 106 | 5856, 5703, 5551, 5400, 5252, 5105, 4959, 4816, 4674, 4534, 4396, 107 | 4259, 4125, 3992, 3861, 3732, 3605, 3480, 3357, 3236, 3117, 2999, 108 | 2884, 2771, 2660, 2551, 2444, 2339, 2237, 2136, 2038, 1941, 1847, 109 | 1756, 1666, 1579, 1493, 1410, 1330, 1251, 1175, 1102, 1030, 961, 110 | 894, 830, 767, 708, 650, 595, 543, 492, 445, 399, 356, 111 | 316, 277, 242, 208, 178, 149, 123, 100, 79, 60, 44, 112 | 30, 19, 11, 4, 1, 0, 113 | }; 114 | 115 | const q15_t window_hanning_1024[] = { 116 | 0, 0, 1, 2, 4, 7, 11, 15, 19, 25, 30, 117 | 37, 44, 52, 60, 69, 79, 89, 100, 111, 123, 136, 118 | 149, 163, 177, 192, 208, 224, 241, 259, 277, 296, 315, 119 | 335, 355, 377, 398, 421, 444, 467, 491, 516, 542, 568, 120 | 594, 621, 649, 677, 706, 736, 766, 797, 828, 860, 892, 121 | 925, 959, 993, 1028, 1063, 1099, 1136, 1173, 1211, 1249, 1288, 122 | 1327, 1367, 1408, 1449, 1491, 1533, 1576, 1619, 1663, 1707, 1752, 123 | 1798, 1844, 1891, 1938, 1986, 2034, 2083, 2132, 2182, 2232, 2283, 124 | 2335, 2387, 2439, 2493, 2546, 2600, 2655, 2710, 2766, 2822, 2879, 125 | 2936, 2994, 3052, 3111, 3170, 3230, 3290, 3351, 3412, 3474, 3536, 126 | 3599, 3662, 3725, 3789, 3854, 3919, 3985, 4051, 4117, 4184, 4252, 127 | 4319, 4388, 4456, 4526, 4595, 4665, 4736, 4807, 4878, 4950, 5023, 128 | 5095, 5168, 5242, 5316, 5390, 5465, 5540, 5616, 5692, 5769, 5845, 129 | 5923, 6000, 6078, 6157, 6236, 6315, 6394, 6474, 6555, 6635, 6716, 130 | 6798, 6880, 6962, 7044, 7127, 7210, 7294, 7378, 7462, 7547, 7631, 131 | 7717, 7802, 7888, 7974, 8061, 8148, 8235, 8322, 8410, 8498, 8586, 132 | 8675, 8764, 8853, 8943, 9033, 9123, 9213, 9304, 9395, 9486, 9577, 133 | 9669, 9761, 9853, 9945, 10038, 10131, 10224, 10317, 10411, 10505, 10599, 134 | 10693, 10787, 10882, 10977, 11072, 11167, 11263, 11359, 11454, 11550, 11647, 135 | 11743, 11840, 11936, 12033, 12130, 12228, 12325, 12423, 12520, 12618, 12716, 136 | 12814, 12913, 13011, 13110, 13208, 13307, 13406, 13505, 13604, 13703, 13803, 137 | 13902, 14002, 14101, 14201, 14301, 14401, 14500, 14600, 14700, 14801, 14901, 138 | 15001, 15101, 15202, 15302, 15402, 15503, 15603, 15704, 15805, 15905, 16006, 139 | 16106, 16207, 16308, 16408, 16509, 16609, 16710, 16811, 16911, 17012, 17112, 140 | 17213, 17313, 17414, 17514, 17615, 17715, 17815, 17915, 18015, 18116, 18216, 141 | 18316, 18415, 18515, 18615, 18715, 18814, 18914, 19013, 19112, 19211, 19311, 142 | 19409, 19508, 19607, 19706, 19804, 19902, 20001, 20099, 20197, 20294, 20392, 143 | 20490, 20587, 20684, 20781, 20878, 20975, 21071, 21167, 21264, 21360, 21455, 144 | 21551, 21646, 21742, 21837, 21931, 22026, 22120, 22214, 22308, 22402, 22495, 145 | 22589, 22682, 22775, 22867, 22959, 23051, 23143, 23235, 23326, 23417, 23508, 146 | 23598, 23688, 23778, 23868, 23957, 24046, 24135, 24224, 24312, 24400, 24487, 147 | 24575, 24662, 24748, 24835, 24921, 25007, 25092, 25177, 25262, 25346, 25430, 148 | 25514, 25597, 25680, 25763, 25845, 25927, 26009, 26090, 26171, 26252, 26332, 149 | 26411, 26491, 26570, 26648, 26727, 26805, 26882, 26959, 27036, 27112, 27188, 150 | 27263, 27338, 27413, 27487, 27561, 27634, 27707, 27780, 27852, 27923, 27995, 151 | 28065, 28136, 28206, 28275, 28344, 28412, 28481, 28548, 28615, 28682, 28748, 152 | 28814, 28879, 28944, 29009, 29073, 29136, 29199, 29261, 29323, 29385, 29446, 153 | 29506, 29566, 29626, 29685, 29743, 29801, 29859, 29916, 29972, 30028, 30083, 154 | 30138, 30193, 30247, 30300, 30353, 30405, 30457, 30508, 30559, 30609, 30659, 155 | 30708, 30756, 30804, 30852, 30899, 30945, 30991, 31036, 31081, 31125, 31169, 156 | 31212, 31254, 31296, 31338, 31379, 31419, 31459, 31498, 31536, 31574, 31612, 157 | 31648, 31685, 31720, 31755, 31790, 31824, 31857, 31890, 31922, 31954, 31985, 158 | 32015, 32045, 32074, 32103, 32131, 32158, 32185, 32211, 32237, 32262, 32287, 159 | 32311, 32334, 32357, 32379, 32400, 32421, 32441, 32461, 32480, 32498, 32516, 160 | 32533, 32550, 32566, 32581, 32596, 32610, 32624, 32637, 32649, 32661, 32672, 161 | 32682, 32692, 32702, 32710, 32718, 32726, 32732, 32739, 32744, 32749, 32753, 162 | 32757, 32760, 32763, 32765, 32766, 32766, 32766, 32766, 32765, 32763, 32760, 163 | 32757, 32753, 32749, 32744, 32739, 32732, 32726, 32718, 32710, 32702, 32692, 164 | 32682, 32672, 32661, 32649, 32637, 32624, 32610, 32596, 32581, 32566, 32550, 165 | 32533, 32516, 32498, 32480, 32461, 32441, 32421, 32400, 32379, 32357, 32334, 166 | 32311, 32287, 32262, 32237, 32211, 32185, 32158, 32131, 32103, 32074, 32045, 167 | 32015, 31985, 31954, 31922, 31890, 31857, 31824, 31790, 31755, 31720, 31685, 168 | 31648, 31612, 31574, 31536, 31498, 31459, 31419, 31379, 31338, 31296, 31254, 169 | 31212, 31169, 31125, 31081, 31036, 30991, 30945, 30899, 30852, 30804, 30756, 170 | 30708, 30659, 30609, 30559, 30508, 30457, 30405, 30353, 30300, 30247, 30193, 171 | 30138, 30083, 30028, 29972, 29916, 29859, 29801, 29743, 29685, 29626, 29566, 172 | 29506, 29446, 29385, 29323, 29261, 29199, 29136, 29073, 29009, 28944, 28879, 173 | 28814, 28748, 28682, 28615, 28548, 28481, 28412, 28344, 28275, 28206, 28136, 174 | 28065, 27995, 27923, 27852, 27780, 27707, 27634, 27561, 27487, 27413, 27338, 175 | 27263, 27188, 27112, 27036, 26959, 26882, 26805, 26727, 26648, 26570, 26491, 176 | 26411, 26332, 26252, 26171, 26090, 26009, 25927, 25845, 25763, 25680, 25597, 177 | 25514, 25430, 25346, 25262, 25177, 25092, 25007, 24921, 24835, 24748, 24662, 178 | 24575, 24487, 24400, 24312, 24224, 24135, 24046, 23957, 23868, 23778, 23688, 179 | 23598, 23508, 23417, 23326, 23235, 23143, 23051, 22959, 22867, 22775, 22682, 180 | 22589, 22495, 22402, 22308, 22214, 22120, 22026, 21931, 21837, 21742, 21646, 181 | 21551, 21455, 21360, 21264, 21167, 21071, 20975, 20878, 20781, 20684, 20587, 182 | 20490, 20392, 20294, 20197, 20099, 20001, 19902, 19804, 19706, 19607, 19508, 183 | 19409, 19311, 19211, 19112, 19013, 18914, 18814, 18715, 18615, 18515, 18415, 184 | 18316, 18216, 18116, 18015, 17915, 17815, 17715, 17615, 17514, 17414, 17313, 185 | 17213, 17112, 17012, 16911, 16811, 16710, 16609, 16509, 16408, 16308, 16207, 186 | 16106, 16006, 15905, 15805, 15704, 15603, 15503, 15402, 15302, 15202, 15101, 187 | 15001, 14901, 14801, 14700, 14600, 14500, 14401, 14301, 14201, 14101, 14002, 188 | 13902, 13803, 13703, 13604, 13505, 13406, 13307, 13208, 13110, 13011, 12913, 189 | 12814, 12716, 12618, 12520, 12423, 12325, 12228, 12130, 12033, 11936, 11840, 190 | 11743, 11647, 11550, 11454, 11359, 11263, 11167, 11072, 10977, 10882, 10787, 191 | 10693, 10599, 10505, 10411, 10317, 10224, 10131, 10038, 9945, 9853, 9761, 192 | 9669, 9577, 9486, 9395, 9304, 9213, 9123, 9033, 8943, 8853, 8764, 193 | 8675, 8586, 8498, 8410, 8322, 8235, 8148, 8061, 7974, 7888, 7802, 194 | 7717, 7631, 7547, 7462, 7378, 7294, 7210, 7127, 7044, 6962, 6880, 195 | 6798, 6716, 6635, 6555, 6474, 6394, 6315, 6236, 6157, 6078, 6000, 196 | 5923, 5845, 5769, 5692, 5616, 5540, 5465, 5390, 5316, 5242, 5168, 197 | 5095, 5023, 4950, 4878, 4807, 4736, 4665, 4595, 4526, 4456, 4388, 198 | 4319, 4252, 4184, 4117, 4051, 3985, 3919, 3854, 3789, 3725, 3662, 199 | 3599, 3536, 3474, 3412, 3351, 3290, 3230, 3170, 3111, 3052, 2994, 200 | 2936, 2879, 2822, 2766, 2710, 2655, 2600, 2546, 2493, 2439, 2387, 201 | 2335, 2283, 2232, 2182, 2132, 2083, 2034, 1986, 1938, 1891, 1844, 202 | 1798, 1752, 1707, 1663, 1619, 1576, 1533, 1491, 1449, 1408, 1367, 203 | 1327, 1288, 1249, 1211, 1173, 1136, 1099, 1063, 1028, 993, 959, 204 | 925, 892, 860, 828, 797, 766, 736, 706, 677, 649, 621, 205 | 594, 568, 542, 516, 491, 467, 444, 421, 398, 377, 355, 206 | 335, 315, 296, 277, 259, 241, 224, 208, 192, 177, 163, 207 | 149, 136, 123, 111, 100, 89, 79, 69, 60, 52, 44, 208 | 37, 30, 25, 19, 15, 11, 7, 4, 2, 1, 0, 209 | 0, 210 | }; 211 | 212 | const q15_t window_hanning_2048[] = { 213 | 0, 0, 0, 0, 1, 1, 2, 3, 4, 6, 7, 214 | 9, 11, 13, 15, 17, 19, 22, 24, 27, 30, 34, 215 | 37, 40, 44, 48, 52, 56, 60, 64, 69, 74, 78, 216 | 83, 89, 94, 99, 105, 111, 117, 123, 129, 135, 142, 217 | 149, 156, 163, 170, 177, 184, 192, 200, 208, 216, 224, 218 | 232, 241, 250, 258, 267, 277, 286, 295, 305, 315, 325, 219 | 335, 345, 355, 366, 376, 387, 398, 409, 420, 432, 443, 220 | 455, 467, 479, 491, 503, 516, 528, 541, 554, 567, 580, 221 | 594, 607, 621, 634, 648, 663, 677, 691, 706, 720, 735, 222 | 750, 765, 781, 796, 811, 827, 843, 859, 875, 892, 908, 223 | 925, 941, 958, 975, 992, 1010, 1027, 1045, 1062, 1080, 1098, 224 | 1117, 1135, 1153, 1172, 1191, 1210, 1229, 1248, 1267, 1287, 1306, 225 | 1326, 1346, 1366, 1386, 1406, 1427, 1447, 1468, 1489, 1510, 1531, 226 | 1553, 1574, 1596, 1617, 1639, 1661, 1683, 1706, 1728, 1751, 1773, 227 | 1796, 1819, 1842, 1865, 1889, 1912, 1936, 1960, 1984, 2008, 2032, 228 | 2056, 2081, 2105, 2130, 2155, 2180, 2205, 2230, 2256, 2281, 2307, 229 | 2333, 2359, 2385, 2411, 2437, 2464, 2490, 2517, 2544, 2571, 2598, 230 | 2625, 2652, 2680, 2708, 2735, 2763, 2791, 2819, 2848, 2876, 2905, 231 | 2933, 2962, 2991, 3020, 3049, 3078, 3108, 3137, 3167, 3197, 3227, 232 | 3257, 3287, 3317, 3348, 3378, 3409, 3439, 3470, 3501, 3533, 3564, 233 | 3595, 3627, 3658, 3690, 3722, 3754, 3786, 3818, 3850, 3883, 3916, 234 | 3948, 3981, 4014, 4047, 4080, 4113, 4147, 4180, 4214, 4248, 4281, 235 | 4315, 4349, 4384, 4418, 4452, 4487, 4521, 4556, 4591, 4626, 4661, 236 | 4696, 4732, 4767, 4803, 4838, 4874, 4910, 4946, 4982, 5018, 5054, 237 | 5091, 5127, 5164, 5200, 5237, 5274, 5311, 5348, 5385, 5423, 5460, 238 | 5498, 5535, 5573, 5611, 5649, 5687, 5725, 5763, 5802, 5840, 5879, 239 | 5917, 5956, 5995, 6034, 6073, 6112, 6151, 6191, 6230, 6269, 6309, 240 | 6349, 6389, 6428, 6468, 6509, 6549, 6589, 6629, 6670, 6710, 6751, 241 | 6792, 6833, 6873, 6914, 6956, 6997, 7038, 7079, 7121, 7162, 7204, 242 | 7246, 7287, 7329, 7371, 7413, 7455, 7498, 7540, 7582, 7625, 7667, 243 | 7710, 7753, 7795, 7838, 7881, 7924, 7967, 8010, 8054, 8097, 8140, 244 | 8184, 8228, 8271, 8315, 8359, 8403, 8447, 8491, 8535, 8579, 8623, 245 | 8667, 8712, 8756, 8801, 8846, 8890, 8935, 8980, 9025, 9070, 9115, 246 | 9160, 9205, 9250, 9296, 9341, 9386, 9432, 9477, 9523, 9569, 9614, 247 | 9660, 9706, 9752, 9798, 9844, 9890, 9937, 9983, 10029, 10076, 10122, 248 | 10169, 10215, 10262, 10308, 10355, 10402, 10449, 10496, 10543, 10590, 10637, 249 | 10684, 10731, 10778, 10825, 10873, 10920, 10968, 11015, 11063, 11110, 11158, 250 | 11206, 11253, 11301, 11349, 11397, 11445, 11493, 11541, 11589, 11637, 11685, 251 | 11733, 11781, 11830, 11878, 11926, 11975, 12023, 12072, 12120, 12169, 12218, 252 | 12266, 12315, 12364, 12412, 12461, 12510, 12559, 12608, 12657, 12706, 12755, 253 | 12804, 12853, 12902, 12951, 13000, 13050, 13099, 13148, 13198, 13247, 13296, 254 | 13346, 13395, 13445, 13494, 13544, 13593, 13643, 13692, 13742, 13792, 13841, 255 | 13891, 13941, 13990, 14040, 14090, 14140, 14189, 14239, 14289, 14339, 14389, 256 | 14439, 14489, 14539, 14589, 14639, 14689, 14739, 14789, 14839, 14889, 14939, 257 | 14989, 15039, 15089, 15140, 15190, 15240, 15290, 15340, 15390, 15441, 15491, 258 | 15541, 15591, 15641, 15692, 15742, 15792, 15842, 15893, 15943, 15993, 16044, 259 | 16094, 16144, 16194, 16245, 16295, 16345, 16396, 16446, 16496, 16546, 16597, 260 | 16647, 16697, 16748, 16798, 16848, 16898, 16949, 16999, 17049, 17099, 17150, 261 | 17200, 17250, 17300, 17350, 17401, 17451, 17501, 17551, 17601, 17652, 17702, 262 | 17752, 17802, 17852, 17902, 17952, 18002, 18052, 18102, 18152, 18202, 18252, 263 | 18302, 18352, 18402, 18452, 18502, 18552, 18601, 18651, 18701, 18751, 18801, 264 | 18850, 18900, 18950, 18999, 19049, 19099, 19148, 19198, 19247, 19297, 19346, 265 | 19396, 19445, 19494, 19544, 19593, 19642, 19692, 19741, 19790, 19839, 19888, 266 | 19938, 19987, 20036, 20085, 20134, 20183, 20231, 20280, 20329, 20378, 20427, 267 | 20475, 20524, 20573, 20621, 20670, 20718, 20767, 20815, 20864, 20912, 20960, 268 | 21009, 21057, 21105, 21153, 21201, 21249, 21297, 21345, 21393, 21441, 21489, 269 | 21537, 21584, 21632, 21680, 21727, 21775, 21822, 21870, 21917, 21964, 22011, 270 | 22059, 22106, 22153, 22200, 22247, 22294, 22341, 22388, 22434, 22481, 22528, 271 | 22574, 22621, 22667, 22714, 22760, 22806, 22852, 22899, 22945, 22991, 23037, 272 | 23083, 23129, 23174, 23220, 23266, 23311, 23357, 23402, 23448, 23493, 23538, 273 | 23584, 23629, 23674, 23719, 23764, 23809, 23853, 23898, 23943, 23987, 24032, 274 | 24076, 24121, 24165, 24209, 24253, 24297, 24341, 24385, 24429, 24473, 24517, 275 | 24560, 24604, 24647, 24691, 24734, 24777, 24820, 24863, 24906, 24949, 24992, 276 | 25035, 25077, 25120, 25163, 25205, 25247, 25290, 25332, 25374, 25416, 25458, 277 | 25500, 25541, 25583, 25625, 25666, 25707, 25749, 25790, 25831, 25872, 25913, 278 | 25954, 25995, 26035, 26076, 26116, 26157, 26197, 26237, 26277, 26318, 26357, 279 | 26397, 26437, 26477, 26516, 26556, 26595, 26634, 26674, 26713, 26752, 26791, 280 | 26829, 26868, 26907, 26945, 26984, 27022, 27060, 27098, 27136, 27174, 27212, 281 | 27249, 27287, 27325, 27362, 27399, 27436, 27473, 27510, 27547, 27584, 27621, 282 | 27657, 27694, 27730, 27766, 27802, 27838, 27874, 27910, 27946, 27981, 28017, 283 | 28052, 28087, 28122, 28157, 28192, 28227, 28262, 28296, 28331, 28365, 28399, 284 | 28434, 28468, 28502, 28535, 28569, 28603, 28636, 28669, 28702, 28736, 28769, 285 | 28801, 28834, 28867, 28899, 28932, 28964, 28996, 29028, 29060, 29092, 29124, 286 | 29155, 29187, 29218, 29249, 29280, 29311, 29342, 29373, 29403, 29434, 29464, 287 | 29494, 29524, 29554, 29584, 29614, 29643, 29673, 29702, 29731, 29761, 29790, 288 | 29818, 29847, 29876, 29904, 29932, 29961, 29989, 30017, 30045, 30072, 30100, 289 | 30127, 30155, 30182, 30209, 30236, 30262, 30289, 30316, 30342, 30368, 30394, 290 | 30420, 30446, 30472, 30498, 30523, 30548, 30574, 30599, 30624, 30648, 30673, 291 | 30698, 30722, 30746, 30770, 30794, 30818, 30842, 30866, 30889, 30912, 30935, 292 | 30958, 30981, 31004, 31027, 31049, 31072, 31094, 31116, 31138, 31160, 31181, 293 | 31203, 31224, 31245, 31266, 31287, 31308, 31329, 31349, 31370, 31390, 31410, 294 | 31430, 31450, 31470, 31489, 31509, 31528, 31547, 31566, 31585, 31603, 31622, 295 | 31640, 31659, 31677, 31695, 31712, 31730, 31748, 31765, 31782, 31799, 31816, 296 | 31833, 31850, 31866, 31883, 31899, 31915, 31931, 31947, 31962, 31978, 31993, 297 | 32008, 32023, 32038, 32053, 32068, 32082, 32096, 32111, 32125, 32138, 32152, 298 | 32166, 32179, 32192, 32206, 32219, 32231, 32244, 32257, 32269, 32281, 32293, 299 | 32305, 32317, 32329, 32340, 32351, 32362, 32374, 32384, 32395, 32406, 32416, 300 | 32426, 32436, 32446, 32456, 32466, 32475, 32485, 32494, 32503, 32512, 32521, 301 | 32529, 32538, 32546, 32554, 32562, 32570, 32578, 32585, 32593, 32600, 32607, 302 | 32614, 32621, 32627, 32634, 32640, 32646, 32652, 32658, 32664, 32669, 32675, 303 | 32680, 32685, 32690, 32695, 32699, 32704, 32708, 32712, 32716, 32720, 32724, 304 | 32727, 32731, 32734, 32737, 32740, 32743, 32745, 32748, 32750, 32752, 32754, 305 | 32756, 32758, 32760, 32761, 32762, 32763, 32764, 32765, 32766, 32766, 32766, 306 | 32766, 32766, 32766, 32766, 32766, 32765, 32764, 32763, 32762, 32761, 32760, 307 | 32758, 32756, 32754, 32752, 32750, 32748, 32745, 32743, 32740, 32737, 32734, 308 | 32731, 32727, 32724, 32720, 32716, 32712, 32708, 32704, 32699, 32695, 32690, 309 | 32685, 32680, 32675, 32669, 32664, 32658, 32652, 32646, 32640, 32634, 32627, 310 | 32621, 32614, 32607, 32600, 32593, 32585, 32578, 32570, 32562, 32554, 32546, 311 | 32538, 32529, 32521, 32512, 32503, 32494, 32485, 32475, 32466, 32456, 32446, 312 | 32436, 32426, 32416, 32406, 32395, 32384, 32374, 32362, 32351, 32340, 32329, 313 | 32317, 32305, 32293, 32281, 32269, 32257, 32244, 32231, 32219, 32206, 32192, 314 | 32179, 32166, 32152, 32138, 32125, 32111, 32096, 32082, 32068, 32053, 32038, 315 | 32023, 32008, 31993, 31978, 31962, 31947, 31931, 31915, 31899, 31883, 31866, 316 | 31850, 31833, 31816, 31799, 31782, 31765, 31748, 31730, 31712, 31695, 31677, 317 | 31659, 31640, 31622, 31603, 31585, 31566, 31547, 31528, 31509, 31489, 31470, 318 | 31450, 31430, 31410, 31390, 31370, 31349, 31329, 31308, 31287, 31266, 31245, 319 | 31224, 31203, 31181, 31160, 31138, 31116, 31094, 31072, 31049, 31027, 31004, 320 | 30981, 30958, 30935, 30912, 30889, 30866, 30842, 30818, 30794, 30770, 30746, 321 | 30722, 30698, 30673, 30648, 30624, 30599, 30574, 30548, 30523, 30498, 30472, 322 | 30446, 30420, 30394, 30368, 30342, 30316, 30289, 30262, 30236, 30209, 30182, 323 | 30155, 30127, 30100, 30072, 30045, 30017, 29989, 29961, 29932, 29904, 29876, 324 | 29847, 29818, 29790, 29761, 29731, 29702, 29673, 29643, 29614, 29584, 29554, 325 | 29524, 29494, 29464, 29434, 29403, 29373, 29342, 29311, 29280, 29249, 29218, 326 | 29187, 29155, 29124, 29092, 29060, 29028, 28996, 28964, 28932, 28899, 28867, 327 | 28834, 28801, 28769, 28736, 28702, 28669, 28636, 28603, 28569, 28535, 28502, 328 | 28468, 28434, 28399, 28365, 28331, 28296, 28262, 28227, 28192, 28157, 28122, 329 | 28087, 28052, 28017, 27981, 27946, 27910, 27874, 27838, 27802, 27766, 27730, 330 | 27694, 27657, 27621, 27584, 27547, 27510, 27473, 27436, 27399, 27362, 27325, 331 | 27287, 27249, 27212, 27174, 27136, 27098, 27060, 27022, 26984, 26945, 26907, 332 | 26868, 26829, 26791, 26752, 26713, 26674, 26634, 26595, 26556, 26516, 26477, 333 | 26437, 26397, 26357, 26318, 26277, 26237, 26197, 26157, 26116, 26076, 26035, 334 | 25995, 25954, 25913, 25872, 25831, 25790, 25749, 25707, 25666, 25625, 25583, 335 | 25541, 25500, 25458, 25416, 25374, 25332, 25290, 25247, 25205, 25163, 25120, 336 | 25077, 25035, 24992, 24949, 24906, 24863, 24820, 24777, 24734, 24691, 24647, 337 | 24604, 24560, 24517, 24473, 24429, 24385, 24341, 24297, 24253, 24209, 24165, 338 | 24121, 24076, 24032, 23987, 23943, 23898, 23853, 23809, 23764, 23719, 23674, 339 | 23629, 23584, 23538, 23493, 23448, 23402, 23357, 23311, 23266, 23220, 23174, 340 | 23129, 23083, 23037, 22991, 22945, 22899, 22852, 22806, 22760, 22714, 22667, 341 | 22621, 22574, 22528, 22481, 22434, 22388, 22341, 22294, 22247, 22200, 22153, 342 | 22106, 22059, 22011, 21964, 21917, 21870, 21822, 21775, 21727, 21680, 21632, 343 | 21584, 21537, 21489, 21441, 21393, 21345, 21297, 21249, 21201, 21153, 21105, 344 | 21057, 21009, 20960, 20912, 20864, 20815, 20767, 20718, 20670, 20621, 20573, 345 | 20524, 20475, 20427, 20378, 20329, 20280, 20231, 20183, 20134, 20085, 20036, 346 | 19987, 19938, 19888, 19839, 19790, 19741, 19692, 19642, 19593, 19544, 19494, 347 | 19445, 19396, 19346, 19297, 19247, 19198, 19148, 19099, 19049, 18999, 18950, 348 | 18900, 18850, 18801, 18751, 18701, 18651, 18601, 18552, 18502, 18452, 18402, 349 | 18352, 18302, 18252, 18202, 18152, 18102, 18052, 18002, 17952, 17902, 17852, 350 | 17802, 17752, 17702, 17652, 17601, 17551, 17501, 17451, 17401, 17350, 17300, 351 | 17250, 17200, 17150, 17099, 17049, 16999, 16949, 16898, 16848, 16798, 16748, 352 | 16697, 16647, 16597, 16546, 16496, 16446, 16396, 16345, 16295, 16245, 16194, 353 | 16144, 16094, 16044, 15993, 15943, 15893, 15842, 15792, 15742, 15692, 15641, 354 | 15591, 15541, 15491, 15441, 15390, 15340, 15290, 15240, 15190, 15140, 15089, 355 | 15039, 14989, 14939, 14889, 14839, 14789, 14739, 14689, 14639, 14589, 14539, 356 | 14489, 14439, 14389, 14339, 14289, 14239, 14189, 14140, 14090, 14040, 13990, 357 | 13941, 13891, 13841, 13792, 13742, 13692, 13643, 13593, 13544, 13494, 13445, 358 | 13395, 13346, 13296, 13247, 13198, 13148, 13099, 13050, 13000, 12951, 12902, 359 | 12853, 12804, 12755, 12706, 12657, 12608, 12559, 12510, 12461, 12412, 12364, 360 | 12315, 12266, 12218, 12169, 12120, 12072, 12023, 11975, 11926, 11878, 11830, 361 | 11781, 11733, 11685, 11637, 11589, 11541, 11493, 11445, 11397, 11349, 11301, 362 | 11253, 11206, 11158, 11110, 11063, 11015, 10968, 10920, 10873, 10825, 10778, 363 | 10731, 10684, 10637, 10590, 10543, 10496, 10449, 10402, 10355, 10308, 10262, 364 | 10215, 10169, 10122, 10076, 10029, 9983, 9937, 9890, 9844, 9798, 9752, 365 | 9706, 9660, 9614, 9569, 9523, 9477, 9432, 9386, 9341, 9296, 9250, 366 | 9205, 9160, 9115, 9070, 9025, 8980, 8935, 8890, 8846, 8801, 8756, 367 | 8712, 8667, 8623, 8579, 8535, 8491, 8447, 8403, 8359, 8315, 8271, 368 | 8228, 8184, 8140, 8097, 8054, 8010, 7967, 7924, 7881, 7838, 7795, 369 | 7753, 7710, 7667, 7625, 7582, 7540, 7498, 7455, 7413, 7371, 7329, 370 | 7287, 7246, 7204, 7162, 7121, 7079, 7038, 6997, 6956, 6914, 6873, 371 | 6833, 6792, 6751, 6710, 6670, 6629, 6589, 6549, 6509, 6468, 6428, 372 | 6389, 6349, 6309, 6269, 6230, 6191, 6151, 6112, 6073, 6034, 5995, 373 | 5956, 5917, 5879, 5840, 5802, 5763, 5725, 5687, 5649, 5611, 5573, 374 | 5535, 5498, 5460, 5423, 5385, 5348, 5311, 5274, 5237, 5200, 5164, 375 | 5127, 5091, 5054, 5018, 4982, 4946, 4910, 4874, 4838, 4803, 4767, 376 | 4732, 4696, 4661, 4626, 4591, 4556, 4521, 4487, 4452, 4418, 4384, 377 | 4349, 4315, 4281, 4248, 4214, 4180, 4147, 4113, 4080, 4047, 4014, 378 | 3981, 3948, 3916, 3883, 3850, 3818, 3786, 3754, 3722, 3690, 3658, 379 | 3627, 3595, 3564, 3533, 3501, 3470, 3439, 3409, 3378, 3348, 3317, 380 | 3287, 3257, 3227, 3197, 3167, 3137, 3108, 3078, 3049, 3020, 2991, 381 | 2962, 2933, 2905, 2876, 2848, 2819, 2791, 2763, 2735, 2708, 2680, 382 | 2652, 2625, 2598, 2571, 2544, 2517, 2490, 2464, 2437, 2411, 2385, 383 | 2359, 2333, 2307, 2281, 2256, 2230, 2205, 2180, 2155, 2130, 2105, 384 | 2081, 2056, 2032, 2008, 1984, 1960, 1936, 1912, 1889, 1865, 1842, 385 | 1819, 1796, 1773, 1751, 1728, 1706, 1683, 1661, 1639, 1617, 1596, 386 | 1574, 1553, 1531, 1510, 1489, 1468, 1447, 1427, 1406, 1386, 1366, 387 | 1346, 1326, 1306, 1287, 1267, 1248, 1229, 1210, 1191, 1172, 1153, 388 | 1135, 1117, 1098, 1080, 1062, 1045, 1027, 1010, 992, 975, 958, 389 | 941, 925, 908, 892, 875, 859, 843, 827, 811, 796, 781, 390 | 765, 750, 735, 720, 706, 691, 677, 663, 648, 634, 621, 391 | 607, 594, 580, 567, 554, 541, 528, 516, 503, 491, 479, 392 | 467, 455, 443, 432, 420, 409, 398, 387, 376, 366, 355, 393 | 345, 335, 325, 315, 305, 295, 286, 277, 267, 258, 250, 394 | 241, 232, 224, 216, 208, 200, 192, 184, 177, 170, 163, 395 | 156, 149, 142, 135, 129, 123, 117, 111, 105, 99, 94, 396 | 89, 83, 78, 74, 69, 64, 60, 56, 52, 48, 44, 397 | 40, 37, 34, 30, 27, 24, 22, 19, 17, 15, 13, 398 | 11, 9, 7, 6, 4, 3, 2, 1, 1, 0, 0, 399 | 0, 0, 400 | }; 401 | 402 | const q15_t window_hanning_4096[] = { 403 | 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 404 | 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 405 | 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 406 | 20, 22, 23, 24, 26, 27, 29, 30, 32, 34, 35, 407 | 37, 39, 40, 42, 44, 46, 48, 50, 52, 54, 56, 408 | 58, 60, 62, 64, 67, 69, 71, 74, 76, 78, 81, 409 | 83, 86, 89, 91, 94, 97, 99, 102, 105, 108, 111, 410 | 114, 117, 120, 123, 126, 129, 132, 135, 139, 142, 145, 411 | 149, 152, 155, 159, 162, 166, 170, 173, 177, 181, 184, 412 | 188, 192, 196, 200, 204, 208, 212, 216, 220, 224, 228, 413 | 232, 237, 241, 245, 249, 254, 258, 263, 267, 272, 276, 414 | 281, 286, 290, 295, 300, 305, 310, 314, 319, 324, 329, 415 | 334, 339, 345, 350, 355, 360, 365, 371, 376, 381, 387, 416 | 392, 398, 403, 409, 414, 420, 426, 432, 437, 443, 449, 417 | 455, 461, 467, 473, 479, 485, 491, 497, 503, 509, 515, 418 | 522, 528, 534, 541, 547, 554, 560, 567, 573, 580, 587, 419 | 593, 600, 607, 614, 620, 627, 634, 641, 648, 655, 662, 420 | 669, 676, 684, 691, 698, 705, 713, 720, 727, 735, 742, 421 | 750, 757, 765, 772, 780, 788, 796, 803, 811, 819, 827, 422 | 835, 843, 851, 859, 867, 875, 883, 891, 899, 908, 916, 423 | 924, 932, 941, 949, 958, 966, 975, 983, 992, 1000, 1009, 424 | 1018, 1027, 1035, 1044, 1053, 1062, 1071, 1080, 1089, 1098, 1107, 425 | 1116, 1125, 1134, 1144, 1153, 1162, 1171, 1181, 1190, 1200, 1209, 426 | 1219, 1228, 1238, 1247, 1257, 1267, 1276, 1286, 1296, 1306, 1315, 427 | 1325, 1335, 1345, 1355, 1365, 1375, 1385, 1396, 1406, 1416, 1426, 428 | 1436, 1447, 1457, 1467, 1478, 1488, 1499, 1509, 1520, 1531, 1541, 429 | 1552, 1563, 1573, 1584, 1595, 1606, 1617, 1627, 1638, 1649, 1660, 430 | 1671, 1682, 1694, 1705, 1716, 1727, 1738, 1750, 1761, 1772, 1784, 431 | 1795, 1807, 1818, 1830, 1841, 1853, 1864, 1876, 1888, 1900, 1911, 432 | 1923, 1935, 1947, 1959, 1971, 1983, 1995, 2007, 2019, 2031, 2043, 433 | 2055, 2067, 2080, 2092, 2104, 2117, 2129, 2141, 2154, 2166, 2179, 434 | 2191, 2204, 2217, 2229, 2242, 2255, 2267, 2280, 2293, 2306, 2319, 435 | 2332, 2344, 2357, 2370, 2383, 2397, 2410, 2423, 2436, 2449, 2462, 436 | 2476, 2489, 2502, 2516, 2529, 2543, 2556, 2570, 2583, 2597, 2610, 437 | 2624, 2638, 2651, 2665, 2679, 2692, 2706, 2720, 2734, 2748, 2762, 438 | 2776, 2790, 2804, 2818, 2832, 2846, 2860, 2875, 2889, 2903, 2918, 439 | 2932, 2946, 2961, 2975, 2990, 3004, 3019, 3033, 3048, 3062, 3077, 440 | 3092, 3106, 3121, 3136, 3151, 3166, 3180, 3195, 3210, 3225, 3240, 441 | 3255, 3270, 3285, 3300, 3316, 3331, 3346, 3361, 3376, 3392, 3407, 442 | 3422, 3438, 3453, 3469, 3484, 3500, 3515, 3531, 3546, 3562, 3578, 443 | 3593, 3609, 3625, 3641, 3657, 3672, 3688, 3704, 3720, 3736, 3752, 444 | 3768, 3784, 3800, 3816, 3833, 3849, 3865, 3881, 3897, 3914, 3930, 445 | 3946, 3963, 3979, 3996, 4012, 4029, 4045, 4062, 4078, 4095, 4111, 446 | 4128, 4145, 4162, 4178, 4195, 4212, 4229, 4246, 4263, 4279, 4296, 447 | 4313, 4330, 4347, 4364, 4382, 4399, 4416, 4433, 4450, 4468, 4485, 448 | 4502, 4519, 4537, 4554, 4572, 4589, 4606, 4624, 4641, 4659, 4677, 449 | 4694, 4712, 4729, 4747, 4765, 4783, 4800, 4818, 4836, 4854, 4872, 450 | 4890, 4907, 4925, 4943, 4961, 4979, 4998, 5016, 5034, 5052, 5070, 451 | 5088, 5106, 5125, 5143, 5161, 5180, 5198, 5216, 5235, 5253, 5272, 452 | 5290, 5309, 5327, 5346, 5364, 5383, 5402, 5420, 5439, 5458, 5476, 453 | 5495, 5514, 5533, 5552, 5571, 5589, 5608, 5627, 5646, 5665, 5684, 454 | 5703, 5722, 5742, 5761, 5780, 5799, 5818, 5837, 5857, 5876, 5895, 455 | 5915, 5934, 5953, 5973, 5992, 6012, 6031, 6051, 6070, 6090, 6109, 456 | 6129, 6148, 6168, 6188, 6207, 6227, 6247, 6267, 6286, 6306, 6326, 457 | 6346, 6366, 6386, 6406, 6426, 6446, 6466, 6486, 6506, 6526, 6546, 458 | 6566, 6586, 6606, 6626, 6647, 6667, 6687, 6707, 6728, 6748, 6768, 459 | 6789, 6809, 6829, 6850, 6870, 6891, 6911, 6932, 6952, 6973, 6994, 460 | 7014, 7035, 7055, 7076, 7097, 7118, 7138, 7159, 7180, 7201, 7221, 461 | 7242, 7263, 7284, 7305, 7326, 7347, 7368, 7389, 7410, 7431, 7452, 462 | 7473, 7494, 7515, 7536, 7558, 7579, 7600, 7621, 7643, 7664, 7685, 463 | 7706, 7728, 7749, 7770, 7792, 7813, 7835, 7856, 7878, 7899, 7921, 464 | 7942, 7964, 7985, 8007, 8029, 8050, 8072, 8093, 8115, 8137, 8159, 465 | 8180, 8202, 8224, 8246, 8268, 8289, 8311, 8333, 8355, 8377, 8399, 466 | 8421, 8443, 8465, 8487, 8509, 8531, 8553, 8575, 8597, 8619, 8642, 467 | 8664, 8686, 8708, 8730, 8753, 8775, 8797, 8819, 8842, 8864, 8886, 468 | 8909, 8931, 8953, 8976, 8998, 9021, 9043, 9066, 9088, 9111, 9133, 469 | 9156, 9178, 9201, 9224, 9246, 9269, 9291, 9314, 9337, 9360, 9382, 470 | 9405, 9428, 9450, 9473, 9496, 9519, 9542, 9565, 9587, 9610, 9633, 471 | 9656, 9679, 9702, 9725, 9748, 9771, 9794, 9817, 9840, 9863, 9886, 472 | 9909, 9932, 9955, 9979, 10002, 10025, 10048, 10071, 10094, 10118, 10141, 473 | 10164, 10187, 10211, 10234, 10257, 10281, 10304, 10327, 10351, 10374, 10397, 474 | 10421, 10444, 10468, 10491, 10515, 10538, 10562, 10585, 10609, 10632, 10656, 475 | 10679, 10703, 10726, 10750, 10774, 10797, 10821, 10845, 10868, 10892, 10916, 476 | 10939, 10963, 10987, 11010, 11034, 11058, 11082, 11106, 11129, 11153, 11177, 477 | 11201, 11225, 11249, 11272, 11296, 11320, 11344, 11368, 11392, 11416, 11440, 478 | 11464, 11488, 11512, 11536, 11560, 11584, 11608, 11632, 11656, 11680, 11704, 479 | 11728, 11752, 11777, 11801, 11825, 11849, 11873, 11897, 11921, 11946, 11970, 480 | 11994, 12018, 12043, 12067, 12091, 12115, 12140, 12164, 12188, 12212, 12237, 481 | 12261, 12285, 12310, 12334, 12359, 12383, 12407, 12432, 12456, 12480, 12505, 482 | 12529, 12554, 12578, 12603, 12627, 12652, 12676, 12701, 12725, 12750, 12774, 483 | 12799, 12823, 12848, 12872, 12897, 12921, 12946, 12971, 12995, 13020, 13044, 484 | 13069, 13094, 13118, 13143, 13167, 13192, 13217, 13241, 13266, 13291, 13316, 485 | 13340, 13365, 13390, 13414, 13439, 13464, 13489, 13513, 13538, 13563, 13588, 486 | 13612, 13637, 13662, 13687, 13711, 13736, 13761, 13786, 13811, 13836, 13860, 487 | 13885, 13910, 13935, 13960, 13985, 14010, 14034, 14059, 14084, 14109, 14134, 488 | 14159, 14184, 14209, 14234, 14259, 14283, 14308, 14333, 14358, 14383, 14408, 489 | 14433, 14458, 14483, 14508, 14533, 14558, 14583, 14608, 14633, 14658, 14683, 490 | 14708, 14733, 14758, 14783, 14808, 14833, 14858, 14883, 14908, 14933, 14958, 491 | 14983, 15008, 15033, 15058, 15083, 15109, 15134, 15159, 15184, 15209, 15234, 492 | 15259, 15284, 15309, 15334, 15359, 15384, 15409, 15435, 15460, 15485, 15510, 493 | 15535, 15560, 15585, 15610, 15635, 15661, 15686, 15711, 15736, 15761, 15786, 494 | 15811, 15836, 15861, 15887, 15912, 15937, 15962, 15987, 16012, 16037, 16063, 495 | 16088, 16113, 16138, 16163, 16188, 16213, 16238, 16264, 16289, 16314, 16339, 496 | 16364, 16389, 16414, 16440, 16465, 16490, 16515, 16540, 16565, 16590, 16616, 497 | 16641, 16666, 16691, 16716, 16741, 16766, 16791, 16817, 16842, 16867, 16892, 498 | 16917, 16942, 16967, 16992, 17018, 17043, 17068, 17093, 17118, 17143, 17168, 499 | 17193, 17218, 17244, 17269, 17294, 17319, 17344, 17369, 17394, 17419, 17444, 500 | 17469, 17495, 17520, 17545, 17570, 17595, 17620, 17645, 17670, 17695, 17720, 501 | 17745, 17770, 17795, 17820, 17845, 17870, 17895, 17920, 17945, 17970, 17996, 502 | 18021, 18046, 18071, 18096, 18121, 18146, 18171, 18196, 18220, 18245, 18270, 503 | 18295, 18320, 18345, 18370, 18395, 18420, 18445, 18470, 18495, 18520, 18545, 504 | 18570, 18595, 18620, 18644, 18669, 18694, 18719, 18744, 18769, 18794, 18819, 505 | 18843, 18868, 18893, 18918, 18943, 18968, 18992, 19017, 19042, 19067, 19092, 506 | 19116, 19141, 19166, 19191, 19216, 19240, 19265, 19290, 19315, 19339, 19364, 507 | 19389, 19413, 19438, 19463, 19488, 19512, 19537, 19562, 19586, 19611, 19635, 508 | 19660, 19685, 19709, 19734, 19759, 19783, 19808, 19832, 19857, 19881, 19906, 509 | 19931, 19955, 19980, 20004, 20029, 20053, 20078, 20102, 20127, 20151, 20176, 510 | 20200, 20224, 20249, 20273, 20298, 20322, 20347, 20371, 20395, 20420, 20444, 511 | 20468, 20493, 20517, 20541, 20566, 20590, 20614, 20639, 20663, 20687, 20711, 512 | 20736, 20760, 20784, 20808, 20832, 20857, 20881, 20905, 20929, 20953, 20977, 513 | 21002, 21026, 21050, 21074, 21098, 21122, 21146, 21170, 21194, 21218, 21242, 514 | 21266, 21290, 21314, 21338, 21362, 21386, 21410, 21434, 21458, 21482, 21506, 515 | 21529, 21553, 21577, 21601, 21625, 21649, 21672, 21696, 21720, 21744, 21767, 516 | 21791, 21815, 21839, 21862, 21886, 21910, 21933, 21957, 21981, 22004, 22028, 517 | 22051, 22075, 22099, 22122, 22146, 22169, 22193, 22216, 22240, 22263, 22287, 518 | 22310, 22333, 22357, 22380, 22404, 22427, 22450, 22474, 22497, 22520, 22544, 519 | 22567, 22590, 22613, 22637, 22660, 22683, 22706, 22730, 22753, 22776, 22799, 520 | 22822, 22845, 22868, 22891, 22914, 22938, 22961, 22984, 23007, 23030, 23053, 521 | 23075, 23098, 23121, 23144, 23167, 23190, 23213, 23236, 23259, 23281, 23304, 522 | 23327, 23350, 23372, 23395, 23418, 23441, 23463, 23486, 23509, 23531, 23554, 523 | 23576, 23599, 23621, 23644, 23667, 23689, 23712, 23734, 23756, 23779, 23801, 524 | 23824, 23846, 23869, 23891, 23913, 23936, 23958, 23980, 24002, 24025, 24047, 525 | 24069, 24091, 24113, 24136, 24158, 24180, 24202, 24224, 24246, 24268, 24290, 526 | 24312, 24334, 24356, 24378, 24400, 24422, 24444, 24466, 24488, 24509, 24531, 527 | 24553, 24575, 24597, 24618, 24640, 24662, 24683, 24705, 24727, 24748, 24770, 528 | 24791, 24813, 24835, 24856, 24878, 24899, 24921, 24942, 24963, 24985, 25006, 529 | 25028, 25049, 25070, 25092, 25113, 25134, 25155, 25177, 25198, 25219, 25240, 530 | 25261, 25282, 25303, 25325, 25346, 25367, 25388, 25409, 25430, 25451, 25471, 531 | 25492, 25513, 25534, 25555, 25576, 25597, 25617, 25638, 25659, 25680, 25700, 532 | 25721, 25742, 25762, 25783, 25803, 25824, 25844, 25865, 25885, 25906, 25926, 533 | 25947, 25967, 25988, 26008, 26028, 26049, 26069, 26089, 26109, 26130, 26150, 534 | 26170, 26190, 26210, 26230, 26250, 26270, 26290, 26310, 26330, 26350, 26370, 535 | 26390, 26410, 26430, 26450, 26470, 26489, 26509, 26529, 26549, 26568, 26588, 536 | 26608, 26627, 26647, 26667, 26686, 26706, 26725, 26745, 26764, 26784, 26803, 537 | 26822, 26842, 26861, 26880, 26900, 26919, 26938, 26957, 26977, 26996, 27015, 538 | 27034, 27053, 27072, 27091, 27110, 27129, 27148, 27167, 27186, 27205, 27224, 539 | 27243, 27261, 27280, 27299, 27318, 27336, 27355, 27374, 27392, 27411, 27430, 540 | 27448, 27467, 27485, 27504, 27522, 27540, 27559, 27577, 27596, 27614, 27632, 541 | 27650, 27669, 27687, 27705, 27723, 27741, 27759, 27777, 27796, 27814, 27832, 542 | 27850, 27867, 27885, 27903, 27921, 27939, 27957, 27975, 27992, 28010, 28028, 543 | 28045, 28063, 28081, 28098, 28116, 28133, 28151, 28168, 28186, 28203, 28221, 544 | 28238, 28255, 28273, 28290, 28307, 28324, 28342, 28359, 28376, 28393, 28410, 545 | 28427, 28444, 28461, 28478, 28495, 28512, 28529, 28546, 28563, 28579, 28596, 546 | 28613, 28630, 28646, 28663, 28680, 28696, 28713, 28729, 28746, 28762, 28779, 547 | 28795, 28811, 28828, 28844, 28860, 28877, 28893, 28909, 28925, 28942, 28958, 548 | 28974, 28990, 29006, 29022, 29038, 29054, 29070, 29086, 29102, 29117, 29133, 549 | 29149, 29165, 29180, 29196, 29212, 29227, 29243, 29258, 29274, 29290, 29305, 550 | 29320, 29336, 29351, 29367, 29382, 29397, 29412, 29428, 29443, 29458, 29473, 551 | 29488, 29503, 29518, 29533, 29548, 29563, 29578, 29593, 29608, 29623, 29638, 552 | 29652, 29667, 29682, 29696, 29711, 29726, 29740, 29755, 29769, 29784, 29798, 553 | 29813, 29827, 29841, 29856, 29870, 29884, 29898, 29913, 29927, 29941, 29955, 554 | 29969, 29983, 29997, 30011, 30025, 30039, 30053, 30067, 30080, 30094, 30108, 555 | 30122, 30135, 30149, 30163, 30176, 30190, 30203, 30217, 30230, 30244, 30257, 556 | 30270, 30284, 30297, 30310, 30323, 30337, 30350, 30363, 30376, 30389, 30402, 557 | 30415, 30428, 30441, 30454, 30467, 30480, 30492, 30505, 30518, 30531, 30543, 558 | 30556, 30568, 30581, 30593, 30606, 30618, 30631, 30643, 30656, 30668, 30680, 559 | 30692, 30705, 30717, 30729, 30741, 30753, 30765, 30777, 30789, 30801, 30813, 560 | 30825, 30837, 30849, 30861, 30872, 30884, 30896, 30907, 30919, 30931, 30942, 561 | 30954, 30965, 30977, 30988, 30999, 31011, 31022, 31033, 31044, 31056, 31067, 562 | 31078, 31089, 31100, 31111, 31122, 31133, 31144, 31155, 31166, 31177, 31187, 563 | 31198, 31209, 31220, 31230, 31241, 31251, 31262, 31272, 31283, 31293, 31304, 564 | 31314, 31324, 31335, 31345, 31355, 31365, 31376, 31386, 31396, 31406, 31416, 565 | 31426, 31436, 31446, 31455, 31465, 31475, 31485, 31495, 31504, 31514, 31524, 566 | 31533, 31543, 31552, 31562, 31571, 31581, 31590, 31599, 31609, 31618, 31627, 567 | 31636, 31645, 31655, 31664, 31673, 31682, 31691, 31700, 31709, 31717, 31726, 568 | 31735, 31744, 31752, 31761, 31770, 31778, 31787, 31796, 31804, 31813, 31821, 569 | 31829, 31838, 31846, 31854, 31863, 31871, 31879, 31887, 31895, 31903, 31911, 570 | 31919, 31927, 31935, 31943, 31951, 31959, 31967, 31974, 31982, 31990, 31997, 571 | 32005, 32012, 32020, 32027, 32035, 32042, 32050, 32057, 32064, 32072, 32079, 572 | 32086, 32093, 32100, 32107, 32114, 32121, 32128, 32135, 32142, 32149, 32156, 573 | 32163, 32169, 32176, 32183, 32189, 32196, 32203, 32209, 32216, 32222, 32228, 574 | 32235, 32241, 32247, 32254, 32260, 32266, 32272, 32278, 32284, 32290, 32296, 575 | 32302, 32308, 32314, 32320, 32326, 32332, 32337, 32343, 32349, 32354, 32360, 576 | 32365, 32371, 32376, 32382, 32387, 32393, 32398, 32403, 32408, 32414, 32419, 577 | 32424, 32429, 32434, 32439, 32444, 32449, 32454, 32459, 32464, 32468, 32473, 578 | 32478, 32483, 32487, 32492, 32496, 32501, 32505, 32510, 32514, 32519, 32523, 579 | 32527, 32532, 32536, 32540, 32544, 32548, 32552, 32556, 32560, 32564, 32568, 580 | 32572, 32576, 32580, 32584, 32587, 32591, 32595, 32598, 32602, 32605, 32609, 581 | 32612, 32616, 32619, 32622, 32626, 32629, 32632, 32635, 32639, 32642, 32645, 582 | 32648, 32651, 32654, 32657, 32660, 32662, 32665, 32668, 32671, 32673, 32676, 583 | 32679, 32681, 32684, 32686, 32689, 32691, 32694, 32696, 32698, 32701, 32703, 584 | 32705, 32707, 32709, 32711, 32713, 32715, 32717, 32719, 32721, 32723, 32725, 585 | 32727, 32728, 32730, 32732, 32733, 32735, 32736, 32738, 32739, 32741, 32742, 586 | 32744, 32745, 32746, 32747, 32749, 32750, 32751, 32752, 32753, 32754, 32755, 587 | 32756, 32757, 32758, 32758, 32759, 32760, 32761, 32761, 32762, 32762, 32763, 588 | 32763, 32764, 32764, 32765, 32765, 32765, 32766, 32766, 32766, 32766, 32766, 589 | 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32765, 32765, 590 | 32765, 32764, 32764, 32763, 32763, 32762, 32762, 32761, 32761, 32760, 32759, 591 | 32758, 32758, 32757, 32756, 32755, 32754, 32753, 32752, 32751, 32750, 32749, 592 | 32747, 32746, 32745, 32744, 32742, 32741, 32739, 32738, 32736, 32735, 32733, 593 | 32732, 32730, 32728, 32727, 32725, 32723, 32721, 32719, 32717, 32715, 32713, 594 | 32711, 32709, 32707, 32705, 32703, 32701, 32698, 32696, 32694, 32691, 32689, 595 | 32686, 32684, 32681, 32679, 32676, 32673, 32671, 32668, 32665, 32662, 32660, 596 | 32657, 32654, 32651, 32648, 32645, 32642, 32639, 32635, 32632, 32629, 32626, 597 | 32622, 32619, 32616, 32612, 32609, 32605, 32602, 32598, 32595, 32591, 32587, 598 | 32584, 32580, 32576, 32572, 32568, 32564, 32560, 32556, 32552, 32548, 32544, 599 | 32540, 32536, 32532, 32527, 32523, 32519, 32514, 32510, 32505, 32501, 32496, 600 | 32492, 32487, 32483, 32478, 32473, 32468, 32464, 32459, 32454, 32449, 32444, 601 | 32439, 32434, 32429, 32424, 32419, 32414, 32408, 32403, 32398, 32393, 32387, 602 | 32382, 32376, 32371, 32365, 32360, 32354, 32349, 32343, 32337, 32332, 32326, 603 | 32320, 32314, 32308, 32302, 32296, 32290, 32284, 32278, 32272, 32266, 32260, 604 | 32254, 32247, 32241, 32235, 32228, 32222, 32216, 32209, 32203, 32196, 32189, 605 | 32183, 32176, 32169, 32163, 32156, 32149, 32142, 32135, 32128, 32121, 32114, 606 | 32107, 32100, 32093, 32086, 32079, 32072, 32064, 32057, 32050, 32042, 32035, 607 | 32027, 32020, 32012, 32005, 31997, 31990, 31982, 31974, 31967, 31959, 31951, 608 | 31943, 31935, 31927, 31919, 31911, 31903, 31895, 31887, 31879, 31871, 31863, 609 | 31854, 31846, 31838, 31829, 31821, 31813, 31804, 31796, 31787, 31778, 31770, 610 | 31761, 31752, 31744, 31735, 31726, 31717, 31709, 31700, 31691, 31682, 31673, 611 | 31664, 31655, 31645, 31636, 31627, 31618, 31609, 31599, 31590, 31581, 31571, 612 | 31562, 31552, 31543, 31533, 31524, 31514, 31504, 31495, 31485, 31475, 31465, 613 | 31455, 31446, 31436, 31426, 31416, 31406, 31396, 31386, 31376, 31365, 31355, 614 | 31345, 31335, 31324, 31314, 31304, 31293, 31283, 31272, 31262, 31251, 31241, 615 | 31230, 31220, 31209, 31198, 31187, 31177, 31166, 31155, 31144, 31133, 31122, 616 | 31111, 31100, 31089, 31078, 31067, 31056, 31044, 31033, 31022, 31011, 30999, 617 | 30988, 30977, 30965, 30954, 30942, 30931, 30919, 30907, 30896, 30884, 30872, 618 | 30861, 30849, 30837, 30825, 30813, 30801, 30789, 30777, 30765, 30753, 30741, 619 | 30729, 30717, 30705, 30692, 30680, 30668, 30656, 30643, 30631, 30618, 30606, 620 | 30593, 30581, 30568, 30556, 30543, 30531, 30518, 30505, 30492, 30480, 30467, 621 | 30454, 30441, 30428, 30415, 30402, 30389, 30376, 30363, 30350, 30337, 30323, 622 | 30310, 30297, 30284, 30270, 30257, 30244, 30230, 30217, 30203, 30190, 30176, 623 | 30163, 30149, 30135, 30122, 30108, 30094, 30080, 30067, 30053, 30039, 30025, 624 | 30011, 29997, 29983, 29969, 29955, 29941, 29927, 29913, 29898, 29884, 29870, 625 | 29856, 29841, 29827, 29813, 29798, 29784, 29769, 29755, 29740, 29726, 29711, 626 | 29696, 29682, 29667, 29652, 29638, 29623, 29608, 29593, 29578, 29563, 29548, 627 | 29533, 29518, 29503, 29488, 29473, 29458, 29443, 29428, 29412, 29397, 29382, 628 | 29367, 29351, 29336, 29320, 29305, 29290, 29274, 29258, 29243, 29227, 29212, 629 | 29196, 29180, 29165, 29149, 29133, 29117, 29102, 29086, 29070, 29054, 29038, 630 | 29022, 29006, 28990, 28974, 28958, 28942, 28925, 28909, 28893, 28877, 28860, 631 | 28844, 28828, 28811, 28795, 28779, 28762, 28746, 28729, 28713, 28696, 28680, 632 | 28663, 28646, 28630, 28613, 28596, 28579, 28563, 28546, 28529, 28512, 28495, 633 | 28478, 28461, 28444, 28427, 28410, 28393, 28376, 28359, 28342, 28324, 28307, 634 | 28290, 28273, 28255, 28238, 28221, 28203, 28186, 28168, 28151, 28133, 28116, 635 | 28098, 28081, 28063, 28045, 28028, 28010, 27992, 27975, 27957, 27939, 27921, 636 | 27903, 27885, 27867, 27850, 27832, 27814, 27796, 27777, 27759, 27741, 27723, 637 | 27705, 27687, 27669, 27650, 27632, 27614, 27596, 27577, 27559, 27540, 27522, 638 | 27504, 27485, 27467, 27448, 27430, 27411, 27392, 27374, 27355, 27336, 27318, 639 | 27299, 27280, 27261, 27243, 27224, 27205, 27186, 27167, 27148, 27129, 27110, 640 | 27091, 27072, 27053, 27034, 27015, 26996, 26977, 26957, 26938, 26919, 26900, 641 | 26880, 26861, 26842, 26822, 26803, 26784, 26764, 26745, 26725, 26706, 26686, 642 | 26667, 26647, 26627, 26608, 26588, 26568, 26549, 26529, 26509, 26489, 26470, 643 | 26450, 26430, 26410, 26390, 26370, 26350, 26330, 26310, 26290, 26270, 26250, 644 | 26230, 26210, 26190, 26170, 26150, 26130, 26109, 26089, 26069, 26049, 26028, 645 | 26008, 25988, 25967, 25947, 25926, 25906, 25885, 25865, 25844, 25824, 25803, 646 | 25783, 25762, 25742, 25721, 25700, 25680, 25659, 25638, 25617, 25597, 25576, 647 | 25555, 25534, 25513, 25492, 25471, 25451, 25430, 25409, 25388, 25367, 25346, 648 | 25325, 25303, 25282, 25261, 25240, 25219, 25198, 25177, 25155, 25134, 25113, 649 | 25092, 25070, 25049, 25028, 25006, 24985, 24963, 24942, 24921, 24899, 24878, 650 | 24856, 24835, 24813, 24791, 24770, 24748, 24727, 24705, 24683, 24662, 24640, 651 | 24618, 24597, 24575, 24553, 24531, 24509, 24488, 24466, 24444, 24422, 24400, 652 | 24378, 24356, 24334, 24312, 24290, 24268, 24246, 24224, 24202, 24180, 24158, 653 | 24136, 24113, 24091, 24069, 24047, 24025, 24002, 23980, 23958, 23936, 23913, 654 | 23891, 23869, 23846, 23824, 23801, 23779, 23756, 23734, 23712, 23689, 23667, 655 | 23644, 23621, 23599, 23576, 23554, 23531, 23509, 23486, 23463, 23441, 23418, 656 | 23395, 23372, 23350, 23327, 23304, 23281, 23259, 23236, 23213, 23190, 23167, 657 | 23144, 23121, 23098, 23075, 23053, 23030, 23007, 22984, 22961, 22938, 22914, 658 | 22891, 22868, 22845, 22822, 22799, 22776, 22753, 22730, 22706, 22683, 22660, 659 | 22637, 22613, 22590, 22567, 22544, 22520, 22497, 22474, 22450, 22427, 22404, 660 | 22380, 22357, 22333, 22310, 22287, 22263, 22240, 22216, 22193, 22169, 22146, 661 | 22122, 22099, 22075, 22051, 22028, 22004, 21981, 21957, 21933, 21910, 21886, 662 | 21862, 21839, 21815, 21791, 21767, 21744, 21720, 21696, 21672, 21649, 21625, 663 | 21601, 21577, 21553, 21529, 21506, 21482, 21458, 21434, 21410, 21386, 21362, 664 | 21338, 21314, 21290, 21266, 21242, 21218, 21194, 21170, 21146, 21122, 21098, 665 | 21074, 21050, 21026, 21002, 20977, 20953, 20929, 20905, 20881, 20857, 20832, 666 | 20808, 20784, 20760, 20736, 20711, 20687, 20663, 20639, 20614, 20590, 20566, 667 | 20541, 20517, 20493, 20468, 20444, 20420, 20395, 20371, 20347, 20322, 20298, 668 | 20273, 20249, 20224, 20200, 20176, 20151, 20127, 20102, 20078, 20053, 20029, 669 | 20004, 19980, 19955, 19931, 19906, 19881, 19857, 19832, 19808, 19783, 19759, 670 | 19734, 19709, 19685, 19660, 19635, 19611, 19586, 19562, 19537, 19512, 19488, 671 | 19463, 19438, 19413, 19389, 19364, 19339, 19315, 19290, 19265, 19240, 19216, 672 | 19191, 19166, 19141, 19116, 19092, 19067, 19042, 19017, 18992, 18968, 18943, 673 | 18918, 18893, 18868, 18843, 18819, 18794, 18769, 18744, 18719, 18694, 18669, 674 | 18644, 18620, 18595, 18570, 18545, 18520, 18495, 18470, 18445, 18420, 18395, 675 | 18370, 18345, 18320, 18295, 18270, 18245, 18220, 18196, 18171, 18146, 18121, 676 | 18096, 18071, 18046, 18021, 17996, 17970, 17945, 17920, 17895, 17870, 17845, 677 | 17820, 17795, 17770, 17745, 17720, 17695, 17670, 17645, 17620, 17595, 17570, 678 | 17545, 17520, 17495, 17469, 17444, 17419, 17394, 17369, 17344, 17319, 17294, 679 | 17269, 17244, 17218, 17193, 17168, 17143, 17118, 17093, 17068, 17043, 17018, 680 | 16992, 16967, 16942, 16917, 16892, 16867, 16842, 16817, 16791, 16766, 16741, 681 | 16716, 16691, 16666, 16641, 16616, 16590, 16565, 16540, 16515, 16490, 16465, 682 | 16440, 16414, 16389, 16364, 16339, 16314, 16289, 16264, 16238, 16213, 16188, 683 | 16163, 16138, 16113, 16088, 16063, 16037, 16012, 15987, 15962, 15937, 15912, 684 | 15887, 15861, 15836, 15811, 15786, 15761, 15736, 15711, 15686, 15661, 15635, 685 | 15610, 15585, 15560, 15535, 15510, 15485, 15460, 15435, 15409, 15384, 15359, 686 | 15334, 15309, 15284, 15259, 15234, 15209, 15184, 15159, 15134, 15109, 15083, 687 | 15058, 15033, 15008, 14983, 14958, 14933, 14908, 14883, 14858, 14833, 14808, 688 | 14783, 14758, 14733, 14708, 14683, 14658, 14633, 14608, 14583, 14558, 14533, 689 | 14508, 14483, 14458, 14433, 14408, 14383, 14358, 14333, 14308, 14283, 14259, 690 | 14234, 14209, 14184, 14159, 14134, 14109, 14084, 14059, 14034, 14010, 13985, 691 | 13960, 13935, 13910, 13885, 13860, 13836, 13811, 13786, 13761, 13736, 13711, 692 | 13687, 13662, 13637, 13612, 13588, 13563, 13538, 13513, 13489, 13464, 13439, 693 | 13414, 13390, 13365, 13340, 13316, 13291, 13266, 13241, 13217, 13192, 13167, 694 | 13143, 13118, 13094, 13069, 13044, 13020, 12995, 12971, 12946, 12921, 12897, 695 | 12872, 12848, 12823, 12799, 12774, 12750, 12725, 12701, 12676, 12652, 12627, 696 | 12603, 12578, 12554, 12529, 12505, 12480, 12456, 12432, 12407, 12383, 12359, 697 | 12334, 12310, 12285, 12261, 12237, 12212, 12188, 12164, 12140, 12115, 12091, 698 | 12067, 12043, 12018, 11994, 11970, 11946, 11921, 11897, 11873, 11849, 11825, 699 | 11801, 11777, 11752, 11728, 11704, 11680, 11656, 11632, 11608, 11584, 11560, 700 | 11536, 11512, 11488, 11464, 11440, 11416, 11392, 11368, 11344, 11320, 11296, 701 | 11272, 11249, 11225, 11201, 11177, 11153, 11129, 11106, 11082, 11058, 11034, 702 | 11010, 10987, 10963, 10939, 10916, 10892, 10868, 10845, 10821, 10797, 10774, 703 | 10750, 10726, 10703, 10679, 10656, 10632, 10609, 10585, 10562, 10538, 10515, 704 | 10491, 10468, 10444, 10421, 10397, 10374, 10351, 10327, 10304, 10281, 10257, 705 | 10234, 10211, 10187, 10164, 10141, 10118, 10094, 10071, 10048, 10025, 10002, 706 | 9979, 9955, 9932, 9909, 9886, 9863, 9840, 9817, 9794, 9771, 9748, 707 | 9725, 9702, 9679, 9656, 9633, 9610, 9587, 9565, 9542, 9519, 9496, 708 | 9473, 9450, 9428, 9405, 9382, 9360, 9337, 9314, 9291, 9269, 9246, 709 | 9224, 9201, 9178, 9156, 9133, 9111, 9088, 9066, 9043, 9021, 8998, 710 | 8976, 8953, 8931, 8909, 8886, 8864, 8842, 8819, 8797, 8775, 8753, 711 | 8730, 8708, 8686, 8664, 8642, 8619, 8597, 8575, 8553, 8531, 8509, 712 | 8487, 8465, 8443, 8421, 8399, 8377, 8355, 8333, 8311, 8289, 8268, 713 | 8246, 8224, 8202, 8180, 8159, 8137, 8115, 8093, 8072, 8050, 8029, 714 | 8007, 7985, 7964, 7942, 7921, 7899, 7878, 7856, 7835, 7813, 7792, 715 | 7770, 7749, 7728, 7706, 7685, 7664, 7643, 7621, 7600, 7579, 7558, 716 | 7536, 7515, 7494, 7473, 7452, 7431, 7410, 7389, 7368, 7347, 7326, 717 | 7305, 7284, 7263, 7242, 7221, 7201, 7180, 7159, 7138, 7118, 7097, 718 | 7076, 7055, 7035, 7014, 6994, 6973, 6952, 6932, 6911, 6891, 6870, 719 | 6850, 6829, 6809, 6789, 6768, 6748, 6728, 6707, 6687, 6667, 6647, 720 | 6626, 6606, 6586, 6566, 6546, 6526, 6506, 6486, 6466, 6446, 6426, 721 | 6406, 6386, 6366, 6346, 6326, 6306, 6286, 6267, 6247, 6227, 6207, 722 | 6188, 6168, 6148, 6129, 6109, 6090, 6070, 6051, 6031, 6012, 5992, 723 | 5973, 5953, 5934, 5915, 5895, 5876, 5857, 5837, 5818, 5799, 5780, 724 | 5761, 5742, 5722, 5703, 5684, 5665, 5646, 5627, 5608, 5589, 5571, 725 | 5552, 5533, 5514, 5495, 5476, 5458, 5439, 5420, 5402, 5383, 5364, 726 | 5346, 5327, 5309, 5290, 5272, 5253, 5235, 5216, 5198, 5180, 5161, 727 | 5143, 5125, 5106, 5088, 5070, 5052, 5034, 5016, 4998, 4979, 4961, 728 | 4943, 4925, 4907, 4890, 4872, 4854, 4836, 4818, 4800, 4783, 4765, 729 | 4747, 4729, 4712, 4694, 4677, 4659, 4641, 4624, 4606, 4589, 4572, 730 | 4554, 4537, 4519, 4502, 4485, 4468, 4450, 4433, 4416, 4399, 4382, 731 | 4364, 4347, 4330, 4313, 4296, 4279, 4263, 4246, 4229, 4212, 4195, 732 | 4178, 4162, 4145, 4128, 4111, 4095, 4078, 4062, 4045, 4029, 4012, 733 | 3996, 3979, 3963, 3946, 3930, 3914, 3897, 3881, 3865, 3849, 3833, 734 | 3816, 3800, 3784, 3768, 3752, 3736, 3720, 3704, 3688, 3672, 3657, 735 | 3641, 3625, 3609, 3593, 3578, 3562, 3546, 3531, 3515, 3500, 3484, 736 | 3469, 3453, 3438, 3422, 3407, 3392, 3376, 3361, 3346, 3331, 3316, 737 | 3300, 3285, 3270, 3255, 3240, 3225, 3210, 3195, 3180, 3166, 3151, 738 | 3136, 3121, 3106, 3092, 3077, 3062, 3048, 3033, 3019, 3004, 2990, 739 | 2975, 2961, 2946, 2932, 2918, 2903, 2889, 2875, 2860, 2846, 2832, 740 | 2818, 2804, 2790, 2776, 2762, 2748, 2734, 2720, 2706, 2692, 2679, 741 | 2665, 2651, 2638, 2624, 2610, 2597, 2583, 2570, 2556, 2543, 2529, 742 | 2516, 2502, 2489, 2476, 2462, 2449, 2436, 2423, 2410, 2397, 2383, 743 | 2370, 2357, 2344, 2332, 2319, 2306, 2293, 2280, 2267, 2255, 2242, 744 | 2229, 2217, 2204, 2191, 2179, 2166, 2154, 2141, 2129, 2117, 2104, 745 | 2092, 2080, 2067, 2055, 2043, 2031, 2019, 2007, 1995, 1983, 1971, 746 | 1959, 1947, 1935, 1923, 1911, 1900, 1888, 1876, 1864, 1853, 1841, 747 | 1830, 1818, 1807, 1795, 1784, 1772, 1761, 1750, 1738, 1727, 1716, 748 | 1705, 1694, 1682, 1671, 1660, 1649, 1638, 1627, 1617, 1606, 1595, 749 | 1584, 1573, 1563, 1552, 1541, 1531, 1520, 1509, 1499, 1488, 1478, 750 | 1467, 1457, 1447, 1436, 1426, 1416, 1406, 1396, 1385, 1375, 1365, 751 | 1355, 1345, 1335, 1325, 1315, 1306, 1296, 1286, 1276, 1267, 1257, 752 | 1247, 1238, 1228, 1219, 1209, 1200, 1190, 1181, 1171, 1162, 1153, 753 | 1144, 1134, 1125, 1116, 1107, 1098, 1089, 1080, 1071, 1062, 1053, 754 | 1044, 1035, 1027, 1018, 1009, 1000, 992, 983, 975, 966, 958, 755 | 949, 941, 932, 924, 916, 908, 899, 891, 883, 875, 867, 756 | 859, 851, 843, 835, 827, 819, 811, 803, 796, 788, 780, 757 | 772, 765, 757, 750, 742, 735, 727, 720, 713, 705, 698, 758 | 691, 684, 676, 669, 662, 655, 648, 641, 634, 627, 620, 759 | 614, 607, 600, 593, 587, 580, 573, 567, 560, 554, 547, 760 | 541, 534, 528, 522, 515, 509, 503, 497, 491, 485, 479, 761 | 473, 467, 461, 455, 449, 443, 437, 432, 426, 420, 414, 762 | 409, 403, 398, 392, 387, 381, 376, 371, 365, 360, 355, 763 | 350, 345, 339, 334, 329, 324, 319, 314, 310, 305, 300, 764 | 295, 290, 286, 281, 276, 272, 267, 263, 258, 254, 249, 765 | 245, 241, 237, 232, 228, 224, 220, 216, 212, 208, 204, 766 | 200, 196, 192, 188, 184, 181, 177, 173, 170, 166, 162, 767 | 159, 155, 152, 149, 145, 142, 139, 135, 132, 129, 126, 768 | 123, 120, 117, 114, 111, 108, 105, 102, 99, 97, 94, 769 | 91, 89, 86, 83, 81, 78, 76, 74, 71, 69, 67, 770 | 64, 62, 60, 58, 56, 54, 52, 50, 48, 46, 44, 771 | 42, 40, 39, 37, 35, 34, 32, 30, 29, 27, 26, 772 | 24, 23, 22, 20, 19, 18, 17, 16, 15, 14, 13, 773 | 12, 11, 10, 9, 8, 7, 6, 6, 5, 4, 4, 774 | 3, 3, 2, 2, 1, 1, 1, 0, 0, 0, 0, 775 | 0, 0, 0, 0, 776 | }; 777 | --------------------------------------------------------------------------------