55 int nL,
int nR,
int m,
int lD,
bool convolveWithNr)
106 int data_point_count = data_points.size();
113 y_filtered_data_p =
dvector(1, 2 * data_point_count);
115 y_filtered_data_p =
dvector(1, data_point_count);
117 for(
int iter = 0; iter < data_point_count; ++iter)
119 x_data_p[iter] = data_points.at(iter).x;
120 y_initial_data_p[iter] = data_points.at(iter).y;
125 runFilter(y_initial_data_p, y_filtered_data_p, data_point_count);
128 auto iter_yf = y_filtered_data_p;
129 for(
auto &data_point : data_points)
131 data_point.y = *iter_yf;
150 return QString::asprintf(
151 "Savitzy-Golay filter parameters:\n"
152 "nL: %d ; nR: %d ; m: %d ; lD: %d ; convolveWithNr : %s",
165 v = (
int *)malloc((
size_t)((nh - nl + 2) *
sizeof(
int)));
168 qFatal(
"Error: Allocation failure.");
182 qFatal(
"Error: Allocation failure.");
184 for(k = nl; k <= nh; k++)
193 long i, nrow = nrh - nrl + 1, ncol = nch - ncl + 1;
198 qFatal(
"Error: Allocation failure.");
206 qFatal(
"Error: Allocation failure.");
210 for(i = nrl + 1; i <= nrh; i++)
211 m[i] = m[i - 1] + ncol;
219 free((
char *)(v + nl - 1));
226 free((
char *)(v + nl - 1));
232 pappso_double **m,
long nrl, [[maybe_unused]]
long nrh,
long ncl, [[maybe_unused]]
long nch)
const
234 free((
char *)(m[nrl] + ncl - 1));
235 free((
char *)(m + nrl - 1));
245 int i, ii = 0, ip, j;
248 for(i = 1; i <= n; i++)
254 for(j = ii; j <= i - 1; j++)
255 sum -=
a[i][j] *
b[j];
260 for(i = n; i >= 1; i--)
263 for(j = i + 1; j <= n; j++)
264 sum -=
a[i][j] *
b[j];
265 b[i] =
sum /
a[i][i];
276 int i, imax = 0, j, k;
282 for(i = 1; i <= n; i++)
285 for(j = 1; j <= n; j++)
286 if((temp = fabs(
a[i][j])) > big)
290 qFatal(
"Error: Singular matrix found in routine ludcmp().");
294 for(j = 1; j <= n; j++)
296 for(i = 1; i < j; i++)
299 for(k = 1; k < i; k++)
300 sum -=
a[i][k] *
a[k][j];
304 for(i = j; i <= n; i++)
307 for(k = 1; k < j; k++)
308 sum -=
a[i][k] *
a[k][j];
310 if((dum = vv[i] * fabs(
sum)) >= big)
318 for(k = 1; k <= n; k++)
321 a[imax][k] =
a[j][k];
329 a[j][j] = std::numeric_limits<pappso_double>::epsilon();
332 dum = 1.0 / (
a[j][j]);
333 for(i = j + 1; i <= n; i++)
344 unsigned long n, mmax, m, j, istep, i;
350 for(i = 1; i < n; i += 2)
354 SWAP(data[j], data[i]);
355 SWAP(data[j + 1], data[i + 1]);
358 while(m >= 2 && j > m)
369 theta = isign * (6.28318530717959 / mmax);
370 wtemp = sin(0.5 * theta);
371 wpr = -2.0 * wtemp * wtemp;
375 for(m = 1; m < mmax; m += 2)
377 for(i = m; i <= n; i += istep)
380 tempr = wr * data[j] - wi * data[j + 1];
381 tempi = wr * data[j + 1] + wi * data[j];
382 data[j] = data[i] - tempr;
383 data[j + 1] = data[i + 1] - tempi;
385 data[i + 1] += tempi;
387 wr = (wtemp = wr) * wpr - wi * wpi + wr;
388 wi = wi * wpr + wtemp * wpi + wi;
402 unsigned long nn3, nn2, jj, j;
405 nn3 = 1 + (nn2 = 2 + n + n);
406 for(j = 1, jj = 2; j <= n; j++, jj += 2)
408 fft1[jj - 1] = data1[j];
413 fft1[2] = fft2[2] = 0.0;
414 for(j = 3; j <= n + 1; j += 2)
416 rep = 0.5 * (fft1[j] + fft1[nn2 - j]);
417 rem = 0.5 * (fft1[j] - fft1[nn2 - j]);
418 aip = 0.5 * (fft1[j + 1] + fft1[nn3 - j]);
419 aim = 0.5 * (fft1[j + 1] - fft1[nn3 - j]);
423 fft1[nn3 - j] = -aim;
435 unsigned long i, i1, i2, i3, i4, np3;
443 four1(data, n >> 1, 1);
450 wtemp = sin(0.5 * theta);
451 wpr = -2.0 * wtemp * wtemp;
456 for(i = 2; i <= (n >> 2); i++)
458 i4 = 1 + (i3 = np3 - (i2 = 1 + (i1 = i + i - 1)));
459 h1r = c1 * (data[i1] + data[i3]);
460 h1i = c1 * (data[i2] - data[i4]);
461 h2r = -c2 * (data[i2] + data[i4]);
462 h2i = c2 * (data[i1] - data[i3]);
463 data[i1] = h1r + wr * h2r - wi * h2i;
464 data[i2] = h1i + wr * h2i + wi * h2r;
465 data[i3] = h1r - wr * h2r + wi * h2i;
466 data[i4] = -h1i + wr * h2i + wi * h2r;
467 wr = (wtemp = wr) * wpr - wi * wpi + wr;
468 wi = wi * wpr + wtemp * wpi + wi;
472 data[1] = (h1r = data[1]) + data[2];
473 data[2] = h1r - data[2];
477 data[1] = c1 * ((h1r = data[1]) + data[2]);
478 data[2] = c1 * (h1r - data[2]);
479 four1(data, n >> 1, -1);
492 unsigned long i, no2;
496 for(i = 1; i <= (m - 1) / 2; i++)
497 respns[n + 1 - i] = respns[m + 1 - i];
498 for(i = (m + 3) / 2; i <= n - (m - 1) / 2; i++)
500 twofft(data, respns, fft, ans, n);
502 for(i = 2; i <= n + 2; i += 2)
507 (fft[i - 1] * (dum = ans[i - 1]) - fft[i] * ans[i]) / no2;
508 ans[i] = (fft[i] * dum + fft[i - 1] * ans[i]) / no2;
512 if((mag2 = ans[i - 1] * ans[i - 1] + ans[i] * ans[i]) == 0.0)
514 qDebug(
"Attempt of deconvolving at zero response in convlv().");
518 (fft[i - 1] * (dum = ans[i - 1]) + fft[i] * ans[i]) / mag2 / no2;
519 ans[i] = (fft[i] * dum - fft[i - 1] * ans[i]) / mag2 / no2;
523 qDebug(
"No meaning for isign in convlv().");
536 pappso_double c[],
int np,
int nl,
int nr,
int ld,
int m)
const
538 int imj, ipj, j, k, kk, mm, *indx;
541 if(np < nl + nr + 1 || nl < 0 || nr < 0 || ld > m || nl + nr < m)
543 qDebug(
"Inconsistent arguments detected in routine sgcoeff.");
549 for(ipj = 0; ipj <= (m << 1); ipj++)
551 sum = (ipj ? 0.0 : 1.0);
552 for(k = 1; k <= nr; k++)
554 for(k = 1; k <= nl; k++)
556 mm = (ipj < 2 * m - ipj ? ipj : 2 * m - ipj);
557 for(imj = -mm; imj <= mm; imj += 2)
558 a[1 + (ipj + imj) / 2][1 + (ipj - imj) / 2] =
sum;
561 for(j = 1; j <= m + 1; j++)
565 for(kk = 1; kk <= np; kk++)
567 for(k = -nl; k <= nr; k++)
571 for(mm = 1; mm <= m; mm++)
572 sum +=
b[mm + 1] * (fac *= k);
573 kk = ((np - k) % np) + 1;
589 double *y_filtered_data_p,
590 int data_point_count)
const
596 #if CONVOLVE_WITH_NR_CONVLV
600 convlv(y_data_p, data_point_count,
c, np, 1, y_filtered_data_p);
609 qDebug() << __FILE__ << __LINE__ << __FUNCTION__ <<
"()"
612 for(k = 1; k <=
m_nL; k++)
614 for(y_filtered_data_p[k] = 0.0, j = -
m_nL; j <=
m_nR; j++)
618 y_filtered_data_p[k] +=
619 c[(j >= 0 ? j + 1 :
m_nR +
m_nL + 2 + j)] * y_data_p[k + j];
623 for(k =
m_nL + 1; k <= data_point_count -
m_nR; k++)
625 for(y_filtered_data_p[k] = 0.0, j = -
m_nL; j <=
m_nR; j++)
627 y_filtered_data_p[k] +=
628 c[(j >= 0 ? j + 1 :
m_nR +
m_nL + 2 + j)] * y_data_p[k + j];
631 for(k = data_point_count -
m_nR + 1; k <= data_point_count; k++)
633 for(y_filtered_data_p[k] = 0.0, j = -
m_nL; j <=
m_nR; j++)
635 if(k + j <= data_point_count)
637 y_filtered_data_p[k] +=
638 c[(j >= 0 ? j + 1 :
m_nR +
m_nL + 2 + j)] * y_data_p[k + j];