Skip to content

Commit

Permalink
Move DC blocking filter to SDRThread
Browse files Browse the repository at this point in the history
- DC blocker + Channelizer too heavy together
  • Loading branch information
cjcliffe committed Oct 15, 2015
1 parent 938d103 commit 249e04e
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 30 deletions.
21 changes: 2 additions & 19 deletions src/sdr/SDRPostThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ SDRPostThread::SDRPostThread() : IOThread() {
nRunDemods = 0;

doRefresh.store(false);

dcFilter = iirfilt_crcf_create_dc_blocker(0.0005);
}

SDRPostThread::~SDRPostThread() {
Expand Down Expand Up @@ -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;

Expand All @@ -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);
Expand Down Expand Up @@ -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++) {
Expand Down
1 change: 0 additions & 1 deletion src/sdr/SDRPostThread.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ class SDRPostThread : public IOThread {

std::mutex busy_demod;
std::vector<DemodulatorInstance *> demodulators;
iirfilt_crcf dcFilter;
std::atomic_bool swapIQ;

private:
Expand Down
26 changes: 17 additions & 9 deletions src/sdr/SoapySDRThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -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));
}
Expand All @@ -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();
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 2 additions & 1 deletion src/sdr/SoapySDRThread.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ class SDRThread : public IOThread {
SoapySDR::Device *device;
void *buffs[1];
ReBuffer<SDRThreadIQData> buffers;

iirfilt_crcf dcFilter;
SDRThreadIQData inpBuffer;
std::atomic<DeviceConfig *> deviceConfig;
std::atomic<SDRDeviceInfo *> deviceInfo;

Expand Down

0 comments on commit 249e04e

Please sign in to comment.