29#ifndef averagePeriodogram_hpp
30#define averagePeriodogram_hpp
84template <
typename realT>
114 math::ft::fftT<realT, std::complex<realT>, 1, 0> m_fft;
116 realT *m_tsWork{
nullptr };
118 std::complex<realT> *m_fftWork{
nullptr };
119 size_t m_fftWorkSize{ 0 };
172 void dt( realT ndt );
192 int resize(
size_t avgLen );
200 int resize(
size_t avgLen,
212 std::vector<realT> &
win();
222 void win(
void(*winFunc)(std::vector<realT> &) );
245 const std::vector<realT> &ts
253 std::vector<realT>
operator()( std::vector<realT> &ts );
269template <
typename realT>
272 resize( avgLen, 0, 0.5 * avgLen );
276template <
typename realT>
279 resize( avgLen, padLen, 0.5 * avgLen );
283template <
typename realT>
286 resize( avgLen, padLen, 0.5 * avgLen );
290template <
typename realT>
293 resize( avgLen, padLen, olap );
297template <
typename realT>
302 fftw_free( m_tsWork );
307 fftw_free( m_fftWork );
311template <
typename realT>
318template <
typename realT>
324template <
typename realT>
330template <
typename realT>
333 return resize( avgLen, 0, 0.5 * avgLen );
336template <
typename realT>
359 fftw_free( m_tsWork );
366 fftw_free( m_fftWork );
374template <
typename realT>
380template <
typename realT>
387template <
typename realT>
400template <
typename realT>
405 std::cerr <<
"averagePeriodogram: Window size not correct.\n";
416 for(
int i = 0; i < Navg; ++i )
420 for(
size_t j = 0; j <
m_avgLen; ++j )
427 for(
size_t j = 0; j <
m_avgLen; ++j )
429 m_tsWork[j] = ts[i *
m_nOver + j];
439 m_fft( m_fftWork, m_tsWork );
441 for(
size_t j = 0; j <
m_size; ++j )
442 pgram[j] += norm( m_fftWork[j] );
449 for(
size_t j = 0; j <
m_size; ++j )
450 pgram[j] *= tsVar / pgramVar;
453template <
typename realT>
457 operator()( pgram.data(), ts.data(), ts.size() );
460template <
typename realT>
463 std::vector<realT> pgram;
468template <
typename realT>
474template <
typename realT>
~averagePeriodogram()
D'tor, frees all working memory.
int resize(size_t avgLen)
Resize the periodogram working memory, setting up the 1/2-overlapped optimum case.
realT df()
Get the frequency interval of the periodogram.
size_t m_padLen
The size of the periodogram estimate with zero-padding.
realT m_dt
The time sampling. Only used for normalization and calculation of the frequency scale.
size_t m_avgLen
The number of samples in each periodogram estimate.
void dt(realT ndt)
Set the sampling interval of the time-series.
size_t m_size
The size of the periodogram vector, calculated as m_avgLen/2 + 1;.
void operator()(realT *pgram, const realT *ts, size_t sz)
Calculate the periodogram for a time-series.
std::vector< realT > m_win
void resizeWin(bool setRect=true)
Resize the window and, unless not desired, initialize to the rectangular window by setting all 1s.
averagePeriodogram(size_t avgLen)
C'tor which sets up the optimum overlapped periodogram of the timeseries.
size_t size()
Return the size of the periodogram.
realT operator[](size_t n)
Get the frequency at a given point in the periodogram.
int m_nOver
The number of overlapping segments. Calculated from m_avgLen and m_overlap;.
realT dt()
Get the sampling interval of the time-series.
std::vector< realT > & win()
Get a reference to the window vector.
realT m_df
The frequency sampling. This is used only for normalization and frequency scale output.
realT * fftw_malloc(size_t n)
Call to fftw_malloc, with type cast.
@ forward
Specifies the forward transform.
realT psdVar1sided(realT df, const realT *PSD, size_t sz, realT half=0.5)
Calculate the variance of a 1-D, 1-sided PSD.
valueT vectorVariance(const valueT *vec, size_t sz, valueT mean)
Calculate the variance of a vector relative to a supplied mean value.
Tools for working with PSDs.