Skip to content

Commit 04a746e

Browse files
authored
Add gap+pulse period distribution to analyzer (#3263)
1 parent 769b8e6 commit 04a746e

File tree

1 file changed

+25
-14
lines changed

1 file changed

+25
-14
lines changed

src/pulse_analyzer.c

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)