diff --git a/sdrbase/CMakeLists.txt b/sdrbase/CMakeLists.txt index 116496169..6160697ed 100644 --- a/sdrbase/CMakeLists.txt +++ b/sdrbase/CMakeLists.txt @@ -111,6 +111,7 @@ set(sdrbase_SOURCES dsp/devicesamplesource.cpp dsp/devicesamplesink.cpp dsp/devicesamplemimo.cpp + dsp/devicesamplestatic.cpp device/deviceapi.cpp device/deviceenumerator.cpp @@ -249,6 +250,7 @@ set(sdrbase_HEADERS dsp/devicesamplesource.h dsp/devicesamplesink.h dsp/devicesamplemimo.h + dsp/devicesamplestatic.h device/deviceapi.h device/deviceenumerator.h diff --git a/sdrbase/dsp/devicesamplesink.cpp b/sdrbase/dsp/devicesamplesink.cpp index 6a1d271d7..4df53e54c 100644 --- a/sdrbase/dsp/devicesamplesink.cpp +++ b/sdrbase/dsp/devicesamplesink.cpp @@ -18,6 +18,7 @@ #include +#include "dsp/devicesamplestatic.h" #include "dsp/devicesamplesink.h" DeviceSampleSink::DeviceSampleSink() : @@ -52,23 +53,14 @@ qint64 DeviceSampleSink::calculateDeviceCenterFrequency( quint32 devSampleRate, bool transverterMode) { - qint64 deviceCenterFrequency = centerFrequency; - deviceCenterFrequency -= transverterMode ? transverterDeltaFrequency : 0; - deviceCenterFrequency = deviceCenterFrequency < 0 ? 0 : deviceCenterFrequency; - qint64 f_img = deviceCenterFrequency; - - deviceCenterFrequency -= calculateFrequencyShift(log2Interp, fcPos, devSampleRate); - f_img -= 2*calculateFrequencyShift(log2Interp, fcPos, devSampleRate); - - qDebug() << "DeviceSampleSink::calculateDeviceCenterFrequency:" - << " desired center freq: " << centerFrequency << " Hz" - << " device center freq: " << deviceCenterFrequency << " Hz" - << " device sample rate: " << devSampleRate << "S/s" - << " Actual sample rate: " << devSampleRate/(1< -#include + +#include "dsp/devicesamplestatic.h" +#include "dsp/devicesamplesource.h" DeviceSampleSource::DeviceSampleSource() : m_guiMessageQueue(0) @@ -51,24 +53,15 @@ qint64 DeviceSampleSource::calculateDeviceCenterFrequency( FrequencyShiftScheme frequencyShiftScheme, bool transverterMode) { - qint64 deviceCenterFrequency = centerFrequency; - deviceCenterFrequency -= transverterMode ? transverterDeltaFrequency : 0; - deviceCenterFrequency = deviceCenterFrequency < 0 ? 0 : deviceCenterFrequency; - qint64 f_img = deviceCenterFrequency; - - deviceCenterFrequency -= calculateFrequencyShift(log2Decim, fcPos, devSampleRate, frequencyShiftScheme); - f_img -= 2*calculateFrequencyShift(log2Decim, fcPos, devSampleRate, frequencyShiftScheme); - - qDebug() << "DeviceSampleSource::calculateDeviceCenterFrequency:" - << " frequencyShiftScheme: " << frequencyShiftScheme - << " desired center freq: " << centerFrequency << " Hz" - << " device center freq: " << deviceCenterFrequency << " Hz" - << " device sample rate: " << devSampleRate << "S/s" - << " Actual sample rate: " << devSampleRate/(1<. // +/////////////////////////////////////////////////////////////////////////////////// + +#include + +#include "devicesamplestatic.h" + +int64_t DeviceSampleStatic::calculateSourceDeviceCenterFrequency( + uint64_t centerFrequency, + int64_t transverterDeltaFrequency, + int log2Decim, + fcPos_t fcPos, + uint32_t devSampleRate, + FrequencyShiftScheme frequencyShiftScheme, + bool transverterMode) +{ + int64_t deviceCenterFrequency = centerFrequency; + deviceCenterFrequency -= transverterMode ? transverterDeltaFrequency : 0; + deviceCenterFrequency = deviceCenterFrequency < 0 ? 0 : deviceCenterFrequency; + int64_t f_img = deviceCenterFrequency; + + deviceCenterFrequency -= calculateSourceFrequencyShift(log2Decim, fcPos, devSampleRate, frequencyShiftScheme); + f_img -= 2*calculateSourceFrequencyShift(log2Decim, fcPos, devSampleRate, frequencyShiftScheme); + + qDebug() << "DeviceSampleStatic::calculateSourceDeviceCenterFrequency:" + << " frequencyShiftScheme: " << frequencyShiftScheme + << " desired center freq: " << centerFrequency << " Hz" + << " device center freq: " << deviceCenterFrequency << " Hz" + << " device sample rate: " << devSampleRate << "S/s" + << " Actual sample rate: " << devSampleRate/(1< 2: fc = +/- 1/2^n + * center + * | ^ | + * | |inf| | |sup| | + * ^ ^ + */ +int DeviceSampleStatic::calculateSourceFrequencyShift( + int log2Decim, + fcPos_t fcPos, + uint32_t devSampleRate, + FrequencyShiftScheme frequencyShiftScheme) +{ + if (frequencyShiftScheme == FSHIFT_STD) + { + if (log2Decim == 0) { // no shift at all + return 0; + } else if (log2Decim < 3) { + if (fcPos == FC_POS_INFRA) { // shift in the square next to center frequency + return -(devSampleRate / (1<<(log2Decim+1))); + } else if (fcPos == FC_POS_SUPRA) { + return devSampleRate / (1<<(log2Decim+1)); + } else { + return 0; + } + } else { + if (fcPos == FC_POS_INFRA) { // shift centered in the square next to center frequency + return -(devSampleRate / (1<<(log2Decim))); + } else if (fcPos == FC_POS_SUPRA) { + return devSampleRate / (1<<(log2Decim)); + } else { + return 0; + } + } + } + else // frequencyShiftScheme == FSHIFT_TXSYNC + { + if (fcPos == FC_POS_CENTER) { + return 0; + } + + int sign = fcPos == FC_POS_INFRA ? -1 : 1; + int halfSampleRate = devSampleRate / 2; // fractions are relative to sideband thus based on half the sample rate + + if (log2Decim == 0) { + return 0; + } else if (log2Decim == 1) { + return sign * (halfSampleRate / 2); // inf or sup: 1/2 + } else if (log2Decim == 2) { + return sign * ((halfSampleRate * 3) / 4); // inf, inf or sup, sup: 1/2 + 1/4 + } else if (log2Decim == 3) { + return sign * ((halfSampleRate * 5) / 8); // inf, inf, sup or sup, sup, inf: 1/2 + 1/4 - 1/8 = 5/8 + } else if (log2Decim == 4) { + return sign * ((halfSampleRate * 11) / 16); // inf, inf, sup, inf or sup, sup, inf, sup: 1/2 + 1/4 - 1/8 + 1/16 = 11/16 + } else if (log2Decim == 5) { + return sign * ((halfSampleRate * 21) / 32); // inf, inf, sup, inf, sup or sup, sup, inf, sup, inf: 1/2 + 1/4 - 1/8 + 1/16 - 1/32 = 21/32 + } else if (log2Decim == 6) { + return sign * ((halfSampleRate * 21) / 64); // inf, sup, inf, sup, inf, sup or sup, inf, sup, inf, sup, inf: 1/2 - 1/4 + 1/8 -1/16 + 1/32 - 1/64 = 21/64 + } else { + return 0; + } + } +} + +int64_t DeviceSampleStatic::calculateSinkDeviceCenterFrequency( + uint64_t centerFrequency, + int64_t transverterDeltaFrequency, + int log2Interp, + fcPos_t fcPos, + uint32_t devSampleRate, + bool transverterMode) +{ + int64_t deviceCenterFrequency = centerFrequency; + deviceCenterFrequency -= transverterMode ? transverterDeltaFrequency : 0; + deviceCenterFrequency = deviceCenterFrequency < 0 ? 0 : deviceCenterFrequency; + int64_t f_img = deviceCenterFrequency; + + deviceCenterFrequency -= calculateSinkFrequencyShift(log2Interp, fcPos, devSampleRate); + f_img -= 2*calculateSinkFrequencyShift(log2Interp, fcPos, devSampleRate); + + qDebug() << "DeviceSampleStatic::calculateSinkDeviceCenterFrequency:" + << " desired center freq: " << centerFrequency << " Hz" + << " device center freq: " << deviceCenterFrequency << " Hz" + << " device sample rate: " << devSampleRate << "S/s" + << " Actual sample rate: " << devSampleRate/(1<. // +/////////////////////////////////////////////////////////////////////////////////// + +#include + +class DeviceSampleStatic +{ +public: + typedef enum { + FC_POS_INFRA = 0, + FC_POS_SUPRA, + FC_POS_CENTER + } fcPos_t; + + typedef enum { + FSHIFT_STD = 0, // Standard Rx independent + FSHIFT_TXSYNC // Follows same scheme as Tx + } FrequencyShiftScheme; + + static int64_t calculateSourceDeviceCenterFrequency( + uint64_t centerFrequency, + int64_t transverterDeltaFrequency, + int log2Decim, + fcPos_t fcPos, + uint32_t devSampleRate, + FrequencyShiftScheme frequencyShiftScheme, + bool transverterMode = false + ); + + static int64_t calculateSourceCenterFrequency( + uint64_t deviceCenterFrequency, + int64_t transverterDeltaFrequency, + int log2Decim, + fcPos_t fcPos, + uint32_t devSampleRate, + FrequencyShiftScheme frequencyShiftScheme, + bool transverterMode = false + ); + + static int calculateSourceFrequencyShift( + int log2Decim, + fcPos_t fcPos, + uint32_t devSampleRate, + FrequencyShiftScheme frequencyShiftScheme + ); + + static int64_t calculateSinkDeviceCenterFrequency( + uint64_t centerFrequency, + int64_t transverterDeltaFrequency, + int log2Interp, + fcPos_t fcPos, + uint32_t devSampleRate, + bool transverterMode = false); + + static int64_t calculateSinkCenterFrequency( + uint64_t deviceCenterFrequency, + int64_t transverterDeltaFrequency, + int log2Interp, + fcPos_t fcPos, + uint32_t devSampleRate, + bool transverterMode = false); + + static int calculateSinkFrequencyShift( + int log2Interp, + fcPos_t fcPos, + uint32_t devSampleRate); +};