Subversion Repositories testOled

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /* ----------------------------------------------------------------------
  2. * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
  3. *
  4. * $Date:         17. January 2013
  5. * $Revision:     V1.4.0
  6. *
  7. * Project:       CMSIS DSP Library
  8. * Title:         arm_dotproduct_example_f32.c
  9. *
  10. * Description:   Example code computing dot product of two vectors.
  11. *
  12. * Target Processor: Cortex-M4/Cortex-M3
  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. /**
  42.  * @ingroup groupExamples
  43.  */
  44.  
  45. /**
  46.  * @defgroup DotproductExample Dot Product Example
  47.  *
  48.  * \par Description:
  49.  * \par
  50.  * Demonstrates the use of the Multiply and Add functions to perform the dot product.
  51.  * The dot product of two vectors is obtained by multiplying corresponding elements
  52.  * and summing the products.
  53.  
  54.  * \par Algorithm:
  55.  * \par
  56.  * The two input vectors \c A and \c B with length \c n, are multiplied element-by-element
  57.  * and then added to obtain dot product.
  58.  * \par
  59.  * This is denoted by the following equation:
  60.  *         <pre>  dotProduct = A[0] * B[0] + A[1] * B[1] + ... + A[n-1] * B[n-1]</pre>
  61.  *
  62.  * \par Block Diagram:
  63.  * \par
  64.  * \image html dotProduct.gif
  65.  *
  66.  * \par Variables Description:
  67.  * \par
  68.  * \li \c srcA_buf_f32 points to first input vector
  69.  * \li \c srcB_buf_f32 points to second input vector
  70.  * \li \c testOutput   stores dot product of the two input vectors.
  71.  *
  72.  * \par CMSIS DSP Software Library Functions Used:
  73.  * \par
  74.  * - arm_mult_f32()
  75.  * - arm_add_f32()
  76.  *
  77.  * <b> Refer  </b>
  78.  * \link arm_dotproduct_example_f32.c \endlink
  79.  *
  80.  */
  81.  
  82.  
  83. /** \example arm_dotproduct_example_f32.c
  84.   */
  85.  
  86. #include <math.h>
  87. #include "arm_math.h"
  88.  
  89. /* ----------------------------------------------------------------------
  90. * Defines each of the tests performed
  91. * ------------------------------------------------------------------- */
  92. #define MAX_BLOCKSIZE     32
  93. #define DELTA           (0.000001f)
  94.  
  95. /* ----------------------------------------------------------------------
  96. * Test input data for Floating point Dot Product example for 32-blockSize
  97. * Generated by the MATLAB randn() function
  98. * ------------------------------------------------------------------- */
  99. /* ----------------------------------------------------------------------
  100. ** Test input data of srcA for blockSize 32
  101. ** ------------------------------------------------------------------- */
  102. float32_t srcA_buf_f32[MAX_BLOCKSIZE] =
  103. {
  104.   -0.4325648115282207,  -1.6655843782380970,  0.1253323064748307,
  105.    0.2876764203585489,  -1.1464713506814637,  1.1909154656429988,
  106.    1.1891642016521031,  -0.0376332765933176,  0.3272923614086541,
  107.    0.1746391428209245,  -0.1867085776814394,  0.7257905482933027,
  108.   -0.5883165430141887,   2.1831858181971011, -0.1363958830865957,
  109.    0.1139313135208096,   1.0667682113591888,  0.0592814605236053,
  110.   -0.0956484054836690,  -0.8323494636500225,  0.2944108163926404,
  111.   -1.3361818579378040,   0.7143245518189522,  1.6235620644462707,
  112.   -0.6917757017022868,   0.8579966728282626,  1.2540014216025324,
  113.   -1.5937295764474768,  -1.4409644319010200,  0.5711476236581780,
  114.   -0.3998855777153632,   0.6899973754643451
  115. };
  116.  
  117. /* ----------------------------------------------------------------------
  118. ** Test input data of srcB for blockSize 32
  119. ** ------------------------------------------------------------------- */
  120. float32_t srcB_buf_f32[MAX_BLOCKSIZE] =
  121. {
  122.    1.7491401329284098,  0.1325982188803279,   0.3252281811989881,
  123.   -0.7938091410349637,  0.3149236145048914,  -0.5272704888029532,
  124.    0.9322666565031119,  1.1646643544607362,  -2.0456694357357357,
  125.   -0.6443728590041911,  1.7410657940825480,   0.4867684246821860,
  126.    1.0488288293660140,  1.4885752747099299,   1.2705014969484090,
  127.   -1.8561241921210170,  2.1343209047321410,   1.4358467535865909,
  128.   -0.9173023332875400, -1.1060770780029008,   0.8105708062681296,
  129.    0.6985430696369063, -0.4015827425012831,   1.2687512030669628,
  130.   -0.7836083053674872,  0.2132664971465569,   0.7878984786088954,
  131.    0.8966819356782295, -0.1869172943544062,   1.0131816724341454,
  132.    0.2484350696132857,  0.0596083377937976
  133. };
  134.  
  135. /* Reference dot product output */
  136. float32_t  refDotProdOut = 5.9273644806352142;
  137.  
  138. /* ----------------------------------------------------------------------
  139. * Declare Global variables
  140. * ------------------------------------------------------------------- */
  141. float32_t multOutput[MAX_BLOCKSIZE];  /* Intermediate output */
  142. float32_t testOutput;  /* Final ouput */
  143.  
  144. arm_status status;   /* Status of the example */
  145.  
  146. int32_t main(void)
  147. {
  148.   uint32_t i;       /* Loop counter */
  149.   float32_t diff;     /* Difference between reference and test outputs */
  150.  
  151.   /* Multiplication of two input buffers */
  152.   arm_mult_f32(srcA_buf_f32, srcB_buf_f32, multOutput, MAX_BLOCKSIZE);
  153.  
  154.   /* Accumulate the multiplication output values to
  155.      get the dot product of the two inputs */
  156.   for(i=0; i< MAX_BLOCKSIZE; i++)
  157.   {
  158.     arm_add_f32(&testOutput, &multOutput[i], &testOutput, 1);
  159.   }
  160.  
  161.   /* absolute value of difference between ref and test */
  162.   diff = fabsf(refDotProdOut - testOutput);
  163.  
  164.   /* Comparison of dot product value with reference */
  165.   if (diff > DELTA)
  166.   {
  167.     status = ARM_MATH_TEST_FAILURE;
  168.   }
  169.  
  170.   if ( status == ARM_MATH_TEST_FAILURE)
  171.   {
  172.     while (1);
  173.   }
  174.  
  175.   while (1);                             /* main function does not return */
  176. }
  177.  
  178.  /** \endlink */
  179.