int32_t main(void) { float32_t diff; uint32_t i; for(i=0; i< blockSize; i++) { cosOutput = arm_cos_f32(testInput_f32[i]); sinOutput = arm_sin_f32(testInput_f32[i]); arm_mult_f32(&cosOutput, &cosOutput, &cosSquareOutput, 1); arm_mult_f32(&sinOutput, &sinOutput, &sinSquareOutput, 1); arm_add_f32(&cosSquareOutput, &sinSquareOutput, &testOutput, 1); /* absolute value of difference between ref and test */ diff = fabsf(testRefOutput_f32 - testOutput); /* Comparison of sin_cos value with reference */ if(diff > DELTA) { status = ARM_MATH_TEST_FAILURE; } if( status == ARM_MATH_TEST_FAILURE) { while(1); } } while(1); /* main function does not return */ }
/* ---------------------------------------------------------------------- * Variance calculation test * ------------------------------------------------------------------- */ int main(void) { arm_status status; float32_t mean; float32_t oneByBlockSize = 1.0 / (blockSize); float32_t variance; float32_t diff; status = ARM_MATH_SUCCESS; puts("ARM DSP lib test"); puts("Note: This test is using 32 bit IEEE 754 floating point numbers," "(24 bit mantissa, 7 bit exponent)"); puts("Expect roughly 7 decimals precision on the result."); /* Calculation of mean value of input */ /* x' = 1/blockSize * (x(0)* 1 + x(1) * 1 + ... + x(n-1) * 1) */ /* Fill wire1 buffer with 1.0 value */ arm_fill_f32(1.0, wire1, blockSize); /* Calculate the dot product of wire1 and wire2 */ /* (x(0)* 1 + x(1) * 1 + ...+ x(n-1) * 1) */ arm_dot_prod_f32(testInput_f32, wire1, blockSize, &mean); /* 1/blockSize * (x(0)* 1 + x(1) * 1 + ... + x(n-1) * 1) */ arm_mult_f32(&mean, &oneByBlockSize, &mean, 1); /* Calculation of variance value of input */ /* (1/blockSize) * (x(0) - x') * (x(0) - x') + (x(1) - x') * (x(1) - x') + ... + (x(n-1) - x') * (x(n-1) - x') */ /* Fill wire2 with mean value x' */ arm_fill_f32(mean, wire2, blockSize); /* wire3 contains (x-x') */ arm_sub_f32(testInput_f32, wire2, wire3, blockSize); /* wire2 contains (x-x') */ arm_copy_f32(wire3, wire2, blockSize); /* (x(0) - x') * (x(0) - x') + (x(1) - x') * (x(1) - x') + ... + (x(n-1) - x') * (x(n-1) - x') */ arm_dot_prod_f32(wire2, wire3, blockSize, &variance); /* Calculation of 1/blockSize */ oneByBlockSize = 1.0 / (blockSize - 1); /* Calculation of variance */ arm_mult_f32(&variance, &oneByBlockSize, &variance, 1); /* absolute value of difference between ref and test */ diff = variance - refVarianceOut; /* Split into fractional and integral parts, since printing floats may not be supported on all platforms */ float int_part; float frac_part = fabsf(modff(variance, &int_part)); printf(" dsp: %3d.%09d\n", (int) int_part, (int) (frac_part * 1.0e9f + 0.5f)); puts( "reference: 0.903941793931839"); frac_part = fabsf(modff(diff, &int_part)); printf(" diff: %3d.%09d\n", (int) int_part, (int) (frac_part * 1.0e9f + 0.5f)); /* Comparison of variance value with reference */ if(fabsf(diff) > DELTA) { status = ARM_MATH_TEST_FAILURE; } if(status != ARM_MATH_SUCCESS) { puts("Test failed"); while(1) ; } puts("Test done"); while(1) ; /* main function does not return */ }
int32_t main(void) { uint32_t i; /* Loop counter */ float32_t diff; /* Difference between reference and test outputs */ /* Multiplication of two input buffers */ arm_mult_f32(srcA_buf_f32, srcB_buf_f32, multOutput, MAX_BLOCKSIZE); /* Accumulate the multiplication output values to get the dot product of the two inputs */ for(i=0; i< MAX_BLOCKSIZE; i++) { arm_add_f32(&testOutput, &multOutput[i], &testOutput, 1); } /* absolute value of difference between ref and test */ diff = fabsf(refDotProdOut - testOutput); /* Comparison of dot product value with reference */ if(diff > DELTA) { status = ARM_MATH_TEST_FAILURE; } if( status == ARM_MATH_TEST_FAILURE) { while(1); } }
int32_t main(void) { float32_t diff; uint32_t i; printf("Starting Test...\n"); for (i=0; i < blockSize; i++) { cosOutput = arm_cos_f32(testInput_f32[i]); printf("Cos %f = %f\n", testInput_f32[i], cosOutput); sinOutput = arm_sin_f32(testInput_f32[i]); printf("Sin %f = %f\n", testInput_f32[i], sinOutput); arm_mult_f32(&cosOutput, &cosOutput, &cosSquareOutput, 1); printf("Cos squared %f = %f\n", cosOutput, cosSquareOutput); arm_mult_f32(&sinOutput, &sinOutput, &sinSquareOutput, 1); printf("Sin squared %f = %f\n", sinOutput, sinSquareOutput); arm_add_f32(&cosSquareOutput, &sinSquareOutput, &testOutput, 1); printf("Add %f and %f = %f\n", cosSquareOutput, sinSquareOutput, testOutput); /* absolute value of difference between ref and test */ diff = fabsf(testRefOutput_f32 - testOutput); /* Comparison of sin_cos value with reference */ if (diff > DELTA) { printf("Diff failure %f\n", diff); exit(EXIT_FAILURE); /* just for QEMU testing */ while(1); } } printf("Ending Test...\n"); exit(EXIT_SUCCESS); /* just for QEMU testing */ while(1); /* main function does not return */ }
void FloatArray::multiply(FloatArray operand2, FloatArray destination){ //allows in-place ASSERT(operand2.size == size && destination.size==size, "Arrays must be same size"); /// @note When built for ARM Cortex-M processor series, this method uses the optimized <a href="http://www.keil.com/pack/doc/CMSIS/General/html/index.html">CMSIS library</a> #ifdef ARM_CORTEX /* despite not explicitely documented in the CMSIS documentation, this has been tested to behave properly even when pSrcA==pDst void arm_mult_f32 (float32_t *pSrcA, float32_t *pSrcB, float32_t *pDst, uint32_t blockSize) */ arm_mult_f32(data, operand2.data, destination, size); #else for(int n=0; n<size; n++){ destination[n]=data[n]*operand2[n]; } #endif /* ARM_CORTEX */ }
int32_t main(void) { arm_status status; float32_t mean, oneByBlockSize; float32_t variance; float32_t diff; status = ARM_MATH_SUCCESS; /* Calculation of mean value of input */ /* x' = 1/blockSize * (x(0)* 1 + x(1) * 1 + ... + x(n-1) * 1) */ /* Fill wire1 buffer with 1.0 value */ arm_fill_f32(1.0, wire1, blockSize); /* Calculate the dot product of wire1 and wire2 */ /* (x(0)* 1 + x(1) * 1 + ...+ x(n-1) * 1) */ arm_dot_prod_f32(testInput_f32, wire1, blockSize, &mean); /* Calculation of 1/blockSize */ oneByBlockSize = 1.0 / (blockSize); /* 1/blockSize * (x(0)* 1 + x(1) * 1 + ... + x(n-1) * 1) */ arm_mult_f32(&mean, &oneByBlockSize, &mean, 1); /* Calculation of variance value of input */ /* (1/blockSize) * (x(0) - x') * (x(0) - x') + (x(1) - x') * (x(1) - x') + ... + (x(n-1) - x') * (x(n-1) - x') */ /* Fill wire2 with mean value x' */ arm_fill_f32(mean, wire2, blockSize); /* wire3 contains (x-x') */ arm_sub_f32(testInput_f32, wire2, wire3, blockSize); /* wire2 contains (x-x') */ arm_copy_f32(wire3, wire2, blockSize); /* (x(0) - x') * (x(0) - x') + (x(1) - x') * (x(1) - x') + ... + (x(n-1) - x') * (x(n-1) - x') */ arm_dot_prod_f32(wire2, wire3, blockSize, &variance); /* Calculation of 1/blockSize */ oneByBlockSize = 1.0 / (blockSize - 1); /* Calculation of variance */ arm_mult_f32(&variance, &oneByBlockSize, &variance, 1); /* absolute value of difference between ref and test */ diff = fabsf(refVarianceOut - variance); /* Comparison of variance value with reference */ if(diff > DELTA) { status = ARM_MATH_TEST_FAILURE; } if( status != ARM_MATH_SUCCESS) { while(1); } }