mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2024-11-26 21:58:37 -05:00
Move DC blocking filter to SDRThread
- DC blocker + Channelizer too heavy together
This commit is contained in:
parent
938d10366c
commit
249e04e69c
@ -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++) {
|
||||
|
@ -28,7 +28,6 @@ protected:
|
||||
|
||||
std::mutex busy_demod;
|
||||
std::vector<DemodulatorInstance *> demodulators;
|
||||
iirfilt_crcf dcFilter;
|
||||
std::atomic_bool swapIQ;
|
||||
|
||||
private:
|
||||
|
@ -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);
|
||||
|
@ -77,7 +77,8 @@ protected:
|
||||
SoapySDR::Device *device;
|
||||
void *buffs[1];
|
||||
ReBuffer<SDRThreadIQData> buffers;
|
||||
|
||||
iirfilt_crcf dcFilter;
|
||||
SDRThreadIQData inpBuffer;
|
||||
std::atomic<DeviceConfig *> deviceConfig;
|
||||
std::atomic<SDRDeviceInfo *> deviceInfo;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user