#pragma once #include #include #include #include #include "fft.hpp" #include "framed_model.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, float sample_rate = 44100.0f); ~SpectralProcessor(); void setDetectorParams(const std::vector& bands); 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::complex* fir_buf_; std::complex* fir_freq_; std::vector fir_window_; std::vector overlap_; std::vector mask_; FramedDetector detector_; 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); };