Mohsen Samadani
/
Algorithm-testing
Code for measuring the signal with a specified length and sampling rate, and saving it on a SD card.
Diff: Envelope/ifft.cpp
- Revision:
- 1:a514e4de034d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Envelope/ifft.cpp Fri Jul 14 14:41:10 2017 +0000 @@ -0,0 +1,697 @@ +// +// Academic License - for use in teaching, academic research, and meeting +// course requirements at degree granting institutions only. Not for +// government, commercial, or other organizational use. +// File: ifft.cpp +// +// MATLAB Coder version : 3.3 +// C/C++ source code generated on : 13-Jul-2017 15:47:47 +// + +// Include Files +#include "envSignal.h" +#include "ifft.h" +#include "envSignal_emxutil.h" + +// Function Definitions + +// +// Arguments : const emxArray_creal32_T *x +// int n1_unsigned +// const emxArray_real32_T *costab +// const emxArray_real32_T *sintab +// emxArray_creal32_T *y +// Return Type : void +// +void b_r2br_r2dit_trig(const emxArray_creal32_T *x, int n1_unsigned, const + emxArray_real32_T *costab, const emxArray_real32_T *sintab, emxArray_creal32_T + *y) +{ + int j; + int nRowsD2; + int nRowsD4; + int iDelta2; + int iy; + int ix; + int ju; + int i; + boolean_T tst; + float temp_re; + float temp_im; + float r; + float twid_im; + int ihi; + j = x->size[0]; + if (!(j < n1_unsigned)) { + j = n1_unsigned; + } + + nRowsD2 = n1_unsigned / 2; + nRowsD4 = nRowsD2 / 2; + iDelta2 = y->size[0]; + y->size[0] = n1_unsigned; + emxEnsureCapacity((emxArray__common *)y, iDelta2, sizeof(creal32_T)); + if (n1_unsigned > x->size[0]) { + iy = y->size[0]; + iDelta2 = y->size[0]; + y->size[0] = iy; + emxEnsureCapacity((emxArray__common *)y, iDelta2, sizeof(creal32_T)); + for (iDelta2 = 0; iDelta2 < iy; iDelta2++) { + y->data[iDelta2].re = 0.0F; + y->data[iDelta2].im = 0.0F; + } + } + + ix = 0; + ju = 0; + iy = 0; + for (i = 1; i < j; i++) { + y->data[iy] = x->data[ix]; + iDelta2 = n1_unsigned; + tst = true; + while (tst) { + iDelta2 >>= 1; + ju ^= iDelta2; + tst = ((ju & iDelta2) == 0); + } + + iy = ju; + ix++; + } + + y->data[iy] = x->data[ix]; + if (n1_unsigned > 1) { + for (i = 0; i <= n1_unsigned - 2; i += 2) { + temp_re = y->data[i + 1].re; + temp_im = y->data[i + 1].im; + y->data[i + 1].re = y->data[i].re - y->data[i + 1].re; + y->data[i + 1].im = y->data[i].im - y->data[i + 1].im; + y->data[i].re += temp_re; + y->data[i].im += temp_im; + } + } + + iy = 2; + iDelta2 = 4; + ix = 1 + ((nRowsD4 - 1) << 2); + while (nRowsD4 > 0) { + for (i = 0; i < ix; i += iDelta2) { + temp_re = y->data[i + iy].re; + temp_im = y->data[i + iy].im; + y->data[i + iy].re = y->data[i].re - temp_re; + y->data[i + iy].im = y->data[i].im - temp_im; + y->data[i].re += temp_re; + y->data[i].im += temp_im; + } + + ju = 1; + for (j = nRowsD4; j < nRowsD2; j += nRowsD4) { + r = costab->data[j]; + twid_im = sintab->data[j]; + i = ju; + ihi = ju + ix; + while (i < ihi) { + temp_re = r * y->data[i + iy].re - twid_im * y->data[i + iy].im; + temp_im = r * y->data[i + iy].im + twid_im * y->data[i + iy].re; + y->data[i + iy].re = y->data[i].re - temp_re; + y->data[i + iy].im = y->data[i].im - temp_im; + y->data[i].re += temp_re; + y->data[i].im += temp_im; + i += iDelta2; + } + + ju++; + } + + nRowsD4 /= 2; + iy = iDelta2; + iDelta2 += iDelta2; + ix -= iy; + } + + if (y->size[0] > 1) { + r = 1.0F / (float)y->size[0]; + iDelta2 = y->size[0]; + emxEnsureCapacity((emxArray__common *)y, iDelta2, sizeof(creal32_T)); + iy = y->size[0]; + for (iDelta2 = 0; iDelta2 < iy; iDelta2++) { + y->data[iDelta2].re *= r; + y->data[iDelta2].im *= r; + } + } +} + +// +// Arguments : int n1 +// boolean_T useRadix2 +// int *N2blue +// int *nRows +// Return Type : void +// +void get_algo_sizes(int n1, boolean_T useRadix2, int *N2blue, int *nRows) +{ + int nn1m1; + int pmax; + int pmin; + boolean_T exitg1; + int p; + int pow2p; + *N2blue = 1; + if (useRadix2) { + *nRows = n1; + } else { + if (n1 > 0) { + nn1m1 = (n1 + n1) - 1; + pmax = 31; + if (nn1m1 > MIN_int32_T) { + if (nn1m1 < 0) { + nn1m1 = -nn1m1; + } + + if (nn1m1 <= 1) { + pmax = 0; + } else { + pmin = 0; + exitg1 = false; + while ((!exitg1) && (pmax - pmin > 1)) { + p = (pmin + pmax) >> 1; + pow2p = 1 << p; + if (pow2p == nn1m1) { + pmax = p; + exitg1 = true; + } else if (pow2p > nn1m1) { + pmax = p; + } else { + pmin = p; + } + } + } + } + + *N2blue = 1 << pmax; + } + + *nRows = *N2blue; + } +} + +// +// Arguments : const emxArray_creal32_T *x +// emxArray_creal32_T *y +// Return Type : void +// +void ifft(const emxArray_creal32_T *x, emxArray_creal32_T *y) +{ + int n1; + emxArray_real32_T *costab1q; + int nInt2; + boolean_T useRadix2; + int N2blue; + int nd2; + float e; + int nRowsD4; + int k; + emxArray_real32_T *costab; + emxArray_real32_T *sintab; + emxArray_real32_T *sintabinv; + emxArray_creal32_T *wwc; + int nInt2m1; + int b_y; + float denom_re; + emxArray_creal32_T *fy; + float wwc_im; + emxArray_creal32_T *fv; + float wwc_re; + float fv_im; + float b_wwc_im; + float fv_re; + float b_fv_im; + float b_fv_re; + n1 = x->size[0]; + if (x->size[0] == 0) { + nInt2 = y->size[0]; + y->size[0] = 0; + emxEnsureCapacity((emxArray__common *)y, nInt2, sizeof(creal32_T)); + } else { + emxInit_real32_T(&costab1q, 2); + useRadix2 = ((x->size[0] & (x->size[0] - 1)) == 0); + get_algo_sizes(x->size[0], useRadix2, &N2blue, &nd2); + e = 6.28318548F / (float)nd2; + nRowsD4 = nd2 / 2 / 2; + nInt2 = costab1q->size[0] * costab1q->size[1]; + costab1q->size[0] = 1; + costab1q->size[1] = nRowsD4 + 1; + emxEnsureCapacity((emxArray__common *)costab1q, nInt2, sizeof(float)); + costab1q->data[0] = 1.0F; + nd2 = nRowsD4 / 2; + for (k = 1; k <= nd2; k++) { + costab1q->data[k] = std::cos(e * (float)k); + } + + for (k = nd2 + 1; k < nRowsD4; k++) { + costab1q->data[k] = std::sin(e * (float)(nRowsD4 - k)); + } + + costab1q->data[nRowsD4] = 0.0F; + emxInit_real32_T(&costab, 2); + emxInit_real32_T(&sintab, 2); + emxInit_real32_T(&sintabinv, 2); + if (!useRadix2) { + nd2 = costab1q->size[1] - 1; + nRowsD4 = (costab1q->size[1] - 1) << 1; + nInt2 = costab->size[0] * costab->size[1]; + costab->size[0] = 1; + costab->size[1] = nRowsD4 + 1; + emxEnsureCapacity((emxArray__common *)costab, nInt2, sizeof(float)); + nInt2 = sintab->size[0] * sintab->size[1]; + sintab->size[0] = 1; + sintab->size[1] = nRowsD4 + 1; + emxEnsureCapacity((emxArray__common *)sintab, nInt2, sizeof(float)); + costab->data[0] = 1.0F; + sintab->data[0] = 0.0F; + nInt2 = sintabinv->size[0] * sintabinv->size[1]; + sintabinv->size[0] = 1; + sintabinv->size[1] = nRowsD4 + 1; + emxEnsureCapacity((emxArray__common *)sintabinv, nInt2, sizeof(float)); + for (k = 1; k <= nd2; k++) { + sintabinv->data[k] = costab1q->data[nd2 - k]; + } + + for (k = costab1q->size[1]; k <= nRowsD4; k++) { + sintabinv->data[k] = costab1q->data[k - nd2]; + } + + for (k = 1; k <= nd2; k++) { + costab->data[k] = costab1q->data[k]; + sintab->data[k] = -costab1q->data[nd2 - k]; + } + + for (k = costab1q->size[1]; k <= nRowsD4; k++) { + costab->data[k] = -costab1q->data[nRowsD4 - k]; + sintab->data[k] = -costab1q->data[k - nd2]; + } + } else { + nd2 = costab1q->size[1] - 1; + nRowsD4 = (costab1q->size[1] - 1) << 1; + nInt2 = costab->size[0] * costab->size[1]; + costab->size[0] = 1; + costab->size[1] = nRowsD4 + 1; + emxEnsureCapacity((emxArray__common *)costab, nInt2, sizeof(float)); + nInt2 = sintab->size[0] * sintab->size[1]; + sintab->size[0] = 1; + sintab->size[1] = nRowsD4 + 1; + emxEnsureCapacity((emxArray__common *)sintab, nInt2, sizeof(float)); + costab->data[0] = 1.0F; + sintab->data[0] = 0.0F; + for (k = 1; k <= nd2; k++) { + costab->data[k] = costab1q->data[k]; + sintab->data[k] = costab1q->data[nd2 - k]; + } + + for (k = costab1q->size[1]; k <= nRowsD4; k++) { + costab->data[k] = -costab1q->data[nRowsD4 - k]; + sintab->data[k] = costab1q->data[k - nd2]; + } + + nInt2 = sintabinv->size[0] * sintabinv->size[1]; + sintabinv->size[0] = 1; + sintabinv->size[1] = 0; + emxEnsureCapacity((emxArray__common *)sintabinv, nInt2, sizeof(float)); + } + + emxFree_real32_T(&costab1q); + if (useRadix2) { + b_r2br_r2dit_trig(x, x->size[0], costab, sintab, y); + } else { + emxInit_creal32_T(&wwc, 1); + nInt2m1 = (x->size[0] + x->size[0]) - 1; + nInt2 = wwc->size[0]; + wwc->size[0] = nInt2m1; + emxEnsureCapacity((emxArray__common *)wwc, nInt2, sizeof(creal32_T)); + nd2 = x->size[0]; + nRowsD4 = 0; + wwc->data[x->size[0] - 1].re = 1.0F; + wwc->data[x->size[0] - 1].im = 0.0F; + nInt2 = x->size[0] << 1; + for (k = 1; k < n1; k++) { + b_y = (k << 1) - 1; + if (nInt2 - nRowsD4 <= b_y) { + nRowsD4 += b_y - nInt2; + } else { + nRowsD4 += b_y; + } + + e = 3.14159274F * (float)nRowsD4 / (float)x->size[0]; + if (e == 0.0F) { + denom_re = 1.0F; + e = 0.0F; + } else { + denom_re = std::cos(e); + e = std::sin(e); + } + + wwc->data[nd2 - 2].re = denom_re; + wwc->data[nd2 - 2].im = -e; + nd2--; + } + + nd2 = 0; + for (k = nInt2m1 - 1; k >= n1; k--) { + wwc->data[k] = wwc->data[nd2]; + nd2++; + } + + nRowsD4 = x->size[0]; + nd2 = x->size[0]; + nInt2 = y->size[0]; + y->size[0] = nd2; + emxEnsureCapacity((emxArray__common *)y, nInt2, sizeof(creal32_T)); + nd2 = 0; + for (k = 0; k + 1 <= nRowsD4; k++) { + denom_re = wwc->data[(n1 + k) - 1].re; + e = wwc->data[(n1 + k) - 1].im; + wwc_im = x->data[nd2].re; + wwc_re = x->data[nd2].im; + fv_im = x->data[nd2].im; + b_wwc_im = x->data[nd2].re; + y->data[k].re = denom_re * wwc_im + e * wwc_re; + y->data[k].im = denom_re * fv_im - e * b_wwc_im; + nd2++; + } + + while (nRowsD4 + 1 <= n1) { + y->data[nRowsD4].re = 0.0F; + y->data[nRowsD4].im = 0.0F; + nRowsD4++; + } + + emxInit_creal32_T(&fy, 1); + emxInit_creal32_T(&fv, 1); + r2br_r2dit_trig_impl(y, 0, N2blue, costab, sintab, fy); + r2br_r2dit_trig(wwc, N2blue, costab, sintab, fv); + nInt2 = fy->size[0]; + emxEnsureCapacity((emxArray__common *)fy, nInt2, sizeof(creal32_T)); + nd2 = fy->size[0]; + for (nInt2 = 0; nInt2 < nd2; nInt2++) { + e = fy->data[nInt2].re; + wwc_im = fy->data[nInt2].im; + fv_re = fv->data[nInt2].re; + b_fv_im = fv->data[nInt2].im; + fy->data[nInt2].re = e * fv_re - wwc_im * b_fv_im; + fy->data[nInt2].im = e * b_fv_im + wwc_im * fv_re; + } + + b_r2br_r2dit_trig(fy, N2blue, costab, sintabinv, fv); + nd2 = 0; + denom_re = (float)x->size[0]; + k = (int)(float)x->size[0] - 1; + emxFree_creal32_T(&fy); + while (k + 1 <= wwc->size[0]) { + e = wwc->data[k].re; + fv_re = fv->data[k].re; + wwc_im = wwc->data[k].im; + b_fv_im = fv->data[k].im; + wwc_re = wwc->data[k].re; + fv_im = fv->data[k].im; + b_wwc_im = wwc->data[k].im; + b_fv_re = fv->data[k].re; + y->data[nd2].re = e * fv_re + wwc_im * b_fv_im; + y->data[nd2].im = wwc_re * fv_im - b_wwc_im * b_fv_re; + e = wwc->data[k].re; + fv_re = fv->data[k].re; + wwc_im = wwc->data[k].im; + b_fv_im = fv->data[k].im; + wwc_re = wwc->data[k].re; + fv_im = fv->data[k].im; + b_wwc_im = wwc->data[k].im; + b_fv_re = fv->data[k].re; + y->data[nd2].re = e * fv_re + wwc_im * b_fv_im; + y->data[nd2].im = wwc_re * fv_im - b_wwc_im * b_fv_re; + e = y->data[nd2].re; + wwc_im = y->data[nd2].im; + if (wwc_im == 0.0F) { + y->data[nd2].re = e / denom_re; + y->data[nd2].im = 0.0F; + } else if (e == 0.0F) { + y->data[nd2].re = 0.0F; + y->data[nd2].im = wwc_im / denom_re; + } else { + y->data[nd2].re = e / denom_re; + y->data[nd2].im = wwc_im / denom_re; + } + + nd2++; + k++; + } + + emxFree_creal32_T(&fv); + emxFree_creal32_T(&wwc); + } + + emxFree_real32_T(&sintabinv); + emxFree_real32_T(&sintab); + emxFree_real32_T(&costab); + } +} + +// +// Arguments : const emxArray_creal32_T *x +// int n1_unsigned +// const emxArray_real32_T *costab +// const emxArray_real32_T *sintab +// emxArray_creal32_T *y +// Return Type : void +// +void r2br_r2dit_trig(const emxArray_creal32_T *x, int n1_unsigned, const + emxArray_real32_T *costab, const emxArray_real32_T *sintab, + emxArray_creal32_T *y) +{ + int j; + int nRowsD2; + int nRowsD4; + int iy; + int iDelta; + int ix; + int ju; + int i; + boolean_T tst; + float temp_re; + float temp_im; + float twid_re; + float twid_im; + int ihi; + j = x->size[0]; + if (!(j < n1_unsigned)) { + j = n1_unsigned; + } + + nRowsD2 = n1_unsigned / 2; + nRowsD4 = nRowsD2 / 2; + iy = y->size[0]; + y->size[0] = n1_unsigned; + emxEnsureCapacity((emxArray__common *)y, iy, sizeof(creal32_T)); + if (n1_unsigned > x->size[0]) { + iDelta = y->size[0]; + iy = y->size[0]; + y->size[0] = iDelta; + emxEnsureCapacity((emxArray__common *)y, iy, sizeof(creal32_T)); + for (iy = 0; iy < iDelta; iy++) { + y->data[iy].re = 0.0F; + y->data[iy].im = 0.0F; + } + } + + ix = 0; + ju = 0; + iy = 0; + for (i = 1; i < j; i++) { + y->data[iy] = x->data[ix]; + iDelta = n1_unsigned; + tst = true; + while (tst) { + iDelta >>= 1; + ju ^= iDelta; + tst = ((ju & iDelta) == 0); + } + + iy = ju; + ix++; + } + + y->data[iy] = x->data[ix]; + if (n1_unsigned > 1) { + for (i = 0; i <= n1_unsigned - 2; i += 2) { + temp_re = y->data[i + 1].re; + temp_im = y->data[i + 1].im; + y->data[i + 1].re = y->data[i].re - y->data[i + 1].re; + y->data[i + 1].im = y->data[i].im - y->data[i + 1].im; + y->data[i].re += temp_re; + y->data[i].im += temp_im; + } + } + + iDelta = 2; + iy = 4; + ix = 1 + ((nRowsD4 - 1) << 2); + while (nRowsD4 > 0) { + for (i = 0; i < ix; i += iy) { + temp_re = y->data[i + iDelta].re; + temp_im = y->data[i + iDelta].im; + y->data[i + iDelta].re = y->data[i].re - temp_re; + y->data[i + iDelta].im = y->data[i].im - temp_im; + y->data[i].re += temp_re; + y->data[i].im += temp_im; + } + + ju = 1; + for (j = nRowsD4; j < nRowsD2; j += nRowsD4) { + twid_re = costab->data[j]; + twid_im = sintab->data[j]; + i = ju; + ihi = ju + ix; + while (i < ihi) { + temp_re = twid_re * y->data[i + iDelta].re - twid_im * y->data[i + + iDelta].im; + temp_im = twid_re * y->data[i + iDelta].im + twid_im * y->data[i + + iDelta].re; + y->data[i + iDelta].re = y->data[i].re - temp_re; + y->data[i + iDelta].im = y->data[i].im - temp_im; + y->data[i].re += temp_re; + y->data[i].im += temp_im; + i += iy; + } + + ju++; + } + + nRowsD4 /= 2; + iDelta = iy; + iy += iy; + ix -= iDelta; + } +} + +// +// Arguments : const emxArray_creal32_T *x +// int xoffInit +// int unsigned_nRows +// const emxArray_real32_T *costab +// const emxArray_real32_T *sintab +// emxArray_creal32_T *y +// Return Type : void +// +void r2br_r2dit_trig_impl(const emxArray_creal32_T *x, int xoffInit, int + unsigned_nRows, const emxArray_real32_T *costab, const emxArray_real32_T + *sintab, emxArray_creal32_T *y) +{ + int j; + int nRowsD2; + int nRowsD4; + int iy; + int iDelta; + int ix; + int ju; + int i; + boolean_T tst; + float temp_re; + float temp_im; + float twid_re; + float twid_im; + int ihi; + j = x->size[0]; + if (!(j < unsigned_nRows)) { + j = unsigned_nRows; + } + + nRowsD2 = unsigned_nRows / 2; + nRowsD4 = nRowsD2 / 2; + iy = y->size[0]; + y->size[0] = unsigned_nRows; + emxEnsureCapacity((emxArray__common *)y, iy, sizeof(creal32_T)); + if (unsigned_nRows > x->size[0]) { + iDelta = y->size[0]; + iy = y->size[0]; + y->size[0] = iDelta; + emxEnsureCapacity((emxArray__common *)y, iy, sizeof(creal32_T)); + for (iy = 0; iy < iDelta; iy++) { + y->data[iy].re = 0.0F; + y->data[iy].im = 0.0F; + } + } + + ix = xoffInit; + ju = 0; + iy = 0; + for (i = 1; i < j; i++) { + y->data[iy] = x->data[ix]; + iDelta = unsigned_nRows; + tst = true; + while (tst) { + iDelta >>= 1; + ju ^= iDelta; + tst = ((ju & iDelta) == 0); + } + + iy = ju; + ix++; + } + + y->data[iy] = x->data[ix]; + if (unsigned_nRows > 1) { + for (i = 0; i <= unsigned_nRows - 2; i += 2) { + temp_re = y->data[i + 1].re; + temp_im = y->data[i + 1].im; + y->data[i + 1].re = y->data[i].re - y->data[i + 1].re; + y->data[i + 1].im = y->data[i].im - y->data[i + 1].im; + y->data[i].re += temp_re; + y->data[i].im += temp_im; + } + } + + iDelta = 2; + iy = 4; + ix = 1 + ((nRowsD4 - 1) << 2); + while (nRowsD4 > 0) { + for (i = 0; i < ix; i += iy) { + temp_re = y->data[i + iDelta].re; + temp_im = y->data[i + iDelta].im; + y->data[i + iDelta].re = y->data[i].re - temp_re; + y->data[i + iDelta].im = y->data[i].im - temp_im; + y->data[i].re += temp_re; + y->data[i].im += temp_im; + } + + ju = 1; + for (j = nRowsD4; j < nRowsD2; j += nRowsD4) { + twid_re = costab->data[j]; + twid_im = sintab->data[j]; + i = ju; + ihi = ju + ix; + while (i < ihi) { + temp_re = twid_re * y->data[i + iDelta].re - twid_im * y->data[i + + iDelta].im; + temp_im = twid_re * y->data[i + iDelta].im + twid_im * y->data[i + + iDelta].re; + y->data[i + iDelta].re = y->data[i].re - temp_re; + y->data[i + iDelta].im = y->data[i].im - temp_im; + y->data[i].re += temp_re; + y->data[i].im += temp_im; + i += iy; + } + + ju++; + } + + nRowsD4 /= 2; + iDelta = iy; + iy += iy; + ix -= iDelta; + } +} + +// +// File trailer for ifft.cpp +// +// [EOF] +// +