#pragma once #include #include #include #include #include "fft.hpp" constexpr size_t DEFAULT_NFFT = 2048; constexpr size_t DEFAULT_HOP = 512; class SpectralProcessor { public: SpectralProcessor(size_t nfft = DEFAULT_NFFT, size_t hop = DEFAULT_HOP); ~SpectralProcessor(); void processBlock(float* in, float* out, size_t num_samples, size_t num_channels = 1); private: size_t nfft_; size_t hop_; double* window_; FFTPlan plan_; std::complex* buf_; std::complex* tmp_buf_; std::vector overlap_; size_t frame_count_; size_t output_pos_; void computeWindow(); void stftFrame(const float* in, std::complex* out); void istftFrame(std::complex* in, float* out, float* overlap); void updateDetector(); };