From ef0fad43355849da685200022a0e7c115ee0e201 Mon Sep 17 00:00:00 2001 From: Thomas Kolb Date: Tue, 2 Jan 2024 23:49:55 +0100 Subject: [PATCH] Improved handling of up- and downsampling --- impl/src/main.c | 23 ++++++++++++++--------- impl/src/sdr/sdr.c | 21 ++++++++++++++------- impl/src/sdr/sdr.h | 4 ++-- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/impl/src/main.c b/impl/src/main.c index a6b5fda..c2156b4 100644 --- a/impl/src/main.c +++ b/impl/src/main.c @@ -3,6 +3,7 @@ #include #include #include +#include #include @@ -154,9 +155,9 @@ static result_t transmit_in_chunks(sdr_ctx_t *sdr, const float complex *samples, to_transmit_bb = CHUNKSIZE_BB; } - RESULT_CHECK(sdr_baseband_to_rf(sdr, samples + transmitted, to_transmit_bb, rf_samples, CHUNKSIZE_RF)); + size_t to_transmit_rf = CHUNKSIZE_RF; - size_t to_transmit_rf = to_transmit_bb * SDR_OVERSAMPLING; + RESULT_CHECK(sdr_baseband_to_rf(sdr, samples + transmitted, to_transmit_bb, rf_samples, &to_transmit_rf)); result_t result = sdr_transmit(sdr, rf_samples, to_transmit_rf, 100000); @@ -261,7 +262,7 @@ int main(void) dump_array_cf(whole_burst, burst_len, 1.0f, "/tmp/tx.cpx"); if(!on_air) { - //RESULT_CHECK(sdr_stop_rx(&sdr)); + RESULT_CHECK(sdr_stop_rx(&sdr)); RESULT_CHECK(sdr_start_tx(&sdr, burst_len * SDR_OVERSAMPLING)); // hopefully no longer needed with latest libhackrf @@ -274,8 +275,8 @@ int main(void) } else if(on_air) { // ret == 0 //RESULT_CHECK(sdr_flush_tx_buffer(&sdr)); - //RESULT_CHECK(sdr_stop_tx(&sdr)); - //RESULT_CHECK(sdr_start_rx(&sdr)); + RESULT_CHECK(sdr_stop_tx(&sdr)); + RESULT_CHECK(sdr_start_rx(&sdr)); on_air = false; block_tx_for(TX_SWITCH_BACKOFF_AFTER_RX_ON); @@ -289,7 +290,7 @@ int main(void) float complex bb_samples[CHUNKSIZE_BB]; size_t n_rf_samples = CHUNKSIZE_RF; - size_t n_bb_samples; + size_t n_bb_samples = CHUNKSIZE_BB; if(sdr_receive(&sdr, rf_samples, &n_rf_samples, 100000) != OK) { rx_retries++; @@ -301,6 +302,12 @@ int main(void) } } + if(n_rf_samples == 0) { + struct timespec ts_1ms = {0, 1000000}; + nanosleep(&ts_1ms, NULL); + continue; + } + total_samples += n_rf_samples; double new = get_hires_time(); @@ -323,9 +330,7 @@ int main(void) fprintf(stderr, "r"); - RESULT_CHECK(sdr_rf_to_baseband(&sdr, rf_samples, n_rf_samples, bb_samples, CHUNKSIZE_BB)); - - n_bb_samples = n_rf_samples / SDR_OVERSAMPLING; + RESULT_CHECK(sdr_rf_to_baseband(&sdr, rf_samples, n_rf_samples, bb_samples, &n_bb_samples)); RESULT_CHECK(layer1_rx_process(&rx, bb_samples, n_bb_samples)); } else { diff --git a/impl/src/sdr/sdr.c b/impl/src/sdr/sdr.c index 6e00705..50220b6 100644 --- a/impl/src/sdr/sdr.c +++ b/impl/src/sdr/sdr.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "config.h" @@ -342,16 +343,20 @@ result_t sdr_flush_tx_buffer(sdr_ctx_t *ctx) result_t sdr_rf_to_baseband(sdr_ctx_t *ctx, const float complex *rf_samples, size_t nrf, - float complex *bb_samples, size_t nbb) + float complex *bb_samples, size_t *nbb) { - if((nbb * SDR_OVERSAMPLING) < nrf) { - fprintf(stderr, "sdr_rf_to_baseband: result would not fit in output: %zd * %d < %zd\n", nbb, SDR_OVERSAMPLING, nrf); + if((*nbb * SDR_OVERSAMPLING) < nrf) { + fprintf(stderr, "sdr_rf_to_baseband: result would not fit in output: %zd * %d < %zd\n", *nbb, SDR_OVERSAMPLING, nrf); return ERR_SIZE; } - for(size_t i = 0; i < nbb; i++) { + *nbb = nrf / SDR_OVERSAMPLING; + + for(size_t i = 0; i < *nbb; i++) { float complex tmp[SDR_OVERSAMPLING]; + assert(i*SDR_OVERSAMPLING < nrf); + nco_crcf_mix_block_down(ctx->rx_nco, (complex float*)(rf_samples + i * SDR_OVERSAMPLING), tmp, @@ -366,13 +371,15 @@ result_t sdr_rf_to_baseband(sdr_ctx_t *ctx, result_t sdr_baseband_to_rf(sdr_ctx_t *ctx, const float complex *bb_samples, size_t nbb, - float complex *rf_samples, size_t nrf) + float complex *rf_samples, size_t *nrf) { - if((nbb * SDR_OVERSAMPLING) > nrf) { - fprintf(stderr, "sdr_baseband_to_rf: result would not fit in output: %zd * %d > %zd\n", nbb, SDR_OVERSAMPLING, nrf); + if((nbb * SDR_OVERSAMPLING) > *nrf) { + fprintf(stderr, "sdr_baseband_to_rf: result would not fit in output: %zd * %d > %zd\n", nbb, SDR_OVERSAMPLING, *nrf); return ERR_SIZE; } + *nrf = nbb * SDR_OVERSAMPLING; + for(size_t i = 0; i < nbb; i++) { float complex tmp[SDR_OVERSAMPLING]; diff --git a/impl/src/sdr/sdr.h b/impl/src/sdr/sdr.h index 6cb37de..8be4255 100644 --- a/impl/src/sdr/sdr.h +++ b/impl/src/sdr/sdr.h @@ -51,13 +51,13 @@ result_t sdr_flush_tx_buffer(sdr_ctx_t *ctx); */ result_t sdr_rf_to_baseband(sdr_ctx_t *ctx, const float complex *rf_samples, size_t nrf, - float complex *bb_samples, size_t nbb); + float complex *bb_samples, size_t *nbb); /*! * \brief Convert and resample a baseband signal for transmission. */ result_t sdr_baseband_to_rf(sdr_ctx_t *ctx, const float complex *bb_samples, size_t nbb, - float complex *rf_samples, size_t nrf); + float complex *rf_samples, size_t *nrf); #endif // SDR_SDR_H