SDRPlusPlus/core/src/signal_path/iq_frontend.h

104 wiersze
3.0 KiB
C++

#pragma once
#include "../dsp/buffer/frame_buffer.h"
#include "../dsp/buffer/reshaper.h"
#include "../dsp/multirate/power_decimator.h"
#include "../dsp/correction/dc_blocker.h"
#include "../dsp/chain.h"
#include "../dsp/routing/splitter.h"
#include "../dsp/channel/rx_vfo.h"
#include "../dsp/sink/handler_sink.h"
#include <fftw3.h>
class IQFrontEnd {
public:
~IQFrontEnd();
enum FFTWindow {
RECTANGULAR,
BLACKMAN,
NUTTALL
};
void init(dsp::stream<dsp::complex_t>* in, double sampleRate, bool buffering, int decimRatio, bool dcBlocking, int fftSize, double fftRate, FFTWindow fftWindow, float* (*acquireFFTBuffer)(void* ctx), void (*releaseFFTBuffer)(void* ctx), void* fftCtx);
void setInput(dsp::stream<dsp::complex_t>* in);
void setSampleRate(double sampleRate);
inline double getSampleRate() { return _sampleRate / _decimRatio; }
void setBuffering(bool enabled);
void setDecimation(int ratio);
void setDCBlocking(bool enabled);
void bindIQStream(dsp::stream<dsp::complex_t>* stream);
void unbindIQStream(dsp::stream<dsp::complex_t>* stream);
dsp::channel::RxVFO* addVFO(std::string name, double sampleRate, double bandwidth, double offset);
void removeVFO(std::string name);
void setFFTSize(int size);
void setFFTRate(double rate);
void setFFTWindow(FFTWindow fftWindow);
void flushInputBuffer();
void start();
void stop();
double getEffectiveSamplerate();
protected:
static void handler(dsp::complex_t* data, int count, void* ctx);
void updateFFTPath(bool updateWaterfall = false);
static inline double genDCBlockRate(double sampleRate) {
return 50.0 / sampleRate;
}
static inline void genReshapeParams(double sampleRate, int size, double rate, int& skip, int& nzSampCount) {
int fftInterval = round(sampleRate / rate);
nzSampCount = std::min<int>(fftInterval, size);
skip = fftInterval - nzSampCount;
}
// Input buffer
dsp::buffer::SampleFrameBuffer<dsp::complex_t> inBuf;
// Pre-processing chain
dsp::multirate::PowerDecimator<dsp::complex_t> decim;
dsp::correction::DCBlocker<dsp::complex_t> dcBlock;
dsp::chain<dsp::complex_t> preproc;
// Splitting
dsp::routing::Splitter<dsp::complex_t> split;
// FFT
dsp::stream<dsp::complex_t> fftIn;
dsp::buffer::Reshaper<dsp::complex_t> reshape;
dsp::sink::Handler<dsp::complex_t> fftSink;
// VFOs
std::map<std::string, dsp::stream<dsp::complex_t>*> vfoStreams;
std::map<std::string, dsp::channel::RxVFO*> vfos;
// Parameters
double _sampleRate;
double _decimRatio;
int _fftSize;
double _fftRate;
FFTWindow _fftWindow;
float* (*_acquireFFTBuffer)(void* ctx);
void (*_releaseFFTBuffer)(void* ctx);
void* _fftCtx;
// Processing data
int _nzFFTSize;
float* fftWindowBuf;
fftwf_complex *fftInBuf, *fftOutBuf;
fftwf_plan fftwPlan;
float* fftDbOut;
double effectiveSr;
bool _init = false;
};