using a forehead reflectance pulse oximeter to detect ... - CiteSeerX

5 downloads 504 Views 2MB Size Report
ARTEMIS is designed to support the medic's role by: • Assisting with .... or responsive then the algorithm classifies the injured individual as “Grey/Unknown”.
USING A FOREHEAD REFLECTANCE PULSE OXIMETER TO DETECT CHANGES IN SYMPATHETIC TONE A Thesis Submitted to the Faculty in partial fulfillment of the requirements for the degree of Master of Science in Biomedical Engineering by Suzanne M. Wendelken Thayer School of Engineering Dartmouth College Hanover, New Hampshire 03755, U.S.A. May 2004 Examining Committee:

Chair: Metin Akay, Ph.D. Professor of Engineering

Susan P. McGrath, Ph.D. Professor of Engineering

George T. Blike, M.D. Anesthesiology, Dartmouth Hitchcock Medical Center

Carol L. Folt Dean of Graduate Studies

Suzanne M. Wendelken

c 2004 Trustees of Dartmouth College °

Abstract The extreme conditions of combat and multi-casualty rescue often make field triage difficult and put the medic or first responder at risk. In an effort to improve field triage, we have developed an automated remote triage system called ARTEMIS (Automated Remote Triage and Emergency Management Information System) for use in the battlefield or disaster zone. So far, little work has done to test and validate the sensors that will be used to remotely monitor soldiers or first responders in the field. The aim of our research is to investigate techniques for remotely detecting physiological signs of injury. Common to field injuries is a sudden change in sympathetic tone resulting from massive blood loss or shock. The aim of this study is to investigate the use of the forehead reflectance pulse oximeter to detect a sudden sympathetic system activation. We hypothesize that sudden changes in sympathetic tone can be detected through analysis of the forehead reflectance pulse oximeter data. To test this hypothesis, we performed the classic supine-standing experiment in which a subject suddenly stands up from a lying down position. This sudden change in position elicits a strong sympathetic activation. Using a forehead reflectance pulse oximeter, we collected the raw photoplethysmogram (PPG) waveform during supinestanding activity for three runs in each of six subjects. The resulting waveform was processed in MatlabTM using various statistical and spectral analysis techniques including the Fast Fourier Transform (FFT) and Autoregressive (AR) analysis. Individual pulses were extracted and derived statistics (pulse height, width, beat-to-beat ii

interval, etc.) were calculated. We then estimated the sympathetic activation index by using the power spectrum of the beat-to-beat interval signal to calculate a ratio of low frequency to high frequency components. The principal behind the sympathetic activation index is that the very low frequency components (0.05-0.15 Hz) of the beat-to-beat interval signal correspond to both sympathetic and parasympathetic activation while the higher frequency components (0.15-0.4 Hz) correspond to only parasympathetic activation. Thus by taking the ratio of low frequency components to high frequency components we can calculate an index of sympathetic activation. Our results show that a statistical analysis of the PPG and its derived pulse statistics (height, width, beat-to-beat interval, etc), in addition to spectral analysis analysis, are useful techniques for detecting change in sympathetic tone resulting from positional change. Our data showed a decrease in the mean beat-to-beat interval, an increase in the variance of the beat-to-beat interval, an increase in the sympathetic index (RLF/HF ), and a decrease in the pulse height after the subjects stood up. Further, our data showed that AR analysis is more appropriate for analyzing pulse statistics such as HRV and pulse height. We believe that this approach can also be used to monitor the balance of sympathetic and parasympathetic activation during exercise, severe trauma, and in subjects with neurological disorders that affect the autonomic nervous system.

iii

Acknowledgement I would like to thank my advisors Sue McGrath and Metin Akay for their continued support, encouragement, and advice. I would also like to thank George Blike for taking the time from his busy schedule to help me organize and run the clinical trials and to Jens Jensen for helping me with the equipment, viewing the video data in LabViewTM , and tracking down George. Thanks to the rest of the ARTEMIS research group (Kip Benson, Christopher Carella, Janelle Chang, Michael Derosa, Aaron Fiske, and Curtis McClurkin) for their technical support, good ideas, and for volunteering to be subjects in my experiments. Finally, I would like to thank my family and friends for being behind me the whole time. And thanks to those friends who made me have fun occasionally even though I wanted to stay home and work on my thesis.

iv

For all the men and women who risk their lives to save others.

v

Table of Contents Table of Contents

vi

List of Tables

viii

List of Figures

ix

1 Introduction 1.1 Overview of ARTEMIS . . . . . . . . . . . . . . 1.1.1 Battlefield Casualties . . . . . . . . . . . 1.1.2 Extending the Reach of the Medic . . . . 1.1.3 Hardware, software, and implementation 1.1.4 Sensor Selection . . . . . . . . . . . . . . 1.1.5 Medical model . . . . . . . . . . . . . . . 1.1.6 Proof of concept . . . . . . . . . . . . . 1.2 Hypothesis . . . . . . . . . . . . . . . . . . . . .

. . . . . . . .

1 1 1 2 6 7 9 14 15

2 Background 2.1 The Autonomic Nervous System . . . . . . . . . . . . . . . . . . . . . 2.1.1 Physiology of the Sympathetic And Parasympathetic Systems 2.1.2 Sympathetic control of vascular tone . . . . . . . . . . . . . . 2.1.3 Respiratory induced amplitude variations . . . . . . . . . . . . 2.1.4 Heart Rate Variability . . . . . . . . . . . . . . . . . . . . . . 2.2 Pulse Oximetry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.1 Physiology of Oxygen Transport . . . . . . . . . . . . . . . . . 2.2.2 Physiology of Tissue Respiration . . . . . . . . . . . . . . . . 2.2.3 Pulse Oximetry Theory and Calculations . . . . . . . . . . . . 2.2.4 Sympathetic tone and the PPG . . . . . . . . . . . . . . . . .

17 17 18 19 20 21 22 23 25 26 32

3 Methods 3.1 Supine-Standing Experiment . . . . . . . . . . . . . . . . . . . . . . . 3.1.1 Pulse extraction from the PPG . . . . . . . . . . . . . . . . . 3.1.2 Re-Sampling and filtering . . . . . . . . . . . . . . . . . . . .

34 34 35 37

vi

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

3.2

Signal 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6

processing . . . . . . . . . . . . . . The Fourier Transform . . . . . . . The Short-Time Fourier Transform Autoregressive analysis . . . . . . . Burg AR method . . . . . . . . . . Model order selection . . . . . . . . Sympathetic Index calculation . . .

4 Results 4.1 Pulse Statistics . . . . . . . . . . . . . 4.2 Statistical and frequency analysis . . . 4.2.1 Beat-to-Beat interval analysis . 4.2.2 Pulse height analysis . . . . . . 4.2.3 Model order, frequency bounds

. . . . .

. . . . .

. . . . . . .

. . . . .

. . . . . . .

. . . . .

. . . . . . .

. . . . .

. . . . . . .

. . . . .

. . . . . . .

. . . . .

. . . . . . .

. . . . .

. . . . . . .

. . . . .

. . . . . . .

. . . . .

. . . . . . .

. . . . .

. . . . . . .

. . . . .

. . . . . . .

. . . . .

. . . . . . .

. . . . .

. . . . . . .

. . . . .

. . . . . . .

. . . . .

. . . . . . .

37 38 39 39 42 43 46

. . . . .

47 49 52 52 57 61

5 Discussion

62

6 Ongoing and Proposed Experiments 6.1 Treadmill Experiments . . . . . . . . . . . . . . . . . 6.2 Post Operative Recovery Room Experiments . . . . . 6.3 Sleep Study Experiments . . . . . . . . . . . . . . . . 6.4 Lower Body Negative Pressure (LBNP) Experiments 6.5 Pressure Experiments . . . . . . . . . . . . . . . . . . 6.6 Neural Networks . . . . . . . . . . . . . . . . . . . .

65 65 67 68 69 69 70

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

A Levinson-Dubrin Algorithm

71

B Pulse oximeter data format

73

C Matlab Code C.1 Main file . . . . . . . . . . . . C.2 Subfunctions . . . . . . . . . . C.2.1 Reading the Data . . . C.2.2 Pulse Extraction . . . C.2.3 AR and FFT analysis . C.2.4 Model order selection . C.2.5 Re-sampling . . . . . .

75 75 79 79 80 84 88 89

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

D HRV and Pulse Height analysis summary

90

Bibliography

95

vii

List of Tables 4.1

ANOVA results for before/after RLF/HF using different model orders and LF/HF frequency bounds. . . . . . . . . . . . . . . . . . . . . . .

61

D.1 Percent differences (After/Before) for pulse statistics, p=6. . . . . . .

91

D.2 Percent differences (After/Before) for pulse statistics, p=14. . . . . .

91

D.3 Percent differences (After/Before) for pulse statistics, p=14, different cutoff frequencies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

91

D.4 Before/During/After pulse statistics, p=6 . . . . . . . . . . . . . . .

92

D.5 Standard Error, Before/During/After for pulse statistics, p=6. . . . .

92

D.6 Before/During/After pulse statistics, p=14 . . . . . . . . . . . . . . .

93

D.7 Standard Error, Before/During/After for pulse statistics, p=14. . . .

93

D.8 Before/During/After pulse statistics, p=14, different cutoff frequencies

94

D.9 Standard Error, Before/During/After for pulse statistics, p=14, different LF and HF cutoff frequencies. . . . . . . . . . . . . . . . . . . . .

viii

94

List of Figures 1.1

ARTEMIS concept for combat casualty care. . . . . . . . . . . . . . .

7

1.2

General medical model flow diagram. . . . . . . . . . . . . . . . . . .

10

1.3

ARTEMIS GUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

2.1

RIAV example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

2.2

Gas transport diagram. From Baura, p. 67 [1]. . . . . . . . . . . . . .

24

2.3

Diagram of skin circulation. From Guyton p. 823 [2]. . . . . . . . . .

25

2.4

Hb and HbO2 extinction curves . . . . . . . . . . . . . . . . . . . . .

27

2.5

Figure showing relation of PPG to QRS. From Baura p. 77 [1]. . . . .

28

2.6

Empirical Sa O2 vs R curve. From Rusch p. 148 [3] . . . . . . . . . .

31

2.7

Light absorption versus time showing the primary sources of absorption. From Rusch p 146 [4, 3]. . . . . . . . . . . . . . . . . . . . . . .

32

2.8

PPG pulse height response to vasoactive drug . . . . . . . . . . . . .

33

2.9

PPG response to surgical incision . . . . . . . . . . . . . . . . . . . .

33

3.1

Example pulse trains from PPG waveform with and without dicroic wave. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

ix

36

3.2

Frequency response for the high-pass Butterworth filter, fc = 0.05 Hz.

38

3.3

Signal-flow diagram of AR error . . . . . . . . . . . . . . . . . . . . .

41

3.4

Signal flow diagram of Burg AR forward/backward prediction error. From Rangayyan p. 426 [5]

. . . . . . . . . . . . . . . . . . . . . . .

43

3.5

Model order selection ex 1. . . . . . . . . . . . . . . . . . . . . . . . .

44

3.6

Model order selection ex 2. . . . . . . . . . . . . . . . . . . . . . . . .

45

3.7

Model order selection ex 3. . . . . . . . . . . . . . . . . . . . . . . . .

45

4.1

Example frequency analysis of raw PPG . . . . . . . . . . . . . . . .

48

4.2

Example pulse statistics from Subject 2 . . . . . . . . . . . . . . . . .

49

4.3

Example of sliding window HRV statistics from Subject 1 . . . . . . .

50

4.4

Example of sliding window pulse height statistics from Subject 1 . . .

51

4.5

AR vs FFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

52

4.6

Example windowed HRV stats.

. . . . . . . . . . . . . . . . . . . . .

53

4.7

Example AR and STFT spectrograms of HRV signal . . . . . . . . .

54

4.8

Summary of HRV signal statistics before, during, and after the subject stood up. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4.9

55

Cumulative results: HRV signal statistics before, during, and after subjects stood up. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

56

4.10 Example windowed pulse height stats. . . . . . . . . . . . . . . . . . .

58

4.11 Example Before, During, After statistics of pulse height signal. . . . .

59

4.12 Cumulative results: Before/During/After pulse height signal . . . . .

60

x

6.1

Preliminary results from treadmill experiment . . . . . . . . . . . . .

66

6.2

Preliminary results from PACU experiment . . . . . . . . . . . . . . .

68

xi

Chapter 1 Introduction 1.1

Overview of ARTEMIS

Increasing patient survivability by moving information and resources closer to casualties in the field is a major objective of casualty care research. The goal of the Automated Remote Triage and Emergency Management Information System (ARTEMIS) project is to integrate advances in communications and analysis technologies into a remote triage system that can expedite and improve care of the wounded. This approach can be used to monitor soldiers on the field and first responders and casualties in the civilian domain. In this thesis we consider the military as our example domain.

1.1.1

Battlefield Casualties

The overarching premise of the military version of the ARTEMIS system is that the survivability of our soldiers and mission success can be improved by expanding the flow of medical information on the battlefield and throughout the chain of command. Our aim is to provide a degree of medical situational awareness at all levels of command that has never existed before. In our view, the most critical stage of this 1

2 process begins by monitoring individual soldiers and providing relevant information to the medic-the first line of care in the battlefield. Our primary target population is the 25% of soldiers killed in action who die between 5 minutes and 6 hours of injury [6]. These soldiers live long enough to be rescued but die quickly enough to be affected by the suboptimal nature of the current system. In addition to improving the outcomes of injured soldiers, we believe that a more effective flow of medical information will help to prevent injuries. Of all of the casualties that medics attempt to rescue, 25% of them are already dead before the medic arrives, and the process of accessing the soldier puts the medic at risk. Ten percent of casualties in the battlefield are injured while attempting to rescue a previously injured comrade, and if a medic is part of that 10%, the soldiers he is responsible for and their mission are likely to be jeopardized [6]. While some casualties are unavoidable, we believe that these specific types of injuries can be reduced and outcomes improved with a more effective analysis and distribution of medical information on the battlefield.

1.1.2

Extending the Reach of the Medic

ARTEMIS is designed to support the medic’s role by: • Assisting with remote monitoring and triage processes. • Providing focused information to allow the medic to concentrate on higher-level issues.

3 • Providing distributed situational awareness that allows more informed, effective use of resources. • Delivering treatment protocols to the medic. Augmenting the abilities of medics will minimize the number of casualties, improve the outcomes of unavoidable casualties, and, as a result, improve mission success. Ruggedized laptops are currently used in the battlefield, but their utility is limited by their size and weight, so they generally remain at higher echelons of the theater. Hand-held computers are being used by soldiers in the field to a limited extent for certain purposes (e.g. targeting), but they are not standard issue. Soldiers’ access to information is limited to vertical communication on the battlefield via the soldier with a radio. For example, in order to report a casualty, a medic must verbally relay a message to someone who communicates the message over the radio. The message is then passed up multiple levels of command before an evacuation decision is made. The medic’s treatment options are limited to: waiting for evacuation, providing intravenous fluids, applying dressings, performing surgical control, and implementing fracture stabilization. There is no way for a medic to determine if a soldier is dead without a direct, physical examination. Triage is performed one patient at a time after the medic physically assesses each individual. All of these physical assessments take time, tend to occur in the order of physical proximity rather than medical need, and put the medic at risk. Today, a medic experiences the following sequence of events when dealing with a new casualty. Text in italics indicates times when the

4 medic is potentially at risk: • Notified of injury - by verbal communication • Locate injury - visually or by verbal communication • Physically move casualty to injury • First assessment - physical • Triage • Treatment • Evacuation • Ongoing Assessment In the future, projects like Future Warrior will equip every soldier with a wearable computer with a wireless connection. The computing platform will allow for a level of information access and transmission never before seen on the battlefield, and we plan to leverage this capability for medical support. ARTEMIS is not intended to affect the medic’s treatment options, in fact, the system tailors the medical information provided and keeps it relevant to their limited treatment options on the battlefield. However, we provide tools for the medic to determine current state of a soldier without having to put themselves at risk by physically accessing the soldier. In addition, ARTEMIS will allow medics to perform triage remotely, and categorize injured soldiers by urgency. Using ARTEMIS, the medic will experience the following sequence

5 of events when dealing with a new casualty. Text in italics indicates times when the medic is potentially at risk; note how much is accomplished before the medic is put at risk: • Notified of injury - by wearable computer • Locate injured party- by GPS location and map on computer screen • Automatic/buddy assessment - access to physiological data • Remote triage - medic alerted of triage category of multiple casualties simultaneously • Medic decides which casualty to attend to first • Medic physically moves to injured person • First physical assessment to confirm remote assessment • Confirm triage • Treatment • Evacuation • Remote Ongoing Assessment Realizing this vision requires a combination of technologies capable of: (1) extracting information from the soldier, (2) analyzing it to transform raw data into

6 clinically useful information, and (3) ferrying this information around the network in the most efficient way possible. In the next sections we describe how the components of ARTEMIS can help achieve this vision.

1.1.3

Hardware, software, and implementation

