Mohsen Samadani
/
Algorithm-testing
Code for measuring the signal with a specified length and sampling rate, and saving it on a SD card.
Envelope/envSignal.cpp@2:8c5b6522139f, 2017-10-05 (annotated)
- 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?
User | Revision | Line number | New 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 |