mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2025-07-19 01:55:17 -04:00
Fix channel gap on upper edge of spectrum
This commit is contained in:
parent
f1475fb9be
commit
6ee51711db
@ -63,8 +63,8 @@ void SDRPostThread::initPFBChannelizer() {
|
|||||||
|
|
||||||
chanBw = (sampleRate / numChannels);
|
chanBw = (sampleRate / numChannels);
|
||||||
|
|
||||||
chanCenters.resize(numChannels);
|
chanCenters.resize(numChannels+1);
|
||||||
demodChannelActive.resize(numChannels);
|
demodChannelActive.resize(numChannels+1);
|
||||||
|
|
||||||
// std::cout << "Channel bandwidth spacing: " << (chanBw) << std::endl;
|
// std::cout << "Channel bandwidth spacing: " << (chanBw) << std::endl;
|
||||||
}
|
}
|
||||||
@ -125,6 +125,7 @@ void SDRPostThread::updateChannels() {
|
|||||||
chanCenters[i] = frequency + ofs;
|
chanCenters[i] = frequency + ofs;
|
||||||
chanCenters[i+(numChannels/2)] = frequency - (sampleRate/2) + ofs;
|
chanCenters[i+(numChannels/2)] = frequency - (sampleRate/2) + ofs;
|
||||||
}
|
}
|
||||||
|
chanCenters[numChannels] = frequency + (sampleRate/2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDRPostThread::run() {
|
void SDRPostThread::run() {
|
||||||
@ -238,7 +239,7 @@ void SDRPostThread::run() {
|
|||||||
for (int i = 0; i < nRunDemods; i++) {
|
for (int i = 0; i < nRunDemods; i++) {
|
||||||
DemodulatorInstance *demod = runDemods[i];
|
DemodulatorInstance *demod = runDemods[i];
|
||||||
long long minDelta = data_in->sampleRate;
|
long long minDelta = data_in->sampleRate;
|
||||||
for (int j = 0, jMax = numChannels; j < jMax; j++) {
|
for (int j = 0, jMax = numChannels+1; j < jMax; j++) {
|
||||||
// Distance from channel center to demod center
|
// Distance from channel center to demod center
|
||||||
long long fdelta = abs(demod->getFrequency() - chanCenters[j]);
|
long long fdelta = abs(demod->getFrequency() - chanCenters[j]);
|
||||||
if (fdelta < minDelta) {
|
if (fdelta < minDelta) {
|
||||||
@ -259,7 +260,7 @@ void SDRPostThread::run() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Run channels
|
// Run channels
|
||||||
for (int i = 0; i < numChannels; i++) {
|
for (int i = 0; i < numChannels+1; i++) {
|
||||||
bool doVis = (activeDemodChannel == i) && (iqActiveDemodVisualQueue != NULL) && !iqActiveDemodVisualQueue->full();
|
bool doVis = (activeDemodChannel == i) && (iqActiveDemodVisualQueue != NULL) && !iqActiveDemodVisualQueue->full();
|
||||||
|
|
||||||
DemodulatorThreadIQData *demodDataOut = buffers.getBuffer();
|
DemodulatorThreadIQData *demodDataOut = buffers.getBuffer();
|
||||||
@ -277,18 +278,26 @@ void SDRPostThread::run() {
|
|||||||
demodDataOut->data.resize(chanDataSize);
|
demodDataOut->data.resize(chanDataSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int idx = i;
|
||||||
|
|
||||||
|
// Extra channel wraps lower side band of lowest channel
|
||||||
|
// to fix frequency gap on upper side of spectrum
|
||||||
|
if (i == numChannels) {
|
||||||
|
idx = (numChannels/2);
|
||||||
|
}
|
||||||
|
|
||||||
// prepare channel data buffer
|
// prepare channel data buffer
|
||||||
if (i == 0) { // Channel 0 requires DC correction
|
if (i == 0) { // Channel 0 requires DC correction
|
||||||
if (dcBuf.size() != chanDataSize) {
|
if (dcBuf.size() != chanDataSize) {
|
||||||
dcBuf.resize(chanDataSize);
|
dcBuf.resize(chanDataSize);
|
||||||
}
|
}
|
||||||
for (int j = 0, idx = i; j < chanDataSize; j++) {
|
for (int j = 0; j < chanDataSize; j++) {
|
||||||
idx += numChannels;
|
idx += numChannels;
|
||||||
dcBuf[j] = dataOut[idx];
|
dcBuf[j] = dataOut[idx];
|
||||||
}
|
}
|
||||||
iirfilt_crcf_execute_block(dcFilter, &dcBuf[0], chanDataSize, &demodDataOut->data[0]);
|
iirfilt_crcf_execute_block(dcFilter, &dcBuf[0], chanDataSize, &demodDataOut->data[0]);
|
||||||
} else {
|
} else {
|
||||||
for (int j = 0, idx = i; j < chanDataSize; j++) {
|
for (int j = 0; j < chanDataSize; j++) {
|
||||||
idx += numChannels;
|
idx += numChannels;
|
||||||
demodDataOut->data[j] = dataOut[idx];
|
demodDataOut->data[j] = dataOut[idx];
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user