From 85e2ae3d74d8288ff332f960c5108dc6c2096073 Mon Sep 17 00:00:00 2001 From: Hannes Matuschek Date: Thu, 18 Dec 2014 14:49:33 +0100 Subject: [PATCH] Added Schumann resonances example. --- examples/CMakeLists.txt | 4 ++ examples/schumann.cc | 2 + examples/schumann.hh | 106 +++++++++++++++++++++++++++++++++++++++ examples/sdr_schumann.cc | 40 +++++++++++++++ 4 files changed, 152 insertions(+) create mode 100644 examples/schumann.cc create mode 100644 examples/schumann.hh create mode 100644 examples/sdr_schumann.cc diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 7e405f8..a0aab40 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -15,6 +15,10 @@ IF(SDR_WITH_PORTAUDIO) add_executable(sdr_afsk1200 sdr_afsk1200.cc) target_link_libraries(sdr_afsk1200 ${LIBS} libsdr) + + qt5_wrap_cpp(sdr_schumann_MOC_SOURCES schumann.hh) + add_executable(sdr_schumann sdr_schumann.cc schumann.cc ${sdr_schumann_MOC_SOURCES}) + target_link_libraries(sdr_schumann ${LIBS} libsdr libsdr-gui) ENDIF(SDR_WITH_PORTAUDIO) IF(SDR_WITH_QT5 AND SDR_WITH_FFTW AND SDR_WITH_PORTAUDIO) diff --git a/examples/schumann.cc b/examples/schumann.cc new file mode 100644 index 0000000..75ffcbb --- /dev/null +++ b/examples/schumann.cc @@ -0,0 +1,2 @@ +#include "schumann.hh" + diff --git a/examples/schumann.hh b/examples/schumann.hh new file mode 100644 index 0000000..8738233 --- /dev/null +++ b/examples/schumann.hh @@ -0,0 +1,106 @@ +#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 diff --git a/examples/sdr_schumann.cc b/examples/sdr_schumann.cc new file mode 100644 index 0000000..3de44cc --- /dev/null +++ b/examples/sdr_schumann.cc @@ -0,0 +1,40 @@ +#include +#include +#include + +#include +#include +#include "schumann.hh" + + +using namespace sdr; + + + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + sdr::PortAudio::init(); + + sdr::PortSource src(32000, 1024); + Schumann schumann; + src.connect(&schumann); + + QMainWindow *win = new QMainWindow(); + sdr::gui::SpectrumView *view = new sdr::gui::SpectrumView(&schumann); + win->setCentralWidget(view); + win->show(); + + sdr::Queue::get().addIdle(&src, &sdr::PortSource::next); + + sdr::Queue::get().start(); + app.exec(); + + sdr::Queue::get().stop(); + sdr::Queue::get().wait(); + + sdr::PortAudio::terminate(); + + return 0; +}