I mentioned previously that the stretch sensors aren't always 100% reliable--that is why I originally tried to use data averages to distinguish breath components. Because of this lack of reliability, I use the six RMI sensors in tandem for greater data accuracy.
Is there a breath?
//The code below is an early version which does not include any of the data analysis related to duration.
//======================~isThereaBreath=========================//
/*
~isThereaBreath is a task that determines the likelihood of different breath components (inspiration, expiration, pause) given the data gathered from the ~serialReceive Task.
The information this task can provide is:
1. Whether breath component is currently inspiration, expiration or hold/pause
2. The confidence the task has in its determination (very confident, confident, pretty sure, less certain)
3. The total depth of the inspiration/expiration (sum of all individual changes in sensor values)
//4. The time that each breath component began and ended (in later version - will post next time!)
//5. The duration of each breath component as it is completed(in later version - will post next time!)
//6. The time since the last breath (to get a sense for the frequency of breaths) (in later version - will post next time!)
//7. The overall breath cycle - two corresponding arrays that together list the duration and breath component of each completed breath cycle (in later version - will post next time!)
*/
~isThereaBreath = Task({
inf.do({
if(~count0.notNil
&& ~count1.notNil
&& ~count2.notNil
&& ~count3.notNil
&& ~count4.notNil
&& ~count5.notNil, {
/*
Each count value represents a conclusion about the breath-status of the RMI user based on a single sensor. If count0 = 1, ~serialReceive suggests that sensor 0 indicates a breath ~totalCount adds all of these values together to determine the likelihood of a given breath-component
*/
~totalCount = ~count0 + ~count1 + ~count2 + ~count3 + ~count4 + ~count5;
//If the total count is greater than or equal to two, an inspiration seems likely
if(~totalCount >= 2, {
//Find the sum of the actual changes in the sensor values to further determine likelihood of inspiration
~totalDepthInsp =
[~depthAtZeroInspiration,
~depthAtOneInspiration,
~depthAtTwoInspiration,
~depthAtThreeInspiration,
~depthAtFourInspiration,
~depthAtFiveInspiration].sum;
//if the total depth of the inspiration is greater than five
if(~totalDepthInsp > 5, {
//post a 1 to indicate an inspiration
~breath = 1;
"inspiration".postln;
//If the overall depth is 5 and 5 or more of the sensors indicate a breath
if(~totalCount >=5, {
"very confident".postln;//a breath is very likely
}, {
//If the overall depth is 5 and 4 of the sensors indicate a breath
if(~totalCount == 4, {
"confident".postln;//an inspiration is likely
}, {
//If the overall depth is 5 and 3 of the sensors indicate a breath
if(~totalCount == 3, {
"pretty sure...".postln;//there is probably an inspiration
}, {
//If the overall depth is 5 and 2 of the sensors indicate a breath
if(~totalCount == 2, {
"less certain".postln; //Inspiration is possible
});
});
});
});
});
}, {
//If the total count is less than or equal to negative two, an expiration seems likely
if(~totalCount <= -2, {
~totalDepthExp =
[~depthAtZeroExhalation,
~depthAtOneExhalation,
~depthAtTwoExhalation,
~depthAtThreeExhalation,
~depthAtFourExhalation,
~depthAtFiveExhalation].sum;
if(~totalDepthExp < -3, {//if the total expiration depth is less than -3
~breath = -1;//there is an expiration
"expiration".postln
if(~totalCount <= -5, {//if it's less than or equal to -5
"very confident".postln;//confidence is high
}, {
if(~totalCount <= -3, {//if it's less than or equal to -3
"confident".postln;//reasonably confident
}, {
"less certain".postln;//otherwise it's less certain
});
});
}, {//if totalCount is less than or = -2, that means there is an exhalation. Otherwise:
~breath = 0}); //no change
"hold/pause".postln;
});
});
//THIS ARRAY SHOWS THE BREATH COMPONENTS AS THEY HAPPEN...DOES NOT DISTINGUISH BETWEEN HOLD/PAUSE
//put all the information in a 10-slot, constantly shifting array
~breathArray = ~breathArray.shift(-1);
~breathArray[~breathArraySize - 1] = ~breath; //put breath values into the array
~breathArray.postln;//post it
});
0.01.wait;
});
});
No comments:
Post a Comment