int main(){ const int length = 5; float input[length] = {-0.665365, -0.329988, 0.164465, 0.043962, 0.295885}; float output[length]; // array for storing Kalman processed values float temp[length]; // array for storing subtraction results float temp2[length]; float miscresult[2] = {0, 0}; // array for storing mean and std dev results float holder[length]; // array for storing convolution results int i, j; float corr_temp[1] = {0}; /*START OF PART II*/ kalman_state kstate; reset(&kstate); //Kalmanfilter_C(input, output, &kstate, length); Kalmanfilter_asm(output, input, length, &kstate); printf("\n"); /*END OF PART II*/ /*START OF PART III*/ // subtract printf("subtraction:\n"); subtract(temp, input, output, length); arm_sub_f32(input, output, temp2, length); for(j = 0; j < length; j++){ printf("My implementation: %f CMSIS: %f\n", temp[j], temp2[j]); } // misc printf("\n"); //misc(miscresult, temp, length); arm_mean_f32(temp, length, &miscresult[0]); arm_std_f32(temp, length, &miscresult[1]); printf("mean: %f stdev: %f\n", miscresult[0], miscresult[1]); // correlation //corr_temp[0] = correlation(input, output, length); arm_correlate_f32(input, length, output, length, &corr_temp[0]); printf("correlation: %f\n", corr_temp[0]); // convolution printf("\n"); for(i = 0; i < length; i++){ holder[i] = 0; } convolve(holder, input, output, length); //arm_conv_f32(input, length, output, length, holder); for(i = 0; i < length; i++){ printf("convolution %f \n", holder[i]); } /*END OF PART III*/ return 0; }
void FloatArray::correlateInitialized(FloatArray operand2, FloatArray destination){ ASSERT(destination.size >= size+operand2.size-1, "Destination array too small"); //TODO: change CMSIS docs, which state a different 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 arm_correlate_f32(data, size, operand2.data, operand2.size, destination); #else //correlation is the same as a convolution where one of the signals is flipped in time //so we flip in time operand2 operand2.reverse(); //and convolve it with fa to obtain the correlation convolve(operand2, destination); //and we flip back operand2, so that the input is not modified operand2.reverse(); #endif /* ARM_CORTEX */ }
// ARM DSP Function **************************************************************************************** int dsp_arm(float* inputArray, float* outputArray, dsp_t* analysisOut) { // Get diffence Array arm_sub_f32(outputArray, inputArray, analysisOut->diffArr, ARRAY_LENGTH); // Get mean arm_mean_f32(analysisOut->diffArr, (uint32_t) ARRAY_LENGTH, &analysisOut->meanDiff); // Get standard deviation arm_std_f32(analysisOut->diffArr, (uint32_t) ARRAY_LENGTH, &analysisOut->standDevDiff); // Get correlation arm_correlate_f32(inputArray, ARRAY_LENGTH, outputArray, ARRAY_LENGTH, analysisOut->corrArr); // Get convolution arm_conv_f32(inputArray, ARRAY_LENGTH, outputArray, ARRAY_LENGTH, analysisOut->convolArr); return 0; }
int main() { //initialize testing array float testVector[] = {0.1f,0.2f,0.3f,0.4f,0.5f}; /*COMMENTED OUT LENGTH PARAM AS IT IS INCLUDED IN HEADER FILE*/ //get the size of the array //int length = sizeof(testVector)/sizeof(float); //initiate empty output array of size length float outputArrayC[length]; //initialize the struct at p=r=q 0.1 and x=k=0 kalman_state currentState = {0.1f, 0.1f, 0.0f , 0.1f, 0.0f}; //call function Kalmanfilter_C Kalmanfilter_C(measurements, outputArrayC, ¤tState, length); //initiate empty output array of size length float outputArrayASM[length]; //reinitialize the struct at p=r=q 0.1 and x=k=0 currentState.p = DEF_p; currentState.r = DEF_r; currentState.k = DEF_k; currentState.q = DEF_q; currentState.x = DEF_x; //call subroutine Kalmanfilter_asm Kalmanfilter_asm(measurements, outputArrayASM, ¤tState, length ); //Check for correctness with a error tolerance of 0.000001 float errorTolerance = 0.000001f; float errorPercentage = 0.01; //is_valid(outputArrayC, outputArrayASM, length, errorTolerance, "c vs asm"); //is_valid_relative(outputArrayC, outputArrayASM, length, errorTolerance, errorPercentage,"c vs asm"); int p; //print KalmanFilter output for ( p = 0; p < length; p++ ) { printf("OutputASM: %f & OutputC %f\n", outputArrayASM[p], outputArrayC[p]); } float differenceC[length]; float differenceCMSIS[length]; //Difference arm_sub_f32 (measurements, outputArrayC, differenceCMSIS, length); c_sub(measurements, outputArrayC, differenceC, length); //is_valid(differenceC, differenceCMSIS, length, errorTolerance, "Difference"); //is_valid_relative(differenceC, differenceCMSIS, length, errorTolerance, errorPercentage,"Difference"); //Print difference vector for ( p = 0; p < length; p++ ) { printf("DifferenceC: %f & DifferenceCMSIS %f \n", differenceC[p], differenceCMSIS[p]); } //Mean float meanCMSIS; float meanC; arm_mean_f32 (differenceCMSIS, length , &meanCMSIS); c_mean(differenceC,length, &meanC); //is_valid(&meanC, &meanCMSIS, 1, errorTolerance, "mean"); //is_valid_relative(&meanC, &meanCMSIS, 1, errorTolerance, errorPercentage, "mean"); //Print mean values printf("MeanC: %f & MeanCMSIS %f \n", meanC, meanCMSIS); //STD float stdC; float stdCMSIS; arm_std_f32 (differenceCMSIS, length, &stdCMSIS); c_std(differenceC, length, &stdC); //is_valid(&stdC, &stdCMSIS, 1, errorTolerance, "STD"); //is_valid_relative(&stdC, &stdCMSIS, 1, errorTolerance, errorPercentage,"STD"); //Print std values printf("StandardDevC: %f & StandardDevCMSIS %f \n", stdC, stdCMSIS); //correlation float corC[2*length-1]; float corCMSIS[2*length-1]; arm_correlate_f32 (measurements, length, outputArrayC, length, corCMSIS); c_correlate(measurements, outputArrayC, corC, length); //is_valid(corC, corCMSIS, 2*length-1, errorTolerance, "correlation"); //is_valid_relative(corC, corCMSIS, 2*length-1, errorTolerance, errorPercentage, "correlation"); //convolution float convC[2*length-1]; float convCMSIS[2*length-1]; arm_conv_f32 (measurements, length, outputArrayC, length, convCMSIS); c_conv(measurements, outputArrayC, convC, length); //is_valid(convC, convCMSIS, 2*length-1, errorTolerance, "convolution"); //is_valid_relative(convC, convCMSIS, 2*length-1, errorTolerance, errorPercentage, "convolution"); //Print correlation and convolution values for ( p = 0; p < (2*length-1); p++ ) { printf("ConvC: %f & ConvCMSIS: %f \n", convC[p], convCMSIS[p]); } for ( p = 0; p < (2*length-1); p++ ) { printf("CorrelateC: %f & CorrelatCMSIS: %f \n", corC[p], corCMSIS[p]); } return 0; }