mbed-os 6.10 versione
cmsis_dsp/TransformFunctions/arm_cfft_radix4_f32.c@3:7a284390b0ce, 2013-11-08 (annotated)
- Committer:
- mbed_official
- Date:
- Fri Nov 08 13:45:10 2013 +0000
- Revision:
- 3:7a284390b0ce
- Parent:
- 2:da51fb522205
Synchronized with git revision e69956aba2f68a2a26ac26b051f8d349deaa1ce8
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
emilmont | 1:fdd22bb7aa52 | 1 | /* ---------------------------------------------------------------------- |
mbed_official | 3:7a284390b0ce | 2 | * Copyright (C) 2010-2013 ARM Limited. All rights reserved. |
emilmont | 1:fdd22bb7aa52 | 3 | * |
mbed_official | 3:7a284390b0ce | 4 | * $Date: 17. January 2013 |
mbed_official | 3:7a284390b0ce | 5 | * $Revision: V1.4.1 |
emilmont | 1:fdd22bb7aa52 | 6 | * |
emilmont | 2:da51fb522205 | 7 | * Project: CMSIS DSP Library |
emilmont | 2:da51fb522205 | 8 | * Title: arm_cfft_radix4_f32.c |
emilmont | 1:fdd22bb7aa52 | 9 | * |
emilmont | 2:da51fb522205 | 10 | * Description: Radix-4 Decimation in Frequency CFFT & CIFFT Floating point processing function |
emilmont | 1:fdd22bb7aa52 | 11 | * |
emilmont | 1:fdd22bb7aa52 | 12 | * |
emilmont | 1:fdd22bb7aa52 | 13 | * Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 |
emilmont | 1:fdd22bb7aa52 | 14 | * |
mbed_official | 3:7a284390b0ce | 15 | * Redistribution and use in source and binary forms, with or without |
mbed_official | 3:7a284390b0ce | 16 | * modification, are permitted provided that the following conditions |
mbed_official | 3:7a284390b0ce | 17 | * are met: |
mbed_official | 3:7a284390b0ce | 18 | * - Redistributions of source code must retain the above copyright |
mbed_official | 3:7a284390b0ce | 19 | * notice, this list of conditions and the following disclaimer. |
mbed_official | 3:7a284390b0ce | 20 | * - Redistributions in binary form must reproduce the above copyright |
mbed_official | 3:7a284390b0ce | 21 | * notice, this list of conditions and the following disclaimer in |
mbed_official | 3:7a284390b0ce | 22 | * the documentation and/or other materials provided with the |
mbed_official | 3:7a284390b0ce | 23 | * distribution. |
mbed_official | 3:7a284390b0ce | 24 | * - Neither the name of ARM LIMITED nor the names of its contributors |
mbed_official | 3:7a284390b0ce | 25 | * may be used to endorse or promote products derived from this |
mbed_official | 3:7a284390b0ce | 26 | * software without specific prior written permission. |
mbed_official | 3:7a284390b0ce | 27 | * |
mbed_official | 3:7a284390b0ce | 28 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
mbed_official | 3:7a284390b0ce | 29 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
mbed_official | 3:7a284390b0ce | 30 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
mbed_official | 3:7a284390b0ce | 31 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
mbed_official | 3:7a284390b0ce | 32 | * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
mbed_official | 3:7a284390b0ce | 33 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
mbed_official | 3:7a284390b0ce | 34 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
mbed_official | 3:7a284390b0ce | 35 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
mbed_official | 3:7a284390b0ce | 36 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
mbed_official | 3:7a284390b0ce | 37 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
mbed_official | 3:7a284390b0ce | 38 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
mbed_official | 3:7a284390b0ce | 39 | * POSSIBILITY OF SUCH DAMAGE. |
emilmont | 1:fdd22bb7aa52 | 40 | * -------------------------------------------------------------------- */ |
emilmont | 1:fdd22bb7aa52 | 41 | |
emilmont | 1:fdd22bb7aa52 | 42 | #include "arm_math.h" |
emilmont | 1:fdd22bb7aa52 | 43 | |
mbed_official | 3:7a284390b0ce | 44 | extern void arm_bitreversal_f32( |
mbed_official | 3:7a284390b0ce | 45 | float32_t * pSrc, |
mbed_official | 3:7a284390b0ce | 46 | uint16_t fftSize, |
mbed_official | 3:7a284390b0ce | 47 | uint16_t bitRevFactor, |
mbed_official | 3:7a284390b0ce | 48 | uint16_t * pBitRevTab); |
emilmont | 1:fdd22bb7aa52 | 49 | |
emilmont | 1:fdd22bb7aa52 | 50 | /** |
mbed_official | 3:7a284390b0ce | 51 | * @ingroup groupTransforms |
mbed_official | 3:7a284390b0ce | 52 | */ |
emilmont | 1:fdd22bb7aa52 | 53 | |
emilmont | 1:fdd22bb7aa52 | 54 | /* ---------------------------------------------------------------------- |
emilmont | 1:fdd22bb7aa52 | 55 | ** Internal helper function used by the FFTs |
emilmont | 1:fdd22bb7aa52 | 56 | ** ------------------------------------------------------------------- */ |
emilmont | 1:fdd22bb7aa52 | 57 | |
emilmont | 1:fdd22bb7aa52 | 58 | /* |
mbed_official | 3:7a284390b0ce | 59 | * @brief Core function for the floating-point CFFT butterfly process. |
mbed_official | 3:7a284390b0ce | 60 | * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. |
mbed_official | 3:7a284390b0ce | 61 | * @param[in] fftLen length of the FFT. |
mbed_official | 3:7a284390b0ce | 62 | * @param[in] *pCoef points to the twiddle coefficient buffer. |
mbed_official | 3:7a284390b0ce | 63 | * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. |
mbed_official | 3:7a284390b0ce | 64 | * @return none. |
mbed_official | 3:7a284390b0ce | 65 | */ |
emilmont | 1:fdd22bb7aa52 | 66 | |
emilmont | 1:fdd22bb7aa52 | 67 | void arm_radix4_butterfly_f32( |
mbed_official | 3:7a284390b0ce | 68 | float32_t * pSrc, |
mbed_official | 3:7a284390b0ce | 69 | uint16_t fftLen, |
mbed_official | 3:7a284390b0ce | 70 | float32_t * pCoef, |
mbed_official | 3:7a284390b0ce | 71 | uint16_t twidCoefModifier) |
emilmont | 1:fdd22bb7aa52 | 72 | { |
emilmont | 1:fdd22bb7aa52 | 73 | |
mbed_official | 3:7a284390b0ce | 74 | float32_t co1, co2, co3, si1, si2, si3; |
mbed_official | 3:7a284390b0ce | 75 | uint32_t ia1, ia2, ia3; |
mbed_official | 3:7a284390b0ce | 76 | uint32_t i0, i1, i2, i3; |
mbed_official | 3:7a284390b0ce | 77 | uint32_t n1, n2, j, k; |
emilmont | 1:fdd22bb7aa52 | 78 | |
mbed_official | 3:7a284390b0ce | 79 | #ifndef ARM_MATH_CM0_FAMILY_FAMILY |
emilmont | 1:fdd22bb7aa52 | 80 | |
mbed_official | 3:7a284390b0ce | 81 | /* Run the below code for Cortex-M4 and Cortex-M3 */ |
emilmont | 1:fdd22bb7aa52 | 82 | |
mbed_official | 3:7a284390b0ce | 83 | float32_t xaIn, yaIn, xbIn, ybIn, xcIn, ycIn, xdIn, ydIn; |
mbed_official | 3:7a284390b0ce | 84 | float32_t Xaplusc, Xbplusd, Yaplusc, Ybplusd, Xaminusc, Xbminusd, Yaminusc, |
mbed_official | 3:7a284390b0ce | 85 | Ybminusd; |
mbed_official | 3:7a284390b0ce | 86 | float32_t Xb12C_out, Yb12C_out, Xc12C_out, Yc12C_out, Xd12C_out, Yd12C_out; |
mbed_official | 3:7a284390b0ce | 87 | float32_t Xb12_out, Yb12_out, Xc12_out, Yc12_out, Xd12_out, Yd12_out; |
mbed_official | 3:7a284390b0ce | 88 | float32_t *ptr1; |
mbed_official | 3:7a284390b0ce | 89 | float32_t p0,p1,p2,p3,p4,p5; |
mbed_official | 3:7a284390b0ce | 90 | float32_t a0,a1,a2,a3,a4,a5,a6,a7; |
emilmont | 1:fdd22bb7aa52 | 91 | |
mbed_official | 3:7a284390b0ce | 92 | /* Initializations for the first stage */ |
mbed_official | 3:7a284390b0ce | 93 | n2 = fftLen; |
mbed_official | 3:7a284390b0ce | 94 | n1 = n2; |
emilmont | 1:fdd22bb7aa52 | 95 | |
mbed_official | 3:7a284390b0ce | 96 | /* n2 = fftLen/4 */ |
mbed_official | 3:7a284390b0ce | 97 | n2 >>= 2u; |
mbed_official | 3:7a284390b0ce | 98 | i0 = 0u; |
mbed_official | 3:7a284390b0ce | 99 | ia1 = 0u; |
emilmont | 1:fdd22bb7aa52 | 100 | |
mbed_official | 3:7a284390b0ce | 101 | j = n2; |
emilmont | 1:fdd22bb7aa52 | 102 | |
mbed_official | 3:7a284390b0ce | 103 | /* Calculation of first stage */ |
mbed_official | 3:7a284390b0ce | 104 | do |
mbed_official | 3:7a284390b0ce | 105 | { |
mbed_official | 3:7a284390b0ce | 106 | /* index calculation for the input as, */ |
mbed_official | 3:7a284390b0ce | 107 | /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ |
mbed_official | 3:7a284390b0ce | 108 | i1 = i0 + n2; |
mbed_official | 3:7a284390b0ce | 109 | i2 = i1 + n2; |
mbed_official | 3:7a284390b0ce | 110 | i3 = i2 + n2; |
emilmont | 1:fdd22bb7aa52 | 111 | |
mbed_official | 3:7a284390b0ce | 112 | xaIn = pSrc[(2u * i0)]; |
mbed_official | 3:7a284390b0ce | 113 | yaIn = pSrc[(2u * i0) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 114 | |
mbed_official | 3:7a284390b0ce | 115 | xbIn = pSrc[(2u * i1)]; |
mbed_official | 3:7a284390b0ce | 116 | ybIn = pSrc[(2u * i1) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 117 | |
mbed_official | 3:7a284390b0ce | 118 | xcIn = pSrc[(2u * i2)]; |
mbed_official | 3:7a284390b0ce | 119 | ycIn = pSrc[(2u * i2) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 120 | |
mbed_official | 3:7a284390b0ce | 121 | xdIn = pSrc[(2u * i3)]; |
mbed_official | 3:7a284390b0ce | 122 | ydIn = pSrc[(2u * i3) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 123 | |
mbed_official | 3:7a284390b0ce | 124 | /* xa + xc */ |
mbed_official | 3:7a284390b0ce | 125 | Xaplusc = xaIn + xcIn; |
mbed_official | 3:7a284390b0ce | 126 | /* xb + xd */ |
mbed_official | 3:7a284390b0ce | 127 | Xbplusd = xbIn + xdIn; |
mbed_official | 3:7a284390b0ce | 128 | /* ya + yc */ |
mbed_official | 3:7a284390b0ce | 129 | Yaplusc = yaIn + ycIn; |
mbed_official | 3:7a284390b0ce | 130 | /* yb + yd */ |
mbed_official | 3:7a284390b0ce | 131 | Ybplusd = ybIn + ydIn; |
emilmont | 1:fdd22bb7aa52 | 132 | |
emilmont | 1:fdd22bb7aa52 | 133 | /* index calculation for the coefficients */ |
emilmont | 1:fdd22bb7aa52 | 134 | ia2 = ia1 + ia1; |
mbed_official | 3:7a284390b0ce | 135 | co2 = pCoef[ia2 * 2u]; |
mbed_official | 3:7a284390b0ce | 136 | si2 = pCoef[(ia2 * 2u) + 1u]; |
mbed_official | 3:7a284390b0ce | 137 | |
mbed_official | 3:7a284390b0ce | 138 | /* xa - xc */ |
mbed_official | 3:7a284390b0ce | 139 | Xaminusc = xaIn - xcIn; |
mbed_official | 3:7a284390b0ce | 140 | /* xb - xd */ |
mbed_official | 3:7a284390b0ce | 141 | Xbminusd = xbIn - xdIn; |
mbed_official | 3:7a284390b0ce | 142 | /* ya - yc */ |
mbed_official | 3:7a284390b0ce | 143 | Yaminusc = yaIn - ycIn; |
mbed_official | 3:7a284390b0ce | 144 | /* yb - yd */ |
mbed_official | 3:7a284390b0ce | 145 | Ybminusd = ybIn - ydIn; |
mbed_official | 3:7a284390b0ce | 146 | |
mbed_official | 3:7a284390b0ce | 147 | /* xa' = xa + xb + xc + xd */ |
mbed_official | 3:7a284390b0ce | 148 | pSrc[(2u * i0)] = Xaplusc + Xbplusd; |
mbed_official | 3:7a284390b0ce | 149 | /* ya' = ya + yb + yc + yd */ |
mbed_official | 3:7a284390b0ce | 150 | pSrc[(2u * i0) + 1u] = Yaplusc + Ybplusd; |
mbed_official | 3:7a284390b0ce | 151 | |
mbed_official | 3:7a284390b0ce | 152 | /* (xa - xc) + (yb - yd) */ |
mbed_official | 3:7a284390b0ce | 153 | Xb12C_out = (Xaminusc + Ybminusd); |
mbed_official | 3:7a284390b0ce | 154 | /* (ya - yc) + (xb - xd) */ |
mbed_official | 3:7a284390b0ce | 155 | Yb12C_out = (Yaminusc - Xbminusd); |
mbed_official | 3:7a284390b0ce | 156 | /* (xa + xc) - (xb + xd) */ |
mbed_official | 3:7a284390b0ce | 157 | Xc12C_out = (Xaplusc - Xbplusd); |
mbed_official | 3:7a284390b0ce | 158 | /* (ya + yc) - (yb + yd) */ |
mbed_official | 3:7a284390b0ce | 159 | Yc12C_out = (Yaplusc - Ybplusd); |
mbed_official | 3:7a284390b0ce | 160 | /* (xa - xc) - (yb - yd) */ |
mbed_official | 3:7a284390b0ce | 161 | Xd12C_out = (Xaminusc - Ybminusd); |
mbed_official | 3:7a284390b0ce | 162 | /* (ya - yc) + (xb - xd) */ |
mbed_official | 3:7a284390b0ce | 163 | Yd12C_out = (Xbminusd + Yaminusc); |
mbed_official | 3:7a284390b0ce | 164 | |
emilmont | 1:fdd22bb7aa52 | 165 | co1 = pCoef[ia1 * 2u]; |
emilmont | 1:fdd22bb7aa52 | 166 | si1 = pCoef[(ia1 * 2u) + 1u]; |
mbed_official | 3:7a284390b0ce | 167 | |
mbed_official | 3:7a284390b0ce | 168 | /* index calculation for the coefficients */ |
mbed_official | 3:7a284390b0ce | 169 | ia3 = ia2 + ia1; |
emilmont | 1:fdd22bb7aa52 | 170 | co3 = pCoef[ia3 * 2u]; |
emilmont | 1:fdd22bb7aa52 | 171 | si3 = pCoef[(ia3 * 2u) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 172 | |
mbed_official | 3:7a284390b0ce | 173 | Xb12_out = Xb12C_out * co1; |
mbed_official | 3:7a284390b0ce | 174 | Yb12_out = Yb12C_out * co1; |
mbed_official | 3:7a284390b0ce | 175 | Xc12_out = Xc12C_out * co2; |
mbed_official | 3:7a284390b0ce | 176 | Yc12_out = Yc12C_out * co2; |
mbed_official | 3:7a284390b0ce | 177 | Xd12_out = Xd12C_out * co3; |
mbed_official | 3:7a284390b0ce | 178 | Yd12_out = Yd12C_out * co3; |
mbed_official | 3:7a284390b0ce | 179 | |
mbed_official | 3:7a284390b0ce | 180 | /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ |
mbed_official | 3:7a284390b0ce | 181 | //Xb12_out -= Yb12C_out * si1; |
mbed_official | 3:7a284390b0ce | 182 | p0 = Yb12C_out * si1; |
mbed_official | 3:7a284390b0ce | 183 | /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ |
mbed_official | 3:7a284390b0ce | 184 | //Yb12_out += Xb12C_out * si1; |
mbed_official | 3:7a284390b0ce | 185 | p1 = Xb12C_out * si1; |
mbed_official | 3:7a284390b0ce | 186 | /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ |
mbed_official | 3:7a284390b0ce | 187 | //Xc12_out -= Yc12C_out * si2; |
mbed_official | 3:7a284390b0ce | 188 | p2 = Yc12C_out * si2; |
mbed_official | 3:7a284390b0ce | 189 | /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ |
mbed_official | 3:7a284390b0ce | 190 | //Yc12_out += Xc12C_out * si2; |
mbed_official | 3:7a284390b0ce | 191 | p3 = Xc12C_out * si2; |
mbed_official | 3:7a284390b0ce | 192 | /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ |
mbed_official | 3:7a284390b0ce | 193 | //Xd12_out -= Yd12C_out * si3; |
mbed_official | 3:7a284390b0ce | 194 | p4 = Yd12C_out * si3; |
mbed_official | 3:7a284390b0ce | 195 | /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ |
mbed_official | 3:7a284390b0ce | 196 | //Yd12_out += Xd12C_out * si3; |
mbed_official | 3:7a284390b0ce | 197 | p5 = Xd12C_out * si3; |
mbed_official | 3:7a284390b0ce | 198 | |
mbed_official | 3:7a284390b0ce | 199 | Xb12_out += p0; |
mbed_official | 3:7a284390b0ce | 200 | Yb12_out -= p1; |
mbed_official | 3:7a284390b0ce | 201 | Xc12_out += p2; |
mbed_official | 3:7a284390b0ce | 202 | Yc12_out -= p3; |
mbed_official | 3:7a284390b0ce | 203 | Xd12_out += p4; |
mbed_official | 3:7a284390b0ce | 204 | Yd12_out -= p5; |
emilmont | 1:fdd22bb7aa52 | 205 | |
mbed_official | 3:7a284390b0ce | 206 | /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */ |
mbed_official | 3:7a284390b0ce | 207 | pSrc[2u * i1] = Xc12_out; |
mbed_official | 3:7a284390b0ce | 208 | |
mbed_official | 3:7a284390b0ce | 209 | /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */ |
mbed_official | 3:7a284390b0ce | 210 | pSrc[(2u * i1) + 1u] = Yc12_out; |
mbed_official | 3:7a284390b0ce | 211 | |
mbed_official | 3:7a284390b0ce | 212 | /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */ |
mbed_official | 3:7a284390b0ce | 213 | pSrc[2u * i2] = Xb12_out; |
mbed_official | 3:7a284390b0ce | 214 | |
mbed_official | 3:7a284390b0ce | 215 | /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */ |
mbed_official | 3:7a284390b0ce | 216 | pSrc[(2u * i2) + 1u] = Yb12_out; |
emilmont | 1:fdd22bb7aa52 | 217 | |
mbed_official | 3:7a284390b0ce | 218 | /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */ |
mbed_official | 3:7a284390b0ce | 219 | pSrc[2u * i3] = Xd12_out; |
mbed_official | 3:7a284390b0ce | 220 | |
mbed_official | 3:7a284390b0ce | 221 | /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */ |
mbed_official | 3:7a284390b0ce | 222 | pSrc[(2u * i3) + 1u] = Yd12_out; |
emilmont | 1:fdd22bb7aa52 | 223 | |
mbed_official | 3:7a284390b0ce | 224 | /* Twiddle coefficients index modifier */ |
mbed_official | 3:7a284390b0ce | 225 | ia1 += twidCoefModifier; |
mbed_official | 3:7a284390b0ce | 226 | |
mbed_official | 3:7a284390b0ce | 227 | /* Updating input index */ |
mbed_official | 3:7a284390b0ce | 228 | i0++; |
mbed_official | 3:7a284390b0ce | 229 | |
mbed_official | 3:7a284390b0ce | 230 | } |
mbed_official | 3:7a284390b0ce | 231 | while(--j); |
mbed_official | 3:7a284390b0ce | 232 | |
mbed_official | 3:7a284390b0ce | 233 | twidCoefModifier <<= 2u; |
emilmont | 1:fdd22bb7aa52 | 234 | |
mbed_official | 3:7a284390b0ce | 235 | /* Calculation of second stage to excluding last stage */ |
mbed_official | 3:7a284390b0ce | 236 | for (k = fftLen >> 2u; k > 4u; k >>= 2u) |
mbed_official | 3:7a284390b0ce | 237 | { |
mbed_official | 3:7a284390b0ce | 238 | /* Initializations for the first stage */ |
mbed_official | 3:7a284390b0ce | 239 | n1 = n2; |
mbed_official | 3:7a284390b0ce | 240 | n2 >>= 2u; |
mbed_official | 3:7a284390b0ce | 241 | ia1 = 0u; |
emilmont | 1:fdd22bb7aa52 | 242 | |
mbed_official | 3:7a284390b0ce | 243 | /* Calculation of first stage */ |
mbed_official | 3:7a284390b0ce | 244 | j = 0; |
mbed_official | 3:7a284390b0ce | 245 | do |
mbed_official | 3:7a284390b0ce | 246 | { |
mbed_official | 3:7a284390b0ce | 247 | /* index calculation for the coefficients */ |
mbed_official | 3:7a284390b0ce | 248 | ia2 = ia1 + ia1; |
mbed_official | 3:7a284390b0ce | 249 | ia3 = ia2 + ia1; |
mbed_official | 3:7a284390b0ce | 250 | co1 = pCoef[ia1 * 2u]; |
mbed_official | 3:7a284390b0ce | 251 | si1 = pCoef[(ia1 * 2u) + 1u]; |
mbed_official | 3:7a284390b0ce | 252 | co2 = pCoef[ia2 * 2u]; |
mbed_official | 3:7a284390b0ce | 253 | si2 = pCoef[(ia2 * 2u) + 1u]; |
mbed_official | 3:7a284390b0ce | 254 | co3 = pCoef[ia3 * 2u]; |
mbed_official | 3:7a284390b0ce | 255 | si3 = pCoef[(ia3 * 2u) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 256 | |
mbed_official | 3:7a284390b0ce | 257 | /* Twiddle coefficients index modifier */ |
mbed_official | 3:7a284390b0ce | 258 | ia1 += twidCoefModifier; |
mbed_official | 3:7a284390b0ce | 259 | |
mbed_official | 3:7a284390b0ce | 260 | i0 = j; |
mbed_official | 3:7a284390b0ce | 261 | do |
mbed_official | 3:7a284390b0ce | 262 | { |
mbed_official | 3:7a284390b0ce | 263 | /* index calculation for the input as, */ |
mbed_official | 3:7a284390b0ce | 264 | /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ |
mbed_official | 3:7a284390b0ce | 265 | i1 = i0 + n2; |
mbed_official | 3:7a284390b0ce | 266 | i2 = i1 + n2; |
mbed_official | 3:7a284390b0ce | 267 | i3 = i2 + n2; |
mbed_official | 3:7a284390b0ce | 268 | |
mbed_official | 3:7a284390b0ce | 269 | xaIn = pSrc[(2u * i0)]; |
mbed_official | 3:7a284390b0ce | 270 | yaIn = pSrc[(2u * i0) + 1u]; |
mbed_official | 3:7a284390b0ce | 271 | |
mbed_official | 3:7a284390b0ce | 272 | xbIn = pSrc[(2u * i1)]; |
mbed_official | 3:7a284390b0ce | 273 | ybIn = pSrc[(2u * i1) + 1u]; |
mbed_official | 3:7a284390b0ce | 274 | |
mbed_official | 3:7a284390b0ce | 275 | xcIn = pSrc[(2u * i2)]; |
mbed_official | 3:7a284390b0ce | 276 | ycIn = pSrc[(2u * i2) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 277 | |
mbed_official | 3:7a284390b0ce | 278 | xdIn = pSrc[(2u * i3)]; |
mbed_official | 3:7a284390b0ce | 279 | ydIn = pSrc[(2u * i3) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 280 | |
mbed_official | 3:7a284390b0ce | 281 | /* xa - xc */ |
mbed_official | 3:7a284390b0ce | 282 | Xaminusc = xaIn - xcIn; |
mbed_official | 3:7a284390b0ce | 283 | /* (xb - xd) */ |
mbed_official | 3:7a284390b0ce | 284 | Xbminusd = xbIn - xdIn; |
mbed_official | 3:7a284390b0ce | 285 | /* ya - yc */ |
mbed_official | 3:7a284390b0ce | 286 | Yaminusc = yaIn - ycIn; |
mbed_official | 3:7a284390b0ce | 287 | /* (yb - yd) */ |
mbed_official | 3:7a284390b0ce | 288 | Ybminusd = ybIn - ydIn; |
emilmont | 1:fdd22bb7aa52 | 289 | |
mbed_official | 3:7a284390b0ce | 290 | /* xa + xc */ |
mbed_official | 3:7a284390b0ce | 291 | Xaplusc = xaIn + xcIn; |
mbed_official | 3:7a284390b0ce | 292 | /* xb + xd */ |
mbed_official | 3:7a284390b0ce | 293 | Xbplusd = xbIn + xdIn; |
mbed_official | 3:7a284390b0ce | 294 | /* ya + yc */ |
mbed_official | 3:7a284390b0ce | 295 | Yaplusc = yaIn + ycIn; |
mbed_official | 3:7a284390b0ce | 296 | /* yb + yd */ |
mbed_official | 3:7a284390b0ce | 297 | Ybplusd = ybIn + ydIn; |
emilmont | 1:fdd22bb7aa52 | 298 | |
mbed_official | 3:7a284390b0ce | 299 | /* (xa - xc) + (yb - yd) */ |
mbed_official | 3:7a284390b0ce | 300 | Xb12C_out = (Xaminusc + Ybminusd); |
mbed_official | 3:7a284390b0ce | 301 | /* (ya - yc) - (xb - xd) */ |
mbed_official | 3:7a284390b0ce | 302 | Yb12C_out = (Yaminusc - Xbminusd); |
mbed_official | 3:7a284390b0ce | 303 | /* xa + xc -(xb + xd) */ |
mbed_official | 3:7a284390b0ce | 304 | Xc12C_out = (Xaplusc - Xbplusd); |
mbed_official | 3:7a284390b0ce | 305 | /* (ya + yc) - (yb + yd) */ |
mbed_official | 3:7a284390b0ce | 306 | Yc12C_out = (Yaplusc - Ybplusd); |
mbed_official | 3:7a284390b0ce | 307 | /* (xa - xc) - (yb - yd) */ |
mbed_official | 3:7a284390b0ce | 308 | Xd12C_out = (Xaminusc - Ybminusd); |
mbed_official | 3:7a284390b0ce | 309 | /* (ya - yc) + (xb - xd) */ |
mbed_official | 3:7a284390b0ce | 310 | Yd12C_out = (Xbminusd + Yaminusc); |
emilmont | 1:fdd22bb7aa52 | 311 | |
mbed_official | 3:7a284390b0ce | 312 | pSrc[(2u * i0)] = Xaplusc + Xbplusd; |
mbed_official | 3:7a284390b0ce | 313 | pSrc[(2u * i0) + 1u] = Yaplusc + Ybplusd; |
emilmont | 1:fdd22bb7aa52 | 314 | |
mbed_official | 3:7a284390b0ce | 315 | Xb12_out = Xb12C_out * co1; |
mbed_official | 3:7a284390b0ce | 316 | Yb12_out = Yb12C_out * co1; |
mbed_official | 3:7a284390b0ce | 317 | Xc12_out = Xc12C_out * co2; |
mbed_official | 3:7a284390b0ce | 318 | Yc12_out = Yc12C_out * co2; |
mbed_official | 3:7a284390b0ce | 319 | Xd12_out = Xd12C_out * co3; |
mbed_official | 3:7a284390b0ce | 320 | Yd12_out = Yd12C_out * co3; |
mbed_official | 3:7a284390b0ce | 321 | |
mbed_official | 3:7a284390b0ce | 322 | /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ |
mbed_official | 3:7a284390b0ce | 323 | //Xb12_out -= Yb12C_out * si1; |
mbed_official | 3:7a284390b0ce | 324 | p0 = Yb12C_out * si1; |
mbed_official | 3:7a284390b0ce | 325 | /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ |
mbed_official | 3:7a284390b0ce | 326 | //Yb12_out += Xb12C_out * si1; |
mbed_official | 3:7a284390b0ce | 327 | p1 = Xb12C_out * si1; |
mbed_official | 3:7a284390b0ce | 328 | /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ |
mbed_official | 3:7a284390b0ce | 329 | //Xc12_out -= Yc12C_out * si2; |
mbed_official | 3:7a284390b0ce | 330 | p2 = Yc12C_out * si2; |
mbed_official | 3:7a284390b0ce | 331 | /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ |
mbed_official | 3:7a284390b0ce | 332 | //Yc12_out += Xc12C_out * si2; |
mbed_official | 3:7a284390b0ce | 333 | p3 = Xc12C_out * si2; |
mbed_official | 3:7a284390b0ce | 334 | /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ |
mbed_official | 3:7a284390b0ce | 335 | //Xd12_out -= Yd12C_out * si3; |
mbed_official | 3:7a284390b0ce | 336 | p4 = Yd12C_out * si3; |
mbed_official | 3:7a284390b0ce | 337 | /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ |
mbed_official | 3:7a284390b0ce | 338 | //Yd12_out += Xd12C_out * si3; |
mbed_official | 3:7a284390b0ce | 339 | p5 = Xd12C_out * si3; |
mbed_official | 3:7a284390b0ce | 340 | |
mbed_official | 3:7a284390b0ce | 341 | Xb12_out += p0; |
mbed_official | 3:7a284390b0ce | 342 | Yb12_out -= p1; |
mbed_official | 3:7a284390b0ce | 343 | Xc12_out += p2; |
mbed_official | 3:7a284390b0ce | 344 | Yc12_out -= p3; |
mbed_official | 3:7a284390b0ce | 345 | Xd12_out += p4; |
mbed_official | 3:7a284390b0ce | 346 | Yd12_out -= p5; |
emilmont | 1:fdd22bb7aa52 | 347 | |
mbed_official | 3:7a284390b0ce | 348 | /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */ |
mbed_official | 3:7a284390b0ce | 349 | pSrc[2u * i1] = Xc12_out; |
emilmont | 1:fdd22bb7aa52 | 350 | |
mbed_official | 3:7a284390b0ce | 351 | /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */ |
mbed_official | 3:7a284390b0ce | 352 | pSrc[(2u * i1) + 1u] = Yc12_out; |
mbed_official | 3:7a284390b0ce | 353 | |
mbed_official | 3:7a284390b0ce | 354 | /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */ |
mbed_official | 3:7a284390b0ce | 355 | pSrc[2u * i2] = Xb12_out; |
emilmont | 1:fdd22bb7aa52 | 356 | |
mbed_official | 3:7a284390b0ce | 357 | /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */ |
mbed_official | 3:7a284390b0ce | 358 | pSrc[(2u * i2) + 1u] = Yb12_out; |
emilmont | 1:fdd22bb7aa52 | 359 | |
mbed_official | 3:7a284390b0ce | 360 | /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */ |
mbed_official | 3:7a284390b0ce | 361 | pSrc[2u * i3] = Xd12_out; |
emilmont | 1:fdd22bb7aa52 | 362 | |
mbed_official | 3:7a284390b0ce | 363 | /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */ |
mbed_official | 3:7a284390b0ce | 364 | pSrc[(2u * i3) + 1u] = Yd12_out; |
emilmont | 1:fdd22bb7aa52 | 365 | |
mbed_official | 3:7a284390b0ce | 366 | i0 += n1; |
mbed_official | 3:7a284390b0ce | 367 | } while(i0 < fftLen); |
mbed_official | 3:7a284390b0ce | 368 | j++; |
mbed_official | 3:7a284390b0ce | 369 | } while(j <= (n2 - 1u)); |
mbed_official | 3:7a284390b0ce | 370 | twidCoefModifier <<= 2u; |
mbed_official | 3:7a284390b0ce | 371 | } |
emilmont | 1:fdd22bb7aa52 | 372 | |
mbed_official | 3:7a284390b0ce | 373 | j = fftLen >> 2; |
mbed_official | 3:7a284390b0ce | 374 | ptr1 = &pSrc[0]; |
emilmont | 1:fdd22bb7aa52 | 375 | |
mbed_official | 3:7a284390b0ce | 376 | /* Calculations of last stage */ |
mbed_official | 3:7a284390b0ce | 377 | do |
mbed_official | 3:7a284390b0ce | 378 | { |
mbed_official | 3:7a284390b0ce | 379 | xaIn = ptr1[0]; |
mbed_official | 3:7a284390b0ce | 380 | yaIn = ptr1[1]; |
mbed_official | 3:7a284390b0ce | 381 | xbIn = ptr1[2]; |
mbed_official | 3:7a284390b0ce | 382 | ybIn = ptr1[3]; |
mbed_official | 3:7a284390b0ce | 383 | xcIn = ptr1[4]; |
mbed_official | 3:7a284390b0ce | 384 | ycIn = ptr1[5]; |
mbed_official | 3:7a284390b0ce | 385 | xdIn = ptr1[6]; |
mbed_official | 3:7a284390b0ce | 386 | ydIn = ptr1[7]; |
emilmont | 1:fdd22bb7aa52 | 387 | |
mbed_official | 3:7a284390b0ce | 388 | /* xa + xc */ |
mbed_official | 3:7a284390b0ce | 389 | Xaplusc = xaIn + xcIn; |
mbed_official | 3:7a284390b0ce | 390 | |
mbed_official | 3:7a284390b0ce | 391 | /* xa - xc */ |
mbed_official | 3:7a284390b0ce | 392 | Xaminusc = xaIn - xcIn; |
emilmont | 1:fdd22bb7aa52 | 393 | |
mbed_official | 3:7a284390b0ce | 394 | /* ya + yc */ |
mbed_official | 3:7a284390b0ce | 395 | Yaplusc = yaIn + ycIn; |
mbed_official | 3:7a284390b0ce | 396 | |
mbed_official | 3:7a284390b0ce | 397 | /* ya - yc */ |
mbed_official | 3:7a284390b0ce | 398 | Yaminusc = yaIn - ycIn; |
mbed_official | 3:7a284390b0ce | 399 | |
mbed_official | 3:7a284390b0ce | 400 | /* xb + xd */ |
mbed_official | 3:7a284390b0ce | 401 | Xbplusd = xbIn + xdIn; |
emilmont | 1:fdd22bb7aa52 | 402 | |
mbed_official | 3:7a284390b0ce | 403 | /* yb + yd */ |
mbed_official | 3:7a284390b0ce | 404 | Ybplusd = ybIn + ydIn; |
emilmont | 1:fdd22bb7aa52 | 405 | |
mbed_official | 3:7a284390b0ce | 406 | /* (xb-xd) */ |
mbed_official | 3:7a284390b0ce | 407 | Xbminusd = xbIn - xdIn; |
mbed_official | 3:7a284390b0ce | 408 | |
mbed_official | 3:7a284390b0ce | 409 | /* (yb-yd) */ |
mbed_official | 3:7a284390b0ce | 410 | Ybminusd = ybIn - ydIn; |
emilmont | 1:fdd22bb7aa52 | 411 | |
mbed_official | 3:7a284390b0ce | 412 | /* xa' = xa + xb + xc + xd */ |
mbed_official | 3:7a284390b0ce | 413 | a0 = (Xaplusc + Xbplusd); |
mbed_official | 3:7a284390b0ce | 414 | /* ya' = ya + yb + yc + yd */ |
mbed_official | 3:7a284390b0ce | 415 | a1 = (Yaplusc + Ybplusd); |
mbed_official | 3:7a284390b0ce | 416 | /* xc' = (xa-xb+xc-xd) */ |
mbed_official | 3:7a284390b0ce | 417 | a2 = (Xaplusc - Xbplusd); |
mbed_official | 3:7a284390b0ce | 418 | /* yc' = (ya-yb+yc-yd) */ |
mbed_official | 3:7a284390b0ce | 419 | a3 = (Yaplusc - Ybplusd); |
mbed_official | 3:7a284390b0ce | 420 | /* xb' = (xa+yb-xc-yd) */ |
mbed_official | 3:7a284390b0ce | 421 | a4 = (Xaminusc + Ybminusd); |
mbed_official | 3:7a284390b0ce | 422 | /* yb' = (ya-xb-yc+xd) */ |
mbed_official | 3:7a284390b0ce | 423 | a5 = (Yaminusc - Xbminusd); |
mbed_official | 3:7a284390b0ce | 424 | /* xd' = (xa-yb-xc+yd)) */ |
mbed_official | 3:7a284390b0ce | 425 | a6 = (Xaminusc - Ybminusd); |
mbed_official | 3:7a284390b0ce | 426 | /* yd' = (ya+xb-yc-xd) */ |
mbed_official | 3:7a284390b0ce | 427 | a7 = (Xbminusd + Yaminusc); |
mbed_official | 3:7a284390b0ce | 428 | |
mbed_official | 3:7a284390b0ce | 429 | ptr1[0] = a0; |
mbed_official | 3:7a284390b0ce | 430 | ptr1[1] = a1; |
mbed_official | 3:7a284390b0ce | 431 | ptr1[2] = a2; |
mbed_official | 3:7a284390b0ce | 432 | ptr1[3] = a3; |
mbed_official | 3:7a284390b0ce | 433 | ptr1[4] = a4; |
mbed_official | 3:7a284390b0ce | 434 | ptr1[5] = a5; |
mbed_official | 3:7a284390b0ce | 435 | ptr1[6] = a6; |
mbed_official | 3:7a284390b0ce | 436 | ptr1[7] = a7; |
emilmont | 1:fdd22bb7aa52 | 437 | |
mbed_official | 3:7a284390b0ce | 438 | /* increment pointer by 8 */ |
mbed_official | 3:7a284390b0ce | 439 | ptr1 += 8u; |
mbed_official | 3:7a284390b0ce | 440 | } while(--j); |
emilmont | 1:fdd22bb7aa52 | 441 | |
emilmont | 1:fdd22bb7aa52 | 442 | #else |
emilmont | 1:fdd22bb7aa52 | 443 | |
mbed_official | 3:7a284390b0ce | 444 | float32_t t1, t2, r1, r2, s1, s2; |
emilmont | 1:fdd22bb7aa52 | 445 | |
mbed_official | 3:7a284390b0ce | 446 | /* Run the below code for Cortex-M0 */ |
emilmont | 1:fdd22bb7aa52 | 447 | |
mbed_official | 3:7a284390b0ce | 448 | /* Initializations for the fft calculation */ |
mbed_official | 3:7a284390b0ce | 449 | n2 = fftLen; |
mbed_official | 3:7a284390b0ce | 450 | n1 = n2; |
mbed_official | 3:7a284390b0ce | 451 | for (k = fftLen; k > 1u; k >>= 2u) |
mbed_official | 3:7a284390b0ce | 452 | { |
mbed_official | 3:7a284390b0ce | 453 | /* Initializations for the fft calculation */ |
mbed_official | 3:7a284390b0ce | 454 | n1 = n2; |
mbed_official | 3:7a284390b0ce | 455 | n2 >>= 2u; |
mbed_official | 3:7a284390b0ce | 456 | ia1 = 0u; |
emilmont | 1:fdd22bb7aa52 | 457 | |
mbed_official | 3:7a284390b0ce | 458 | /* FFT Calculation */ |
mbed_official | 3:7a284390b0ce | 459 | j = 0; |
mbed_official | 3:7a284390b0ce | 460 | do |
emilmont | 1:fdd22bb7aa52 | 461 | { |
mbed_official | 3:7a284390b0ce | 462 | /* index calculation for the coefficients */ |
mbed_official | 3:7a284390b0ce | 463 | ia2 = ia1 + ia1; |
mbed_official | 3:7a284390b0ce | 464 | ia3 = ia2 + ia1; |
mbed_official | 3:7a284390b0ce | 465 | co1 = pCoef[ia1 * 2u]; |
mbed_official | 3:7a284390b0ce | 466 | si1 = pCoef[(ia1 * 2u) + 1u]; |
mbed_official | 3:7a284390b0ce | 467 | co2 = pCoef[ia2 * 2u]; |
mbed_official | 3:7a284390b0ce | 468 | si2 = pCoef[(ia2 * 2u) + 1u]; |
mbed_official | 3:7a284390b0ce | 469 | co3 = pCoef[ia3 * 2u]; |
mbed_official | 3:7a284390b0ce | 470 | si3 = pCoef[(ia3 * 2u) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 471 | |
mbed_official | 3:7a284390b0ce | 472 | /* Twiddle coefficients index modifier */ |
mbed_official | 3:7a284390b0ce | 473 | ia1 = ia1 + twidCoefModifier; |
emilmont | 1:fdd22bb7aa52 | 474 | |
mbed_official | 3:7a284390b0ce | 475 | i0 = j; |
mbed_official | 3:7a284390b0ce | 476 | do |
mbed_official | 3:7a284390b0ce | 477 | { |
mbed_official | 3:7a284390b0ce | 478 | /* index calculation for the input as, */ |
mbed_official | 3:7a284390b0ce | 479 | /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ |
mbed_official | 3:7a284390b0ce | 480 | i1 = i0 + n2; |
mbed_official | 3:7a284390b0ce | 481 | i2 = i1 + n2; |
mbed_official | 3:7a284390b0ce | 482 | i3 = i2 + n2; |
emilmont | 1:fdd22bb7aa52 | 483 | |
mbed_official | 3:7a284390b0ce | 484 | /* xa + xc */ |
mbed_official | 3:7a284390b0ce | 485 | r1 = pSrc[(2u * i0)] + pSrc[(2u * i2)]; |
emilmont | 1:fdd22bb7aa52 | 486 | |
mbed_official | 3:7a284390b0ce | 487 | /* xa - xc */ |
mbed_official | 3:7a284390b0ce | 488 | r2 = pSrc[(2u * i0)] - pSrc[(2u * i2)]; |
mbed_official | 3:7a284390b0ce | 489 | |
mbed_official | 3:7a284390b0ce | 490 | /* ya + yc */ |
mbed_official | 3:7a284390b0ce | 491 | s1 = pSrc[(2u * i0) + 1u] + pSrc[(2u * i2) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 492 | |
mbed_official | 3:7a284390b0ce | 493 | /* ya - yc */ |
mbed_official | 3:7a284390b0ce | 494 | s2 = pSrc[(2u * i0) + 1u] - pSrc[(2u * i2) + 1u]; |
mbed_official | 3:7a284390b0ce | 495 | |
mbed_official | 3:7a284390b0ce | 496 | /* xb + xd */ |
mbed_official | 3:7a284390b0ce | 497 | t1 = pSrc[2u * i1] + pSrc[2u * i3]; |
emilmont | 1:fdd22bb7aa52 | 498 | |
mbed_official | 3:7a284390b0ce | 499 | /* xa' = xa + xb + xc + xd */ |
mbed_official | 3:7a284390b0ce | 500 | pSrc[2u * i0] = r1 + t1; |
emilmont | 1:fdd22bb7aa52 | 501 | |
mbed_official | 3:7a284390b0ce | 502 | /* xa + xc -(xb + xd) */ |
mbed_official | 3:7a284390b0ce | 503 | r1 = r1 - t1; |
emilmont | 1:fdd22bb7aa52 | 504 | |
mbed_official | 3:7a284390b0ce | 505 | /* yb + yd */ |
mbed_official | 3:7a284390b0ce | 506 | t2 = pSrc[(2u * i1) + 1u] + pSrc[(2u * i3) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 507 | |
mbed_official | 3:7a284390b0ce | 508 | /* ya' = ya + yb + yc + yd */ |
mbed_official | 3:7a284390b0ce | 509 | pSrc[(2u * i0) + 1u] = s1 + t2; |
mbed_official | 3:7a284390b0ce | 510 | |
mbed_official | 3:7a284390b0ce | 511 | /* (ya + yc) - (yb + yd) */ |
mbed_official | 3:7a284390b0ce | 512 | s1 = s1 - t2; |
emilmont | 1:fdd22bb7aa52 | 513 | |
mbed_official | 3:7a284390b0ce | 514 | /* (yb - yd) */ |
mbed_official | 3:7a284390b0ce | 515 | t1 = pSrc[(2u * i1) + 1u] - pSrc[(2u * i3) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 516 | |
mbed_official | 3:7a284390b0ce | 517 | /* (xb - xd) */ |
mbed_official | 3:7a284390b0ce | 518 | t2 = pSrc[2u * i1] - pSrc[2u * i3]; |
emilmont | 1:fdd22bb7aa52 | 519 | |
mbed_official | 3:7a284390b0ce | 520 | /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */ |
mbed_official | 3:7a284390b0ce | 521 | pSrc[2u * i1] = (r1 * co2) + (s1 * si2); |
emilmont | 1:fdd22bb7aa52 | 522 | |
mbed_official | 3:7a284390b0ce | 523 | /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */ |
mbed_official | 3:7a284390b0ce | 524 | pSrc[(2u * i1) + 1u] = (s1 * co2) - (r1 * si2); |
emilmont | 1:fdd22bb7aa52 | 525 | |
mbed_official | 3:7a284390b0ce | 526 | /* (xa - xc) + (yb - yd) */ |
mbed_official | 3:7a284390b0ce | 527 | r1 = r2 + t1; |
emilmont | 1:fdd22bb7aa52 | 528 | |
mbed_official | 3:7a284390b0ce | 529 | /* (xa - xc) - (yb - yd) */ |
mbed_official | 3:7a284390b0ce | 530 | r2 = r2 - t1; |
emilmont | 1:fdd22bb7aa52 | 531 | |
mbed_official | 3:7a284390b0ce | 532 | /* (ya - yc) - (xb - xd) */ |
mbed_official | 3:7a284390b0ce | 533 | s1 = s2 - t2; |
emilmont | 1:fdd22bb7aa52 | 534 | |
mbed_official | 3:7a284390b0ce | 535 | /* (ya - yc) + (xb - xd) */ |
mbed_official | 3:7a284390b0ce | 536 | s2 = s2 + t2; |
emilmont | 1:fdd22bb7aa52 | 537 | |
mbed_official | 3:7a284390b0ce | 538 | /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */ |
mbed_official | 3:7a284390b0ce | 539 | pSrc[2u * i2] = (r1 * co1) + (s1 * si1); |
emilmont | 1:fdd22bb7aa52 | 540 | |
mbed_official | 3:7a284390b0ce | 541 | /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */ |
mbed_official | 3:7a284390b0ce | 542 | pSrc[(2u * i2) + 1u] = (s1 * co1) - (r1 * si1); |
emilmont | 1:fdd22bb7aa52 | 543 | |
mbed_official | 3:7a284390b0ce | 544 | /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */ |
mbed_official | 3:7a284390b0ce | 545 | pSrc[2u * i3] = (r2 * co3) + (s2 * si3); |
emilmont | 1:fdd22bb7aa52 | 546 | |
mbed_official | 3:7a284390b0ce | 547 | /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */ |
mbed_official | 3:7a284390b0ce | 548 | pSrc[(2u * i3) + 1u] = (s2 * co3) - (r2 * si3); |
mbed_official | 3:7a284390b0ce | 549 | |
mbed_official | 3:7a284390b0ce | 550 | i0 += n1; |
mbed_official | 3:7a284390b0ce | 551 | } while( i0 < fftLen); |
mbed_official | 3:7a284390b0ce | 552 | j++; |
mbed_official | 3:7a284390b0ce | 553 | } while(j <= (n2 - 1u)); |
mbed_official | 3:7a284390b0ce | 554 | twidCoefModifier <<= 2u; |
mbed_official | 3:7a284390b0ce | 555 | } |
emilmont | 1:fdd22bb7aa52 | 556 | |
mbed_official | 3:7a284390b0ce | 557 | #endif /* #ifndef ARM_MATH_CM0_FAMILY_FAMILY */ |
emilmont | 1:fdd22bb7aa52 | 558 | |
emilmont | 1:fdd22bb7aa52 | 559 | } |
emilmont | 1:fdd22bb7aa52 | 560 | |
emilmont | 1:fdd22bb7aa52 | 561 | /* |
mbed_official | 3:7a284390b0ce | 562 | * @brief Core function for the floating-point CIFFT butterfly process. |
mbed_official | 3:7a284390b0ce | 563 | * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. |
mbed_official | 3:7a284390b0ce | 564 | * @param[in] fftLen length of the FFT. |
mbed_official | 3:7a284390b0ce | 565 | * @param[in] *pCoef points to twiddle coefficient buffer. |
mbed_official | 3:7a284390b0ce | 566 | * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. |
mbed_official | 3:7a284390b0ce | 567 | * @param[in] onebyfftLen value of 1/fftLen. |
mbed_official | 3:7a284390b0ce | 568 | * @return none. |
mbed_official | 3:7a284390b0ce | 569 | */ |
emilmont | 1:fdd22bb7aa52 | 570 | |
emilmont | 1:fdd22bb7aa52 | 571 | void arm_radix4_butterfly_inverse_f32( |
mbed_official | 3:7a284390b0ce | 572 | float32_t * pSrc, |
mbed_official | 3:7a284390b0ce | 573 | uint16_t fftLen, |
mbed_official | 3:7a284390b0ce | 574 | float32_t * pCoef, |
mbed_official | 3:7a284390b0ce | 575 | uint16_t twidCoefModifier, |
mbed_official | 3:7a284390b0ce | 576 | float32_t onebyfftLen) |
emilmont | 1:fdd22bb7aa52 | 577 | { |
mbed_official | 3:7a284390b0ce | 578 | float32_t co1, co2, co3, si1, si2, si3; |
mbed_official | 3:7a284390b0ce | 579 | uint32_t ia1, ia2, ia3; |
mbed_official | 3:7a284390b0ce | 580 | uint32_t i0, i1, i2, i3; |
mbed_official | 3:7a284390b0ce | 581 | uint32_t n1, n2, j, k; |
emilmont | 1:fdd22bb7aa52 | 582 | |
mbed_official | 3:7a284390b0ce | 583 | #ifndef ARM_MATH_CM0_FAMILY_FAMILY |
emilmont | 1:fdd22bb7aa52 | 584 | |
mbed_official | 3:7a284390b0ce | 585 | float32_t xaIn, yaIn, xbIn, ybIn, xcIn, ycIn, xdIn, ydIn; |
mbed_official | 3:7a284390b0ce | 586 | float32_t Xaplusc, Xbplusd, Yaplusc, Ybplusd, Xaminusc, Xbminusd, Yaminusc, |
mbed_official | 3:7a284390b0ce | 587 | Ybminusd; |
mbed_official | 3:7a284390b0ce | 588 | float32_t Xb12C_out, Yb12C_out, Xc12C_out, Yc12C_out, Xd12C_out, Yd12C_out; |
mbed_official | 3:7a284390b0ce | 589 | float32_t Xb12_out, Yb12_out, Xc12_out, Yc12_out, Xd12_out, Yd12_out; |
mbed_official | 3:7a284390b0ce | 590 | float32_t *ptr1; |
mbed_official | 3:7a284390b0ce | 591 | float32_t p0,p1,p2,p3,p4,p5,p6,p7; |
mbed_official | 3:7a284390b0ce | 592 | float32_t a0,a1,a2,a3,a4,a5,a6,a7; |
emilmont | 1:fdd22bb7aa52 | 593 | |
emilmont | 1:fdd22bb7aa52 | 594 | |
mbed_official | 3:7a284390b0ce | 595 | /* Initializations for the first stage */ |
mbed_official | 3:7a284390b0ce | 596 | n2 = fftLen; |
mbed_official | 3:7a284390b0ce | 597 | n1 = n2; |
emilmont | 1:fdd22bb7aa52 | 598 | |
mbed_official | 3:7a284390b0ce | 599 | /* n2 = fftLen/4 */ |
mbed_official | 3:7a284390b0ce | 600 | n2 >>= 2u; |
mbed_official | 3:7a284390b0ce | 601 | i0 = 0u; |
mbed_official | 3:7a284390b0ce | 602 | ia1 = 0u; |
emilmont | 1:fdd22bb7aa52 | 603 | |
mbed_official | 3:7a284390b0ce | 604 | j = n2; |
emilmont | 1:fdd22bb7aa52 | 605 | |
mbed_official | 3:7a284390b0ce | 606 | /* Calculation of first stage */ |
mbed_official | 3:7a284390b0ce | 607 | do |
mbed_official | 3:7a284390b0ce | 608 | { |
mbed_official | 3:7a284390b0ce | 609 | /* index calculation for the input as, */ |
mbed_official | 3:7a284390b0ce | 610 | /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ |
mbed_official | 3:7a284390b0ce | 611 | i1 = i0 + n2; |
mbed_official | 3:7a284390b0ce | 612 | i2 = i1 + n2; |
mbed_official | 3:7a284390b0ce | 613 | i3 = i2 + n2; |
emilmont | 1:fdd22bb7aa52 | 614 | |
mbed_official | 3:7a284390b0ce | 615 | /* Butterfly implementation */ |
mbed_official | 3:7a284390b0ce | 616 | xaIn = pSrc[(2u * i0)]; |
mbed_official | 3:7a284390b0ce | 617 | yaIn = pSrc[(2u * i0) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 618 | |
mbed_official | 3:7a284390b0ce | 619 | xcIn = pSrc[(2u * i2)]; |
mbed_official | 3:7a284390b0ce | 620 | ycIn = pSrc[(2u * i2) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 621 | |
mbed_official | 3:7a284390b0ce | 622 | xbIn = pSrc[(2u * i1)]; |
mbed_official | 3:7a284390b0ce | 623 | ybIn = pSrc[(2u * i1) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 624 | |
mbed_official | 3:7a284390b0ce | 625 | xdIn = pSrc[(2u * i3)]; |
mbed_official | 3:7a284390b0ce | 626 | ydIn = pSrc[(2u * i3) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 627 | |
mbed_official | 3:7a284390b0ce | 628 | /* xa + xc */ |
mbed_official | 3:7a284390b0ce | 629 | Xaplusc = xaIn + xcIn; |
mbed_official | 3:7a284390b0ce | 630 | /* xb + xd */ |
mbed_official | 3:7a284390b0ce | 631 | Xbplusd = xbIn + xdIn; |
mbed_official | 3:7a284390b0ce | 632 | /* ya + yc */ |
mbed_official | 3:7a284390b0ce | 633 | Yaplusc = yaIn + ycIn; |
mbed_official | 3:7a284390b0ce | 634 | /* yb + yd */ |
mbed_official | 3:7a284390b0ce | 635 | Ybplusd = ybIn + ydIn; |
emilmont | 1:fdd22bb7aa52 | 636 | |
emilmont | 1:fdd22bb7aa52 | 637 | /* index calculation for the coefficients */ |
emilmont | 1:fdd22bb7aa52 | 638 | ia2 = ia1 + ia1; |
mbed_official | 3:7a284390b0ce | 639 | co2 = pCoef[ia2 * 2u]; |
mbed_official | 3:7a284390b0ce | 640 | si2 = pCoef[(ia2 * 2u) + 1u]; |
mbed_official | 3:7a284390b0ce | 641 | |
mbed_official | 3:7a284390b0ce | 642 | /* xa - xc */ |
mbed_official | 3:7a284390b0ce | 643 | Xaminusc = xaIn - xcIn; |
mbed_official | 3:7a284390b0ce | 644 | /* xb - xd */ |
mbed_official | 3:7a284390b0ce | 645 | Xbminusd = xbIn - xdIn; |
mbed_official | 3:7a284390b0ce | 646 | /* ya - yc */ |
mbed_official | 3:7a284390b0ce | 647 | Yaminusc = yaIn - ycIn; |
mbed_official | 3:7a284390b0ce | 648 | /* yb - yd */ |
mbed_official | 3:7a284390b0ce | 649 | Ybminusd = ybIn - ydIn; |
mbed_official | 3:7a284390b0ce | 650 | |
mbed_official | 3:7a284390b0ce | 651 | /* xa' = xa + xb + xc + xd */ |
mbed_official | 3:7a284390b0ce | 652 | pSrc[(2u * i0)] = Xaplusc + Xbplusd; |
mbed_official | 3:7a284390b0ce | 653 | |
mbed_official | 3:7a284390b0ce | 654 | /* ya' = ya + yb + yc + yd */ |
mbed_official | 3:7a284390b0ce | 655 | pSrc[(2u * i0) + 1u] = Yaplusc + Ybplusd; |
mbed_official | 3:7a284390b0ce | 656 | |
mbed_official | 3:7a284390b0ce | 657 | /* (xa - xc) - (yb - yd) */ |
mbed_official | 3:7a284390b0ce | 658 | Xb12C_out = (Xaminusc - Ybminusd); |
mbed_official | 3:7a284390b0ce | 659 | /* (ya - yc) + (xb - xd) */ |
mbed_official | 3:7a284390b0ce | 660 | Yb12C_out = (Yaminusc + Xbminusd); |
mbed_official | 3:7a284390b0ce | 661 | /* (xa + xc) - (xb + xd) */ |
mbed_official | 3:7a284390b0ce | 662 | Xc12C_out = (Xaplusc - Xbplusd); |
mbed_official | 3:7a284390b0ce | 663 | /* (ya + yc) - (yb + yd) */ |
mbed_official | 3:7a284390b0ce | 664 | Yc12C_out = (Yaplusc - Ybplusd); |
mbed_official | 3:7a284390b0ce | 665 | /* (xa - xc) + (yb - yd) */ |
mbed_official | 3:7a284390b0ce | 666 | Xd12C_out = (Xaminusc + Ybminusd); |
mbed_official | 3:7a284390b0ce | 667 | /* (ya - yc) - (xb - xd) */ |
mbed_official | 3:7a284390b0ce | 668 | Yd12C_out = (Yaminusc - Xbminusd); |
mbed_official | 3:7a284390b0ce | 669 | |
emilmont | 1:fdd22bb7aa52 | 670 | co1 = pCoef[ia1 * 2u]; |
emilmont | 1:fdd22bb7aa52 | 671 | si1 = pCoef[(ia1 * 2u) + 1u]; |
mbed_official | 3:7a284390b0ce | 672 | |
mbed_official | 3:7a284390b0ce | 673 | /* index calculation for the coefficients */ |
mbed_official | 3:7a284390b0ce | 674 | ia3 = ia2 + ia1; |
emilmont | 1:fdd22bb7aa52 | 675 | co3 = pCoef[ia3 * 2u]; |
emilmont | 1:fdd22bb7aa52 | 676 | si3 = pCoef[(ia3 * 2u) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 677 | |
mbed_official | 3:7a284390b0ce | 678 | Xb12_out = Xb12C_out * co1; |
mbed_official | 3:7a284390b0ce | 679 | Yb12_out = Yb12C_out * co1; |
mbed_official | 3:7a284390b0ce | 680 | Xc12_out = Xc12C_out * co2; |
mbed_official | 3:7a284390b0ce | 681 | Yc12_out = Yc12C_out * co2; |
mbed_official | 3:7a284390b0ce | 682 | Xd12_out = Xd12C_out * co3; |
mbed_official | 3:7a284390b0ce | 683 | Yd12_out = Yd12C_out * co3; |
mbed_official | 3:7a284390b0ce | 684 | |
mbed_official | 3:7a284390b0ce | 685 | /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ |
mbed_official | 3:7a284390b0ce | 686 | //Xb12_out -= Yb12C_out * si1; |
mbed_official | 3:7a284390b0ce | 687 | p0 = Yb12C_out * si1; |
mbed_official | 3:7a284390b0ce | 688 | /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ |
mbed_official | 3:7a284390b0ce | 689 | //Yb12_out += Xb12C_out * si1; |
mbed_official | 3:7a284390b0ce | 690 | p1 = Xb12C_out * si1; |
mbed_official | 3:7a284390b0ce | 691 | /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ |
mbed_official | 3:7a284390b0ce | 692 | //Xc12_out -= Yc12C_out * si2; |
mbed_official | 3:7a284390b0ce | 693 | p2 = Yc12C_out * si2; |
mbed_official | 3:7a284390b0ce | 694 | /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ |
mbed_official | 3:7a284390b0ce | 695 | //Yc12_out += Xc12C_out * si2; |
mbed_official | 3:7a284390b0ce | 696 | p3 = Xc12C_out * si2; |
mbed_official | 3:7a284390b0ce | 697 | /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ |
mbed_official | 3:7a284390b0ce | 698 | //Xd12_out -= Yd12C_out * si3; |
mbed_official | 3:7a284390b0ce | 699 | p4 = Yd12C_out * si3; |
mbed_official | 3:7a284390b0ce | 700 | /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ |
mbed_official | 3:7a284390b0ce | 701 | //Yd12_out += Xd12C_out * si3; |
mbed_official | 3:7a284390b0ce | 702 | p5 = Xd12C_out * si3; |
mbed_official | 3:7a284390b0ce | 703 | |
mbed_official | 3:7a284390b0ce | 704 | Xb12_out -= p0; |
mbed_official | 3:7a284390b0ce | 705 | Yb12_out += p1; |
mbed_official | 3:7a284390b0ce | 706 | Xc12_out -= p2; |
mbed_official | 3:7a284390b0ce | 707 | Yc12_out += p3; |
mbed_official | 3:7a284390b0ce | 708 | Xd12_out -= p4; |
mbed_official | 3:7a284390b0ce | 709 | Yd12_out += p5; |
mbed_official | 3:7a284390b0ce | 710 | |
mbed_official | 3:7a284390b0ce | 711 | /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ |
mbed_official | 3:7a284390b0ce | 712 | pSrc[2u * i1] = Xc12_out; |
mbed_official | 3:7a284390b0ce | 713 | |
mbed_official | 3:7a284390b0ce | 714 | /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ |
mbed_official | 3:7a284390b0ce | 715 | pSrc[(2u * i1) + 1u] = Yc12_out; |
mbed_official | 3:7a284390b0ce | 716 | |
mbed_official | 3:7a284390b0ce | 717 | /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ |
mbed_official | 3:7a284390b0ce | 718 | pSrc[2u * i2] = Xb12_out; |
mbed_official | 3:7a284390b0ce | 719 | |
mbed_official | 3:7a284390b0ce | 720 | /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ |
mbed_official | 3:7a284390b0ce | 721 | pSrc[(2u * i2) + 1u] = Yb12_out; |
mbed_official | 3:7a284390b0ce | 722 | |
mbed_official | 3:7a284390b0ce | 723 | /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ |
mbed_official | 3:7a284390b0ce | 724 | pSrc[2u * i3] = Xd12_out; |
mbed_official | 3:7a284390b0ce | 725 | |
mbed_official | 3:7a284390b0ce | 726 | /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ |
mbed_official | 3:7a284390b0ce | 727 | pSrc[(2u * i3) + 1u] = Yd12_out; |
mbed_official | 3:7a284390b0ce | 728 | |
emilmont | 1:fdd22bb7aa52 | 729 | /* Twiddle coefficients index modifier */ |
emilmont | 1:fdd22bb7aa52 | 730 | ia1 = ia1 + twidCoefModifier; |
emilmont | 1:fdd22bb7aa52 | 731 | |
mbed_official | 3:7a284390b0ce | 732 | /* Updating input index */ |
mbed_official | 3:7a284390b0ce | 733 | i0 = i0 + 1u; |
mbed_official | 3:7a284390b0ce | 734 | |
mbed_official | 3:7a284390b0ce | 735 | } while(--j); |
mbed_official | 3:7a284390b0ce | 736 | |
mbed_official | 3:7a284390b0ce | 737 | twidCoefModifier <<= 2u; |
emilmont | 1:fdd22bb7aa52 | 738 | |
mbed_official | 3:7a284390b0ce | 739 | /* Calculation of second stage to excluding last stage */ |
mbed_official | 3:7a284390b0ce | 740 | for (k = fftLen >> 2u; k > 4u; k >>= 2u) |
mbed_official | 3:7a284390b0ce | 741 | { |
mbed_official | 3:7a284390b0ce | 742 | /* Initializations for the first stage */ |
mbed_official | 3:7a284390b0ce | 743 | n1 = n2; |
mbed_official | 3:7a284390b0ce | 744 | n2 >>= 2u; |
mbed_official | 3:7a284390b0ce | 745 | ia1 = 0u; |
emilmont | 1:fdd22bb7aa52 | 746 | |
mbed_official | 3:7a284390b0ce | 747 | /* Calculation of first stage */ |
mbed_official | 3:7a284390b0ce | 748 | j = 0; |
mbed_official | 3:7a284390b0ce | 749 | do |
mbed_official | 3:7a284390b0ce | 750 | { |
mbed_official | 3:7a284390b0ce | 751 | /* index calculation for the coefficients */ |
mbed_official | 3:7a284390b0ce | 752 | ia2 = ia1 + ia1; |
mbed_official | 3:7a284390b0ce | 753 | ia3 = ia2 + ia1; |
mbed_official | 3:7a284390b0ce | 754 | co1 = pCoef[ia1 * 2u]; |
mbed_official | 3:7a284390b0ce | 755 | si1 = pCoef[(ia1 * 2u) + 1u]; |
mbed_official | 3:7a284390b0ce | 756 | co2 = pCoef[ia2 * 2u]; |
mbed_official | 3:7a284390b0ce | 757 | si2 = pCoef[(ia2 * 2u) + 1u]; |
mbed_official | 3:7a284390b0ce | 758 | co3 = pCoef[ia3 * 2u]; |
mbed_official | 3:7a284390b0ce | 759 | si3 = pCoef[(ia3 * 2u) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 760 | |
mbed_official | 3:7a284390b0ce | 761 | /* Twiddle coefficients index modifier */ |
mbed_official | 3:7a284390b0ce | 762 | ia1 = ia1 + twidCoefModifier; |
emilmont | 1:fdd22bb7aa52 | 763 | |
mbed_official | 3:7a284390b0ce | 764 | i0 = j; |
mbed_official | 3:7a284390b0ce | 765 | do |
mbed_official | 3:7a284390b0ce | 766 | { |
mbed_official | 3:7a284390b0ce | 767 | /* index calculation for the input as, */ |
mbed_official | 3:7a284390b0ce | 768 | /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ |
mbed_official | 3:7a284390b0ce | 769 | i1 = i0 + n2; |
mbed_official | 3:7a284390b0ce | 770 | i2 = i1 + n2; |
mbed_official | 3:7a284390b0ce | 771 | i3 = i2 + n2; |
mbed_official | 3:7a284390b0ce | 772 | |
mbed_official | 3:7a284390b0ce | 773 | xaIn = pSrc[(2u * i0)]; |
mbed_official | 3:7a284390b0ce | 774 | yaIn = pSrc[(2u * i0) + 1u]; |
mbed_official | 3:7a284390b0ce | 775 | |
mbed_official | 3:7a284390b0ce | 776 | xbIn = pSrc[(2u * i1)]; |
mbed_official | 3:7a284390b0ce | 777 | ybIn = pSrc[(2u * i1) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 778 | |
mbed_official | 3:7a284390b0ce | 779 | xcIn = pSrc[(2u * i2)]; |
mbed_official | 3:7a284390b0ce | 780 | ycIn = pSrc[(2u * i2) + 1u]; |
mbed_official | 3:7a284390b0ce | 781 | |
mbed_official | 3:7a284390b0ce | 782 | xdIn = pSrc[(2u * i3)]; |
mbed_official | 3:7a284390b0ce | 783 | ydIn = pSrc[(2u * i3) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 784 | |
mbed_official | 3:7a284390b0ce | 785 | /* xa - xc */ |
mbed_official | 3:7a284390b0ce | 786 | Xaminusc = xaIn - xcIn; |
mbed_official | 3:7a284390b0ce | 787 | /* (xb - xd) */ |
mbed_official | 3:7a284390b0ce | 788 | Xbminusd = xbIn - xdIn; |
mbed_official | 3:7a284390b0ce | 789 | /* ya - yc */ |
mbed_official | 3:7a284390b0ce | 790 | Yaminusc = yaIn - ycIn; |
mbed_official | 3:7a284390b0ce | 791 | /* (yb - yd) */ |
mbed_official | 3:7a284390b0ce | 792 | Ybminusd = ybIn - ydIn; |
emilmont | 1:fdd22bb7aa52 | 793 | |
mbed_official | 3:7a284390b0ce | 794 | /* xa + xc */ |
mbed_official | 3:7a284390b0ce | 795 | Xaplusc = xaIn + xcIn; |
mbed_official | 3:7a284390b0ce | 796 | /* xb + xd */ |
mbed_official | 3:7a284390b0ce | 797 | Xbplusd = xbIn + xdIn; |
mbed_official | 3:7a284390b0ce | 798 | /* ya + yc */ |
mbed_official | 3:7a284390b0ce | 799 | Yaplusc = yaIn + ycIn; |
mbed_official | 3:7a284390b0ce | 800 | /* yb + yd */ |
mbed_official | 3:7a284390b0ce | 801 | Ybplusd = ybIn + ydIn; |
emilmont | 1:fdd22bb7aa52 | 802 | |
mbed_official | 3:7a284390b0ce | 803 | /* (xa - xc) - (yb - yd) */ |
mbed_official | 3:7a284390b0ce | 804 | Xb12C_out = (Xaminusc - Ybminusd); |
mbed_official | 3:7a284390b0ce | 805 | /* (ya - yc) + (xb - xd) */ |
mbed_official | 3:7a284390b0ce | 806 | Yb12C_out = (Yaminusc + Xbminusd); |
mbed_official | 3:7a284390b0ce | 807 | /* xa + xc -(xb + xd) */ |
mbed_official | 3:7a284390b0ce | 808 | Xc12C_out = (Xaplusc - Xbplusd); |
mbed_official | 3:7a284390b0ce | 809 | /* (ya + yc) - (yb + yd) */ |
mbed_official | 3:7a284390b0ce | 810 | Yc12C_out = (Yaplusc - Ybplusd); |
mbed_official | 3:7a284390b0ce | 811 | /* (xa - xc) + (yb - yd) */ |
mbed_official | 3:7a284390b0ce | 812 | Xd12C_out = (Xaminusc + Ybminusd); |
mbed_official | 3:7a284390b0ce | 813 | /* (ya - yc) - (xb - xd) */ |
mbed_official | 3:7a284390b0ce | 814 | Yd12C_out = (Yaminusc - Xbminusd); |
emilmont | 1:fdd22bb7aa52 | 815 | |
mbed_official | 3:7a284390b0ce | 816 | pSrc[(2u * i0)] = Xaplusc + Xbplusd; |
mbed_official | 3:7a284390b0ce | 817 | pSrc[(2u * i0) + 1u] = Yaplusc + Ybplusd; |
emilmont | 1:fdd22bb7aa52 | 818 | |
mbed_official | 3:7a284390b0ce | 819 | Xb12_out = Xb12C_out * co1; |
mbed_official | 3:7a284390b0ce | 820 | Yb12_out = Yb12C_out * co1; |
mbed_official | 3:7a284390b0ce | 821 | Xc12_out = Xc12C_out * co2; |
mbed_official | 3:7a284390b0ce | 822 | Yc12_out = Yc12C_out * co2; |
mbed_official | 3:7a284390b0ce | 823 | Xd12_out = Xd12C_out * co3; |
mbed_official | 3:7a284390b0ce | 824 | Yd12_out = Yd12C_out * co3; |
emilmont | 1:fdd22bb7aa52 | 825 | |
mbed_official | 3:7a284390b0ce | 826 | /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ |
mbed_official | 3:7a284390b0ce | 827 | //Xb12_out -= Yb12C_out * si1; |
mbed_official | 3:7a284390b0ce | 828 | p0 = Yb12C_out * si1; |
mbed_official | 3:7a284390b0ce | 829 | /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ |
mbed_official | 3:7a284390b0ce | 830 | //Yb12_out += Xb12C_out * si1; |
mbed_official | 3:7a284390b0ce | 831 | p1 = Xb12C_out * si1; |
mbed_official | 3:7a284390b0ce | 832 | /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ |
mbed_official | 3:7a284390b0ce | 833 | //Xc12_out -= Yc12C_out * si2; |
mbed_official | 3:7a284390b0ce | 834 | p2 = Yc12C_out * si2; |
mbed_official | 3:7a284390b0ce | 835 | /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ |
mbed_official | 3:7a284390b0ce | 836 | //Yc12_out += Xc12C_out * si2; |
mbed_official | 3:7a284390b0ce | 837 | p3 = Xc12C_out * si2; |
mbed_official | 3:7a284390b0ce | 838 | /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ |
mbed_official | 3:7a284390b0ce | 839 | //Xd12_out -= Yd12C_out * si3; |
mbed_official | 3:7a284390b0ce | 840 | p4 = Yd12C_out * si3; |
mbed_official | 3:7a284390b0ce | 841 | /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ |
mbed_official | 3:7a284390b0ce | 842 | //Yd12_out += Xd12C_out * si3; |
mbed_official | 3:7a284390b0ce | 843 | p5 = Xd12C_out * si3; |
mbed_official | 3:7a284390b0ce | 844 | |
mbed_official | 3:7a284390b0ce | 845 | Xb12_out -= p0; |
mbed_official | 3:7a284390b0ce | 846 | Yb12_out += p1; |
mbed_official | 3:7a284390b0ce | 847 | Xc12_out -= p2; |
mbed_official | 3:7a284390b0ce | 848 | Yc12_out += p3; |
mbed_official | 3:7a284390b0ce | 849 | Xd12_out -= p4; |
mbed_official | 3:7a284390b0ce | 850 | Yd12_out += p5; |
emilmont | 1:fdd22bb7aa52 | 851 | |
mbed_official | 3:7a284390b0ce | 852 | /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ |
mbed_official | 3:7a284390b0ce | 853 | pSrc[2u * i1] = Xc12_out; |
emilmont | 1:fdd22bb7aa52 | 854 | |
mbed_official | 3:7a284390b0ce | 855 | /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ |
mbed_official | 3:7a284390b0ce | 856 | pSrc[(2u * i1) + 1u] = Yc12_out; |
emilmont | 1:fdd22bb7aa52 | 857 | |
mbed_official | 3:7a284390b0ce | 858 | /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ |
mbed_official | 3:7a284390b0ce | 859 | pSrc[2u * i2] = Xb12_out; |
mbed_official | 3:7a284390b0ce | 860 | |
mbed_official | 3:7a284390b0ce | 861 | /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ |
mbed_official | 3:7a284390b0ce | 862 | pSrc[(2u * i2) + 1u] = Yb12_out; |
emilmont | 1:fdd22bb7aa52 | 863 | |
mbed_official | 3:7a284390b0ce | 864 | /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ |
mbed_official | 3:7a284390b0ce | 865 | pSrc[2u * i3] = Xd12_out; |
emilmont | 1:fdd22bb7aa52 | 866 | |
mbed_official | 3:7a284390b0ce | 867 | /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ |
mbed_official | 3:7a284390b0ce | 868 | pSrc[(2u * i3) + 1u] = Yd12_out; |
emilmont | 1:fdd22bb7aa52 | 869 | |
mbed_official | 3:7a284390b0ce | 870 | i0 += n1; |
mbed_official | 3:7a284390b0ce | 871 | } while(i0 < fftLen); |
mbed_official | 3:7a284390b0ce | 872 | j++; |
mbed_official | 3:7a284390b0ce | 873 | } while(j <= (n2 - 1u)); |
mbed_official | 3:7a284390b0ce | 874 | twidCoefModifier <<= 2u; |
mbed_official | 3:7a284390b0ce | 875 | } |
mbed_official | 3:7a284390b0ce | 876 | /* Initializations of last stage */ |
emilmont | 1:fdd22bb7aa52 | 877 | |
mbed_official | 3:7a284390b0ce | 878 | j = fftLen >> 2; |
mbed_official | 3:7a284390b0ce | 879 | ptr1 = &pSrc[0]; |
emilmont | 1:fdd22bb7aa52 | 880 | |
mbed_official | 3:7a284390b0ce | 881 | /* Calculations of last stage */ |
mbed_official | 3:7a284390b0ce | 882 | do |
mbed_official | 3:7a284390b0ce | 883 | { |
mbed_official | 3:7a284390b0ce | 884 | xaIn = ptr1[0]; |
mbed_official | 3:7a284390b0ce | 885 | yaIn = ptr1[1]; |
mbed_official | 3:7a284390b0ce | 886 | xbIn = ptr1[2]; |
mbed_official | 3:7a284390b0ce | 887 | ybIn = ptr1[3]; |
mbed_official | 3:7a284390b0ce | 888 | xcIn = ptr1[4]; |
mbed_official | 3:7a284390b0ce | 889 | ycIn = ptr1[5]; |
mbed_official | 3:7a284390b0ce | 890 | xdIn = ptr1[6]; |
mbed_official | 3:7a284390b0ce | 891 | ydIn = ptr1[7]; |
emilmont | 1:fdd22bb7aa52 | 892 | |
mbed_official | 3:7a284390b0ce | 893 | /* Butterfly implementation */ |
mbed_official | 3:7a284390b0ce | 894 | /* xa + xc */ |
mbed_official | 3:7a284390b0ce | 895 | Xaplusc = xaIn + xcIn; |
emilmont | 1:fdd22bb7aa52 | 896 | |
mbed_official | 3:7a284390b0ce | 897 | /* xa - xc */ |
mbed_official | 3:7a284390b0ce | 898 | Xaminusc = xaIn - xcIn; |
emilmont | 1:fdd22bb7aa52 | 899 | |
mbed_official | 3:7a284390b0ce | 900 | /* ya + yc */ |
mbed_official | 3:7a284390b0ce | 901 | Yaplusc = yaIn + ycIn; |
emilmont | 1:fdd22bb7aa52 | 902 | |
mbed_official | 3:7a284390b0ce | 903 | /* ya - yc */ |
mbed_official | 3:7a284390b0ce | 904 | Yaminusc = yaIn - ycIn; |
emilmont | 1:fdd22bb7aa52 | 905 | |
mbed_official | 3:7a284390b0ce | 906 | /* xb + xd */ |
mbed_official | 3:7a284390b0ce | 907 | Xbplusd = xbIn + xdIn; |
emilmont | 1:fdd22bb7aa52 | 908 | |
mbed_official | 3:7a284390b0ce | 909 | /* yb + yd */ |
mbed_official | 3:7a284390b0ce | 910 | Ybplusd = ybIn + ydIn; |
emilmont | 1:fdd22bb7aa52 | 911 | |
mbed_official | 3:7a284390b0ce | 912 | /* (xb-xd) */ |
mbed_official | 3:7a284390b0ce | 913 | Xbminusd = xbIn - xdIn; |
emilmont | 1:fdd22bb7aa52 | 914 | |
mbed_official | 3:7a284390b0ce | 915 | /* (yb-yd) */ |
mbed_official | 3:7a284390b0ce | 916 | Ybminusd = ybIn - ydIn; |
mbed_official | 3:7a284390b0ce | 917 | |
mbed_official | 3:7a284390b0ce | 918 | /* xa' = (xa+xb+xc+xd) * onebyfftLen */ |
mbed_official | 3:7a284390b0ce | 919 | a0 = (Xaplusc + Xbplusd); |
mbed_official | 3:7a284390b0ce | 920 | /* ya' = (ya+yb+yc+yd) * onebyfftLen */ |
mbed_official | 3:7a284390b0ce | 921 | a1 = (Yaplusc + Ybplusd); |
mbed_official | 3:7a284390b0ce | 922 | /* xc' = (xa-xb+xc-xd) * onebyfftLen */ |
mbed_official | 3:7a284390b0ce | 923 | a2 = (Xaplusc - Xbplusd); |
mbed_official | 3:7a284390b0ce | 924 | /* yc' = (ya-yb+yc-yd) * onebyfftLen */ |
mbed_official | 3:7a284390b0ce | 925 | a3 = (Yaplusc - Ybplusd); |
mbed_official | 3:7a284390b0ce | 926 | /* xb' = (xa-yb-xc+yd) * onebyfftLen */ |
mbed_official | 3:7a284390b0ce | 927 | a4 = (Xaminusc - Ybminusd); |
mbed_official | 3:7a284390b0ce | 928 | /* yb' = (ya+xb-yc-xd) * onebyfftLen */ |
mbed_official | 3:7a284390b0ce | 929 | a5 = (Yaminusc + Xbminusd); |
mbed_official | 3:7a284390b0ce | 930 | /* xd' = (xa-yb-xc+yd) * onebyfftLen */ |
mbed_official | 3:7a284390b0ce | 931 | a6 = (Xaminusc + Ybminusd); |
mbed_official | 3:7a284390b0ce | 932 | /* yd' = (ya-xb-yc+xd) * onebyfftLen */ |
mbed_official | 3:7a284390b0ce | 933 | a7 = (Yaminusc - Xbminusd); |
mbed_official | 3:7a284390b0ce | 934 | |
mbed_official | 3:7a284390b0ce | 935 | p0 = a0 * onebyfftLen; |
mbed_official | 3:7a284390b0ce | 936 | p1 = a1 * onebyfftLen; |
mbed_official | 3:7a284390b0ce | 937 | p2 = a2 * onebyfftLen; |
mbed_official | 3:7a284390b0ce | 938 | p3 = a3 * onebyfftLen; |
mbed_official | 3:7a284390b0ce | 939 | p4 = a4 * onebyfftLen; |
mbed_official | 3:7a284390b0ce | 940 | p5 = a5 * onebyfftLen; |
mbed_official | 3:7a284390b0ce | 941 | p6 = a6 * onebyfftLen; |
mbed_official | 3:7a284390b0ce | 942 | p7 = a7 * onebyfftLen; |
mbed_official | 3:7a284390b0ce | 943 | |
mbed_official | 3:7a284390b0ce | 944 | /* xa' = (xa+xb+xc+xd) * onebyfftLen */ |
mbed_official | 3:7a284390b0ce | 945 | ptr1[0] = p0; |
mbed_official | 3:7a284390b0ce | 946 | /* ya' = (ya+yb+yc+yd) * onebyfftLen */ |
mbed_official | 3:7a284390b0ce | 947 | ptr1[1] = p1; |
mbed_official | 3:7a284390b0ce | 948 | /* xc' = (xa-xb+xc-xd) * onebyfftLen */ |
mbed_official | 3:7a284390b0ce | 949 | ptr1[2] = p2; |
mbed_official | 3:7a284390b0ce | 950 | /* yc' = (ya-yb+yc-yd) * onebyfftLen */ |
mbed_official | 3:7a284390b0ce | 951 | ptr1[3] = p3; |
mbed_official | 3:7a284390b0ce | 952 | /* xb' = (xa-yb-xc+yd) * onebyfftLen */ |
mbed_official | 3:7a284390b0ce | 953 | ptr1[4] = p4; |
mbed_official | 3:7a284390b0ce | 954 | /* yb' = (ya+xb-yc-xd) * onebyfftLen */ |
mbed_official | 3:7a284390b0ce | 955 | ptr1[5] = p5; |
mbed_official | 3:7a284390b0ce | 956 | /* xd' = (xa-yb-xc+yd) * onebyfftLen */ |
mbed_official | 3:7a284390b0ce | 957 | ptr1[6] = p6; |
mbed_official | 3:7a284390b0ce | 958 | /* yd' = (ya-xb-yc+xd) * onebyfftLen */ |
mbed_official | 3:7a284390b0ce | 959 | ptr1[7] = p7; |
emilmont | 1:fdd22bb7aa52 | 960 | |
mbed_official | 3:7a284390b0ce | 961 | /* increment source pointer by 8 for next calculations */ |
mbed_official | 3:7a284390b0ce | 962 | ptr1 = ptr1 + 8u; |
emilmont | 1:fdd22bb7aa52 | 963 | |
mbed_official | 3:7a284390b0ce | 964 | } while(--j); |
emilmont | 1:fdd22bb7aa52 | 965 | |
emilmont | 1:fdd22bb7aa52 | 966 | #else |
emilmont | 1:fdd22bb7aa52 | 967 | |
mbed_official | 3:7a284390b0ce | 968 | float32_t t1, t2, r1, r2, s1, s2; |
emilmont | 1:fdd22bb7aa52 | 969 | |
mbed_official | 3:7a284390b0ce | 970 | /* Run the below code for Cortex-M0 */ |
emilmont | 1:fdd22bb7aa52 | 971 | |
mbed_official | 3:7a284390b0ce | 972 | /* Initializations for the first stage */ |
mbed_official | 3:7a284390b0ce | 973 | n2 = fftLen; |
mbed_official | 3:7a284390b0ce | 974 | n1 = n2; |
emilmont | 1:fdd22bb7aa52 | 975 | |
mbed_official | 3:7a284390b0ce | 976 | /* Calculation of first stage */ |
mbed_official | 3:7a284390b0ce | 977 | for (k = fftLen; k > 4u; k >>= 2u) |
mbed_official | 3:7a284390b0ce | 978 | { |
mbed_official | 3:7a284390b0ce | 979 | /* Initializations for the first stage */ |
mbed_official | 3:7a284390b0ce | 980 | n1 = n2; |
mbed_official | 3:7a284390b0ce | 981 | n2 >>= 2u; |
mbed_official | 3:7a284390b0ce | 982 | ia1 = 0u; |
emilmont | 1:fdd22bb7aa52 | 983 | |
mbed_official | 3:7a284390b0ce | 984 | /* Calculation of first stage */ |
mbed_official | 3:7a284390b0ce | 985 | j = 0; |
mbed_official | 3:7a284390b0ce | 986 | do |
mbed_official | 3:7a284390b0ce | 987 | { |
mbed_official | 3:7a284390b0ce | 988 | /* index calculation for the coefficients */ |
mbed_official | 3:7a284390b0ce | 989 | ia2 = ia1 + ia1; |
mbed_official | 3:7a284390b0ce | 990 | ia3 = ia2 + ia1; |
mbed_official | 3:7a284390b0ce | 991 | co1 = pCoef[ia1 * 2u]; |
mbed_official | 3:7a284390b0ce | 992 | si1 = pCoef[(ia1 * 2u) + 1u]; |
mbed_official | 3:7a284390b0ce | 993 | co2 = pCoef[ia2 * 2u]; |
mbed_official | 3:7a284390b0ce | 994 | si2 = pCoef[(ia2 * 2u) + 1u]; |
mbed_official | 3:7a284390b0ce | 995 | co3 = pCoef[ia3 * 2u]; |
mbed_official | 3:7a284390b0ce | 996 | si3 = pCoef[(ia3 * 2u) + 1u]; |
mbed_official | 3:7a284390b0ce | 997 | |
mbed_official | 3:7a284390b0ce | 998 | /* Twiddle coefficients index modifier */ |
mbed_official | 3:7a284390b0ce | 999 | ia1 = ia1 + twidCoefModifier; |
emilmont | 1:fdd22bb7aa52 | 1000 | |
mbed_official | 3:7a284390b0ce | 1001 | i0 = j; |
mbed_official | 3:7a284390b0ce | 1002 | do |
mbed_official | 3:7a284390b0ce | 1003 | { |
mbed_official | 3:7a284390b0ce | 1004 | /* index calculation for the input as, */ |
mbed_official | 3:7a284390b0ce | 1005 | /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ |
mbed_official | 3:7a284390b0ce | 1006 | i1 = i0 + n2; |
mbed_official | 3:7a284390b0ce | 1007 | i2 = i1 + n2; |
mbed_official | 3:7a284390b0ce | 1008 | i3 = i2 + n2; |
mbed_official | 3:7a284390b0ce | 1009 | |
mbed_official | 3:7a284390b0ce | 1010 | /* xa + xc */ |
mbed_official | 3:7a284390b0ce | 1011 | r1 = pSrc[(2u * i0)] + pSrc[(2u * i2)]; |
emilmont | 1:fdd22bb7aa52 | 1012 | |
mbed_official | 3:7a284390b0ce | 1013 | /* xa - xc */ |
mbed_official | 3:7a284390b0ce | 1014 | r2 = pSrc[(2u * i0)] - pSrc[(2u * i2)]; |
mbed_official | 3:7a284390b0ce | 1015 | |
mbed_official | 3:7a284390b0ce | 1016 | /* ya + yc */ |
mbed_official | 3:7a284390b0ce | 1017 | s1 = pSrc[(2u * i0) + 1u] + pSrc[(2u * i2) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 1018 | |
mbed_official | 3:7a284390b0ce | 1019 | /* ya - yc */ |
mbed_official | 3:7a284390b0ce | 1020 | s2 = pSrc[(2u * i0) + 1u] - pSrc[(2u * i2) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 1021 | |
mbed_official | 3:7a284390b0ce | 1022 | /* xb + xd */ |
mbed_official | 3:7a284390b0ce | 1023 | t1 = pSrc[2u * i1] + pSrc[2u * i3]; |
emilmont | 1:fdd22bb7aa52 | 1024 | |
mbed_official | 3:7a284390b0ce | 1025 | /* xa' = xa + xb + xc + xd */ |
mbed_official | 3:7a284390b0ce | 1026 | pSrc[2u * i0] = r1 + t1; |
emilmont | 1:fdd22bb7aa52 | 1027 | |
mbed_official | 3:7a284390b0ce | 1028 | /* xa + xc -(xb + xd) */ |
mbed_official | 3:7a284390b0ce | 1029 | r1 = r1 - t1; |
emilmont | 1:fdd22bb7aa52 | 1030 | |
mbed_official | 3:7a284390b0ce | 1031 | /* yb + yd */ |
mbed_official | 3:7a284390b0ce | 1032 | t2 = pSrc[(2u * i1) + 1u] + pSrc[(2u * i3) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 1033 | |
mbed_official | 3:7a284390b0ce | 1034 | /* ya' = ya + yb + yc + yd */ |
mbed_official | 3:7a284390b0ce | 1035 | pSrc[(2u * i0) + 1u] = s1 + t2; |
mbed_official | 3:7a284390b0ce | 1036 | |
mbed_official | 3:7a284390b0ce | 1037 | /* (ya + yc) - (yb + yd) */ |
mbed_official | 3:7a284390b0ce | 1038 | s1 = s1 - t2; |
emilmont | 1:fdd22bb7aa52 | 1039 | |
mbed_official | 3:7a284390b0ce | 1040 | /* (yb - yd) */ |
mbed_official | 3:7a284390b0ce | 1041 | t1 = pSrc[(2u * i1) + 1u] - pSrc[(2u * i3) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 1042 | |
mbed_official | 3:7a284390b0ce | 1043 | /* (xb - xd) */ |
mbed_official | 3:7a284390b0ce | 1044 | t2 = pSrc[2u * i1] - pSrc[2u * i3]; |
emilmont | 1:fdd22bb7aa52 | 1045 | |
mbed_official | 3:7a284390b0ce | 1046 | /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ |
mbed_official | 3:7a284390b0ce | 1047 | pSrc[2u * i1] = (r1 * co2) - (s1 * si2); |
emilmont | 1:fdd22bb7aa52 | 1048 | |
mbed_official | 3:7a284390b0ce | 1049 | /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ |
mbed_official | 3:7a284390b0ce | 1050 | pSrc[(2u * i1) + 1u] = (s1 * co2) + (r1 * si2); |
mbed_official | 3:7a284390b0ce | 1051 | |
mbed_official | 3:7a284390b0ce | 1052 | /* (xa - xc) - (yb - yd) */ |
mbed_official | 3:7a284390b0ce | 1053 | r1 = r2 - t1; |
emilmont | 1:fdd22bb7aa52 | 1054 | |
mbed_official | 3:7a284390b0ce | 1055 | /* (xa - xc) + (yb - yd) */ |
mbed_official | 3:7a284390b0ce | 1056 | r2 = r2 + t1; |
emilmont | 1:fdd22bb7aa52 | 1057 | |
mbed_official | 3:7a284390b0ce | 1058 | /* (ya - yc) + (xb - xd) */ |
mbed_official | 3:7a284390b0ce | 1059 | s1 = s2 + t2; |
emilmont | 1:fdd22bb7aa52 | 1060 | |
mbed_official | 3:7a284390b0ce | 1061 | /* (ya - yc) - (xb - xd) */ |
mbed_official | 3:7a284390b0ce | 1062 | s2 = s2 - t2; |
emilmont | 1:fdd22bb7aa52 | 1063 | |
mbed_official | 3:7a284390b0ce | 1064 | /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ |
mbed_official | 3:7a284390b0ce | 1065 | pSrc[2u * i2] = (r1 * co1) - (s1 * si1); |
mbed_official | 3:7a284390b0ce | 1066 | |
mbed_official | 3:7a284390b0ce | 1067 | /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ |
mbed_official | 3:7a284390b0ce | 1068 | pSrc[(2u * i2) + 1u] = (s1 * co1) + (r1 * si1); |
emilmont | 1:fdd22bb7aa52 | 1069 | |
mbed_official | 3:7a284390b0ce | 1070 | /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ |
mbed_official | 3:7a284390b0ce | 1071 | pSrc[2u * i3] = (r2 * co3) - (s2 * si3); |
emilmont | 1:fdd22bb7aa52 | 1072 | |
mbed_official | 3:7a284390b0ce | 1073 | /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ |
mbed_official | 3:7a284390b0ce | 1074 | pSrc[(2u * i3) + 1u] = (s2 * co3) + (r2 * si3); |
mbed_official | 3:7a284390b0ce | 1075 | |
mbed_official | 3:7a284390b0ce | 1076 | i0 += n1; |
mbed_official | 3:7a284390b0ce | 1077 | } while( i0 < fftLen); |
mbed_official | 3:7a284390b0ce | 1078 | j++; |
mbed_official | 3:7a284390b0ce | 1079 | } while(j <= (n2 - 1u)); |
mbed_official | 3:7a284390b0ce | 1080 | twidCoefModifier <<= 2u; |
mbed_official | 3:7a284390b0ce | 1081 | } |
mbed_official | 3:7a284390b0ce | 1082 | /* Initializations of last stage */ |
mbed_official | 3:7a284390b0ce | 1083 | n1 = n2; |
mbed_official | 3:7a284390b0ce | 1084 | n2 >>= 2u; |
emilmont | 1:fdd22bb7aa52 | 1085 | |
mbed_official | 3:7a284390b0ce | 1086 | /* Calculations of last stage */ |
mbed_official | 3:7a284390b0ce | 1087 | for (i0 = 0u; i0 <= (fftLen - n1); i0 += n1) |
mbed_official | 3:7a284390b0ce | 1088 | { |
mbed_official | 3:7a284390b0ce | 1089 | /* index calculation for the input as, */ |
mbed_official | 3:7a284390b0ce | 1090 | /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ |
mbed_official | 3:7a284390b0ce | 1091 | i1 = i0 + n2; |
mbed_official | 3:7a284390b0ce | 1092 | i2 = i1 + n2; |
mbed_official | 3:7a284390b0ce | 1093 | i3 = i2 + n2; |
emilmont | 1:fdd22bb7aa52 | 1094 | |
mbed_official | 3:7a284390b0ce | 1095 | /* Butterfly implementation */ |
mbed_official | 3:7a284390b0ce | 1096 | /* xa + xc */ |
mbed_official | 3:7a284390b0ce | 1097 | r1 = pSrc[2u * i0] + pSrc[2u * i2]; |
emilmont | 1:fdd22bb7aa52 | 1098 | |
mbed_official | 3:7a284390b0ce | 1099 | /* xa - xc */ |
mbed_official | 3:7a284390b0ce | 1100 | r2 = pSrc[2u * i0] - pSrc[2u * i2]; |
mbed_official | 3:7a284390b0ce | 1101 | |
mbed_official | 3:7a284390b0ce | 1102 | /* ya + yc */ |
mbed_official | 3:7a284390b0ce | 1103 | s1 = pSrc[(2u * i0) + 1u] + pSrc[(2u * i2) + 1u]; |
mbed_official | 3:7a284390b0ce | 1104 | |
mbed_official | 3:7a284390b0ce | 1105 | /* ya - yc */ |
mbed_official | 3:7a284390b0ce | 1106 | s2 = pSrc[(2u * i0) + 1u] - pSrc[(2u * i2) + 1u]; |
mbed_official | 3:7a284390b0ce | 1107 | |
mbed_official | 3:7a284390b0ce | 1108 | /* xc + xd */ |
mbed_official | 3:7a284390b0ce | 1109 | t1 = pSrc[2u * i1] + pSrc[2u * i3]; |
mbed_official | 3:7a284390b0ce | 1110 | |
mbed_official | 3:7a284390b0ce | 1111 | /* xa' = xa + xb + xc + xd */ |
mbed_official | 3:7a284390b0ce | 1112 | pSrc[2u * i0] = (r1 + t1) * onebyfftLen; |
emilmont | 1:fdd22bb7aa52 | 1113 | |
mbed_official | 3:7a284390b0ce | 1114 | /* (xa + xb) - (xc + xd) */ |
mbed_official | 3:7a284390b0ce | 1115 | r1 = r1 - t1; |
mbed_official | 3:7a284390b0ce | 1116 | |
mbed_official | 3:7a284390b0ce | 1117 | /* yb + yd */ |
mbed_official | 3:7a284390b0ce | 1118 | t2 = pSrc[(2u * i1) + 1u] + pSrc[(2u * i3) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 1119 | |
mbed_official | 3:7a284390b0ce | 1120 | /* ya' = ya + yb + yc + yd */ |
mbed_official | 3:7a284390b0ce | 1121 | pSrc[(2u * i0) + 1u] = (s1 + t2) * onebyfftLen; |
mbed_official | 3:7a284390b0ce | 1122 | |
mbed_official | 3:7a284390b0ce | 1123 | /* (ya + yc) - (yb + yd) */ |
mbed_official | 3:7a284390b0ce | 1124 | s1 = s1 - t2; |
mbed_official | 3:7a284390b0ce | 1125 | |
mbed_official | 3:7a284390b0ce | 1126 | /* (yb-yd) */ |
mbed_official | 3:7a284390b0ce | 1127 | t1 = pSrc[(2u * i1) + 1u] - pSrc[(2u * i3) + 1u]; |
emilmont | 1:fdd22bb7aa52 | 1128 | |
mbed_official | 3:7a284390b0ce | 1129 | /* (xb-xd) */ |
mbed_official | 3:7a284390b0ce | 1130 | t2 = pSrc[2u * i1] - pSrc[2u * i3]; |
emilmont | 1:fdd22bb7aa52 | 1131 | |
mbed_official | 3:7a284390b0ce | 1132 | /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ |
mbed_official | 3:7a284390b0ce | 1133 | pSrc[2u * i1] = r1 * onebyfftLen; |
emilmont | 1:fdd22bb7aa52 | 1134 | |
mbed_official | 3:7a284390b0ce | 1135 | /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ |
mbed_official | 3:7a284390b0ce | 1136 | pSrc[(2u * i1) + 1u] = s1 * onebyfftLen; |
emilmont | 1:fdd22bb7aa52 | 1137 | |
mbed_official | 3:7a284390b0ce | 1138 | /* (xa - xc) - (yb-yd) */ |
mbed_official | 3:7a284390b0ce | 1139 | r1 = r2 - t1; |
emilmont | 1:fdd22bb7aa52 | 1140 | |
mbed_official | 3:7a284390b0ce | 1141 | /* (xa - xc) + (yb-yd) */ |
mbed_official | 3:7a284390b0ce | 1142 | r2 = r2 + t1; |
emilmont | 1:fdd22bb7aa52 | 1143 | |
mbed_official | 3:7a284390b0ce | 1144 | /* (ya - yc) + (xb-xd) */ |
mbed_official | 3:7a284390b0ce | 1145 | s1 = s2 + t2; |
emilmont | 1:fdd22bb7aa52 | 1146 | |
mbed_official | 3:7a284390b0ce | 1147 | /* (ya - yc) - (xb-xd) */ |
mbed_official | 3:7a284390b0ce | 1148 | s2 = s2 - t2; |
emilmont | 1:fdd22bb7aa52 | 1149 | |
mbed_official | 3:7a284390b0ce | 1150 | /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ |
mbed_official | 3:7a284390b0ce | 1151 | pSrc[2u * i2] = r1 * onebyfftLen; |
emilmont | 1:fdd22bb7aa52 | 1152 | |
mbed_official | 3:7a284390b0ce | 1153 | /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ |
mbed_official | 3:7a284390b0ce | 1154 | pSrc[(2u * i2) + 1u] = s1 * onebyfftLen; |
emilmont | 1:fdd22bb7aa52 | 1155 | |
mbed_official | 3:7a284390b0ce | 1156 | /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ |
mbed_official | 3:7a284390b0ce | 1157 | pSrc[2u * i3] = r2 * onebyfftLen; |
emilmont | 1:fdd22bb7aa52 | 1158 | |
mbed_official | 3:7a284390b0ce | 1159 | /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ |
mbed_official | 3:7a284390b0ce | 1160 | pSrc[(2u * i3) + 1u] = s2 * onebyfftLen; |
mbed_official | 3:7a284390b0ce | 1161 | } |
emilmont | 1:fdd22bb7aa52 | 1162 | |
mbed_official | 3:7a284390b0ce | 1163 | #endif /* #ifndef ARM_MATH_CM0_FAMILY_FAMILY */ |
mbed_official | 3:7a284390b0ce | 1164 | } |
emilmont | 1:fdd22bb7aa52 | 1165 | |
mbed_official | 3:7a284390b0ce | 1166 | /** |
mbed_official | 3:7a284390b0ce | 1167 | * @addtogroup ComplexFFT |
mbed_official | 3:7a284390b0ce | 1168 | * @{ |
mbed_official | 3:7a284390b0ce | 1169 | */ |
emilmont | 1:fdd22bb7aa52 | 1170 | |
mbed_official | 3:7a284390b0ce | 1171 | /** |
mbed_official | 3:7a284390b0ce | 1172 | * @details |
mbed_official | 3:7a284390b0ce | 1173 | * @brief Processing function for the floating-point Radix-4 CFFT/CIFFT. |
mbed_official | 3:7a284390b0ce | 1174 | * @deprecated Do not use this function. It has been superceded by \ref arm_cfft_f32 and will be removed |
mbed_official | 3:7a284390b0ce | 1175 | * in the future. |
mbed_official | 3:7a284390b0ce | 1176 | * @param[in] *S points to an instance of the floating-point Radix-4 CFFT/CIFFT structure. |
mbed_official | 3:7a284390b0ce | 1177 | * @param[in, out] *pSrc points to the complex data buffer of size <code>2*fftLen</code>. Processing occurs in-place. |
mbed_official | 3:7a284390b0ce | 1178 | * @return none. |
mbed_official | 3:7a284390b0ce | 1179 | */ |
emilmont | 1:fdd22bb7aa52 | 1180 | |
mbed_official | 3:7a284390b0ce | 1181 | void arm_cfft_radix4_f32( |
mbed_official | 3:7a284390b0ce | 1182 | const arm_cfft_radix4_instance_f32 * S, |
mbed_official | 3:7a284390b0ce | 1183 | float32_t * pSrc) |
mbed_official | 3:7a284390b0ce | 1184 | { |
emilmont | 1:fdd22bb7aa52 | 1185 | |
mbed_official | 3:7a284390b0ce | 1186 | if(S->ifftFlag == 1u) |
mbed_official | 3:7a284390b0ce | 1187 | { |
mbed_official | 3:7a284390b0ce | 1188 | /* Complex IFFT radix-4 */ |
mbed_official | 3:7a284390b0ce | 1189 | arm_radix4_butterfly_inverse_f32(pSrc, S->fftLen, S->pTwiddle, |
mbed_official | 3:7a284390b0ce | 1190 | S->twidCoefModifier, S->onebyfftLen); |
mbed_official | 3:7a284390b0ce | 1191 | } |
mbed_official | 3:7a284390b0ce | 1192 | else |
mbed_official | 3:7a284390b0ce | 1193 | { |
mbed_official | 3:7a284390b0ce | 1194 | /* Complex FFT radix-4 */ |
mbed_official | 3:7a284390b0ce | 1195 | arm_radix4_butterfly_f32(pSrc, S->fftLen, S->pTwiddle, |
mbed_official | 3:7a284390b0ce | 1196 | S->twidCoefModifier); |
mbed_official | 3:7a284390b0ce | 1197 | } |
emilmont | 1:fdd22bb7aa52 | 1198 | |
mbed_official | 3:7a284390b0ce | 1199 | if(S->bitReverseFlag == 1u) |
mbed_official | 3:7a284390b0ce | 1200 | { |
mbed_official | 3:7a284390b0ce | 1201 | /* Bit Reversal */ |
mbed_official | 3:7a284390b0ce | 1202 | arm_bitreversal_f32(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable); |
mbed_official | 3:7a284390b0ce | 1203 | } |
emilmont | 1:fdd22bb7aa52 | 1204 | |
emilmont | 1:fdd22bb7aa52 | 1205 | } |
mbed_official | 3:7a284390b0ce | 1206 | |
mbed_official | 3:7a284390b0ce | 1207 | /** |
mbed_official | 3:7a284390b0ce | 1208 | * @} end of ComplexFFT group |
mbed_official | 3:7a284390b0ce | 1209 | */ |
mbed_official | 3:7a284390b0ce | 1210 |