diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index dca716cf..8d0727a1 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -36,6 +36,10 @@ #include #define _FILE_OFFSET_BITS 64 +#define BLOCKS_PER_TRANSFER 16 +#define SAMPLES_PER_BLOCK 16384 +#define STEP_SIZE_IN_HZ 312500 +#define FFT_SIZE 64 #ifndef bool typedef int bool; @@ -169,12 +173,17 @@ uint32_t antenna_enable; uint32_t freq_min; uint32_t freq_max; +bool binary_output = false; + int fftSize; fftwf_complex *fftwIn = NULL; fftwf_complex *fftwOut = NULL; fftwf_plan fftwPlan = NULL; float* pwr; float* window; +time_t time_now; +struct tm *fft_time; +char time_str[50]; float logPower(fftwf_complex in, float scale) { @@ -190,22 +199,19 @@ int rx_callback(hackrf_transfer* transfer) { * Throw away unused bins * write output to pipe */ - ssize_t bytes_to_write; - ssize_t bytes_written; int8_t* buf; float frequency; int i, j; if( fd != NULL ) { byte_count += transfer->valid_length; - bytes_to_write = transfer->valid_length; buf = (int8_t*) transfer->buffer; - for(j=0; j<16; j++) { + for(j=0; j> 1); pwr[i] = logPower(fftwOut[k], 1.0f / fftSize); } - fwrite(&frequency, sizeof(float), 1, stdout); - fwrite(pwr, sizeof(float), fftSize, stdout); - } - - bytes_written = fwrite(transfer->buffer, 1, bytes_to_write, fd); - if (bytes_written != bytes_to_write) { - return -1; - } else { - return 0; + if(binary_output) { + fwrite(&frequency, sizeof(float), 1, stdout); + fwrite(pwr, sizeof(float), fftSize, stdout); + } else { + time_now = time(NULL); + fft_time = localtime(&time_now); + strftime(time_str, 50, "%Y-%m-%d, %H:%M:%S", fft_time); + printf("%s, hz_low, hz_high, hz_step, num_samples, ", time_str); + for(i=0; i < (fftSize - 1); i++) { + printf("%.2f, ", pwr[i]); + } + printf("%.2f\n", pwr[fftSize - 1]); + } } + return 0; } else { return -1; } @@ -243,6 +255,7 @@ static void usage() { 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[-B] # binary output\n"); } static hackrf_device* device = NULL; @@ -276,7 +289,7 @@ int main(int argc, char** argv) { uint16_t frequencies[MAX_FREQ_COUNT]; uint32_t num_samples = DEFAULT_SAMPLE_COUNT; - while( (opt = getopt(argc, argv, "a:f:p:l:g:d:n:h?")) != EOF ) { + while( (opt = getopt(argc, argv, "a:f:p:l:g:d:n:Bh?")) != EOF ) { result = HACKRF_SUCCESS; switch( opt ) { @@ -321,6 +334,10 @@ int main(int argc, char** argv) { result = parse_u32(optarg, &num_samples); break; + case 'B': + binary_output = true; + break; + case 'h': case '?': usage(); @@ -345,12 +362,12 @@ int main(int argc, char** argv) { if (vga_gain % 2) fprintf(stderr, "warning: vga_gain (-g) must be a multiple of 2\n"); - if (num_samples % 0x4000) { + if (num_samples % SAMPLES_PER_BLOCK) { fprintf(stderr, "warning: num_samples (-n) must be a multiple of 16384\n"); return EXIT_FAILURE; } - if (num_samples < 0x4000) { + if (num_samples < SAMPLES_PER_BLOCK) { fprintf(stderr, "warning: num_samples (-n) must be at least 16384\n"); return EXIT_FAILURE; } @@ -377,7 +394,7 @@ int main(int argc, char** argv) { return EXIT_FAILURE; } - fftSize = 64; + fftSize = FFT_SIZE; fftwIn = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex) * fftSize); fftwOut = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex) * fftSize); fftwPlan = fftwf_plan_dft_1d(fftSize, fftwIn, fftwOut, FFTW_FORWARD, FFTW_MEASURE);