soapy: set RF bandwidth during rate change

master
Andre Puschmann 7 years ago
parent 937cb4d7a8
commit a68758ab0d

@ -37,13 +37,16 @@
#include <SoapySDR/Device.h> #include <SoapySDR/Device.h>
#include <SoapySDR/Formats.h> #include <SoapySDR/Formats.h>
#include <SoapySDR/Time.h> #include <SoapySDR/Time.h>
#include <Types.h>
#define USE_TX_MTU 0 #define USE_TX_MTU 0
#define SET_RF_BW 1
#define PRINT_RX_STATS 0 #define PRINT_RX_STATS 0
#define PRINT_TX_STATS 0 #define PRINT_TX_STATS 0
#define MIN(a,b) (((a)<(b))?(a):(b)) #define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
typedef struct { typedef struct {
char *devname; char *devname;
@ -247,7 +250,7 @@ int rf_soapy_open_multi(char *args, void **h, uint32_t nof_rx_antennas)
handler->rx_stream_active = false; handler->rx_stream_active = false;
handler->devname = devname; handler->devname = devname;
// init rx/tx rate to lowest LTE rate // init rx/tx rate to lowest LTE rate to avoid decimation warnings
rf_soapy_set_rx_srate(handler, 1.92e6); rf_soapy_set_rx_srate(handler, 1.92e6);
rf_soapy_set_tx_srate(handler, 1.92e6); rf_soapy_set_tx_srate(handler, 1.92e6);
@ -404,6 +407,21 @@ double rf_soapy_set_rx_srate(void *h, double rate)
return SRSLTE_ERROR; return SRSLTE_ERROR;
} }
#if SET_RF_BW
// Set bandwidth close to current rate
size_t bw_length;
SoapySDRRange *bw_range = SoapySDRDevice_getBandwidthRange(handler->device, SOAPY_SDR_RX, 0, &bw_length);
double bw = rate;
bw = MIN(bw, bw_range->maximum);
bw = MAX(bw, bw_range->minimum);
bw = MAX(bw, 2.5e6); // For the Lime to avoid warnings
if (SoapySDRDevice_setBandwidth(handler->device, SOAPY_SDR_RX, 0, bw) != 0) {
printf("setBandwidth fail: %s\n", SoapySDRDevice_lastError());
return SRSLTE_ERROR;
}
printf("Set Rx bandwidth to %.2f MHz\n", SoapySDRDevice_getBandwidth(handler->device, SOAPY_SDR_RX, 0)/1e6);
#endif
if (rx_stream_active) { if (rx_stream_active) {
rf_soapy_start_rx_stream(handler, true); rf_soapy_start_rx_stream(handler, true);
} }
@ -426,6 +444,20 @@ double rf_soapy_set_tx_srate(void *h, double rate)
return SRSLTE_ERROR; return SRSLTE_ERROR;
} }
#if SET_RF_BW
size_t bw_length;
SoapySDRRange *bw_range = SoapySDRDevice_getBandwidthRange(handler->device, SOAPY_SDR_TX, 0, &bw_length);
// try to set the BW to the actual sampling rate but make sure to stay within device boundaries
double bw = rate;
bw = MIN(rate, bw_range->maximum);
bw = MAX(rate, bw_range->minimum);
if (SoapySDRDevice_setBandwidth(handler->device, SOAPY_SDR_TX, 0, bw) != 0) {
printf("setBandwidth fail: %s\n", SoapySDRDevice_lastError());
return SRSLTE_ERROR;
}
printf("Set Tx bandwidth to %.2f MHz\n", SoapySDRDevice_getBandwidth(handler->device, SOAPY_SDR_TX, 0)/1e6);
#endif
if (rx_stream_active) { if (rx_stream_active) {
rf_soapy_start_rx_stream(handler, true); rf_soapy_start_rx_stream(handler, true);
} }

Loading…
Cancel
Save