CMSIS DSP Lib
Fork of mbed-dsp by
cmsis_dsp/TransformFunctions/arm_bitreversal.c@1:fdd22bb7aa52, 2012-11-28 (annotated)
- Committer:
- emilmont
- Date:
- Wed Nov 28 12:30:09 2012 +0000
- Revision:
- 1:fdd22bb7aa52
- Child:
- 2:da51fb522205
DSP library code
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
emilmont | 1:fdd22bb7aa52 | 1 | /* ---------------------------------------------------------------------- |
emilmont | 1:fdd22bb7aa52 | 2 | * Copyright (C) 2010 ARM Limited. All rights reserved. |
emilmont | 1:fdd22bb7aa52 | 3 | * |
emilmont | 1:fdd22bb7aa52 | 4 | * $Date: 15. February 2012 |
emilmont | 1:fdd22bb7aa52 | 5 | * $Revision: V1.1.0 |
emilmont | 1:fdd22bb7aa52 | 6 | * |
emilmont | 1:fdd22bb7aa52 | 7 | * Project: CMSIS DSP Library |
emilmont | 1:fdd22bb7aa52 | 8 | * Title: arm_bitreversal.c |
emilmont | 1:fdd22bb7aa52 | 9 | * |
emilmont | 1:fdd22bb7aa52 | 10 | * Description: This file has common tables like Bitreverse, reciprocal etc which are used across different functions |
emilmont | 1:fdd22bb7aa52 | 11 | * |
emilmont | 1:fdd22bb7aa52 | 12 | * Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 |
emilmont | 1:fdd22bb7aa52 | 13 | * |
emilmont | 1:fdd22bb7aa52 | 14 | * Version 1.1.0 2012/02/15 |
emilmont | 1:fdd22bb7aa52 | 15 | * Updated with more optimizations, bug fixes and minor API changes. |
emilmont | 1:fdd22bb7aa52 | 16 | * |
emilmont | 1:fdd22bb7aa52 | 17 | * Version 1.0.10 2011/7/15 |
emilmont | 1:fdd22bb7aa52 | 18 | * Initial Version |
emilmont | 1:fdd22bb7aa52 | 19 | * -------------------------------------------------------------------- */ |
emilmont | 1:fdd22bb7aa52 | 20 | |
emilmont | 1:fdd22bb7aa52 | 21 | #include "arm_math.h" |
emilmont | 1:fdd22bb7aa52 | 22 | #include "arm_common_tables.h" |
emilmont | 1:fdd22bb7aa52 | 23 | |
emilmont | 1:fdd22bb7aa52 | 24 | /* |
emilmont | 1:fdd22bb7aa52 | 25 | * @brief In-place bit reversal function. |
emilmont | 1:fdd22bb7aa52 | 26 | * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. |
emilmont | 1:fdd22bb7aa52 | 27 | * @param[in] fftSize length of the FFT. |
emilmont | 1:fdd22bb7aa52 | 28 | * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table. |
emilmont | 1:fdd22bb7aa52 | 29 | * @param[in] *pBitRevTab points to the bit reversal table. |
emilmont | 1:fdd22bb7aa52 | 30 | * @return none. |
emilmont | 1:fdd22bb7aa52 | 31 | */ |
emilmont | 1:fdd22bb7aa52 | 32 | |
emilmont | 1:fdd22bb7aa52 | 33 | void arm_bitreversal_f32( |
emilmont | 1:fdd22bb7aa52 | 34 | float32_t * pSrc, |
emilmont | 1:fdd22bb7aa52 | 35 | uint16_t fftSize, |
emilmont | 1:fdd22bb7aa52 | 36 | uint16_t bitRevFactor, |
emilmont | 1:fdd22bb7aa52 | 37 | uint16_t * pBitRevTab) |
emilmont | 1:fdd22bb7aa52 | 38 | { |
emilmont | 1:fdd22bb7aa52 | 39 | uint16_t fftLenBy2, fftLenBy2p1; |
emilmont | 1:fdd22bb7aa52 | 40 | uint16_t i, j; |
emilmont | 1:fdd22bb7aa52 | 41 | float32_t in; |
emilmont | 1:fdd22bb7aa52 | 42 | |
emilmont | 1:fdd22bb7aa52 | 43 | /* Initializations */ |
emilmont | 1:fdd22bb7aa52 | 44 | j = 0u; |
emilmont | 1:fdd22bb7aa52 | 45 | fftLenBy2 = fftSize >> 1u; |
emilmont | 1:fdd22bb7aa52 | 46 | fftLenBy2p1 = (fftSize >> 1u) + 1u; |
emilmont | 1:fdd22bb7aa52 | 47 | |
emilmont | 1:fdd22bb7aa52 | 48 | /* Bit Reversal Implementation */ |
emilmont | 1:fdd22bb7aa52 | 49 | for (i = 0u; i <= (fftLenBy2 - 2u); i += 2u) |
emilmont | 1:fdd22bb7aa52 | 50 | { |
emilmont | 1:fdd22bb7aa52 | 51 | if(i < j) |
emilmont | 1:fdd22bb7aa52 | 52 | { |
emilmont | 1:fdd22bb7aa52 | 53 | /* pSrc[i] <-> pSrc[j]; */ |
emilmont | 1:fdd22bb7aa52 | 54 | in = pSrc[2u * i]; |
emilmont | 1:fdd22bb7aa52 | 55 | pSrc[2u * i] = pSrc[2u * j]; |
emilmont | 1:fdd22bb7aa52 | 56 | pSrc[2u * j] = in; |
emilmont | 1:fdd22bb7aa52 | 57 | |
emilmont | 1:fdd22bb7aa52 | 58 | /* pSrc[i+1u] <-> pSrc[j+1u] */ |
emilmont | 1:fdd22bb7aa52 | 59 | in = pSrc[(2u * i) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 60 | pSrc[(2u * i) + 1u] = pSrc[(2u * j) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 61 | pSrc[(2u * j) + 1u] = in; |
emilmont | 1:fdd22bb7aa52 | 62 | |
emilmont | 1:fdd22bb7aa52 | 63 | /* pSrc[i+fftLenBy2p1] <-> pSrc[j+fftLenBy2p1] */ |
emilmont | 1:fdd22bb7aa52 | 64 | in = pSrc[2u * (i + fftLenBy2p1)]; |
emilmont | 1:fdd22bb7aa52 | 65 | pSrc[2u * (i + fftLenBy2p1)] = pSrc[2u * (j + fftLenBy2p1)]; |
emilmont | 1:fdd22bb7aa52 | 66 | pSrc[2u * (j + fftLenBy2p1)] = in; |
emilmont | 1:fdd22bb7aa52 | 67 | |
emilmont | 1:fdd22bb7aa52 | 68 | /* pSrc[i+fftLenBy2p1+1u] <-> pSrc[j+fftLenBy2p1+1u] */ |
emilmont | 1:fdd22bb7aa52 | 69 | in = pSrc[(2u * (i + fftLenBy2p1)) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 70 | pSrc[(2u * (i + fftLenBy2p1)) + 1u] = |
emilmont | 1:fdd22bb7aa52 | 71 | pSrc[(2u * (j + fftLenBy2p1)) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 72 | pSrc[(2u * (j + fftLenBy2p1)) + 1u] = in; |
emilmont | 1:fdd22bb7aa52 | 73 | |
emilmont | 1:fdd22bb7aa52 | 74 | } |
emilmont | 1:fdd22bb7aa52 | 75 | |
emilmont | 1:fdd22bb7aa52 | 76 | /* pSrc[i+1u] <-> pSrc[j+1u] */ |
emilmont | 1:fdd22bb7aa52 | 77 | in = pSrc[2u * (i + 1u)]; |
emilmont | 1:fdd22bb7aa52 | 78 | pSrc[2u * (i + 1u)] = pSrc[2u * (j + fftLenBy2)]; |
emilmont | 1:fdd22bb7aa52 | 79 | pSrc[2u * (j + fftLenBy2)] = in; |
emilmont | 1:fdd22bb7aa52 | 80 | |
emilmont | 1:fdd22bb7aa52 | 81 | /* pSrc[i+2u] <-> pSrc[j+2u] */ |
emilmont | 1:fdd22bb7aa52 | 82 | in = pSrc[(2u * (i + 1u)) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 83 | pSrc[(2u * (i + 1u)) + 1u] = pSrc[(2u * (j + fftLenBy2)) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 84 | pSrc[(2u * (j + fftLenBy2)) + 1u] = in; |
emilmont | 1:fdd22bb7aa52 | 85 | |
emilmont | 1:fdd22bb7aa52 | 86 | /* Reading the index for the bit reversal */ |
emilmont | 1:fdd22bb7aa52 | 87 | j = *pBitRevTab; |
emilmont | 1:fdd22bb7aa52 | 88 | |
emilmont | 1:fdd22bb7aa52 | 89 | /* Updating the bit reversal index depending on the fft length */ |
emilmont | 1:fdd22bb7aa52 | 90 | pBitRevTab += bitRevFactor; |
emilmont | 1:fdd22bb7aa52 | 91 | } |
emilmont | 1:fdd22bb7aa52 | 92 | } |
emilmont | 1:fdd22bb7aa52 | 93 | |
emilmont | 1:fdd22bb7aa52 | 94 | |
emilmont | 1:fdd22bb7aa52 | 95 | |
emilmont | 1:fdd22bb7aa52 | 96 | /* |
emilmont | 1:fdd22bb7aa52 | 97 | * @brief In-place bit reversal function. |
emilmont | 1:fdd22bb7aa52 | 98 | * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. |
emilmont | 1:fdd22bb7aa52 | 99 | * @param[in] fftLen length of the FFT. |
emilmont | 1:fdd22bb7aa52 | 100 | * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table |
emilmont | 1:fdd22bb7aa52 | 101 | * @param[in] *pBitRevTab points to bit reversal table. |
emilmont | 1:fdd22bb7aa52 | 102 | * @return none. |
emilmont | 1:fdd22bb7aa52 | 103 | */ |
emilmont | 1:fdd22bb7aa52 | 104 | |
emilmont | 1:fdd22bb7aa52 | 105 | void arm_bitreversal_q31( |
emilmont | 1:fdd22bb7aa52 | 106 | q31_t * pSrc, |
emilmont | 1:fdd22bb7aa52 | 107 | uint32_t fftLen, |
emilmont | 1:fdd22bb7aa52 | 108 | uint16_t bitRevFactor, |
emilmont | 1:fdd22bb7aa52 | 109 | uint16_t * pBitRevTable) |
emilmont | 1:fdd22bb7aa52 | 110 | { |
emilmont | 1:fdd22bb7aa52 | 111 | uint32_t fftLenBy2, fftLenBy2p1, i, j; |
emilmont | 1:fdd22bb7aa52 | 112 | q31_t in; |
emilmont | 1:fdd22bb7aa52 | 113 | |
emilmont | 1:fdd22bb7aa52 | 114 | /* Initializations */ |
emilmont | 1:fdd22bb7aa52 | 115 | j = 0u; |
emilmont | 1:fdd22bb7aa52 | 116 | fftLenBy2 = fftLen / 2u; |
emilmont | 1:fdd22bb7aa52 | 117 | fftLenBy2p1 = (fftLen / 2u) + 1u; |
emilmont | 1:fdd22bb7aa52 | 118 | |
emilmont | 1:fdd22bb7aa52 | 119 | /* Bit Reversal Implementation */ |
emilmont | 1:fdd22bb7aa52 | 120 | for (i = 0u; i <= (fftLenBy2 - 2u); i += 2u) |
emilmont | 1:fdd22bb7aa52 | 121 | { |
emilmont | 1:fdd22bb7aa52 | 122 | if(i < j) |
emilmont | 1:fdd22bb7aa52 | 123 | { |
emilmont | 1:fdd22bb7aa52 | 124 | /* pSrc[i] <-> pSrc[j]; */ |
emilmont | 1:fdd22bb7aa52 | 125 | in = pSrc[2u * i]; |
emilmont | 1:fdd22bb7aa52 | 126 | pSrc[2u * i] = pSrc[2u * j]; |
emilmont | 1:fdd22bb7aa52 | 127 | pSrc[2u * j] = in; |
emilmont | 1:fdd22bb7aa52 | 128 | |
emilmont | 1:fdd22bb7aa52 | 129 | /* pSrc[i+1u] <-> pSrc[j+1u] */ |
emilmont | 1:fdd22bb7aa52 | 130 | in = pSrc[(2u * i) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 131 | pSrc[(2u * i) + 1u] = pSrc[(2u * j) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 132 | pSrc[(2u * j) + 1u] = in; |
emilmont | 1:fdd22bb7aa52 | 133 | |
emilmont | 1:fdd22bb7aa52 | 134 | /* pSrc[i+fftLenBy2p1] <-> pSrc[j+fftLenBy2p1] */ |
emilmont | 1:fdd22bb7aa52 | 135 | in = pSrc[2u * (i + fftLenBy2p1)]; |
emilmont | 1:fdd22bb7aa52 | 136 | pSrc[2u * (i + fftLenBy2p1)] = pSrc[2u * (j + fftLenBy2p1)]; |
emilmont | 1:fdd22bb7aa52 | 137 | pSrc[2u * (j + fftLenBy2p1)] = in; |
emilmont | 1:fdd22bb7aa52 | 138 | |
emilmont | 1:fdd22bb7aa52 | 139 | /* pSrc[i+fftLenBy2p1+1u] <-> pSrc[j+fftLenBy2p1+1u] */ |
emilmont | 1:fdd22bb7aa52 | 140 | in = pSrc[(2u * (i + fftLenBy2p1)) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 141 | pSrc[(2u * (i + fftLenBy2p1)) + 1u] = |
emilmont | 1:fdd22bb7aa52 | 142 | pSrc[(2u * (j + fftLenBy2p1)) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 143 | pSrc[(2u * (j + fftLenBy2p1)) + 1u] = in; |
emilmont | 1:fdd22bb7aa52 | 144 | |
emilmont | 1:fdd22bb7aa52 | 145 | } |
emilmont | 1:fdd22bb7aa52 | 146 | |
emilmont | 1:fdd22bb7aa52 | 147 | /* pSrc[i+1u] <-> pSrc[j+1u] */ |
emilmont | 1:fdd22bb7aa52 | 148 | in = pSrc[2u * (i + 1u)]; |
emilmont | 1:fdd22bb7aa52 | 149 | pSrc[2u * (i + 1u)] = pSrc[2u * (j + fftLenBy2)]; |
emilmont | 1:fdd22bb7aa52 | 150 | pSrc[2u * (j + fftLenBy2)] = in; |
emilmont | 1:fdd22bb7aa52 | 151 | |
emilmont | 1:fdd22bb7aa52 | 152 | /* pSrc[i+2u] <-> pSrc[j+2u] */ |
emilmont | 1:fdd22bb7aa52 | 153 | in = pSrc[(2u * (i + 1u)) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 154 | pSrc[(2u * (i + 1u)) + 1u] = pSrc[(2u * (j + fftLenBy2)) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 155 | pSrc[(2u * (j + fftLenBy2)) + 1u] = in; |
emilmont | 1:fdd22bb7aa52 | 156 | |
emilmont | 1:fdd22bb7aa52 | 157 | /* Reading the index for the bit reversal */ |
emilmont | 1:fdd22bb7aa52 | 158 | j = *pBitRevTable; |
emilmont | 1:fdd22bb7aa52 | 159 | |
emilmont | 1:fdd22bb7aa52 | 160 | /* Updating the bit reversal index depending on the fft length */ |
emilmont | 1:fdd22bb7aa52 | 161 | pBitRevTable += bitRevFactor; |
emilmont | 1:fdd22bb7aa52 | 162 | } |
emilmont | 1:fdd22bb7aa52 | 163 | } |
emilmont | 1:fdd22bb7aa52 | 164 | |
emilmont | 1:fdd22bb7aa52 | 165 | |
emilmont | 1:fdd22bb7aa52 | 166 | |
emilmont | 1:fdd22bb7aa52 | 167 | /* |
emilmont | 1:fdd22bb7aa52 | 168 | * @brief In-place bit reversal function. |
emilmont | 1:fdd22bb7aa52 | 169 | * @param[in, out] *pSrc points to the in-place buffer of Q15 data type. |
emilmont | 1:fdd22bb7aa52 | 170 | * @param[in] fftLen length of the FFT. |
emilmont | 1:fdd22bb7aa52 | 171 | * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table |
emilmont | 1:fdd22bb7aa52 | 172 | * @param[in] *pBitRevTab points to bit reversal table. |
emilmont | 1:fdd22bb7aa52 | 173 | * @return none. |
emilmont | 1:fdd22bb7aa52 | 174 | */ |
emilmont | 1:fdd22bb7aa52 | 175 | |
emilmont | 1:fdd22bb7aa52 | 176 | void arm_bitreversal_q15( |
emilmont | 1:fdd22bb7aa52 | 177 | q15_t * pSrc16, |
emilmont | 1:fdd22bb7aa52 | 178 | uint32_t fftLen, |
emilmont | 1:fdd22bb7aa52 | 179 | uint16_t bitRevFactor, |
emilmont | 1:fdd22bb7aa52 | 180 | uint16_t * pBitRevTab) |
emilmont | 1:fdd22bb7aa52 | 181 | { |
emilmont | 1:fdd22bb7aa52 | 182 | q31_t *pSrc = (q31_t *) pSrc16; |
emilmont | 1:fdd22bb7aa52 | 183 | q31_t in; |
emilmont | 1:fdd22bb7aa52 | 184 | uint32_t fftLenBy2, fftLenBy2p1; |
emilmont | 1:fdd22bb7aa52 | 185 | uint32_t i, j; |
emilmont | 1:fdd22bb7aa52 | 186 | |
emilmont | 1:fdd22bb7aa52 | 187 | /* Initializations */ |
emilmont | 1:fdd22bb7aa52 | 188 | j = 0u; |
emilmont | 1:fdd22bb7aa52 | 189 | fftLenBy2 = fftLen / 2u; |
emilmont | 1:fdd22bb7aa52 | 190 | fftLenBy2p1 = (fftLen / 2u) + 1u; |
emilmont | 1:fdd22bb7aa52 | 191 | |
emilmont | 1:fdd22bb7aa52 | 192 | /* Bit Reversal Implementation */ |
emilmont | 1:fdd22bb7aa52 | 193 | for (i = 0u; i <= (fftLenBy2 - 2u); i += 2u) |
emilmont | 1:fdd22bb7aa52 | 194 | { |
emilmont | 1:fdd22bb7aa52 | 195 | if(i < j) |
emilmont | 1:fdd22bb7aa52 | 196 | { |
emilmont | 1:fdd22bb7aa52 | 197 | /* pSrc[i] <-> pSrc[j]; */ |
emilmont | 1:fdd22bb7aa52 | 198 | /* pSrc[i+1u] <-> pSrc[j+1u] */ |
emilmont | 1:fdd22bb7aa52 | 199 | in = pSrc[i]; |
emilmont | 1:fdd22bb7aa52 | 200 | pSrc[i] = pSrc[j]; |
emilmont | 1:fdd22bb7aa52 | 201 | pSrc[j] = in; |
emilmont | 1:fdd22bb7aa52 | 202 | |
emilmont | 1:fdd22bb7aa52 | 203 | /* pSrc[i + fftLenBy2p1] <-> pSrc[j + fftLenBy2p1]; */ |
emilmont | 1:fdd22bb7aa52 | 204 | /* pSrc[i + fftLenBy2p1+1u] <-> pSrc[j + fftLenBy2p1+1u] */ |
emilmont | 1:fdd22bb7aa52 | 205 | in = pSrc[i + fftLenBy2p1]; |
emilmont | 1:fdd22bb7aa52 | 206 | pSrc[i + fftLenBy2p1] = pSrc[j + fftLenBy2p1]; |
emilmont | 1:fdd22bb7aa52 | 207 | pSrc[j + fftLenBy2p1] = in; |
emilmont | 1:fdd22bb7aa52 | 208 | } |
emilmont | 1:fdd22bb7aa52 | 209 | |
emilmont | 1:fdd22bb7aa52 | 210 | /* pSrc[i+1u] <-> pSrc[j+fftLenBy2]; */ |
emilmont | 1:fdd22bb7aa52 | 211 | /* pSrc[i+2] <-> pSrc[j+fftLenBy2+1u] */ |
emilmont | 1:fdd22bb7aa52 | 212 | in = pSrc[i + 1u]; |
emilmont | 1:fdd22bb7aa52 | 213 | pSrc[i + 1u] = pSrc[j + fftLenBy2]; |
emilmont | 1:fdd22bb7aa52 | 214 | pSrc[j + fftLenBy2] = in; |
emilmont | 1:fdd22bb7aa52 | 215 | |
emilmont | 1:fdd22bb7aa52 | 216 | /* Reading the index for the bit reversal */ |
emilmont | 1:fdd22bb7aa52 | 217 | j = *pBitRevTab; |
emilmont | 1:fdd22bb7aa52 | 218 | |
emilmont | 1:fdd22bb7aa52 | 219 | /* Updating the bit reversal index depending on the fft length */ |
emilmont | 1:fdd22bb7aa52 | 220 | pBitRevTab += bitRevFactor; |
emilmont | 1:fdd22bb7aa52 | 221 | } |
emilmont | 1:fdd22bb7aa52 | 222 | } |