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:
Thu Oct 05 17:44:39 2017 +0000
Revision:
2:8c5b6522139f
Parent:
1:a514e4de034d
A version of the code that initializes the SD RAM, activates the codec, measures the signal and saves the signal onto the SD Card.

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