The hardware components include a hand-held computer system and a single, multifunctional, non-invasive sensor that effectively measures physiological parameters during battle conditions. The assessment and alert system collects, analyzes and interprets physiological data in a meaningful way. The user interfaces enable field and other medical personnel to view medical data and issue treatment protocols. The messaging architecture provides the framework for information filtering, information movement, and decision-support capabilities. The ad hoc wireless routing system transports data among computing devices in both urban and open environments. Figure 1.1 depicts the main components of ARTEMIS. Sensors worn by soldiers collect physiological data in a continuous manner. The status assessment software residing on the soldier’s computing device collects and analyzes this data. If the system detects abnormalities suggesting an injury, an alert is sent via a wireless connection to the necessary medical personnel (medics, medevac personnel, and medical teams at other echelons). Messaging software routes pertinent information, such as treatment protocols, medical records, reference material, medevac arrangements, and requests for decision support through the wireless network. Requests and queries can be either one-time or persistent, minimizing the workload on medical personnel using the

7

Figure 1.1: ARTEMIS concept for combat casualty care. system. A combination of active messenging and wireless routing protocols ensures reliable and timely delivery of information in limited bandwidth networks.

1.1.4

Sensor Selection

There are a number of wearable sensors on the market that would be useful for automated remote triage systems such as ARTEMIS (e.g. the PolarTM heart monitor, respiration chest straps, wearable ECG Smart ShirtsTM , pulse oximeters, etc.). Our goal is to get the most amount of data using the fewest number of sensors. We needed something that is already FDA approved, widely utilized, easy to understand, and, very importantly, non-invasive and non-cumbersome to the soldier or first responder.

8 We chose the forehead reflectance pulse oximeter because it meets the requirements for ARTEMIS, is widely utilized by the medical community and thus an accepted, medical grade, instrument1 , and contains a wealth of information in the raw photoplethysmogram (PPG) signal. Additionally, the forehead reflectance pulse oximeter can be placed on the inside of a helmet or gas mask or on an athletic headband. This is non-cumbersome and good contact between the sensor and the forehead allows for relatively little motion artifact. The advantages of the forehead reflectance pulse oximeter over the finger pulse oximeter are the lower motion artifact, it does not interfere with the soldier or first responder’s actions, and it is not as affected by peripheral vasoconstriction (resulting from cold or stress) which causes a very poor signal for the finger pulse oximeter. The pulse oximeter provides us with the oxygen saturation (Sp O2 ), heart rate, and the PPG signal. This is convenient because between these three data components, we can cover the “ABC’s” of field triage (Airway, Breathing, and Circulation) [7, 8]. The oxygen saturation gives us an idea of the individuals cardio-pulmonary system as a whole. If the lungs and heart are working and there is adequate blood supply, then the oxygen saturation will be high. The heart rate provides us with information about the circulation. The PPG provides us with information on the breathing and circulation as will be discussed in later chapters. 1

Unlike, for instance, the PolarTM heart strap which is for recreational training use only.

9

1.1.5

Medical model

ARTEMIS uses an algorithm based on a triage protocol called START (Simple Triage And Rapid Treatment) which was shown to be effective in multi-casualty incident triage [7, 9]. This protocol prompts the medic to classify injured individuals based on the location, type, and severity of the injury, as well as the individual’s cognitive and ambulatory state into one of several categories: Minimal Able to self-treat and walk to a casualty collection point Delayed Able to self-treat but not able to walk Immediate Serious injury requiring immediate treatment Expectant Serious injury with immanent death Figure 1.2 depicts the general flow of the medical model at the heart of ARTEMIS. In the our model, a soldier or first responder is classified into one of the four NATO triage categories if an event is detected and as “normal” or “unknown” otherwise. An event can be triggered in the following manners: • The individual self-triggers by pressing an icon on his or her touchscreen (see Figure 1.32 ). • The individual’s or first responder’s “buddy”(a nearby person of same training and/or rank) indicates that he/she is down by using his or her touchscreen. 2

ARTEMIS GUI design by Aaron Fisk and Eliot Grigg, 2002-2004.

10

Figure 1.2: General medical model flow diagram. • Physiological data lies outside the boundaries considered normal as determined by a clinician. The structure of both status assessment algorithms is a series of recursive functions. First, the main function obtains baseline measurements from the input parameters. For subsequent time increments, this function checks equipment readiness and smoothes the data using an artifact removal subfunction. If the equipment is not ready or responsive then the algorithm classifies the injured individual as “Grey/Unknown”.

11

Figure 1.3: ARTEMIS GUI

Next, the main function checks for buddy input and trigger criteria. If there is buddy input, the data is handed to another subfunction that classifies the individual’s health status based on the buddy input and then hands the data to a monitoring subfunction. If there is no buddy input, the main function for the hard-coded algorithm checks for any the following trigger criteria: • Has the individual self-triggered? • Is the heart rate < 40 bpm or > 200 bpm? • Is the Sp O2 < 85%?

