@@ -68,14 +68,12 @@ MldpReturn_t filterStdDev(const float *data_in, const int in_size, float *data_o
6868 return mean_result ;
6969 }
7070
71- float std = 0 ;
72- float f = 0 ;
71+ float sum_of_squares = 0 ;
7372 for (int i = 0 ; i < in_size ; i ++ ) {
74- f = data_in [i ] - mean ;
75- std += f * f ;
73+ float f = data_in [i ] - mean ;
74+ sum_of_squares += f * f ;
7675 }
77- std /= (float )in_size ;
78- * data_out = sqrtf (std );
76+ * data_out = sqrtf (sum_of_squares / (float )in_size );
7977
8078 return MLDP_SUCCESS ;
8179}
@@ -85,39 +83,39 @@ MldpReturn_t filterStdDev(const float *data_in, const int in_size, float *data_o
8583// so ensure DEVICE_STACK_SIZE is appropriately set
8684// TODO: Move to the heap, pxt automatically uses its allocator
8785MldpReturn_t filterPeaks (const float * data_in , const int in_size , float * data_out , const int out_size ) {
88- if (in_size < 5 || out_size != 1 ) {
89- return MLDP_ERROR_CONFIG ;
90- }
91-
9286 const int lag = 5 ;
9387 const float threshold = 3.5 ;
9488 const float influence = 0.5 ;
95- int peaksCounter = 0 ;
89+
90+ if (in_size < (5 + 2 ) || out_size != 1 ) {
91+ return MLDP_ERROR_CONFIG ;
92+ }
9693
9794 float signals [in_size ];
98- float filteredY [in_size ];
95+ float filtered_y [in_size ];
9996 float lead_in [lag ];
100- float avgFilter [in_size ];
101- float stdFilter [in_size ];
97+ float avg_filter [in_size ];
98+ float std_filter [in_size ];
10299 memset (signals , 0 , in_size * sizeof (float ));
103- memcpy (filteredY , data_in , in_size * sizeof (float ));
100+ memcpy (filtered_y , data_in , in_size * sizeof (float ));
104101 memcpy (lead_in , data_in , lag * sizeof (float ));
105102
106- float mean_lag , stdDev_lag ;
103+ float mean_lag , std_dev_lag ;
107104 MldpReturn_t mean_result = filterMean (lead_in , lag , & mean_lag , 1 );
108- MldpReturn_t stdDev_result = filterStdDev (lead_in , lag , & stdDev_lag , 1 );
109- if (stdDev_result != MLDP_SUCCESS || mean_result != MLDP_SUCCESS ) {
105+ MldpReturn_t std_dev_result = filterStdDev (lead_in , lag , & std_dev_lag , 1 );
106+ if (std_dev_result != MLDP_SUCCESS || mean_result != MLDP_SUCCESS ) {
110107 return MLDP_ERROR_CONFIG ;
111108 }
112109
113- avgFilter [lag - 1 ] = mean_lag ;
114- stdFilter [lag - 1 ] = stdDev_lag ;
110+ avg_filter [lag - 1 ] = mean_lag ;
111+ std_filter [lag - 1 ] = std_dev_lag ;
115112
113+ int peaksCounter = 0 ;
116114 for (int i = lag ; i < in_size ; i ++ ) {
117- if (fabsf (data_in [i ] - avgFilter [i - 1 ]) > 0.1f &&
118- fabsf (data_in [i ] - avgFilter [i - 1 ]) > threshold * stdFilter [i - 1 ]
115+ if (fabsf (data_in [i ] - avg_filter [i - 1 ]) > 0.1f &&
116+ fabsf (data_in [i ] - avg_filter [i - 1 ]) > threshold * std_filter [i - 1 ]
119117 ) {
120- if (data_in [i ] > avgFilter [i - 1 ]) {
118+ if (data_in [i ] > avg_filter [i - 1 ]) {
121119 signals [i ] = +1 ; // positive signal
122120 if (i - 1 > 0 && signals [i - 1 ] == 0 ) {
123121 peaksCounter ++ ;
@@ -126,19 +124,19 @@ MldpReturn_t filterPeaks(const float *data_in, const int in_size, float *data_ou
126124 signals [i ] = -1 ; // negative signal
127125 }
128126 // make influence lower
129- filteredY [i ] = influence * data_in [i ] + (1.0f - influence ) * filteredY [i - 1 ];
127+ filtered_y [i ] = influence * data_in [i ] + (1.0f - influence ) * filtered_y [i - 1 ];
130128 } else {
131129 signals [i ] = 0 ; // no signal
132- filteredY [i ] = data_in [i ];
130+ filtered_y [i ] = data_in [i ];
133131 }
134132
135133 // adjust the filters
136134 float y_lag [lag ];
137- memcpy (y_lag , & filteredY [i - lag ], lag * sizeof (float ));
135+ memcpy (y_lag , & filtered_y [i - lag ], lag * sizeof (float ));
138136 filterMean (y_lag , lag , & mean_lag , 1 );
139- filterStdDev (y_lag , lag , & stdDev_lag , 1 );
140- avgFilter [i ] = mean_lag ;
141- stdFilter [i ] = stdDev_lag ;
137+ filterStdDev (y_lag , lag , & std_dev_lag , 1 );
138+ avg_filter [i ] = mean_lag ;
139+ std_filter [i ] = std_dev_lag ;
142140 }
143141 * data_out = peaksCounter ;
144142
0 commit comments