]> git.gir.st - tmk_keyboard.git/blob - tmk_core/tool/mbed/mbed-sdk/libraries/dsp/cmsis_dsp/ComplexMathFunctions/arm_cmplx_mult_real_f32.c
Merge commit '1fe4406f374291ab2e86e95a97341fd9c475fcb8'
[tmk_keyboard.git] / tmk_core / tool / mbed / mbed-sdk / libraries / dsp / cmsis_dsp / ComplexMathFunctions / arm_cmplx_mult_real_f32.c
1 /* ----------------------------------------------------------------------
2 * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
3 *
4 * $Date: 17. January 2013
5 * $Revision: V1.4.1
6 *
7 * Project: CMSIS DSP Library
8 * Title: arm_cmplx_mult_real_f32.c
9 *
10 * Description: Floating-point complex by real multiplication
11 *
12 * Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
16 * are met:
17 * - Redistributions of source code must retain the above copyright
18 * notice, this list of conditions and the following disclaimer.
19 * - Redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in
21 * the documentation and/or other materials provided with the
22 * distribution.
23 * - Neither the name of ARM LIMITED nor the names of its contributors
24 * may be used to endorse or promote products derived from this
25 * software without specific prior written permission.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
30 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
31 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
32 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
33 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
34 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
35 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38 * POSSIBILITY OF SUCH DAMAGE.
39 * -------------------------------------------------------------------- */
40
41 #include "arm_math.h"
42
43 /**
44 * @ingroup groupCmplxMath
45 */
46
47 /**
48 * @defgroup CmplxByRealMult Complex-by-Real Multiplication
49 *
50 * Multiplies a complex vector by a real vector and generates a complex result.
51 * The data in the complex arrays is stored in an interleaved fashion
52 * (real, imag, real, imag, ...).
53 * The parameter <code>numSamples</code> represents the number of complex
54 * samples processed. The complex arrays have a total of <code>2*numSamples</code>
55 * real values while the real array has a total of <code>numSamples</code>
56 * real values.
57 *
58 * The underlying algorithm is used:
59 *
60 * <pre>
61 * for(n=0; n<numSamples; n++) {
62 * pCmplxDst[(2*n)+0] = pSrcCmplx[(2*n)+0] * pSrcReal[n];
63 * pCmplxDst[(2*n)+1] = pSrcCmplx[(2*n)+1] * pSrcReal[n];
64 * }
65 * </pre>
66 *
67 * There are separate functions for floating-point, Q15, and Q31 data types.
68 */
69
70 /**
71 * @addtogroup CmplxByRealMult
72 * @{
73 */
74
75
76 /**
77 * @brief Floating-point complex-by-real multiplication
78 * @param[in] *pSrcCmplx points to the complex input vector
79 * @param[in] *pSrcReal points to the real input vector
80 * @param[out] *pCmplxDst points to the complex output vector
81 * @param[in] numSamples number of samples in each vector
82 * @return none.
83 */
84
85 void arm_cmplx_mult_real_f32(
86 float32_t * pSrcCmplx,
87 float32_t * pSrcReal,
88 float32_t * pCmplxDst,
89 uint32_t numSamples)
90 {
91 float32_t in; /* Temporary variable to store input value */
92 uint32_t blkCnt; /* loop counters */
93
94 #ifndef ARM_MATH_CM0_FAMILY
95
96 /* Run the below code for Cortex-M4 and Cortex-M3 */
97 float32_t inA1, inA2, inA3, inA4; /* Temporary variables to hold input data */
98 float32_t inA5, inA6, inA7, inA8; /* Temporary variables to hold input data */
99 float32_t inB1, inB2, inB3, inB4; /* Temporary variables to hold input data */
100 float32_t out1, out2, out3, out4; /* Temporary variables to hold output data */
101 float32_t out5, out6, out7, out8; /* Temporary variables to hold output data */
102
103 /* loop Unrolling */
104 blkCnt = numSamples >> 2u;
105
106 /* First part of the processing with loop unrolling. Compute 4 outputs at a time.
107 ** a second loop below computes the remaining 1 to 3 samples. */
108 while(blkCnt > 0u)
109 {
110 /* C[2 * i] = A[2 * i] * B[i]. */
111 /* C[2 * i + 1] = A[2 * i + 1] * B[i]. */
112 /* read input from complex input buffer */
113 inA1 = pSrcCmplx[0];
114 inA2 = pSrcCmplx[1];
115 /* read input from real input buffer */
116 inB1 = pSrcReal[0];
117
118 /* read input from complex input buffer */
119 inA3 = pSrcCmplx[2];
120
121 /* multiply complex buffer real input with real buffer input */
122 out1 = inA1 * inB1;
123
124 /* read input from complex input buffer */
125 inA4 = pSrcCmplx[3];
126
127 /* multiply complex buffer imaginary input with real buffer input */
128 out2 = inA2 * inB1;
129
130 /* read input from real input buffer */
131 inB2 = pSrcReal[1];
132 /* read input from complex input buffer */
133 inA5 = pSrcCmplx[4];
134
135 /* multiply complex buffer real input with real buffer input */
136 out3 = inA3 * inB2;
137
138 /* read input from complex input buffer */
139 inA6 = pSrcCmplx[5];
140 /* read input from real input buffer */
141 inB3 = pSrcReal[2];
142
143 /* multiply complex buffer imaginary input with real buffer input */
144 out4 = inA4 * inB2;
145
146 /* read input from complex input buffer */
147 inA7 = pSrcCmplx[6];
148
149 /* multiply complex buffer real input with real buffer input */
150 out5 = inA5 * inB3;
151
152 /* read input from complex input buffer */
153 inA8 = pSrcCmplx[7];
154
155 /* multiply complex buffer imaginary input with real buffer input */
156 out6 = inA6 * inB3;
157
158 /* read input from real input buffer */
159 inB4 = pSrcReal[3];
160
161 /* store result to destination bufer */
162 pCmplxDst[0] = out1;
163
164 /* multiply complex buffer real input with real buffer input */
165 out7 = inA7 * inB4;
166
167 /* store result to destination bufer */
168 pCmplxDst[1] = out2;
169
170 /* multiply complex buffer imaginary input with real buffer input */
171 out8 = inA8 * inB4;
172
173 /* store result to destination bufer */
174 pCmplxDst[2] = out3;
175 pCmplxDst[3] = out4;
176 pCmplxDst[4] = out5;
177
178 /* incremnet complex input buffer by 8 to process next samples */
179 pSrcCmplx += 8u;
180
181 /* store result to destination bufer */
182 pCmplxDst[5] = out6;
183
184 /* increment real input buffer by 4 to process next samples */
185 pSrcReal += 4u;
186
187 /* store result to destination bufer */
188 pCmplxDst[6] = out7;
189 pCmplxDst[7] = out8;
190
191 /* increment destination buffer by 8 to process next sampels */
192 pCmplxDst += 8u;
193
194 /* Decrement the numSamples loop counter */
195 blkCnt--;
196 }
197
198 /* If the numSamples is not a multiple of 4, compute any remaining output samples here.
199 ** No loop unrolling is used. */
200 blkCnt = numSamples % 0x4u;
201
202 #else
203
204 /* Run the below code for Cortex-M0 */
205 blkCnt = numSamples;
206
207 #endif /* #ifndef ARM_MATH_CM0_FAMILY */
208
209 while(blkCnt > 0u)
210 {
211 /* C[2 * i] = A[2 * i] * B[i]. */
212 /* C[2 * i + 1] = A[2 * i + 1] * B[i]. */
213 in = *pSrcReal++;
214 /* store the result in the destination buffer. */
215 *pCmplxDst++ = (*pSrcCmplx++) * (in);
216 *pCmplxDst++ = (*pSrcCmplx++) * (in);
217
218 /* Decrement the numSamples loop counter */
219 blkCnt--;
220 }
221 }
222
223 /**
224 * @} end of CmplxByRealMult group
225 */
Imprint / Impressum