1 /******************************************************************************
2  * @file     statistics_functions.h
3  * @brief    Public header file for CMSIS DSP Library
4  * @version  V1.10.1
5  * @date     14 July 2022
6  * Target Processor: Cortex-M and Cortex-A cores
7  ******************************************************************************/
8 /*
9  * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
10  *
11  * SPDX-License-Identifier: Apache-2.0
12  *
13  * Licensed under the Apache License, Version 2.0 (the License); you may
14  * not use this file except in compliance with the License.
15  * You may obtain a copy of the License at
16  *
17  * www.apache.org/licenses/LICENSE-2.0
18  *
19  * Unless required by applicable law or agreed to in writing, software
20  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
21  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22  * See the License for the specific language governing permissions and
23  * limitations under the License.
24  */
25 
26 
27 #ifndef STATISTICS_FUNCTIONS_H_
28 #define STATISTICS_FUNCTIONS_H_
29 
30 #include "arm_math_types.h"
31 #include "arm_math_memory.h"
32 
33 #include "dsp/none.h"
34 #include "dsp/utils.h"
35 
36 #include "dsp/basic_math_functions.h"
37 #include "dsp/fast_math_functions.h"
38 
39 #ifdef   __cplusplus
40 extern "C"
41 {
42 #endif
43 
44 
45 /**
46  * @defgroup groupStats Statistics Functions
47  */
48 
49 /**
50  * @brief Computation of the LogSumExp
51  *
52  * In probabilistic computations, the dynamic of the probability values can be very
53  * wide because they come from gaussian functions.
54  * To avoid underflow and overflow issues, the values are represented by their log.
55  * In this representation, multiplying the original exp values is easy : their logs are added.
56  * But adding the original exp values is requiring some special handling and it is the
57  * goal of the LogSumExp function.
58  *
59  * If the values are x1...xn, the function is computing:
60  *
61  * ln(exp(x1) + ... + exp(xn)) and the computation is done in such a way that
62  * rounding issues are minimised.
63  *
64  * The max xm of the values is extracted and the function is computing:
65  * xm + ln(exp(x1 - xm) + ... + exp(xn - xm))
66  *
67  * @param[in]  *in         Pointer to an array of input values.
68  * @param[in]  blockSize   Number of samples in the input array.
69  * @return LogSumExp
70  *
71  */
72 
73 
74 float32_t arm_logsumexp_f32(const float32_t *in, uint32_t blockSize);
75 
76 /**
77  * @brief Dot product with log arithmetic
78  *
79  * Vectors are containing the log of the samples
80  *
81  * @param[in]       pSrcA points to the first input vector
82  * @param[in]       pSrcB points to the second input vector
83  * @param[in]       blockSize number of samples in each vector
84  * @param[in]       pTmpBuffer temporary buffer of length blockSize
85  * @return The log of the dot product .
86  *
87  */
88 
89 
90 float32_t arm_logsumexp_dot_prod_f32(const float32_t * pSrcA,
91   const float32_t * pSrcB,
92   uint32_t blockSize,
93   float32_t *pTmpBuffer);
94 
95 /**
96  * @brief Entropy
97  *
98  * @param[in]  pSrcA        Array of input values.
99  * @param[in]  blockSize    Number of samples in the input array.
100  * @return     Entropy      -Sum(p ln p)
101  *
102  */
103 
104 
105 float32_t arm_entropy_f32(const float32_t * pSrcA,uint32_t blockSize);
106 
107 
108 /**
109  * @brief Entropy
110  *
111  * @param[in]  pSrcA        Array of input values.
112  * @param[in]  blockSize    Number of samples in the input array.
113  * @return     Entropy      -Sum(p ln p)
114  *
115  */
116 
117 
118 float64_t arm_entropy_f64(const float64_t * pSrcA, uint32_t blockSize);
119 
120 
121 /**
122  * @brief Kullback-Leibler
123  *
124  * @param[in]  pSrcA         Pointer to an array of input values for probability distribution A.
125  * @param[in]  pSrcB         Pointer to an array of input values for probability distribution B.
126  * @param[in]  blockSize     Number of samples in the input array.
127  * @return Kullback-Leibler  Divergence D(A || B)
128  *
129  */
130 float32_t arm_kullback_leibler_f32(const float32_t * pSrcA
131   ,const float32_t * pSrcB
132   ,uint32_t blockSize);
133 
134 
135 /**
136  * @brief Kullback-Leibler
137  *
138  * @param[in]  pSrcA         Pointer to an array of input values for probability distribution A.
139  * @param[in]  pSrcB         Pointer to an array of input values for probability distribution B.
140  * @param[in]  blockSize     Number of samples in the input array.
141  * @return Kullback-Leibler  Divergence D(A || B)
142  *
143  */
144 float64_t arm_kullback_leibler_f64(const float64_t * pSrcA,
145                 const float64_t * pSrcB,
146                 uint32_t blockSize);
147 
148 
149  /**
150    * @brief  Sum of the squares of the elements of a Q31 vector.
151    * @param[in]  pSrc       is input pointer
152    * @param[in]  blockSize  is the number of samples to process
153    * @param[out] pResult    is output value.
154    */
155   void arm_power_q31(
156   const q31_t * pSrc,
157         uint32_t blockSize,
158         q63_t * pResult);
159 
160 
161   /**
162    * @brief  Sum of the squares of the elements of a floating-point vector.
163    * @param[in]  pSrc       is input pointer
164    * @param[in]  blockSize  is the number of samples to process
165    * @param[out] pResult    is output value.
166    */
167   void arm_power_f32(
168   const float32_t * pSrc,
169         uint32_t blockSize,
170         float32_t * pResult);
171 
172 
173   /**
174    * @brief  Sum of the squares of the elements of a floating-point vector.
175    * @param[in]  pSrc       is input pointer
176    * @param[in]  blockSize  is the number of samples to process
177    * @param[out] pResult    is output value.
178    */
179   void arm_power_f64(
180   const float64_t * pSrc,
181         uint32_t blockSize,
182         float64_t * pResult);
183 
184 
185   /**
186    * @brief  Sum of the squares of the elements of a Q15 vector.
187    * @param[in]  pSrc       is input pointer
188    * @param[in]  blockSize  is the number of samples to process
189    * @param[out] pResult    is output value.
190    */
191   void arm_power_q15(
192   const q15_t * pSrc,
193         uint32_t blockSize,
194         q63_t * pResult);
195 
196 
197   /**
198    * @brief  Sum of the squares of the elements of a Q7 vector.
199    * @param[in]  pSrc       is input pointer
200    * @param[in]  blockSize  is the number of samples to process
201    * @param[out] pResult    is output value.
202    */
203   void arm_power_q7(
204   const q7_t * pSrc,
205         uint32_t blockSize,
206         q31_t * pResult);
207 
208 
209   /**
210    * @brief  Mean value of a Q7 vector.
211    * @param[in]  pSrc       is input pointer
212    * @param[in]  blockSize  is the number of samples to process
213    * @param[out] pResult    is output value.
214    */
215   void arm_mean_q7(
216   const q7_t * pSrc,
217         uint32_t blockSize,
218         q7_t * pResult);
219 
220 
221   /**
222    * @brief  Mean value of a Q15 vector.
223    * @param[in]  pSrc       is input pointer
224    * @param[in]  blockSize  is the number of samples to process
225    * @param[out] pResult    is output value.
226    */
227   void arm_mean_q15(
228   const q15_t * pSrc,
229         uint32_t blockSize,
230         q15_t * pResult);
231 
232 
233   /**
234    * @brief  Mean value of a Q31 vector.
235    * @param[in]  pSrc       is input pointer
236    * @param[in]  blockSize  is the number of samples to process
237    * @param[out] pResult    is output value.
238    */
239   void arm_mean_q31(
240   const q31_t * pSrc,
241         uint32_t blockSize,
242         q31_t * pResult);
243 
244 
245   /**
246    * @brief  Mean value of a floating-point vector.
247    * @param[in]  pSrc       is input pointer
248    * @param[in]  blockSize  is the number of samples to process
249    * @param[out] pResult    is output value.
250    */
251   void arm_mean_f32(
252   const float32_t * pSrc,
253         uint32_t blockSize,
254         float32_t * pResult);
255 
256 
257   /**
258    * @brief  Mean value of a floating-point vector.
259    * @param[in]  pSrc       is input pointer
260    * @param[in]  blockSize  is the number of samples to process
261    * @param[out] pResult    is output value.
262    */
263   void arm_mean_f64(
264   const float64_t * pSrc,
265         uint32_t blockSize,
266         float64_t * pResult);
267 
268 
269   /**
270    * @brief  Variance of the elements of a floating-point vector.
271    * @param[in]  pSrc       is input pointer
272    * @param[in]  blockSize  is the number of samples to process
273    * @param[out] pResult    is output value.
274    */
275   void arm_var_f32(
276   const float32_t * pSrc,
277         uint32_t blockSize,
278         float32_t * pResult);
279 
280 
281   /**
282    * @brief  Variance of the elements of a floating-point vector.
283    * @param[in]  pSrc       is input pointer
284    * @param[in]  blockSize  is the number of samples to process
285    * @param[out] pResult    is output value.
286    */
287   void arm_var_f64(
288   const float64_t * pSrc,
289         uint32_t blockSize,
290         float64_t * pResult);
291 
292 
293   /**
294    * @brief  Variance of the elements of a Q31 vector.
295    * @param[in]  pSrc       is input pointer
296    * @param[in]  blockSize  is the number of samples to process
297    * @param[out] pResult    is output value.
298    */
299   void arm_var_q31(
300   const q31_t * pSrc,
301         uint32_t blockSize,
302         q31_t * pResult);
303 
304 
305   /**
306    * @brief  Variance of the elements of a Q15 vector.
307    * @param[in]  pSrc       is input pointer
308    * @param[in]  blockSize  is the number of samples to process
309    * @param[out] pResult    is output value.
310    */
311   void arm_var_q15(
312   const q15_t * pSrc,
313         uint32_t blockSize,
314         q15_t * pResult);
315 
316 
317   /**
318    * @brief  Root Mean Square of the elements of a floating-point vector.
319    * @param[in]  pSrc       is input pointer
320    * @param[in]  blockSize  is the number of samples to process
321    * @param[out] pResult    is output value.
322    */
323   void arm_rms_f32(
324   const float32_t * pSrc,
325         uint32_t blockSize,
326         float32_t * pResult);
327 
328 
329   /**
330    * @brief  Root Mean Square of the elements of a Q31 vector.
331    * @param[in]  pSrc       is input pointer
332    * @param[in]  blockSize  is the number of samples to process
333    * @param[out] pResult    is output value.
334    */
335   void arm_rms_q31(
336   const q31_t * pSrc,
337         uint32_t blockSize,
338         q31_t * pResult);
339 
340 
341   /**
342    * @brief  Root Mean Square of the elements of a Q15 vector.
343    * @param[in]  pSrc       is input pointer
344    * @param[in]  blockSize  is the number of samples to process
345    * @param[out] pResult    is output value.
346    */
347   void arm_rms_q15(
348   const q15_t * pSrc,
349         uint32_t blockSize,
350         q15_t * pResult);
351 
352 
353   /**
354    * @brief  Standard deviation of the elements of a floating-point vector.
355    * @param[in]  pSrc       is input pointer
356    * @param[in]  blockSize  is the number of samples to process
357    * @param[out] pResult    is output value.
358    */
359   void arm_std_f32(
360   const float32_t * pSrc,
361         uint32_t blockSize,
362         float32_t * pResult);
363 
364 
365   /**
366    * @brief  Standard deviation of the elements of a floating-point vector.
367    * @param[in]  pSrc       is input pointer
368    * @param[in]  blockSize  is the number of samples to process
369    * @param[out] pResult    is output value.
370    */
371   void arm_std_f64(
372   const float64_t * pSrc,
373         uint32_t blockSize,
374         float64_t * pResult);
375 
376 
377   /**
378    * @brief  Standard deviation of the elements of a Q31 vector.
379    * @param[in]  pSrc       is input pointer
380    * @param[in]  blockSize  is the number of samples to process
381    * @param[out] pResult    is output value.
382    */
383   void arm_std_q31(
384   const q31_t * pSrc,
385         uint32_t blockSize,
386         q31_t * pResult);
387 
388 
389   /**
390    * @brief  Standard deviation of the elements of a Q15 vector.
391    * @param[in]  pSrc       is input pointer
392    * @param[in]  blockSize  is the number of samples to process
393    * @param[out] pResult    is output value.
394    */
395   void arm_std_q15(
396   const q15_t * pSrc,
397         uint32_t blockSize,
398         q15_t * pResult);
399 
400 
401 
402   /**
403    * @brief  Minimum value of a Q7 vector.
404    * @param[in]  pSrc       is input pointer
405    * @param[in]  blockSize  is the number of samples to process
406    * @param[out] pResult     is output pointer
407    * @param[in]  pIndex      is the array index of the minimum value in the input buffer.
408    */
409   void arm_min_q7(
410   const q7_t * pSrc,
411         uint32_t blockSize,
412         q7_t * pResult,
413         uint32_t * pIndex);
414 
415   /**
416    * @brief  Minimum value of absolute values of a Q7 vector.
417    * @param[in]  pSrc       is input pointer
418    * @param[in]  blockSize  is the number of samples to process
419    * @param[out] pResult    is output pointer
420    * @param[in]  pIndex     is the array index of the minimum value in the input buffer.
421    */
422   void arm_absmin_q7(
423   const q7_t * pSrc,
424         uint32_t blockSize,
425         q7_t * pResult,
426         uint32_t * pIndex);
427 
428     /**
429    * @brief  Minimum value of absolute values of a Q7 vector.
430    * @param[in]  pSrc       is input pointer
431    * @param[in]  blockSize  is the number of samples to process
432    * @param[out] pResult    is output pointer
433    */
434   void arm_absmin_no_idx_q7(
435   const q7_t * pSrc,
436         uint32_t blockSize,
437         q7_t * pResult);
438 
439 
440   /**
441    * @brief  Minimum value of a Q15 vector.
442    * @param[in]  pSrc       is input pointer
443    * @param[in]  blockSize  is the number of samples to process
444    * @param[out] pResult    is output pointer
445    * @param[in]  pIndex     is the array index of the minimum value in the input buffer.
446    */
447   void arm_min_q15(
448   const q15_t * pSrc,
449         uint32_t blockSize,
450         q15_t * pResult,
451         uint32_t * pIndex);
452 
453 /**
454    * @brief  Minimum value of absolute values of a Q15 vector.
455    * @param[in]  pSrc       is input pointer
456    * @param[in]  blockSize  is the number of samples to process
457    * @param[out] pResult    is output pointer
458    * @param[in]  pIndex     is the array index of the minimum value in the input buffer.
459    */
460   void arm_absmin_q15(
461   const q15_t * pSrc,
462         uint32_t blockSize,
463         q15_t * pResult,
464         uint32_t * pIndex);
465 
466   /**
467    * @brief  Minimum value of absolute values of a Q15 vector.
468    * @param[in]  pSrc       is input pointer
469    * @param[in]  blockSize  is the number of samples to process
470    * @param[out] pResult    is output pointer
471    */
472   void arm_absmin_no_idx_q15(
473   const q15_t * pSrc,
474         uint32_t blockSize,
475         q15_t * pResult);
476 
477 
478   /**
479    * @brief  Minimum value of a Q31 vector.
480    * @param[in]  pSrc       is input pointer
481    * @param[in]  blockSize  is the number of samples to process
482    * @param[out] pResult    is output pointer
483    * @param[out] pIndex     is the array index of the minimum value in the input buffer.
484    */
485   void arm_min_q31(
486   const q31_t * pSrc,
487         uint32_t blockSize,
488         q31_t * pResult,
489         uint32_t * pIndex);
490 
491   /**
492    * @brief  Minimum value of absolute values of a Q31 vector.
493    * @param[in]  pSrc       is input pointer
494    * @param[in]  blockSize  is the number of samples to process
495    * @param[out] pResult    is output pointer
496    * @param[out] pIndex     is the array index of the minimum value in the input buffer.
497    */
498   void arm_absmin_q31(
499   const q31_t * pSrc,
500         uint32_t blockSize,
501         q31_t * pResult,
502         uint32_t * pIndex);
503 
504  /**
505    * @brief  Minimum value of absolute values of a Q31 vector.
506    * @param[in]  pSrc       is input pointer
507    * @param[in]  blockSize  is the number of samples to process
508    * @param[out] pResult    is output pointer
509    */
510   void arm_absmin_no_idx_q31(
511   const q31_t * pSrc,
512         uint32_t blockSize,
513         q31_t * pResult);
514 
515 
516   /**
517    * @brief  Minimum value of a floating-point vector.
518    * @param[in]  pSrc       is input pointer
519    * @param[in]  blockSize  is the number of samples to process
520    * @param[out] pResult    is output pointer
521    * @param[out] pIndex     is the array index of the minimum value in the input buffer.
522    */
523   void arm_min_f32(
524   const float32_t * pSrc,
525         uint32_t blockSize,
526         float32_t * pResult,
527         uint32_t * pIndex);
528 
529   /**
530    * @brief  Minimum value of absolute values of a floating-point vector.
531    * @param[in]  pSrc       is input pointer
532    * @param[in]  blockSize  is the number of samples to process
533    * @param[out] pResult    is output pointer
534    * @param[out] pIndex     is the array index of the minimum value in the input buffer.
535    */
536   void arm_absmin_f32(
537   const float32_t * pSrc,
538         uint32_t blockSize,
539         float32_t * pResult,
540         uint32_t * pIndex);
541 
542   /**
543    * @brief  Minimum value of absolute values of a floating-point vector.
544    * @param[in]  pSrc       is input pointer
545    * @param[in]  blockSize  is the number of samples to process
546    * @param[out] pResult    is output pointer
547    */
548   void arm_absmin_no_idx_f32(
549   const float32_t * pSrc,
550         uint32_t blockSize,
551         float32_t * pResult);
552 
553 
554   /**
555    * @brief  Minimum value of a floating-point vector.
556    * @param[in]  pSrc       is input pointer
557    * @param[in]  blockSize  is the number of samples to process
558    * @param[out] pResult    is output pointer
559    * @param[out] pIndex     is the array index of the minimum value in the input buffer.
560    */
561   void arm_min_f64(
562   const float64_t * pSrc,
563         uint32_t blockSize,
564         float64_t * pResult,
565         uint32_t * pIndex);
566 
567   /**
568    * @brief  Minimum value of absolute values of a floating-point vector.
569    * @param[in]  pSrc       is input pointer
570    * @param[in]  blockSize  is the number of samples to process
571    * @param[out] pResult    is output pointer
572    * @param[out] pIndex     is the array index of the minimum value in the input buffer.
573    */
574   void arm_absmin_f64(
575   const float64_t * pSrc,
576         uint32_t blockSize,
577         float64_t * pResult,
578         uint32_t * pIndex);
579 
580   /**
581    * @brief  Minimum value of absolute values of a floating-point vector.
582    * @param[in]  pSrc       is input pointer
583    * @param[in]  blockSize  is the number of samples to process
584    * @param[out] pResult    is output pointer
585    */
586   void arm_absmin_no_idx_f64(
587   const float64_t * pSrc,
588         uint32_t blockSize,
589         float64_t * pResult);
590 
591 
592 /**
593  * @brief Maximum value of a Q7 vector.
594  * @param[in]  pSrc       points to the input buffer
595  * @param[in]  blockSize  length of the input vector
596  * @param[out] pResult    maximum value returned here
597  * @param[out] pIndex     index of maximum value returned here
598  */
599   void arm_max_q7(
600   const q7_t * pSrc,
601         uint32_t blockSize,
602         q7_t * pResult,
603         uint32_t * pIndex);
604 
605 /**
606  * @brief Maximum value of absolute values of a Q7 vector.
607  * @param[in]  pSrc       points to the input buffer
608  * @param[in]  blockSize  length of the input vector
609  * @param[out] pResult    maximum value returned here
610  * @param[out] pIndex     index of maximum value returned here
611  */
612   void arm_absmax_q7(
613   const q7_t * pSrc,
614         uint32_t blockSize,
615         q7_t * pResult,
616         uint32_t * pIndex);
617 
618 /**
619  * @brief Maximum value of absolute values of a Q7 vector.
620  * @param[in]  pSrc       points to the input buffer
621  * @param[in]  blockSize  length of the input vector
622  * @param[out] pResult    maximum value returned here
623  */
624   void arm_absmax_no_idx_q7(
625   const q7_t * pSrc,
626         uint32_t blockSize,
627         q7_t * pResult);
628 
629 
630 /**
631  * @brief Maximum value of a Q15 vector.
632  * @param[in]  pSrc       points to the input buffer
633  * @param[in]  blockSize  length of the input vector
634  * @param[out] pResult    maximum value returned here
635  * @param[out] pIndex     index of maximum value returned here
636  */
637   void arm_max_q15(
638   const q15_t * pSrc,
639         uint32_t blockSize,
640         q15_t * pResult,
641         uint32_t * pIndex);
642 
643 /**
644  * @brief Maximum value of absolute values of a Q15 vector.
645  * @param[in]  pSrc       points to the input buffer
646  * @param[in]  blockSize  length of the input vector
647  * @param[out] pResult    maximum value returned here
648  * @param[out] pIndex     index of maximum value returned here
649  */
650   void arm_absmax_q15(
651   const q15_t * pSrc,
652         uint32_t blockSize,
653         q15_t * pResult,
654         uint32_t * pIndex);
655 
656   /**
657  * @brief Maximum value of absolute values of a Q15 vector.
658  * @param[in]  pSrc       points to the input buffer
659  * @param[in]  blockSize  length of the input vector
660  * @param[out] pResult    maximum value returned here
661  */
662   void arm_absmax_no_idx_q15(
663   const q15_t * pSrc,
664         uint32_t blockSize,
665         q15_t * pResult);
666 
667 /**
668  * @brief Maximum value of a Q31 vector.
669  * @param[in]  pSrc       points to the input buffer
670  * @param[in]  blockSize  length of the input vector
671  * @param[out] pResult    maximum value returned here
672  * @param[out] pIndex     index of maximum value returned here
673  */
674   void arm_max_q31(
675   const q31_t * pSrc,
676         uint32_t blockSize,
677         q31_t * pResult,
678         uint32_t * pIndex);
679 
680 /**
681  * @brief Maximum value of absolute values of a Q31 vector.
682  * @param[in]  pSrc       points to the input buffer
683  * @param[in]  blockSize  length of the input vector
684  * @param[out] pResult    maximum value returned here
685  * @param[out] pIndex     index of maximum value returned here
686  */
687   void arm_absmax_q31(
688   const q31_t * pSrc,
689         uint32_t blockSize,
690         q31_t * pResult,
691         uint32_t * pIndex);
692 
693  /**
694  * @brief Maximum value of absolute values of a Q31 vector.
695  * @param[in]  pSrc       points to the input buffer
696  * @param[in]  blockSize  length of the input vector
697  * @param[out] pResult    maximum value returned here
698  */
699   void arm_absmax_no_idx_q31(
700   const q31_t * pSrc,
701         uint32_t blockSize,
702         q31_t * pResult);
703 
704 /**
705  * @brief Maximum value of a floating-point vector.
706  * @param[in]  pSrc       points to the input buffer
707  * @param[in]  blockSize  length of the input vector
708  * @param[out] pResult    maximum value returned here
709  * @param[out] pIndex     index of maximum value returned here
710  */
711   void arm_max_f32(
712   const float32_t * pSrc,
713         uint32_t blockSize,
714         float32_t * pResult,
715         uint32_t * pIndex);
716 
717 /**
718  * @brief Maximum value of absolute values of a floating-point vector.
719  * @param[in]  pSrc       points to the input buffer
720  * @param[in]  blockSize  length of the input vector
721  * @param[out] pResult    maximum value returned here
722  * @param[out] pIndex     index of maximum value returned here
723  */
724   void arm_absmax_f32(
725   const float32_t * pSrc,
726         uint32_t blockSize,
727         float32_t * pResult,
728         uint32_t * pIndex);
729 
730  /**
731  * @brief Maximum value of absolute values of a floating-point vector.
732  * @param[in]  pSrc       points to the input buffer
733  * @param[in]  blockSize  length of the input vector
734  * @param[out] pResult    maximum value returned here
735  */
736   void arm_absmax_no_idx_f32(
737   const float32_t * pSrc,
738         uint32_t blockSize,
739         float32_t * pResult);
740 
741 /**
742  * @brief Maximum value of a floating-point vector.
743  * @param[in]  pSrc       points to the input buffer
744  * @param[in]  blockSize  length of the input vector
745  * @param[out] pResult    maximum value returned here
746  * @param[out] pIndex     index of maximum value returned here
747  */
748   void arm_max_f64(
749   const float64_t * pSrc,
750         uint32_t blockSize,
751         float64_t * pResult,
752         uint32_t * pIndex);
753 
754 /**
755  * @brief Maximum value of absolute values of a floating-point vector.
756  * @param[in]  pSrc       points to the input buffer
757  * @param[in]  blockSize  length of the input vector
758  * @param[out] pResult    maximum value returned here
759  * @param[out] pIndex     index of maximum value returned here
760  */
761   void arm_absmax_f64(
762   const float64_t * pSrc,
763         uint32_t blockSize,
764         float64_t * pResult,
765         uint32_t * pIndex);
766 
767 /**
768  * @brief Maximum value of absolute values of a floating-point vector.
769  * @param[in]  pSrc       points to the input buffer
770  * @param[in]  blockSize  length of the input vector
771  * @param[out] pResult    maximum value returned here
772  */
773   void arm_absmax_no_idx_f64(
774   const float64_t * pSrc,
775         uint32_t blockSize,
776         float64_t * pResult);
777 
778   /**
779     @brief         Maximum value of a floating-point vector.
780     @param[in]     pSrc       points to the input vector
781     @param[in]     blockSize  number of samples in input vector
782     @param[out]    pResult    maximum value returned here
783    */
784   void arm_max_no_idx_f32(
785       const float32_t *pSrc,
786       uint32_t   blockSize,
787       float32_t *pResult);
788 
789   /**
790     @brief         Minimum value of a floating-point vector.
791     @param[in]     pSrc       points to the input vector
792     @param[in]     blockSize  number of samples in input vector
793     @param[out]    pResult    minimum value returned here
794    */
795   void arm_min_no_idx_f32(
796       const float32_t *pSrc,
797       uint32_t   blockSize,
798       float32_t *pResult);
799 
800   /**
801     @brief         Maximum value of a floating-point vector.
802     @param[in]     pSrc       points to the input vector
803     @param[in]     blockSize  number of samples in input vector
804     @param[out]    pResult    maximum value returned here
805    */
806   void arm_max_no_idx_f64(
807       const float64_t *pSrc,
808       uint32_t   blockSize,
809       float64_t *pResult);
810 
811   /**
812     @brief         Maximum value of a q31 vector.
813     @param[in]     pSrc       points to the input vector
814     @param[in]     blockSize  number of samples in input vector
815     @param[out]    pResult    maximum value returned here
816    */
817   void arm_max_no_idx_q31(
818       const q31_t *pSrc,
819       uint32_t   blockSize,
820       q31_t *pResult);
821 
822   /**
823     @brief         Maximum value of a q15 vector.
824     @param[in]     pSrc       points to the input vector
825     @param[in]     blockSize  number of samples in input vector
826     @param[out]    pResult    maximum value returned here
827    */
828   void arm_max_no_idx_q15(
829       const q15_t *pSrc,
830       uint32_t   blockSize,
831       q15_t *pResult);
832 
833   /**
834     @brief         Maximum value of a q7 vector.
835     @param[in]     pSrc       points to the input vector
836     @param[in]     blockSize  number of samples in input vector
837     @param[out]    pResult    maximum value returned here
838    */
839   void arm_max_no_idx_q7(
840       const q7_t *pSrc,
841       uint32_t   blockSize,
842       q7_t *pResult);
843 
844   /**
845     @brief         Minimum value of a floating-point vector.
846     @param[in]     pSrc       points to the input vector
847     @param[in]     blockSize  number of samples in input vector
848     @param[out]    pResult    minimum value returned here
849    */
850   void arm_min_no_idx_f64(
851       const float64_t *pSrc,
852       uint32_t   blockSize,
853       float64_t *pResult);
854 
855 /**
856     @brief         Minimum value of a q31 vector.
857     @param[in]     pSrc       points to the input vector
858     @param[in]     blockSize  number of samples in input vector
859     @param[out]    pResult    minimum value returned here
860    */
861   void arm_min_no_idx_q31(
862       const q31_t *pSrc,
863       uint32_t   blockSize,
864       q31_t *pResult);
865 
866   /**
867     @brief         Minimum value of a q15 vector.
868     @param[in]     pSrc       points to the input vector
869     @param[in]     blockSize  number of samples in input vector
870     @param[out]    pResult    minimum value returned here
871    */
872   void arm_min_no_idx_q15(
873       const q15_t *pSrc,
874       uint32_t   blockSize,
875       q15_t *pResult);
876 
877   /**
878     @brief         Minimum value of a q7 vector.
879     @param[in]     pSrc       points to the input vector
880     @param[in]     blockSize  number of samples in input vector
881     @param[out]    pResult    minimum value returned here
882    */
883 void arm_min_no_idx_q7(
884      const q7_t *pSrc,
885       uint32_t   blockSize,
886       q7_t *pResult);
887 
888 /**
889   @brief         Mean square error between two Q7 vectors.
890   @param[in]     pSrcA       points to the first input vector
891   @param[in]     pSrcB       points to the second input vector
892   @param[in]     blockSize  number of samples in input vector
893   @param[out]    pResult    mean square error
894 */
895 
896 void arm_mse_q7(
897   const q7_t * pSrcA,
898   const q7_t * pSrcB,
899         uint32_t blockSize,
900         q7_t * pResult);
901 
902 /**
903   @brief         Mean square error between two Q15 vectors.
904   @param[in]     pSrcA       points to the first input vector
905   @param[in]     pSrcB       points to the second input vector
906   @param[in]     blockSize  number of samples in input vector
907   @param[out]    pResult    mean square error
908 */
909 
910 void arm_mse_q15(
911   const q15_t * pSrcA,
912   const q15_t * pSrcB,
913         uint32_t blockSize,
914         q15_t * pResult);
915 
916 /**
917   @brief         Mean square error between two Q31 vectors.
918   @param[in]     pSrcA       points to the first input vector
919   @param[in]     pSrcB       points to the second input vector
920   @param[in]     blockSize  number of samples in input vector
921   @param[out]    pResult    mean square error
922 */
923 
924 void arm_mse_q31(
925   const q31_t * pSrcA,
926   const q31_t * pSrcB,
927         uint32_t blockSize,
928         q31_t * pResult);
929 
930 /**
931   @brief         Mean square error between two single precision float vectors.
932   @param[in]     pSrcA       points to the first input vector
933   @param[in]     pSrcB       points to the second input vector
934   @param[in]     blockSize  number of samples in input vector
935   @param[out]    pResult    mean square error
936 */
937 
938 void arm_mse_f32(
939   const float32_t * pSrcA,
940   const float32_t * pSrcB,
941         uint32_t blockSize,
942         float32_t * pResult);
943 
944 /**
945   @brief         Mean square error between two double precision float vectors.
946   @param[in]     pSrcA       points to the first input vector
947   @param[in]     pSrcB       points to the second input vector
948   @param[in]     blockSize  number of samples in input vector
949   @param[out]    pResult    mean square error
950 */
951 
952 void arm_mse_f64(
953   const float64_t * pSrcA,
954   const float64_t * pSrcB,
955         uint32_t blockSize,
956         float64_t * pResult);
957 
958 
959 /**
960  * @brief  Accumulation value of a floating-point vector.
961  * @param[in]  pSrc       is input pointer
962  * @param[in]  blockSize  is the number of samples to process
963  * @param[out] pResult    is output value.
964  */
965 
966 void arm_accumulate_f32(
967 const float32_t * pSrc,
968       uint32_t blockSize,
969       float32_t * pResult);
970 
971 /**
972  * @brief  Accumulation value of a floating-point vector.
973  * @param[in]  pSrc       is input pointer
974  * @param[in]  blockSize  is the number of samples to process
975  * @param[out] pResult    is output value.
976  */
977 
978 void arm_accumulate_f64(
979 const float64_t * pSrc,
980       uint32_t blockSize,
981       float64_t * pResult);
982 
983 
984 #ifdef   __cplusplus
985 }
986 #endif
987 
988 #endif /* ifndef _STATISTICS_FUNCTIONS_H_ */
989