cadences.append(cadence * 2) # two feet! log.info("DATA START TIME %s UTC" % datetime.datetime.utcfromtimestamp(start_t).strftime("%Y-%m-%d %H:%M:%S")) num_samples = len(ts) log.info("NUM DATA SAMPLES %s" % num_samples) if len(ts) != int(ts[-1]): log.warning("%s != %s" % (util.format_time(len(ts)), util.format_time(ts[-1]))) log.info("DURATION %s" % (util.format_time(ts[-1]))) log.info("CONVERTING AND SAMPLING") # clean data cadences = science.filter_deviations(cadences, positive_only=True) # heartrates = science.filter_deviations(heartrates) # normalize data cadences_norm = science.normalize(cadences) heartrates_norm = science.normalize(heartrates) # show ctx = drawing.Context(2000, 250, relative=True, flip=True) ctx.line([(float(i) / num_samples, cadences_norm[i]) for i in range(num_samples)], stroke=(0, 0, 255), thickness=2) ctx.line([(float(i) / num_samples, heartrates_norm[i]) for i in range(num_samples)], stroke=(255, 0, 0), thickness=2) ctx.show() ctx.image.save("cadence_heartrate.png", 'PNG') def rate_to_pulse(signal, sample_rate=60): """ Given a rate signal, convert into a list of pulse times. Sample rates in hz. """ """ Assuming the initial signal is 1hz """ sample_rate = float(sample_rate) elapsed_time = 0.0
log.info("AUDIO SAMPLE RATE %s" % sample_rate) log.info("AUDIO LENGTH (samples) %s" % len(data)) seconds = float(len(data)) / sample_rate log.info("AUDIO DURATION %s" % util.format_time(seconds)) skip = video_start_t - audio_start_t log.info("AUDIO SKIP %s%s" % ('-' if skip < 0 else '', util.format_time(abs(skip)))) # downsample to 60hz target_sample_rate = 60.0 signal = science.downsample(data, int(sample_rate / target_sample_rate)) log.info("NEW LENGTH (samples) %s" % len(signal)) average = np.average(signal) reduced = signal - average reduced = [x if x >= 0 else 0 for x in reduced] reduced = science.smooth(reduced, window_len=50) reduced = science.normalize(reduced) signal = science.normalize(signal) log.info("DETECTING PEAKS") # the lookahead is key. dont want to see two peaks, but not too small # in this case, a breath a second? max_peaks, min_peaks = science.detect_peaks(reduced, lookahead=60) breaths = [] for peak in max_peaks: sample, y = peak t = sample / target_sample_rate t -= skip if t < 0: continue if t > MEDIA_LENGTH: continue