12 If none of these criteria are met, then the function classifies the individual as White/Normal and hands the data back to itself. If any of these criteria have been met, the function begins to query the individual and assess the status in the following way: • Query 1: “Can you walk?” If the individual answers “yes” by touching the icon on the touchscreen then the function classifies the individual as Green/Minimal. • If the individual answers “no” or does not answer within a specified amount of time, the function checks the vital signs in the following manner: 1. If the Sp O2 is absent, the function classifies the individual as Black/Expectant. 2. If the Sp O2 is low ( < 70% of the baseline measurement) then the function classifies the individual as Red/Immediate. 3. If the Sp O2 is adequate ( > 70% of the baseline measurement) the function checks the heart rate. 4. If the heart rate(heart rate < 40 bpm ), then the function classifies the individual as Red/Immediate. 5. If the heart rate (heart rate > 40 bpm then the function checks the mental status of the individual. 6. If the mental status score is acceptable then the individual is classified as Yellow/Delayed. If the score is not acceptable or the soldier did not respond, the individual is classified as Red/Immediate.

13 Following the classification, the main function hands the data to the monitor subfunction. This subfunction reads in the next time step of data and checks for buddy input and significant change in the vitals. If there is buddy input, this function hands the data to the buddy subfunction. Otherwise this subfunction removes artifacts and checks for significant change. If there is significant change, the subfunction hands the data back to the main function to be reclassified. If there is not significant change, this subfunction classifies the individual with the same classification as the previous time step and hands the data back to itself. The main purpose of this subfunction is to avoid unnecessarily querying the soldier or first responder, thus distracting him or her from the urgency of combat situations. The buddy subfunction uses the buddy input of the airway, breathing, circulation, shock, and level of consciousness of the injured individual to classify the medical status based on standard medic triage protocol [8]: • If the level of consciousness is “unresponsive”, then the individual is classified as Black/Expectant. • The individual is classified as Red/Immediate if any of the following criteria are met: – Airway is partially or completely obstructed. – Breathing is rapid and shallow or absent. – Circulation: pulse can only be detected in the carotid artery or not at all.

14 – Shock symptoms are present. – Level of consciousness: soldier is only responsive to pain stimuli or not at all. • Individual is classified as Green/Minimal if the Airway is opened and the Breathing is normal and the Circulation is good and there are no shock symptoms present and the level of consciousness is optimal. • Otherwise the individual is classified as Yellow/Delayed. The main purpose of the “buddy” subfunction is to take into account real-time expert data. The buddy subfunction overrides the status classification of all other functions.

1.1.6

Proof of concept

In a previous study, we implemented the above medical model in MatlabT M . With the help of an expert clinician 3 , we simulated the vital signs and interactive responses of 12 soldiers over 180 time increments using the MILES (Multiple Integrated Laser Engagement System) combat casualty cards4 . Our results indicated that our status assessment algorithm can be used to assess the physiological state of a soldier over a wide range of simulated injuries. [10] 3

George Blike, MD, Department of Anesthesiology, Dartmouth Hitchcock Medical Center, Hanover, NH. 4 These cards are used to train medics and represent typical combat injuries.

15

1.2

Hypothesis

For budding remote triage systems like ARTEMIS, the infrastructure and usage domain has been well planned and thought out. However, there has been little work done to test and validate the sensors that will be used to remotely monitor soldiers or first responders. The aim of our research is to investigate the ability of the forehead reflectance pulse oximeter to remotely detect physiological signs of injury including sympathetic system activation. We hypothesize that a forehead reflectance pulse oximeter is a viable sensor for detecting sudden changes in sympathetic tone. To test this hypothesis, we performed the classic supine-standing experiment in which a subject suddenly stands up from a lying down position. This sudden change in position elicits a strong sympathetic activation5 . Using a forehead reflectance pulse oximeter, we collected the raw photoplethysmogram (PPG) waveform during supine-standing activity for three runs in each of six subjects. The resulting waveform was processed in MatlabTM using various statistical and spectral analysis techniques including the Fast Fourier Transform (FFT) and Autoregressive (AR) analysis. Individual pulses were extracted and derived statistics (pulse height, width, beat-to-beat interval, etc.) were calculated. We then estimated the sympathetic activation index by using the power spectrum of the beat-to-beat interval signal to calculate a ratio of low frequency to high frequency components6 . 5 6

This sympathetic activation is discussed further in Section 2.1.2. See Section 2.1.4 for details of the sympathetic activation index.

16 The logic behind the ratio calculation is that the low frequency components of the beat-to-beat interval signal (0.05−0.15 Hz) represent both sympathetic and parasympathetic activation while the higher frequency components (0.15 − 0.4 Hz) represent only parasympathetic activation[11, 12]. By taking the ratio of the low frequency components to high frequency components, we can see the relative sympathetic activation(see equation 2.1). An increasing RLF/HF corresponds to increasing sympathetic activation[11, 12]. We hypothesize that we will be able to detect a change in sympathetic tone using statistical and frequency analysis of the raw PPG and its derived statistics. In particular, we hypothesize that the RLF/HF in the beat-to-beat interval signal will increase after the subject stands up.

Chapter 2 Background In this chapter, we discuss briefly the autonomic nervous system and the theory of pulse oximetry.

2.1

The Autonomic Nervous System

The discussion in this section and its subsections follows that in Guyton [2] chapters 18 and 19 unless otherwise cited. Common battlefield injuries such as a gunshot wounds, blast injuries, blunt trauma, chemical burns, or severe dehydration are often result in hypovolemia and shock. This results in a sudden decrease in arterial pressure. The autonomic nervous system (ANS) controls functions relating to maintaining normal arterial pressure. Thus, measuring ANS activity could be a useful tool in triage. The ANS is responsible for control of all involuntary functions such as cardiac activity, respiration, vascular tone, and digestion. The ANS is made up of three components: the sympathetic system, the parasympathetic system, and the eneteric system. The sympathetic and parasympathetic systems control physiological functions important in remote health monitoring such as arterial blood pressure, heart 17

18 rate, and respiration rate where as the eneteric system controls mostly digestion [2]. The next section focuses on the sympathetic and parasympathetic systems.

2.1.1

Physiology of the Sympathetic And Parasympathetic Systems

The sympathetic and the parasympathetic systems maintain delicate balance in the control of the body’s involuntary functions. The sympathetic system is generally excitory where as the parasympathetic system is inhibitory. The sympathetic system acts to increase heart rate, arterial tone, cardiac output, respiration rate, secretion of norepinephrine from the adrenal medulla, and dilates the pupils. The sympathetic system is strongly activated during times of stress (“alarm reaction”), exercise, or by the baroreflex or chemoreflex. Under normal conditions, sympathetic nerves fire between 0.5 and 2 Hz which maintains a partial contraction of blood vessels. When the sympathetic system is strongly activated, sympathetic nerves fire between 10 and 20 times per second [13, 2]. The parasympathetic system, also known as the vagal system regulates conservative processes and is usually activated when the body is relaxed or asleep. This system is responsible for decreasing heart rate, cardiac output, respiration, and constricting the pupil. Inhibitory responses are caused by acetylcholine, the neurotransmitter of parasympathetic nerves, which stimulates the cholinergic receptors in organs such as the heart and lungs and decreases activity therein.

19

2.1.2

Sympathetic control of vascular tone

Sympathetic system causes vasoconstriction by releasing norepinephrine from the endings of the vasomotor nerves and by sending impulses to the adrenal medulla which releases norepinephrine and epinephrine (adrenaline) into the blood stream. Norepinephrine acts on the alpha receptors of vascular smooth muscle causing the muscle to contract. With a combination of direct vasomotor stimulation and norepinephrine released in the blood stream, almost all the arterioles constrict simultaneously increasing arterial pressure. The sympathetic system also causes vasodilation in the skeletal muscles (via acetylcholine) during exercise in order to meet the demands of increased metabolism and thus greater blood flow in the muscles. The sympathetic system can cause rapid changes in arterial pressure (5-10 seconds). Both stretch and low-pressure baroreceptor located on the walls of large systemic arteries detect change in arterial pressure and send impulses to the adrenal medulla. The stretch receptors are extremely sensitive around the area of normal arterial pressures (80-120 mm Hg). When the stretch receptors are activated by an increase pressure, impulses to the adrenal medulla inhibit sympathetic activity and stimulate parasympathetic activity. Conversely, when the low-pressure receptors are activated by a decrease in pressure, sympathetic vasomotor activity is stimulated and parasympathetic activity is inhibited. During a sudden change in body position, such as standing up from lying down, arterial pressure in the head and upper body decrease suddenly. This causes a strong

20 sympathetic discharge which increases arterial pressure in what is known as the “baroreflex”. Chemoreceptors in the walls of the arteries complement the baroreceptor. Chemoreceptors are activated by increased partial pressure of CO2 or by a decreased partial pressure of O2 . Activation of the chemoreceptors stimulates vasomotor activity in response to cerebral ischemia (not enough oxygen is being delivered to the brain) or hypercapnia (an excess of CO2 in the blood). In strong activation of the sympathetic system, vasoconstrictor and cardioacceleration functions are activated simultaneously while vagal activity to the heart is inhibited. Three major changes occur throughout the body simultaneously: arterial constriction increases peripheral resistance which increases arterial pressure; venous constriction displaces blood towards the heart and increases cardiac output; and the heart is directly stimulated which both increases the heart rate and the force of contraction, thereby increasing cardiac output.

2.1.3

Respiratory induced amplitude variations

Respiratory waves can be seen riding on top of many physiological waveforms including the ECG, pulse pressure waves, and the PPG. These respiratory induced amplitude variations (RIAV) results from a combination of the following[2]: • Impulses in the respiratory center “spilling over” into the vasomotor center in the brain.

21 Photoplethysmogram

110 108 106

Raw Value

104 102 100 98 96 94 92 90 324

326

328

330

332

334 time (s)

336

338

340

342

344

Figure 2.1: Example RIAV riding on PPG during treadmill exercise. • Inspiration decreases thoracic pressure causing blood vessels to expand and decreasing arterial pressure. This elicits the baroreceptor response which changes the heart rate. These waves are often called vasomotor waves or Mayer waves. Figure 2.1 depicts an example of RIAV in the pulse oximeter photoplethysmogram during treadmill exercise.

2.1.4

Heart Rate Variability

Heart rate variability (HRV) has been shown to be an affective indicator of autonomic nervous system activation and sympathetic tone [14, 15, 11]. Very low frequency components in the HRV signal (approx. 0.05 to 0.15 Hz) correspond to both sympathetic and parasympathetic activity while higher frequency components (approx. 0.15 to 0.4 Hz) correspond to only parasympathetic activation [11]. Thus, by taking the ratio

22 of low frequency energy to high frequency energy in the HRV signal, it is possible to quantify the level of sympathetic activation [11](see equation 2.1). |LF | |HF | Sympathetic · P arasympathetic ≈ P arasympathetic

R =

≈ Sympathetic

(2.1) (2.2) (2.3)

To summarize, increasing RLF/HF corresponds to increasing sympathetic activity. Conversely, a decreasing RLF/HF corresponds to decreasing sympathetic activity.

2.2

Pulse Oximetry

Because the main source of data used in this study is collected by means of a portable pulse oximeter, an explanation of the underlying theories of pulse oximetry is in order. The focus of this section is on the theory of pulse oximetry and the physiology of blood gas transport. Pulse oximetry is a noninvasive method of measuring the percentage of hemoglobin (Hb) that is saturated with oxygen. Pulse oximeters use pulses of light at two different frequencies to probe the blood in the capillaries of the skin. The amount of light absorbed at each frequency is recorded and compared to compute the oxygen saturation (Sp O2 ). This measurement is directly correlated to the partial pressure of oxygen in hemoglobin (Pa O2 ) which determines how well oxygen is delivered to cell tissues in the body [3]. Pulse oximetry is based on the fact that oxygenated hemoglobin (HbO2 ) and hemoglobin have different absorption spectra [16]. More detail will be

23 given to the physics of pulse oximetry in Section 2.2.3. Although once expensive and bulky, new, portable and relatively inexpensive pulse oximeters are now one of the most frequently employed monitoring methods in the critical care setting [16]. In addition, the pulse oximeter is commonly used during surgical procedures, dentistry anesthesia, home health care monitoring, recreational sports, and sudden infant death syndrome (SIDS) monitoring [3]. Portability, economy, and ubiquitous use were the main reason that we decided to use the pulse oximeter as our main physiological sensor.

2.2.1

Physiology of Oxygen Transport

Oxygen supply is critical for life. During pulmonary ventilation, oxygen inhaled diffuses into the blood by means of alveolar diffusion. Inside the alveoli (the small, thin-walled sacs in the lungs filled with capillaries) the gas concentrations are determined by Dalton’s law which states that each gas in the mixture exerts a partial pressure proportional to its percentage of the total volume of the mixture. The alveolar gas mixture includes oxygen, nitrogen, carbon dioxide, water vapor, and trace amounts of nobel gases. The alveolar partial pressure of oxygen (Pa O2 ) is high relative to the partial pressure of oxygen in the veins entering the lung capillaries (Pv O2 ). Typically, Pa O2 = 100 mm Hg and Pv O2 = 40 mm Hg. Oxygen moves along this decreasing gradient from the alveoli to the blood in lung capillaries [1]. Oxygen and other gases are not actually very soluble in the blood at body temperature. Oxygen is transported to the tissues by the red blood cells or erythrocytes.

24 Hemoglobin molecules within the red blood cells have four protein chains each containing an iron ion (Fe++ ) that binds to oxygen and carbon dioxide reversibly. Oxygenated hemoglobin is referred to as oxyhemoglobin (HbO2 ) and deoxyhemoglobin is referred to as reduced hemoglobin (Hb)[1]. Once in the blood stream, oxygen is transported through arteries to tissue capillaries. Cells in the tissue metabolize the oxygen, giving off carbon dioxide as the byproduct. CO2 is transported back to the lungs through the veins and diffuses from the blood into the lungs. This process of ventilation, pulmonary diffusion, transport, and tissue diffusion is known as gas transport and is illustrated in Figure 2.2 [1].

Figure 2.2: Gas transport diagram. From Baura, p. 67 [1].

25

2.2.2

Physiology of Tissue Respiration

The skin consists of many layers of different types of cells. The outer part of the skin, known as the epidermis, consists of four layers. The outer layer–the stratum corneum–is composed of flattened cells lacking nuclei and forms the protective layer for the body. The other three layers in the epidermis are composed largely of proteins, lipids, and pigment or melanin. The epidermis is approximately 0.1 to 0.2 mm thick [17]. Underneath the epidermis is the corium (also called “dermis”) which is composed of connective tissue containing lymphatics, nerves, nerve endings, a system of capillaries, sebaceous and sweat glands, and elastic fibers. Blood flows from the lower dermis to the upper dermis and back by means of capillaries which are arranged in vertical loops approximately 0.2 − 0.4 mm in height (see Figure 2.3) [17].

Figure 2.3: Diagram of skin circulation. From Guyton p. 823 [2]. Gas exchange in tissue occurs in the same fashion as gas exchange in the lungs: diffusion. The partial pressures of oxygen and carbon dioxide in tissue is different

26 than that in the lungs and is proportional to the metabolism in that area. The rate of respiration depends on the partial pressure gradient, the surface area of the capillaries, the length of the diffusion path, and the amount of diffusion resistance that the molecules experience passing through various structures [1].

2.2.3

Pulse Oximetry Theory and Calculations

Functional arterial oxygen saturation (Sa O2 ) is defined as “the ratio of HbO2 to the total amount of arterial Hb available for reversible oxygen binding” [1]. When measured using pulse oximetry, this ratio is defined: Sp O2 =

[HbO2 ] [HbO2 ] + [Hb]

(2.4)

where the brackets denote concentration and the “p” stands for “pulse oximetry”. The red color of blood results from the relatively strong absorption of the short light wavelengths by the Hb and HbO2 molecules. The darker color of venous blood as compared to the more oxygenated arterial blood is due to the fact that Hb absorbs more red and less blue light than HbO2 . The difference in color of Hb and HbO2 molecules is key to pulse oximetry. Light propagation in a uniform medium is described by the Beer-Lambert law (equation (2.5)). Here, the intensity I of the light in the medium is proportional to the transmitted intensity Io and decreases exponentially with the extinction coefficient of the absorbing medium ε, the concentration of the absorbing medium β, and the

27 path length l [1, 3]. I = Io · e−ε(λ)βL

(2.5)

Taking the log of the transmitted intensity over the received intensity gives us the unscattered absorbance or optical density A(λ). ln

I = −ε(λ)βL = A(λ) Io

Atotal (λ) =

N X

ε(λ)i βi L.

(2.6)

(2.7)

i=1

Basic pulse oximetry involves transmitting two different frequencies of light through a blood sample of known length containing both Hb and HbO2 and recording the amount of light absorbed by means of a photodetector. Both molecules have different extinction coefficients at each wavelength (see Figure 2.4). Thus, by comparing the amount of light absorbed at two different frequencies is possible to calculate the relative percentage of HbO2 to the total amount of Hb available or Sp O2 [1].

Figure 2.4: Extinction curves of Hb, HbO2 , methemoglobin, and carboxyhemoglobin. From Rusch p 146 [3, 4].

28 The relationship between each pulse and the light measured by a pulse oximeter is depicted in Figure 2.5. Note that the amplitude optical pulse received by the sensor goes down for every pulse. However, because it is more logical to think of heart beats as making peaks instead of valleys, this signal is usually inverted when displayed on a pulse oximeter output. Also note the slight delay between the QRS complex and the optical pulse. This results from the time it takes for the pulse to travel from the heart to where ever the pulse oximeter is placed (forehead, finger, etc.)

Figure 2.5: Figure showing relation of PPG to QRS. From Baura p. 77 [1].

However, light is absorbed by more than Hb and HbO2 . Skin pigment, bones, and arterial and venous blood are the major absorbers. In addition, light is scattered in many directions as it enters the skin. Thus, light received by the photodetectors rarely travels in a straight path and it is heavily attenuated [1]. Given all the sources of

29 absorption and attenuation, the total absorbance at two wavelengths can be written: Atotal (λ1 ) = εHbO2 (λ1 )[HbO2 ] + εHb (λ1 )[Hb] + εx (λ1 )[X] + Ay (λ1 )

(2.8)

Atotal (λ2 ) = εHbO2 (λ2 )[HbO2 ] + εHb (λ2 )[Hb] + εx (λ2 )[X] + Ay (λ2 )

(2.9)

where the subscript x refers to variable sources of absorbance not from arterial blood and the subscript y refers to nonspecific optical attenuation. Other substances, such as MethHb and COHb, absorb light at these frequencies as well, but for simplicity, we will assume that these substances are not present in the blood under normal conditions [1]. It is possible to calculate Sp O2 when such substances are present in the blood stream, but measurements at additional frequencies are necessary (four equations, four unknowns). In determining Sp O2 , we are interested in the oxygen saturation of the arterial blood. To isolate the arterial component, only the pulsatile absorbencies are analyzed (hence “pulse” oximetry). By taking the time derivative of the absorption in Equations 2.8, all the path length independent attenuation terms (Ay (λ)) disappear. Additionally, we will assume that the blood path length changes

dlHbO2 dt

and

dlHb dt

are

equivalent [1]. Taking the ratio of the time derivatives of the absorption gives us:

R = =

dA(λ1 ) dt dA(λ2 ) dt dlHbO2 dt dlHbO2 εHbO2 (λ2 )[HbO2 ] dt

εHbO2 (λ1 )[HbO2 ]

(2.10) + εHb (λ1 )[Hb] dldtHb + εHb (λ2 )[Hb] dldtHb

(2.11)

30 Assuming

dlHbO2 dt

=

dlHb , dt

R=

(εHbO2 (λ1 )[HbO2 ] + εHb (λ1 )[Hb]) . (εHbO2 (λ2 )[HbO2 ] + εHb (λ2 )[Hb])

(2.12)

Recalling that Sp O2 is a ratio of concentrations, we can rearrange Equation 2.10 to calculate Sp O2 : εHbO2 (λ1 )[HbO2 ] + εHb (λ1 )[Hb] = R (εHbO2 (λ2 )[HbO2 ] + εHb (λ2 )[Hb]) (2.13) [Hb] (εHb (λ1 ) − RεHb (λ2 )) = [HbO2 ] (RεHbO2 (λ2 ) − εHbO2 (λ1 ))

(2.14)

Adding [HbO2 ] (RεHb (λ2 ) − εHb (λ1 )) to both sides: ([Hb] + [HbO2 ]) (εHb (λ1 ) − RεHb (λ2 ))

(2.15)

= [HbO2 ] (RεHbO2 (λ2 ) − εHbO2 (λ1 ) + RεHb (λ2 ) − εHb (λ1 ))

(2.16)

Rearranging: εHb (λ1 ) − RεHb (λ2 ) [HbO2 ] = [HbO2 ] + [Hb] (εHb (λ1 ) − εHbO2 (λ1 )) − R(εHb (λ2 ) − εHbO2 (λ2 )) = Sp O2 The light absorption measurements taken my a standard portable pulse oximeter are know as digital photoplethysmograms (DPP) or “pleth measurements” for short. Pulse oximeters commonly use monochromatic light emitter diodes (LEDs) and photodiodes for photodetectors. For Sp O2 calculations, the wavelengths that yield the best results are red (660 nm) and infrared (940 nm) [3]. However, the relationship between R and Sp O2 deviates slightly from theory. This is because second order (and

31 higher) scattering effects have been neglected, the wide bandwidth of LEDs (20-50 nm), and because the assumptions about the two path length changes in Equation 2.10 are not absolutely true [1]. Thus, an empirical relationship between R and Sp O2 must be determined for each particular sensor design by plotting the R value against Sa O2 values (see Figure 2.6).

Figure 2.6: Empirical Sa O2 vs R curve. From Rusch p. 148 [3] The R value is calculated from the DPP by taking the normalized ratio of the red absorbance to the infrared absorbance. The normalized value is calculated by dividing the AC component of the absorbance at that frequency by the DC component (see Equation 2.17) [3] which is analogous to taking the time derivative of the absorbance. R=

ACred /DCred ACir /DCir

(2.17)

A typical empiric linear approximation to the R vs Sa O2 curve is [3]: Sp O2 = 110 − 25R

(2.18)

The AC and DC components of the light absorbance in the DPP are depicted in Figure 2.7.

32

Figure 2.7: Light absorption versus time showing the primary sources of absorption. From Rusch p 146 [4, 3].

2.2.4

Sympathetic tone and the PPG

The PPG is the inverted returned light waveform as discussed in Section 2.2.3. Essentially, the more blood that passes through the light path, the less light returned. The less light returned in a given pulse, the smaller the pulse amplitude will be. Thus, vasoconstriction should cause a decrease in the amplitude of the PPG pulse height. In the past decade, research on the effects of sympathetic tone on the raw PPG has had promising, although not statistically validated, results [18, 19]. Shelley, et al, showed that vasoconstriction (sympathetic activation) has a very noticeable affect on the PPG pulse amplitude and baseline [18, 19]. Figures 2.8 and 2.9 show the effects of vasoactive drugs on the arterial blood pressure and PPG. In Figure 2.8, the PPG pulse height decreases and the blood pressure in response to the vasoconstrictive drug phenylephrine being administered to a hypotensive patient undergoing surgery. In Figure 2.9, the PPG pulse height decreases as the arterial blood pressure increases in response to a surgical incision. Although the patient is anesthetized and

33

Figure 2.8: Figure showing reduction in PPG pulse amplitude and simultaneous rise in blood pressure after a vasoconstrictive drug (phenylephrine) administered. From Shelley p. 423 [18]. can not feel anything, surgical incision causes the typical sympathetic system reaction to pain.

Figure 2.9: Figure showing the response of the PPG and arterial blood pressure to surgical incision. From Shelley p. 422 [18].

In the following chapter we investigate the effect of sympathetic activation on the PPG.

Chapter 3 Methods To test our hypothesis, we simulated a sudden change in sympathetic tone by performing the “Supine-Standing” experiment (described below). We then preprocessed the raw data and investigated frequency components and statistics in the PPG and HRV signal and how these data changed over time. This chapter describes the experimental protocol and signal processing techniques employed to analyze the data.

3.1

Supine-Standing Experiment

To simulate a rapid change in sympathetic tone resulting from a sudden decrease in arterial pressure, we performed the classic supine-standing experiment. In this experiment, a person is in the supine position (lying down on his/her back) and then stands up suddenly. This change in body position from horizontal to vertical causes a sudden drop in arterial pressure due to the effects of gravity pulling blood into the lower extremities. This activates the baroreceptor reflex, sympathetic arterial constriction and increased heart rate. In our experiments, we chose six healthy subjects (two female, four male) between 34

35 the ages of 20 and 30 in order to resemble the demographics of the military and first responder personnel. In these experiments, the PPG waveform collected by the NoninTM (Plymouth, MN, USA)1 sensor was preprocessed using the Nonin DSP hardware2 attached to the sensor and logged on a PC. The resulting PPG data was analyzed using MatlabTM software using the signal processing techniques described below. For each subject we collected PPG data for four minutes. The forehead reflectance probe was attached to the subject using Nonin adhesive and a headband after the skin had been cleaned with SkinPrepTM . For the first two minutes the subject was lying down. At two minutes, subject stood up and remained stationary while standing for another two minutes. This process was repeated three times for each subject for a total of 18 trials. The PPG was collected at a sampling rate of 75 Hz and recorded to a PC.

3.1.1

Pulse extraction from the PPG

In order to do HRV analysis, individual pulses had to be extracted from the PPG waveform. Figure 3.1.1 shows examples of a typical series of pulses from a PPG waveform. In each pulse, there is a main pulse as the blood flow increases sharply with the ejection of blood from the left ventricle. Sometimes there is also a minor pulse riding on the end of the main pulse known as the dicroic wave (see left plot of Figure 3.1.1). The dichroic wave results from a combination of the aortic valve 1 2

Example data format in Appendix B. Nonin OEM evaluation kit.

36 closure and a reflected wave from the upper or lower body [5].

a.) PPG pulse with dicroic wave

b.) PPG pulse without dicroic wave

Figure 3.1: Example pulse trains from PPG waveform with and without dicroic wave.

We used a simple home-grown algorithm to extract pulses: 1. Find all local maximas and minimas in the data set. 2. Sweep through the first 1.2 seconds of data and find the maximum of that segment. This is considered the first main pulse34 . 3. Look ahead in the data set by 50 % of the beat interval 5 .Is there another local maxima? If so, this is classified as the dicroic wave. 4. Store the PPG data segment into a structured array starting from the local minima preceding the main pulse and ending at the minima following the main pulse or the dicroic wave if there is one detected. This is done so statistics can be done on each pulse (height, width, beat to beat interval, etc). 3

This method could skip the first actual pulse, but gives us a better chance that we are starting off on a main pulse rather than a dicroic wave. 4 We chose 1.2 seconds as the starting window because it is a maximum time window in which we should see at least one pulse. 5 Inverse heart rate as measured by the sensor (if this is a reasonable value) or the previous beat to beat interval measured by this algorithm.

37 5. Go to next local maxima and repeat the previous 2 steps.

3.1.2

Re-Sampling and filtering

After the pulses were extracted from the PPG, the beat-to-beat interval signal (HRV signal) and other derived pulse signals (pulse height, pulse width, etc.) were resampled at 10 Hz 6 . These signals were then passed through a high-pass Butterworth filter (5th order) with a cutoff frequency fc = 0.05 Hz in order to subtract the mean (i.e., remove DC components7 ). This filter’s frequency response can be seen in Figure 3.2. The re-sampling was done because pulse peak times are not evenly spaced in time. The signal processing techniques described below rely on evenly spaced samples. Thus, we had to interpolate8 between pulse peak times at regularly spaced intervals in order to construct the HRV signal and other derived pulse statistics signals.

3.2

Signal processing

Signals such as the HRV signal do not lend themselves easily to interpretation in the time domain alone [5]. New information is revealed when a signal is transformed into the frequency domain. 6

A standard re-sampling frequency for ECG R-R intervals [20]. This is done because the large DC component washes out other frequency components in the PSD. 8 We used cubic spline interpolation, an accepted method of HRV re-sampling [20]. 7

38

High Pass Filter Frequency Response

Magnitude (dB)

0

−5

−10

−15

0

0.5

1

1.5

2

0

0.5

1

1.5

2

2.5 3 Frequency (Hz)

3.5

4

4.5

5

3.5

4

4.5

5

−50 Phase (degrees)

−100 −150 −200 −250 −300 −350 −400

2.5

3

Frequency (Hz)

Figure 3.2: Frequency response for the high-pass Butterworth filter, fc = 0.05 Hz.

3.2.1

The Fourier Transform

To describe a signal in the frequency domain, we transform the signal from the time domain using the Fourier Transform (FT). Y (ω) =

∞ X

y(n)e−iωn

(3.1)

n=−∞

where y(n) is the sampled signal and ω is the normalized frequency variable (0 ≤ ω ≤ 2π). Because it is impossible to have an infinite number of samples in the real world, we transform a segment of a signal into the frequency domain using the discrete Fourier Transform (DFT) (see equation (3.2)). Y (m) =

N −1 X

y(n)e

−i2πmn N

,

n=0

