annotate FChTransformUtils.cpp @ 0:d912b9d53e50

Import original code from the downloaded VampFChTCore-v1.1beta archive
author Chris Cannam
date Tue, 02 Oct 2018 10:44:42 +0100
parents
children 7ec763dc767c
rev   line source
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@0 16 */
Chris@0 17
Chris@0 18
Chris@0 19 #include "FChTransformUtils.h"
Chris@0 20 #include <math.h>
Chris@0 21
Chris@0 22 void cumtrapz(const double *x, const double *y, size_t N, double *accum)
Chris@0 23 /*Trapezoidal Integrator: 1/2(b-a)(F(a)+F(b))*/
Chris@0 24 {
Chris@0 25
Chris@0 26 accum[0]=0.0;
Chris@0 27 for (size_t i = 1; i < N; i++) {
Chris@0 28 accum[i]=accum[i-1]+0.5*(x[i]-x[i-1])*(y[i]+y[i-1]);
Chris@0 29 }
Chris@0 30
Chris@0 31 }
Chris@0 32
Chris@0 33
Chris@0 34 void interp1(const double *x1, const double *y1, size_t N1, const double *x2, double *y2, size_t N2){
Chris@0 35 /*1-D linear interpolation*/
Chris@0 36
Chris@0 37 for (size_t i = 0; i < N2; i++) {
Chris@0 38 /*Smaller or equal than the smallest, or larger or equal than the largest.*/
Chris@0 39 if ( x2[i] <= x1[0] ) {
Chris@0 40 y2[i] = y1[0];
Chris@0 41 } else if ( x2[i] >= x1[N1-1] ) {
Chris@0 42 y2[i] = y1[N1-1];
Chris@0 43 } else {
Chris@0 44 /*Search every value of x2 in x1*/
Chris@0 45 size_t j = 1;
Chris@0 46 size_t salir = 0;
Chris@0 47 while ((j<N1)&&(!salir)) {
Chris@0 48 if ( x2[i] <= x1[j] ) {
Chris@0 49 //y2[i] = ( x2[i]*( y1[j] - y1[j-1] ) + x1[j]*y1[j-1] - x1[j-1]*y1[j] ) / ( x1[j] - x1[j-1] );
Chris@0 50 y2[i] = y1[j-1] + ( ( y1[j] - y1[j-1] )*(x2[i] - x1[j-1] ) )/ ( x1[j] - x1[j-1] );
Chris@0 51 salir = 1;
Chris@0 52 } // if
Chris@0 53 j++;
Chris@0 54 } // for
Chris@0 55 } // else
Chris@0 56 } // for
Chris@0 57
Chris@0 58 }
Chris@0 59
Chris@0 60 void interp1q(const double *y1, const size_t *x2_int, const double *x2_frac, double *y2, size_t N2){
Chris@0 61
Chris@0 62 for(size_t i=0;i<N2;i++){
Chris@0 63 y2[i] = y1[x2_int[i]]*(1.0-x2_frac[i])+y1[x2_int[i]+1]*x2_frac[i];
Chris@0 64 } // for
Chris@0 65
Chris@0 66 }
Chris@0 67
Chris@0 68 void hanning_window(double *p_window, size_t n, bool normalize) {
Chris@0 69
Chris@0 70 double accum=0;
Chris@0 71 for (size_t i = 0; i < n; i++) {
Chris@0 72 p_window[i] = 0.5*(1.0-cos(2*M_PI*(double)(i+1)/((double)n+1.0)));
Chris@0 73 accum += p_window[i];
Chris@0 74 }
Chris@0 75 if (normalize) {
Chris@0 76 for (size_t i = 0; i < n; i++) { //window normalization
Chris@0 77 p_window[i] = p_window[i]/accum;
Chris@0 78 }
Chris@0 79 }
Chris@0 80
Chris@0 81 }