kopia lustrzana https://github.com/AlexandreRouma/SDRPlusPlus
104 wiersze
3.0 KiB
C++
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;
|
|
|
|
}; |