m = 0, 1, 2, · · · , N − 1

(3.2)

where , N is the total number of samples, m is the frequency sample index, and fs is the sampling frequency. In discrete time, ω =

2πfs m . N

39 From the DFT, we can calculate the amount of energy in each frequency component of the sampled signal. This is called the power spectral density (PSD) and is defined: S(ω) = |X(m)|2 .

3.2.2

(3.3)

The Short-Time Fourier Transform

The PPG is not a stationary signal. That is, the frequency components are not constant over time. Taking the FFT of the data during an entire experiment run would calculate the frequency components in the signal, but not show us how they changed over time. Thus, we employed the Short Time Fourier Transform (STFT). The STFT is essentially an FFT of a smaller, but overlapping, segments of data taken at regular time intervals. With the STFT, we can see how the frequency components change over time.

3.2.3

Autoregressive analysis

The discussion of AR analysis in this section follows closely to that in Rangayyan section 7.2 and 8.6 [5]. The FFT can only compute an accurate PSD given either an infinite number of samples of a non-stationary signal or a limited number of samples of a completely stationary signal. Not only do we not have infinite samples, but the PPG and the HRV are not stationary. Thus, we investigated another signal processing technique, autoregressive analysis (AR), which allows us to calculate the PSD more accurately using short segments of data[5, 21].

40 The AR approach uses a mathematical model to represent the process or system that generates the signal. The parameters of the model can be used for further analysis of the signal. This parametric modelling is useful because the model parameters often have physical meaning and efficiently represent the signal of interest. In AR modeling9 , the output signal to the AR system is modelled as a linear combination of P past values of the output and the present input sample: y(n) = −

P X k=1

ak y(n − k) + Gx(n)

(3.4)

where x(n) is the present input signal and y(n) is the present output signal. The corresponding all-pole transfer function is H(z) =

1+

G PP

k=1

ak z −k

.

(3.5)

Using this modelling approach, the input, x(n), is unknown. Thus, we can only approximate the current output, y˜(n), using its past values: y˜(n) = −

P X k=1

ak y(n − k)

(3.6)

The error, or residual, in the predicted value is then: e(n) = y(n) − y˜(n) = y(n) +

P X k=1

ak y(n − k).

(3.7)

Equation (3.7) is symbolically represented in signal flow diagram figure 3.3. Then the error is minimized with respect to model order parameters ak . The total squared error (TSE) is defined as: ǫ=

X n

9

2

e =

X¡ n

y(n) +

P X k=1

ak y(n − k)

¢2

(3.8)

Sometimes AR modelling is referred to as “all pole modelling” or simply “LP” modelling.

41

Figure 3.3: Signal-flow diagram of AR error adapted from Rangayyan [5] p. 333. Taking the derivative of Equation 3.8 with respect to ak and setting it to zero yields: ∂ǫ = 0, ∂ak P X k=1

ak

X n

y(n − k)y(n − i) = −

1≤k≤P X n

y(n)y(n − i),

(3.9)

1 ≤ i ≤ P.

(3.10)

Equation (3.10), also called the normal equations, thus provides a set of P equations for P unknowns (ak , k = 1, 2, · · · , P ). This method is sufficient to compute parameters ak for small model orders but is not feasible for large P. For large model orders, autocorrelation functions are used in the calculation of model parameters. The autocorrelation function (ACF) for a given signal (y(n), n = 0, 1, · · · N − 1) is defined: φy (i) = f rac1N

NX −1−i n=i

y(n)y(n − i),

i ≤ 0.

(3.11)

The normal equations become: P X k=1

ak φy (i − k) = −φy (i),

1 ≤ i ≤ P.

(3.12)

42 or in matrix form:  φy (0)  φy (1)   ..  .

φy (1) φy (0) .. .

. . . φy (P − 1) . . . φy (P − 2) .. ... . φy (P − 1) φy (P − 2) . . . φy (0)

    

a1 a2 .. . aP





     = −  

φy (1) φy (2) .. . φy (P )

    

(3.13)

Thus, to derive the AR model, we only need to know its ACF and input signal samples are not required. These normal equations (Equation 3.13 can be solved recursively using the Levinson-

Durbin algorithm. In short, this algorithm starts with model order P = 1, computes the model parameters ak , the error, and another set of secondary parameters called the reflection coefficients. Then, the model order and parameters are updated until the desired model order is reached. This algorithm is detailed in appendix A.

3.2.4

Burg AR method

The linear prediction coefficients ak can be accurately and efficiently computed using a variety of AR techniques including the covariance method, the Yule-Walker method, and the Burg method. We chose to use the Burg AR method because it is more stable than other methods [12, 22, 21]. The burg method uses both forward and backward prediction errors: ǫm =

N X

eP f 2 (n) + eP b2 (n)

(3.14)

n=m+1

where ǫm is the performance index, eP f 2 (n) is the forward prediction error, eP b2 (n) is the backward prediction error, and the model order m is recursively updated10 . 10

Details are included in [5] chapter 8.

43

Figure 3.4: Signal flow diagram of Burg AR forward/backward prediction error. From Rangayyan p. 426 [5] Figure 3.4 shows the signal flow diagram for the forward and backward prediction errors. Thankfully, Matlab has employed the AR Burg method in an easy to use way. We took advantage of Matlab’s arburg and pburg functions to compute the model order, autoregressive PSD, reflection coefficients, and prediction error.

3.2.5

Model order selection

Selection of the model order is a critical part of AR analysis. The wrong model order will give inaccurate PSD estimation. A model order that is too low will not show all the frequency components while a model order that is too hight will actually add frequency components to the power spectrum. We used a standard technique to select the model order in which we minimized the prediction error with respect to the model order [21, 12].

44 Below are figures showing AR error vs model order for three different subjects (see Figures 3.5, 3.6, 3.7). In all subjects, there was no significant reduction in error after model order 6. Thus, we chose model order 6 for the AR analysis. −5

Subject 1 Trial 1

x 10

1

error

0.8

0.6

0.4

0.2

0

3

4

5

6 Model Order

7

8

9

Figure 3.5: Example error vs model order plot: Subject 1 Trial 1.

45

−4

1

Subject 2 Trial 1

x 10

0.9

0.8

0.7

error

0.6

0.5

0.4

0.3

0.2

0.1

0

2

3

4

5 Model Order

6

7

8

Figure 3.6: Example error vs model order plot: Subject 2 Trial 1.

−7

Subject 4 Trial 1

x 10 3

2.5

error

2

1.5

1

0.5

2

3

4

5

6 Model Order

7

8

9

Figure 3.7: Example error vs model order plot: Subject 4 Trial 1.

46

3.2.6

Sympathetic Index calculation

To calculate the sympathetic index (RLF/HF ), we first calculated the PSD using the AR Burg method mentioned above. We then summed the power of the frequencies in both the LF and HF frequency ranges. For the HRV signal, these ranges were LF = 0.05 − 0.15 Hz and HF = 0.15 − 0.4 Hz. We also calculated a ratio RLF/HF value for the pulse height signal. Since there has been no research on a ratio of frequencies analysis, we had to determine our own LF and HF bounds. By looking at the AR PSD plots, we found the major frequencies at around 0.15 Hz and 0.55 Hz. Thus for the RLF/HF value for the pulse height, we chose the ranges LF = 0.05 − 0.3 Hz and HF = 0.3 − 1 Hz.

Chapter 4 Results In this study, the FFT and AR analysis were applied to the raw PPG data and other derived signals (HRV, pulse height).1 Figure 4.1 shows an example of the raw PPG data and corresponding frequency analysis. The top plot is the raw PPG during a trial. The middle plot shows AR PSD of the raw PPG signal. The AR model order was chosen as p = 25 as discussed in Section 3.2.5. The bottom plot shows the STFT PSD of the raw PPG. For the STFT, we used a 512 point FFT, with a Kaiser window and 90% overlap. For both the AR and STFT PSDs, the color scale goes from blue, low, to red, high. In each trial the subject stood up at 120 seconds. The most striking feature in the figure is the sudden change in amplitude of the PPG signal after the subject stands up. Further analysis of this amplitude change will be discussed in Section 4.2.2. Secondly, note how the AR presents a clearer picture of the frequency components when compared to the FFT. The AR PSD shows the fundamental frequency components while the STFT PSD shows many harmonics and 1

The Matlab code used for analysis can be found in Appendix C.

47

48 is much harder to quantify and interpret.

Figure 4.1: Example frequency analysis of raw PPG. Top plot shows the raw PPG. Middle plot shows AR analysis (p=25) of the PPG. Bottom plot shows the STFT of the raw PPG.

49

4.1

Pulse Statistics

In this section we summarize our analysis and results for parameters calculated from the raw PPG signal. In this study, the HRV (or beat-to-beat-interval) signal, pulse height signal, and pulse width (full width half max or FWHM) signal were computed from the raw PPG. Figures (4.2, 4.3, 4.4) show examples of these derived pulse statistics from several different subjects. − Stats PPG

110 100

FWHM (s)

0

50

100

150

200

250

0

50

100

150

200

250

0

50

100

150

200

250

0

50

100

150

200

250

0

50

100

150

200

250

2 1 0

120 100

height (ppg)

peaks (ppg)

B2B interval

90

80 40 20 0 1 0.5 0

time (s)

Figure 4.2: Top plot shows raw PPG, 2nd plot shows beat-to-beat interval, 3rd plot shows peak PPG value for each pulse, 4th plot shows pulse height of each pulse, 5th plot shows the pulse width (FWHM) of each pulse. Note the increase in the variability of the beat-to-beat interval, the decrease in pulse height, and the increased scatter of the pulse widthafter the subject stands up (120 seconds).

50 ppg 120 110 100 90 HP filtered b2b 1 0.5 0 −0.5 Mean b2b values, wlen=64 samples 0.02

0

−0.02 Variance b2b values, wlen=64 samples 0.02

0.01

0

0

20

40

60

80

100

120

140

160

180

200

Figure 4.3: Top plot shows the raw PPG, 2nd plot shows high-pass filtered HRV signal(i.e. DC component subtracted),3rd plot shows the sliding windowed average (64 samples in each window) of high pass filtered HRV signal, 4th plot shows HRV variance over time. In Figure 4.3 note how the increase in variability of the HRV signal is more prominent with the DC component subtracted (second and third plots). Also, note the increase in beat-to-beat interval variability after the subject stands up at 120 seconds(bottom plot).

51 ppg 120 110 100 90 HP filtered height 20 0 −20 −40 Mean height values, wlen=64 samples 5

0

−5 Variance height values, wlen=64 samples 60 40 20 0

0

50

100

150

200

Figure 4.4: Top plot shows the raw PPG, 2nd plot shows the high-pass filtered pulse height signal, 3rd plot shows the sliding windowed average (64 samples in each window)of the high pass filtered height, 4th plot shows pulse height variance over time. We believe that the variations in the pulse height amplitude (middle two plots) are the respiratory induced amplitude variations (RIAV) discussed in a previous chapter. A slight windowed averaging (third plot, above figure) shows what looks like an ideal RIAV signal. This will further help us calculate the respiration rate.

52

4.2 4.2.1

Statistical and frequency analysis Beat-to-Beat interval analysis

This section details analysis of the HRV or beat-to-beat interval signal using both AR and FFT methods as well as standard statistical methods. Typically, the AR PSD presents a picture of the frequency components of the signal that is easier to interpret. Figure (4.5) shows the PSD calculated using both AR (p=6) and the FFT (n=128) for a common segment of HRV signal. Our data shows that the FFT (in red) is much more variable than the AR PSD (in blue). Because the AR method consistently produced results that were easier to interpret than the FFT method, we used the AR PSD to calculate RLF/HF value. PSD Estimate 0 AR FFT

Power Spectral Density (dB/Hz)

−20

−40

−60

−80

−100

−120

0

0.5

1

1.5

2

2.5 3 Frequency (Hz)

3.5

4

4.5

5

Figure 4.5: AR PSD (blue) and FFT PSD (red) of the same segment of HRV data. Note how the AR PSD is much smoother and smoother and easier to interpret.

53 Figure 4.6 shows the summary of some statistics and frequency ratio analysis in approximately 15 second windows in one subject. Note the increase in RLF/HF 2 (second plot), the decrease in beat-to-beat interval mean3 (third plot), and an increase in beat-to-beat variability. ppg PPG units

120

100

80 AR Ratio: ~15 s windows

R

lf/hf

1

0.5

0 mean b2b: ~15 s windows seconds

1

0.5

0 var B2B : ~15 s windows variance

0.02

0.01

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Figure 4.6: Top plot shows the raw PPG, 2nd plot shows the low-high frequency ratio (RLF/HF ), 3rd plot shows the mean beat-to-beat interval in 15 second windows, and the 4th plot shows the variance of the beat-to-beat interval in 15 second windows.

2

An increase in RLF/HF corresponds to increased sympathetic activation as discussed in Section 2.1.4. 3 Note that a decrease in beat to beat interval corresponds to an increase in heart rate.

54 AR 2 5

1.8 4.5

1.6 4

1.4 3.5

1.2 Frequency

3

1

0.8

2.5

2

0.6

1.5

0.4

1

0.2

0.5

0

0

20

40

60

80

100 120 Time (s)

140

160

180

200

a.) AR spectrogram

0 0

20

40

60

80

100 Time

120

140

160

180

200

b.) STFT spectrogram

Figure 4.7: Example AR and STFT spectrograms of HRV signal Figure 4.7 shows an example of AR and STFT spectrograms of the same HRV data. Note how the AR spectrogram is much easier to interpret than the FFT spectrogram. We then calculated the average of the mean, variance, and RLF/HF of the beatto-beat interval in three segments: before, during, and after the subject stood up. Figure 4.8 shows an example for one trial (Subject 2, Trial 3). Cumulative averages for all subjects are shown in Figure 4.9. Note the decrease in beat-to-beat interval (a.), the increase in variance (b.), and the increase in RLF/HF (c.).

55

a.) Average beat-to-beat interval

b.) Beat-to-beat variance

c.) RLF/HF Figure 4.8: Summary of HRV signal statistics before, during, and after the subject stood up. Figure 4.9 shows the cumulative results for the HRV signal before, during, and after for all trials in all six subjects. Error bars on the following plots represent stan√ dard error (σ/ N ). Note the decrease in beat-to-beat interval (a.), the increase in variance (b.), and the increase in RLF/HF (c.). Although the changes in all parameters are prominent in the plots, when analysis of variables (ANOVA) was performed for all parameters (testing that the before values and after values are from the same group), the “P” values were higher than expected in most cases. For the beat-to-beat interval, P = 0.0045 (in this case, the decrease in beat-to-beat interval was statistically significant). For the beat-to-beat variance, P = 0.264, and for the beat-to-beat

56

a.) Average beat-to-beat interval

b.) Beat-to-beat variance

c.) RLF/HF Figure 4.9: Cumulative results: HRV signal statistics before, during, and after subjects stood up. RLF/HF value, P = 0.236. We believe that the high P value can be attributed to the variability in the raw PPG waveform among individuals. We believe a normalization between all subjects would improve the statistical significance of this study.

57

4.2.2

Pulse height analysis

This section presents the analysis of the pulse height signal. Figure 4.10 shows an example summary of statistics and frequency analysis of the pulse height in approximately 15 second windows. The decrease pulse height is prominent even in the raw PPG (top plot). It is even more prominent in the third plot when the pulses are extracted and the pulse height4 is calculated. The variance and RLF/HF , however, do not show any significant change, apart from the small time while the subject stood up, in this trial.

4

Pulse height is defined as the difference between the peak value in the pulse and the previous valley

58 ppg 120

100

80 AR Ratio: 10 sample windows

R

lf/hf

10

5

0 mean H: 10 sample windows ppg units

20

10

0 var H :10 sample windows variance

20

10

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

Figure 4.10: Top plot shows the raw PPG, 2nd plot shows the low-high frequency ratio (RLF/HF ), 3rd plot shows the mean pulse height in 15 second windows, and the 4th plot shows the variance of the pulse in 15 second windows. Then the average of the mean, variance, and RLF/HF of the pulse height were calculated in three segments: before, during, and after the subject stood up. Figure 4.11 shows an example of these calculations for one trial (Subject 3, trial 3). Cumulative averages for all subjects are shown in Figure 4.12. Note the decrease in pulse height amplitude (a.), the decrease in pulse height variance (b.), and the increase in RLF/HF (c.) for this subject.

59

a.) Average pulse height

b.) pulse height variance

c.) RLF/HF Figure 4.11: Example Before, During, After statistics of pulse height signal. Figure 4.12 shows the summary statistics for the pulse height before, during, and after the subjects stood up for all trials. Error bars on the following plots √ represent standard error (σ/ N ). Note the decrease pulse height amplitude (a.), the slight decrease in variance (b.), and the slight decrease in RLF/HF (c.). Although the decrease in the pulse height was prominent in the plot, when ANOVA was performed (testing that the before values and after values are from the same group), the “P” value was higher than expected(P = 0.2064). Because there was clearly no significant before/after changes in the other data (as indicated by the overlapping error bars) we did not run ANOVA test for other pulse height parameters. We believe that the high P value can be attributed to the variability in the raw PPG waveform among individuals. We believe a normalization

