The CMSIS DSP 5 library

Dependents:   Nucleo-Heart-Rate ejercicioVrms2 PROYECTOFINAL ejercicioVrms ... more

Committer:
xorjoep
Date:
Wed Jun 20 11:21:31 2018 +0000
Revision:
1:24714b45cd1b
The newest version of the CMSIS library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xorjoep 1:24714b45cd1b 1 /* ----------------------------------------------------------------------
xorjoep 1:24714b45cd1b 2 * Project: CMSIS DSP Library
xorjoep 1:24714b45cd1b 3 * Title: arm_cfft_radix8_f32.c
xorjoep 1:24714b45cd1b 4 * Description: Radix-8 Decimation in Frequency CFFT & CIFFT Floating point processing function
xorjoep 1:24714b45cd1b 5 *
xorjoep 1:24714b45cd1b 6 * $Date: 27. January 2017
xorjoep 1:24714b45cd1b 7 * $Revision: V.1.5.1
xorjoep 1:24714b45cd1b 8 *
xorjoep 1:24714b45cd1b 9 * Target Processor: Cortex-M cores
xorjoep 1:24714b45cd1b 10 * -------------------------------------------------------------------- */
xorjoep 1:24714b45cd1b 11 /*
xorjoep 1:24714b45cd1b 12 * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved.
xorjoep 1:24714b45cd1b 13 *
xorjoep 1:24714b45cd1b 14 * SPDX-License-Identifier: Apache-2.0
xorjoep 1:24714b45cd1b 15 *
xorjoep 1:24714b45cd1b 16 * Licensed under the Apache License, Version 2.0 (the License); you may
xorjoep 1:24714b45cd1b 17 * not use this file except in compliance with the License.
xorjoep 1:24714b45cd1b 18 * You may obtain a copy of the License at
xorjoep 1:24714b45cd1b 19 *
xorjoep 1:24714b45cd1b 20 * www.apache.org/licenses/LICENSE-2.0
xorjoep 1:24714b45cd1b 21 *
xorjoep 1:24714b45cd1b 22 * Unless required by applicable law or agreed to in writing, software
xorjoep 1:24714b45cd1b 23 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
xorjoep 1:24714b45cd1b 24 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
xorjoep 1:24714b45cd1b 25 * See the License for the specific language governing permissions and
xorjoep 1:24714b45cd1b 26 * limitations under the License.
xorjoep 1:24714b45cd1b 27 */
xorjoep 1:24714b45cd1b 28
xorjoep 1:24714b45cd1b 29 #include "arm_math.h"
xorjoep 1:24714b45cd1b 30
xorjoep 1:24714b45cd1b 31
xorjoep 1:24714b45cd1b 32 /* ----------------------------------------------------------------------
xorjoep 1:24714b45cd1b 33 * Internal helper function used by the FFTs
xorjoep 1:24714b45cd1b 34 * -------------------------------------------------------------------- */
xorjoep 1:24714b45cd1b 35
xorjoep 1:24714b45cd1b 36 /*
xorjoep 1:24714b45cd1b 37 * @brief Core function for the floating-point CFFT butterfly process.
xorjoep 1:24714b45cd1b 38 * @param[in, out] *pSrc points to the in-place buffer of floating-point data type.
xorjoep 1:24714b45cd1b 39 * @param[in] fftLen length of the FFT.
xorjoep 1:24714b45cd1b 40 * @param[in] *pCoef points to the twiddle coefficient buffer.
xorjoep 1:24714b45cd1b 41 * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
xorjoep 1:24714b45cd1b 42 * @return none.
xorjoep 1:24714b45cd1b 43 */
xorjoep 1:24714b45cd1b 44
xorjoep 1:24714b45cd1b 45 void arm_radix8_butterfly_f32(
xorjoep 1:24714b45cd1b 46 float32_t * pSrc,
xorjoep 1:24714b45cd1b 47 uint16_t fftLen,
xorjoep 1:24714b45cd1b 48 const float32_t * pCoef,
xorjoep 1:24714b45cd1b 49 uint16_t twidCoefModifier)
xorjoep 1:24714b45cd1b 50 {
xorjoep 1:24714b45cd1b 51 uint32_t ia1, ia2, ia3, ia4, ia5, ia6, ia7;
xorjoep 1:24714b45cd1b 52 uint32_t i1, i2, i3, i4, i5, i6, i7, i8;
xorjoep 1:24714b45cd1b 53 uint32_t id;
xorjoep 1:24714b45cd1b 54 uint32_t n1, n2, j;
xorjoep 1:24714b45cd1b 55
xorjoep 1:24714b45cd1b 56 float32_t r1, r2, r3, r4, r5, r6, r7, r8;
xorjoep 1:24714b45cd1b 57 float32_t t1, t2;
xorjoep 1:24714b45cd1b 58 float32_t s1, s2, s3, s4, s5, s6, s7, s8;
xorjoep 1:24714b45cd1b 59 float32_t p1, p2, p3, p4;
xorjoep 1:24714b45cd1b 60 float32_t co2, co3, co4, co5, co6, co7, co8;
xorjoep 1:24714b45cd1b 61 float32_t si2, si3, si4, si5, si6, si7, si8;
xorjoep 1:24714b45cd1b 62 const float32_t C81 = 0.70710678118f;
xorjoep 1:24714b45cd1b 63
xorjoep 1:24714b45cd1b 64 n2 = fftLen;
xorjoep 1:24714b45cd1b 65
xorjoep 1:24714b45cd1b 66 do
xorjoep 1:24714b45cd1b 67 {
xorjoep 1:24714b45cd1b 68 n1 = n2;
xorjoep 1:24714b45cd1b 69 n2 = n2 >> 3;
xorjoep 1:24714b45cd1b 70 i1 = 0;
xorjoep 1:24714b45cd1b 71
xorjoep 1:24714b45cd1b 72 do
xorjoep 1:24714b45cd1b 73 {
xorjoep 1:24714b45cd1b 74 i2 = i1 + n2;
xorjoep 1:24714b45cd1b 75 i3 = i2 + n2;
xorjoep 1:24714b45cd1b 76 i4 = i3 + n2;
xorjoep 1:24714b45cd1b 77 i5 = i4 + n2;
xorjoep 1:24714b45cd1b 78 i6 = i5 + n2;
xorjoep 1:24714b45cd1b 79 i7 = i6 + n2;
xorjoep 1:24714b45cd1b 80 i8 = i7 + n2;
xorjoep 1:24714b45cd1b 81 r1 = pSrc[2 * i1] + pSrc[2 * i5];
xorjoep 1:24714b45cd1b 82 r5 = pSrc[2 * i1] - pSrc[2 * i5];
xorjoep 1:24714b45cd1b 83 r2 = pSrc[2 * i2] + pSrc[2 * i6];
xorjoep 1:24714b45cd1b 84 r6 = pSrc[2 * i2] - pSrc[2 * i6];
xorjoep 1:24714b45cd1b 85 r3 = pSrc[2 * i3] + pSrc[2 * i7];
xorjoep 1:24714b45cd1b 86 r7 = pSrc[2 * i3] - pSrc[2 * i7];
xorjoep 1:24714b45cd1b 87 r4 = pSrc[2 * i4] + pSrc[2 * i8];
xorjoep 1:24714b45cd1b 88 r8 = pSrc[2 * i4] - pSrc[2 * i8];
xorjoep 1:24714b45cd1b 89 t1 = r1 - r3;
xorjoep 1:24714b45cd1b 90 r1 = r1 + r3;
xorjoep 1:24714b45cd1b 91 r3 = r2 - r4;
xorjoep 1:24714b45cd1b 92 r2 = r2 + r4;
xorjoep 1:24714b45cd1b 93 pSrc[2 * i1] = r1 + r2;
xorjoep 1:24714b45cd1b 94 pSrc[2 * i5] = r1 - r2;
xorjoep 1:24714b45cd1b 95 r1 = pSrc[2 * i1 + 1] + pSrc[2 * i5 + 1];
xorjoep 1:24714b45cd1b 96 s5 = pSrc[2 * i1 + 1] - pSrc[2 * i5 + 1];
xorjoep 1:24714b45cd1b 97 r2 = pSrc[2 * i2 + 1] + pSrc[2 * i6 + 1];
xorjoep 1:24714b45cd1b 98 s6 = pSrc[2 * i2 + 1] - pSrc[2 * i6 + 1];
xorjoep 1:24714b45cd1b 99 s3 = pSrc[2 * i3 + 1] + pSrc[2 * i7 + 1];
xorjoep 1:24714b45cd1b 100 s7 = pSrc[2 * i3 + 1] - pSrc[2 * i7 + 1];
xorjoep 1:24714b45cd1b 101 r4 = pSrc[2 * i4 + 1] + pSrc[2 * i8 + 1];
xorjoep 1:24714b45cd1b 102 s8 = pSrc[2 * i4 + 1] - pSrc[2 * i8 + 1];
xorjoep 1:24714b45cd1b 103 t2 = r1 - s3;
xorjoep 1:24714b45cd1b 104 r1 = r1 + s3;
xorjoep 1:24714b45cd1b 105 s3 = r2 - r4;
xorjoep 1:24714b45cd1b 106 r2 = r2 + r4;
xorjoep 1:24714b45cd1b 107 pSrc[2 * i1 + 1] = r1 + r2;
xorjoep 1:24714b45cd1b 108 pSrc[2 * i5 + 1] = r1 - r2;
xorjoep 1:24714b45cd1b 109 pSrc[2 * i3] = t1 + s3;
xorjoep 1:24714b45cd1b 110 pSrc[2 * i7] = t1 - s3;
xorjoep 1:24714b45cd1b 111 pSrc[2 * i3 + 1] = t2 - r3;
xorjoep 1:24714b45cd1b 112 pSrc[2 * i7 + 1] = t2 + r3;
xorjoep 1:24714b45cd1b 113 r1 = (r6 - r8) * C81;
xorjoep 1:24714b45cd1b 114 r6 = (r6 + r8) * C81;
xorjoep 1:24714b45cd1b 115 r2 = (s6 - s8) * C81;
xorjoep 1:24714b45cd1b 116 s6 = (s6 + s8) * C81;
xorjoep 1:24714b45cd1b 117 t1 = r5 - r1;
xorjoep 1:24714b45cd1b 118 r5 = r5 + r1;
xorjoep 1:24714b45cd1b 119 r8 = r7 - r6;
xorjoep 1:24714b45cd1b 120 r7 = r7 + r6;
xorjoep 1:24714b45cd1b 121 t2 = s5 - r2;
xorjoep 1:24714b45cd1b 122 s5 = s5 + r2;
xorjoep 1:24714b45cd1b 123 s8 = s7 - s6;
xorjoep 1:24714b45cd1b 124 s7 = s7 + s6;
xorjoep 1:24714b45cd1b 125 pSrc[2 * i2] = r5 + s7;
xorjoep 1:24714b45cd1b 126 pSrc[2 * i8] = r5 - s7;
xorjoep 1:24714b45cd1b 127 pSrc[2 * i6] = t1 + s8;
xorjoep 1:24714b45cd1b 128 pSrc[2 * i4] = t1 - s8;
xorjoep 1:24714b45cd1b 129 pSrc[2 * i2 + 1] = s5 - r7;
xorjoep 1:24714b45cd1b 130 pSrc[2 * i8 + 1] = s5 + r7;
xorjoep 1:24714b45cd1b 131 pSrc[2 * i6 + 1] = t2 - r8;
xorjoep 1:24714b45cd1b 132 pSrc[2 * i4 + 1] = t2 + r8;
xorjoep 1:24714b45cd1b 133
xorjoep 1:24714b45cd1b 134 i1 += n1;
xorjoep 1:24714b45cd1b 135 } while (i1 < fftLen);
xorjoep 1:24714b45cd1b 136
xorjoep 1:24714b45cd1b 137 if (n2 < 8)
xorjoep 1:24714b45cd1b 138 break;
xorjoep 1:24714b45cd1b 139
xorjoep 1:24714b45cd1b 140 ia1 = 0;
xorjoep 1:24714b45cd1b 141 j = 1;
xorjoep 1:24714b45cd1b 142
xorjoep 1:24714b45cd1b 143 do
xorjoep 1:24714b45cd1b 144 {
xorjoep 1:24714b45cd1b 145 /* index calculation for the coefficients */
xorjoep 1:24714b45cd1b 146 id = ia1 + twidCoefModifier;
xorjoep 1:24714b45cd1b 147 ia1 = id;
xorjoep 1:24714b45cd1b 148 ia2 = ia1 + id;
xorjoep 1:24714b45cd1b 149 ia3 = ia2 + id;
xorjoep 1:24714b45cd1b 150 ia4 = ia3 + id;
xorjoep 1:24714b45cd1b 151 ia5 = ia4 + id;
xorjoep 1:24714b45cd1b 152 ia6 = ia5 + id;
xorjoep 1:24714b45cd1b 153 ia7 = ia6 + id;
xorjoep 1:24714b45cd1b 154
xorjoep 1:24714b45cd1b 155 co2 = pCoef[2 * ia1];
xorjoep 1:24714b45cd1b 156 co3 = pCoef[2 * ia2];
xorjoep 1:24714b45cd1b 157 co4 = pCoef[2 * ia3];
xorjoep 1:24714b45cd1b 158 co5 = pCoef[2 * ia4];
xorjoep 1:24714b45cd1b 159 co6 = pCoef[2 * ia5];
xorjoep 1:24714b45cd1b 160 co7 = pCoef[2 * ia6];
xorjoep 1:24714b45cd1b 161 co8 = pCoef[2 * ia7];
xorjoep 1:24714b45cd1b 162 si2 = pCoef[2 * ia1 + 1];
xorjoep 1:24714b45cd1b 163 si3 = pCoef[2 * ia2 + 1];
xorjoep 1:24714b45cd1b 164 si4 = pCoef[2 * ia3 + 1];
xorjoep 1:24714b45cd1b 165 si5 = pCoef[2 * ia4 + 1];
xorjoep 1:24714b45cd1b 166 si6 = pCoef[2 * ia5 + 1];
xorjoep 1:24714b45cd1b 167 si7 = pCoef[2 * ia6 + 1];
xorjoep 1:24714b45cd1b 168 si8 = pCoef[2 * ia7 + 1];
xorjoep 1:24714b45cd1b 169
xorjoep 1:24714b45cd1b 170 i1 = j;
xorjoep 1:24714b45cd1b 171
xorjoep 1:24714b45cd1b 172 do
xorjoep 1:24714b45cd1b 173 {
xorjoep 1:24714b45cd1b 174 /* index calculation for the input */
xorjoep 1:24714b45cd1b 175 i2 = i1 + n2;
xorjoep 1:24714b45cd1b 176 i3 = i2 + n2;
xorjoep 1:24714b45cd1b 177 i4 = i3 + n2;
xorjoep 1:24714b45cd1b 178 i5 = i4 + n2;
xorjoep 1:24714b45cd1b 179 i6 = i5 + n2;
xorjoep 1:24714b45cd1b 180 i7 = i6 + n2;
xorjoep 1:24714b45cd1b 181 i8 = i7 + n2;
xorjoep 1:24714b45cd1b 182 r1 = pSrc[2 * i1] + pSrc[2 * i5];
xorjoep 1:24714b45cd1b 183 r5 = pSrc[2 * i1] - pSrc[2 * i5];
xorjoep 1:24714b45cd1b 184 r2 = pSrc[2 * i2] + pSrc[2 * i6];
xorjoep 1:24714b45cd1b 185 r6 = pSrc[2 * i2] - pSrc[2 * i6];
xorjoep 1:24714b45cd1b 186 r3 = pSrc[2 * i3] + pSrc[2 * i7];
xorjoep 1:24714b45cd1b 187 r7 = pSrc[2 * i3] - pSrc[2 * i7];
xorjoep 1:24714b45cd1b 188 r4 = pSrc[2 * i4] + pSrc[2 * i8];
xorjoep 1:24714b45cd1b 189 r8 = pSrc[2 * i4] - pSrc[2 * i8];
xorjoep 1:24714b45cd1b 190 t1 = r1 - r3;
xorjoep 1:24714b45cd1b 191 r1 = r1 + r3;
xorjoep 1:24714b45cd1b 192 r3 = r2 - r4;
xorjoep 1:24714b45cd1b 193 r2 = r2 + r4;
xorjoep 1:24714b45cd1b 194 pSrc[2 * i1] = r1 + r2;
xorjoep 1:24714b45cd1b 195 r2 = r1 - r2;
xorjoep 1:24714b45cd1b 196 s1 = pSrc[2 * i1 + 1] + pSrc[2 * i5 + 1];
xorjoep 1:24714b45cd1b 197 s5 = pSrc[2 * i1 + 1] - pSrc[2 * i5 + 1];
xorjoep 1:24714b45cd1b 198 s2 = pSrc[2 * i2 + 1] + pSrc[2 * i6 + 1];
xorjoep 1:24714b45cd1b 199 s6 = pSrc[2 * i2 + 1] - pSrc[2 * i6 + 1];
xorjoep 1:24714b45cd1b 200 s3 = pSrc[2 * i3 + 1] + pSrc[2 * i7 + 1];
xorjoep 1:24714b45cd1b 201 s7 = pSrc[2 * i3 + 1] - pSrc[2 * i7 + 1];
xorjoep 1:24714b45cd1b 202 s4 = pSrc[2 * i4 + 1] + pSrc[2 * i8 + 1];
xorjoep 1:24714b45cd1b 203 s8 = pSrc[2 * i4 + 1] - pSrc[2 * i8 + 1];
xorjoep 1:24714b45cd1b 204 t2 = s1 - s3;
xorjoep 1:24714b45cd1b 205 s1 = s1 + s3;
xorjoep 1:24714b45cd1b 206 s3 = s2 - s4;
xorjoep 1:24714b45cd1b 207 s2 = s2 + s4;
xorjoep 1:24714b45cd1b 208 r1 = t1 + s3;
xorjoep 1:24714b45cd1b 209 t1 = t1 - s3;
xorjoep 1:24714b45cd1b 210 pSrc[2 * i1 + 1] = s1 + s2;
xorjoep 1:24714b45cd1b 211 s2 = s1 - s2;
xorjoep 1:24714b45cd1b 212 s1 = t2 - r3;
xorjoep 1:24714b45cd1b 213 t2 = t2 + r3;
xorjoep 1:24714b45cd1b 214 p1 = co5 * r2;
xorjoep 1:24714b45cd1b 215 p2 = si5 * s2;
xorjoep 1:24714b45cd1b 216 p3 = co5 * s2;
xorjoep 1:24714b45cd1b 217 p4 = si5 * r2;
xorjoep 1:24714b45cd1b 218 pSrc[2 * i5] = p1 + p2;
xorjoep 1:24714b45cd1b 219 pSrc[2 * i5 + 1] = p3 - p4;
xorjoep 1:24714b45cd1b 220 p1 = co3 * r1;
xorjoep 1:24714b45cd1b 221 p2 = si3 * s1;
xorjoep 1:24714b45cd1b 222 p3 = co3 * s1;
xorjoep 1:24714b45cd1b 223 p4 = si3 * r1;
xorjoep 1:24714b45cd1b 224 pSrc[2 * i3] = p1 + p2;
xorjoep 1:24714b45cd1b 225 pSrc[2 * i3 + 1] = p3 - p4;
xorjoep 1:24714b45cd1b 226 p1 = co7 * t1;
xorjoep 1:24714b45cd1b 227 p2 = si7 * t2;
xorjoep 1:24714b45cd1b 228 p3 = co7 * t2;
xorjoep 1:24714b45cd1b 229 p4 = si7 * t1;
xorjoep 1:24714b45cd1b 230 pSrc[2 * i7] = p1 + p2;
xorjoep 1:24714b45cd1b 231 pSrc[2 * i7 + 1] = p3 - p4;
xorjoep 1:24714b45cd1b 232 r1 = (r6 - r8) * C81;
xorjoep 1:24714b45cd1b 233 r6 = (r6 + r8) * C81;
xorjoep 1:24714b45cd1b 234 s1 = (s6 - s8) * C81;
xorjoep 1:24714b45cd1b 235 s6 = (s6 + s8) * C81;
xorjoep 1:24714b45cd1b 236 t1 = r5 - r1;
xorjoep 1:24714b45cd1b 237 r5 = r5 + r1;
xorjoep 1:24714b45cd1b 238 r8 = r7 - r6;
xorjoep 1:24714b45cd1b 239 r7 = r7 + r6;
xorjoep 1:24714b45cd1b 240 t2 = s5 - s1;
xorjoep 1:24714b45cd1b 241 s5 = s5 + s1;
xorjoep 1:24714b45cd1b 242 s8 = s7 - s6;
xorjoep 1:24714b45cd1b 243 s7 = s7 + s6;
xorjoep 1:24714b45cd1b 244 r1 = r5 + s7;
xorjoep 1:24714b45cd1b 245 r5 = r5 - s7;
xorjoep 1:24714b45cd1b 246 r6 = t1 + s8;
xorjoep 1:24714b45cd1b 247 t1 = t1 - s8;
xorjoep 1:24714b45cd1b 248 s1 = s5 - r7;
xorjoep 1:24714b45cd1b 249 s5 = s5 + r7;
xorjoep 1:24714b45cd1b 250 s6 = t2 - r8;
xorjoep 1:24714b45cd1b 251 t2 = t2 + r8;
xorjoep 1:24714b45cd1b 252 p1 = co2 * r1;
xorjoep 1:24714b45cd1b 253 p2 = si2 * s1;
xorjoep 1:24714b45cd1b 254 p3 = co2 * s1;
xorjoep 1:24714b45cd1b 255 p4 = si2 * r1;
xorjoep 1:24714b45cd1b 256 pSrc[2 * i2] = p1 + p2;
xorjoep 1:24714b45cd1b 257 pSrc[2 * i2 + 1] = p3 - p4;
xorjoep 1:24714b45cd1b 258 p1 = co8 * r5;
xorjoep 1:24714b45cd1b 259 p2 = si8 * s5;
xorjoep 1:24714b45cd1b 260 p3 = co8 * s5;
xorjoep 1:24714b45cd1b 261 p4 = si8 * r5;
xorjoep 1:24714b45cd1b 262 pSrc[2 * i8] = p1 + p2;
xorjoep 1:24714b45cd1b 263 pSrc[2 * i8 + 1] = p3 - p4;
xorjoep 1:24714b45cd1b 264 p1 = co6 * r6;
xorjoep 1:24714b45cd1b 265 p2 = si6 * s6;
xorjoep 1:24714b45cd1b 266 p3 = co6 * s6;
xorjoep 1:24714b45cd1b 267 p4 = si6 * r6;
xorjoep 1:24714b45cd1b 268 pSrc[2 * i6] = p1 + p2;
xorjoep 1:24714b45cd1b 269 pSrc[2 * i6 + 1] = p3 - p4;
xorjoep 1:24714b45cd1b 270 p1 = co4 * t1;
xorjoep 1:24714b45cd1b 271 p2 = si4 * t2;
xorjoep 1:24714b45cd1b 272 p3 = co4 * t2;
xorjoep 1:24714b45cd1b 273 p4 = si4 * t1;
xorjoep 1:24714b45cd1b 274 pSrc[2 * i4] = p1 + p2;
xorjoep 1:24714b45cd1b 275 pSrc[2 * i4 + 1] = p3 - p4;
xorjoep 1:24714b45cd1b 276
xorjoep 1:24714b45cd1b 277 i1 += n1;
xorjoep 1:24714b45cd1b 278 } while (i1 < fftLen);
xorjoep 1:24714b45cd1b 279
xorjoep 1:24714b45cd1b 280 j++;
xorjoep 1:24714b45cd1b 281 } while (j < n2);
xorjoep 1:24714b45cd1b 282
xorjoep 1:24714b45cd1b 283 twidCoefModifier <<= 3;
xorjoep 1:24714b45cd1b 284 } while (n2 > 7);
xorjoep 1:24714b45cd1b 285 }