5#ifndef PICOSCENES_PLATFORM_ABSTRACTSDRFRONTEND_HXX
6#define PICOSCENES_PLATFORM_ABSTRACTSDRFRONTEND_HXX
14#include "BBSignalsFileWriter.hxx"
38 virtual CS16Vector
generateSignal(
const ModularPicoScenesTxFrame& frame, uint8_t numTxAntenna) = 0;
46 auto numSamples =
static_cast<int64_t
>(signals.size()) / numTxAntenna;
48 std::vector multiChannelSignals(numTxAntenna, CS16Vector(numSamples));
49 for (
auto channelIndex = 0; channelIndex < numTxAntenna; channelIndex++) {
50 Intrinsics::fastCopyN(signals.cbegin() + numSamples * channelIndex, numSamples, multiChannelSignals[channelIndex].begin());
53 return multiChannelSignals;
65 virtual void prebuildSignals(ModularPicoScenesTxFrame& frame,
const uint8_t numTxAntenna) {
78 virtual int32_t
transmitSignals(
const std::vector<const void*>& signals, int64_t bufferLength,
double postfixDuration) = 0;
80 virtual int transmitSignalsContinuously(
const std::vector<const void*>& multiChannelHeaders, int64_t numSignalsPerAntenna,
bool burstStart,
bool burstEnd) = 0;
91 int transmit(
const ModularPicoScenesTxFrame& frame)
override {
92 static std::shared_ptr<BBSignalsFileWriter<std::complex<int16_t>>> signalWriter;
98 signalWriter = std::make_shared<BBSignalsFileWriter<std::complex<int16_t>>>(*txSignalDumpFilePath);
103 std::vector<CS16Vector> inplaceGeneratedSignals{};
104 if (frame.prebuiltSignals.empty()) {
106 txResult =
transmitSignal(inplaceGeneratedSignals, frame.txParameters.postfixPaddingTime);
108 txResult =
transmitSignal(frame.prebuiltSignals, frame.txParameters.postfixPaddingTime);
110 const auto& ref2Signals = !frame.prebuiltSignals.empty() ? frame.prebuiltSignals : inplaceGeneratedSignals;
125 virtual size_t transmitSignal(
const CS16Vector& signals,
const uint8_t numTxChannels,
const double postfixDuration) {
126 int64_t numSignalsPerAntenna = signals.size() / numTxChannels;
128 auto signalHeaders = std::vector<const void*>(numTxChannels);
129 for (
auto channelIndex = 0; channelIndex < numTxChannels; channelIndex++) {
130 signalHeaders[channelIndex] = signals.data() + channelIndex * numSignalsPerAntenna;
133 return transmitSignals(signalHeaders, numSignalsPerAntenna, postfixDuration);
136 virtual size_t transmitSignal(
const std::vector<CS16Vector>& multiChannelSignals,
const double postfixDuration) {
137 int64_t numSignalsPerAntenna = multiChannelSignals[0].size();
138 uint8_t numTxChannels = multiChannelSignals.size();
140 auto signalHeaders = std::vector<const void*>(numTxChannels);
141 for (
auto channelIndex = 0; channelIndex < numTxChannels; channelIndex++) {
142 signalHeaders[channelIndex] = multiChannelSignals[channelIndex].data();
145 return transmitSignals(signalHeaders, numSignalsPerAntenna, postfixDuration);
148 virtual int32_t
transmitSignalInBatchedSingleBurst(
const std::vector<std::vector<const void*>>& multipleSignals,
const std::vector<int64_t>& signalLength,
const std::vector<double>& postfixDurations, uint32_t repeat) = 0;
150 int transmitFramesInBatch(
const std::vector<const ModularPicoScenesTxFrame*>& frames,
const uint32_t repeat)
override {
151 static std::shared_ptr<BBSignalsFileWriter<std::complex<int16_t>>> signalWriter;
157 signalWriter = std::make_shared<BBSignalsFileWriter<std::complex<int16_t>>>(*txSignalDumpFilePath);
160 std::vector<std::vector<CS16Vector>> frameSignals;
161 std::vector<std::vector<const void*>> frameSignalHeads;
162 std::vector<int64_t> framePPDULengths;
163 std::vector<double> framePostfixDurations;
164 for (
const auto* frame: frames) {
165 if (!frame->prebuiltSignals.empty()) {
166 std::vector<const void*> signalHeaders;
167 signalHeaders.reserve(frame->prebuiltSignals.size());
168 for (
const auto& column: frame->prebuiltSignals)
169 signalHeaders.emplace_back(column.data());
170 frameSignalHeads.emplace_back(signalHeaders);
171 framePPDULengths.emplace_back(frame->prebuiltSignals.at(0).size());
172 framePostfixDurations.emplace_back(frame->txParameters.postfixPaddingTime);
175 std::vector<const void*> signalHeaders;
176 for (
const auto& column: frameSignals.back())
177 signalHeaders.emplace_back(column.data());
178 frameSignalHeads.emplace_back(signalHeaders);
179 framePPDULengths.emplace_back(frameSignals.back().at(0).size());
180 framePostfixDurations.emplace_back(frame->txParameters.postfixPaddingTime);
186 auto totalTransmitSamples = [&] {
188 for (
auto i = 0; i < framePPDULengths.size(); i++) {
189 total += framePPDULengths[i] +
static_cast<int64_t
>(std::round(framePostfixDurations[i] *
getTxSamplingRate()));
219 template<
int repeat = 1,
typename... Frames,
typename = std::enable_if_t<(std::is_same_v<std::remove_cvref_t<Frames>, ModularPicoScenesTxFrame*> && ...) || (std::is_same_v<std::remove_cvref_t<Frames>, ModularPicoScenesTxFrame> && ...) || ((std::is_same_v<std::remove_cvref_t<Frames>, std::shared_ptr<ModularPicoScenesTxFrame>> || std::is_same_v<std::remove_cvref_t<Frames>, std::unique_ptr<ModularPicoScenesTxFrame>>) && ...)>>
221 return AbstractFrontEnd::transmitFramesInBatch<repeat>(std::forward<Frames>(frames)...);
348 if (txRate == rxRate)
425 std::bitset<8> txcmBits;
427 txcmBits.set(txch,
true);
429 return txcmBits.to_ulong();
433 std::bitset<8> txcmBits{txChainMask};
434 std::vector<size_t> newTxChannels;
435 for (
size_t i = 0; i < txcmBits.size(); i++) {
437 newTxChannels.emplace_back(i);
443 std::bitset<8> rxcmBits;
445 rxcmBits.set(rxch,
true);
447 return rxcmBits.to_ulong();
451 std::bitset<8> rxcmBits{rxChainMask};
452 std::vector<size_t> newRxChannels;
453 for (
size_t i = 0; i < rxcmBits.size(); i++) {
455 newRxChannels.emplace_back(i);
464 [[deprecated(
"Use 'const std::vector<size_t>& userSpecifiedTxChannels() const' instead")]]
471 std::stringstream ss;
473 if (!txChannelsN.empty()) {
484 [[deprecated(
"Use 'const std::vector<size_t>& userSpecifiedRxChannels() const' instead")]]
491 std::stringstream ss;
493 if (!rxChannelsN.empty()) {
522 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
526 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
530 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
534 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
537 int setChannelAndBandwidth(std::optional<double> control, std::optional<double> bw, std::optional<double> center)
override {
538 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
541 [[deprecated(
"Use 'getTxCarrierFrequencies' or 'getRxCarrierFrequencies' instead")]]
562 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
566 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
570 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
574 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
578 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
582 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
586 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
590 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
593 void setRxGain(
double rxGain, uint8_t channel)
override {
594 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
598 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
602 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
606 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
610 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
614 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
618 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
622 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
626 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
630 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
634 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
638 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
642 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
662 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
666 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
670 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
674 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
678 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
682 throw std::runtime_error(fmt::format(
"<{}> does not support operation: {}.",
getReferredInterfaceName(), std::string(BOOST_CURRENT_FUNCTION)));
698 ChannelBandwidthEnum
rxCBW{ChannelBandwidthEnum::CBW_20};
#define LoggingService_SDR_warning_printf(...)
#define LoggingService_SDR_debug_printf(...)
#define LoggingService_SDR_info_print(...)
#define LoggingService_SDR_warning_print(...)
SDRFrontEndTransferType
The SDRFrontEndTransferType enum denotes the 8-bit or 16-bit SDR frontend data depth.
@ CS16
16-bit complex sign
The shared abstract frontend interface for both SDR and NIC.
PicoScenesDeviceSubtype getFrontEndSubtype() const
Return the PicoScenesDeviceType subtype of this frontend.
std::string referredInterfaceName
the user specified frontend name
virtual int startTx()
Activate internal Tx service loop.
PicoScenesFrameTxParameters & getUserSpecifiedTxParameters()
bool txServiceStarted
indicate whether Tx service is running
PicoScenesFrameTxParameters userSpecifiedTxParameters
user-specified Tx parameters
PicoScenesDeviceType getFrontEndType() const
Return the PicoScenesDeviceType of this frontend.
const std::string & getReferredInterfaceName() const
Get the user-specified frontend name.
The shared abstract frontend for SDR devices only.
double getRxGain() override
Get the total Rx gain. However, currently only QCA9300 and SDR frontend support this method.
void setTxpower(double txpower) override
Set the Tx power (in dB)
void setRxChainMask(const uint8_t rxChainMask) override
Set Rx chain mask. Setting Rx chain mask means to use only the selected Rx chains for signal receptio...
void refreshHardwareInfoForAGCSupport() override
std::string getRxAntenna() override
Get the Rx antenna.
virtual std::optional< double > getCurrentNoiseFloor()=0
double getTxpower() override
get the transmission power (Tx power)
virtual void prebuildSignals(ModularPicoScenesTxFrame &frame, const uint8_t numTxAntenna)
Generate the baseband signal via AbstractSDRFrontEnd::generateSignal and save the data into the prebu...
void setCarrierFrequencyOffset4TxEncoding(double carrierFrequencyOffset) override
Set the current carrier frequency offset (CFO) value for the baseband signal generation.
std::optional< uint32_t > txSignalReplayDelay_ms
int transmitFramesInBatch(const std::vector< const ModularPicoScenesTxFrame * > &frames, const uint32_t repeat) override
Transmit frames in batch with precise inter-frame timing.
std::string getTxAntenna() override
Get the Tx antenna.
virtual void clearTxStatus()=0
void setMasterClockRate(double masterClockRate) override
Set the USRP master clock rate (in Hz)
double getRxIqCrossTalkDegree() override
Get the I/Q mismatch degree of the user-specified Tx I/Q mismatch.
const std::vector< size_t > & userSpecifiedRxChannels() const override
std::optional< double > rxSamplingFrequencyOffset
void setSamplingFrequencyOffset4RxDecoding(double samplingFrequencyOffset) override
Set the user-specified Rx path SFO,.
void setCarrierFrequency(double carrierFrequency) override
Get the RF carrier frequency.
std::optional< double > getCarrierFrequencyOffset4TxEncoding() override
Get the current carrier frequency offset (CFO) value for the baseband signal generation.
void setCarrierFrequencyOffset4RxDecoding(double rxCarrierFrequencyOffsetV) override
Set the CFO value for baseband decoding.
void refreshHardwareInfoForClockAndTimeSources() override
void setTxSplitHighLow(const bool split) override
double getTxIqCrossTalkDegree() override
Get the I/Q mismatch angle of the user-specified Tx I/Q mismatch.
virtual SDRFrontEndTxStatus getLastTxStatus() const =0
void refreshHardwareInfoForSamplingRateRanges() override
void setRxAntennas(const std::vector< std::string > &rxAnts) override
Specify antenna for each Rx chain.
void setRxChannelBandwidthMode(ChannelBandwidthEnum rxCbw) override
Set the CBW value for Wi-Fi baseband decoder, invoked by "--rx-cbw" option.
void setTransferType(const SDRFrontEndTransferType transferTypeV) override
void setTxSignalReplayDelayMs(const std::optional< uint32_t > &txSignalReplayDelayMs)
void setTxResampleRatio(double txResampleRatioV) override
Set Tx signal resample ratio.
void setRxResampleBypassFIR(const bool bypass) override
void setRxSignalDumpDelayedStartDuration(const double delayedStartDuration)
std::string getClockSource() override
Get the clock source.
virtual int32_t transmitSignalInBatchedSingleBurst(const std::vector< std::vector< const void * > > &multipleSignals, const std::vector< int64_t > &signalLength, const std::vector< double > &postfixDurations, uint32_t repeat)=0
void setRxChannels(const std::vector< size_t > &rxChannelsN) override
Set the number of the active Rx channels, starting from 0.
std::vector< std::string > getTxAntennas() override
void setRxOfdmSymbolOffset(const double rxOfdmSymbolOffset) override
Set Rx OFDM symbol offset, default is 0.
int setChannelAndBandwidth(double control, double bw, double center) override
Set the <contorlfreq-bandwidth-centerfreq> channel parameter.
double getTxResampleRatio() override
Get the user-specified Tx signal resample ratio.
double getSDRFrontEndTime() override
Obtain the SDR hardware time.
double rxIQMismatchRatioDb
virtual int transmitSignalsContinuously(const std::vector< const void * > &multiChannelHeaders, int64_t numSignalsPerAntenna, bool burstStart, bool burstEnd)=0
std::vector< size_t > rxChannels
void setTxChainMask(const uint8_t txChainMask) override
Set Tx chain mask. Setting Tx chain mask means to use only the selected Tx chain for signal transmiss...
int transmitFramesInBatch(Frames &&... frames)
AbstractSDRFrontEnd(const std::string &referredInterfaceName)
Create AbstractSDRFrontEnd object according to the user-specified frontend name referredInterfaceName...
void setRxGain(double rxGain) override
Set the total Rx gain. However, currently only QCA9300 and SDR frontend support this method.
std::optional< std::string > rxSignalReplayFilePath
int setChannelAndBandwidth(std::optional< double > control, std::optional< double > bw, std::optional< double > center) override
Set the <contorlfreq-bandwidth-centerfreq> channel parameter, but with optional.
std::vector< size_t > getTxChannels() override
Get the numbers of the active Tx channels, starting from 0.
void setFilterBandwidth(double bw) override
Set the hardware frontend filter bandwidth.
ExtraInfo buildExtraInfo() override
Build an ExtraInfo object describing the current frontend status.
double getTxIqRatioDB() override
Get the I/Q mismatch ratio of the user-specified Tx I/Q mismatch.
void refreshHardwareInfoForSupportedAntennas() override
SDRFrontEndTransferType transferType
double getCarrierFrequency() override
Get the RF carrier frequency.
void setRxAntenna(const std::string &rxAnt) override
Set the Rx antenna.
double rxIQMismatchRatioDegree
void setTxAntenna(const std::string &txAnt) override
Set the Tx antenna.
double rxOFDMSymbolOffset
double getSamplingRate() override
Get the baseband sampling rate.
std::optional< std::string > txSignalDumpFilePath
void setRxSensitivity(const double rxSensitivityV) override
Set Rx sensitivity.
void setRxResampleRatio(double rxResampleRatioV) override
Set the Rx signal rasample ratio.
void setFullDuplex(const bool enableFullDuplex) override
Set the Frontend is in Tx/Rx loopback mode, in this mode Tx and Rx are open simultaneously,...
virtual size_t transmitSignal(const CS16Vector &signals, const uint8_t numTxChannels, const double postfixDuration)
void refreshHardwareInfoForFrequencyRanges() override
void setRxSignalDumpFilePath(const std::string &rxSignalDumpFilePathV)
double getRxOfdmSymbolOffset() override
Get the user-specified Rx OFDM symbol offset value.
std::tuple< double, double, double > getChannelAndBandwidth() override
Get the <contorlfreq-bandwidth-centerfreq> channel parameter.
std::vector< std::string > getClockSources() override
Get the list of currently set clock sources.
std::optional< double > rxCarrierFrequencyOffset
double getRxResampleRatio() override
Get the user-specified Rx resampling ratio.
std::vector< size_t > getRxChannels() override
Get the number of the active Rx channels, starting from 0.
void setTxSignalDumpFilePath(const std::string &txSignalDumpFilePathV)
void refreshHardwareInfoForFrontEndProfiles() override
void refreshHardwareInfoForSensors() override
void setClockSources(const std::vector< std::string > &clockSources) override
Set multiple clock sources for different motherboards.
uint8_t getRxChainMask() override
Get Rx chain mask.
std::optional< std::string > rxSignalDumpFilePath
std::optional< double > getSamplingFrequencyOffset4TxEncoding() override
Get the current sampilng frequency offset (SFO) value for the baseband signal generation.
void refreshHardwareInfoForMasterClockRates() override
const std::vector< size_t > & userSpecifiedTxChannels() const override
void setSamplingFrequencyOffset4TxEncoding(double samplingFrequencyOffset) override
Set the current sampling frequency offset (SFO) value for the baseband signal generation.
void setRxMergeHighLow(const bool merge) override
void refreshHardwareInfoForGainRanges() override
uint8_t numDecodingThreads
ChannelBandwidthEnum rxCBW
void setTxIQMismatch(double iq_ratio_db, double iq_crosstalk_degree) override
Set Tx I/Q mismatch.
ChannelBandwidthEnum getRxChannelBandwidthMode() override
Get the current CBW value of Wi-Fi baseband decoder.
uint8_t getTxChainMask() override
Get the Tx chain mask.
void setSignalReplayFilePath(const std::string &signalReplayFilePath)
bool isFullDuplexEnabled() override
Check whether the Frontend is in Tx/Rx loopback mode.
void setRxIQMismatch(double iq_ratio_db, double iq_crosstalk_degree) override
Set Rx I/Q mismatch.
void setTimeSources(const std::vector< std::string > &timeSources) override
Set multiple time sources for different motherboards.
void setRxGain(double rxGain, uint8_t channel) override
Set the Rx gain for the specified channel. However, currently only QCA9300 and SDR frontend support t...
virtual int32_t transmitSignals(const std::vector< const void * > &signals, int64_t bufferLength, double postfixDuration)=0
void printStatus() override
Print a status string to command line.
void refreshHardwareInfoForSupportedChannels() override
std::string getTimeSource() override
Get the timing source.
double getFilterBandwidth() override
get the hardware-frontend filter bandwidth
double getNumSamplesSavedBeforeStart() override
std::optional< double > getCarrierFrequencyOffset4RxDecoding() override
Check if user specifies the Rx path CFO; if specified, return the Rx path CFO.
void setControlChannelFrequency(double controlFrequency) override
Get the control channel frequency of <contorlfreq-bandwidth-centerfreq> channel parameter.
void refreshHardwareInfoForTemperatures() override
virtual CS16Vector generateSignal(const ModularPicoScenesTxFrame &frame, uint8_t numTxAntenna)=0
Generate the baseband signal for ModularPicoScenesTxFrame frame with an optional numTxAntenna specify...
void setTxAntennas(const std::vector< std::string > &txAnts) override
Specify antenna for each Tx chain.
void setNumThreads4RxDecoding(const uint8_t numThreads) override
std::vector< size_t > txChannels
double getMasterClockRate() override
Get the USRP master clock rate (in Hz)
double getRxSensitivity() override
Get the Rx sensitivity of SDR baseband implemntation.
bool isRxResampleBypassFIR() override
std::vector< std::string > getRxAntennas() override
uint16_t getChannelFlags() override
Get the old ChannelFlags descriptor.
void setClockSource(const std::string &clockSource) override
Set the clock source. For USRP, it can be "external", "mimo", "internal".
double numSamplesSavedBeforeStart
double getRxChannelBandwidth() override
Get the 802.11 Channel Bandwidth parameter (20e6/40e6/80e6/160e6/320e6) of the Rx path.
int transmit(const ModularPicoScenesTxFrame &frame) override
Transmit a ModularPicoScenesTxFrame frame via current frontend hardware.
std::optional< double > getSamplingFrequencyOffset4RxDecoding() override
Get the user-specified Rx path SFO, default is 0.
void setTxChannels(const std::vector< size_t > &txChannelsN) override
This methods is fundamentally.
std::optional< double > rxSignalDumpDelayedStartDuration
virtual std::vector< CS16Vector > generateMultiChannelSignals(const ModularPicoScenesTxFrame &frame, const uint8_t numTxAntenna)
Generate the baseband signal via AbstractSDRFrontEnd::generateSignal, convert to SignalType type,...
void setSamplingRate(double samplingRate) override
set sampling rate (in Hz)
bool isRxMergeHighLow() override
void setTimeSource(const std::string &timeSource) override
Set the timing source. For USRP, it can be "external", "mimo", "internal".
void setRxChannelBandwidth(double rxcbw) override
Set the Rx channel bandwidth parameter of the <contorlfreq-bandwidth-centerfreq> channel parameters.
void refreshHardwareInfoForBoards() override
SDRFrontEndTransferType getTransferType() const override
void getNumSamplesSavedBeforeStart(const double numSamplesSavedBeforeStartV) override
std::vector< std::string > getTimeSources() override
Get the list of currently set time sources.
double getControlChannelFrequency() override
Get the control channel frequency of <contorlfreq-bandwidth-centerfreq> channel parameter.
bool isTxSplitHighLow() override
double getRxIqRatioDB() override
Get the I/Q mismatch ratio of the user-specified Rx I/Q mismatch.
virtual size_t transmitSignal(const std::vector< CS16Vector > &multiChannelSignals, const double postfixDuration)
virtual int transmitSignalsFromFile(const std::string &signalSourceFile, uint64_t repeat)=0
Transmits baseband signals from a .bbsignals file.
static const std::string SDR_Tx2File
static std::shared_ptr< LicenseService > getInstance()
This class holds all the configuration (including the SDR hardware related settings) of SDR frontend.
virtual void setRxSamplingRate(double rxRate)=0
virtual void setTxSamplingRate(double txRate)=0
virtual double getTxSamplingRate()=0
virtual void setRxCarrierFrequencies(std::vector< double > carrierFreqs)=0
virtual void setTxCarrierFrequencies(std::vector< double > carrierFreqs)=0
virtual std::vector< double > getTxCarrierFrequencies()=0
virtual std::vector< double > getRxCarrierFrequencies()=0
virtual double getRxSamplingRate()=0
OutputIterator fastCopyN(InputIterator first, std::size_t count, OutputIterator result)