60

a.) Average pulse height

b.) Pulse height variance

c.) RLF/HF Figure 4.12: Cumulative results: Before/During/After pulse height signal between all subjects would improve the statistical significance of this study.

61

4.2.3

Model order, frequency bounds

In addition to the model order we chose for the HRV signal, we performed the same analysis using different model orders and different frequency bounds to see if the RLF/HF value would change. First, we tried using model order p=14; a model order that is most commonly used for HRV analysis [12]. We used the same frequency bounds as before (LF = 0.05−0.15 Hz and HF = 0.15 − 0.4 Hz). Later, we tried model order p=14 with different frequency ranges. Looking at the AR PSD, we typically found peaks at 0.15 Hz and 55 Hz (which is very similar to the peaks we found in the pulse height data (see Section 3.2.6)). After performing ANOVA on the RLF/HF values (testing that the before and after RLF/HF values were from the same group) using the different model orders and frequency bounds mentioned above, we concluded that a higher model order and different frequency bounds did not significantly improve our results. Table 4.1 summarizes these results. Thus, for this study, we believe that our model order selection for this study was sufficient. Model Order 6 14 14

LF bounds (Hz) 0.05-0.15 0.05-0.15 0.05-0.3

HF bounds (Hz) 0.15-0.4 0.15-0.4 0.3-1.0

P value 0.236 0.1539 0.28

Table 4.1: ANOVA results for before/after RLF/HF using different model orders and LF/HF frequency bounds.

Chapter 5 Discussion The aim of our research was to investigate the feasibility of using the forehead reflectance pulse oximeter methods for remotely detecting physiological signs of injury including sympathetic system activation. We suggested that a forehead reflectance pulse oximeter is a viable sensor for detecting sudden changes in sympathetic tone. We hypothesized that there were several parameters in the raw PPG waveform that would be indicative of sympathetic activation. Specifically we hypothesized that the RLF/HF value calculated from the HRV signal would increase with sudden sympathetic activation. Therefore we performed the classic supine-standing experiment in which a subject suddenly stands up from a lying down position. This sudden change in position elicits a strong sympathetic activation. Based on statistical and spectral analysis of the raw PPG, the HRV signal and the pulse height signal, our data showed after the subjects stood up, the mean beat-tobeat interval decreased, the variance of the beat-to-beat increased, he RLF/HF value

62

63 for the beat-to-beat interval signal (using AR analysis, p=6, LF = 0.05 − 0.15 Hz HF = 0.15 − 0.4 Hz) increased, and the mean pulse height decreased significantly. Further, our analysis show that AR analysis is more appropriate for analyzing pulse statistics such as HRV and pulse height. We believe that the sudden decrease in beat-to-beat interval, increase in beatto-beat variability, and increase in RLF/HF correspond to increase in sympathetic activity resulting from sudden positional change. In addition, we believe that the sudden decrease in pulse height corresponds to an increase in sympathetic activity. As discussed before, increased sympathetic activity causes vasoconstriction. Because the pulse height correlates with blood volume, we would expect the pulse height to go down in response to vasoconstriction. This is exactly what we observed. Although the changes in the HRV and pulse height signal are significant, ANOVA1 “‘P” values were higher than expected in most cases. For the beat-to-beat interval2 , P = 0.0045; for the beat-to-beat variance, P = 0.264; for the beat-to-beat RLF/HF value, P = 0.236; and for the pulse height, (P = 0.2064). We believe that the high P value can be attributed to the variability in the raw PPG waveform among individuals. We believe a normalization technique applied to the data of all the subjects would improve the statistical significance of this study. We conclude that the trends in the pulse statistics variables, such as the HRV 1 2

Testing that the before values and after values are from the same group. In this case, the decrease in the before/after value was statistically significant

64 signal and pulse height signal, can be used to detect changes in sympathetic tone resulting from positional change. But we also believe that further research is needed to fully validate the use of the forehead reflectance pulse oximeter and the data analysis described in this thesis for remote triage systems. Future research plans are discussed in the next chapter. We hope this work will be applied to remote triage systems such as ARTEMIS and help save the lives of soldiers or first responders and medics who put themselves at risk getting to them.

Chapter 6 Ongoing and Proposed Experiments 6.1

Treadmill Experiments

We are currently testing the ability of the forehead reflectance pulse oximeter to measure standard parameters of heart rate, Sp O2 , and PPG in the presence of noise; to see if amplitude variations in the PPG are consistent with respiratory frequencies; and to see if the sensor is sensitive to changes in sympathetic tone induced by exercise. In this experiment, we will attach a forehead reflectance pulse oximeter and an accelerometer to a subject standing on a treadmill and start a video recording making note of the time. Data from the pulse oximeter and accelerometer will be continuously logged on a laptop computer. One minute of baseline recordings will be collected while the subject stands still on the treadmill. The treadmill will be started at 2.0 mph and will stay at this speed for two minutes. Then the treadmill speed will be increased by 0.5 mph every one minute until either fatique or a speed of 5.0 mph is reached. One minute of recovery data will be collected. Finally, the data will be analyzed using

65

66 Matlab and Labview. Figure 6.1 shows preliminary results from these experiments.

peaks (ppg)

100

200

300

400

500

600

0

100

200

300

400

500

600

0

100

200

300

400

500

600

0

100

200

300

400

500

600

0

100

200

300 time (s)

400

500

600

0.5

120 100

height (ppg) FWHM (s)

0 1

B2B interval

PPG

Treadmill Expt. − Stats 140 120 100 80 60

30 20 10 0 0.5

0

Figure 6.1: Preliminary results from treadmill experiment

Based on this data, we speculate that we will observe changes in the PPG and pulse statistics consistent with exercise physiology and that we will be able to determine weather or not the forehead reflectance pulse oximeter collects a useable PPG waveform in the presence of motion similar to that of soldiers or first responders moving in the field.

67

6.2

Post Operative Recovery Room Experiments

In addition to the treadmill experiments, we are currently doing a clinical experiment1 in which we study the PPG of post-operative patients. The physiological effects of anesthesia are similar to that of a head injury (depressed respiratory function, lack of or low level of consciousness, and non-responsiveness to pain). In addition, the physiological response to pain is often vasoconstriction. We are studying the evolution of the PPG signal as the patient wakes up from surgery to see if there is any predictive statistic of head injury and/or airway obstruction. Figure 6.2 shows preliminary results from these experiments. Note the sudden changes in PPG amplitude at approx. 100 second intervals. We believe that this is results from cyclic vasoconstriction as the patient becomes more awake and aware of pain.

1

Dartmouth Hitchock Medical Center, Committee for the Protection of Human Subjects IRB approval, June 2003.

68 PACU Trial 9 − Stats PPG

200 150 100 200

400

600

800

1000

1200

1400

1600

1800

0

200

400

600

800

1000

1200

1400

1600

1800

0

200

400

600

800

1000

1200

1400

1600

1800

0

200

400

600

800

1000

1200

1400

1600

1800

0

200

400

600

800 1000 time (s)

1200

1400

1600

1800

0.8

peaks (ppg)

0.6 200

100

FWHM (s)

0 1

height (ppg)

B2B interval

50

150 100

50 0 0.5

0

Figure 6.2: Preliminary results from PACU experiment

6.3

Sleep Study Experiments

We are also conducting a study on subjects with known sleep apnea disorders2 We are investigating the use of the forehead reflectance pulse oximeter to detect airway obstruction and how fast Sp O2 values decreases during apneic episodes. We are also analyzing other parameters calculated from the PPG including the HRV signal, pulse width, and the height to width ratio to investigate and quantify any correlation with events such as normal respiration, blood pressure change, and airway obstruction. 2

This study also has DHMC CPHS IRB approval, June 2003.

69

6.4

Lower Body Negative Pressure (LBNP) Experiments

We are planning an experiment which safely simulates acute hemorrhage and/or hypovolemia using a lower body negative pressure (LBNP) device. This device is essentially a modified iron lung that produces a vacuum below the waist which pulls the blood from the upper body into the gut and lower extremities. We will use similar statistical and frequency analysis to determine if and how the sympathetic tone changes show up in the PPG and how they differ from those resulting from positional change and exercise.

6.5

Pressure Experiments

Shelley, et al, claim there is a relationship between the pressure placed on the forehead probe of a forehead reflectance pulse oximeter and the quality of the PPG waveform and accuracy of Sp O2 calculations[23]. Shelley, et al, suggest that the venous pulsation causes a noisy PPG and interferes with the computation of Sp O2 . By adding pressure to the probe, it was observed that the PPG waveform evolved into the expected arterial waveform. This result could be due to damping out the venous pulsation by applying pressure. We are planning an experiment that investigates these anecdotal claims and quantifies the correlation between the pressure exerted on the forehead probe the quality of the PPG signal.

70

6.6

Neural Networks

In addition to these experiments, we are also investigating the use of multi-layer perceptron (MLP) neural networks to automatically detect changes in sympathetic tone. We will construct an MLP neural network (NN) for each of the following signals: the raw PPG, the HRV signal, the PPG pulse height signal, and the PPG pulse width signal. The input to the neural network will be the AR filter coefficients calculated using the AR Burg method. We will train the neural network using data from all of the subjects in the supine-standing experiment. Then we will test the neural network on data from a new subject. We will determine which, if any, neural network is able to automatically detect a sudden change in sympathetic tone and how well the NN is able to do so.

Appendix A Levinson-Dubrin Algorithm This appendix summarizes the steps in the Levinson-Dubrin recursive algorithm for autoregressive model parameter and error calculation1 . This algorithm computes the model parameters for all orders up to the desired model order P . As P is increased, the TSE is decreased. 1. Initialize model order i = 0 and error ǫ0 = φy (0). 2. Perform following steps recursively for i = 1, 2, · · · , P . 3. Increment model order i = i + 1 and compute the ith reflection coefficient γi : γi = −

"

1 φy (i) + ǫi − 1

i−1 X j=1

ai−1,j φy (i − j)

#

(A.1)

where ai−1,j is the j th model coefficient of the (i − 1)th iteration. Note that |γi | < 1, i = 1, 2, · · · , P is a requirement for stability. 4. Let ai,i = γi . 1

This summary follows closely to the description in Rangayyan, Sect. 7.5 [5]

71

72 5. Update predictor coefficients: ai,j = ai−1,j + γi ai−1,i−j ,

1 ≤ j ≤ i − 1.

(A.2)

6. Compute the error value: ¡ ¢ ǫi = 1 − γi2 ǫi−1

(A.3)

Appendix B Pulse oximeter data format Format of nonin data text file by column: [1] wavefrom [2]perfusion [3]sensorStatus [4]fieldName [5]fieldValue Notes on [1]waveform: Sample frequency 75 Hz Plethysmograph values 0-254 Notes on [2]perfusion values: 0 for green, 1 for yellow or 2 for red We don’t really use this field because no one knows what it means. Notes on [3]SensorStatus: true when sensor thinks it’s on and working false when it’s not working. Notes on [4]fieldName from NONIN ”ipod Evaluation Kit Instruction Sheet” All fields polled 3 times/second Data Description: SPO2: values 0-100, 127=bad data HRMSB: heart rate high bits (value 128-511 bpm), 511=bad data HRLSB: heart rate low bits (value: 0-127 bpm) BBV: beat to beat SpO2 value REV: Firmware revision level1 Extended averaging: ESPO2: 0-100 EHRMSB EHRLSB SPO2SLEW - non-slew limit with standard averaging Display fields: SPO2D: 0-100 1

If you’re actually reading this, e-mail me at [email protected] . Tell me your favorite color and I’ll buy you a six pack.

73

74 HRDMSB HRDLSB ESPO2D Example of nonin output text file ’example.txt’ : 107 0 true HRMSB 0 107 0 true HRLSB 69 108 0 true SPO2 100 109 0 true REV 35 109 0 true NONE 100 109 0 true NONE 0 109 0 true NONE 0 110 0 true NONE 0 110 0 true SPO2D 100 109 0 true SPO2SLEW 100 109 0 true BBV 100 108 0 true NONE 0 107 0 true NONE 0 106 0 true EHRMSB 0 106 0 true EHRLSB 69 105 0 true ESPO2 100 104 0 true ESPO2D 100 104 0 true NONE 0 103 0 true NONE 0 103 0 true HRDMSB 0 102 0 true HRDLSB 69 102 0 true EHRDMSB 0 101 0 true EHRDLSB 69 101 0 true NONE 0 100 0 true NONE 0 100 0 true HRMSB 0 99 0 true HRLSB 69 99 0 true SPO2 100 98 0 true REV 35 97 0 true NONE 100

Appendix C Matlab Code C.1

Main file

% name: thesis.m % purpose: data analysis for get up stand up exp, used for thesis % author: Suzanne Wendelken, May 2004 close all; clear all; % % % % % % % % % % % % % % % % % % % %

fun with nonin part 3: Get up Stand up ------------------------note: when stand up time != 120s, ppg data cut from beginning to make tstand=120s Subject 1---------Trial 1 tstand=120 [ppg, perf, status, fieldName, fieldValue]=... textread(’..\nonin\data\fun\part3\subject1\log20040324132600.txt’, ’%u %u %s %s %u’); Trial 2 tstand=150 [ppg, perf, status, fieldName, fieldValue]=... textread(’..\nonin\data\fun\part3\subject1\log20040324133631.txt’, ’%u %u %s %s %u’); ppg=ppg(75*30:length(ppg)); Trial 3 tstand=120 [ppg, perf, status, fieldName, fieldValue]=... textread(’..\nonin\data\fun\part3\subject1\log20040324134606.txt’, ’%u %u %s %s %u’); Subject 2--------Trial 1 tstand=120 [ppg, perf, status, fieldName, fieldValue]=... textread(’..\nonin\data\fun\part3\subject2\log20040324140730.txt’, ’%u %u %s %s %u’); Trial 2 tstand=150 [ppg, perf, status, fieldName, fieldValue]=...

75

76 % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %

textread(’..\nonin\data\fun\part3\subject2\log20040324141759.txt’, ’%u %u %s %s %u’); ppg=ppg(75*30:length(ppg)); Trial 3 tstand=120 [ppg, perf, status, fieldName, fieldValue]=... textread(’..\nonin\data\fun\part3\subject2\log20040324142800.txt’, ’%u %u %s %s %u’); Subject 3---------Trial 1 tstand=135? [ppg, perf, status, fieldName, fieldValue]=... textread(’..\nonin\data\fun\part3\subject3\log20040324144249.txt’, ’%u %u %s %s %u’); ppg=ppg(75*15:length(ppg)); Trial 2 tstand=120 [ppg, perf, status, fieldName, fieldValue]=... textread(’..\nonin\data\fun\part3\subject3\log20040324145203.txt’, ’%u %u %s %s %u’); Trial 3 tstand=120 [ppg, perf, status, fieldName, fieldValue]=... textread(’..\nonin\data\fun\part3\subject3\log20040324150255.txt’, ’%u %u %s %s %u’); Subject 4---------Trial 1 tstand=120 [ppg, perf, status, fieldName, fieldValue]=... textread(’..\nonin\data\fun\part3\subject4\log20040324151816.txt’, ’%u %u %s %s %u’); Trial 2 tstand=125 [ppg, perf, status, fieldName, fieldValue]=... textread(’..\nonin\data\fun\part3\subject4\log20040324152530.txt’, ’%u %u %s %s %u’); ppg=ppg(75*5:length(ppg)); Trial 3 tstand = 120 [ppg, perf, status, fieldName, fieldValue]=... textread(’..\nonin\data\fun\part3\subject4\log20040324153500.txt’, ’%u %u %s %s %u’); Subject 5---------Trial 1 tstand=130 [ppg, perf, status, fieldName, fieldValue]=... textread(’..\nonin\data\fun\part3\subject5\log20040324160404.txt’, ’%u %u %s %s %u’); ppg=ppg(75*20:length(ppg)); Trial 2 tstand=120? [ppg, perf, status, fieldName, fieldValue]=... textread(’..\nonin\data\fun\part3\subject5\log20040324161300.txt’, ’%u %u %s %s %u’);

77 % Trial 3 tstand=120 % [ppg, perf, status, fieldName, fieldValue]=... % textread(’..\nonin\data\fun\part3\subject5\log20040324163045.txt’, ’%u %u %s %s %u’); % Subject 6---------% Trial 1 tstand=120 % [ppg, perf, status, fieldName, fieldValue]=... % textread(’..\nonin\data\fun\part3\subject6\log20040414123615.txt’, ’%u %u %s %s %u’); % % Trial 2 tstand=120 % [ppg, perf, status, fieldName, fieldValue]=... % textread(’..\nonin\data\fun\part3\subject6\log20040414124300.txt’, ’%u %u %s %s %u’); % Trial 3 tstand=120 % [ppg, perf, status, fieldName, fieldValue]=... % textread(’..\nonin\data\fun\part3\subject6\log20040414124915.txt’, ’%u %u %s %s %u’); % Subject 7---------% note: on this trial, data was recorded for 2 min lying down, 2 min % standing, then about 30 s lying again. to make data set the same as % others, must trim ppg % Trial 1 tstand=120 % [ppg, perf, status, fieldName, fieldValue]=... % textread(’..\nonin\data\fun\part3\subject7\log20040414133402.txt’, ’%u %u %s %s %u’); % ppg=ppg(1:240*75); % Trial 2 tstand=120 % [ppg, perf, status, fieldName, fieldValue]=... % textread(’..\nonin\data\fun\part3\subject7\log20040414134000.txt’, ’%u %u %s %s %u’); % ppg=ppg(1:240*75); % Trial 3 tstand=120 [ppg, perf, status, fieldName, fieldValue]=... textread(’..\nonin\data\fun\part3\subject7\log20040414134600.txt’, ’%u %u %s %s %u’); ppg=ppg(1:240*75);

