#ifndef SCHUMANN_HH #define SCHUMANN_HH #include #include class Schumann: public sdr::gui::SpectrumProvider, public sdr::Sink { Q_OBJECT public: explicit Schumann(QObject *parent=0) : sdr::gui::SpectrumProvider(parent), sdr::Sink(), _buffer_idx(0), _avg_count(0), _buffer(2048), _spectrum(2048), _spec_count(0), _avg_spectrum(2048), _subsample(0), _Fs(0), _fft(_buffer, sdr::FFT::FORWARD) { // init spectrum and buffer for (size_t i=0; i<2048; i++) { _buffer[i] = 0; _spectrum[i] = 0; } } virtual ~Schumann() { // pass... } void config(const sdr::Config &src_cfg) { // Requires type, sample rate & buffer size if (!src_cfg.hasType() || !src_cfg.hasSampleRate() || !src_cfg.hasBufferSize()) { return; } // Check buffer type if (sdr::Config::typeId< int16_t >() != src_cfg.type()) { sdr::ConfigError err; err << "Can not configure Schumann: Invalid type " << src_cfg.type() << ", expected " << sdr::Config::typeId(); throw err; } // Check input sample rate double Fs = src_cfg.sampleRate(); if (40 > Fs) { sdr::ConfigError err; err << "Can not configure Schumann: Input sample rate too low! The Schumann node requires at " << "least a sample rate of 40Hz, got " << Fs << "Hz"; throw err; } // Compute subsample _subsample = Fs/40; _Fs = Fs/_subsample; } void process(const sdr::Buffer &buffer, bool allow_overwrite) { for (size_t i=0; i &spectrum() const { return _avg_spectrum; } protected: size_t _buffer_idx; size_t _avg_count; sdr::Buffer< std::complex > _buffer; sdr::Buffer< double > _spectrum; size_t _spec_count; sdr::Buffer< double > _avg_spectrum; size_t _subsample; double _Fs; sdr::FFTPlan _fft; }; #endif // SCHUMANN_HH