From 949292b2f8e21972f381dba6e50ad6064c7bedff Mon Sep 17 00:00:00 2001 From: pabr Date: Tue, 27 Jun 2017 23:16:30 +0200 Subject: [PATCH] Add rfscope: Spectrum scope with log scale and smoothing --- src/leansdr/gui.h | 83 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/src/leansdr/gui.h b/src/leansdr/gui.h index bbf8885..f0e13a9 100644 --- a/src/leansdr/gui.h +++ b/src/leansdr/gui.h @@ -421,6 +421,89 @@ namespace leansdr { } }; + template + struct rfscope : runnable { + unsigned long size; + unsigned long decimation; + float db0, dbrange, bw; + rfscope(scheduler *sch, pipebuf< complex > & _in, + const char *_name=NULL) + : runnable(sch, _name?_name:_in.name), + size(4096), decimation(DEFAULT_GUI_DECIMATION), + db0(-25), dbrange(50), bw(0.05), + in(_in), phase(0), g(sch, name), fft(NULL), filtered(NULL) { + } + void run() { + while ( in.readable() >= size ) { + if ( ! phase ) do_fft(in.rd()); + in.read(size); + if ( ++phase >= decimation ) phase = 0; + } + } + private: + pipereader< complex > in; + int phase; + gfx g; + cfft_engine *fft; + float *filtered; + + void do_fft(complex *input) { + g.events(); + draw_begin(); + if ( !fft || fft->n!=size ) { + if ( fft ) delete fft; + fft = new cfft_engine(size); + } + // Convert to complex and transform + complex *pin=input, *pend=pin+size; + complex data[size], *pout=data; + for ( int x=0; pinre = (float)pin->re; + pout->im = (float)pin->im; + } + fft->inplace(data, true); + float amp2[size]; + for ( int i=0; i &v = data[i];; + amp2[i] = (v.re*v.re + v.im*v.im)*size; + } + if ( ! filtered ) { + filtered = new float[size]; + for ( int i=0; i struct genscope : runnable { struct render {