% read data and put into appropriate vectors------------------nonin_readData % plot PPG figure(’name’,’Photoplethysmogram’); plot(time, ppg); xlabel(’time (s)’); ylabel(’Raw Value’); axis([0 max(time) 0 250]); title(’Photoplethysmogram’);

78

% run peak detection----------------------------------disp(’Peak detection...’); nonin_peak % % run pulse stats------------------------------------disp(’Pulse Stats...’); nonin_pulseStats % % run resample----------------------------------------disp(’Resampling...’); nonin_resample % display sensor measurements (ppg, hr, spo2)-----------------figure(’name’,’Sensor measurements’); % sensor measurements subplot(3,1,1); plot(time, ppg); ylabel(’PPG’); ylim([(min(ppg)-5) (max(ppg)+5)]); title([’ - Sensor measurements’]); subplot(3,1,2); plot(stime, HR(1:length(stime))); ylabel(’HR’); ylim([(min(HR)-5) (max(HR)+5)]); subplot(3,1,3); plot(stime, SPO2(1:length(stime))); ylabel(’S_pO_2’); ylim([(min(SPO2)-5) 100]); xlabel(’Time (s)’); % display derived pulse stats figure(’name’,’Pulse stats’); % pulse stats----% using vectors defined in nonin_pulseStats, t=majorpeak.time, w=width, % h=height, stdev=standard deviation, p=majorpeak.ppg subplot(5,1,1); plot(time, ppg); ylabel(’PPG’); ylim([(min(ppg)-5) (max(ppg)+5)]); title([’ - Stats’]); subplot(5,1,2); plot(beat2beat.beatTime, beat2beat.beatInterval, ’.’); ylabel(’B2B interval’); subplot(5,1,3); plot(t, p, ’.’); ylabel(’peaks (ppg)’); subplot(5,1,4); plot(t, h, ’.’); ylabel(’height (ppg)’); subplot(5,1,5); plot(t, fwhm, ’.’); xlabel(’time (s)’); ylabel(’FWHM (s)’); % run pulseStats analysis----------------nonin_pulseStats_thesis

79

C.2 C.2.1

Subfunctions Reading the Data

1

% name: nonin_readData % purpose: reads nonin data and puts it into vectors % author: Suzanne Wendelken Feb,May 2004

len=length(ppg); % data length Fs=75; % sample frequency % pick out fields and values ------------------------------------------------% [’SPO2’, ’REV’, ’SPO2D’,’SPO2SLEW’,’BBV’,’EHRMSB’,’HRMSB’, ’EHRLSB’,... % ’ESPO2’,’HRLSB’, ’ESPO2D’, ’HRDMSB’, ’HRDLSB’, ’EHRDMSB’, ’EHRDLSB’]; tmpstr=cellstr(’SPO2’); [temp, index.spo2]=ismember(tmpstr, fieldName(1:25)); tmpstr=cellstr(’REV’); [temp, index.rev]=ismember(tmpstr, fieldName(1:25)); tmpstr=cellstr(’SPO2D’); [temp, index.spo2d]=ismember(tmpstr, fieldName(1:25)); tmpstr=cellstr(’SPO2SLEW’); [temp, index.spo2slew]=ismember(tmpstr, fieldName(1:25)); tmpstr=cellstr(’BBV’); [temp, index.bbv]=ismember(tmpstr, fieldName(1:25)); tmpstr=cellstr(’HRMSB’); [temp, index.hrmsb]=ismember(tmpstr, fieldName(1:25)); tmpstr=cellstr(’HRLSB’); [temp, index.hrlsb]=ismember(tmpstr, fieldName(1:25)); tmpstr=cellstr(’EHRMSB’); [temp, index.ehrmsb]=ismember(tmpstr, fieldName(1:25)); tmpstr=cellstr(’EHRLSB’); [temp, index.ehrlsb]=ismember(tmpstr, fieldName(1:25)); tmpstr=cellstr(’ESPO2’); [temp, index.espo2]=ismember(tmpstr, fieldName(1:25)); tmpstr=cellstr(’HRLSB’); [temp, index.hrlsb]=ismember(tmpstr, fieldName(1:25)); tmpstr=cellstr(’ESPO2D’); [temp, index.espo2d]=ismember(tmpstr, fieldName(1:25)); tmpstr=cellstr(’HRDMSB’); [temp, index.hrdmsb]=ismember(tmpstr, fieldName(1:25)); tmpstr=cellstr(’HRDLSB’); [temp, index.hrdlsb]=ismember(tmpstr, fieldName(1:25)); tmpstr=cellstr(’EHRDMSB’); [temp, index.ehrdmsb]=ismember(tmpstr, fieldName(1:25)); tmpstr=cellstr(’EHRDLSB’); [temp, index.ehrdlsb]=ismember(tmpstr, fieldName(1:25)); n=floor(len/25)-1; indvect=[1:n]; index.spo2=[index.spo2, (index.spo2 + 25*indvect)]; index.espo2=[index.espo2, (index.espo2 + 25*indvect)]; index.spo2slew=[index.spo2slew, (index.spo2slew + 25*indvect)]; index.spo2d=[index.spo2d, (index.spo2d + 25*indvect)]; index.espo2d=[index.espo2d, (index.espo2d + 25*indvect)]; index.hrmsb=[index.hrmsb, (index.hrmsb + 25*indvect)]; index.ehrmsb=[index.ehrmsb, (index.ehrmsb + 25*indvect)]; index.hrdmsb=[index.hrdmsb, (index.hrdmsb + 25*indvect)]; index.ehrdmsb=[index.ehrdmsb, (index.ehrdmsb + 25*indvect)]; index.hrlsb=[index.hrlsb, (index.hrlsb + 25*indvect)]; index.ehrlsb=[index.ehrlsb, (index.ehrlsb + 25*indvect)]; index.hrdlsb=[index.hrdlsb, (index.hrdlsb + 25*indvect)]; index.ehrdlsb=[index.ehrdlsb, (index.ehrdlsb + 25*indvect)]; index.bbv=[index.bbv, (index.bbv + 25*indvect)]; index.rev=[index.rev, (index.rev + 25*indvect)]; SPO2=fieldValue(index.spo2); ESPO2=fieldValue(index.espo2); SPO2SLEW=fieldValue(index.spo2slew); HRMSB=fieldValue(index.hrmsb); EHRMSB=fieldValue(index.ehrmsb); HRLSB=fieldValue(index.hrlsb); EHRLSB=fieldValue(index.ehrlsb); BBV=fieldValue(index.bbv); HR=HRMSB+HRLSB; EHR=EHRMSB+EHRLSB; % subtract mean from PPG data ppgMean=mean(ppg); ppgM=ppg-ppgMean; % adjusted ppg % generate time vector time=[0:len-1]*(1/Fs); stime=[0:n-1]*(1/3);

1

If you actually have to read this appendix I’m really sorry. E-mail me at [email protected] and I’ll just e-mail the code to you. Tell me why you had to read this and I’ll buy you a drink of your choice.

80

C.2.2 % % % %

Pulse Extraction

Name: nonin_peaks Purpose: find peaks and valleys in ppg waveforms use with nonin.m author: Suzanne Wendelken Feb 2004

d1=diff(ppg); % first derivative zeroXingIndex= find( d1 == 0); % returns index of first derivative = 0 % find index where d1 goes from + to - or - to plus but does not = 0 and % without using a for loop (slow) signd1=sign(d1); extraIndex=find(abs(diff(signd1)) == 2 | abs(diff(signd1)) == 1 ); zeroXingIndex=[zeroXingIndex; extraIndex]; d2=diff(ppg,2); % second derivative signd2=sign(d2); concaveDownIndex=find(signd2 < 0); concaveUpIndex=find(signd2 > 0); % inflectionIndex=find(signd2 == 0);

maximaIndex=intersect(zeroXingIndex, concaveDownIndex)+1; minimaIndex=intersect(zeroXingIndex, concaveUpIndex)+1; % adding one to index refering to second derivatives due to index shift % resulting from diff % separate max and mins into: peaks, plateaus, valleys, and % crevasses ---------------------------------------------------------------pointIndex=find(abs(diff(signd1)) == 2); % indecies where slope goes from + to - or - to + peakIndex=intersect(pointIndex+1, maximaIndex); crevasIndex=intersect(pointIndex+1, minimaIndex); % Plateaus: for x=1:length(maximaIndex)-1 % for1 temp=abs(diff(ppg(maximaIndex(x):maximaIndex(x+1)))); condition_1 = sum(temp) == 0; % condition: constant ppg value between consecutive maxima if (condition_1) midpt = floor((maximaIndex(x+1)+ maximaIndex(x))/2); if (~exist(’plateauIndex’)) plateauIndex(1)= midpt; else plateauIndex=[plateauIndex; midpt]; end end end % endfor1 % Valleys: for x=1:length(minimaIndex)-1 %for2 temp=abs(diff(ppg(minimaIndex(x):minimaIndex(x+1)))); condition_1 = sum(temp) == 0; % condition: constant ppg value between consecutive minima if (condition_1) midpt = floor((minimaIndex(x+1)+ minimaIndex(x))/2); if (~exist(’valleyIndex’)) valleyIndex(1)= midpt; else valleyIndex=[valleyIndex; midpt]; end end end % endfor2 % % % % %

% plot peaks and valley edges------------------------figure(’name’, ’Peaks and Valleys edges’); plot(time, ppg, ’b’, time(maximaIndex), ppg(maximaIndex), ’rx’, ... time(minimaIndex), ppg(minimaIndex), ’gx’); title(’peak and valley edges’);

% % peaksIndex and ValleysIndex are inclusive of peaks, plateaus, % % valleys and crevases.-----------------------------peaksIndex=union(peakIndex, plateauIndex); valleysIndex=union(crevasIndex, valleyIndex); % figure(’name’, ’All peaks and valleys’); % plot(time, ppg, ’b’, time(peaksIndex), ppg(peaksIndex), ’r.’, ... % time(valleysIndex), ppg(valleysIndex), ’g.’) % xlabel(’time (s)’); ylabel(’ppg value’); % title(’peaks and valleys only’);

% % % % %

separate peaks into major and minor peaks------------------------------method: find peak, look ahead 50% of current HR, if there is another peak take the max of the two for a major peak and the minumum for the minor one, then increment index so the second peak won’t be counted twice. if there is no other peak, then take the value for that peak.

% major and minor peaks:

81 count=1; for x=1:length(peaksIndex)-1 % for3 % find nearest hr value (note that hr and ppg are sampled at different % rates) temp=abs(time(peaksIndex(count))-stime); [crap stIndex]=min(temp); % stIndex is the index corresponding %to the closest time in the shorttime vector (3 Hz as opposed to 75 Hz) if x>2 % prevent too large of a window due to bad sensor HR calculation instHR=1/(majorPeak.time(x-1)-majorPeak.time(x-2))*60; % Instantaneous HR value (bpm) currentHR=min([max([HR(stIndex), instHR]), 220]); % hard limit 220 bpm else currentHR = HR(stIndex); end currentTime = time(peaksIndex(count)); nextPeakTime = time(peaksIndex(count+1)); maxWindowTime = currentTime + 0.5 * (60/currentHR); if (nextPeakTime < maxWindowTime) % there is a peak in window if (~exist(’majorPeak’)) % ifb [majorTemp tempInd]=max([ppg(peaksIndex(count)), ppg(peaksIndex(count+1))]); majorPeak.ppg=majorTemp; majorPeak.time=time(peaksIndex(count+tempInd-1)); majorPeak.index=peaksIndex(count+tempInd-1); majorPeak.hrIndex=stIndex; else [majorTemp tempInd]=max([ppg(peaksIndex(count)), ppg(peaksIndex(count+1))]); majorPeak.ppg=[majorPeak.ppg; majorTemp]; majorPeak.time=[majorPeak.time; time(peaksIndex(count+tempInd-1))]; majorPeak.index=[majorPeak.index; peaksIndex(count+tempInd-1)]; majorPeak.hrIndex=[majorPeak.hrIndex; stIndex]; end % end ifb ~exists(majorPeak) if ~(exist(’minorPeak’)) % ifc [minorTemp tempInd]=min([ppg(peaksIndex(count)), ppg(peaksIndex(count+1))]); minorPeak.ppg =minorTemp; minorPeak.time=time(peaksIndex(count+tempInd-1)); minorPeak.index=peaksIndex(count+tempInd-1); minorPeak.hrIndex=stIndex; else % ifc [minorTemp tempInd]=min([ppg(peaksIndex(count)), ppg(peaksIndex(count+1))]); if (majorTemp==minorTemp) tempInd=tempInd+1; end % two consecutive peaks are equal... min/max will give same index minorPeak.ppg=[minorPeak.ppg; minorTemp]; minorPeak.time=[minorPeak.time; time(peaksIndex(count+tempInd-1))]; minorPeak.index=[minorPeak.index; peaksIndex(count+tempInd-1)]; mionrPeak.hrIndex=[minorPeak.hrIndex; stIndex]; end % end ifc count=count+1; else % there is no other peak in the window % ifa if (~exist(’majorPeak’)) % ifd majorPeak.ppg=ppg(peaksIndex(count)); majorPeak.time=time(peaksIndex(count)); majorPeak.index=peaksIndex(count); majorPeak.hrIndex=stIndex; else %ifd majorPeak.ppg=[majorPeak.ppg; ppg(peaksIndex(count))]; majorPeak.time=[majorPeak.time; time(peaksIndex(count))]; majorPeak.index=[majorPeak.index; peaksIndex(count)]; majorPeak.hrIndex=[majorPeak.hrIndex; stIndex]; end % end ifd end %end ifa count=count+1; if (count >= length(peaksIndex)) break; end; end % end for3 % % % % % %

% plot major and minor peaks------------------figure(’name’, ’Major and Minor peaks’); subplot(2,1,1); plot(time, ppg, ’b’, majorPeak.time, majorPeak.ppg, ’r.’) title(’major peaks’); subplot(2,1,2); plot(time, ppg, ’b’, minorPeak.time, minorPeak.ppg, ’r.’) title(’minor peaks’);

% Major and minor valleys: count=1; for x=1:length(valleysIndex)-1 % for4 % find nearest hr value (note that hr and ppg are sampled at different % rates) temp=abs(time(valleysIndex(count))-stime); [crap stIndex]=min(temp); % stIndex is the index corresponding % to the closest time in the shorttime vector if x>2 % prevent too large of a window due to bad sensor HR calculation instHR=1/(majorValley.time(x-1)-majorValley.time(x-2))*60; % Instantaneous HR value (bpm)

82 currentHR=min([max([HR(stIndex), instHR, 220]), 220]); % hard limit 220 else currentHR = HR(stIndex); end currentTime = time(valleysIndex(count)); nextValleyTime = time(valleysIndex(count+1)); maxWindowTime = currentTime + 0.5 * (60/currentHR); if (nextValleyTime < maxWindowTime) % there is a peak in window % ife %disp([’there is other valley in window count = ’, num2str(count)]) if (~exist(’minorValley’)) % iff [minorTemp tempInd]=max([ppg(valleysIndex(count)), ppg(valleysIndex(count+1))]); minorValley.ppg=minorTemp; minorValley.time=time(valleysIndex(count+tempInd-1)); minorValley.index=valleysIndex(count+tempInd-1); minorValley.hrIndex=stIndex; else [minorTemp tempInd]=max([ppg(valleysIndex(count)), ppg(valleysIndex(count+1))]); minorValley.ppg=[minorValley.ppg; minorTemp]; minorValley.time=[minorValley.time; time(valleysIndex(count+tempInd-1))]; minorValley.index=[minorValley.index; valleysIndex(count+tempInd-1)]; minorValley.hrIndex=[minorValley.hrIndex; stIndex]; end % end iff ~exists(majorValley) if ~(exist(’majorValley’)) % ifg [majorTemp tempInd]=min([ppg(valleysIndex(count)), ppg(valleysIndex(count+1))]); majorValley.ppg=majorTemp; majorValley.time=time(valleysIndex(count+tempInd-1)); majorValley.index=valleysIndex(count+tempInd-1); majorValley.hrIndex=stIndex; else % ifg [majorTemp tempInd]=min([ppg(valleysIndex(count)), ppg(valleysIndex(count+1))]); if (majorTemp==minorTemp) tempInd=tempInd+1; end % two consecutive valleys are equal... min/max will give same index majorValley.ppg=[majorValley.ppg; majorTemp]; majorValley.time=[majorValley.time; time(valleysIndex(count+tempInd-1))]; majorValley.index=[majorValley.index; valleysIndex(count+tempInd-1)]; majorValley.hrIndex=[majorValley.hrIndex; stIndex]; end % end ifg count=count+1; else % there is no other valley in the window % ife %disp([’no other valley in window count = ’, num2str(count)]) if (~exist(’majorValley’)) % ifh majorValley.ppg=ppg(valleysIndex(count)); majorValley.time=time(valleysIndex(count)); majorValley.index=valleysIndex(count); majorValley.hrIndex=stIndex; else %ifh majorValley.ppg=[majorValley.ppg; ppg(valleysIndex(count))]; majorValley.time=[majorValley.time; time(valleysIndex(count))]; majorValley.index=[majorValley.index; valleysIndex(count)]; majorValley.hrIndex=[majorValley.hrIndex; stIndex]; end % end ifh end %end ife count=count+1; if (count >= length(valleysIndex)) break; end; end % end for3 % % % % % %

