Code for measuring the signal with a specified length and sampling rate, and saving it on a SD card.

Dependencies:   EALib I2S mbed

Committer:
msamadani
Date:
Fri Jul 14 14:41:10 2017 +0000
Revision:
1:a514e4de034d
envSignal function works.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
msamadani 1:a514e4de034d 1 //
msamadani 1:a514e4de034d 2 // Academic License - for use in teaching, academic research, and meeting
msamadani 1:a514e4de034d 3 // course requirements at degree granting institutions only. Not for
msamadani 1:a514e4de034d 4 // government, commercial, or other organizational use.
msamadani 1:a514e4de034d 5 // File: envSignal.cpp
msamadani 1:a514e4de034d 6 //
msamadani 1:a514e4de034d 7 // MATLAB Coder version : 3.3
msamadani 1:a514e4de034d 8 // C/C++ source code generated on : 13-Jul-2017 15:47:47
msamadani 1:a514e4de034d 9 //
msamadani 1:a514e4de034d 10
msamadani 1:a514e4de034d 11 // Include Files
msamadani 1:a514e4de034d 12 #include "envSignal.h"
msamadani 1:a514e4de034d 13 #include "envSignal_emxutil.h"
msamadani 1:a514e4de034d 14 #include "ifft.h"
msamadani 1:a514e4de034d 15 #include "fft.h"
msamadani 1:a514e4de034d 16
msamadani 1:a514e4de034d 17 // Function Declarations
msamadani 1:a514e4de034d 18 static float rt_hypotf(float u0, float u1);
msamadani 1:a514e4de034d 19
msamadani 1:a514e4de034d 20 // Function Definitions
msamadani 1:a514e4de034d 21
msamadani 1:a514e4de034d 22 //
msamadani 1:a514e4de034d 23 // Arguments : float u0
msamadani 1:a514e4de034d 24 // float u1
msamadani 1:a514e4de034d 25 // Return Type : float
msamadani 1:a514e4de034d 26 //
msamadani 1:a514e4de034d 27 static float rt_hypotf(float u0, float u1)
msamadani 1:a514e4de034d 28 {
msamadani 1:a514e4de034d 29 float y;
msamadani 1:a514e4de034d 30 float a;
msamadani 1:a514e4de034d 31 float b;
msamadani 1:a514e4de034d 32 a = std::abs(u0);
msamadani 1:a514e4de034d 33 b = std::abs(u1);
msamadani 1:a514e4de034d 34 if (a < b) {
msamadani 1:a514e4de034d 35 a /= b;
msamadani 1:a514e4de034d 36 y = b * std::sqrt(a * a + 1.0F);
msamadani 1:a514e4de034d 37 } else if (a > b) {
msamadani 1:a514e4de034d 38 b /= a;
msamadani 1:a514e4de034d 39 y = a * std::sqrt(b * b + 1.0F);
msamadani 1:a514e4de034d 40 } else {
msamadani 1:a514e4de034d 41 y = a * 1.41421354F;
msamadani 1:a514e4de034d 42 }
msamadani 1:a514e4de034d 43
msamadani 1:a514e4de034d 44 return y;
msamadani 1:a514e4de034d 45 }
msamadani 1:a514e4de034d 46
msamadani 1:a514e4de034d 47 //
msamadani 1:a514e4de034d 48 // Bandpass filter signal
msamadani 1:a514e4de034d 49 // Arguments : const emxArray_real32_T *x
msamadani 1:a514e4de034d 50 // const emxArray_real32_T *fir_coef
msamadani 1:a514e4de034d 51 // emxArray_real32_T *y
msamadani 1:a514e4de034d 52 // Return Type : void
msamadani 1:a514e4de034d 53 //
msamadani 1:a514e4de034d 54 void envSignal(const emxArray_real32_T *x, const emxArray_real32_T *fir_coef,
msamadani 1:a514e4de034d 55 emxArray_real32_T *y)
msamadani 1:a514e4de034d 56 {
msamadani 1:a514e4de034d 57 emxArray_real32_T *b;
msamadani 1:a514e4de034d 58 int nx_m_nb;
msamadani 1:a514e4de034d 59 int naxpy;
msamadani 1:a514e4de034d 60 emxArray_real32_T *b_y1;
msamadani 1:a514e4de034d 61 int nb;
msamadani 1:a514e4de034d 62 unsigned int uv0[2];
msamadani 1:a514e4de034d 63 int nx;
msamadani 1:a514e4de034d 64 int k;
msamadani 1:a514e4de034d 65 int jp;
msamadani 1:a514e4de034d 66 int j;
msamadani 1:a514e4de034d 67 emxArray_real32_T *x_filt;
msamadani 1:a514e4de034d 68 emxArray_creal32_T *b_x;
msamadani 1:a514e4de034d 69 int b_x_filt[1];
msamadani 1:a514e4de034d 70 emxArray_real32_T c_x_filt;
msamadani 1:a514e4de034d 71 emxArray_creal32_T *c_x;
msamadani 1:a514e4de034d 72 emxInit_real32_T1(&b, 1);
msamadani 1:a514e4de034d 73 nx_m_nb = b->size[0];
msamadani 1:a514e4de034d 74 b->size[0] = x->size[1];
msamadani 1:a514e4de034d 75 emxEnsureCapacity((emxArray__common *)b, nx_m_nb, sizeof(float));
msamadani 1:a514e4de034d 76 naxpy = x->size[1];
msamadani 1:a514e4de034d 77 for (nx_m_nb = 0; nx_m_nb < naxpy; nx_m_nb++) {
msamadani 1:a514e4de034d 78 b->data[nx_m_nb] = x->data[x->size[0] * nx_m_nb];
msamadani 1:a514e4de034d 79 }
msamadani 1:a514e4de034d 80
msamadani 1:a514e4de034d 81 emxInit_real32_T1(&b_y1, 1);
msamadani 1:a514e4de034d 82 nb = fir_coef->size[1];
msamadani 1:a514e4de034d 83 uv0[0] = (unsigned int)b->size[0];
msamadani 1:a514e4de034d 84 nx_m_nb = b_y1->size[0];
msamadani 1:a514e4de034d 85 b_y1->size[0] = (int)uv0[0];
msamadani 1:a514e4de034d 86 emxEnsureCapacity((emxArray__common *)b_y1, nx_m_nb, sizeof(float));
msamadani 1:a514e4de034d 87 nx = b->size[0];
msamadani 1:a514e4de034d 88 naxpy = b_y1->size[0];
msamadani 1:a514e4de034d 89 nx_m_nb = b_y1->size[0];
msamadani 1:a514e4de034d 90 b_y1->size[0] = naxpy;
msamadani 1:a514e4de034d 91 emxEnsureCapacity((emxArray__common *)b_y1, nx_m_nb, sizeof(float));
msamadani 1:a514e4de034d 92 for (nx_m_nb = 0; nx_m_nb < naxpy; nx_m_nb++) {
msamadani 1:a514e4de034d 93 b_y1->data[nx_m_nb] = 0.0F;
msamadani 1:a514e4de034d 94 }
msamadani 1:a514e4de034d 95
msamadani 1:a514e4de034d 96 if (b->size[0] >= (fir_coef->size[1] << 1)) {
msamadani 1:a514e4de034d 97 for (k = 1; k <= nb; k++) {
msamadani 1:a514e4de034d 98 for (j = k; j <= nx; j++) {
msamadani 1:a514e4de034d 99 b_y1->data[j - 1] += fir_coef->data[k - 1] * b->data[j - k];
msamadani 1:a514e4de034d 100 }
msamadani 1:a514e4de034d 101 }
msamadani 1:a514e4de034d 102 } else {
msamadani 1:a514e4de034d 103 if (b->size[0] > fir_coef->size[1]) {
msamadani 1:a514e4de034d 104 nx_m_nb = b->size[0] - fir_coef->size[1];
msamadani 1:a514e4de034d 105 } else {
msamadani 1:a514e4de034d 106 nx_m_nb = 0;
msamadani 1:a514e4de034d 107 }
msamadani 1:a514e4de034d 108
msamadani 1:a514e4de034d 109 jp = -2;
msamadani 1:a514e4de034d 110 for (k = 1; k <= nx_m_nb; k++) {
msamadani 1:a514e4de034d 111 jp++;
msamadani 1:a514e4de034d 112 for (j = 1; j <= nb; j++) {
msamadani 1:a514e4de034d 113 b_y1->data[jp + j] += b->data[jp + 1] * fir_coef->data[j - 1];
msamadani 1:a514e4de034d 114 }
msamadani 1:a514e4de034d 115 }
msamadani 1:a514e4de034d 116
msamadani 1:a514e4de034d 117 naxpy = b->size[0] - nx_m_nb;
msamadani 1:a514e4de034d 118 for (k = nx_m_nb + 1; k <= nx; k++) {
msamadani 1:a514e4de034d 119 jp++;
msamadani 1:a514e4de034d 120 for (j = 1; j <= naxpy; j++) {
msamadani 1:a514e4de034d 121 b_y1->data[jp + j] += b->data[jp + 1] * fir_coef->data[j - 1];
msamadani 1:a514e4de034d 122 }
msamadani 1:a514e4de034d 123
msamadani 1:a514e4de034d 124 naxpy--;
msamadani 1:a514e4de034d 125 }
msamadani 1:a514e4de034d 126 }
msamadani 1:a514e4de034d 127
msamadani 1:a514e4de034d 128 emxFree_real32_T(&b);
msamadani 1:a514e4de034d 129 emxInit_real32_T(&x_filt, 2);
msamadani 1:a514e4de034d 130 nx_m_nb = x_filt->size[0] * x_filt->size[1];
msamadani 1:a514e4de034d 131 x_filt->size[0] = 1;
msamadani 1:a514e4de034d 132 x_filt->size[1] = b_y1->size[0];
msamadani 1:a514e4de034d 133 emxEnsureCapacity((emxArray__common *)x_filt, nx_m_nb, sizeof(float));
msamadani 1:a514e4de034d 134 naxpy = b_y1->size[0];
msamadani 1:a514e4de034d 135 for (nx_m_nb = 0; nx_m_nb < naxpy; nx_m_nb++) {
msamadani 1:a514e4de034d 136 x_filt->data[x_filt->size[0] * nx_m_nb] = b_y1->data[nx_m_nb];
msamadani 1:a514e4de034d 137 }
msamadani 1:a514e4de034d 138
msamadani 1:a514e4de034d 139 emxFree_real32_T(&b_y1);
msamadani 1:a514e4de034d 140 emxInit_creal32_T(&b_x, 1);
msamadani 1:a514e4de034d 141
msamadani 1:a514e4de034d 142 // Compute the complex valued analytic signal using fourier transform
msamadani 1:a514e4de034d 143 // method, with all negative frequency components set to zero
msamadani 1:a514e4de034d 144 // xAnalytic = hilbert(xfilt);
msamadani 1:a514e4de034d 145 b_x_filt[0] = x_filt->size[1];
msamadani 1:a514e4de034d 146 c_x_filt = *x_filt;
msamadani 1:a514e4de034d 147 c_x_filt.size = (int *)&b_x_filt;
msamadani 1:a514e4de034d 148 c_x_filt.numDimensions = 1;
msamadani 1:a514e4de034d 149 fft(&c_x_filt, b_x);
msamadani 1:a514e4de034d 150 naxpy = x_filt->size[1];
msamadani 1:a514e4de034d 151 nx_m_nb = naxpy >> 1;
msamadani 1:a514e4de034d 152 if ((naxpy & 1) == 0) {
msamadani 1:a514e4de034d 153 jp = nx_m_nb;
msamadani 1:a514e4de034d 154 } else {
msamadani 1:a514e4de034d 155 jp = nx_m_nb + 1;
msamadani 1:a514e4de034d 156 }
msamadani 1:a514e4de034d 157
msamadani 1:a514e4de034d 158 for (k = 1; k + 1 <= jp; k++) {
msamadani 1:a514e4de034d 159 b_x->data[k].re *= 2.0F;
msamadani 1:a514e4de034d 160 b_x->data[k].im *= 2.0F;
msamadani 1:a514e4de034d 161 }
msamadani 1:a514e4de034d 162
msamadani 1:a514e4de034d 163 for (k = nx_m_nb + 1; k + 1 <= naxpy; k++) {
msamadani 1:a514e4de034d 164 b_x->data[k].re = 0.0F;
msamadani 1:a514e4de034d 165 b_x->data[k].im = 0.0F;
msamadani 1:a514e4de034d 166 }
msamadani 1:a514e4de034d 167
msamadani 1:a514e4de034d 168 emxInit_creal32_T(&c_x, 1);
msamadani 1:a514e4de034d 169 nx_m_nb = c_x->size[0];
msamadani 1:a514e4de034d 170 c_x->size[0] = b_x->size[0];
msamadani 1:a514e4de034d 171 emxEnsureCapacity((emxArray__common *)c_x, nx_m_nb, sizeof(creal32_T));
msamadani 1:a514e4de034d 172 naxpy = b_x->size[0];
msamadani 1:a514e4de034d 173 for (nx_m_nb = 0; nx_m_nb < naxpy; nx_m_nb++) {
msamadani 1:a514e4de034d 174 c_x->data[nx_m_nb] = b_x->data[nx_m_nb];
msamadani 1:a514e4de034d 175 }
msamadani 1:a514e4de034d 176
msamadani 1:a514e4de034d 177 ifft(c_x, b_x);
msamadani 1:a514e4de034d 178
msamadani 1:a514e4de034d 179 // Compute modulus of analytic signal
msamadani 1:a514e4de034d 180 emxFree_creal32_T(&c_x);
msamadani 1:a514e4de034d 181 for (nx_m_nb = 0; nx_m_nb < 2; nx_m_nb++) {
msamadani 1:a514e4de034d 182 uv0[nx_m_nb] = (unsigned int)x_filt->size[nx_m_nb];
msamadani 1:a514e4de034d 183 }
msamadani 1:a514e4de034d 184
msamadani 1:a514e4de034d 185 nx_m_nb = y->size[0] * y->size[1];
msamadani 1:a514e4de034d 186 y->size[0] = 1;
msamadani 1:a514e4de034d 187 y->size[1] = (int)uv0[1];
msamadani 1:a514e4de034d 188 emxEnsureCapacity((emxArray__common *)y, nx_m_nb, sizeof(float));
msamadani 1:a514e4de034d 189 for (k = 0; k + 1 <= x_filt->size[1]; k++) {
msamadani 1:a514e4de034d 190 y->data[k] = rt_hypotf(b_x->data[k].re, b_x->data[k].im);
msamadani 1:a514e4de034d 191 }
msamadani 1:a514e4de034d 192
msamadani 1:a514e4de034d 193 emxFree_creal32_T(&b_x);
msamadani 1:a514e4de034d 194 emxFree_real32_T(&x_filt);
msamadani 1:a514e4de034d 195 }
msamadani 1:a514e4de034d 196
msamadani 1:a514e4de034d 197 //
msamadani 1:a514e4de034d 198 // File trailer for envSignal.cpp
msamadani 1:a514e4de034d 199 //
msamadani 1:a514e4de034d 200 // [EOF]
msamadani 1:a514e4de034d 201 //
msamadani 1:a514e4de034d 202