diff --git a/srslte/examples/pdsch_enodeb.c b/srslte/examples/pdsch_enodeb.c index 125c1fb58..0aecece5c 100644 --- a/srslte/examples/pdsch_enodeb.c +++ b/srslte/examples/pdsch_enodeb.c @@ -511,9 +511,9 @@ int main(int argc, char **argv) { sigaddset(&sigset, SIGINT); sigprocmask(SIG_UNBLOCK, &sigset, NULL); signal(SIGINT, sig_int_handler); - cuhd_set_master_clock_rate(uhd, 30.72e6); if (!output_file_name) { + cuhd_set_master_clock_rate(uhd, 30.72e6); printf("Set TX rate: %.2f MHz\n", cuhd_set_tx_srate(uhd, srslte_sampling_freq_hz(cell.nof_prb)) / 1000000); printf("Set TX gain: %.1f dB\n", cuhd_set_tx_gain(uhd, uhd_gain)); diff --git a/srslte/include/srslte/dft/dft.h b/srslte/include/srslte/dft/dft.h index eec8b7853..98b2055d9 100644 --- a/srslte/include/srslte/dft/dft.h +++ b/srslte/include/srslte/dft/dft.h @@ -109,6 +109,10 @@ SRSLTE_API void srslte_dft_run(srslte_dft_plan_t *plan, void *in, void *out); +SRSLTE_API void srslte_dft_run_c_zerocopy(srslte_dft_plan_t *plan, + cf_t *in, + cf_t *out); + SRSLTE_API void srslte_dft_run_c(srslte_dft_plan_t *plan, cf_t *in, cf_t *out); diff --git a/srslte/lib/common/src/phy_common.c b/srslte/lib/common/src/phy_common.c index 1101260ad..0bfaf5bb0 100644 --- a/srslte/lib/common/src/phy_common.c +++ b/srslte/lib/common/src/phy_common.c @@ -36,7 +36,7 @@ #include "srslte/common/sequence.h" -#define USE_REDUCED_SAMPLING_RATES +//#define USE_REDUCED_SAMPLING_RATES diff --git a/srslte/lib/dft/src/dft.c b/srslte/lib/dft/src/dft.c index 4a51ddda3..0f02d0cdc 100644 --- a/srslte/lib/dft/src/dft.c +++ b/srslte/lib/dft/src/dft.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "srslte/dft/dft.h" #include "srslte/utils/vector.h" @@ -136,6 +137,10 @@ void srslte_dft_run(srslte_dft_plan_t *plan, void *in, void *out) { } } +void srslte_dft_run_c_zerocopy(srslte_dft_plan_t *plan, cf_t *in, cf_t *out) { + fftwf_execute_dft(plan->p, in, out); +} + void srslte_dft_run_c(srslte_dft_plan_t *plan, cf_t *in, cf_t *out) { float norm; int i; diff --git a/srslte/lib/dft/src/ofdm.c b/srslte/lib/dft/src/ofdm.c index 54e0934fb..8f66e7db3 100644 --- a/srslte/lib/dft/src/ofdm.c +++ b/srslte/lib/dft/src/ofdm.c @@ -163,13 +163,25 @@ void srslte_ofdm_rx_slot(srslte_ofdm_t *q, cf_t *input, cf_t *output) { } } +void srslte_ofdm_rx_slot_zerocopy(srslte_ofdm_t *q, cf_t *input, cf_t *output) { + uint32_t i; + for (i=0;inof_symbols;i++) { + input += SRSLTE_CP_ISNORM(q->cp)?SRSLTE_CP_LEN_NORM(i, q->symbol_sz):SRSLTE_CP_LEN_EXT(q->symbol_sz); + srslte_dft_run_c_zerocopy(&q->fft_plan, input, q->tmp); + memcpy(output, &q->tmp[q->symbol_sz/2+q->nof_guards], sizeof(cf_t)*q->nof_re/2); + memcpy(&output[q->nof_re/2], &q->tmp[1], sizeof(cf_t)*q->nof_re/2); + input += q->symbol_sz; + output += q->nof_re; + } +} + void srslte_ofdm_rx_sf(srslte_ofdm_t *q, cf_t *input, cf_t *output) { uint32_t n; if (q->freq_shift) { srslte_vec_prod_ccc(input, q->shift_buffer, input, 2*q->slot_sz); } for (n=0;n<2;n++) { - srslte_ofdm_rx_slot(q, &input[n*q->slot_sz], &output[n*q->nof_re*q->nof_symbols]); + srslte_ofdm_rx_slot_zerocopy(q, &input[n*q->slot_sz], &output[n*q->nof_re*q->nof_symbols]); } } diff --git a/srslte/lib/ue/src/ue_dl.c b/srslte/lib/ue/src/ue_dl.c index 32f7117b5..e08d9b320 100644 --- a/srslte/lib/ue/src/ue_dl.c +++ b/srslte/lib/ue/src/ue_dl.c @@ -183,7 +183,7 @@ int srslte_ue_dl_decode_fft_estimate(srslte_ue_dl_t *q, cf_t *input, uint32_t sf /* Run FFT for all subframe data */ srslte_ofdm_rx_sf(&q->fft, input, q->sf_symbols); - + /* Get channel estimates for each port */ srslte_chest_dl_estimate(&q->chest, q->sf_symbols, q->ce, sf_idx);