@@ -211,32 +211,41 @@ void pulse_analyzer(pulse_data_t *data, int package_type, r_device* device)
211211
212212 double to_ms = 1e3 / data -> sample_rate ;
213213 double to_us = 1e6 / data -> sample_rate ;
214- // Generate pulse period data
214+ // Generate pulse period data (pulse + gap, trailing gap)
215215 int pulse_total_period = 0 ;
216- pulse_data_t pulse_periods = {0 };
217- pulse_periods .num_pulses = data -> num_pulses ;
218- for (unsigned n = 0 ; n < pulse_periods .num_pulses ; ++ n ) {
219- pulse_periods .pulse [n ] = data -> pulse [n ] + data -> gap [n ];
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 ];
220220 pulse_total_period += data -> pulse [n ] + data -> gap [n ];
221221 }
222- pulse_total_period -= data -> gap [pulse_periods .num_pulses - 1 ];
222+ pulse_total_period -= data -> gap [pulse_periods_pg .num_pulses - 1 ];
223+ // Generate pulse period data (gap + pulse, leading gap)
224+ pulse_data_t pulse_periods_gp = {0 };
225+ pulse_periods_gp .num_pulses = data -> num_pulses ;
226+ pulse_periods_gp .pulse [0 ] = data -> pulse [0 ];
227+ for (unsigned n = 1 ; n < pulse_periods_gp .num_pulses ; ++ n ) {
228+ pulse_periods_gp .pulse [n ] = data -> pulse [n ] + data -> gap [n - 1 ];
229+ }
223230
224231 histogram_t hist_pulses = {0 };
225232 histogram_t hist_gaps = {0 };
226- histogram_t hist_periods = {0 };
233+ histogram_t hist_periods_pg = {0 }; // Pulse+Gap periods
234+ histogram_t hist_periods_gp = {0 }; // Gap+Pulse periods
227235 histogram_t hist_timings = {0 };
228236
229237 // Generate statistics
230238 histogram_sum (& hist_pulses , data -> pulse , data -> num_pulses , TOLERANCE );
231239 histogram_sum (& hist_gaps , data -> gap , data -> num_pulses - 1 , TOLERANCE ); // Leave out last gap (end)
232- histogram_sum (& hist_periods , pulse_periods .pulse , pulse_periods .num_pulses - 1 , TOLERANCE ); // Leave out last gap (end)
240+ histogram_sum (& hist_periods_pg , pulse_periods_pg .pulse , pulse_periods_pg .num_pulses - 1 , TOLERANCE ); // Leave out last gap (end)
241+ histogram_sum (& hist_periods_gp , pulse_periods_gp .pulse , pulse_periods_gp .num_pulses , TOLERANCE );
233242 histogram_sum (& hist_timings , data -> pulse , data -> num_pulses , TOLERANCE );
234243 histogram_sum (& hist_timings , data -> gap , data -> num_pulses , TOLERANCE );
235244
236245 // Fuse overlapping bins
237246 histogram_fuse_bins (& hist_pulses , TOLERANCE );
238247 histogram_fuse_bins (& hist_gaps , TOLERANCE );
239- histogram_fuse_bins (& hist_periods , TOLERANCE );
248+ histogram_fuse_bins (& hist_periods_pg , TOLERANCE );
240249 histogram_fuse_bins (& hist_timings , TOLERANCE );
241250
242251 fprintf (stderr , "Analyzing pulses...\n" );
@@ -246,9 +255,11 @@ void pulse_analyzer(pulse_data_t *data, int package_type, r_device* device)
246255 histogram_print (& hist_pulses , data -> sample_rate );
247256 fprintf (stderr , "Gap width distribution:\n" );
248257 histogram_print (& hist_gaps , data -> sample_rate );
249- fprintf (stderr , "Pulse period distribution:\n" );
250- histogram_print (& hist_periods , data -> sample_rate );
251- fprintf (stderr , "Pulse timing distribution:\n" );
258+ fprintf (stderr , "Pulse+gap period distribution:\n" );
259+ histogram_print (& hist_periods_pg , data -> sample_rate );
260+ fprintf (stderr , "Gap+pulse period distribution:\n" );
261+ histogram_print (& hist_periods_gp , data -> sample_rate );
262+ fprintf (stderr , "Timing distribution:\n" );
252263 histogram_print (& hist_timings , data -> sample_rate );
253264 fprintf (stderr , "Level estimates [high, low]: %6i, %6i\n" ,
254265 data -> ook_high_estimate , data -> ook_low_estimate );
@@ -291,15 +302,15 @@ void pulse_analyzer(pulse_data_t *data, int package_type, r_device* device)
291302 device -> tolerance = (device -> long_width - device -> short_width ) * 0.4 ;
292303 device -> reset_limit = to_us * (hist_gaps .bins [hist_gaps .bins_count - 1 ].max + 1 ); // Set limit above biggest gap
293304 }
294- else if (hist_pulses .bins_count == 2 && hist_gaps .bins_count == 2 && hist_periods .bins_count == 1 ) {
305+ else if (hist_pulses .bins_count == 2 && hist_gaps .bins_count == 2 && hist_periods_pg .bins_count == 1 ) {
295306 fprintf (stderr , "Pulse Width Modulation with fixed period\n" );
296307 device -> modulation = (package_type == PULSE_DATA_FSK ) ? FSK_PULSE_PWM : OOK_PULSE_PWM ;
297308 device -> short_width = to_us * hist_pulses .bins [0 ].mean ;
298309 device -> long_width = to_us * hist_pulses .bins [1 ].mean ;
299310 device -> tolerance = (device -> long_width - device -> short_width ) * 0.4 ;
300311 device -> reset_limit = to_us * (hist_gaps .bins [hist_gaps .bins_count - 1 ].max + 1 ); // Set limit above biggest gap
301312 }
302- else if (hist_pulses .bins_count == 2 && hist_gaps .bins_count == 2 && hist_periods .bins_count == 3 ) {
313+ else if (hist_pulses .bins_count == 2 && hist_gaps .bins_count == 2 && hist_periods_pg .bins_count == 3 ) {
303314 fprintf (stderr , "Manchester coding\n" );
304315 device -> modulation = (package_type == PULSE_DATA_FSK ) ? FSK_PULSE_MANCHESTER_ZEROBIT : OOK_PULSE_MANCHESTER_ZEROBIT ;
305316 device -> short_width = to_us * MIN (hist_pulses .bins [0 ].mean , hist_pulses .bins [1 ].mean ); // Assume shortest pulse is half period
0 commit comments