@@ -201,6 +201,71 @@ static void hexstr_print(hexstr_t *h, FILE *out)
201201
202202#define TOLERANCE (0.2f) // 20% tolerance should still discern between the pulse widths: 0.33, 0.66, 1.0
203203
204+ /// Check the statistics of a pulse data structure and return a summary.
205+ int pulse_analyzer_check (pulse_data_t * data , int package_type , r_device * device )
206+ {
207+ (void )package_type ;
208+ (void )device ; // TODO: use device for logging
209+
210+ if (data -> num_pulses == 0 ) {
211+ fprintf (stderr , "Skipping frame without pulses\n" );
212+ return 0 ;
213+ }
214+
215+ // Generate pulse period data (pulse + gap, trailing gap)
216+ pulse_data_t pulse_periods_pg = {0 };
217+ pulse_periods_pg .num_pulses = data -> num_pulses ;
218+ for (unsigned n = 0 ; n < pulse_periods_pg .num_pulses ; ++ n ) {
219+ pulse_periods_pg .pulse [n ] = data -> pulse [n ] + data -> gap [n ];
220+ }
221+ // Generate pulse period data (gap + pulse, leading gap)
222+ pulse_data_t pulse_periods_gp = {0 };
223+ pulse_periods_gp .num_pulses = data -> num_pulses ;
224+ pulse_periods_gp .pulse [0 ] = data -> pulse [0 ];
225+ for (unsigned n = 1 ; n < pulse_periods_gp .num_pulses ; ++ n ) {
226+ pulse_periods_gp .pulse [n ] = data -> pulse [n ] + data -> gap [n - 1 ];
227+ }
228+
229+ histogram_t hist_pulses = {0 };
230+ histogram_t hist_gaps = {0 };
231+ histogram_t hist_periods_pg = {0 }; // Pulse+Gap periods
232+ histogram_t hist_periods_gp = {0 }; // Gap+Pulse periods
233+ histogram_t hist_timings = {0 };
234+
235+ // Generate statistics
236+ histogram_sum (& hist_pulses , data -> pulse , data -> num_pulses , TOLERANCE );
237+ histogram_sum (& hist_gaps , data -> gap , data -> num_pulses - 1 , TOLERANCE ); // Leave out last gap (end)
238+ histogram_sum (& hist_periods_pg , pulse_periods_pg .pulse , pulse_periods_pg .num_pulses - 1 , TOLERANCE ); // Leave out last gap (end)
239+ histogram_sum (& hist_periods_gp , pulse_periods_gp .pulse , pulse_periods_gp .num_pulses , TOLERANCE );
240+ histogram_sum (& hist_timings , data -> pulse , data -> num_pulses , TOLERANCE );
241+ histogram_sum (& hist_timings , data -> gap , data -> num_pulses , TOLERANCE );
242+
243+ // Fuse overlapping bins
244+ histogram_fuse_bins (& hist_pulses , TOLERANCE );
245+ histogram_fuse_bins (& hist_gaps , TOLERANCE );
246+ histogram_fuse_bins (& hist_periods_pg , TOLERANCE );
247+ histogram_fuse_bins (& hist_timings , TOLERANCE );
248+
249+ histogram_sort_mean (& hist_pulses ); // Easier to work with sorted data
250+ histogram_sort_mean (& hist_gaps );
251+ if (hist_pulses .bins [0 ].mean == 0 ) {
252+ histogram_delete_bin (& hist_pulses , 0 );
253+ } // Remove FSK initial zero-bin
254+
255+ // Attempt to find a matching modulation
256+ if (data -> num_pulses == 1 ) {
257+ fprintf (stderr , "Skipping frame with single pulse\n" );
258+ return 0 ;
259+ }
260+ else if (hist_pulses .bins_count == 1 && hist_gaps .bins_count == 1 ) {
261+ fprintf (stderr , "Skipping frame with no data\n" );
262+ return 0 ;
263+ }
264+
265+ fprintf (stderr , "Frame with %u bins found\n" , hist_pulses .bins_count + hist_gaps .bins_count );
266+ return 1 ;
267+ }
268+
204269/// Analyze the statistics of a pulse data structure and print result
205270void pulse_analyzer (pulse_data_t * data , int package_type , r_device * device )
206271{
0 commit comments