[srslte-users] Resampling on N210
Federico Quattrin
fede.quattrin at gmail.com
Tue May 14 12:25:02 UTC 2019
Hi srsLTE community,
I'm trying to write a piece of code in order to make a resample for the
N210. Until now I read the source code and found that this piece of code
must be written in the file rf_uhd_impl.c so i did that, most specifically
I wrote it in the function rf_uhd_recv_with_time_multi. What i thought was:
The N210 has a resampling frequency of 100 Msps, but srsLTE works with
different frequency, so i need to get all the samples from UHD, save them
into a array or buffer, and then do a resample of these data with the
srsLTE resampling functions and send these new array of data as the final
array of data.
To achieve this I modified the code of the function
rf_uhd_recv_with_time_multi as it follow:
int rf_uhd_recv_with_time_multi(void *h,
void *data[SRSLTE_MAX_PORTS],
uint32_t nsamples,
bool blocking,
time_t *secs,
double *frac_secs)
{
rf_uhd_handler_t *handler = (rf_uhd_handler_t*) h;
uhd_rx_metadata_handle *md = &handler->rx_md_first;
size_t rxd_samples = 0;
size_t rxd_samples_total_new = 0;
float sratio = 192.0 * 3.0 / (625.0 * 4.0); //added for resampling
(1/sratio = 4.340277778) The idea is to resample from 100 Msps to 23.04
Msps.
// we need to convert all the vector to a new size in order to get all
the samples.
nsamples = nsamples / sratio; //added for resampling. We should receive
more sampling due to different sample rate and same time.
size_t rxd_samples_total = 0;
int trials = 0;
if (blocking) {
while (rxd_samples_total < nsamples && trials < 100) {
void *buffs_ptr[4];
void *buff_new[4] ;
cf_t * puntero;
puntero = &data_c[rxd_samples_total]; // Here I try to imitate the
behavior of buffs_ptr
for (int i=0;i<handler->nof_rx_channels;i++) {
cf_t *data_c = (cf_t*) data[i];
buffs_ptr[i] = &data_c[rxd_samples_total];
buff_new[i] = malloc(nsamples) ; //these is the pointer where i
would keep all the samples coming from UHD.
}
size_t num_samps_left = nsamples - rxd_samples_total;
size_t num_rx_samples = (num_samps_left > (handler->rx_nof_samples /
sratio)) ? (handler->rx_nof_samples / sratio) : num_samps_left;
// /sratio added for resampling.
rxd_samples = 0;
/*So these is the function that, as i understood, receive the samples
from UHD. Originally said buffs_ptr instead of buff_new, but because I
don't want to write the data with the samples that comes from UHD I give
her buff_new.*/
uhd_error error = uhd_rx_streamer_recv(handler->rx_stream,
/*buffs_ptr*/ buff_new,
num_rx_samples, md, 1.0,
false, &rxd_samples);
//Implementation of the resampling
srslte_resample_arb_t r;
srslte_resample_arb_init(&r,sratio,0);
size_t new_rxd_sample[SRSLTE_MAX_PORTS];
for(int i = 0 ; i < handler->nof_rx_channels ; i++){
new_rxd_sample[i] = srslte_resample_arb_compute(&r,(cf_t*)
buff_new[i], puntero, rxd_samples); //function returns new length.
}
for(int i = 0; i < handler->nof_rx_channels ; i++){
free(buff_new[i]); //we need to free the memory because we did a
malloc.
}
if (error) {
fprintf(stderr, "Error receiving from UHD: %d\n", error);
log_rx_error(handler);
return -1;
}
uhd_rx_metadata_error_code_t error_code = 0;
uhd_rx_metadata_error_code(*md, &error_code);
md = &handler->rx_md;
rxd_samples_total_new += new_rxd_sample[0];
rxd_samples_total += rxd_samples;
printf("\n----------------------------------------\nrxd samples total
new= %ld\nrxd samples total normal %ld\nrxd samples normal %ld\nrxd samples
new
%ld\n-----------------------------------------------\n",rxd_samples_total_new,rxd_samples_total,rxd_samples,new_rxd_sample[0]);
// I add these printf because I wanted to see the values of these variables.
trials++;
if (error_code == UHD_RX_METADATA_ERROR_CODE_OVERFLOW) {
log_overflow(handler);
} else if (error_code == UHD_RX_METADATA_ERROR_CODE_LATE_COMMAND) {
log_late(handler, true);
} else if (error_code == UHD_RX_METADATA_ERROR_CODE_TIMEOUT) {
fprintf(stderr, "Error timed out while receiving samples from
UHD.\n");
return -1;
} else if (error_code != UHD_RX_METADATA_ERROR_CODE_NONE ) {
fprintf(stderr, "Error code 0x%x was returned during streaming.
Aborting.\n", error_code);
}
}
} else {
uhd_error error = uhd_rx_streamer_recv(handler->rx_stream, data,
nsamples, md, 0.0, false, &rxd_samples);
rxd_samples_total = rxd_samples;
printf("NO entramos al IF\n");
if (error) {
fprintf(stderr, "Error receiving from UHD: %d\n", error);
log_rx_error(handler);
return -1;
}
}
if (secs && frac_secs) {
uhd_rx_metadata_time_spec(handler->rx_md_first, secs, frac_secs);
}
printf("\n\nOUT OF THE FUNCTION\n\n");
return rxd_samples_total_new; //I return the new length, I mean the
length the the resampled data will have, not the length of the data I
received from UHD.
}
So after I run the code, that is what I receive:
# srsenb
Built in Release mode using 18.12.0.
--- Software Radio Systems LTE eNodeB ---
Reading configuration file /root/.config/srslte/enb.conf...
[INFO] [UHD] linux; GNU C++ version 8.3.0; Boost_106700;
UHD_3.14.0.HEAD-0-g6875d061
Opening USRP with args:
[INFO] [USRP2] Opening a USRP2/N-Series device...
[INFO] [USRP2] Current recv frame size: 1472 bytes
[INFO] [USRP2] Current send frame size: 1472 bytes
[WARNING] [MULTI_USRP] The hardware does not support the requested RX
sample rate:
Target sample rate: 1.920000 MSps
Actual sample rate: 1.923077 MSps
[WARNING] [MULTI_USRP] The hardware does not support the requested TX
sample rate:
Target sample rate: 1.920000 MSps
Actual sample rate: 1.923077 MSps
Setting frequency: DL=2685.0 Mhz, UL=2565.0 MHz
Setting Sampling frequency 23.04 MHz
Setting manual TX/RX offset to 100 samples
==== eNodeB started ===
Type <t> to view trace
S1 Setup Failure. Cause: misc - unknown-PLMN
----------------------------------------
rxd samples total new= 84
rxd samples total normal 363
rxd samples normal 363
rxd samples new 84
-----------------------------------------------
----------------------------------------
rxd samples total new= 168
rxd samples total normal 726
rxd samples normal 363
rxd samples new 84
-----------------------------------------------
----------------------------------------
rxd samples total new= 172
rxd samples total normal 742
rxd samples normal 16
rxd samples new 4
-----------------------------------------------
----------------------------------------
rxd samples total new= 172
rxd samples total normal 742
rxd samples normal 0
rxd samples new 0
-----------------------------------------------
O
----------------------------------------
rxd samples total new= 172
rxd samples total normal 742
rxd samples normal 0
rxd samples new 0
-----------------------------------------------
Error timed out while receiving samples from UHD.
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
----------------------------------------
rxd samples total new= 0
rxd samples total normal 0
rxd samples normal 0
rxd samples new 0
-----------------------------------------------
Error timed out while receiving samples from UHD.
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
----------------------------------------
rxd samples total new= 0
rxd samples total normal 0
rxd samples normal 0
rxd samples new 0
-----------------------------------------------
Error timed out while receiving samples from UHD.
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
----------------------------------------
rxd samples total new= 0
rxd samples total normal 0
rxd samples normal 0
rxd samples new 0
-----------------------------------------------
Error timed out while receiving samples from UHD.
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
----------------------------------------
rxd samples total new= 0
rxd samples total normal 0
rxd samples normal 0
rxd samples new 0
-----------------------------------------------
Error timed out while receiving samples from UHD.
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
----------------------------------------
rxd samples total new= 0
rxd samples total normal 0
rxd samples normal 0
rxd samples new 0
-----------------------------------------------
Error timed out while receiving samples from UHD.
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
----------------------------------------
rxd samples total new= 0
rxd samples total normal 0
rxd samples normal 0
rxd samples new 0
-----------------------------------------------
Error timed out while receiving samples from UHD.
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^CStopping
srsENB... Press Ctrl+C 9 more times to force stop
----------------------------------------
rxd samples total new= 0
rxd samples total normal 0
rxd samples normal 0
rxd samples new 0
-----------------------------------------------
Error timed out while receiving samples from UHD.
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
----------------------------------------
rxd samples total new= 0
rxd samples total normal 0
rxd samples normal 0
rxd samples new 0
-----------------------------------------------
Error timed out while receiving samples from UHD.
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL---
exiting ---
One thing that I noticed is that the UHD always receive 742 samples and
then do not receive a simple sample more.
I don't know if i need to edit somewhere else in the code, but these of the
742 samples looks like that doesn't belong to the resampling problem.
I would be really grateful if any of you guys could give some help
Thanks in advance
Greeting!
Federico
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.srsran.com/pipermail/srsran-users/attachments/20190514/26f9edef/attachment.htm>
More information about the srsran-users
mailing list