Subversion Repositories LedShow

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 mjames 1
/* ----------------------------------------------------------------------    
2
* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
3
*    
4
* $Date:        19. March 2015
5
* $Revision:    V.1.4.5
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
 */