Mohsen Samadani
/
Algorithm-testing
Code for measuring the signal with a specified length and sampling rate, and saving it on a SD card.
Envelope/fft.cpp@1:a514e4de034d, 2017-07-14 (annotated)
- Committer:
- msamadani
- Date:
- Fri Jul 14 14:41:10 2017 +0000
- Revision:
- 1:a514e4de034d
envSignal function works.
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: fft.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 "fft.h" |
msamadani | 1:a514e4de034d | 14 | #include "envSignal_emxutil.h" |
msamadani | 1:a514e4de034d | 15 | #include "ifft.h" |
msamadani | 1:a514e4de034d | 16 | |
msamadani | 1:a514e4de034d | 17 | // Function Declarations |
msamadani | 1:a514e4de034d | 18 | static void generate_twiddle_tables(int nRows, boolean_T useRadix2, |
msamadani | 1:a514e4de034d | 19 | emxArray_real32_T *costab, emxArray_real32_T *sintab, emxArray_real32_T |
msamadani | 1:a514e4de034d | 20 | *sintabinv); |
msamadani | 1:a514e4de034d | 21 | |
msamadani | 1:a514e4de034d | 22 | // Function Definitions |
msamadani | 1:a514e4de034d | 23 | |
msamadani | 1:a514e4de034d | 24 | // |
msamadani | 1:a514e4de034d | 25 | // Arguments : int nRows |
msamadani | 1:a514e4de034d | 26 | // boolean_T useRadix2 |
msamadani | 1:a514e4de034d | 27 | // emxArray_real32_T *costab |
msamadani | 1:a514e4de034d | 28 | // emxArray_real32_T *sintab |
msamadani | 1:a514e4de034d | 29 | // emxArray_real32_T *sintabinv |
msamadani | 1:a514e4de034d | 30 | // Return Type : void |
msamadani | 1:a514e4de034d | 31 | // |
msamadani | 1:a514e4de034d | 32 | static void generate_twiddle_tables(int nRows, boolean_T useRadix2, |
msamadani | 1:a514e4de034d | 33 | emxArray_real32_T *costab, emxArray_real32_T *sintab, emxArray_real32_T |
msamadani | 1:a514e4de034d | 34 | *sintabinv) |
msamadani | 1:a514e4de034d | 35 | { |
msamadani | 1:a514e4de034d | 36 | emxArray_real32_T *costab1q; |
msamadani | 1:a514e4de034d | 37 | float e; |
msamadani | 1:a514e4de034d | 38 | int nRowsD4; |
msamadani | 1:a514e4de034d | 39 | int nd2; |
msamadani | 1:a514e4de034d | 40 | int k; |
msamadani | 1:a514e4de034d | 41 | int n2; |
msamadani | 1:a514e4de034d | 42 | emxInit_real32_T(&costab1q, 2); |
msamadani | 1:a514e4de034d | 43 | e = 6.28318548F / (float)nRows; |
msamadani | 1:a514e4de034d | 44 | nRowsD4 = nRows / 2 / 2; |
msamadani | 1:a514e4de034d | 45 | nd2 = costab1q->size[0] * costab1q->size[1]; |
msamadani | 1:a514e4de034d | 46 | costab1q->size[0] = 1; |
msamadani | 1:a514e4de034d | 47 | costab1q->size[1] = nRowsD4 + 1; |
msamadani | 1:a514e4de034d | 48 | emxEnsureCapacity((emxArray__common *)costab1q, nd2, sizeof(float)); |
msamadani | 1:a514e4de034d | 49 | costab1q->data[0] = 1.0F; |
msamadani | 1:a514e4de034d | 50 | nd2 = nRowsD4 / 2; |
msamadani | 1:a514e4de034d | 51 | for (k = 1; k <= nd2; k++) { |
msamadani | 1:a514e4de034d | 52 | costab1q->data[k] = std::cos(e * (float)k); |
msamadani | 1:a514e4de034d | 53 | } |
msamadani | 1:a514e4de034d | 54 | |
msamadani | 1:a514e4de034d | 55 | for (k = nd2 + 1; k < nRowsD4; k++) { |
msamadani | 1:a514e4de034d | 56 | costab1q->data[k] = std::sin(e * (float)(nRowsD4 - k)); |
msamadani | 1:a514e4de034d | 57 | } |
msamadani | 1:a514e4de034d | 58 | |
msamadani | 1:a514e4de034d | 59 | costab1q->data[nRowsD4] = 0.0F; |
msamadani | 1:a514e4de034d | 60 | if (!useRadix2) { |
msamadani | 1:a514e4de034d | 61 | nRowsD4 = costab1q->size[1] - 1; |
msamadani | 1:a514e4de034d | 62 | n2 = (costab1q->size[1] - 1) << 1; |
msamadani | 1:a514e4de034d | 63 | nd2 = costab->size[0] * costab->size[1]; |
msamadani | 1:a514e4de034d | 64 | costab->size[0] = 1; |
msamadani | 1:a514e4de034d | 65 | costab->size[1] = n2 + 1; |
msamadani | 1:a514e4de034d | 66 | emxEnsureCapacity((emxArray__common *)costab, nd2, sizeof(float)); |
msamadani | 1:a514e4de034d | 67 | nd2 = sintab->size[0] * sintab->size[1]; |
msamadani | 1:a514e4de034d | 68 | sintab->size[0] = 1; |
msamadani | 1:a514e4de034d | 69 | sintab->size[1] = n2 + 1; |
msamadani | 1:a514e4de034d | 70 | emxEnsureCapacity((emxArray__common *)sintab, nd2, sizeof(float)); |
msamadani | 1:a514e4de034d | 71 | costab->data[0] = 1.0F; |
msamadani | 1:a514e4de034d | 72 | sintab->data[0] = 0.0F; |
msamadani | 1:a514e4de034d | 73 | nd2 = sintabinv->size[0] * sintabinv->size[1]; |
msamadani | 1:a514e4de034d | 74 | sintabinv->size[0] = 1; |
msamadani | 1:a514e4de034d | 75 | sintabinv->size[1] = n2 + 1; |
msamadani | 1:a514e4de034d | 76 | emxEnsureCapacity((emxArray__common *)sintabinv, nd2, sizeof(float)); |
msamadani | 1:a514e4de034d | 77 | for (k = 1; k <= nRowsD4; k++) { |
msamadani | 1:a514e4de034d | 78 | sintabinv->data[k] = costab1q->data[nRowsD4 - k]; |
msamadani | 1:a514e4de034d | 79 | } |
msamadani | 1:a514e4de034d | 80 | |
msamadani | 1:a514e4de034d | 81 | for (k = costab1q->size[1]; k <= n2; k++) { |
msamadani | 1:a514e4de034d | 82 | sintabinv->data[k] = costab1q->data[k - nRowsD4]; |
msamadani | 1:a514e4de034d | 83 | } |
msamadani | 1:a514e4de034d | 84 | |
msamadani | 1:a514e4de034d | 85 | for (k = 1; k <= nRowsD4; k++) { |
msamadani | 1:a514e4de034d | 86 | costab->data[k] = costab1q->data[k]; |
msamadani | 1:a514e4de034d | 87 | sintab->data[k] = -costab1q->data[nRowsD4 - k]; |
msamadani | 1:a514e4de034d | 88 | } |
msamadani | 1:a514e4de034d | 89 | |
msamadani | 1:a514e4de034d | 90 | for (k = costab1q->size[1]; k <= n2; k++) { |
msamadani | 1:a514e4de034d | 91 | costab->data[k] = -costab1q->data[n2 - k]; |
msamadani | 1:a514e4de034d | 92 | sintab->data[k] = -costab1q->data[k - nRowsD4]; |
msamadani | 1:a514e4de034d | 93 | } |
msamadani | 1:a514e4de034d | 94 | } else { |
msamadani | 1:a514e4de034d | 95 | nRowsD4 = costab1q->size[1] - 1; |
msamadani | 1:a514e4de034d | 96 | n2 = (costab1q->size[1] - 1) << 1; |
msamadani | 1:a514e4de034d | 97 | nd2 = costab->size[0] * costab->size[1]; |
msamadani | 1:a514e4de034d | 98 | costab->size[0] = 1; |
msamadani | 1:a514e4de034d | 99 | costab->size[1] = n2 + 1; |
msamadani | 1:a514e4de034d | 100 | emxEnsureCapacity((emxArray__common *)costab, nd2, sizeof(float)); |
msamadani | 1:a514e4de034d | 101 | nd2 = sintab->size[0] * sintab->size[1]; |
msamadani | 1:a514e4de034d | 102 | sintab->size[0] = 1; |
msamadani | 1:a514e4de034d | 103 | sintab->size[1] = n2 + 1; |
msamadani | 1:a514e4de034d | 104 | emxEnsureCapacity((emxArray__common *)sintab, nd2, sizeof(float)); |
msamadani | 1:a514e4de034d | 105 | costab->data[0] = 1.0F; |
msamadani | 1:a514e4de034d | 106 | sintab->data[0] = 0.0F; |
msamadani | 1:a514e4de034d | 107 | for (k = 1; k <= nRowsD4; k++) { |
msamadani | 1:a514e4de034d | 108 | costab->data[k] = costab1q->data[k]; |
msamadani | 1:a514e4de034d | 109 | sintab->data[k] = -costab1q->data[nRowsD4 - k]; |
msamadani | 1:a514e4de034d | 110 | } |
msamadani | 1:a514e4de034d | 111 | |
msamadani | 1:a514e4de034d | 112 | for (k = costab1q->size[1]; k <= n2; k++) { |
msamadani | 1:a514e4de034d | 113 | costab->data[k] = -costab1q->data[n2 - k]; |
msamadani | 1:a514e4de034d | 114 | sintab->data[k] = -costab1q->data[k - nRowsD4]; |
msamadani | 1:a514e4de034d | 115 | } |
msamadani | 1:a514e4de034d | 116 | |
msamadani | 1:a514e4de034d | 117 | nd2 = sintabinv->size[0] * sintabinv->size[1]; |
msamadani | 1:a514e4de034d | 118 | sintabinv->size[0] = 1; |
msamadani | 1:a514e4de034d | 119 | sintabinv->size[1] = 0; |
msamadani | 1:a514e4de034d | 120 | emxEnsureCapacity((emxArray__common *)sintabinv, nd2, sizeof(float)); |
msamadani | 1:a514e4de034d | 121 | } |
msamadani | 1:a514e4de034d | 122 | |
msamadani | 1:a514e4de034d | 123 | emxFree_real32_T(&costab1q); |
msamadani | 1:a514e4de034d | 124 | } |
msamadani | 1:a514e4de034d | 125 | |
msamadani | 1:a514e4de034d | 126 | // |
msamadani | 1:a514e4de034d | 127 | // Arguments : const emxArray_real32_T *x |
msamadani | 1:a514e4de034d | 128 | // emxArray_creal32_T *y |
msamadani | 1:a514e4de034d | 129 | // Return Type : void |
msamadani | 1:a514e4de034d | 130 | // |
msamadani | 1:a514e4de034d | 131 | void fft(const emxArray_real32_T *x, emxArray_creal32_T *y) |
msamadani | 1:a514e4de034d | 132 | { |
msamadani | 1:a514e4de034d | 133 | int n1; |
msamadani | 1:a514e4de034d | 134 | emxArray_real32_T *costab; |
msamadani | 1:a514e4de034d | 135 | int nInt2; |
msamadani | 1:a514e4de034d | 136 | emxArray_real32_T *sintab; |
msamadani | 1:a514e4de034d | 137 | emxArray_real32_T *sintabinv; |
msamadani | 1:a514e4de034d | 138 | boolean_T useRadix2; |
msamadani | 1:a514e4de034d | 139 | int N2blue; |
msamadani | 1:a514e4de034d | 140 | int idx; |
msamadani | 1:a514e4de034d | 141 | emxArray_creal32_T *wwc; |
msamadani | 1:a514e4de034d | 142 | int nInt2m1; |
msamadani | 1:a514e4de034d | 143 | int nRowsD2; |
msamadani | 1:a514e4de034d | 144 | int nRowsD4; |
msamadani | 1:a514e4de034d | 145 | int rt; |
msamadani | 1:a514e4de034d | 146 | int ihi; |
msamadani | 1:a514e4de034d | 147 | int istart; |
msamadani | 1:a514e4de034d | 148 | float nt_im; |
msamadani | 1:a514e4de034d | 149 | float nt_re; |
msamadani | 1:a514e4de034d | 150 | float temp_re; |
msamadani | 1:a514e4de034d | 151 | float temp_im; |
msamadani | 1:a514e4de034d | 152 | emxArray_creal32_T *fy; |
msamadani | 1:a514e4de034d | 153 | emxArray_creal32_T *fv; |
msamadani | 1:a514e4de034d | 154 | float fv_re; |
msamadani | 1:a514e4de034d | 155 | float fv_im; |
msamadani | 1:a514e4de034d | 156 | float wwc_im; |
msamadani | 1:a514e4de034d | 157 | float b_fv_re; |
msamadani | 1:a514e4de034d | 158 | n1 = x->size[0]; |
msamadani | 1:a514e4de034d | 159 | if (x->size[0] == 0) { |
msamadani | 1:a514e4de034d | 160 | nInt2 = y->size[0]; |
msamadani | 1:a514e4de034d | 161 | y->size[0] = 0; |
msamadani | 1:a514e4de034d | 162 | emxEnsureCapacity((emxArray__common *)y, nInt2, sizeof(creal32_T)); |
msamadani | 1:a514e4de034d | 163 | } else { |
msamadani | 1:a514e4de034d | 164 | emxInit_real32_T(&costab, 2); |
msamadani | 1:a514e4de034d | 165 | emxInit_real32_T(&sintab, 2); |
msamadani | 1:a514e4de034d | 166 | emxInit_real32_T(&sintabinv, 2); |
msamadani | 1:a514e4de034d | 167 | useRadix2 = ((x->size[0] & (x->size[0] - 1)) == 0); |
msamadani | 1:a514e4de034d | 168 | get_algo_sizes(x->size[0], useRadix2, &N2blue, &idx); |
msamadani | 1:a514e4de034d | 169 | generate_twiddle_tables(idx, useRadix2, costab, sintab, sintabinv); |
msamadani | 1:a514e4de034d | 170 | if (useRadix2) { |
msamadani | 1:a514e4de034d | 171 | nInt2m1 = x->size[0]; |
msamadani | 1:a514e4de034d | 172 | nRowsD2 = x->size[0] / 2; |
msamadani | 1:a514e4de034d | 173 | nRowsD4 = nRowsD2 / 2; |
msamadani | 1:a514e4de034d | 174 | idx = x->size[0]; |
msamadani | 1:a514e4de034d | 175 | nInt2 = y->size[0]; |
msamadani | 1:a514e4de034d | 176 | y->size[0] = idx; |
msamadani | 1:a514e4de034d | 177 | emxEnsureCapacity((emxArray__common *)y, nInt2, sizeof(creal32_T)); |
msamadani | 1:a514e4de034d | 178 | rt = 0; |
msamadani | 1:a514e4de034d | 179 | nInt2 = 0; |
msamadani | 1:a514e4de034d | 180 | idx = 0; |
msamadani | 1:a514e4de034d | 181 | for (N2blue = 1; N2blue < nInt2m1; N2blue++) { |
msamadani | 1:a514e4de034d | 182 | y->data[idx].re = x->data[rt]; |
msamadani | 1:a514e4de034d | 183 | y->data[idx].im = 0.0F; |
msamadani | 1:a514e4de034d | 184 | idx = n1; |
msamadani | 1:a514e4de034d | 185 | useRadix2 = true; |
msamadani | 1:a514e4de034d | 186 | while (useRadix2) { |
msamadani | 1:a514e4de034d | 187 | idx >>= 1; |
msamadani | 1:a514e4de034d | 188 | nInt2 ^= idx; |
msamadani | 1:a514e4de034d | 189 | useRadix2 = ((nInt2 & idx) == 0); |
msamadani | 1:a514e4de034d | 190 | } |
msamadani | 1:a514e4de034d | 191 | |
msamadani | 1:a514e4de034d | 192 | idx = nInt2; |
msamadani | 1:a514e4de034d | 193 | rt++; |
msamadani | 1:a514e4de034d | 194 | } |
msamadani | 1:a514e4de034d | 195 | |
msamadani | 1:a514e4de034d | 196 | y->data[idx].re = x->data[rt]; |
msamadani | 1:a514e4de034d | 197 | y->data[idx].im = 0.0F; |
msamadani | 1:a514e4de034d | 198 | if (x->size[0] > 1) { |
msamadani | 1:a514e4de034d | 199 | for (N2blue = 0; N2blue <= n1 - 2; N2blue += 2) { |
msamadani | 1:a514e4de034d | 200 | temp_re = y->data[N2blue + 1].re; |
msamadani | 1:a514e4de034d | 201 | temp_im = y->data[N2blue + 1].im; |
msamadani | 1:a514e4de034d | 202 | y->data[N2blue + 1].re = y->data[N2blue].re - y->data[N2blue + 1].re; |
msamadani | 1:a514e4de034d | 203 | y->data[N2blue + 1].im = y->data[N2blue].im - y->data[N2blue + 1].im; |
msamadani | 1:a514e4de034d | 204 | y->data[N2blue].re += temp_re; |
msamadani | 1:a514e4de034d | 205 | y->data[N2blue].im += temp_im; |
msamadani | 1:a514e4de034d | 206 | } |
msamadani | 1:a514e4de034d | 207 | } |
msamadani | 1:a514e4de034d | 208 | |
msamadani | 1:a514e4de034d | 209 | idx = 2; |
msamadani | 1:a514e4de034d | 210 | rt = 4; |
msamadani | 1:a514e4de034d | 211 | nInt2 = 1 + ((nRowsD4 - 1) << 2); |
msamadani | 1:a514e4de034d | 212 | while (nRowsD4 > 0) { |
msamadani | 1:a514e4de034d | 213 | for (N2blue = 0; N2blue < nInt2; N2blue += rt) { |
msamadani | 1:a514e4de034d | 214 | temp_re = y->data[N2blue + idx].re; |
msamadani | 1:a514e4de034d | 215 | temp_im = y->data[N2blue + idx].im; |
msamadani | 1:a514e4de034d | 216 | y->data[N2blue + idx].re = y->data[N2blue].re - temp_re; |
msamadani | 1:a514e4de034d | 217 | y->data[N2blue + idx].im = y->data[N2blue].im - temp_im; |
msamadani | 1:a514e4de034d | 218 | y->data[N2blue].re += temp_re; |
msamadani | 1:a514e4de034d | 219 | y->data[N2blue].im += temp_im; |
msamadani | 1:a514e4de034d | 220 | } |
msamadani | 1:a514e4de034d | 221 | |
msamadani | 1:a514e4de034d | 222 | istart = 1; |
msamadani | 1:a514e4de034d | 223 | for (nInt2m1 = nRowsD4; nInt2m1 < nRowsD2; nInt2m1 += nRowsD4) { |
msamadani | 1:a514e4de034d | 224 | nt_re = costab->data[nInt2m1]; |
msamadani | 1:a514e4de034d | 225 | nt_im = sintab->data[nInt2m1]; |
msamadani | 1:a514e4de034d | 226 | N2blue = istart; |
msamadani | 1:a514e4de034d | 227 | ihi = istart + nInt2; |
msamadani | 1:a514e4de034d | 228 | while (N2blue < ihi) { |
msamadani | 1:a514e4de034d | 229 | temp_re = nt_re * y->data[N2blue + idx].re - nt_im * y->data[N2blue |
msamadani | 1:a514e4de034d | 230 | + idx].im; |
msamadani | 1:a514e4de034d | 231 | temp_im = nt_re * y->data[N2blue + idx].im + nt_im * y->data[N2blue |
msamadani | 1:a514e4de034d | 232 | + idx].re; |
msamadani | 1:a514e4de034d | 233 | y->data[N2blue + idx].re = y->data[N2blue].re - temp_re; |
msamadani | 1:a514e4de034d | 234 | y->data[N2blue + idx].im = y->data[N2blue].im - temp_im; |
msamadani | 1:a514e4de034d | 235 | y->data[N2blue].re += temp_re; |
msamadani | 1:a514e4de034d | 236 | y->data[N2blue].im += temp_im; |
msamadani | 1:a514e4de034d | 237 | N2blue += rt; |
msamadani | 1:a514e4de034d | 238 | } |
msamadani | 1:a514e4de034d | 239 | |
msamadani | 1:a514e4de034d | 240 | istart++; |
msamadani | 1:a514e4de034d | 241 | } |
msamadani | 1:a514e4de034d | 242 | |
msamadani | 1:a514e4de034d | 243 | nRowsD4 /= 2; |
msamadani | 1:a514e4de034d | 244 | idx = rt; |
msamadani | 1:a514e4de034d | 245 | rt += rt; |
msamadani | 1:a514e4de034d | 246 | nInt2 -= idx; |
msamadani | 1:a514e4de034d | 247 | } |
msamadani | 1:a514e4de034d | 248 | } else { |
msamadani | 1:a514e4de034d | 249 | emxInit_creal32_T(&wwc, 1); |
msamadani | 1:a514e4de034d | 250 | nInt2m1 = (x->size[0] + x->size[0]) - 1; |
msamadani | 1:a514e4de034d | 251 | nInt2 = wwc->size[0]; |
msamadani | 1:a514e4de034d | 252 | wwc->size[0] = nInt2m1; |
msamadani | 1:a514e4de034d | 253 | emxEnsureCapacity((emxArray__common *)wwc, nInt2, sizeof(creal32_T)); |
msamadani | 1:a514e4de034d | 254 | idx = x->size[0]; |
msamadani | 1:a514e4de034d | 255 | rt = 0; |
msamadani | 1:a514e4de034d | 256 | wwc->data[x->size[0] - 1].re = 1.0F; |
msamadani | 1:a514e4de034d | 257 | wwc->data[x->size[0] - 1].im = 0.0F; |
msamadani | 1:a514e4de034d | 258 | nInt2 = x->size[0] << 1; |
msamadani | 1:a514e4de034d | 259 | for (ihi = 1; ihi < n1; ihi++) { |
msamadani | 1:a514e4de034d | 260 | istart = (ihi << 1) - 1; |
msamadani | 1:a514e4de034d | 261 | if (nInt2 - rt <= istart) { |
msamadani | 1:a514e4de034d | 262 | rt += istart - nInt2; |
msamadani | 1:a514e4de034d | 263 | } else { |
msamadani | 1:a514e4de034d | 264 | rt += istart; |
msamadani | 1:a514e4de034d | 265 | } |
msamadani | 1:a514e4de034d | 266 | |
msamadani | 1:a514e4de034d | 267 | nt_im = -3.14159274F * (float)rt / (float)x->size[0]; |
msamadani | 1:a514e4de034d | 268 | if (nt_im == 0.0F) { |
msamadani | 1:a514e4de034d | 269 | nt_re = 1.0F; |
msamadani | 1:a514e4de034d | 270 | nt_im = 0.0F; |
msamadani | 1:a514e4de034d | 271 | } else { |
msamadani | 1:a514e4de034d | 272 | nt_re = std::cos(nt_im); |
msamadani | 1:a514e4de034d | 273 | nt_im = std::sin(nt_im); |
msamadani | 1:a514e4de034d | 274 | } |
msamadani | 1:a514e4de034d | 275 | |
msamadani | 1:a514e4de034d | 276 | wwc->data[idx - 2].re = nt_re; |
msamadani | 1:a514e4de034d | 277 | wwc->data[idx - 2].im = -nt_im; |
msamadani | 1:a514e4de034d | 278 | idx--; |
msamadani | 1:a514e4de034d | 279 | } |
msamadani | 1:a514e4de034d | 280 | |
msamadani | 1:a514e4de034d | 281 | idx = 0; |
msamadani | 1:a514e4de034d | 282 | for (ihi = nInt2m1 - 1; ihi >= n1; ihi--) { |
msamadani | 1:a514e4de034d | 283 | wwc->data[ihi] = wwc->data[idx]; |
msamadani | 1:a514e4de034d | 284 | idx++; |
msamadani | 1:a514e4de034d | 285 | } |
msamadani | 1:a514e4de034d | 286 | |
msamadani | 1:a514e4de034d | 287 | rt = x->size[0]; |
msamadani | 1:a514e4de034d | 288 | idx = x->size[0]; |
msamadani | 1:a514e4de034d | 289 | nInt2 = y->size[0]; |
msamadani | 1:a514e4de034d | 290 | y->size[0] = idx; |
msamadani | 1:a514e4de034d | 291 | emxEnsureCapacity((emxArray__common *)y, nInt2, sizeof(creal32_T)); |
msamadani | 1:a514e4de034d | 292 | idx = 0; |
msamadani | 1:a514e4de034d | 293 | for (ihi = 0; ihi + 1 <= rt; ihi++) { |
msamadani | 1:a514e4de034d | 294 | nt_re = wwc->data[(n1 + ihi) - 1].re; |
msamadani | 1:a514e4de034d | 295 | nt_im = wwc->data[(n1 + ihi) - 1].im; |
msamadani | 1:a514e4de034d | 296 | y->data[ihi].re = nt_re * x->data[idx]; |
msamadani | 1:a514e4de034d | 297 | y->data[ihi].im = nt_im * -x->data[idx]; |
msamadani | 1:a514e4de034d | 298 | idx++; |
msamadani | 1:a514e4de034d | 299 | } |
msamadani | 1:a514e4de034d | 300 | |
msamadani | 1:a514e4de034d | 301 | while (rt + 1 <= n1) { |
msamadani | 1:a514e4de034d | 302 | y->data[rt].re = 0.0F; |
msamadani | 1:a514e4de034d | 303 | y->data[rt].im = 0.0F; |
msamadani | 1:a514e4de034d | 304 | rt++; |
msamadani | 1:a514e4de034d | 305 | } |
msamadani | 1:a514e4de034d | 306 | |
msamadani | 1:a514e4de034d | 307 | emxInit_creal32_T(&fy, 1); |
msamadani | 1:a514e4de034d | 308 | emxInit_creal32_T(&fv, 1); |
msamadani | 1:a514e4de034d | 309 | r2br_r2dit_trig_impl(y, 0, N2blue, costab, sintab, fy); |
msamadani | 1:a514e4de034d | 310 | r2br_r2dit_trig(wwc, N2blue, costab, sintab, fv); |
msamadani | 1:a514e4de034d | 311 | nInt2 = fy->size[0]; |
msamadani | 1:a514e4de034d | 312 | emxEnsureCapacity((emxArray__common *)fy, nInt2, sizeof(creal32_T)); |
msamadani | 1:a514e4de034d | 313 | idx = fy->size[0]; |
msamadani | 1:a514e4de034d | 314 | for (nInt2 = 0; nInt2 < idx; nInt2++) { |
msamadani | 1:a514e4de034d | 315 | nt_re = fy->data[nInt2].re; |
msamadani | 1:a514e4de034d | 316 | nt_im = fy->data[nInt2].im; |
msamadani | 1:a514e4de034d | 317 | fv_re = fv->data[nInt2].re; |
msamadani | 1:a514e4de034d | 318 | fv_im = fv->data[nInt2].im; |
msamadani | 1:a514e4de034d | 319 | fy->data[nInt2].re = nt_re * fv_re - nt_im * fv_im; |
msamadani | 1:a514e4de034d | 320 | fy->data[nInt2].im = nt_re * fv_im + nt_im * fv_re; |
msamadani | 1:a514e4de034d | 321 | } |
msamadani | 1:a514e4de034d | 322 | |
msamadani | 1:a514e4de034d | 323 | b_r2br_r2dit_trig(fy, N2blue, costab, sintabinv, fv); |
msamadani | 1:a514e4de034d | 324 | idx = 0; |
msamadani | 1:a514e4de034d | 325 | ihi = (int)(float)x->size[0] - 1; |
msamadani | 1:a514e4de034d | 326 | emxFree_creal32_T(&fy); |
msamadani | 1:a514e4de034d | 327 | while (ihi + 1 <= wwc->size[0]) { |
msamadani | 1:a514e4de034d | 328 | nt_re = wwc->data[ihi].re; |
msamadani | 1:a514e4de034d | 329 | fv_re = fv->data[ihi].re; |
msamadani | 1:a514e4de034d | 330 | nt_im = wwc->data[ihi].im; |
msamadani | 1:a514e4de034d | 331 | fv_im = fv->data[ihi].im; |
msamadani | 1:a514e4de034d | 332 | temp_re = wwc->data[ihi].re; |
msamadani | 1:a514e4de034d | 333 | temp_im = fv->data[ihi].im; |
msamadani | 1:a514e4de034d | 334 | wwc_im = wwc->data[ihi].im; |
msamadani | 1:a514e4de034d | 335 | b_fv_re = fv->data[ihi].re; |
msamadani | 1:a514e4de034d | 336 | y->data[idx].re = nt_re * fv_re + nt_im * fv_im; |
msamadani | 1:a514e4de034d | 337 | y->data[idx].im = temp_re * temp_im - wwc_im * b_fv_re; |
msamadani | 1:a514e4de034d | 338 | idx++; |
msamadani | 1:a514e4de034d | 339 | ihi++; |
msamadani | 1:a514e4de034d | 340 | } |
msamadani | 1:a514e4de034d | 341 | |
msamadani | 1:a514e4de034d | 342 | emxFree_creal32_T(&fv); |
msamadani | 1:a514e4de034d | 343 | emxFree_creal32_T(&wwc); |
msamadani | 1:a514e4de034d | 344 | } |
msamadani | 1:a514e4de034d | 345 | |
msamadani | 1:a514e4de034d | 346 | emxFree_real32_T(&sintabinv); |
msamadani | 1:a514e4de034d | 347 | emxFree_real32_T(&sintab); |
msamadani | 1:a514e4de034d | 348 | emxFree_real32_T(&costab); |
msamadani | 1:a514e4de034d | 349 | } |
msamadani | 1:a514e4de034d | 350 | } |
msamadani | 1:a514e4de034d | 351 | |
msamadani | 1:a514e4de034d | 352 | // |
msamadani | 1:a514e4de034d | 353 | // File trailer for fft.cpp |
msamadani | 1:a514e4de034d | 354 | // |
msamadani | 1:a514e4de034d | 355 | // [EOF] |
msamadani | 1:a514e4de034d | 356 | // |
msamadani | 1:a514e4de034d | 357 |