diff --git a/mainwindow.cpp b/mainwindow.cpp index 796f990..fe02602 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -37,6 +37,9 @@ MainWindow::MainWindow() wave = new WaveformView(); addDockWidget(Qt::BottomDockWidgetArea, wave); connect(this, SIGNAL(viewChanged(off_t, off_t)), wave, SLOT(viewChanged(off_t, off_t))); + connect(this, SIGNAL(selectionChanged(std::pair, std::pair)), + wave, SLOT(selectionChanged(std::pair, std::pair))); + connect(this, SIGNAL(selectionCleared()), wave, SLOT(selectionCleared())); connect(dock, SIGNAL(openFile(QString)), this, SLOT(openFile(QString))); connect(dock->sampleRate, SIGNAL(textChanged(QString)), this, SLOT(setSampleRate(QString))); diff --git a/waveformview.cpp b/waveformview.cpp index 3643000..9c567e0 100644 --- a/waveformview.cpp +++ b/waveformview.cpp @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include "grsamplebuffer.h" #include "memory_sink.h" #include "memory_source.h" @@ -37,7 +39,7 @@ WaveformView::WaveformView() } } -void WaveformView::inputSourceChanged(AbstractSampleSource *src) +void WaveformView::refreshSources() { sampleSources.clear(); @@ -45,8 +47,19 @@ void WaveformView::inputSourceChanged(AbstractSampleSource *src) auto iq_mem_source = gr::blocks::memory_source::make(8); auto iq_mem_sink = gr::blocks::memory_sink::make(8); auto multiply = gr::blocks::multiply_const_cc::make(20); - iq_tb->connect(iq_mem_source, 0, multiply, 0); - iq_tb->connect(multiply, 0, iq_mem_sink, 0); + if (selection) { + float centre = (selectionFreq.first + selectionFreq.second) / 2; + float cutoff = std::abs(selectionFreq.first - centre); + auto lp_taps = gr::filter::firdes::low_pass(1.0, 1.0, cutoff, cutoff / 2); + auto filter = gr::filter::freq_xlating_fir_filter_ccf::make(1, lp_taps, centre, 1.0); + + iq_tb->connect(iq_mem_source, 0, filter, 0); + iq_tb->connect(filter, 0, multiply, 0); + iq_tb->connect(multiply, 0, iq_mem_sink, 0); + } else { + iq_tb->connect(iq_mem_source, 0, multiply, 0); + iq_tb->connect(multiply, 0, iq_mem_sink, 0); + } gr::top_block_sptr quad_demod_tb = gr::make_top_block("quad_demod"); auto quad_demod_mem_source = gr::blocks::memory_source::make(8); @@ -55,23 +68,42 @@ void WaveformView::inputSourceChanged(AbstractSampleSource *src) quad_demod_tb->connect(quad_demod_mem_source, 0, quad_demod, 0); quad_demod_tb->connect(quad_demod, 0, quad_demod_mem_sink, 0); + sampleSources.emplace_back(new GRSampleBuffer, std::complex>(mainSampleSource, iq_tb, iq_mem_source, iq_mem_sink)); + sampleSources.emplace_back(new GRSampleBuffer, float>(dynamic_cast>*>(sampleSources[0].get()), quad_demod_tb, quad_demod_mem_source, quad_demod_mem_sink)); + update(); +} + +void WaveformView::inputSourceChanged(AbstractSampleSource *src) +{ auto derived = dynamic_cast>*>(src); if (derived == nullptr) throw new std::runtime_error("SampleSource doesn't provide correct type for GRSampleBuffer"); - sampleSources.emplace_back(new GRSampleBuffer, std::complex>(derived, iq_tb, iq_mem_source, iq_mem_sink)); - sampleSources.emplace_back(new GRSampleBuffer, float>(derived, quad_demod_tb, quad_demod_mem_source, quad_demod_mem_sink)); - update(); + mainSampleSource = derived; + refreshSources(); } void WaveformView::viewChanged(off_t firstSample, off_t lastSample) { this->firstSample = firstSample; this->lastSample = lastSample; - qDebug() << "viewChanged(" << firstSample << ", " << lastSample << ")"; update(); } +void WaveformView::selectionChanged(std::pair selectionTime, std::pair selectionFreq) +{ + this->selectionTime = selectionTime; + this->selectionFreq = selectionFreq; + selection = true; + refreshSources(); +} + +void WaveformView::selectionCleared() +{ + selection = false; + refreshSources(); +} + void WaveformView::paintEvent(QPaintEvent *event) { if (lastSample - firstSample <= 0) return; diff --git a/waveformview.h b/waveformview.h index 0bc84fc..5ab6911 100644 --- a/waveformview.h +++ b/waveformview.h @@ -33,15 +33,22 @@ public: public slots: void inputSourceChanged(AbstractSampleSource *input); void viewChanged(off_t firstSample, off_t lastSample); + void selectionChanged(std::pair selectionTime, std::pair selectionFreq); + void selectionCleared(); protected: void paintEvent(QPaintEvent *event); private: + SampleSource> *mainSampleSource = nullptr; std::vector> sampleSources; off_t firstSample = 0; off_t lastSample = 0; + bool selection = false; + std::pair selectionTime; + std::pair selectionFreq; QRgb colormap[255]; + void refreshSources(); void plot(QPainter *painter, QRect &rect, float *samples, off_t count, int step); }; \ No newline at end of file