FFTWindow.cxx
1 #include "FFTWindow.h"
2 #include "TGraph.h"
3 #include <cmath>
4 #include "TMath.h"
5 
6 
7 double* FFTtools::FFTWindowType::make(size_t N) const
8 {
9  double * ret = new double[N];
10  fill(N,ret);
11  return ret;
12 }
13 
14 void FFTtools::FFTWindowType::fill(size_t N, double * x) const
15 {
16 
17  size_t i;
18  int j;
19  for (i = 0, j = -(N-1)/2; i < N; i++, j++)
20  {
21  x[i] = value(j,N);
22  }
23 }
24 
25 void FFTtools::FFTWindowType::apply(size_t N, double * x) const
26 {
27 
28  size_t i;
29  int j;
30  for (i = 0, j = -(N-1)/2 ; i < N; i++, j++)
31  {
32  x[i] *= value(j,N);
33  }
34 }
35 
36 double FFTtools::TriangularWindow::value(double i, size_t N) const
37 {
38  double L = (N-1)/2;
39  return 1 - fabs(i / L);
40 }
41 
42 double FFTtools::HannWindow::value(double i, size_t N) const
43 {
44  int j = i + (N-1)/2;
45  return 0.5 * (1. - cos(2.*M_PI * j / (N-1))) ;
46 
47 }
48 
49 static const double hamming_alpha = 25./46;
50 static const double hamming_beta = 21./46;
51 
52 double FFTtools::HammingWindow::value(double i, size_t N) const
53 {
54  int j = i + (N-1)/2;
55  return hamming_alpha -hamming_beta* cos(2.*M_PI * j / (N-1)) ;
56 }
57 
58 static const double blackman_a0 = 7938./18308;
59 static const double blackman_a1 = 9240./18308;
60 static const double blackman_a2 = 1430./18308;
61 
62 double FFTtools::BlackmanWindow::value(double i, size_t N) const
63 {
64  int j = i + (N-1)/2;
65  return blackman_a0 - blackman_a1 * cos(2*M_PI*j/(N-1)) + blackman_a2 * cos(4*M_PI*j/(N-1));
66 }
67 
68 static const double blackmanharris_a0 = 0.35785;
69 static const double blackmanharris_a1 = 0.48829;
70 static const double blackmanharris_a2 = 0.14128;
71 static const double blackmanharris_a3 = 0.01168;
72 
73 double FFTtools::BlackmanHarrisWindow::value(double i, size_t N) const
74 {
75  int j = i + (N-1)/2;
76  return blackmanharris_a0 - blackmanharris_a1 * cos(2*M_PI*j/(N-1)) + blackmanharris_a2 * cos(4*M_PI*j/(N-1)) - blackmanharris_a3 * cos(6*M_PI*j/(N-1)); ;
77 }
78 
79 
80 double FFTtools::KaiserWindow::value(double i, size_t N) const
81 {
82  int j = i + (N-1)/2;
83  return TMath::BesselI0(M_PI * alpha * TMath::Sqrt( 1 - TMath::Power(2.*j/(N-1)-1.,2))) / TMath::BesselI0(M_PI*alpha);
84 }
85 
86 
87 double FFTtools::GaussianWindow::value(double i, size_t N) const
88 {
89  int n = i + (N-1)/2;
90  return TMath::Exp(-2*TMath::Power(alpha*n/(N-1),2));
91 }
92 
93 
94 
95 double FFTtools::TukeyWindow::value(double i, size_t N) const
96 {
97  double T = alpha *(N-1)/2.;
98  int n = i + (N-1)/2;
99  if ( n < T) return 0.5 * ( 1+ cos(TMath::Pi() * (n / T- 1))) ;
100  if ( n >= N) return 0;
101  if (n >= N - T) return 0.5 * ( 1 + cos(TMath::Pi() * ( n/T - 2 /alpha + 1)));
102  return 1;
103 }
104