From 249e04e69cb83537f1cd71a4bcbbfd9a6ae244a9 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 15 Oct 2015 01:35:03 -0400 Subject: [PATCH] Move DC blocking filter to SDRThread - DC blocker + Channelizer too heavy together --- src/sdr/SDRPostThread.cpp | 21 ++------------------- src/sdr/SDRPostThread.h | 1 - src/sdr/SoapySDRThread.cpp | 26 +++++++++++++++++--------- src/sdr/SoapySDRThread.h | 3 ++- 4 files changed, 21 insertions(+), 30 deletions(-) diff --git a/src/sdr/SDRPostThread.cpp b/src/sdr/SDRPostThread.cpp index fc2f8ae..237b744 100644 --- a/src/sdr/SDRPostThread.cpp +++ b/src/sdr/SDRPostThread.cpp @@ -18,8 +18,6 @@ SDRPostThread::SDRPostThread() : IOThread() { nRunDemods = 0; doRefresh.store(false); - - dcFilter = iirfilt_crcf_create_dc_blocker(0.0005); } SDRPostThread::~SDRPostThread() { @@ -179,23 +177,8 @@ void SDRPostThread::run() { // fpData[i] = _lut[*((uint16_t*)&data_in->data[2*i])]; // } // } - - if (dataSize > fpData.capacity()) { - fpData.reserve(dataSize); - } - if (dataSize != fpData.size()) { - fpData.resize(dataSize); - } - - if (data_in->dcCorrected) { - fpData.assign(data_in->data.begin(), data_in->data.end()); - } else { - iirfilt_crcf_execute_block(dcFilter, &data_in->data[0], dataSize, &fpData[0]); - } if (iqVisualQueue != NULL || iqDataOutQueue != NULL) { - int num_vis_samples = fpData.size(); - bool doIQVis = iqVisualQueue && !iqVisualQueue->full(); bool doIQOut = iqDataOutQueue != NULL; @@ -204,7 +187,7 @@ void SDRPostThread::run() { iqDataOut->frequency = data_in->frequency; iqDataOut->sampleRate = data_in->sampleRate; - iqDataOut->data.assign(fpData.begin(), fpData.begin() + num_vis_samples); + iqDataOut->data.assign(data_in->data.begin(), data_in->data.begin() + dataSize); if (doIQVis) { iqVisualQueue->push(iqDataOut); @@ -234,7 +217,7 @@ void SDRPostThread::run() { // channelize data // firpfbch2 output rate is 2 x ( input rate / channels ) for (int i = 0, iMax = dataSize; i < iMax; i+=numChannels/2) { - firpfbch2_crcf_execute(channelizer, &fpData[i], &dataOut[i * 2]); + firpfbch2_crcf_execute(channelizer, &data_in->data[i], &dataOut[i * 2]); } for (int i = 0, iMax = numChannels; i < iMax; i++) { diff --git a/src/sdr/SDRPostThread.h b/src/sdr/SDRPostThread.h index c638c90..d42ea54 100644 --- a/src/sdr/SDRPostThread.h +++ b/src/sdr/SDRPostThread.h @@ -28,7 +28,6 @@ protected: std::mutex busy_demod; std::vector demodulators; - iirfilt_crcf dcFilter; std::atomic_bool swapIQ; private: diff --git a/src/sdr/SoapySDRThread.cpp b/src/sdr/SoapySDRThread.cpp index fa2d5c5..9104351 100644 --- a/src/sdr/SoapySDRThread.cpp +++ b/src/sdr/SoapySDRThread.cpp @@ -29,6 +29,8 @@ SDRThread::SDRThread() : IOThread() { hasPPM.store(false); hasHardwareDC.store(false); numChannels.store(8); + + dcFilter = iirfilt_crcf_create_dc_blocker(0.0005); } SDRThread::~SDRThread() { @@ -88,7 +90,7 @@ void SDRThread::init() { numChannels.store(getOptimalChannelCount(sampleRate.load())); numElems.store(getOptimalElementCount(sampleRate.load(), 30)); - + inpBuffer.data.resize(numElems.load()); buffs[0] = malloc(numElems * 2 * sizeof(float)); } @@ -104,26 +106,31 @@ void SDRThread::readStream(SDRThreadIQDataQueue* iqDataOutQueue) { int flags; long long timeNs; - SDRThreadIQData *dataOut = buffers.getBuffer(); - if (dataOut->data.size() != numElems) { - dataOut->data.resize(numElems); - } int n_read = 0; while (n_read != numElems && !terminated) { int n_stream_read = device->readStream(stream, buffs, numElems-n_read, flags, timeNs); if (n_stream_read > 0) { - memcpy(&dataOut->data[n_read], buffs[0], n_stream_read * sizeof(float) * 2); + memcpy(&inpBuffer.data[n_read], buffs[0], n_stream_read * sizeof(float) * 2); n_read += n_stream_read; } else { - dataOut->data.resize(n_read); break; } } - // std::cout << n_read << std::endl; - if (n_read > 0 && !terminated) { + SDRThreadIQData *dataOut = buffers.getBuffer(); + + if (hasHardwareDC) { + dataOut->data.assign(inpBuffer.data.begin(), inpBuffer.data.begin()+n_read); + } else { + if (dataOut->data.size() != n_read) { + dataOut->data.resize(n_read); + } + iirfilt_crcf_execute_block(dcFilter, &inpBuffer.data[0], n_read, &dataOut->data[0]); + } + + dataOut->setRefCount(1); dataOut->frequency = frequency.load(); dataOut->sampleRate = sampleRate.load(); @@ -154,6 +161,7 @@ void SDRThread::readLoop() { sampleRate.store(device->getSampleRate(SOAPY_SDR_RX,0)); numChannels.store(getOptimalChannelCount(sampleRate.load())); numElems.store(getOptimalElementCount(sampleRate.load(), 60)); + inpBuffer.data.resize(numElems.load()); free(buffs[0]); buffs[0] = malloc(numElems.load() * 2 * sizeof(float)); rate_changed.store(false); diff --git a/src/sdr/SoapySDRThread.h b/src/sdr/SoapySDRThread.h index 53b34de..b64a684 100644 --- a/src/sdr/SoapySDRThread.h +++ b/src/sdr/SoapySDRThread.h @@ -77,7 +77,8 @@ protected: SoapySDR::Device *device; void *buffs[1]; ReBuffer buffers; - + iirfilt_crcf dcFilter; + SDRThreadIQData inpBuffer; std::atomic deviceConfig; std::atomic deviceInfo;