Cleanup SDR usage when no channel, but full spectrum is used.

Radio and TV uses full spectrum, so they set channels to 0, this will
define a center frequency only. The spectrum is then processed by the
applications and not by libsdr.

The sample rate must be a factor of 1e9, so that time stamps work
and signal has no gaps/glitchs.
This commit is contained in:
Andreas Eversberg 2021-12-05 12:46:19 +01:00
parent 726453909c
commit 2d23c841a6
4 changed files with 17 additions and 16 deletions

View File

@ -167,11 +167,6 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
if (bandwidth) if (bandwidth)
PDEBUG(DSDR, DEBUG_INFO, "Require bandwidth of each channel is 2 * (%.1f deviation + %.1f modulation) = %.1f KHz\n", max_deviation / 1e3, max_modulation / 1e3, bandwidth / 1e3); PDEBUG(DSDR, DEBUG_INFO, "Require bandwidth of each channel is 2 * (%.1f deviation + %.1f modulation) = %.1f KHz\n", max_deviation / 1e3, max_modulation / 1e3, bandwidth / 1e3);
if (channels < 1) {
PDEBUG(DSDR, DEBUG_ERROR, "No channel given, please fix!\n");
abort();
}
sdr = calloc(sizeof(*sdr), 1); sdr = calloc(sizeof(*sdr), 1);
if (!sdr) { if (!sdr) {
PDEBUG(DSDR, DEBUG_ERROR, "NO MEM!\n"); PDEBUG(DSDR, DEBUG_ERROR, "NO MEM!\n");
@ -261,10 +256,12 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
} }
/* create list of channel states */ /* create list of channel states */
sdr->chan = calloc(sizeof(*sdr->chan), channels + (sdr->paging_channel != 0)); if (channels) {
if (!sdr->chan) { sdr->chan = calloc(sizeof(*sdr->chan), channels + (sdr->paging_channel != 0));
PDEBUG(DSDR, DEBUG_ERROR, "NO MEM!\n"); if (!sdr->chan) {
goto error; PDEBUG(DSDR, DEBUG_ERROR, "NO MEM!\n");
goto error;
}
} }
/* swap links, if required */ /* swap links, if required */
@ -276,7 +273,9 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
tx_frequency = temp; tx_frequency = temp;
} }
if (tx_frequency) { if (tx_frequency && !channels)
tx_center_frequency = tx_frequency[0];
if (tx_frequency && channels) {
/* calculate required bandwidth (IQ rate) */ /* calculate required bandwidth (IQ rate) */
double tx_low_frequency = 0.0, tx_high_frequency = 0.0; double tx_low_frequency = 0.0, tx_high_frequency = 0.0;
@ -357,7 +356,9 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
} }
} }
if (rx_frequency) { if (rx_frequency && !channels)
rx_center_frequency = rx_frequency[0];
if (rx_frequency && channels) {
/* calculate required bandwidth (IQ rate) */ /* calculate required bandwidth (IQ rate) */
double rx_low_frequency = 0.0, rx_high_frequency = 0.0; double rx_low_frequency = 0.0, rx_high_frequency = 0.0;
for (c = 0; c < channels; c++) { for (c = 0; c < channels; c++) {

View File

@ -99,7 +99,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
use_time_stamps = timestamps; use_time_stamps = timestamps;
if (use_time_stamps && (1000000000LL % (long long)rate)) { if (use_time_stamps && (1000000000LL % (long long)rate)) {
PDEBUG(DSOAPY, DEBUG_ERROR, "The given sample duration is not a multiple of a nano second. I.e. we can't divide 1000,000,000 by sample rate of %.0f. Please choose a different sample rate for time stamp support!\n", rate); PDEBUG(DSOAPY, DEBUG_ERROR, "The given sample duration is not a multiple of a nano second. I.e. we can't divide 10^9 by sample rate of %.0f. Please choose a different sample rate for time stamp support!\n", rate);
use_time_stamps = 0; use_time_stamps = 0;
} }
Ns_per_sample = 1000000000LL / (long long)rate; Ns_per_sample = 1000000000LL / (long long)rate;

View File

@ -393,7 +393,7 @@ int main(int argc, char *argv[])
tx_frequencies[0] = frequency; tx_frequencies[0] = frequency;
rx_frequencies[0] = frequency; rx_frequencies[0] = frequency;
am[0] = 0; am[0] = 0;
sdr = sdr_open(NULL, tx_frequencies, rx_frequencies, am, 1, 0.0, dsp_samplerate, buffer_size, 1.0, 0.0, 0.0, 0.0); sdr = sdr_open(NULL, tx_frequencies, rx_frequencies, am, 0, 0.0, dsp_samplerate, buffer_size, 1.0, 0.0, 0.0, 0.0);
if (!sdr) if (!sdr)
goto error; goto error;
sdr_start(sdr); sdr_start(sdr);

View File

@ -228,7 +228,7 @@ static int handle_options(int short_option, int argi, char **argv)
"--sdr-tx-gain", "50", "--sdr-tx-gain", "50",
"--sdr-lo-offset", "-3000000", "--sdr-lo-offset", "-3000000",
"--sdr-bandwidth", "60000000", "--sdr-bandwidth", "60000000",
"-s", "13750000", "-s", "12500000",
}; };
int argc_lime = sizeof(argv_lime) / sizeof (*argv_lime); int argc_lime = sizeof(argv_lime) / sizeof (*argv_lime);
return options_command_line(argc_lime, argv_lime, handle_options); return options_command_line(argc_lime, argv_lime, handle_options);
@ -242,7 +242,7 @@ static int handle_options(int short_option, int argi, char **argv)
"--sdr-tx-gain", "50", "--sdr-tx-gain", "50",
"--sdr-lo-offset", "-3000000", "--sdr-lo-offset", "-3000000",
"--sdr-bandwidth", "60000000", "--sdr-bandwidth", "60000000",
"-s", "13750000", "-s", "12500000",
}; };
int argc_lime = sizeof(argv_lime) / sizeof (*argv_lime); int argc_lime = sizeof(argv_lime) / sizeof (*argv_lime);
return options_command_line(argc_lime, argv_lime, handle_options); return options_command_line(argc_lime, argv_lime, handle_options);
@ -333,7 +333,7 @@ static void tx_bas(sample_t *sample_bas, __attribute__((__unused__)) sample_t *s
tx_frequencies[0] = frequency; tx_frequencies[0] = frequency;
rx_frequencies[0] = frequency; rx_frequencies[0] = frequency;
am[0] = 0; am[0] = 0;
sdr = sdr_open(NULL, tx_frequencies, rx_frequencies, am, 1, 0.0, dsp_samplerate, buffer_size, 1.0, 0.0, 0.0, 0.0); sdr = sdr_open(NULL, tx_frequencies, rx_frequencies, am, 0, 0.0, dsp_samplerate, buffer_size, 1.0, 0.0, 0.0, 0.0);
if (!sdr) if (!sdr)
goto error; goto error;
sdr_start(sdr); sdr_start(sdr);