eliminate fp/int IQ data conversions

This commit is contained in:
Charles J. Cliffe 2014-12-26 16:15:35 -05:00
parent b487cf9901
commit 45b223aed9
11 changed files with 47 additions and 50 deletions

View File

@ -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()) {

View File

@ -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;
} }

View File

@ -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;

View File

@ -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) {

View File

@ -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);

View File

@ -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++) {

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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: