#ifndef ASYNCDFT_H #define ASYNCDFT_H #include #include #include #include #include #include #include class AsyncDFT { public: AsyncDFT(); ~AsyncDFT(); static const int n_samples = 1<<17; /* Raise exception if not ready yet*/ QVector getPowerSpectrum(QVector input); QVector getFrequenciyWindow(int samplesPerSeconds); /*Add a sample to the time domain samples*/ void addSample(short sample); /*Return the window of samples*/ std::unique_ptr getWindow(); /*Normalize the DFT*/ QVector normalizeDFT(double e_maximum, QVector dft); private: /*Thread manager method*/ void threadManager(); //threaded /*Shifts left the window by 1*/ void shift(); public: /*Maximum power value obtained from power spectrum*/ double maximum = -1; private: /*Time domain window*/ std::list window; double in_buffer[n_samples]; /*Indicates if dft is available*/ bool data_valid; /*Number of time domain samples accumulated*/ int samples_count; /*FFTW3*/ fftw_plan plan; fftw_complex *out_buffer; std::mutex mtx_samples; bool stopping = false; std::thread manager; std::queue pending_samples; }; #endif // ASYNCDFT_H