The CMSIS DSP 5 library

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

Committer:
xorjoep
Date:
Thu Jun 21 11:56:27 2018 +0000
Revision:
3:4098b9d3d571
Parent:
1:24714b45cd1b
headers is a folder not a 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_cmplx_mult_real_f32.c
xorjoep 1:24714b45cd1b 4 * Description: Floating-point complex by real multiplication
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 * @ingroup groupCmplxMath
xorjoep 1:24714b45cd1b 33 */
xorjoep 1:24714b45cd1b 34
xorjoep 1:24714b45cd1b 35 /**
xorjoep 1:24714b45cd1b 36 * @defgroup CmplxByRealMult Complex-by-Real Multiplication
xorjoep 1:24714b45cd1b 37 *
xorjoep 1:24714b45cd1b 38 * Multiplies a complex vector by a real vector and generates a complex result.
xorjoep 1:24714b45cd1b 39 * The data in the complex arrays is stored in an interleaved fashion
xorjoep 1:24714b45cd1b 40 * (real, imag, real, imag, ...).
xorjoep 1:24714b45cd1b 41 * The parameter <code>numSamples</code> represents the number of complex
xorjoep 1:24714b45cd1b 42 * samples processed. The complex arrays have a total of <code>2*numSamples</code>
xorjoep 1:24714b45cd1b 43 * real values while the real array has a total of <code>numSamples</code>
xorjoep 1:24714b45cd1b 44 * real values.
xorjoep 1:24714b45cd1b 45 *
xorjoep 1:24714b45cd1b 46 * The underlying algorithm is used:
xorjoep 1:24714b45cd1b 47 *
xorjoep 1:24714b45cd1b 48 * <pre>
xorjoep 1:24714b45cd1b 49 * for(n=0; n<numSamples; n++) {
xorjoep 1:24714b45cd1b 50 * pCmplxDst[(2*n)+0] = pSrcCmplx[(2*n)+0] * pSrcReal[n];
xorjoep 1:24714b45cd1b 51 * pCmplxDst[(2*n)+1] = pSrcCmplx[(2*n)+1] * pSrcReal[n];
xorjoep 1:24714b45cd1b 52 * }
xorjoep 1:24714b45cd1b 53 * </pre>
xorjoep 1:24714b45cd1b 54 *
xorjoep 1:24714b45cd1b 55 * There are separate functions for floating-point, Q15, and Q31 data types.
xorjoep 1:24714b45cd1b 56 */
xorjoep 1:24714b45cd1b 57
xorjoep 1:24714b45cd1b 58 /**
xorjoep 1:24714b45cd1b 59 * @addtogroup CmplxByRealMult
xorjoep 1:24714b45cd1b 60 * @{
xorjoep 1:24714b45cd1b 61 */
xorjoep 1:24714b45cd1b 62
xorjoep 1:24714b45cd1b 63
xorjoep 1:24714b45cd1b 64 /**
xorjoep 1:24714b45cd1b 65 * @brief Floating-point complex-by-real multiplication
xorjoep 1:24714b45cd1b 66 * @param[in] *pSrcCmplx points to the complex input vector
xorjoep 1:24714b45cd1b 67 * @param[in] *pSrcReal points to the real input vector
xorjoep 1:24714b45cd1b 68 * @param[out] *pCmplxDst points to the complex output vector
xorjoep 1:24714b45cd1b 69 * @param[in] numSamples number of samples in each vector
xorjoep 1:24714b45cd1b 70 * @return none.
xorjoep 1:24714b45cd1b 71 */
xorjoep 1:24714b45cd1b 72
xorjoep 1:24714b45cd1b 73 void arm_cmplx_mult_real_f32(
xorjoep 1:24714b45cd1b 74 float32_t * pSrcCmplx,
xorjoep 1:24714b45cd1b 75 float32_t * pSrcReal,
xorjoep 1:24714b45cd1b 76 float32_t * pCmplxDst,
xorjoep 1:24714b45cd1b 77 uint32_t numSamples)
xorjoep 1:24714b45cd1b 78 {
xorjoep 1:24714b45cd1b 79 float32_t in; /* Temporary variable to store input value */
xorjoep 1:24714b45cd1b 80 uint32_t blkCnt; /* loop counters */
xorjoep 1:24714b45cd1b 81
xorjoep 1:24714b45cd1b 82 #if defined (ARM_MATH_DSP)
xorjoep 1:24714b45cd1b 83
xorjoep 1:24714b45cd1b 84 /* Run the below code for Cortex-M4 and Cortex-M3 */
xorjoep 1:24714b45cd1b 85 float32_t inA1, inA2, inA3, inA4; /* Temporary variables to hold input data */
xorjoep 1:24714b45cd1b 86 float32_t inA5, inA6, inA7, inA8; /* Temporary variables to hold input data */
xorjoep 1:24714b45cd1b 87 float32_t inB1, inB2, inB3, inB4; /* Temporary variables to hold input data */
xorjoep 1:24714b45cd1b 88 float32_t out1, out2, out3, out4; /* Temporary variables to hold output data */
xorjoep 1:24714b45cd1b 89 float32_t out5, out6, out7, out8; /* Temporary variables to hold output data */
xorjoep 1:24714b45cd1b 90
xorjoep 1:24714b45cd1b 91 /* loop Unrolling */
xorjoep 1:24714b45cd1b 92 blkCnt = numSamples >> 2U;
xorjoep 1:24714b45cd1b 93
xorjoep 1:24714b45cd1b 94 /* First part of the processing with loop unrolling. Compute 4 outputs at a time.
xorjoep 1:24714b45cd1b 95 ** a second loop below computes the remaining 1 to 3 samples. */
xorjoep 1:24714b45cd1b 96 while (blkCnt > 0U)
xorjoep 1:24714b45cd1b 97 {
xorjoep 1:24714b45cd1b 98 /* C[2 * i] = A[2 * i] * B[i]. */
xorjoep 1:24714b45cd1b 99 /* C[2 * i + 1] = A[2 * i + 1] * B[i]. */
xorjoep 1:24714b45cd1b 100 /* read input from complex input buffer */
xorjoep 1:24714b45cd1b 101 inA1 = pSrcCmplx[0];
xorjoep 1:24714b45cd1b 102 inA2 = pSrcCmplx[1];
xorjoep 1:24714b45cd1b 103 /* read input from real input buffer */
xorjoep 1:24714b45cd1b 104 inB1 = pSrcReal[0];
xorjoep 1:24714b45cd1b 105
xorjoep 1:24714b45cd1b 106 /* read input from complex input buffer */
xorjoep 1:24714b45cd1b 107 inA3 = pSrcCmplx[2];
xorjoep 1:24714b45cd1b 108
xorjoep 1:24714b45cd1b 109 /* multiply complex buffer real input with real buffer input */
xorjoep 1:24714b45cd1b 110 out1 = inA1 * inB1;
xorjoep 1:24714b45cd1b 111
xorjoep 1:24714b45cd1b 112 /* read input from complex input buffer */
xorjoep 1:24714b45cd1b 113 inA4 = pSrcCmplx[3];
xorjoep 1:24714b45cd1b 114
xorjoep 1:24714b45cd1b 115 /* multiply complex buffer imaginary input with real buffer input */
xorjoep 1:24714b45cd1b 116 out2 = inA2 * inB1;
xorjoep 1:24714b45cd1b 117
xorjoep 1:24714b45cd1b 118 /* read input from real input buffer */
xorjoep 1:24714b45cd1b 119 inB2 = pSrcReal[1];
xorjoep 1:24714b45cd1b 120 /* read input from complex input buffer */
xorjoep 1:24714b45cd1b 121 inA5 = pSrcCmplx[4];
xorjoep 1:24714b45cd1b 122
xorjoep 1:24714b45cd1b 123 /* multiply complex buffer real input with real buffer input */
xorjoep 1:24714b45cd1b 124 out3 = inA3 * inB2;
xorjoep 1:24714b45cd1b 125
xorjoep 1:24714b45cd1b 126 /* read input from complex input buffer */
xorjoep 1:24714b45cd1b 127 inA6 = pSrcCmplx[5];
xorjoep 1:24714b45cd1b 128 /* read input from real input buffer */
xorjoep 1:24714b45cd1b 129 inB3 = pSrcReal[2];
xorjoep 1:24714b45cd1b 130
xorjoep 1:24714b45cd1b 131 /* multiply complex buffer imaginary input with real buffer input */
xorjoep 1:24714b45cd1b 132 out4 = inA4 * inB2;
xorjoep 1:24714b45cd1b 133
xorjoep 1:24714b45cd1b 134 /* read input from complex input buffer */
xorjoep 1:24714b45cd1b 135 inA7 = pSrcCmplx[6];
xorjoep 1:24714b45cd1b 136
xorjoep 1:24714b45cd1b 137 /* multiply complex buffer real input with real buffer input */
xorjoep 1:24714b45cd1b 138 out5 = inA5 * inB3;
xorjoep 1:24714b45cd1b 139
xorjoep 1:24714b45cd1b 140 /* read input from complex input buffer */
xorjoep 1:24714b45cd1b 141 inA8 = pSrcCmplx[7];
xorjoep 1:24714b45cd1b 142
xorjoep 1:24714b45cd1b 143 /* multiply complex buffer imaginary input with real buffer input */
xorjoep 1:24714b45cd1b 144 out6 = inA6 * inB3;
xorjoep 1:24714b45cd1b 145
xorjoep 1:24714b45cd1b 146 /* read input from real input buffer */
xorjoep 1:24714b45cd1b 147 inB4 = pSrcReal[3];
xorjoep 1:24714b45cd1b 148
xorjoep 1:24714b45cd1b 149 /* store result to destination bufer */
xorjoep 1:24714b45cd1b 150 pCmplxDst[0] = out1;
xorjoep 1:24714b45cd1b 151
xorjoep 1:24714b45cd1b 152 /* multiply complex buffer real input with real buffer input */
xorjoep 1:24714b45cd1b 153 out7 = inA7 * inB4;
xorjoep 1:24714b45cd1b 154
xorjoep 1:24714b45cd1b 155 /* store result to destination bufer */
xorjoep 1:24714b45cd1b 156 pCmplxDst[1] = out2;
xorjoep 1:24714b45cd1b 157
xorjoep 1:24714b45cd1b 158 /* multiply complex buffer imaginary input with real buffer input */
xorjoep 1:24714b45cd1b 159 out8 = inA8 * inB4;
xorjoep 1:24714b45cd1b 160
xorjoep 1:24714b45cd1b 161 /* store result to destination bufer */
xorjoep 1:24714b45cd1b 162 pCmplxDst[2] = out3;
xorjoep 1:24714b45cd1b 163 pCmplxDst[3] = out4;
xorjoep 1:24714b45cd1b 164 pCmplxDst[4] = out5;
xorjoep 1:24714b45cd1b 165
xorjoep 1:24714b45cd1b 166 /* incremnet complex input buffer by 8 to process next samples */
xorjoep 1:24714b45cd1b 167 pSrcCmplx += 8U;
xorjoep 1:24714b45cd1b 168
xorjoep 1:24714b45cd1b 169 /* store result to destination bufer */
xorjoep 1:24714b45cd1b 170 pCmplxDst[5] = out6;
xorjoep 1:24714b45cd1b 171
xorjoep 1:24714b45cd1b 172 /* increment real input buffer by 4 to process next samples */
xorjoep 1:24714b45cd1b 173 pSrcReal += 4U;
xorjoep 1:24714b45cd1b 174
xorjoep 1:24714b45cd1b 175 /* store result to destination bufer */
xorjoep 1:24714b45cd1b 176 pCmplxDst[6] = out7;
xorjoep 1:24714b45cd1b 177 pCmplxDst[7] = out8;
xorjoep 1:24714b45cd1b 178
xorjoep 1:24714b45cd1b 179 /* increment destination buffer by 8 to process next sampels */
xorjoep 1:24714b45cd1b 180 pCmplxDst += 8U;
xorjoep 1:24714b45cd1b 181
xorjoep 1:24714b45cd1b 182 /* Decrement the numSamples loop counter */
xorjoep 1:24714b45cd1b 183 blkCnt--;
xorjoep 1:24714b45cd1b 184 }
xorjoep 1:24714b45cd1b 185
xorjoep 1:24714b45cd1b 186 /* If the numSamples is not a multiple of 4, compute any remaining output samples here.
xorjoep 1:24714b45cd1b 187 ** No loop unrolling is used. */
xorjoep 1:24714b45cd1b 188 blkCnt = numSamples % 0x4U;
xorjoep 1:24714b45cd1b 189
xorjoep 1:24714b45cd1b 190 #else
xorjoep 1:24714b45cd1b 191
xorjoep 1:24714b45cd1b 192 /* Run the below code for Cortex-M0 */
xorjoep 1:24714b45cd1b 193 blkCnt = numSamples;
xorjoep 1:24714b45cd1b 194
xorjoep 1:24714b45cd1b 195 #endif /* #if defined (ARM_MATH_DSP) */
xorjoep 1:24714b45cd1b 196
xorjoep 1:24714b45cd1b 197 while (blkCnt > 0U)
xorjoep 1:24714b45cd1b 198 {
xorjoep 1:24714b45cd1b 199 /* C[2 * i] = A[2 * i] * B[i]. */
xorjoep 1:24714b45cd1b 200 /* C[2 * i + 1] = A[2 * i + 1] * B[i]. */
xorjoep 1:24714b45cd1b 201 in = *pSrcReal++;
xorjoep 1:24714b45cd1b 202 /* store the result in the destination buffer. */
xorjoep 1:24714b45cd1b 203 *pCmplxDst++ = (*pSrcCmplx++) * (in);
xorjoep 1:24714b45cd1b 204 *pCmplxDst++ = (*pSrcCmplx++) * (in);
xorjoep 1:24714b45cd1b 205
xorjoep 1:24714b45cd1b 206 /* Decrement the numSamples loop counter */
xorjoep 1:24714b45cd1b 207 blkCnt--;
xorjoep 1:24714b45cd1b 208 }
xorjoep 1:24714b45cd1b 209 }
xorjoep 1:24714b45cd1b 210
xorjoep 1:24714b45cd1b 211 /**
xorjoep 1:24714b45cd1b 212 * @} end of CmplxByRealMult group
xorjoep 1:24714b45cd1b 213 */