mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2025-09-10 02:37:59 -04:00
eliminate fp/int IQ data conversions
This commit is contained in:
parent
b487cf9901
commit
45b223aed9
@ -96,7 +96,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) {
|
|||||||
// std::this_thread::yield();
|
// std::this_thread::yield();
|
||||||
//#endif
|
//#endif
|
||||||
if (!wxGetApp().getIQVisualQueue()->empty()) {
|
if (!wxGetApp().getIQVisualQueue()->empty()) {
|
||||||
SDRThreadIQData *iqData;
|
DemodulatorThreadIQData *iqData;
|
||||||
wxGetApp().getIQVisualQueue()->pop(iqData);
|
wxGetApp().getIQVisualQueue()->pop(iqData);
|
||||||
|
|
||||||
if (iqData && iqData->data.size()) {
|
if (iqData && iqData->data.size()) {
|
||||||
|
@ -30,7 +30,7 @@ bool CubicSDR::OnInit() {
|
|||||||
sdrPostThread = new SDRPostThread();
|
sdrPostThread = new SDRPostThread();
|
||||||
|
|
||||||
iqPostDataQueue = new SDRThreadIQDataQueue;
|
iqPostDataQueue = new SDRThreadIQDataQueue;
|
||||||
iqVisualQueue = new SDRThreadIQDataQueue;
|
iqVisualQueue = new DemodulatorThreadInputQueue;
|
||||||
iqVisualQueue->set_max_num_items(1);
|
iqVisualQueue->set_max_num_items(1);
|
||||||
|
|
||||||
sdrThread->setIQDataOutQueue(iqPostDataQueue);
|
sdrThread->setIQDataOutQueue(iqPostDataQueue);
|
||||||
@ -115,7 +115,7 @@ DemodulatorThreadOutputQueue* CubicSDR::getAudioVisualQueue() {
|
|||||||
return audioVisualQueue;
|
return audioVisualQueue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDRThreadIQDataQueue* CubicSDR::getIQVisualQueue() {
|
DemodulatorThreadInputQueue* CubicSDR::getIQVisualQueue() {
|
||||||
return iqVisualQueue;
|
return iqVisualQueue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ public:
|
|||||||
int getFrequency();
|
int getFrequency();
|
||||||
|
|
||||||
DemodulatorThreadOutputQueue* getAudioVisualQueue();
|
DemodulatorThreadOutputQueue* getAudioVisualQueue();
|
||||||
SDRThreadIQDataQueue* getIQVisualQueue();
|
DemodulatorThreadInputQueue* getIQVisualQueue();
|
||||||
DemodulatorMgr &getDemodMgr();
|
DemodulatorMgr &getDemodMgr();
|
||||||
|
|
||||||
void bindDemodulator(DemodulatorInstance *demod);
|
void bindDemodulator(DemodulatorInstance *demod);
|
||||||
@ -50,8 +50,8 @@ private:
|
|||||||
SDRPostThread *sdrPostThread;
|
SDRPostThread *sdrPostThread;
|
||||||
|
|
||||||
SDRThreadCommandQueue* threadCmdQueueSDR;
|
SDRThreadCommandQueue* threadCmdQueueSDR;
|
||||||
SDRThreadIQDataQueue* iqVisualQueue;
|
|
||||||
SDRThreadIQDataQueue* iqPostDataQueue;
|
SDRThreadIQDataQueue* iqPostDataQueue;
|
||||||
|
DemodulatorThreadInputQueue* iqVisualQueue;
|
||||||
DemodulatorThreadOutputQueue* audioVisualQueue;
|
DemodulatorThreadOutputQueue* audioVisualQueue;
|
||||||
|
|
||||||
std::thread *t_SDR;
|
std::thread *t_SDR;
|
||||||
|
@ -55,7 +55,7 @@ class DemodulatorThreadIQData: public ReferenceCounter {
|
|||||||
public:
|
public:
|
||||||
unsigned int frequency;
|
unsigned int frequency;
|
||||||
unsigned int bandwidth;
|
unsigned int bandwidth;
|
||||||
std::vector<signed char> data;
|
std::vector<liquid_float_complex> data;
|
||||||
|
|
||||||
DemodulatorThreadIQData() :
|
DemodulatorThreadIQData() :
|
||||||
frequency(0), bandwidth(0) {
|
frequency(0), bandwidth(0) {
|
||||||
|
@ -166,9 +166,9 @@ void DemodulatorPreThread::threadMain() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// std::lock_guard < std::mutex > lock(inp->m_mutex);
|
// std::lock_guard < std::mutex > lock(inp->m_mutex);
|
||||||
std::vector<signed char> *data = &inp->data;
|
std::vector<liquid_float_complex> *data = &inp->data;
|
||||||
if (data->size()) {
|
if (data->size()) {
|
||||||
int bufSize = data->size() / 2;
|
int bufSize = data->size();
|
||||||
|
|
||||||
if (in_buf_data.size() != bufSize) {
|
if (in_buf_data.size() != bufSize) {
|
||||||
if (in_buf_data.capacity() < bufSize) {
|
if (in_buf_data.capacity() < bufSize) {
|
||||||
@ -179,15 +179,12 @@ void DemodulatorPreThread::threadMain() {
|
|||||||
out_buf_data.resize(bufSize);
|
out_buf_data.resize(bufSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
in_buf_data.assign(inp->data.begin(),inp->data.end());
|
||||||
|
|
||||||
liquid_float_complex *in_buf = &in_buf_data[0];
|
liquid_float_complex *in_buf = &in_buf_data[0];
|
||||||
liquid_float_complex *out_buf = &out_buf_data[0];
|
liquid_float_complex *out_buf = &out_buf_data[0];
|
||||||
liquid_float_complex *temp_buf = NULL;
|
liquid_float_complex *temp_buf = NULL;
|
||||||
|
|
||||||
for (int i = 0; i < bufSize; i++) {
|
|
||||||
in_buf[i].real = (float) (*data)[i * 2] / 127.0f;
|
|
||||||
in_buf[i].imag = (float) (*data)[i * 2 + 1] / 127.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shift_freq != 0) {
|
if (shift_freq != 0) {
|
||||||
if (shift_freq < 0) {
|
if (shift_freq < 0) {
|
||||||
nco_crcf_mix_block_up(nco_shift, in_buf, out_buf, bufSize);
|
nco_crcf_mix_block_up(nco_shift, in_buf, out_buf, bufSize);
|
||||||
|
@ -27,10 +27,10 @@ void SDRPostThread::removeDemodulator(DemodulatorInstance *demod) {
|
|||||||
void SDRPostThread::setIQDataInQueue(SDRThreadIQDataQueue* iqDataQueue) {
|
void SDRPostThread::setIQDataInQueue(SDRThreadIQDataQueue* iqDataQueue) {
|
||||||
iqDataInQueue = iqDataQueue;
|
iqDataInQueue = iqDataQueue;
|
||||||
}
|
}
|
||||||
void SDRPostThread::setIQDataOutQueue(SDRThreadIQDataQueue* iqDataQueue) {
|
void SDRPostThread::setIQDataOutQueue(DemodulatorThreadInputQueue* iqDataQueue) {
|
||||||
iqDataOutQueue = iqDataQueue;
|
iqDataOutQueue = iqDataQueue;
|
||||||
}
|
}
|
||||||
void SDRPostThread::setIQVisualQueue(SDRThreadIQDataQueue *iqVisQueue) {
|
void SDRPostThread::setIQVisualQueue(DemodulatorThreadInputQueue *iqVisQueue) {
|
||||||
iqVisualQueue = iqVisQueue;
|
iqVisualQueue = iqVisQueue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,13 +47,12 @@ void SDRPostThread::threadMain() {
|
|||||||
|
|
||||||
dcFilter = iirfilt_crcf_create_dc_blocker(0.0005);
|
dcFilter = iirfilt_crcf_create_dc_blocker(0.0005);
|
||||||
|
|
||||||
liquid_float_complex x, y;
|
|
||||||
|
|
||||||
std::cout << "SDR post-processing thread started.." << std::endl;
|
std::cout << "SDR post-processing thread started.." << std::endl;
|
||||||
|
|
||||||
std::deque<DemodulatorThreadIQData *> buffers;
|
std::deque<DemodulatorThreadIQData *> buffers;
|
||||||
std::deque<DemodulatorThreadIQData *>::iterator buffers_i;
|
std::deque<DemodulatorThreadIQData *>::iterator buffers_i;
|
||||||
std::vector<signed char> dataOut;
|
std::vector<liquid_float_complex> fpData;
|
||||||
|
std::vector<liquid_float_complex> dataOut;
|
||||||
|
|
||||||
while (!terminated) {
|
while (!terminated) {
|
||||||
SDRThreadIQData *data_in;
|
SDRThreadIQData *data_in;
|
||||||
@ -62,34 +61,35 @@ void SDRPostThread::threadMain() {
|
|||||||
// std::lock_guard < std::mutex > lock(data_in->m_mutex);
|
// std::lock_guard < std::mutex > lock(data_in->m_mutex);
|
||||||
|
|
||||||
if (data_in && data_in->data.size()) {
|
if (data_in && data_in->data.size()) {
|
||||||
if (data_in->data.size() > dataOut.capacity()) {
|
int dataSize = data_in->data.size()/2;
|
||||||
dataOut.reserve(data_in->data.size());
|
if (dataSize > fpData.capacity()) {
|
||||||
|
fpData.reserve(dataSize);
|
||||||
|
dataOut.reserve(dataSize);
|
||||||
|
}
|
||||||
|
if (dataSize != fpData.size()) {
|
||||||
|
fpData.resize(dataSize);
|
||||||
|
dataOut.resize(dataSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
dataOut.assign(data_in->data.begin(), data_in->data.end());
|
for (int i = 0, iMax = dataSize; i < iMax; i++) {
|
||||||
|
fpData[i].real = (float) data_in->data[i * 2] / 127.0;
|
||||||
for (int i = 0, iMax = dataOut.size() / 2; i < iMax; i++) {
|
fpData[i].imag = (float) data_in->data[i * 2 + 1] / 127.0;
|
||||||
x.real = (float) dataOut[i * 2] / 127.0;
|
|
||||||
x.imag = (float) dataOut[i * 2 + 1] / 127.0;
|
|
||||||
|
|
||||||
iirfilt_crcf_execute(dcFilter, x, &y);
|
|
||||||
|
|
||||||
dataOut[i * 2] = (signed char) floor(y.real * 127.0);
|
|
||||||
dataOut[i * 2 + 1] = (signed char) floor(y.imag * 127.0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iirfilt_crcf_execute_block(dcFilter, &fpData[0], dataSize, &dataOut[0]);
|
||||||
|
|
||||||
if (iqDataOutQueue != NULL) {
|
if (iqDataOutQueue != NULL) {
|
||||||
SDRThreadIQData *visDataOut = new SDRThreadIQData;
|
DemodulatorThreadIQData *pipeDataOut = new DemodulatorThreadIQData;
|
||||||
|
|
||||||
visDataOut->frequency = data_in->frequency;
|
pipeDataOut->frequency = data_in->frequency;
|
||||||
visDataOut->bandwidth = data_in->bandwidth;
|
pipeDataOut->bandwidth = data_in->bandwidth;
|
||||||
visDataOut->data.assign(dataOut.begin(), dataOut.end());
|
pipeDataOut->data.assign(dataOut.begin(), dataOut.end());
|
||||||
iqDataOutQueue.load()->push(visDataOut);
|
iqDataOutQueue.load()->push(pipeDataOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iqVisualQueue != NULL && iqVisualQueue.load()->empty()) {
|
if (iqVisualQueue != NULL && iqVisualQueue.load()->empty()) {
|
||||||
SDRThreadIQData *visualDataOut = new SDRThreadIQData;
|
DemodulatorThreadIQData *visualDataOut = new DemodulatorThreadIQData;
|
||||||
visualDataOut->data.assign(dataOut.begin(), dataOut.begin() + (FFT_SIZE * 2));
|
visualDataOut->data.assign(dataOut.begin(), dataOut.begin() + FFT_SIZE);
|
||||||
iqVisualQueue.load()->push(visualDataOut);
|
iqVisualQueue.load()->push(visualDataOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,7 +148,7 @@ void SDRPostThread::threadMain() {
|
|||||||
demodDataOut->frequency = data_in->frequency;
|
demodDataOut->frequency = data_in->frequency;
|
||||||
demodDataOut->bandwidth = data_in->bandwidth;
|
demodDataOut->bandwidth = data_in->bandwidth;
|
||||||
demodDataOut->setRefCount(activeDemods);
|
demodDataOut->setRefCount(activeDemods);
|
||||||
demodDataOut->data.assign(dataOut.begin(), dataOut.begin() + dataOut.size());
|
demodDataOut->data.assign(dataOut.begin(), dataOut.end());
|
||||||
|
|
||||||
std::vector<DemodulatorInstance *>::iterator i;
|
std::vector<DemodulatorInstance *>::iterator i;
|
||||||
for (i = demodulators.begin(); i != demodulators.end(); i++) {
|
for (i = demodulators.begin(); i != demodulators.end(); i++) {
|
||||||
|
@ -12,8 +12,8 @@ public:
|
|||||||
void removeDemodulator(DemodulatorInstance *demod);
|
void removeDemodulator(DemodulatorInstance *demod);
|
||||||
|
|
||||||
void setIQDataInQueue(SDRThreadIQDataQueue* iqDataQueue);
|
void setIQDataInQueue(SDRThreadIQDataQueue* iqDataQueue);
|
||||||
void setIQDataOutQueue(SDRThreadIQDataQueue* iqDataQueue);
|
void setIQDataOutQueue(DemodulatorThreadInputQueue* iqDataQueue);
|
||||||
void setIQVisualQueue(SDRThreadIQDataQueue* iqVisQueue);
|
void setIQVisualQueue(DemodulatorThreadInputQueue* iqVisQueue);
|
||||||
|
|
||||||
void threadMain();
|
void threadMain();
|
||||||
void terminate();
|
void terminate();
|
||||||
@ -21,9 +21,9 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
uint32_t sample_rate;
|
uint32_t sample_rate;
|
||||||
|
|
||||||
std::atomic<SDRThreadIQDataQueue *> iqDataOutQueue;
|
|
||||||
std::atomic<SDRThreadIQDataQueue *> iqDataInQueue;
|
std::atomic<SDRThreadIQDataQueue *> iqDataInQueue;
|
||||||
std::atomic<SDRThreadIQDataQueue *> iqVisualQueue;
|
std::atomic<DemodulatorThreadInputQueue *> iqDataOutQueue;
|
||||||
|
std::atomic<DemodulatorThreadInputQueue *> iqVisualQueue;
|
||||||
|
|
||||||
std::vector<DemodulatorInstance *> demodulators;
|
std::vector<DemodulatorInstance *> demodulators;
|
||||||
std::vector<DemodulatorInstance *> demodulators_add;
|
std::vector<DemodulatorInstance *> demodulators_add;
|
||||||
|
@ -73,7 +73,7 @@ void SpectrumCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
|
|||||||
SwapBuffers();
|
SwapBuffers();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpectrumCanvas::setData(std::vector<signed char> *data) {
|
void SpectrumCanvas::setData(std::vector<liquid_float_complex> *data) {
|
||||||
|
|
||||||
if (data && data->size()) {
|
if (data && data->size()) {
|
||||||
if (spectrum_points.size() < FFT_SIZE * 2) {
|
if (spectrum_points.size() < FFT_SIZE * 2) {
|
||||||
@ -81,8 +81,8 @@ void SpectrumCanvas::setData(std::vector<signed char> *data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < FFT_SIZE; i++) {
|
for (int i = 0; i < FFT_SIZE; i++) {
|
||||||
in[i][0] = (float) (*data)[i * 2] / 127.0f;
|
in[i][0] = (*data)[i].real;
|
||||||
in[i][1] = (float) (*data)[i * 2 + 1] / 127.0f;
|
in[i][1] = (*data)[i].imag;
|
||||||
}
|
}
|
||||||
|
|
||||||
fftw_execute(plan);
|
fftw_execute(plan);
|
||||||
|
@ -17,7 +17,7 @@ public:
|
|||||||
SpectrumCanvas(wxWindow *parent, int *attribList = NULL);
|
SpectrumCanvas(wxWindow *parent, int *attribList = NULL);
|
||||||
~SpectrumCanvas();
|
~SpectrumCanvas();
|
||||||
|
|
||||||
void setData(std::vector<signed char> *data);
|
void setData(std::vector<liquid_float_complex> *data);
|
||||||
private:
|
private:
|
||||||
void OnPaint(wxPaintEvent& event);
|
void OnPaint(wxPaintEvent& event);
|
||||||
|
|
||||||
|
@ -206,7 +206,7 @@ void WaterfallCanvas::OnKeyDown(wxKeyEvent& event) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WaterfallCanvas::setData(std::vector<signed char> *data) {
|
void WaterfallCanvas::setData(std::vector<liquid_float_complex> *data) {
|
||||||
|
|
||||||
if (data && data->size()) {
|
if (data && data->size()) {
|
||||||
if (spectrum_points.size() < FFT_SIZE * 2) {
|
if (spectrum_points.size() < FFT_SIZE * 2) {
|
||||||
@ -214,8 +214,8 @@ void WaterfallCanvas::setData(std::vector<signed char> *data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < FFT_SIZE; i++) {
|
for (int i = 0; i < FFT_SIZE; i++) {
|
||||||
in[i][0] = (float) (*data)[i * 2] / 127.0f;
|
in[i][0] = (*data)[i].real;
|
||||||
in[i][1] = (float) (*data)[i * 2 + 1] / 127.0f;
|
in[i][1] = (*data)[i].imag;
|
||||||
}
|
}
|
||||||
|
|
||||||
fftw_execute(plan);
|
fftw_execute(plan);
|
||||||
|
@ -21,7 +21,7 @@ public:
|
|||||||
WaterfallCanvas(wxWindow *parent, int *attribList = NULL);
|
WaterfallCanvas(wxWindow *parent, int *attribList = NULL);
|
||||||
~WaterfallCanvas();
|
~WaterfallCanvas();
|
||||||
|
|
||||||
void setData(std::vector<signed char> *data);
|
void setData(std::vector<liquid_float_complex> *data);
|
||||||
int GetFrequencyAt(float x);
|
int GetFrequencyAt(float x);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user