-
Notifications
You must be signed in to change notification settings - Fork 0
/
pd_heart_rate_detection.pd
278 lines (278 loc) · 7.16 KB
/
pd_heart_rate_detection.pd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
#N canvas -11 -11 2560 1316 12;
#X obj 1925 303 snapshot~;
#X obj 1980 179 loadbang;
#X obj 1980 218 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
-1 -1;
#X obj 1925 250 adc~ 3;
#X obj 1980 250 metro 2;
#X obj 2751 1036 s pulse_trough;
#X obj 3001 940 r pulse_trough;
#X obj 2348 991 expr if ($f1 > $f2 && $f1 > $f3 \, $f1 \, $f3), f
43;
#X obj 2348 1041 s pulse_peak;
#X obj 2646 955 r pulse_peak;
#X obj 2862 941 r pulse_threshold;
#X obj 2497 956 r beat_threshold;
#X msg 884 997 750;
#X obj 884 1032 s beat_interval_ms;
#X obj 586 820 loadbang;
#X obj 586 861 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
-1 -1;
#X msg 385 997 0.5;
#X obj 270 1033 s pulse_trough;
#X obj 385 1033 s pulse_peak;
#X msg 270 998 0.5;
#X obj 607 1033 s beat_threshold;
#X msg 607 999 0.6;
#X text 367 863 set pulse metrics to default;
#X obj 2832 717 timer;
#X obj 2832 658 r beat_detected;
#X obj 2801 778 s ms_since_last_beat;
#X obj 1802 1257 + 1;
#X obj 1802 1285 s num_beats_detected;
#X msg 732 996 0;
#X obj 732 1033 s num_beats_detected;
#X obj 486 1033 s pulse_peaking;
#X msg 486 998 0;
#X text 917 998 (80 BPM);
#X obj 2963 776 expr if ($f1 > $f2 * 3 / 5 \, 1 \, 0);
#X obj 3191 741 r beat_interval_ms;
#X obj 2751 979 expr if ($f1 < $f2 && $f1 < $f3 && $f4 == 1 \, $f1
\, $f3);
#X msg 1028 998 0;
#X obj 1028 1031 s signal_noise_period_over;
#X obj 2963 814 s signal_noise_period_over;
#X obj 3126 941 r signal_noise_period_over;
#X obj 1779 998 expr if($f1 > $f2 && $f3 == 0 && $f4 == 1 \, 1 \, 0)
;
#X obj 1890 965 r beat_threshold;
#X obj 2010 964 r pulse_peaking;
#X obj 2126 963 r signal_noise_period_over;
#X text 1717 349 current pulse signal reading, f 29;
#X obj 1779 1026 sel 1;
#X obj 1943 1141 s pulse_peaking;
#X obj 2105 1079 r ms_since_last_beat;
#X obj 2087 1111 f;
#X obj 2087 1150 s beat_interval_ms;
#X obj 1825 1139 s beat_detected;
#X msg 1943 1102 1;
#X obj 1598 1058 r num_beats_detected;
#X obj 1580 1122 f;
#X obj 1779 1053 t b b b;
#X obj 1580 1160 t f f;
#X obj 1612 1201 == 2;
#X obj 1612 1241 sel 1;
#X obj 1562 1241 sel 1;
#X obj 1820 1197 r num_beats_detected;
#X obj 1802 1226 f;
#X obj 1562 1200 >= 2;
#X obj 1684 1391 f, f 5;
#X obj 1716 1363 r beat_interval_ms;
#X obj 1666 1634 +;
#X obj 1737 1685 +;
#X obj 1755 1633 f;
#X obj 1808 1732 +;
#X obj 1826 1687 f;
#X obj 1879 1772 +;
#X obj 1897 1733 f;
#X obj 1684 1482 t f b b b b b b b b f, f 92;
#X obj 1950 1816 +;
#X obj 1968 1773 f;
#X obj 2022 1863 +;
#X obj 2040 1818 f;
#X obj 2093 1906 +;
#X obj 2111 1864 f;
#X obj 2165 1948 +;
#X obj 2182 1907 f;
#X obj 2235 1991 +;
#X obj 2253 1948 f;
#X obj 2235 2031 / 10;
#X text 1703 1455 calculate a moving average of the 10 most recent
heart beat intervals, f 73;
#X obj 1612 1275 t b b b b b b b b b;
#X obj 1562 2157 expr 60000 / $f1;
#X obj 1562 1276 t b b;
#X obj 1562 2115 f;
#X floatatom 1562 2198 5 0 0 0 - - -;
#X text 1505 2199 BPM >;
#X obj 1925 350 t b f f f b;
#X obj 567 542 r ms_since_last_beat;
#X obj 549 601 f;
#X obj 1235 991 expr if($f1 < $f2 && $f3 == 1 \, 1 \, 0);
#X obj 1235 1024 sel 1;
#X obj 1360 967 r beat_threshold;
#X obj 1484 966 r pulse_peaking;
#X obj 1300 1146 s pulse_peaking;
#X msg 1300 1119 0;
#X msg 119 999 0.1;
#X obj 119 1033 s pulse_amplitude;
#X obj 1146 1250 f;
#X obj 1281 1257 f;
#X obj 1299 1220 r pulse_trough;
#X obj 1188 1212 r pulse_peak;
#X obj 1263 1312 -;
#X obj 1282 1439 s beat_amplitude;
#X obj 1073 1441 expr $f3 / $f1 + $f2;
#X msg 1073 1256 2;
#X obj 1131 1497 s beat_threshold;
#X obj 1073 1558 s pulse_peak;
#X obj 1096 1527 s pulse_trough;
#X obj 1235 1062 t b b b;
#X obj 549 646 > 2500;
#X obj 549 686 sel 1;
#X obj 1432 2167 / 16;
#X obj 1432 2265 s sixty_fourth_note_duration;
#X obj 1655 2203 print BPM;
#X obj 1649 1136 print BEAT_DETECTED;
#X obj 792 904 print resetting_pulse_detection;
#X obj 581 753 s beat_detected;
#X obj 549 719 t b b;
#X text 710 752 pretend a beat was detected to reset the timer;
#X text 1847 91 BPM detection algorithm adapted from: https://github.com/WorldFamousElectronics/PulseSensorPlayground/blob/master/src/utility/PulseSensor.cpp
, f 53;
#X connect 0 0 90 0;
#X connect 1 0 2 0;
#X connect 2 0 4 0;
#X connect 3 0 0 0;
#X connect 4 0 0 0;
#X connect 6 0 35 2;
#X connect 7 0 8 0;
#X connect 9 0 7 2;
#X connect 10 0 35 1;
#X connect 11 0 7 1;
#X connect 12 0 13 0;
#X connect 14 0 15 0;
#X connect 15 0 12 0;
#X connect 15 0 16 0;
#X connect 15 0 19 0;
#X connect 15 0 21 0;
#X connect 15 0 28 0;
#X connect 15 0 31 0;
#X connect 15 0 36 0;
#X connect 15 0 99 0;
#X connect 15 0 119 0;
#X connect 16 0 18 0;
#X connect 19 0 17 0;
#X connect 21 0 20 0;
#X connect 23 0 25 0;
#X connect 23 0 33 0;
#X connect 24 0 23 0;
#X connect 26 0 27 0;
#X connect 28 0 29 0;
#X connect 31 0 30 0;
#X connect 33 0 38 0;
#X connect 34 0 33 1;
#X connect 35 0 5 0;
#X connect 36 0 37 0;
#X connect 39 0 35 3;
#X connect 40 0 45 0;
#X connect 41 0 40 1;
#X connect 42 0 40 2;
#X connect 43 0 40 3;
#X connect 45 0 54 0;
#X connect 47 0 48 1;
#X connect 48 0 49 0;
#X connect 51 0 46 0;
#X connect 52 0 53 1;
#X connect 53 0 55 0;
#X connect 54 1 53 0;
#X connect 54 1 60 0;
#X connect 54 1 118 0;
#X connect 54 2 48 0;
#X connect 54 2 51 0;
#X connect 54 2 50 0;
#X connect 55 0 61 0;
#X connect 55 1 56 0;
#X connect 56 0 57 0;
#X connect 57 0 84 0;
#X connect 58 0 86 0;
#X connect 59 0 60 1;
#X connect 60 0 26 0;
#X connect 61 0 58 0;
#X connect 62 0 71 0;
#X connect 63 0 62 1;
#X connect 64 0 65 0;
#X connect 65 0 67 0;
#X connect 66 0 65 1;
#X connect 66 0 68 1;
#X connect 67 0 69 0;
#X connect 68 0 67 1;
#X connect 68 0 70 1;
#X connect 69 0 72 0;
#X connect 70 0 69 1;
#X connect 70 0 73 1;
#X connect 71 0 64 1;
#X connect 71 0 66 1;
#X connect 71 1 66 0;
#X connect 71 2 68 0;
#X connect 71 3 70 0;
#X connect 71 4 73 0;
#X connect 71 5 75 0;
#X connect 71 6 77 0;
#X connect 71 7 79 0;
#X connect 71 8 81 0;
#X connect 71 9 64 0;
#X connect 72 0 74 0;
#X connect 73 0 72 1;
#X connect 73 0 75 1;
#X connect 74 0 76 0;
#X connect 75 0 74 1;
#X connect 75 0 77 1;
#X connect 76 0 78 0;
#X connect 77 0 76 1;
#X connect 77 0 79 1;
#X connect 78 0 80 0;
#X connect 79 0 78 1;
#X connect 79 0 81 1;
#X connect 80 0 82 0;
#X connect 81 0 80 1;
#X connect 82 0 87 1;
#X connect 84 0 62 0;
#X connect 84 1 62 0;
#X connect 84 2 62 0;
#X connect 84 3 62 0;
#X connect 84 4 62 0;
#X connect 84 5 62 0;
#X connect 84 6 62 0;
#X connect 84 7 62 0;
#X connect 84 8 62 0;
#X connect 85 0 88 0;
#X connect 85 0 117 0;
#X connect 86 0 87 0;
#X connect 86 1 62 0;
#X connect 87 0 85 0;
#X connect 87 0 115 0;
#X connect 90 0 92 0;
#X connect 90 1 93 0;
#X connect 90 2 40 0;
#X connect 90 3 35 0;
#X connect 90 3 7 0;
#X connect 90 4 23 1;
#X connect 91 0 92 1;
#X connect 92 0 113 0;
#X connect 93 0 94 0;
#X connect 94 0 112 0;
#X connect 95 0 93 1;
#X connect 96 0 93 2;
#X connect 98 0 97 0;
#X connect 99 0 100 0;
#X connect 101 0 105 0;
#X connect 102 0 105 1;
#X connect 102 0 107 1;
#X connect 103 0 102 1;
#X connect 104 0 101 1;
#X connect 105 0 106 0;
#X connect 105 0 107 2;
#X connect 107 0 109 0;
#X connect 107 0 110 0;
#X connect 107 0 111 0;
#X connect 108 0 107 0;
#X connect 112 0 108 0;
#X connect 112 1 101 0;
#X connect 112 2 98 0;
#X connect 112 2 102 0;
#X connect 113 0 114 0;
#X connect 114 0 121 0;
#X connect 115 0 116 0;
#X connect 121 0 15 0;
#X connect 121 1 120 0;