165 std::vector<float> & ) {
166 std::vector<float> kWfmSignal;
168 for (
int sample_curr = fSignalBegin; sample_curr <= fGateEnd; sample_curr++)
169 kWfmSignal.push_back(fWfm.at(sample_curr) - fZeroLevel);
170 int n = kWfmSignal.size();
172 float **Rkm_arr =
new float *[fModelOrder];
173 for (
int i = 0;
i < fModelOrder;
i++) {
174 Rkm_arr[
i] =
new float[fModelOrder];
175 for (
int j = 0; j < fModelOrder; j++)
179 float *R0k_arr =
new float[fModelOrder];
180 for (
int i = 0;
i < fModelOrder;
i++)
184 for (
int i = 1;
i <= fModelOrder;
i++)
185 for (
int j = 1; j <= fModelOrder; j++)
186 for (
int sample_curr = fModelOrder; sample_curr < n; sample_curr++)
187 Rkm_arr[
i - 1][j - 1] += (
float)(kWfmSignal.at(sample_curr -
i) *
188 kWfmSignal.at(sample_curr - j));
190 for (
int i = 1;
i <= fModelOrder;
i++)
191 for (
int sample_curr = fModelOrder; sample_curr < n; sample_curr++)
192 R0k_arr[
i - 1] -= (
float)(kWfmSignal.at(sample_curr) *
193 kWfmSignal.at(sample_curr -
i));
196 printf(
"system forward\n");
197 for (
int i = 0;
i < fModelOrder;
i++) {
198 for (
int j = 0; j < fModelOrder; j++)
199 printf(
"%e ", Rkm_arr[
i][j]);
200 printf(
"%e\n", R0k_arr[
i]);
204 float *a =
new float[fModelOrder];
205 for (
int i = 0;
i < fModelOrder;
i++)
211 printf(
"SLE roots ");
212 for (
int i = 0;
i < fModelOrder;
i++)
213 printf(
" %e ", a[
i]);
217 a_f.resize(fModelOrder);
218 for (
int i = 0;
i < fModelOrder;
i++)
221 for (
int i = 0;
i < fModelOrder;
i++)
229 float &rho_b, std::vector<float> &a_b) {
266 std::vector<float> kWfmSignal;
268 for (
int sample_curr = fSignalBegin; sample_curr <= fGateEnd; sample_curr++)
269 kWfmSignal.push_back(fWfm.at(sample_curr) - fZeroLevel);
270 int n = kWfmSignal.size();
271 if (2 * fModelOrder + 1 > n) {
273 printf(
"ERROR: Order too high; will make solution singular\n");
278 for (
int k = 1; k <= n - 2; k++)
279 r1 += std::pow(kWfmSignal.at(k), 2);
281 float r2 = std::pow(kWfmSignal.front(), 2);
282 float r3 = std::pow(kWfmSignal.back(), 2);
286 r1 = 1. / (rho_b + r3);
288 std::vector<float> c,
d;
289 c.push_back(kWfmSignal.back() * r1);
290 d.push_back(kWfmSignal.front() * r1);
294 std::vector<float> ef, eb, ec, ed;
295 std::vector<float> coeffs;
298 for (
int v_iter = 0; v_iter < n; v_iter++) {
299 ef.push_back(kWfmSignal.at(v_iter));
300 eb.push_back(kWfmSignal.at(v_iter));
301 ec.push_back(c.at(0) * kWfmSignal.at(v_iter));
302 ed.push_back(
d.at(0) * kWfmSignal.at(v_iter));
307 for (
int k = 1; k <= fModelOrder; k++) {
308 if (rho_f <= 0 || rho_b <= 0) {
310 printf(
"PsdPronyFitter::ERROR: prediction squared error was less "
311 "than or equal to zero\n");
315 gam = 1. - ec.at(n - k);
316 del = 1. - ed.front();
317 if (gam <= 0 || gam > 1 || del <= 0 || del > 1) {
319 printf(
"PsdPronyFitter::ERROR: GAM or DEL gain factor not in "
320 "expected range 0 to 1\n");
325 std::vector<float> eff, ebb;
329 for (
int v_iter = 0; v_iter < n - 1; v_iter++) {
330 eff.at(v_iter) = ef.at(v_iter + 1);
331 ebb.at(v_iter) = eb.at(v_iter);
332 delta += eff.at(v_iter) * ebb.at(v_iter);
335 float k_f = -
delta / rho_b;
336 float k_b = -
delta / rho_f;
339 rho_f = rho_f * (1 - k_f * k_b);
340 rho_b = rho_b * (1 - k_f * k_b);
343 std::vector<float> temp_af = a_f;
344 std::reverse(std::begin(a_b), std::end(a_b));
345 for (uint16_t
i = 0;
i < a_f.size();
i++)
346 a_f.at(
i) += k_f * a_b.at(
i);
349 std::reverse(std::begin(a_b), std::end(a_b));
350 std::reverse(std::begin(temp_af), std::end(temp_af));
351 for (uint16_t
i = 0;
i < a_b.size();
i++)
352 a_b.at(
i) += k_b * temp_af.at(
i);
356 if (k == fModelOrder) {
357 rho_f = rho_f / (n - fModelOrder);
358 rho_b = rho_b / (n - fModelOrder);
363 for (
int v_iter = 0; v_iter < n; v_iter++) {
364 eb.at(v_iter) = ebb.at(v_iter) + k_b * eff.at(v_iter);
365 ef.at(v_iter) = eff.at(v_iter) + k_f * ebb.at(v_iter);
369 coeffs.at(0) = ec.front();
370 coeffs.at(1) = coeffs.at(0) / del;
371 coeffs.at(2) = coeffs.at(0) / gam;
374 std::vector<float> temp_c = c;
375 for (uint16_t v_iter = 0; v_iter < c.size(); v_iter++) {
376 c.at(v_iter) += coeffs.at(1) *
d.at(v_iter);
377 d.at(v_iter) += coeffs.at(2) * temp_c.at(v_iter);
381 std::vector<float> temp_ec = ec;
382 for (
int v_iter = 0; v_iter < n; v_iter++) {
383 ec.at(v_iter) += coeffs.at(1) * ed.at(v_iter);
384 ed.at(v_iter) += coeffs.at(2) * temp_ec.at(v_iter);
387 std::vector<float> ecc, edd;
390 for (
int v_iter = 0; v_iter < n - 1; v_iter++) {
391 ecc.at(v_iter) = ec.at(v_iter + 1);
392 edd.at(v_iter) = ed.at(v_iter);
395 if (rho_f <= 0 || rho_b <= 0) {
397 printf(
"PsdPronyFitter::ERROR2: prediction squared error was less "
398 "than or equal to zero\n");
401 gam = 1 - ecc.at(n - k - 1);
402 del = 1 - edd.front();
403 if (gam <= 0 || gam > 1 || del <= 0 || del > 1) {
405 printf(
"PsdPronyFitter::ERROR2: GAM or DEL gain factor not in "
406 "expected range 0 to 1\n");
411 coeffs.at(0) = ef.front();
412 coeffs.at(1) = eb.at(n - k - 1);
413 coeffs.at(2) = coeffs.at(1) / rho_b;
414 coeffs.at(3) = coeffs.at(0) / rho_f;
415 coeffs.at(4) = coeffs.at(0) / del;
416 coeffs.at(5) = coeffs.at(1) / gam;
419 std::vector<float> temp_ab = a_b;
420 std::reverse(std::begin(temp_ab), std::end(temp_ab));
421 std::reverse(std::begin(c), std::end(c));
423 for (uint16_t
i = 0;
i < a_b.size();
i++)
424 a_b.at(
i) += coeffs.at(5) * c.at(
i);
425 std::reverse(std::begin(c), std::end(c));
427 for (uint16_t
i = 0;
i < c.size();
i++)
428 c.at(
i) += coeffs.at(2) * temp_ab.at(
i);
429 c.push_back(coeffs.at(2));
431 std::vector<float> temp_af2 = a_f;
432 for (uint16_t
i = 0;
i < a_f.size();
i++)
433 a_f.at(
i) += coeffs.at(4) *
d.at(
i);
435 for (uint16_t
i = 0;
i <
d.size();
i++)
436 d.at(
i) += coeffs.at(3) * temp_af2.at(
i);
437 d.insert(
d.begin(), coeffs.at(3));
440 rho_f = rho_f - coeffs.at(4) * coeffs.at(0);
441 rho_b = rho_b - coeffs.at(5) * coeffs.at(1);
443 if (rho_f <= 0 || rho_b <= 0) {
445 printf(
"PsdPronyFitter::ERROR3: prediction squared error was less "
446 "than or equal to zero\n");
451 for (
int v_iter = 0; v_iter < n; v_iter++) {
452 ec.at(v_iter) = ecc.at(v_iter) + coeffs.at(2) * eb.at(v_iter);
453 eb.at(v_iter) = eb.at(v_iter) + coeffs.at(5) * ecc.at(v_iter);
454 ed.at(v_iter) = edd.at(v_iter) + coeffs.at(3) * ef.at(v_iter);
455 ef.at(v_iter) = ef.at(v_iter) + coeffs.at(4) * edd.at(v_iter);
477 std::complex<float> **Zik_arr =
new std::complex<float> *[fExpNumber + 1];
478 for (
int i = 0;
i < fExpNumber + 1;
i++) {
479 Zik_arr[
i] =
new std::complex<float>[fExpNumber + 1];
480 for (
int j = 0; j < fExpNumber + 1; j++)
481 Zik_arr[
i][j] = {0., 0.};
484 const std::complex<float> unit = {1., 0.};
485 for (
int i = 0;
i <= fExpNumber;
i++) {
486 for (
int j = 0; j <= fExpNumber; j++) {
487 std::complex<float> temp = std::conj(fz[
i]) * fz[j];
488 if (std::abs(temp - unit) > 1e-3) {
489 Zik_arr[
i][j] =
static_cast<std::complex<float>
>(
490 (std::pow(temp,
static_cast<float>(signal_length)) - unit) /
493 Zik_arr[
i][j] =
static_cast<std::complex<float>
>(signal_length);
501 printf(
"\nInverse Z Matrix\n");
502 for (
int i = 0;
i <= fExpNumber;
i++) {
503 for (
int j = 0; j <= fExpNumber; j++) {
504 printf(
"%e%+ei ", std::real(Zik_arr[
i][j]), std::imag(Zik_arr[
i][j]));
507 for (
int j = 0; j <= fExpNumber; j++) {
508 printf(
"%e%+ei ", std::real(output[
i][j]), std::imag(output[
i][j]));
513 printf(
"\nMultiplying\n");
514 for (
int i = 0;
i <= fExpNumber;
i++) {
515 for (
int j = 0; j <= fExpNumber; j++) {
516 std::complex<float> temp = {0.0, 0.0};
517 for (
int k = 0; k <= fExpNumber; k++)
518 temp += Zik_arr[
i][k] * output[k][j];
519 printf(
"%e%+ei ", std::real(temp), std::imag(temp));
525 for (
int i = 0;
i < fExpNumber + 1;
i++)
551 std::complex<float> **Zik_arr =
new std::complex<float> *[fExpNumber + 1];
552 for (
int i = 0;
i < fExpNumber + 1;
i++) {
553 Zik_arr[
i] =
new std::complex<float>[fExpNumber + 1];
554 for (
int j = 0; j < fExpNumber + 1; j++)
555 Zik_arr[
i][j] = {0., 0.};
558 std::complex<float> *Zyk_arr =
new std::complex<float>[fExpNumber + 1];
559 for (
int i = 0;
i < fExpNumber + 1;
i++)
560 Zyk_arr[
i] = {0., 0.};
562 int samples_in_gate = fGateEnd - fSignalBegin + 1;
563 const std::complex<float> unit = {1., 0.};
565 for (
int i = 0;
i <= fExpNumber;
i++) {
566 for (
int j = 0; j <= fExpNumber; j++) {
567 std::complex<float> temp = std::conj(fz[
i]) * fz[j];
568 if (std::abs(temp - unit) > 1e-3) {
569 Zik_arr[
i][j] =
static_cast<std::complex<float>
>(
570 (std::pow(temp,
static_cast<float>(samples_in_gate)) - unit) /
573 Zik_arr[
i][j] =
static_cast<std::complex<float>
>(samples_in_gate);
578 std::complex<float> *z_power =
new std::complex<float>[fExpNumber + 1];
579 for (
int i = 0;
i < fExpNumber + 1;
i++)
582 for (
int i = 0;
i <= fExpNumber;
i++) {
583 for (
int sample_curr = fSignalBegin; sample_curr <= fGateEnd;
585 Zyk_arr[
i] += (std::complex<float>)(std::conj(z_power[
i]) *
586 (float)fWfm.at(sample_curr));
592 printf(
"\nampl calculation\n");
593 for (
int i = 0;
i <= fExpNumber;
i++) {
594 for (
int j = 0; j <= fExpNumber; j++)
595 printf(
"%e%+ei ", std::real(Zik_arr[
i][j]), std::imag(Zik_arr[
i][j]));
596 printf(
" fh%i = %e%+ei\n",
i, std::real(Zyk_arr[
i]), std::imag(Zyk_arr[
i]));
603 printf(
"amplitudes\n%.0f%+.0fi ", std::real(fh[0]), std::imag(fh[0]));
604 for (
int i = 1;
i < fExpNumber + 1;
i++)
605 printf(
"%e%+ei ", std::real(fh[
i]), std::imag(fh[
i]));
609 for (
int i = 0;
i < fExpNumber + 1;
i++)
612 std::complex<float> fit_ampl_in_sample = {0., 0.};
613 fFitZeroLevel = std::real(fh[0]);
614 for (
int sample_curr = 0; sample_curr < fSampleTotal; sample_curr++) {
615 fit_ampl_in_sample = {0., 0.};
616 if ((sample_curr >= fSignalBegin)) {
617 for (
int i = 0;
i < fExpNumber + 1;
i++) {
618 fit_ampl_in_sample += fh[
i] * z_power[
i];
621 fFitWfm.at(sample_curr) = std::real(fit_ampl_in_sample);
623 fFitWfm.at(sample_curr) = fFitZeroLevel;
627 printf(
"waveform:\n");
628 for (uint16_t
i = 0;
i < fWfm.size();
i++)
629 printf(
"%f ", fWfm.at(
i));
631 printf(
"\nfit waveform:\n");
632 for (uint16_t
i = 0;
i < fFitWfm.size();
i++)
633 printf(
"%f ", fFitWfm.at(
i));
635 printf(
"\nzero level %f\n\n", fZeroLevel);
638 for (
int i = 0;
i < fExpNumber + 1;
i++)
647 if (fSignalBegin + signal_length > (
int)fWfm.size()) {
648 printf (
"signal begin %i reaching waveform end! Aborting. Constant signal length %i\n", fSignalBegin, signal_length);
652 std::complex<float> *Zyk_arr =
new std::complex<float>[fExpNumber + 1];
653 for (
int i = 0;
i < fExpNumber + 1;
i++)
654 Zyk_arr[
i] = {0., 0.};
656 const std::complex<float> unit = {1., 0.};
657 std::complex<float> *z_power =
new std::complex<float>[fExpNumber + 1];
658 for (
int i = 0;
i < fExpNumber + 1;
i++)
661 if (fIsDebug) { printf(
"composing z power\n"); }
662 for (
int i = 0;
i <= fExpNumber;
i++) {
663 for (
int sample_curr = fSignalBegin; sample_curr < fSignalBegin + signal_length;
665 Zyk_arr[
i] += (std::complex<float>)(std::conj(z_power[
i]) *
666 (float)fWfm.at(sample_curr));
667 if (fIsDebug) { printf(
"%e%+ei ", std::real(z_power[
i]), std::imag(z_power[
i])); }
670 if (fIsDebug) printf(
"\n");
674 printf(
"\nampl calculation fast with signal length %i\n", signal_length);
675 for (
int i = 0;
i <= fExpNumber;
i++) {
676 printf(
"fh%i = ",
i);
677 for (
int j = 0; j <= fExpNumber; j++)
678 printf(
"%e%+ei ", std::real(InvHarmoMatrix[
i][j]), std::imag(InvHarmoMatrix[
i][j]));
679 printf(
" %e%+ei\n", std::real(Zyk_arr[
i]), std::imag(Zyk_arr[
i]));
683 for (
int i = 0;
i <= fExpNumber;
i++)
684 for (
int j = 0; j <= fExpNumber; j++)
685 fh[
i] += InvHarmoMatrix[
i][j] * Zyk_arr[j];
688 printf(
"amplitudes\n%.0f%+.0fi ", std::real(fh[0]), std::imag(fh[0]));
689 for (
int i = 1;
i < fExpNumber + 1;
i++)
690 printf(
"%e%+ei ", std::real(fh[
i]), std::imag(fh[
i]));
694 for (
int i = 0;
i < fExpNumber + 1;
i++)
697 std::complex<float> fit_ampl_in_sample = {0., 0.};
698 fFitZeroLevel = std::real(fh[0]);
699 for (
int sample_curr = 0; sample_curr < fSampleTotal; sample_curr++) {
700 fit_ampl_in_sample = {0., 0.};
701 if ((sample_curr >= fSignalBegin) && (sample_curr <= fGateEnd)) {
702 for (
int i = 0;
i < fExpNumber + 1;
i++) {
703 fit_ampl_in_sample += fh[
i] * z_power[
i];
706 fFitWfm.at(sample_curr) = std::real(fit_ampl_in_sample);
708 fFitWfm.at(sample_curr) = fFitZeroLevel;
712 printf(
"waveform:\n");
713 for (uint16_t
i = 0;
i < fWfm.size();
i++)
714 printf(
"%f ", fWfm.at(
i));
716 printf(
"\nfit waveform:\n");
717 for (uint16_t
i = 0;
i < fFitWfm.size();
i++)
718 printf(
"%f ", fFitWfm.at(
i));
720 printf(
"\nzero level %f\n\n", fZeroLevel);
1004 std::complex<double> *Zyk_arr =
new std::complex<double>[fExpNumber + 1];
1006 int mode = (std::abs(std::imag(fz[1])) > 0.01)? 1 : 0;
1007 if (fIsDebug) printf(
"search begin in complex (1) or real (0) mode: %i\n", mode);
1009 for (
int i = 0;
i < fExpNumber + 1;
i++)
1010 Zyk_arr[
i] = {0., 0.};
1013 for (
int i = 0;
i < fExpNumber + 1;
i++) {
1014 for (
int sample_curr = first_sample; sample_curr < first_sample + signal_length;
1016 Zyk_arr[
i] += (std::complex<double>)(std::conj(Zpower[
i][sample_curr-first_sample]) *
1017 (float)fWfm.at(sample_curr));
1018 if (fIsDebug) { printf(
"Zyk[%i] at signal begin %i : %e%+ei ",
i, first_sample, std::real(Zyk_arr[
i]), std::imag(Zyk_arr[
i])); }
1020 if (fIsDebug) printf(
"\n");
1022 std::pair<double,double> prev_pair;
1023 std::pair<double,double> new_pair;
1024 if(mode == 1) prev_pair = std::make_pair( std::abs(std::real(Zyk_arr[1])), std::abs(std::imag(Zyk_arr[1])) );
1025 if(mode == 0) prev_pair = std::make_pair( std::abs(std::real(Zyk_arr[1])), std::abs(std::real(Zyk_arr[2])) );
1027 for (
int signal_begin = first_sample+1; signal_begin <= last_sample-signal_length;
1029 for (
int i = 0;
i < fExpNumber + 1;
i++){
1031 Zyk_arr[
i] -= (std::complex<double>)fWfm.at(signal_begin-1);
1033 Zyk_arr[
i] /= (std::complex<double>)std::conj(fz[
i]);
1035 Zyk_arr[
i] += (std::complex<double>)(std::conj(Zpower[
i][signal_length-1]) *
1036 (float)fWfm.at(signal_begin + signal_length-1));
1038 if (fIsDebug) { printf(
"Zyk[%i] at signal begin %i : %e%+ei ",
i, signal_begin, std::real(Zyk_arr[
i]), std::imag(Zyk_arr[
i])); }
1040 if (fIsDebug) printf(
"\n");
1042 if(mode == 1) new_pair = std::make_pair( std::abs(std::real(Zyk_arr[1])), std::abs(std::imag(Zyk_arr[1])) );
1043 if(mode == 0) new_pair = std::make_pair( std::abs(std::real(Zyk_arr[1])), std::abs(std::real(Zyk_arr[2])) );
1044 if ((new_pair.first-prev_pair.first)*(new_pair.second-prev_pair.second) < 0) {
1045 if (fIsDebug) printf(
"begin candidate at %i \n", signal_begin);
1049 prev_pair = new_pair;
1054 return first_sample;