2 #include "gsl/gsl_fft_real.h"
3 #include "gsl/gsl_fft_halfcomplex.h"
10 NumberPointsLeft_m(nl),
11 NumberPointsRight_m(nr),
14 CoefsDeriv_m(np, 0.0) {
20 vector<double> temp(LineDensity.size(), 0.0);
22 LineDensity.assign(temp.begin(), temp.end());
26 vector<double> temp(LineDensity.size(), 0.0);
28 LineDensity.assign(temp.begin(), temp.end());
32 void savgol(vector<double> &
c,
const int &np,
const int &nl,
const int &
nr,
const int &ld,
const int &m) {
33 int j, k, imj, ipj, kk, mm;
36 if(np < nl + nr + 1 || nl < 0 || nr < 0 || ld > m || nl + nr < m) {
37 cerr <<
"bad args in savgol" <<
endl;
40 vector<int> indx(m + 1, 0);
41 vector<double> a((m + 1) * (m + 1), 0.0);
42 vector<double> b(m + 1, 0.0);
44 for(ipj = 0; ipj <= (m << 1); ++ipj) {
45 sum = (ipj ? 0.0 : 1.0);
46 for(k = 1; k <=
nr; ++k)
47 sum += (
int)
pow((
double)k, (
double)ipj);
48 for(k = 1; k <= nl; ++k)
49 sum += (
int)
pow((
double) - k, (
double)ipj);
50 mm = (ipj < 2 * m - ipj ? ipj : 2 * m - ipj);
51 for(imj = -mm; imj <= mm; imj += 2)
52 a[(ipj + imj) / 2 * (m + 1) + (ipj - imj) / 2] =
sum;
56 for(j = 0; j < m + 1; ++j)
61 for(kk = 0; kk < np; ++kk)
63 for(k = -nl; k <=
nr; ++k) {
66 for(mm = 1; mm <= m; ++mm)
67 sum += b[mm] * (fac *= k);
74 void convlv(
const vector<double> &data,
const vector<double> &respns,
const int &isign, vector<double> &ans) {
76 int m = respns.size();
80 double *tempfd1 =
new double[
n];
81 double *tempfd2 =
new double[
n];
83 gsl_fft_halfcomplex_wavetable *hc;
84 gsl_fft_real_wavetable *
real = gsl_fft_real_wavetable_alloc(n);
85 gsl_fft_real_workspace *work = gsl_fft_real_workspace_alloc(n);
88 for(
int i = 0; i <
n; ++ i) {
93 tempfd1[0] = respns[0];
94 for(
int i = 1; i < (m + 1) / 2; ++i) {
95 tempfd1[i] = respns[i];
96 tempfd1[n - i] = respns[m - i];
99 gsl_fft_real_transform(tempfd1, 1, n, real, work);
100 gsl_fft_real_transform(tempfd2, 1, n, real, work);
102 gsl_fft_real_wavetable_free(real);
103 hc = gsl_fft_halfcomplex_wavetable_alloc(n);
106 for(
int i = 1; i < n - 1; i += 2) {
108 tempfd1[i] = (tempfd1[i] * tempfd2[i] - tempfd1[i + 1] * tempfd2[i + 1]);
109 tempfd1[i + 1] = (tempfd1[i + 1] * tempfd2[i] + tmp * tempfd2[i + 1]);
111 tempfd1[0] *= tempfd2[0];
112 tempfd1[n - 1] *= tempfd2[n - 1];
115 gsl_fft_halfcomplex_inverse(tempfd1, 1, n, hc, work);
117 for(
int i = 0; i <
n; ++i) {
121 gsl_fft_halfcomplex_wavetable_free(hc);
122 gsl_fft_real_workspace_free(work);
128 void ludcmp(vector<double> &a, vector<int> &indx,
double &d) {
129 const double TINY = 1.0e-20;
130 int i, imax = -1, j, k;
131 double big, dum,
sum, temp;
134 vector<double> vv(n, 0.0);
137 for(i = 0; i <
n; ++i) {
139 for(j = 0; j <
n; ++j)
140 if((temp =
fabs(a[i * n + j])) > big) big = temp;
143 cerr <<
"Singular matrix in routine ludcmp" <<
endl;
149 for(j = 0; j <
n; ++j) {
150 for(i = 0; i < j; ++i) {
152 for(k = 0; k < i; ++k)
153 sum -= a[i * n + k] * a[k * n + j];
157 for(i = j; i <
n; ++i) {
159 for(k = 0; k < j; ++k)
160 sum -= a[i * n + k] * a[k * n + j];
162 if((dum = vv[i] *
fabs(sum)) >= big) {
169 for(k = 0; k <
n; ++k) {
170 dum = a[imax * n + k];
171 a[imax * n + k] = a[j * n + k];
178 if(a[j * n + j] == 0.0) a[j * n + j] =
TINY;
180 dum = 1. / a[j * n + j];
181 for(i = j + 1; i <
n; ++i)
187 void lubksb(vector<double> &a, vector<int> &indx, vector<double> &b) {
188 int i, ii = 0, ip, j;
192 for(i = 0; i <
n; ++i) {
197 for(j = ii - 1; j < i; ++j)
198 sum -= a[i * n + j] * b[j];
203 for(i = n - 1; i >= 0; --i) {
205 for(j = i + 1; j <
n; ++j)
206 sum -= a[i * n + j] * b[j];
207 b[i] = sum / a[i * n + i];
void lubksb(vector< double > &a, vector< int > &indx, vector< double > &b)
void apply(std::vector< double > &histogram)
PETE_TUTree< FnFabs, typename T::PETE_Expr_t > fabs(const PETE_Expr< T > &l)
void ludcmp(vector< double > &a, vector< int > &indx, double &d)
T::PETE_Expr_t::PETE_Return_t sum(const PETE_Expr< T > &expr)
FLieGenerator< T, N > real(const FLieGenerator< std::complex< T >, N > &)
Take real part of a complex generator.
void savgol(double c[], int np, int nl, int nr, int ld, int m)
void convlv(double data[], int n, double respns[], int m, int isign, double ans[])
constexpr double c
The velocity of light in m/s.
Tps< T > pow(const Tps< T > &x, int y)
Integer power.
std::vector< double > CoefsDeriv_m
std::vector< double > Coefs_m
void calc_derivative(std::vector< double > &histogram, const double &h)
SavitzkyGolayFilter(int np, int nl, int nr, int m)
Inform & endl(Inform &inf)