Commit 94529c51c7ed9e82f6bb909c446d289c7f863aba
1 parent
3ccf1509
Exists in
9017
prep ticket
Showing
1 changed file
with
51 additions
and
31 deletions
Show diff stats
src/ExternLib/StatisticFunctions/SpectrumFunc.hh
... | ... | @@ -25,84 +25,104 @@ namespace AMDA { |
25 | 25 | namespace Parameters { |
26 | 26 | namespace StatisticFunctions { |
27 | 27 | |
28 | - template <typename InputElemType> | |
28 | + template <typename InputElemType> | |
29 | 29 | std::vector<double> fft(int N, std::vector<InputElemType> &xn) { |
30 | 30 | /** |
31 | 31 | * |
32 | 32 | * @param N number of points in the dft |
33 | 33 | * @param xn date vector |
34 | 34 | */ |
35 | - | |
35 | + | |
36 | 36 | int len = xn.size(); |
37 | 37 | std::vector<double> output; |
38 | 38 | output.resize(N); |
39 | 39 | output << NotANumber(); |
40 | - | |
40 | + | |
41 | 41 | double Xr; |
42 | 42 | double Xi; |
43 | - int counter; | |
44 | - | |
43 | + int counter; | |
44 | + | |
45 | 45 | int k, n = 0; |
46 | 46 | for (k = 0; k < N; k++) { |
47 | 47 | Xr = 0; |
48 | 48 | Xi = 0; |
49 | 49 | counter = 0; |
50 | 50 | for (n = 0; n < len; n++) { |
51 | - if(!isNAN(xn[n])){ | |
52 | - Xr = Xr + (double) xn[n]*cos(2*3.141592*k*n/N); | |
53 | - Xi = Xi+ (double) xn[n] *sin(2*3.141592*k*n/N); | |
54 | - counter += 1; | |
51 | + if (!isNAN(xn[n])) { | |
52 | + Xr = Xr + (double) xn[n] * cos(2 * 3.141592 * k * n / N); | |
53 | + Xi = Xi + (double) xn[n] * sin(2 * 3.141592 * k * n / N); | |
54 | + counter += 1; | |
55 | 55 | } |
56 | 56 | } |
57 | 57 | if (counter == 0) |
58 | - break; | |
59 | - output[k] = std::sqrt(Xr*Xr + Xi*Xi); | |
58 | + break; | |
59 | + output[k] = std::sqrt(Xr * Xr + Xi * Xi); | |
60 | 60 | } |
61 | - return output; | |
61 | + return output; | |
62 | 62 | } |
63 | 63 | |
64 | 64 | template <typename InputElemType> |
65 | - std::vector<double> computeFourierSpectrum(std::list<std::pair<double, InputElemType>>&mem) { | |
66 | - int nFft = 16; | |
67 | - std::vector<double> result; | |
68 | - result.resize(nFft); | |
69 | - | |
70 | - if(mem.empty()) | |
71 | - return result; | |
72 | - | |
73 | - std::vector<InputElemType> vals_; | |
74 | - for(auto val:mem){ | |
75 | - vals_.push_back(val.second); | |
65 | + std::vector<double> getUniformData(std::list<std::pair<double, InputElemType>>&mem, double sampling, double windowtime) { | |
66 | + bool constantSampling = true; | |
67 | + auto it_1 = mem.begin(); | |
68 | + it_1++; | |
69 | + for (auto it = mem.begin(); it != mem.end(); it++) { | |
70 | + if (*it != mem.back()) { | |
71 | + InputElemType first = it->first; | |
72 | + InputElemType second = it_1->first; | |
73 | + it_1++; | |
74 | + if (second - first != sampling) | |
75 | + constantSampling = false; | |
76 | + } | |
76 | 77 | } |
77 | - | |
78 | - if(! vals_.empty()) | |
79 | - return fft(nFft,vals_); | |
78 | + | |
79 | + std::vector<double> vals_; | |
80 | + for (auto val : mem) { | |
81 | + vals_.push_back((double) val.second); | |
82 | + } | |
83 | + return vals_; | |
84 | + } | |
85 | + | |
86 | + template <typename InputElemType> | |
87 | + std::vector<double> computeFourierSpectrum(std::list<std::pair<double, InputElemType>>&mem, double sampling, double windowtime) { | |
88 | + | |
89 | + std::vector<double> result; | |
90 | + | |
91 | + | |
92 | + if (mem.empty()) | |
93 | + return result; | |
80 | 94 | |
81 | 95 | return result; |
82 | 96 | } |
83 | 97 | |
84 | -/** | |
98 | + /** | |
85 | 99 | * @class SpectrumFunc |
86 | 100 | * @brief |
87 | 101 | * @details This class implements AbstractFunc. |
88 | 102 | */ |
89 | 103 | template <typename InputElemType> |
90 | - class SpectrumFunc : public ClassicAbstractFunc<InputElemType, std::vector<double>> { | |
91 | - public: | |
104 | + class SpectrumFunc : public ClassicAbstractFunc<InputElemType, std::vector<double>> | |
105 | + { | |
106 | + public: | |
92 | 107 | |
93 | 108 | /** |
94 | 109 | * @brief Constructor. |
95 | 110 | */ |
96 | 111 | SpectrumFunc(Process& pProcess, TimeIntervalListSPtr pTimeIntervalList, ParamDataSpec<InputElemType>& paramInput, double windowtime) |
97 | - : ClassicAbstractFunc<InputElemType, std::vector<double>>(pProcess, pTimeIntervalList, paramInput, windowtime) { | |
112 | + : ClassicAbstractFunc<InputElemType, std::vector<double>>(pProcess, pTimeIntervalList, paramInput, windowtime), | |
113 | + _min_sampling(paramInput.getMinSampling()), | |
114 | + _windowtime(windowtime) { | |
98 | 115 | } |
99 | 116 | |
100 | 117 | virtual ~SpectrumFunc() { |
101 | 118 | } |
102 | 119 | |
103 | 120 | std::vector<double> compute() { |
104 | - return computeFourierSpectrum(ClassicAbstractFunc<InputElemType, std::vector<double>>::_mem); | |
121 | + return computeFourierSpectrum(ClassicAbstractFunc<InputElemType, std::vector<double>>::_mem, _min_sampling, _windowtime); | |
105 | 122 | } |
123 | + private: | |
124 | + double _min_sampling; | |
125 | + double _windowtime; | |
106 | 126 | }; |
107 | 127 | |
108 | 128 | ... | ... |