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@29
|
20
|
Chris@29
|
21 #define _USE_MATH_DEFINES
|
Chris@29
|
22
|
Chris@0
|
23 #include <math.h>
|
Chris@0
|
24
|
Chris@14
|
25 void
|
Chris@14
|
26 Utils::cumtrapz(const double *x, const double *y, int N, double *accum)
|
Chris@0
|
27 /*Trapezoidal Integrator: 1/2(b-a)(F(a)+F(b))*/
|
Chris@0
|
28 {
|
Chris@8
|
29 accum[0]=0.0;
|
Chris@10
|
30 for (int i = 1; i < N; i++) {
|
Chris@8
|
31 accum[i]=accum[i-1]+0.5*(x[i]-x[i-1])*(y[i]+y[i-1]);
|
Chris@8
|
32 }
|
Chris@0
|
33 }
|
Chris@0
|
34
|
Chris@0
|
35
|
Chris@14
|
36 void
|
Chris@14
|
37 Utils::interp1(const double *x1, const double *y1, int N1, const double *x2, double *y2, int N2){
|
Chris@0
|
38 /*1-D linear interpolation*/
|
Chris@0
|
39
|
Chris@10
|
40 for (int i = 0; i < N2; i++) {
|
Chris@8
|
41 /*Smaller or equal than the smallest, or larger or equal than the largest.*/
|
Chris@8
|
42 if ( x2[i] <= x1[0] ) {
|
Chris@8
|
43 y2[i] = y1[0];
|
Chris@8
|
44 } else if ( x2[i] >= x1[N1-1] ) {
|
Chris@8
|
45 y2[i] = y1[N1-1];
|
Chris@8
|
46 } else {
|
Chris@8
|
47 /*Search every value of x2 in x1*/
|
Chris@10
|
48 int j = 1;
|
Chris@10
|
49 int salir = 0;
|
Chris@8
|
50 while ((j<N1)&&(!salir)) {
|
Chris@8
|
51 if ( x2[i] <= x1[j] ) {
|
Chris@8
|
52 y2[i] = y1[j-1] + ( ( y1[j] - y1[j-1] )*(x2[i] - x1[j-1] ) )/ ( x1[j] - x1[j-1] );
|
Chris@8
|
53 salir = 1;
|
Chris@8
|
54 } // if
|
Chris@8
|
55 j++;
|
Chris@8
|
56 } // for
|
Chris@8
|
57 } // else
|
Chris@8
|
58 } // for
|
Chris@0
|
59
|
Chris@0
|
60 }
|
Chris@0
|
61
|
Chris@14
|
62 void
|
Chris@14
|
63 Utils::hanning_window(double *p_window, int n, bool normalize) {
|
Chris@0
|
64
|
Chris@8
|
65 double accum=0;
|
Chris@10
|
66 for (int i = 0; i < n; i++) {
|
Chris@0
|
67 p_window[i] = 0.5*(1.0-cos(2*M_PI*(double)(i+1)/((double)n+1.0)));
|
Chris@0
|
68 accum += p_window[i];
|
Chris@0
|
69 }
|
Chris@8
|
70 if (normalize) {
|
Chris@10
|
71 for (int i = 0; i < n; i++) { //window normalization
|
Chris@8
|
72 p_window[i] = p_window[i]/accum;
|
Chris@0
|
73 }
|
Chris@8
|
74 }
|
Chris@0
|
75
|
Chris@0
|
76 }
|