1313
1414
1515static float * * input_samples = NULL ;
16+ static float * temp_buffer = NULL ;
1617static int sample_dimensions = 0 ;
1718static int sample_length = 0 ;
1819static int sample_index = 0 ;
20+ static bool buffer_filled = false;
1921static float * output_data = NULL ;
2022static int output_length = 0 ;
2123static MlDataFilters_t * filters = NULL ;
@@ -58,7 +60,7 @@ MldpReturn_t filterDataProcessor_init(const MlDataProcessorConfig_t* config) {
5860 return MLDP_ERROR_ALLOC ;
5961 }
6062
61- // Allocate for each sample dimension
63+ // Allocate for each sample dimension, and the temporary buffer
6264 sample_dimensions = config -> dimensions ;
6365 for (int i = 0 ; i < sample_dimensions ; i ++ ) {
6466 input_samples [i ] = (float * )malloc (config -> samples * sizeof (float ));
@@ -67,6 +69,11 @@ MldpReturn_t filterDataProcessor_init(const MlDataProcessorConfig_t* config) {
6769 return MLDP_ERROR_ALLOC ;
6870 }
6971 }
72+ temp_buffer = (float * )malloc (config -> samples * sizeof (float ));
73+ if (temp_buffer == NULL ) {
74+ filterDataProcessor_deinit ();
75+ return MLDP_ERROR_ALLOC ;
76+ }
7077
7178 // Copy the filter pointers
7279 memcpy (filters , config -> filters , config -> filter_size * sizeof (MlDataFilters_t ));
@@ -86,6 +93,7 @@ void filterDataProcessor_deinit() {
8693 free (input_samples [i ]);
8794 }
8895 free (input_samples );
96+ free (temp_buffer );
8997 free (output_data );
9098 free (filters );
9199 input_samples = NULL ;
@@ -111,6 +119,7 @@ MldpReturn_t filterDataProcessor_recordData(const float* samples, const int elem
111119 sample_index ++ ;
112120 if (sample_index >= sample_length ) {
113121 sample_index = 0 ;
122+ buffer_filled = true;
114123 }
115124 }
116125
@@ -120,18 +129,22 @@ MldpReturn_t filterDataProcessor_recordData(const float* samples, const int elem
120129bool filterDataProcessor_isDataReady () {
121130 if (!initialised ) return false;
122131
123- return sample_index == 0 ;
132+ return buffer_filled ;
124133}
125134
126135float * filterDataProcessor_getProcessedData () {
127136 if (!initialised ) return NULL ;
137+ if (!buffer_filled ) return NULL ;
128138
129139 // Run all filters and save their output to output_data
130140 int output_i = 0 ;
131141 for (int filter_i = 0 ; filter_i < filter_size ; filter_i ++ ) {
132142 for (int dimension_i = 0 ; dimension_i < sample_dimensions ; dimension_i ++ ) {
143+ const int elements_left = sample_length - sample_index ;
144+ memcpy (temp_buffer , & input_samples [dimension_i ][sample_index ], elements_left * sizeof (float ));
145+ memcpy (& temp_buffer [elements_left ], input_samples [dimension_i ], sample_index * sizeof (float ));
133146 MldpReturn_t filter_result = filters [filter_i ].filter (
134- input_samples [ dimension_i ] , sample_length ,
147+ temp_buffer , sample_length ,
135148 & output_data [output_i ], filters [filter_i ].out_size
136149 );
137150 if (filter_result != MLDP_SUCCESS ) {
0 commit comments