% plot major and minor valleys -------------------------------figure(’name’, ’Major and minor valleys’); subplot(2,1,1); plot(time, ppg, ’b’, majorValley.time, majorValley.ppg, ’r.’) title(’major valleys’); subplot(2,1,2); plot(time, ppg, ’b’, minorValley.time, minorValley.ppg, ’r.’) title(’minor valleys’);

% clean up memory: clear d1 d2 maximaIndex minimaIndex concaveUpIndex concaveDownIndex; clear zeroXingIndex signd1 signd2;

% % % % % % % % % %

old crap ----------------------figure(’name’, ’some peak detection stats’); subplot(2,1,1); plot(time(peaksIndex), ’b.’); xlabel(’peak number’); ylabel(’Time (s)’); title(’some peak detection stats’); subplot(2,1,2); nbins=50; hist(ppg(peaksIndex), nbins); xlabel(’ppg value’); ylabel(’counts’);

83 % % % % % % % %

figure(’name’, ’Peaks and Valleys edges’); plot(time, ppg, ’b’, time(maximaIndex), ppg(maximaIndex), ’rx’, ... time(minimaIndex), ppg(minimaIndex), ’gx’)%,... % time(peakIndex), ppg(peakIndex), ’r.’, ... % time(plateauIndex), ppg(plateauIndex), ’r.’, ... % time(valleyIndex), ppg(valleyIndex), ’g.’, ... % time(crevasIndex), ppg(crevasIndex), ’g.’); title(’peak and valley edges’);

84

C.2.3

AR and FFT analysis

% Name: nonin_pulseStats_thesis % purpose: AR and STFT analysis of beat stats (height, fwhm, interval, % etc). for use with Sit up Stand up Experiment data (...\nonin\data\fun\part3\subjectN\log...) % Author: Suzanne Wendelken, May 2004 % note: % rsr= resampled rate for beat statistics clear P_B t_B P_H t_H blockHr blockHave blockHvar; %close all; % for some reason, theresampled struct *sometimes* has some NAN’s in it. This really % sucks for signal processing. Removing them (the Nans)... by setting them to zero nanHeight=find(isnan(resampled.height)); nanWidth=find(isnan(resampled.width)); nanB2b=find(isnan(resampled.b2bInterval)); nanfwhm=find(isnan(resampled.fwhm)); nanH2W=find(isnan(resampled.h2w)); resampled.height(nanHeight)=0; resampled.b2bInterval(nanB2b)=0; resampled.width(nanWidth)=0; resampled.fwhm(nanfwhm)=0; resampled.h2w(nanH2W)=0;

% highpass filter b2bIntervalM and HeightM with IIR butterworth filter. % filter order n=5, fc1=0.05 [b,a]=butter(5, 0.05*2/rsr, ’high’); filtered.b2bInterval=filtfilt(b, a, resampled.b2bInterval); filtered.height=filtfilt(b,a, resampled.height); % % % % %

model order selection (uses nonin_modelorder_thesis) if not known pHeight=nonin_modelorder_thesis(filtered.height); pb2b=nonin_modelorder_thesis(filtered.b2bInterval); t_stand=input(’Enter Stand up time: ’);

% if model order and t_stand known: pHeight=14; pb2b=14; t_stand=120; % Resampled Height analysis---------------------------------------------------nfft=64; incr=15; % 15 sample increment wlen=nfft; % windowlength count=1; for x=1:incr:length(resampled.height)-wlen-1 lowerIndex=x; upperIndex=min([(x+wlen), length(filtered.height)]); [Pxx,f_H] = pburg(filtered.height(lowerIndex:upperIndex),pHeight,nfft,rsr); P_H(:,count)=(Pxx); t_H(count)=x*1/rsr; % time vector for resampled height heightVar(count)=var(filtered.height(lowerIndex:upperIndex)); heightAve(count)=mean(resampled.height(lowerIndex:upperIndex)); count=count+1; end % % % take care of final segment of data % lowerIndex=upperIndex; % from for loop above % upperIndex=length(filtered.height); % [Pxx,f_Hrs] = pburg(filtered.height(lowerIndex:upperIndex),pHheight,nfft,rsr); % P_H(:,count)=(Pxx); % t_H(count)=(x+1)*1/rsr; % time vector for resampled height % show ave and variance of signal in windowed segments (same windows as ar % analysis) figure(’name’,’windowed average and variance - filtered height’); subplot(4,1,1); plot(time, ppg); title(’ppg’); xlim([0 max(t_H)]); subplot(4,1,2); plot(resampled.time, filtered.height); title(’HP filtered height’); xlim([0 max(t_H)]); subplot(4,1,3); plot(t_H,heightAve ); title(’Mean height values, wlen=64 samples’); xlim([0 max(t_H)]); subplot(4,1,4); plot(t_H,heightVar ); title(’Variance height values, wlen=64 samples’); xlim([0 max(t_H)]); % AR ratio analysis of resampled height -----------f1=0.3; % cutoff freq for resampled height f2=1.2; f1Index=floor(f1/rsr*nfft); % lower cutoff index f2Index=floor(f2/rsr*nfft); % upper cutoff index P_lower=P_H((1:f1Index), :); %Lower frequency power P_upper=P_H((f1Index+1:f2Index), :); % upper frequency power R_lower=sum(P_lower, 1)./sum(P_H, 1); R_upper=sum(P_upper, 1)./sum(P_H, 1); R_ARlow2high=R_lower./R_upper; figure(’name’, ’AR relative ratio - Height’); subplot(4,1,1); plot(time, ppg); title(’ppg’); xlim([0 max(t_H)]); subplot(4,1,2); plot(resampled.time, resampled.height); title(’Pulse Height (resampled)’); xlim([0 max(t_H)]); subplot(4,1,3);

85 plot(resampled.time, filtered.height); title(’HP filtered Height’); xlim([0 max(t_H)]); subplot(4,1,4); plot(t_H, R_ARlow2high); title(’Relative R AR’); xlim([0 max(t_H)]); % blocked stats over time (see the plot to see what I mean) badically it’s % 10second averageing of crap % note: 6 samples of heightvar=~ about 10 secs count=1; w=10; % window size for x=1:w:(length(heightVar)-mod(length(heightVar),w)) ind1=(count-1)*w+1; ind2=x+(w-1); blockHr(count)=mean(R_ARlow2high(ind1:ind2)); blockHvar(count)=mean(heightVar(ind1:ind2)); blockHave(count)=mean(heightAve(ind1:ind2)); count=count+1; end figure(’name’,’blocked AR and stats over time - Hieght’) subplot(4,1,1); plot(time, ppg); title(’ppg’); xlim([0.75 max(t_H)]); set(gca,’xtick’,[]); subplot(4,1,2); bar([blockHr]); title([’AR Ratio: ’,int2str(w) ,’ sample windows’]) xlim([0.75 (length(blockHr)+0.25)]); set(gca,’xtick’,[]); ylabel(’R_{lf/hf}’); subplot(4,1,3); bar([blockHave]); title([’mean H: ’, int2str(w), ’ sample windows’]) xlim([0.75 (length(blockHr)+0.25)]);set(gca,’xtick’,[]); ylabel(’ppg units’) subplot(4,1,4); bar([blockHvar]); title([’var H :’, int2str(w), ’ sample windows’]); xlim([0.75 (length(blockHr)+0.25)]); ylabel(’variance’) % STFT ratio analysis of resampled height -----------windowlen=nfft; % take in x seconds of stuff windowtype=Kaiser(windowlen, 5); numoverlap=floor(0.9*windowlen); [P_H_stft, f_H_stft, t_H_stft]=specgram(filtered.height, nfft, rsr, windowtype, numoverlap); P_H_stft=abs(P_H_stft); f1Index=floor(f1/rsr*nfft); % lower cutoff index f2Index=floor(f2/rsr*nfft); % upper cutoff index P_lower=P_H_stft((1:f1Index), :); %Lower frequency power P_upper=P_H_stft((f1Index+1:f2Index), :); % upper frequency power R_lower=sum(P_lower, 1)./sum(P_H_stft, 1); R_upper=sum(P_upper, 1)./sum(P_H_stft, 1); R_STFTlow2high=R_lower./R_upper; % plot summary of spectrogram and ratio analysis; figure(’name’, ’STFT relative ratio - Height’); subplot(4,1,1); plot(time, ppg); title(’ppg’); xlim([0 max(t_H_stft)]); subplot(4,1,2); plot(resampled.time, resampled.height); title(’Pulse Height (resampled)’); xlim([0 max(t_H_stft)]); subplot(4,1,3); plot(resampled.time, filtered.height); title(’HP filtered Height’); xlim([0 max(t_H_stft)]); subplot(4,1,4); plot(t_H_stft, R_STFTlow2high); title(’Relative R STFT’); xlim([0 max(t_H_stft)]); figure(’name’,’STFT Height’); specgram(filtered.height, nfft, rsr, windowtype, numoverlap); figure(’name’,’AR Height’) surf(t_H, f_H, P_H, ’EdgeColor’, ’none’); title(’AR’); ylim([0 2]); xlim([0 max(t_H)]); view([0 90]); xlabel(’Time (s)’ ); % before/during/after analysis [crap, t_H_1]=min(abs(t_H-t_stand)); % time index for stand t_H_2=t_H_1+3; %time index for the end of the act of standing up (assuming ~ 5 seconds to stand = 3 t_H because 1 t_H = 15 resampled height points ) R_H_ARbefore=sum(R_ARlow2high(1:t_H_1)); R_H_ARduring=sum(R_ARlow2high(t_H_1+1:t_H_2)); R_H_ARafter=sum(R_ARlow2high(t_H_2+1:length(R_ARlow2high))); figure(’name’,’BDA AR, relative R - Height’) bar([R_H_ARbefore; R_H_ARduring; R_H_ARafter]) set(gca,’XTickLabel’,{’Before’;’During’; ’After’}) title(’Mean R_{low/high} AR - Height’); % mean and var before/during/after of resampled height [crap, t_1]=min(abs(resampled.time-t_stand)); % stand up time index for resampled t_2=t_1+55; %time index for the end of the act of standing up (assuming ~ 5 seconds to stand) H_mean_b=mean(resampled.height(1:t_1)); H_mean_d=mean(resampled.height(t_1+1:t_2)); H_mean_a=mean(resampled.height(t_2+1:length(resampled.height))); H_var_b=var(resampled.height(1:t_1)); H_var_d=var(resampled.height(t_1+1:t_2)); H_var_a=var(resampled.height(t_2+1:length(resampled.height))); figure(’name’,’bda mean var -height’); subplot(2,1,1); bar([H_mean_b; H_mean_d;H_mean_a]); set(gca,’XTickLabel’,{’Before’;’During’; ’After’}); title(’Mean Height’); subplot(2,1,2); bar([H_var_b; H_var_d;H_var_a]) ; set(gca,’XTickLabel’,{’Before’;’During’; ’After’}) title(’Var Height’); % var bda of filtered height H_fvar_b=var(filtered.height(1:t_1));

86 H_fvar_d=var(filtered.height(t_1+1:t_2)); H_fvar_a=var(filtered.height(t_2+1:length(filtered.height))); figure(’name’,’bda var - rs height’); bar([H_fvar_b; H_fvar_d;H_fvar_a]) ; set(gca,’XTickLabel’,{’Before’;’During’; ’After’}) title(’Var - filtered Height’); % bda AR specgram figure(’name’,’AR BDA - Height’); subplot(1,3,1); pburg(filtered.height(1:t_1),pHeight, nfft, rsr); subplot(1,3,2); pburg(filtered.height(t_1+1:t_2),pHeight, nfft, rsr); subplot(1,3,3); pburg(filtered.height(t_2+1:length(filtered.height)),pHeight, nfft, rsr);

% resampled b2b % analysis---------------------------------------------------nfft=256; incr=15; % 15 sample increment wlen=nfft; % windowlength count=1; for x=1:incr:length(resampled.b2bInterval)-wlen-1 lowerIndex=x; upperIndex=min([(x+wlen), length(filtered.b2bInterval)]); [Pxx,f_B] = pburg(filtered.b2bInterval(lowerIndex:upperIndex),pb2b,nfft,rsr); P_B(:,count)=(Pxx); t_B(count)=x*1/rsr; % time vector for resampled b2bInterval b2bVar(count)=var(filtered.b2bInterval(lowerIndex:upperIndex)); b2bAve(count)=mean(resampled.b2bInterval(lowerIndex:upperIndex)); count=count+1; end % % % take care of final segment of data % lowerIndex=upperIndex; % from for loop above % upperIndex=length(filtered.height); % [Pxx,f_Hrs] = pburg(filtered.height(lowerIndex:upperIndex),pHheight,nfft,rsr); % P_H(:,count)=(Pxx); % t_H(count)=(x+1)*1/rsr; % time vector for resampled height % show ave and variance of signal in windowed segments (same windows as ar % analysis) figure(’name’,’windowed average and variance - filtered b2b’); subplot(4,1,1); plot(time, ppg); title(’ppg’); xlim([0 max(t_B)]); subplot(4,1,2); plot(resampled.time, filtered.b2bInterval); title(’HP filtered b2b’); xlim([0 max(t_B)]); subplot(4,1,3); plot(t_B,b2bAve ); title(’Mean b2b values, wlen=64 samples’); xlim([0 max(t_B)]); subplot(4,1,4); plot(t_B,b2bVar ); title(’Variance b2b values, wlen=64 samples’); xlim([0 max(t_B)]);

% AR ratio analysis of resampled b2bInterval -----------f1=0.3; % cutoff freq for resampled height f2=1.0; f1Index=floor(f1/rsr*nfft); % lower cutoff index f2Index=floor(f2/rsr*nfft); % upper cutoff index P_lower=P_B((1:f1Index), :); %Lower frequency power P_upper=P_B((f1Index+1:f2Index), :); % upper frequency power R_lower=sum(P_lower, 1)./sum(P_B, 1); R_upper=sum(P_upper, 1)./sum(P_B, 1); R_ARlow2high=R_lower./R_upper; figure(’name’, ’AR relative ratio - B2B’); subplot(4,1,1); plot(time, ppg); title(’ppg’); xlim([0 max(t_B)]); subplot(4,1,2); plot(resampled.time, resampled.b2bInterval); title(’B2B (resampled)’); xlim([0 max(t_B)]); subplot(4,1,3); plot(resampled.time, filtered.b2bInterval); title(’HP filtered b2b’); xlim([0 max(t_B)]); subplot(4,1,4); plot(t_B, R_ARlow2high); title(’Relative R AR’); xlim([0 max(t_B)]);

