Improved handling of up- and downsampling
This commit is contained in:
parent
d55e3ab902
commit
ef0fad4335
|
@ -3,6 +3,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#include <liquid/liquid.h>
|
#include <liquid/liquid.h>
|
||||||
|
|
||||||
|
@ -154,9 +155,9 @@ static result_t transmit_in_chunks(sdr_ctx_t *sdr, const float complex *samples,
|
||||||
to_transmit_bb = CHUNKSIZE_BB;
|
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);
|
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");
|
dump_array_cf(whole_burst, burst_len, 1.0f, "/tmp/tx.cpx");
|
||||||
|
|
||||||
if(!on_air) {
|
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));
|
RESULT_CHECK(sdr_start_tx(&sdr, burst_len * SDR_OVERSAMPLING));
|
||||||
|
|
||||||
// hopefully no longer needed with latest libhackrf
|
// hopefully no longer needed with latest libhackrf
|
||||||
|
@ -274,8 +275,8 @@ int main(void)
|
||||||
} else if(on_air) { // ret == 0
|
} else if(on_air) { // ret == 0
|
||||||
//RESULT_CHECK(sdr_flush_tx_buffer(&sdr));
|
//RESULT_CHECK(sdr_flush_tx_buffer(&sdr));
|
||||||
|
|
||||||
//RESULT_CHECK(sdr_stop_tx(&sdr));
|
RESULT_CHECK(sdr_stop_tx(&sdr));
|
||||||
//RESULT_CHECK(sdr_start_rx(&sdr));
|
RESULT_CHECK(sdr_start_rx(&sdr));
|
||||||
on_air = false;
|
on_air = false;
|
||||||
|
|
||||||
block_tx_for(TX_SWITCH_BACKOFF_AFTER_RX_ON);
|
block_tx_for(TX_SWITCH_BACKOFF_AFTER_RX_ON);
|
||||||
|
@ -289,7 +290,7 @@ int main(void)
|
||||||
float complex bb_samples[CHUNKSIZE_BB];
|
float complex bb_samples[CHUNKSIZE_BB];
|
||||||
|
|
||||||
size_t n_rf_samples = CHUNKSIZE_RF;
|
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) {
|
if(sdr_receive(&sdr, rf_samples, &n_rf_samples, 100000) != OK) {
|
||||||
rx_retries++;
|
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;
|
total_samples += n_rf_samples;
|
||||||
|
|
||||||
double new = get_hires_time();
|
double new = get_hires_time();
|
||||||
|
@ -323,9 +330,7 @@ int main(void)
|
||||||
|
|
||||||
fprintf(stderr, "r");
|
fprintf(stderr, "r");
|
||||||
|
|
||||||
RESULT_CHECK(sdr_rf_to_baseband(&sdr, rf_samples, n_rf_samples, bb_samples, CHUNKSIZE_BB));
|
RESULT_CHECK(sdr_rf_to_baseband(&sdr, rf_samples, n_rf_samples, bb_samples, &n_bb_samples));
|
||||||
|
|
||||||
n_bb_samples = n_rf_samples / SDR_OVERSAMPLING;
|
|
||||||
|
|
||||||
RESULT_CHECK(layer1_rx_process(&rx, bb_samples, n_bb_samples));
|
RESULT_CHECK(layer1_rx_process(&rx, bb_samples, n_bb_samples));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include "config.h"
|
#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,
|
result_t sdr_rf_to_baseband(sdr_ctx_t *ctx,
|
||||||
const float complex *rf_samples, size_t nrf,
|
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) {
|
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);
|
fprintf(stderr, "sdr_rf_to_baseband: result would not fit in output: %zd * %d < %zd\n", *nbb, SDR_OVERSAMPLING, nrf);
|
||||||
return ERR_SIZE;
|
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];
|
float complex tmp[SDR_OVERSAMPLING];
|
||||||
|
|
||||||
|
assert(i*SDR_OVERSAMPLING < nrf);
|
||||||
|
|
||||||
nco_crcf_mix_block_down(ctx->rx_nco,
|
nco_crcf_mix_block_down(ctx->rx_nco,
|
||||||
(complex float*)(rf_samples + i * SDR_OVERSAMPLING),
|
(complex float*)(rf_samples + i * SDR_OVERSAMPLING),
|
||||||
tmp,
|
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,
|
result_t sdr_baseband_to_rf(sdr_ctx_t *ctx,
|
||||||
const float complex *bb_samples, size_t nbb,
|
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) {
|
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);
|
fprintf(stderr, "sdr_baseband_to_rf: result would not fit in output: %zd * %d > %zd\n", nbb, SDR_OVERSAMPLING, *nrf);
|
||||||
return ERR_SIZE;
|
return ERR_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*nrf = nbb * SDR_OVERSAMPLING;
|
||||||
|
|
||||||
for(size_t i = 0; i < nbb; i++) {
|
for(size_t i = 0; i < nbb; i++) {
|
||||||
float complex tmp[SDR_OVERSAMPLING];
|
float complex tmp[SDR_OVERSAMPLING];
|
||||||
|
|
||||||
|
|
|
@ -51,13 +51,13 @@ result_t sdr_flush_tx_buffer(sdr_ctx_t *ctx);
|
||||||
*/
|
*/
|
||||||
result_t sdr_rf_to_baseband(sdr_ctx_t *ctx,
|
result_t sdr_rf_to_baseband(sdr_ctx_t *ctx,
|
||||||
const float complex *rf_samples, size_t nrf,
|
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.
|
* \brief Convert and resample a baseband signal for transmission.
|
||||||
*/
|
*/
|
||||||
result_t sdr_baseband_to_rf(sdr_ctx_t *ctx,
|
result_t sdr_baseband_to_rf(sdr_ctx_t *ctx,
|
||||||
const float complex *bb_samples, size_t nbb,
|
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
|
#endif // SDR_SDR_H
|
||||||
|
|
Loading…
Reference in a new issue