Chris@0
|
1 /*
|
Chris@0
|
2 copyright (C) 2012 I. Irigaray, M. Rocamora
|
Chris@0
|
3
|
Chris@0
|
4 This program is free software: you can redistribute it and/or modify
|
Chris@0
|
5 it under the terms of the GNU General Public License as published by
|
Chris@0
|
6 the Free Software Foundation, either version 3 of the License, or
|
Chris@0
|
7 (at your option) any later version.
|
Chris@0
|
8
|
Chris@0
|
9 This program is distributed in the hope that it will be useful,
|
Chris@0
|
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Chris@0
|
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
Chris@0
|
12 GNU General Public License for more details.
|
Chris@0
|
13
|
Chris@0
|
14 You should have received a copy of the GNU General Public License
|
Chris@0
|
15 along with this program. If not, see <http://www.gnu.org/licenses/>.
|
Chris@8
|
16 */
|
Chris@0
|
17
|
Chris@0
|
18
|
Chris@0
|
19 #include "FChTransformUtils.h"
|
Chris@0
|
20 #include <math.h>
|
Chris@0
|
21
|
Chris@14
|
22 void
|
Chris@14
|
23 Utils::cumtrapz(const double *x, const double *y, int N, double *accum)
|
Chris@0
|
24 /*Trapezoidal Integrator: 1/2(b-a)(F(a)+F(b))*/
|
Chris@0
|
25 {
|
Chris@8
|
26 accum[0]=0.0;
|
Chris@10
|
27 for (int i = 1; i < N; i++) {
|
Chris@8
|
28 accum[i]=accum[i-1]+0.5*(x[i]-x[i-1])*(y[i]+y[i-1]);
|
Chris@8
|
29 }
|
Chris@0
|
30 }
|
Chris@0
|
31
|
Chris@0
|
32
|
Chris@14
|
33 void
|
Chris@14
|
34 Utils::interp1(const double *x1, const double *y1, int N1, const double *x2, double *y2, int N2){
|
Chris@0
|
35 /*1-D linear interpolation*/
|
Chris@0
|
36
|
Chris@10
|
37 for (int i = 0; i < N2; i++) {
|
Chris@8
|
38 /*Smaller or equal than the smallest, or larger or equal than the largest.*/
|
Chris@8
|
39 if ( x2[i] <= x1[0] ) {
|
Chris@8
|
40 y2[i] = y1[0];
|
Chris@8
|
41 } else if ( x2[i] >= x1[N1-1] ) {
|
Chris@8
|
42 y2[i] = y1[N1-1];
|
Chris@8
|
43 } else {
|
Chris@8
|
44 /*Search every value of x2 in x1*/
|
Chris@10
|
45 int j = 1;
|
Chris@10
|
46 int salir = 0;
|
Chris@8
|
47 while ((j<N1)&&(!salir)) {
|
Chris@8
|
48 if ( x2[i] <= x1[j] ) {
|
Chris@8
|
49 y2[i] = y1[j-1] + ( ( y1[j] - y1[j-1] )*(x2[i] - x1[j-1] ) )/ ( x1[j] - x1[j-1] );
|
Chris@8
|
50 salir = 1;
|
Chris@8
|
51 } // if
|
Chris@8
|
52 j++;
|
Chris@8
|
53 } // for
|
Chris@8
|
54 } // else
|
Chris@8
|
55 } // for
|
Chris@0
|
56
|
Chris@0
|
57 }
|
Chris@0
|
58
|
Chris@14
|
59 void
|
Chris@14
|
60 Utils::hanning_window(double *p_window, int n, bool normalize) {
|
Chris@0
|
61
|
Chris@8
|
62 double accum=0;
|
Chris@10
|
63 for (int i = 0; i < n; i++) {
|
Chris@0
|
64 p_window[i] = 0.5*(1.0-cos(2*M_PI*(double)(i+1)/((double)n+1.0)));
|
Chris@0
|
65 accum += p_window[i];
|
Chris@0
|
66 }
|
Chris@8
|
67 if (normalize) {
|
Chris@10
|
68 for (int i = 0; i < n; i++) { //window normalization
|
Chris@8
|
69 p_window[i] = p_window[i]/accum;
|
Chris@0
|
70 }
|
Chris@8
|
71 }
|
Chris@0
|
72
|
Chris@0
|
73 }
|