1 /* ----------------------------------------------------------------------
2 * Copyright (C) 2010 ARM Limited. All rights reserved.
4 * $Date: 29. November 2010
7 * Project: CMSIS DSP Library
8 * Title: arm_sin_cos_example_f32.c
10 * Description: Example code demonstrating sin and cos calculation of input signal.
12 * Target Processor: Cortex-M4/Cortex-M3
15 * Version 1.0.3 2010/11/29
16 * Re-organized the CMSIS folders and updated documentation.
18 * Version 1.0.1 2010/10/05 KK
19 * Production release and review comments incorporated.
21 * Version 1.0.0 2010/09/20 KK
22 * Production release and review comments incorporated.
23 * ------------------------------------------------------------------- */
26 * @ingroup groupExamples
30 * @defgroup SinCosExample SineCosine Example
34 * Demonstrates the Pythagorean trignometric identity with the use of Cosine, Sine, Vector
35 * Multiplication, and Vector Addition functions.
39 * Mathematically, the Pythagorean trignometric identity is defined by the following equation:
40 * <pre>sin(x) * sin(x) + cos(x) * cos(x) = 1</pre>
41 * where \c x is the angle in radians.
45 * \image html sinCos.gif
47 * \par Variables Description:
49 * \li \c testInput_f32 array of input angle in radians
50 * \li \c testOutput stores sum of the squares of sine and cosine values of input angle
52 * \par CMSIS DSP Software Library Functions Used:
60 * \link arm_sin_cos_example_f32.c \endlink
65 /** \example arm_sin_cos_example_f32.c
71 /* ----------------------------------------------------------------------
72 * Defines each of the tests performed
73 * ------------------------------------------------------------------- */
74 #define MAX_BLOCKSIZE 32
75 #define DELTA (0.000001f)
78 /* ----------------------------------------------------------------------
79 * Test input data for Floating point sin_cos example for 32-blockSize
80 * Generated by the MATLAB randn() function
81 * ------------------------------------------------------------------- */
83 const float32_t testInput_f32[MAX_BLOCKSIZE] =
85 -1.244916875853235400, -4.793533929171324800, 0.360705030233248850, 0.827929644170887320, -3.299532218312426900, 3.427441903227623800, 3.422401784294607700, -0.108308165334010680,
86 0.941943896490312180, 0.502609575000365850, -0.537345278736373500, 2.088817392965764500, -1.693168684143455700, 6.283185307179590700, -0.392545884746175080, 0.327893095115825040,
87 3.070147440456292300, 0.170611405884662230, -0.275275082396073010, -2.395492805446796300, 0.847311163536506600, -3.845517018083148800, 2.055818378415868300, 4.672594161978930800,
88 -1.990923030266425800, 2.469305197656249500, 3.609002606064021000, -4.586736582331667500, -4.147080139136136300, 1.643756718868359500, -1.150866392366494800, 1.985805026477433800
93 const float32_t testRefOutput_f32 = 1.000000000;
95 /* ----------------------------------------------------------------------
96 * Declare Global variables
97 * ------------------------------------------------------------------- */
98 uint32_t blockSize = 32;
102 float32_t cosSquareOutput;
103 float32_t sinSquareOutput;
105 /* ----------------------------------------------------------------------
106 * Max magnitude FFT Bin test
107 * ------------------------------------------------------------------- */
116 for(i=0; i< blockSize; i++)
118 cosOutput = arm_cos_f32(testInput_f32[i]);
119 sinOutput = arm_sin_f32(testInput_f32[i]);
121 arm_mult_f32(&cosOutput, &cosOutput, &cosSquareOutput, 1);
122 arm_mult_f32(&sinOutput, &sinOutput, &sinSquareOutput, 1);
124 arm_add_f32(&cosSquareOutput, &sinSquareOutput, &testOutput, 1);
126 /* absolute value of difference between ref and test */
127 diff = fabsf(testRefOutput_f32 - testOutput);
129 /* Comparison of sin_cos value with reference */
132 status = ARM_MATH_TEST_FAILURE;
135 if( status == ARM_MATH_TEST_FAILURE)
142 while(1); /* main function does not return */