% blocked stats over time (see the plot to see what I mean) badically it’s % xsecond averageing of crap % note: 6 samples of b2bvar=about 10 secs count=1; w=10; % window size for x=1:w:(length(b2bVar)-mod(length(b2bVar),w)) ind1=(count-1)*w+1; ind2=x+(w-1); blockBr(count)=mean(R_ARlow2high(ind1:ind2)); blockBvar(count)=mean(b2bVar(ind1:ind2)); blockBave(count)=mean(b2bAve(ind1:ind2)); count=count+1; end figure(’name’,’blocked AR and stats over time - b2b’) subplot(4,1,1); plot(time, ppg); title(’ppg’); xlim([0.75 max(t_H)]); set(gca,’xtick’,[]); subplot(4,1,2); bar([blockBr]); title([’AR Ratio: ’,int2str(w) ,’ sample windows’]) xlim([0.75 (length(blockBr)+0.25)]); set(gca,’xtick’,[]); ylabel(’R_{lf/hf}’); subplot(4,1,3); bar([blockBave]); title([’mean B2B: ’, int2str(w), ’ sample windows’]) xlim([0.75

87 (length(blockBr)+0.25)]);set(gca,’xtick’,[]); ylabel(’seconds’) subplot(4,1,4); bar([blockBvar]); title([’var B2B :’, int2str(w), ’ sample windows’]); xlim([0.75 (length(blockBr)+0.25)]); ylabel(’variance’) % STFT ratio analysis of resampled height -----------windowlen=nfft; % take in x seconds of stuff windowtype=Kaiser(windowlen, 5); numoverlap=floor(0.9*windowlen); [P_B_stft, f_B_stft, t_B_stft]=specgram(filtered.b2bInterval, nfft, rsr, windowtype, numoverlap); P_B_stft=abs(P_B_stft); f1Index=floor(f1/rsr*nfft); % lower cutoff index f2Index=floor(f2/rsr*nfft); % upper cutoff index P_lower=P_B_stft((1:f1Index), :); %Lower frequency power P_upper=P_B_stft((f1Index+1:f2Index), :); % upper frequency power R_lower=sum(P_lower, 1)./sum(P_B_stft, 1); R_upper=sum(P_upper, 1)./sum(P_B_stft, 1); R_STFTlow2high=R_lower./R_upper; % plot summary of spectrogram and ratio analysis; figure(’name’, ’STFT relative ratio - Height’); subplot(4,1,1); plot(time, ppg); title(’ppg’); xlim([0 max(t_B_stft)]); subplot(4,1,2); plot(resampled.time, resampled.b2bInterval); title(’Pulse b2b resampled’); xlim([0 max(t_B_stft)]); subplot(4,1,3); plot(resampled.time, filtered.b2bInterval); title(’HP filtered b2b’); xlim([0 max(t_B_stft)]); subplot(4,1,4); plot(t_B_stft, R_STFTlow2high); title(’Relative R STFT’); xlim([0 max(t_B_stft)]); figure(’name’,’STFT b2bInterval’); specgram(filtered.b2bInterval, nfft, rsr, windowtype, numoverlap); figure(’name’,’AR b2bInterval’) surf(t_B, f_B, P_B, ’EdgeColor’, ’none’); title(’AR’); ylim([0 2]); xlim([0 max(t_B)]); view([0 90]); xlabel(’Time (s)’ ); % before/during/after analysis [crap, t_B_1]=min(abs(t_B-t_stand)); % time index for stand t_B_2=t_B_1+3; %time index for the end of the act of standing up (assuming ~ 5 seconds to stand = 3 t_H because 1 t_H = 15 resampled height points ) R_B_ARbefore=sum(R_ARlow2high(1:t_B_1)); R_B_ARduring=sum(R_ARlow2high(t_B_1+1:t_B_2)); R_B_ARafter=sum(R_ARlow2high(t_B_2+1:length(R_ARlow2high))); figure(’name’,’BDA AR, relative R - Height’) bar([R_B_ARbefore; R_B_ARduring; R_B_ARafter]) set(gca,’XTickLabel’,{’Before’;’During’; ’After’}) title(’Mean R_{low/high} AR - b2b’); % mean and var before/during/after of resampled height [crap, t_1]=min(abs(resampled.time-t_stand)); % stand up time index for resampled t_2=t_1+55; %time index for the end of the act of standing up (assuming ~ 5 seconds to stand) B_mean_b=mean(resampled.b2bInterval(1:t_1)); B_mean_d=mean(resampled.b2bInterval(t_1+1:t_2)); B_mean_a=mean(resampled.b2bInterval(t_2+1:length(resampled.b2bInterval))); B_var_b=var(resampled.b2bInterval(1:t_1)); B_var_d=var(resampled.b2bInterval(t_1+1:t_2)); B_var_a=var(resampled.b2bInterval(t_2+1:length(resampled.b2bInterval))); figure(’name’,’bda mean var - b2b’); subplot(2,1,1); bar([B_mean_b; B_mean_d;B_mean_a]); set(gca,’XTickLabel’,{’Before’;’During’; ’After’}); title(’Mean b2b’); subplot(2,1,2); bar([B_var_b; B_var_d;B_var_a]) ; set(gca,’XTickLabel’,{’Before’;’During’; ’After’}) title(’Var b2b’); % var bda of filtered height B_fvar_b=var(filtered.b2bInterval(1:t_1)); B_fvar_d=var(filtered.b2bInterval(t_1+1:t_2)); B_fvar_a=var(filtered.b2bInterval(t_2+1:length(filtered.b2bInterval))); figure(’name’,’bda var - rs b2b’); bar([B_fvar_b; B_fvar_d;B_fvar_a]) ; set(gca,’XTickLabel’,{’Before’;’During’; ’After’}) title(’Var - filtered b2b’); % bda AR specgram figure(’name’,’AR BDA - b2b’); subplot(1,3,1); pburg(filtered.b2bInterval(1:t_1),pb2b, nfft, rsr); subplot(1,3,2); pburg(filtered.b2bInterval(t_1+1:t_2),pb2b, nfft, rsr); subplot(1,3,3); pburg(filtered.b2bInterval(t_2+1:length(filtered.b2bInterval)),pb2b, nfft, rsr); savestats

88

C.2.4

Model order selection

% nonin_modelorder_thesis % plot AR error verses model order for various crap function p=nonin_modelorder_thesis(sig) for x=1:40 % for 1 [aSIG,eSIG(x),kSIG]=arburg(sig, x); end % end for 1 figure(’name’, ’AR Model Order Selection’); stem(eSIG); title(’Error vs Model Order’); p=input(’Enter model order: ’);

89

C.2.5 % % % %

Re-sampling

Name: nonin_resample Purpose: resample pulse stats so we can do freq analysis and hrv author: Suzanne Wendelken Feb 2004 use with nonin_pulseStats.m

rsr=10; % resampling rate Hz numbeats=length(beat); % number of beats % first resample peaks to see if we can see respiration rate totalTime=beat(numbeats).valley2.time-beat(1).valley1.time; resampled.time=[beat(1).valley1.time:1/rsr:beat(numbeats).valley2.time]; % using vectors defined in nonin_pulseStats, t=majorpeak.time, w=width, % h=height, stdev=standard deviation, p=majorpeak.ppg resampled.peaks=interp1(t, p, resampled.time, ’spline’); % figure(’name’, ’Resampled Peaks and beat to beat intervals’); % subplot(2,1,1); plot(resampled.time, resampled.peaks, ’.’); % xlabel(’time (s)’); ylabel(’peaks - PPG value’); title(’Resampled Peaks’); % resample beat to beat interval resampled.b2bInterval=interp1(beat2beat.beatTime, beat2beat.beatInterval, resampled.time, ’spline’); % subplot(2,1,2); plot(resampled.time, resampled.b2bInterval, ’.’); % xlabel(’time (s)’); ylabel(’Beat to beat interval (s)’); title(’Resampled beat to beat interval’); % resample width, height, and FWHM resampled.width=interp1(t, w, resampled.time, ’spline’); resampled.height=interp1(t, h, resampled.time, ’spline’); resampled.fwhm=interp1(t, fwhm, resampled.time, ’spline’); resampled.h2w=interp1(t, h2w, resampled.time, ’spline’); % figure(’name’, ’Resampled pulse width, height, FWHM’); % subplot(3,1,1); plot(resampled.time, resampled.width, ’.’); % xlabel(’time (s)’); ylabel(’pulse width (s)’); % subplot(3,1,2); plot(resampled.time, resampled.height, ’.’); % xlabel(’time (s)’); ylabel(’pulse height (ppg value)’); % subplot(3,1,3); plot(resampled.time, resampled.fwhm, ’.’); % xlabel(’time (s)’); ylabel(’FWHM (s)’); % % % % % % % % % % %

old crap that might be useful at some point... -----------------------picking out values in beat.majorPeak.time and ppg ... for a=1:numbeats % for1 t(a)=beat(a).majorPeak.time; p(a)=beat(a).majorPeak.ppg; % if a < numbeats % there is one less interval than the number of beats % tb(a)=beat2beat.mpTime; % b(z)=beat2beat.interval; % end end % for1

Appendix D HRV and Pulse Height analysis summary This appendix presents a summary of before/during/after results for all trials using model order p = 6, and p = 14. We condensed the results by looking at the percent difference

1

in each value

(mean, variance, and RLF/HF ). This percent difference value shows how much a parameter changed from the time before the subject stood up to the time after the subject stood up. This data shows that there is not much difference in the trends (whether a given parameter goes up or down after the subject stands up) between analyzing the data using model order p=6 and p=14. Thus, we believe our selection of the model order to be robust.

1

The percent difference value was calculated by dividing the after value by the before value and multiplying by 100.

90

91 B2B mean var filtered var RLF/HF Height mean var filtered var RLF f /HF

% Difference 77.12 1546.71 2655.98 175.27 % Difference 68.91 238.49 227.28 245.80

Std Error 1.06 536.46 979.12 19.70 Std Error 5.67 43.33 46.28 209.68

Table D.1: Percent differences (After/Before) for pulse statistics, p=6.

B2B mean var filtered var RLF/HF Pulse Height mean var filtered var RLF f /HF

% Difference 63.97 1531.51 2638.89 242.67 % Difference 58.11 226.02 218.51 196.68

Std Error 7.37 539.28 982.13 50.13 Std Error 8.31 46.91 48.69 33.63

Table D.2: Percent differences (After/Before) for pulse statistics, p=14.

B2B mean var filtered var RLF/HF Pulse Height mean var filtered var RLF f /HF

% Difference 63.97 1531.51 2638.89 177.14 % Difference 58.11 226.02 218.51 195.59

Std Error 7.37 539.28 982.13 30.26 Std Error 8.31 46.91 48.69 33.77

Table D.3: Percent differences (After/Before) for pulse statistics, p=14, different cutoff frequencies.

92

B2B mean var filtered var RLF/HF Pulse Height mean var filtered var RLF f /HF

Before 0.89694 0.0244 0.02177 26.67 Before 9.47 10.29 10.04 168.15

During 0.7078 0.0223 0.0182 1.64 During 8.50 13.85 11.33 1.28

After 0.6899 0.1733 0.1873 48.81 After 5.27 8.42 6.40 95.77

Table D.4: Beat to beat interval and pulse height statistics before/during/after for model order 14. For the beat to beat interval, frequency bounds for RLF/HF are LF = 0.05 − 0.15 Hz and HF = 0.14 − 0.45 Hz. For the pulse height, frequency bounds for RLF/HF are LF = 0.05 − 0.3 Hz and HF = 0.3 − 1.2 Hz.

B2B mean var filtered var RLF/HF Pulse Height mean var filtered var RLF f /HF

Before 0.0267 0.0091 0.0080 3.66 Before 1.0758 3.1870 3.5901 83.56

During 0.0191 0.0059 0.0045 0.32 During 0.7469 2.9408 2.4782 0.43

After 0.0184 0.0769 0.0966 12.98 After 0.5066 3.6025 3.1799 24.92

Table D.5: Standard Error, Before/During/After for pulse statistics, p=6.

93

B2B mean var filtered var RLF/HF Pulse Height mean var filtered var RLF f /HF

Before 0.8837 0.0218 0.0192 101.67 Before 8.92 8.86 8.62 313.84

During 0.6853 0.0215 0.0185 8.42 During 8.12 12.50 10.38 2.25

After 0.6782 0.1463 0.1574 243.50 After 5.39 8.25 6.43 143.55

Table D.6: Beat to beat interval and pulse height statistics before/during/after for model order 14. For the beat to beat interval, frequency bounds for RLF/HF are LF = 0.05 − 0.2 Hz and HF = 0.2 − 0.45 Hz. For the pulse height, frequency bounds for RLF/HF are LF = 0.05 − 0.3 Hz and HF = 0.3 − 1.2 Hz.

B2B mean var filtered var RLF/HF Pulse Height mean var filtered var RLF f /HF

Before 0.0272 0.0071 0.0058 12.30 Before 1.07 2.19 2.37 55.31

During 0.0181 0.0039 0.0029 1.18 During 0.71 2.50 2.03 0.44

After 0.0043 0.0374 0.0496 35.95 After 0.17 1.87 1.68 13.86

Table D.7: Standard Error, Before/During/After for pulse statistics, p=14.

94 B2B mean var filtered var RLF/HF Pulse Height mean var filtered var RLF f /HF

Before 0.8837 0.0218 0.0192 182.77 Before 8.92 8.86 8.62 498.34

During 0.6853 0.0215 0.0185 9.83 During 8.12 12.50 10.38 2.26

After 0.6782 0.1463 0.1574 290.76 After 5.39 8.25 6.43 153.91

Table D.8: Beat to beat interval and pulse height statistics before/during/after for model order 14. For the beat to beat interval, frequency bounds for RLF/HF are LF = 0.05 − 0.3 Hz and HF = 0.3 − 1.0 Hz. For the pulse height, frequency bounds for RLF/HF are LF = 0.05 − 0.3 Hz and HF = 0.3 − 1.2 Hz. B2B mean var filtered var RLF/HF Pulse Height mean var filtered var RLF f /HF

Before 0.0272 0.0071 0.0058 24.61 Before 1.07 2.19 2.37 126.30

During 0.0181 0.0039 0.0029 1.55 During 0.71 2.50 2.03 0.44

After 0.0177 0.0486 0.0588 49.39 After 0.44 2.24 1.94 19.43

Table D.9: Standard Error, Before/During/After for pulse statistics, p=14, different LF and HF cutoff frequencies.

Bibliography [1] Gail D. Baura. Improved pulse oximetry. In System Theory and Practical Applications of Biomedical Signals, Series in Biomedical Engineering, chapter 4, pages 66–85. IEEE Press, MA, 2002. [2] A. Guyton and J. Hall. Medical Physiology. W.B. Saunders Co., 10 edition, 2000. [3] T. L. Rusch, R. Sankar, and J. E. Shcarf. Signal processing methods for pulse oximetry. Computers in Biology and Medicine, 26(2):143–159, 1996. [4] E. H. Wood and J. E. Geraci. Photoelectric determination of arterial oxygen saturation in man. 1943. referenced in [3]. [5] R. Rangayyan. Biomedical Signal analysis: A case study approach. WileyInterscience, 2002. [6] F Pearce. Walter Reed Army Institute of Research. ATACCC, St. Pete’s Beach, FL, September 2002. [7] R. DeLorenzo and et al. Tactical Emergency Care: Military and Operational Out-of-Hospital Medicine, pages 233–247. Prentice Hall, 1999. [8] US Army 10th Mountain Division. EFMB Study Guide, pages F1–F4. US Army, Fort Drum, NY, January 1993. [9] A. Garner and et al. Comparative analysis of multiple-casualty incident triage algorithms. Annals of Emergency Medicine, 38(5):541–548, 2001. [10] S. M. Wendelken, S. P. McGrath, and G. T. Blike. A medical assessment algorithm for automated remote triage. In Proceedings of the 25th Annual Engineering in Medicine and Biology Conference, Cancun, Mexico, September 2003. IEEE and EMBS. [11] Task Force of the European Society of Cardiology, the North American Society of Pacing, and Electrophysiology. Heart rate variability: Standards of measurement, physiological interpretation, and clinical use. Circulation, 93:1043–1065, 1996. 95

96 [12] Bethany Knorr. A spectral analysis of heart rate variability signals from patients suffering post tramatic stress disorder. Master of science, Thayer School of Engineering, Dartmouth College, Hanover, NH USA, Febuary 2004. [13] O. Appenzeller. The Autonomic Nervous System: An introduction to basic and clinical concepts. North-Holland Publishing Company, 1970. [14] S. Akselrod et al. Power spectrum analysis of heart rate fluctuation: A quantitative probe of beat-to-beat cardiovascular control. Science, 213:220–222, 1983. [15] A. Bianchi and et al. Time-variant power spectrum analysis for the detection of transient episodes in hrv signal. IEEE Transactions on Biomedical Engineering, 40:136–144, 1993. [16] Amal Jubran. Pulse oximetry. Critical Care, 3:R11–R17, May 1999. [17] Y. Mendelson and R. A. Peura. Noninvasive detection of profound arterial blood gasses. IEEE Transactions on Biomedical Engineering, BME–31(12):792–799, Dec 1984. Referenced in Sue’s Master’s thesis [26]. [18] K .H. Shelley and S. Shelley. Pulse oximeter waveform: Photoelectric plethysmography. In C. Lake, editor, Clinical Monitoring: Practical applications for anesthesia and critical care, pages 420–428. W.B. Saunders Co., 2001. [19] K.H. Shelley and et al. The use of joint time frequency analysis of the pulse oximeter waveform to measure the respiratory rate of ventilated patients. Anesthesiology, 91(3A):A583, September 1999. [20] George B. Moody, Roger G. Mark, Andrea Zoocola, and Sara Mantero. Derivation of respiratory signals from multi-lead ecgs. Computers in Cardiology, 12:113– 116, 1985. [21] Metin Akay. Biomedical Signal Processing. Academic Press Inc., 1994. [22] S. Boveda, M. Galinier, A. Pathak, and et al. Prognostic value of heart rate variability in time domain analysis in conjestive heart failure. Journal of Interventional Cardiac Electrophysiology, 5:181–187, 2001. [23] Kirk Shelley, Doris Tamai, Denis Jablonka, Michael Gresquiere, Robert Stout, and David Silverman. The impact of venous pulsation on the forehead reflectance pulse oximeter waveform as a possible source of error in spo2 calculation. In Anesthesia and Analgesia, editors, Society for Technology in Anesthesia, Annual Meeting 2004, page 30, 2004.

97 This thesis powered by LATEX, caffeine, and the occasional all-nighter.

Suggest Documents