neuro_toolbox
signal_processing.hpp
Go to the documentation of this file.
1 #ifndef SIGNAL_PROCESSING
2 #define SIGNAL_PROCESSING
3 
4 #include "config.hpp"
5 
6 namespace NTB
7 {
8  void make_signal(std::vector<double> &signal,
9  const int fs,
10  const int num_points = 1024,
11  const double f1 = 50.25,
12  const double f2 = 80.5,
13  const double a1 = 1.0,
14  const double a2 = 0.5)
15  {
28  int i;
29  // double dt = 1.0 / fs;
30  // unsigned num_points = signal.size();
31  signal.resize(num_points);
32 
33  for (i = 0; i < num_points; ++i)
34  {
35  double theta = (double)i / (double)fs;
36  signal[i] = a1 * sin(f1 * 2.0 * M_PI * theta) +
37  a2 * sin(f2 * 2.0 * M_PI * theta);
38  }
39  }
40 
41  //-------------------------------------------------------------------------
42  void fft(const std::vector<double> &signal,
43  std::vector<double> &frequencies,
44  std::vector<double> &amplitudes,
45  const double fs)
46  {
58  const int REAL = 0;
59  const int IMAG = 1;
60  // const double fs = 1.0 / (dt + 0.0);
61  const int num_points = signal.size();
62  amplitudes.resize(num_points / 2);
63  frequencies.resize(num_points / 2) ;
64  double *signalArray = new double[num_points];
65  unsigned flags{0};
66 
67  fftw_complex result[num_points / 2 + 1];
68  fftw_plan plan = fftw_plan_dft_r2c_1d(num_points,
69  signalArray,
70  result,
71  flags);
72  for (int i = 0; i < num_points; i++)
73  signalArray[i] = signal[i];
74 
75  fftw_execute(plan);
76  for (int i = 0; i < (0.5 * num_points); i++)
77  {
78  amplitudes[i] = 2.0 / (double)(num_points)*sqrt(result[i][REAL] * result[i][REAL] + result[i][IMAG] * result[i][IMAG]);
79  frequencies[i] = i / double(num_points) * fs;
80  }
81 
82  fftw_destroy_plan(plan);
83  delete[] signalArray;
84  }
85 
86 } // namespace NTB
87 
88 #endif // !SIGNAL_PROCESSING
void fft(const std::vector< double > &signal, std::vector< double > &frequencies, std::vector< double > &amplitudes, const double fs)
Definition: signal_processing.hpp:42
Definition: IO.hpp:6
void make_signal(std::vector< double > &signal, const int fs, const int num_points=1024, const double f1=50.25, const double f2=80.5, const double a1=1.0, const double a2=0.5)
Definition: signal_processing.hpp:8