From 79f95abdb3cd1dd3ec4e8283e20703cf5dbd3fb1 Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Thu, 16 Feb 2017 12:46:17 -0700 Subject: [PATCH] correct discrepancy between number of samples and number of bytes in blocks of samples related to #346 --- firmware/hackrf_usb/usb_api_sweep.c | 6 +++--- host/hackrf-tools/src/hackrf_sweep.c | 18 +++++++++--------- host/libhackrf/src/hackrf.c | 12 ++++++------ host/libhackrf/src/hackrf.h | 5 +++-- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/firmware/hackrf_usb/usb_api_sweep.c b/firmware/hackrf_usb/usb_api_sweep.c index 35656e81..5c9b5efa 100644 --- a/firmware/hackrf_usb/usb_api_sweep.c +++ b/firmware/hackrf_usb/usb_api_sweep.c @@ -47,11 +47,11 @@ static enum sweep_style style = LINEAR; usb_request_status_t usb_vendor_request_init_sweep( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) { - uint32_t num_samples; + uint32_t num_bytes; int i; if (stage == USB_TRANSFER_STAGE_SETUP) { - num_samples = (endpoint->setup.index << 16) | endpoint->setup.value; - dwell_blocks = num_samples / 0x4000; + num_bytes = (endpoint->setup.index << 16) | endpoint->setup.value; + dwell_blocks = num_bytes / 0x4000; if(1 > dwell_blocks) { return USB_REQUEST_STATUS_STALL; } diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index bd892951..886618cb 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -98,7 +98,7 @@ int gettimeofday(struct timeval *tv, void* ignored) { #define TUNE_STEP (DEFAULT_SAMPLE_RATE_HZ / FREQ_ONE_MHZ) #define OFFSET 7500000 -#define DEFAULT_SAMPLE_COUNT 0x4000 +#define DEFAULT_SAMPLE_COUNT 0x2000 #define BLOCKS_PER_TRANSFER 16 #if defined _WIN32 @@ -219,23 +219,23 @@ int rx_callback(hackrf_transfer* transfer) { | ((uint64_t)(ubuf[6]) << 32) | ((uint64_t)(ubuf[5]) << 24) | ((uint64_t)(ubuf[4]) << 16) | ((uint64_t)(ubuf[3]) << 8) | ubuf[2]; } else { - buf += SAMPLES_PER_BLOCK; + buf += BYTES_PER_BLOCK; continue; } if(!sweep_started) { if (frequency == (uint64_t)(FREQ_ONE_MHZ*frequencies[0])) { sweep_started = true; } else { - buf += SAMPLES_PER_BLOCK; + buf += BYTES_PER_BLOCK; continue; } } if((FREQ_MAX_MHZ * FREQ_ONE_MHZ) < frequency) { - buf += SAMPLES_PER_BLOCK; + buf += BYTES_PER_BLOCK; continue; } /* copy to fftwIn as floats */ - buf += SAMPLES_PER_BLOCK - (fftSize * 2); + buf += BYTES_PER_BLOCK - (fftSize * 2); for(i=0; i < fftSize; i++) { fftwIn[i][0] = buf[i*2] * window[i] * 1.0f / 128.0f; fftwIn[i][1] = buf[i*2+1] * window[i] * 1.0f / 128.0f; @@ -304,7 +304,7 @@ static void usage() { fprintf(stderr, "\t[-p antenna_enable] # Antenna port power, 1=Enable, 0=Disable\n"); fprintf(stderr, "\t[-l gain_db] # RX LNA (IF) gain, 0-40dB, 8dB steps\n"); fprintf(stderr, "\t[-g gain_db] # RX VGA (baseband) gain, 0-62dB, 2dB steps\n"); - fprintf(stderr, "\t[-n num_samples] # Number of samples per frequency, 16384-4294967296\n"); + fprintf(stderr, "\t[-n num_samples] # Number of samples per frequency, 8192-4294967296\n"); fprintf(stderr, "\t[-w bin_width] # FFT bin width (frequency resolution) in Hz\n"); fprintf(stderr, "\t[-1] # one shot mode\n"); fprintf(stderr, "\t[-B] # binary output\n"); @@ -447,12 +447,12 @@ int main(int argc, char** argv) { fprintf(stderr, "warning: vga_gain (-g) must be a multiple of 2\n"); if (num_samples % SAMPLES_PER_BLOCK) { - fprintf(stderr, "warning: num_samples (-n) must be a multiple of 16384\n"); + fprintf(stderr, "warning: num_samples (-n) must be a multiple of 8192\n"); return EXIT_FAILURE; } if (num_samples < SAMPLES_PER_BLOCK) { - fprintf(stderr, "warning: num_samples (-n) must be at least 16384\n"); + fprintf(stderr, "warning: num_samples (-n) must be at least 8192\n"); return EXIT_FAILURE; } @@ -592,7 +592,7 @@ int main(int argc, char** argv) { frequencies[2*i], frequencies[2*i+1]); } - result = hackrf_init_sweep(device, frequencies, num_ranges, num_samples, + result = hackrf_init_sweep(device, frequencies, num_ranges, num_samples * 2, TUNE_STEP * FREQ_ONE_MHZ, OFFSET, INTERLEAVED); if( result != HACKRF_SUCCESS ) { fprintf(stderr, "hackrf_init_sweep() failed: %s (%d)\n", diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index 809d6618..1bdb754f 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -1811,7 +1811,7 @@ int ADDCALL hackrf_set_hw_sync_mode(hackrf_device* device, const uint8_t value) * Initialize sweep mode: * frequency_list is a list of start/stop pairs of frequencies in MHz. * num_ranges is the number of pairs in frequency_list (1 to 10) - * num_samples is the number of samples to capture after each tuning. + * num_bytes is the number of sample bytes to capture after each tuning. * step_width is the width in Hz of the tuning step. * offset is a number of Hz added to every tuning frequency. * Use to select center frequency based on the expected usable bandwidth. @@ -1823,7 +1823,7 @@ int ADDCALL hackrf_set_hw_sync_mode(hackrf_device* device, const uint8_t value) */ int ADDCALL hackrf_init_sweep(hackrf_device* device, const uint16_t* frequency_list, const int num_ranges, - const uint32_t num_samples, const uint32_t step_width, + const uint32_t num_bytes, const uint32_t step_width, const uint32_t offset, const enum sweep_style style) { USB_API_REQUIRED(device, 0x0102) int result, i; @@ -1834,11 +1834,11 @@ int ADDCALL hackrf_init_sweep(hackrf_device* device, return HACKRF_ERROR_INVALID_PARAM; } - if(num_samples % SAMPLES_PER_BLOCK) { + if(num_bytes % BYTES_PER_BLOCK) { return HACKRF_ERROR_INVALID_PARAM; } - if(SAMPLES_PER_BLOCK > num_samples) { + if(BYTES_PER_BLOCK > num_bytes) { return HACKRF_ERROR_INVALID_PARAM; } @@ -1868,8 +1868,8 @@ int ADDCALL hackrf_init_sweep(hackrf_device* device, device->usb_device, LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, HACKRF_VENDOR_REQUEST_INIT_SWEEP, - num_samples & 0xffff, - (num_samples >> 16) & 0xffff, + num_bytes & 0xffff, + (num_bytes >> 16) & 0xffff, data, size, 0 diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index a92f5051..d54a9d05 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -47,7 +47,8 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSI #endif -#define SAMPLES_PER_BLOCK 16384 +#define SAMPLES_PER_BLOCK 8192 +#define BYTES_PER_BLOCK 16384 #define MAX_SWEEP_RANGES 10 enum hackrf_error { @@ -229,7 +230,7 @@ extern ADDAPI int ADDCALL hackrf_set_hw_sync_mode(hackrf_device* device, const u /* Start sweep mode */ extern ADDAPI int ADDCALL hackrf_init_sweep(hackrf_device* device, const uint16_t* frequency_list, const int num_ranges, - const uint32_t num_samples, const uint32_t step_width, + const uint32_t num_bytes, const uint32_t step_width, const uint32_t offset, const enum sweep_style style); /* Operacake functions */