// // 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: RadarSignalGenerator401.cpp // // MATLAB Coder version : 5.3 // C/C++ source code generated on : 27-Apr-2023 00:06:45 // // Include Files #include "RadarSignalGenerator401.h" #include "FMCWWaveform401.h" #include "../rt_nonfinite.h" #include "../coder_array.h" #include // Function Declarations static void times(coder::array &xt, const coder::array &r); // Function Definitions // // Arguments : coder::array &xt // const coder::array &r // Return Type : void // static void times(coder::array &xt, const coder::array &r) { coder::array b_xt; int i; int loop_ub; int stride_0_0; int stride_1_0; if (r.size(0) == 1) { i = xt.size(0); } else { i = r.size(0); } b_xt.set_size(i); stride_0_0 = (xt.size(0) != 1); stride_1_0 = (r.size(0) != 1); if (r.size(0) == 1) { loop_ub = xt.size(0); } else { loop_ub = r.size(0); } for (i = 0; i < loop_ub; i++) { double d; double d1; int i1; i1 = i * stride_1_0; d = r[i1].im; d1 = r[i1].re; b_xt[i].re = xt[i * stride_0_0].re * d1 - xt[i * stride_0_0].im * d; b_xt[i].im = xt[i * stride_0_0].re * d + xt[i * stride_0_0].im * d1; } xt.set_size(b_xt.size(0)); loop_ub = b_xt.size(0); for (i = 0; i < loop_ub; i++) { xt[i] = b_xt[i]; } } // // RADARSIGNALGENERATOR1 此处显示有关此函数的摘要 // 此处显示详细说明 // // Arguments : coder::array &sig // double *fs // double PRF[3] // double *len // Return Type : void // void RadarSignalGenerator401(coder::array &sig, double *fs, double PRF[3], double *len) { static coder::phased::FMCWWaveform401 wavGen; static const int iv[3]{1, 40001, 100001}; static const int iv1[3]{40000, 100000, 180000}; coder::array r1; coder::array xt; coder::array r; coder::array b_xt; double idx; int i; int ii; int mode; int ndbl; PRF[0] = 500000.0; PRF[1] = 333333.33333333331; PRF[2] = 250000.0; // simTime = 2e-5; wavGen.isInitialized = 0; // 产生5个脉冲 // numPulses = fix(simTime*PRF); *len = 0.0; for (ii = 0; ii < 5; ii++) { mode = static_cast(std::fmod(static_cast(ii) + 1.0, 3.0)); if (mode == 0) { mode = 3; } *len += 2.0E+10 / PRF[mode - 1]; } ndbl = static_cast(*len); sig.set_size(ndbl); for (i = 0; i < ndbl; i++) { sig[i] = 0.0; } idx = 1.0; for (ii = 0; ii < 5; ii++) { double InitOutputSweepIndex_idx_0; double cdiff; double kd; int k; int nm1d2; mode = static_cast(std::fmod(static_cast(ii) + 1.0, 3.0)); if (mode == 0) { mode = 3; } // 迭代波形 if (wavGen.isInitialized != 1) { wavGen.isInitialized = 1; wavGen.setupImpl(); wavGen.pOutputStartSweepIndex = 1.0; wavGen.pOutputSweepInterval[0] = 0.0; wavGen.pOutputSweepInterval[1] = 1.0; } kd = (wavGen.pOutputStartSweepIndex + wavGen.pOutputSweepInterval[0]) - 1.0; if (std::isnan(kd) || std::isinf(kd)) { cdiff = rtNaN; } else if (kd == 0.0) { cdiff = 0.0; } else { cdiff = std::fmod(kd, 3.0); if (cdiff == 0.0) { cdiff = 0.0; } else if (kd < 0.0) { cdiff += 3.0; } } InitOutputSweepIndex_idx_0 = cdiff + 1.0; kd = (wavGen.pOutputStartSweepIndex + wavGen.pOutputSweepInterval[1]) - 1.0; if (std::isnan(kd) || std::isinf(kd)) { cdiff = rtNaN; } else if (kd == 0.0) { cdiff = 0.0; } else { cdiff = std::fmod(kd, 3.0); if (cdiff == 0.0) { cdiff = 0.0; } else if (kd < 0.0) { cdiff += 3.0; } } wavGen.pOutputStartSweepIndex = cdiff + 1.0; ndbl = 20000 * (static_cast(InitOutputSweepIndex_idx_0) - 1); xt.set_size(ndbl + 40000); for (i = 0; i <= ndbl + 39999; i++) { xt[i].re = 0.0; xt[i].im = 0.0; } i = iv[static_cast(InitOutputSweepIndex_idx_0) - 1]; k = iv1[static_cast(InitOutputSweepIndex_idx_0) - 1]; if (i > k) { i = 0; k = 0; } else { i--; } ndbl = k - i; for (k = 0; k < ndbl; k++) { xt[k] = wavGen.pSamples[i + k]; } // 载波调制 kd = (static_cast(xt.size(0)) - 1.0) / 2.0E+10; ndbl = static_cast(std::floor(kd / 5.0E-11 + 0.5)); InitOutputSweepIndex_idx_0 = static_cast(ndbl) * 5.0E-11; cdiff = InitOutputSweepIndex_idx_0 - kd; if (std::abs(cdiff) < 4.4408920985006262E-16 * std::abs(kd)) { ndbl++; InitOutputSweepIndex_idx_0 = kd; } else if (cdiff > 0.0) { InitOutputSweepIndex_idx_0 = (static_cast(ndbl) - 1.0) * 5.0E-11; } else { ndbl++; } r.set_size(1, ndbl); r[0] = 0.0; r[ndbl - 1] = InitOutputSweepIndex_idx_0; nm1d2 = (ndbl - 1) / 2; for (k = 0; k <= nm1d2 - 2; k++) { kd = (static_cast(k) + 1.0) * 5.0E-11; r[k + 1] = kd; r[(ndbl - k) - 2] = InitOutputSweepIndex_idx_0 - kd; } if (nm1d2 << 1 == ndbl - 1) { r[nm1d2] = InitOutputSweepIndex_idx_0 / 2.0; } else { kd = static_cast(nm1d2) * 5.0E-11; r[nm1d2] = kd; r[nm1d2 + 1] = InitOutputSweepIndex_idx_0 - kd; } r1.set_size(r.size(1)); ndbl = r.size(1); for (i = 0; i < ndbl; i++) { r1[i].re = r[i] * 0.0; r1[i].im = r[i] * 5.969026041820607E+10; } ndbl = r1.size(0); for (k = 0; k < ndbl; k++) { if (r1[k].im == 0.0) { r1[k].re = std::exp(r1[k].re); r1[k].im = 0.0; } else if (std::isinf(r1[k].im) && std::isinf(r1[k].re) && (r1[k].re < 0.0)) { r1[k].re = 0.0; r1[k].im = 0.0; } else { cdiff = std::exp(r1[k].re / 2.0); r1[k].re = cdiff * (cdiff * std::cos(r1[k].im)); r1[k].im = cdiff * (cdiff * std::sin(r1[k].im)); } } if (xt.size(0) == r1.size(0)) { ndbl = xt.size(0); for (i = 0; i < ndbl; i++) { double re_tmp; kd = xt[i].re; InitOutputSweepIndex_idx_0 = r1[i].im; cdiff = xt[i].im; re_tmp = r1[i].re; xt[i].re = kd * re_tmp - cdiff * InitOutputSweepIndex_idx_0; xt[i].im = kd * InitOutputSweepIndex_idx_0 + cdiff * re_tmp; } } else { times(xt, r1); } kd = idx + 2.0E+10 / PRF[mode - 1]; if (idx > kd - 1.0) { i = -1; k = 0; } else { i = static_cast(idx) - 2; k = static_cast(kd - 1.0); } b_xt.set_size(xt.size(0)); ndbl = xt.size(0); for (nm1d2 = 0; nm1d2 < ndbl; nm1d2++) { b_xt[nm1d2] = xt[nm1d2].re; } ndbl = (k - i) - 1; for (k = 0; k < ndbl; k++) { sig[(i + k) + 1] = b_xt[k]; } idx = kd; } *fs = 2.0E+10; } // // File trailer for RadarSignalGenerator401.cpp // // [EOF] //