Skip to content

Instantly share code, notes, and snippets.

@mfurquimdev
Created July 1, 2015 04:35
Show Gist options
  • Save mfurquimdev/380b5e9536e314770e11 to your computer and use it in GitHub Desktop.
Save mfurquimdev/380b5e9536e314770e11 to your computer and use it in GitHub Desktop.
Heart frequency analysis
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
static const int WINDOW = 120000;
float sdnn_function (float*, int);
float rmssd_function (float*, int);
float frequency (int, int);
float sdnn_function (float* rr, int nr)
{
float sdnn = 0;
float sum = 0;
float avg = 0;
for (int i = 0; i < nr; i++)
sum += rr[i];
avg = sum / nr;
cout << "AVG\t" << avg << endl;
sum = 0;
for (int i = 0; i < nr; i++)
sum += pow ((rr[i] - avg), 2);
sdnn = sum / (nr - 1);
sdnn = sqrt(sdnn);
return sdnn;
}
float rmssd_function (float* rr, int nr)
{
float rmssd = 0;
float sum = 0;
for (int i = 1; i < nr; i++)
sum += pow ((rr[i] - rr[i - 1]), 2);
rmssd = sum / (nr - 1);
rmssd = sqrt(rmssd);
return rmssd;
}
float frequency (int sum, int nr)
{
float fc;
sum /= 60000;
fc = nr/sum;
return fc;
}
int main (int argc, char* argv[])
{
int* rr;
int* rr2;
int sum = 0;
int samples = atoi(argv[1]);
rr = (int*) malloc (sizeof(int) * samples);
rr2 = (int*) malloc (sizeof(int) * samples);
for (int i = 0; i < samples; i++) {
cin >> rr[i];
rr2[i] = 0.0;
}
int i = samples - 1;
int nr = 0;
while (sum < WINDOW)
{
sum += rr[i];
rr2[samples - (i + 1)] = rr[i];
i--;
nr++;
}
float soma = 0;
float *nrm;
nrm = (float*) malloc (sizeof(float) * nr);
for (i = nr - 1; i >= 0; i--){
nrm[nr - (i + 1)] = rr2[i];
soma += rr2[i];
}
float sdnn = sdnn_function (nrm, nr);
float rmssd = rmssd_function (nrm, nr);
cout << "SDNN\t" << sdnn << endl;
cout << "RMSSD\t" << rmssd << endl;
float fc = frequency(soma, nr);
cout << "Frqncy\t" << fc << endl;
float media = soma / nr;
float* c_nrm;
c_nrm = (float*) malloc (sizeof(float) * samples);
for (i = 0; i < nr; i++)
c_nrm[i] = nrm[i];
cout << endl << "CORRIGINDO...\n" << endl;
for (int count = 0; count < 8; count ++)
{
switch (count)
{
case 0:
cout << "\nDividido pela Media." << endl;
for (i = 0; i < nr; i++)
nrm[i] = c_nrm[i] / media;
break;
case 1:
cout << "\nDividido pela Raiz da Media." << endl;
for (i = 0; i < nr; i++)
nrm[i] = c_nrm[i] / sqrt (media);
break;
case 2:
cout << "\nDividido pela Media ao Quadrado." << endl;
for (i = 0; i < nr; i++)
nrm[i] = c_nrm[i] / pow (media,2);
break;
case 3:
cout << "\nDividido pela Media a Quarta." << endl;
for (i = 0; i < nr; i++)
nrm[i] = c_nrm[i] / pow (media,4);
break;
case 4:
cout << "\nMultiplicado pela Media." << endl;
for (i = 0; i < nr; i++)
nrm[i] = c_nrm[i] * media;
break;
case 5:
cout << "\nMultiplicado pela Raiz da Media." << endl;
for (i = 0; i < nr; i++)
nrm[i] = c_nrm[i] * sqrt (media);
break;
case 6:
cout << "\nMultiplicado pela Media ao Quadrado." << endl;
for (i = 0; i < nr; i++)
nrm[i] = c_nrm[i] * pow (media,2);
break;
case 7:
cout << "\nMultiplicado pela Media a Quarta." << endl;
for (i = 0; i < nr; i++)
nrm[i] = c_nrm[i] * pow (media,4);
break;
default:
cout << "ERROR!" << endl;
break;
}
sdnn = sdnn_function (nrm, nr);
cout << "SDNN\t" << sdnn << endl;
rmssd = rmssd_function (nrm, nr);
cout << "RMSSD\t" << rmssd << endl;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment