// // File: ifft_7.cpp // // MATLAB Coder version : 5.2 // C/C++ source code generated on : 04-Mar-2023 17:44:30 // // Include Files #include "fun7_ifft.h" #include "fun7_DRFMRF_data.h" #include "fun7_FFTImplementationCallback.h" #include "coder_array.h" #include // Function Definitions // // Arguments : const ::coder::array &x // ::coder::array &y // Return Type : void // namespace coder { void ifft_7(const ::coder::array &x, ::coder::array &y) { array fv; array fy; array wwc; array yCol; array costab; array costab1q; array sintab; array sintabinv; double twid_re; int N2blue; int ihi; int j; int k; int len; int pmax; int pmin; int pow2p; boolean_T useRadix2; len = x.size(1); useRadix2 = ((x.size(1) & (x.size(1) - 1)) == 0); N2blue = 1; if (useRadix2) { pmax = x.size(1); } else { boolean_T exitg1; ihi = (x.size(1) + x.size(1)) - 1; pmax = 31; pmin = 0; exitg1 = false; while ((!exitg1) && (pmax - pmin > 1)) { k = (pmin + pmax) >> 1; pow2p = 1 << k; if (pow2p == ihi) { pmax = k; exitg1 = true; } else if (pow2p > ihi) { pmax = k; } else { pmin = k; } } N2blue = 1 << pmax; pmax = N2blue; } twid_re = 6.2831853071795862 / static_cast(pmax); ihi = pmax / 2 / 2; costab1q.set_size(1, ihi + 1); costab1q[0] = 1.0; pmax = ihi / 2 - 1; for (k = 0; k <= pmax; k++) { costab1q[k + 1] = std::cos(twid_re * (static_cast(k) + 1.0)); } j = pmax + 2; pmin = ihi - 1; for (k = j; k <= pmin; k++) { costab1q[k] = std::sin(twid_re * static_cast(ihi - k)); } costab1q[ihi] = 0.0; if (!useRadix2) { ihi = costab1q.size(1) - 1; pmax = (costab1q.size(1) - 1) << 1; costab.set_size(1, pmax + 1); sintab.set_size(1, pmax + 1); costab[0] = 1.0; sintab[0] = 0.0; sintabinv.set_size(1, pmax + 1); for (k = 0; k < ihi; k++) { sintabinv[k + 1] = costab1q[(ihi - k) - 1]; } j = costab1q.size(1); for (k = j; k <= pmax; k++) { sintabinv[k] = costab1q[k - ihi]; } for (k = 0; k < ihi; k++) { costab[k + 1] = costab1q[k + 1]; sintab[k + 1] = -costab1q[(ihi - k) - 1]; } j = costab1q.size(1); for (k = j; k <= pmax; k++) { costab[k] = -costab1q[pmax - k]; sintab[k] = -costab1q[k - ihi]; } } else { ihi = costab1q.size(1) - 1; pmax = (costab1q.size(1) - 1) << 1; costab.set_size(1, pmax + 1); sintab.set_size(1, pmax + 1); costab[0] = 1.0; sintab[0] = 0.0; for (k = 0; k < ihi; k++) { costab[k + 1] = costab1q[k + 1]; sintab[k + 1] = costab1q[(ihi - k) - 1]; } j = costab1q.size(1); for (k = j; k <= pmax; k++) { costab[k] = -costab1q[pmax - k]; sintab[k] = costab1q[k - ihi]; } sintabinv.set_size(1, 0); } if (useRadix2) { pmax = x.size(1); wwc = x.reshape(pmax); internal::fft::fun7_FFTImplementationCallback::r2br_r2dit_trig_impl( wwc, x.size(1), costab, sintab, yCol); if (yCol.size(0) > 1) { twid_re = 1.0 / static_cast(yCol.size(0)); pmax = yCol.size(0); for (j = 0; j < pmax; j++) { yCol[j].re = twid_re * yCol[j].re; yCol[j].im = twid_re * yCol[j].im; } } } else { double nt_im; double nt_re; double twid_im; int i; int ju; int nRowsD2; pmax = (x.size(1) + x.size(1)) - 1; wwc.set_size(pmax); pmin = 0; wwc[x.size(1) - 1].re = 1.0; wwc[x.size(1) - 1].im = 0.0; pow2p = x.size(1) << 1; j = x.size(1); for (k = 0; k <= j - 2; k++) { ju = ((k + 1) << 1) - 1; if (pow2p - pmin <= ju) { pmin += ju - pow2p; } else { pmin += ju; } nt_im = 3.1415926535897931 * static_cast(pmin) / static_cast(len); if (nt_im == 0.0) { nt_re = 1.0; nt_im = 0.0; } else { nt_re = std::cos(nt_im); nt_im = std::sin(nt_im); } wwc[(x.size(1) - k) - 2].re = nt_re; wwc[(x.size(1) - k) - 2].im = -nt_im; } j = pmax - 1; for (k = j; k >= len; k--) { wwc[k] = wwc[(pmax - k) - 1]; } yCol.set_size(x.size(1)); pmax = x.size(1); for (k = 0; k < pmax; k++) { nt_re = wwc[(len + k) - 1].re; nt_im = wwc[(len + k) - 1].im; yCol[k].re = nt_re * x[k].re + nt_im * x[k].im; yCol[k].im = nt_re * x[k].im - nt_im * x[k].re; } j = x.size(1) + 1; for (k = j; k <= len; k++) { yCol[k - 1].re = 0.0; yCol[k - 1].im = 0.0; } fy.set_size(N2blue); if (N2blue > yCol.size(0)) { fy.set_size(N2blue); for (j = 0; j < N2blue; j++) { fy[j].re = 0.0; fy[j].im = 0.0; } } pmin = yCol.size(0); if (pmin >= N2blue) { pmin = N2blue; } pow2p = N2blue - 2; nRowsD2 = N2blue / 2; k = nRowsD2 / 2; pmax = 0; ju = 0; for (i = 0; i <= pmin - 2; i++) { fy[pmax] = yCol[i]; ihi = N2blue; useRadix2 = true; while (useRadix2) { ihi >>= 1; ju ^= ihi; useRadix2 = ((ju & ihi) == 0); } pmax = ju; } fy[pmax] = yCol[pmin - 1]; if (N2blue > 1) { for (i = 0; i <= pow2p; i += 2) { nt_re = fy[i + 1].re; nt_im = fy[i + 1].im; twid_re = fy[i].re; twid_im = fy[i].im; fy[i + 1].re = fy[i].re - fy[i + 1].re; fy[i + 1].im = fy[i].im - fy[i + 1].im; twid_re += nt_re; twid_im += nt_im; fy[i].re = twid_re; fy[i].im = twid_im; } } pmax = 2; pmin = 4; pow2p = ((k - 1) << 2) + 1; while (k > 0) { for (i = 0; i < pow2p; i += pmin) { len = i + pmax; nt_re = fy[len].re; nt_im = fy[len].im; fy[len].re = fy[i].re - nt_re; fy[len].im = fy[i].im - nt_im; fy[i].re = fy[i].re + nt_re; fy[i].im = fy[i].im + nt_im; } ju = 1; for (j = k; j < nRowsD2; j += k) { twid_re = costab[j]; twid_im = sintab[j]; i = ju; ihi = ju + pow2p; while (i < ihi) { len = i + pmax; nt_re = twid_re * fy[len].re - twid_im * fy[len].im; nt_im = twid_re * fy[len].im + twid_im * fy[len].re; fy[len].re = fy[i].re - nt_re; fy[len].im = fy[i].im - nt_im; fy[i].re = fy[i].re + nt_re; fy[i].im = fy[i].im + nt_im; i += pmin; } ju++; } k /= 2; pmax = pmin; pmin += pmin; pow2p -= pmax; } internal::fft::fun7_FFTImplementationCallback::r2br_r2dit_trig_impl( wwc, N2blue, costab, sintab, fv); pmax = fy.size(0); for (j = 0; j < pmax; j++) { twid_im = fy[j].re * fv[j].im + fy[j].im * fv[j].re; fy[j].re = fy[j].re * fv[j].re - fy[j].im * fv[j].im; fy[j].im = twid_im; } internal::fft::fun7_FFTImplementationCallback::r2br_r2dit_trig_impl( fy, N2blue, costab, sintabinv, fv); if (fv.size(0) > 1) { twid_re = 1.0 / static_cast(fv.size(0)); pmax = fv.size(0); for (j = 0; j < pmax; j++) { fv[j].re = twid_re * fv[j].re; fv[j].im = twid_re * fv[j].im; } } nt_re = x.size(1); j = x.size(1); pmin = wwc.size(0); for (k = j; k <= pmin; k++) { twid_re = wwc[k - 1].re * fv[k - 1].re + wwc[k - 1].im * fv[k - 1].im; twid_im = wwc[k - 1].re * fv[k - 1].im - wwc[k - 1].im * fv[k - 1].re; if (twid_im == 0.0) { pmax = k - j; yCol[pmax].re = twid_re / nt_re; yCol[pmax].im = 0.0; } else if (twid_re == 0.0) { pmax = k - j; yCol[pmax].re = 0.0; yCol[pmax].im = twid_im / nt_re; } else { pmax = k - j; yCol[pmax].re = twid_re / nt_re; yCol[pmax].im = twid_im / nt_re; } } } y.set_size(1, x.size(1)); pmax = x.size(1); for (j = 0; j < pmax; j++) { y[j] = yCol[j]; } } } // namespace coder // // File trailer for ifft_7.cpp // // [EOF] //