272 std::vector<float> kWfmSignal;
276 int n = kWfmSignal.size();
279 printf(
"ERROR: Order too high; will make solution singular\n");
284 for (
int k = 1; k <= n - 2; k++)
285 r1 += std::pow(kWfmSignal.at(k), 2);
287 float r2 = std::pow(kWfmSignal.front(), 2);
288 float r3 = std::pow(kWfmSignal.back(), 2);
292 r1 = 1. / (rho_b + r3);
294 std::vector<float> c, d;
295 c.push_back(kWfmSignal.back() * r1);
296 d.push_back(kWfmSignal.front() * r1);
300 std::vector<float> ef, eb, ec, ed;
301 std::vector<float> coeffs;
304 for (
int v_iter = 0; v_iter < n; v_iter++) {
305 ef.push_back(kWfmSignal.at(v_iter));
306 eb.push_back(kWfmSignal.at(v_iter));
307 ec.push_back(c.at(0) * kWfmSignal.at(v_iter));
308 ed.push_back(d.at(0) * kWfmSignal.at(v_iter));
314 if (rho_f <= 0 || rho_b <= 0) {
316 printf(
"PsdPronyFitter::ERROR: prediction squared error was less "
317 "than or equal to zero\n");
321 gam = 1. - ec.at(n - k);
322 del = 1. - ed.front();
323 if (gam <= 0 || gam > 1 || del <= 0 || del > 1) {
325 printf(
"PsdPronyFitter::ERROR: GAM or DEL gain factor not in "
326 "expected range 0 to 1\n");
331 std::vector<float> eff, ebb;
335 for (
int v_iter = 0; v_iter < n - 1; v_iter++) {
336 eff.at(v_iter) = ef.at(v_iter + 1);
337 ebb.at(v_iter) = eb.at(v_iter);
338 delta += eff.at(v_iter) * ebb.at(v_iter);
341 float k_f = -delta / rho_b;
342 float k_b = -delta / rho_f;
345 rho_f = rho_f * (1 - k_f * k_b);
346 rho_b = rho_b * (1 - k_f * k_b);
349 std::vector<float> temp_af = a_f;
350 std::reverse(std::begin(a_b), std::end(a_b));
351 for (uint16_t
i = 0;
i < a_f.size();
i++)
352 a_f.at(
i) += k_f * a_b.at(
i);
355 std::reverse(std::begin(a_b), std::end(a_b));
356 std::reverse(std::begin(temp_af), std::end(temp_af));
357 for (uint16_t
i = 0;
i < a_b.size();
i++)
358 a_b.at(
i) += k_b * temp_af.at(
i);
369 for (
int v_iter = 0; v_iter < n; v_iter++) {
370 eb.at(v_iter) = ebb.at(v_iter) + k_b * eff.at(v_iter);
371 ef.at(v_iter) = eff.at(v_iter) + k_f * ebb.at(v_iter);
375 coeffs.at(0) = ec.front();
376 coeffs.at(1) = coeffs.at(0) / del;
377 coeffs.at(2) = coeffs.at(0) / gam;
380 std::vector<float> temp_c = c;
381 for (uint16_t v_iter = 0; v_iter < c.size(); v_iter++) {
382 c.at(v_iter) += coeffs.at(1) * d.at(v_iter);
383 d.at(v_iter) += coeffs.at(2) * temp_c.at(v_iter);
387 std::vector<float> temp_ec = ec;
388 for (
int v_iter = 0; v_iter < n; v_iter++) {
389 ec.at(v_iter) += coeffs.at(1) * ed.at(v_iter);
390 ed.at(v_iter) += coeffs.at(2) * temp_ec.at(v_iter);
393 std::vector<float> ecc, edd;
396 for (
int v_iter = 0; v_iter < n - 1; v_iter++) {
397 ecc.at(v_iter) = ec.at(v_iter + 1);
398 edd.at(v_iter) = ed.at(v_iter);
401 if (rho_f <= 0 || rho_b <= 0) {
403 printf(
"PsdPronyFitter::ERROR2: prediction squared error was less "
404 "than or equal to zero\n");
407 gam = 1 - ecc.at(n - k - 1);
408 del = 1 - edd.front();
409 if (gam <= 0 || gam > 1 || del <= 0 || del > 1) {
411 printf(
"PsdPronyFitter::ERROR2: GAM or DEL gain factor not in "
412 "expected range 0 to 1\n");
417 coeffs.at(0) = ef.front();
418 coeffs.at(1) = eb.at(n - k - 1);
419 coeffs.at(2) = coeffs.at(1) / rho_b;
420 coeffs.at(3) = coeffs.at(0) / rho_f;
421 coeffs.at(4) = coeffs.at(0) / del;
422 coeffs.at(5) = coeffs.at(1) / gam;
425 std::vector<float> temp_ab = a_b;
426 std::reverse(std::begin(temp_ab), std::end(temp_ab));
427 std::reverse(std::begin(c), std::end(c));
429 for (uint16_t
i = 0;
i < a_b.size();
i++)
430 a_b.at(
i) += coeffs.at(5) * c.at(
i);
431 std::reverse(std::begin(c), std::end(c));
433 for (uint16_t
i = 0;
i < c.size();
i++)
434 c.at(
i) += coeffs.at(2) * temp_ab.at(
i);
435 c.push_back(coeffs.at(2));
437 std::vector<float> temp_af2 = a_f;
438 for (uint16_t
i = 0;
i < a_f.size();
i++)
439 a_f.at(
i) += coeffs.at(4) * d.at(
i);
441 for (uint16_t
i = 0;
i < d.size();
i++)
442 d.at(
i) += coeffs.at(3) * temp_af2.at(
i);
443 d.insert(d.begin(), coeffs.at(3));
446 rho_f = rho_f - coeffs.at(4) * coeffs.at(0);
447 rho_b = rho_b - coeffs.at(5) * coeffs.at(1);
449 if (rho_f <= 0 || rho_b <= 0) {
451 printf(
"PsdPronyFitter::ERROR3: prediction squared error was less "
452 "than or equal to zero\n");
457 for (
int v_iter = 0; v_iter < n; v_iter++) {
458 ec.at(v_iter) = ecc.at(v_iter) + coeffs.at(2) * eb.at(v_iter);
459 eb.at(v_iter) = eb.at(v_iter) + coeffs.at(5) * ecc.at(v_iter);
460 ed.at(v_iter) = edd.at(v_iter) + coeffs.at(3) * ef.at(v_iter);
461 ef.at(v_iter) = ef.at(v_iter) + coeffs.at(4) * edd.at(v_iter);
1029 std::complex<float>** Zpower)
1032 std::complex<double>* Zyk_arr =
new std::complex<double>[
fExpNumber + 1];
1034 int mode = (std::abs(std::imag(
fz[1])) > 0.01) ? 1 : 0;
1036 printf(
"search begin in complex (1) or real (0) mode: %i\n", mode);
1039 Zyk_arr[
i] = {0., 0.};
1043 for (
int sample_curr = first_sample; sample_curr < first_sample + signal_length; sample_curr++)
1045 (std::complex<double>)(std::conj(Zpower[
i][sample_curr - first_sample]) * (float)
fWfm.at(sample_curr));
1047 printf(
"Zyk[%i] at signal begin %i : %e%+ei ",
i, first_sample, std::real(Zyk_arr[
i]),
1048 std::imag(Zyk_arr[
i]));
1054 std::pair<double, double> prev_pair;
1055 std::pair<double, double> new_pair;
1057 prev_pair = std::make_pair(std::abs(std::real(Zyk_arr[1])), std::abs(std::imag(Zyk_arr[1])));
1059 prev_pair = std::make_pair(std::abs(std::real(Zyk_arr[1])), std::abs(std::real(Zyk_arr[2])));
1061 for (
int signal_begin = first_sample + 1; signal_begin <= last_sample - signal_length; signal_begin++) {
1064 Zyk_arr[
i] -= (std::complex<double>)
fWfm.at(signal_begin - 1);
1066 Zyk_arr[
i] /= (std::complex<double>)std::conj(
fz[
i]);
1068 Zyk_arr[
i] += (std::complex<double>)(std::conj(Zpower[
i][signal_length - 1])
1069 * (
float)
fWfm.at(signal_begin + signal_length - 1));
1072 printf(
"Zyk[%i] at signal begin %i : %e%+ei ",
i, signal_begin, std::real(Zyk_arr[
i]),
1073 std::imag(Zyk_arr[
i]));
1080 new_pair = std::make_pair(std::abs(std::real(Zyk_arr[1])), std::abs(std::imag(Zyk_arr[1])));
1082 new_pair = std::make_pair(std::abs(std::real(Zyk_arr[1])), std::abs(std::real(Zyk_arr[2])));
1083 if ((new_pair.first - prev_pair.first) * (new_pair.second - prev_pair.second) < 0) {
1085 printf(
"begin candidate at %i \n", signal_begin);
1089 prev_pair = new_pair;
1093 return first_sample;