Added PSBCH Extended CP

This commit is contained in:
luis_pereira87 2020-04-14 23:06:22 +01:00 committed by Andre Puschmann
parent ba4d0aa860
commit 653a1e0619
6 changed files with 62 additions and 45 deletions

View File

@ -91,7 +91,9 @@ typedef enum SRSLTE_API {
#define SRSLTE_SL_TM12_DEFAULT_NUM_DMRS_SYMBOLS (2) #define SRSLTE_SL_TM12_DEFAULT_NUM_DMRS_SYMBOLS (2)
#define SRSLTE_SL_TM34_DEFAULT_NUM_DMRS_SYMBOLS (4) ///< In TM3/4, all channels have 4 DMRS by default #define SRSLTE_SL_TM34_DEFAULT_NUM_DMRS_SYMBOLS (4) ///< In TM3/4, all channels have 4 DMRS by default
#define SRSLTE_PSBCH_TM12_NUM_DATA_SYMBOLS (8) ///< SL-BCH is in 8 OFDM symbols (but only 7 are tx'ed) #define SRSLTE_PSBCH_TM12_NUM_DATA_SYMBOLS (8) // PSBCH is in 8 OFDM symbols (but only 7 are tx'ed)
#define SRSLTE_PSBCH_TM12_NUM_DATA_SYMBOLS_EXT \
(6) // PSBCH is in 7 OFDM symbols for extended cyclic prefix (but only 6 are tx'ed)
#define SRSLTE_PSBCH_TM12_NUM_DMRS_SYMBOLS (2) ///< PSBCH has 2 DMRS symbols #define SRSLTE_PSBCH_TM12_NUM_DMRS_SYMBOLS (2) ///< PSBCH has 2 DMRS symbols
#define SRSLTE_PSBCH_TM12_NUM_SYNC_SYMBOLS (4) ///< Two symbols PSSS and two SSSS #define SRSLTE_PSBCH_TM12_NUM_SYNC_SYMBOLS (4) ///< Two symbols PSSS and two SSSS

View File

@ -35,11 +35,10 @@ int srslte_psbch_init(srslte_psbch_t* q, uint32_t nof_prb, uint32_t N_sl_id, srs
q->N_sl_id = N_sl_id; q->N_sl_id = N_sl_id;
q->tm = tm; q->tm = tm;
q->nof_prb = nof_prb; q->nof_prb = nof_prb;
if (SRSLTE_CP_ISEXT(cp)) { if (SRSLTE_CP_ISEXT(cp) && (tm >= SRSLTE_SIDELINK_TM3)) {
ERROR("Extended CP is not supported yet."); ERROR("Selected TM does not support extended CP");
return SRSLTE_ERROR; return SRSLTE_ERROR;
} }
q->cp = cp; q->cp = cp;
@ -48,6 +47,9 @@ int srslte_psbch_init(srslte_psbch_t* q, uint32_t nof_prb, uint32_t N_sl_id, srs
if (q->tm <= SRSLTE_SIDELINK_TM2) { if (q->tm <= SRSLTE_SIDELINK_TM2) {
q->nof_data_symbols = SRSLTE_PSBCH_TM12_NUM_DATA_SYMBOLS; q->nof_data_symbols = SRSLTE_PSBCH_TM12_NUM_DATA_SYMBOLS;
q->sl_bch_tb_len = SRSLTE_MIB_SL_LEN; q->sl_bch_tb_len = SRSLTE_MIB_SL_LEN;
if (SRSLTE_CP_ISEXT(cp)) {
q->nof_data_symbols = SRSLTE_PSBCH_TM12_NUM_DATA_SYMBOLS_EXT;
}
} else { } else {
q->nof_data_symbols = SRSLTE_PSBCH_TM34_NUM_DATA_SYMBOLS; q->nof_data_symbols = SRSLTE_PSBCH_TM34_NUM_DATA_SYMBOLS;
q->sl_bch_tb_len = SRSLTE_MIB_SL_V2X_LEN; q->sl_bch_tb_len = SRSLTE_MIB_SL_V2X_LEN;
@ -322,7 +324,7 @@ int srslte_psbch_put(srslte_psbch_t* q, cf_t* symbols, cf_t* sf_buffer)
uint32_t k = q->nof_prb * SRSLTE_NRE / 2 - 36; uint32_t k = q->nof_prb * SRSLTE_NRE / 2 - 36;
// Mapping to physical resources // Mapping to physical resources
for (uint32_t i = 0; i < SRSLTE_CP_NORM_SF_NSYMB; i++) { for (uint32_t i = 0; i < srslte_sl_get_num_symbols(q->tm, q->cp); i++) {
if (srslte_psbch_is_symbol(SRSLTE_SIDELINK_DATA_SYMBOL, q->tm, i, q->cp)) { if (srslte_psbch_is_symbol(SRSLTE_SIDELINK_DATA_SYMBOL, q->tm, i, q->cp)) {
memcpy(&sf_buffer[k + i * q->nof_prb * SRSLTE_NRE], memcpy(&sf_buffer[k + i * q->nof_prb * SRSLTE_NRE],
&symbols[sample_pos], &symbols[sample_pos],
@ -340,7 +342,7 @@ int srslte_psbch_get(srslte_psbch_t* q, cf_t* sf_buffer, cf_t* symbols)
uint32_t k = q->nof_prb * SRSLTE_NRE / 2 - 36; uint32_t k = q->nof_prb * SRSLTE_NRE / 2 - 36;
// Get PSBCH REs // Get PSBCH REs
for (uint32_t i = 0; i < SRSLTE_CP_NORM_SF_NSYMB; i++) { for (uint32_t i = 0; i < srslte_sl_get_num_symbols(q->tm, q->cp); i++) {
if (srslte_psbch_is_symbol(SRSLTE_SIDELINK_DATA_SYMBOL, q->tm, i, q->cp)) { if (srslte_psbch_is_symbol(SRSLTE_SIDELINK_DATA_SYMBOL, q->tm, i, q->cp)) {
memcpy(&symbols[sample_pos], memcpy(&symbols[sample_pos],
&sf_buffer[k + i * q->nof_prb * SRSLTE_NRE], &sf_buffer[k + i * q->nof_prb * SRSLTE_NRE],

View File

@ -43,6 +43,8 @@ target_link_libraries(psbch_test srslte_phy)
add_test(psbch_test_self_test_tm2_p6_c168_self psbch_test -p 6 -c 168 -t 2) add_test(psbch_test_self_test_tm2_p6_c168_self psbch_test -p 6 -c 168 -t 2)
add_test(psbch_test_self_test_tm2_p50_c168_self psbch_test -p 50 -c 252 -t 2) add_test(psbch_test_self_test_tm2_p50_c168_self psbch_test -p 50 -c 252 -t 2)
add_test(psbch_test_self_test_tm2_p100_c168_self psbch_test -p 100 -c 335 -t 2) add_test(psbch_test_self_test_tm2_p100_c168_self psbch_test -p 100 -c 335 -t 2)
add_test(psbch_test_self_test_tm2_p25_c168_ext_self psbch_test -p 25 -c 168 -e)
add_test(psbch_test_self_test_tm2_p100_c335_ext_self psbch_test -p 100 -c 335 -e)
# TM4 self tests # TM4 self tests
add_test(psbch_test_self_test_tm4_p6_c168_self psbch_test -p 6 -c 168 -t 4) add_test(psbch_test_self_test_tm4_p6_c168_self psbch_test -p 6 -c 168 -t 4)
@ -53,11 +55,12 @@ add_executable(psbch_file_test psbch_file_test.c)
target_link_libraries(psbch_file_test srslte_phy) target_link_libraries(psbch_file_test srslte_phy)
# TM2 file tests # TM2 file tests
add_test(psbch_file_test_ideal_tm2_p6_c0 psbch_file_test -p 6 -t 2 -c 0 -d -i ${CMAKE_HOME_DIRECTORY}/lib/src/phy/phch/test/signal_sidelink_ideal_tm2_p6_c0_s1.92e6.dat) add_test(psbch_file_test_ideal_tm2_p6_c0 psbch_file_test -p 6 -c 0 -d -i ${CMAKE_HOME_DIRECTORY}/lib/src/phy/phch/test/signal_sidelink_ideal_tm2_p6_c0_s1.92e6.dat)
add_test(psbch_file_test_ideal_tm2_p15_c84 psbch_file_test -p 15 -t 2 -c 84 -d -i ${CMAKE_HOME_DIRECTORY}/lib/src/phy/phch/test/signal_sidelink_ideal_tm2_p15_c84_s3.84e6.dat) add_test(psbch_file_test_ideal_tm2_p15_c84 psbch_file_test -p 15 -c 84 -d -i ${CMAKE_HOME_DIRECTORY}/lib/src/phy/phch/test/signal_sidelink_ideal_tm2_p15_c84_s3.84e6.dat)
add_test(psbch_file_test_ideal_tm2_p25_c168 psbch_file_test -p 25 -t 2 -c 168 -d -i ${CMAKE_HOME_DIRECTORY}/lib/src/phy/phch/test/signal_sidelink_ideal_tm2_p25_c168_s7.68e6.dat) add_test(psbch_file_test_ideal_tm2_p25_c168 psbch_file_test -p 25 -c 168 -d -i ${CMAKE_HOME_DIRECTORY}/lib/src/phy/phch/test/signal_sidelink_ideal_tm2_p25_c168_s7.68e6.dat)
add_test(psbch_file_test_ideal_tm2_p50_c252 psbch_file_test -p 50 -t 2 -c 252 -d -i ${CMAKE_HOME_DIRECTORY}/lib/src/phy/phch/test/signal_sidelink_ideal_tm2_p50_c252_s15.36e6.dat) add_test(psbch_file_test_ideal_tm2_p50_c252 psbch_file_test -p 50 -c 252 -d -i ${CMAKE_HOME_DIRECTORY}/lib/src/phy/phch/test/signal_sidelink_ideal_tm2_p50_c252_s15.36e6.dat)
add_test(psbch_file_test_ideal_tm2_p100_c335 psbch_file_test -p 100 -t 2 -c 335 -d -i ${CMAKE_HOME_DIRECTORY}/lib/src/phy/phch/test/signal_sidelink_ideal_tm2_p100_c335_s30.72e6.dat) add_test(psbch_file_test_ideal_tm2_p100_c335 psbch_file_test -p 100 -c 335 -d -i ${CMAKE_HOME_DIRECTORY}/lib/src/phy/phch/test/signal_sidelink_ideal_tm2_p100_c335_s30.72e6.dat)
add_test(psbch_file_test_ideal_tm2_p50_c252_ext psbch_file_test -p 50 -c 252 -e -d -i ${CMAKE_HOME_DIRECTORY}/lib/src/phy/phch/test/signal_sidelink_ideal_tm2_p50_c252_s15.36e6_ext.dat)
# TM4 file tests # TM4 file tests
add_test(psbch_file_test_cmw_tm4_p50_c169 psbch_file_test -p 50 -c 169 -t 4 -i ${CMAKE_HOME_DIRECTORY}/lib/src/phy/phch/test/signal_sidelink_cmw500_f5.92e9_s11.52e6_50prb_slss_id169.dat) add_test(psbch_file_test_cmw_tm4_p50_c169 psbch_file_test -p 50 -c 169 -t 4 -i ${CMAKE_HOME_DIRECTORY}/lib/src/phy/phch/test/signal_sidelink_cmw500_f5.92e9_s11.52e6_50prb_slss_id169.dat)

View File

@ -29,18 +29,16 @@
#include "srslte/phy/io/filesource.h" #include "srslte/phy/io/filesource.h"
#include "srslte/phy/phch/mib_sl.h" #include "srslte/phy/phch/mib_sl.h"
#include "srslte/phy/phch/psbch.h" #include "srslte/phy/phch/psbch.h"
#include "srslte/phy/sync/cfo.h"
#include "srslte/phy/utils/debug.h" #include "srslte/phy/utils/debug.h"
#include "srslte/phy/utils/vector.h" #include "srslte/phy/utils/vector.h"
srslte_cell_sl_t cell = {.nof_prb = 6, .N_sl_id = 168, .tm = SRSLTE_SIDELINK_TM2, .cp = SRSLTE_CP_NORM}; srslte_cell_sl_t cell = {.nof_prb = 6, .N_sl_id = 168, .tm = SRSLTE_SIDELINK_TM2, .cp = SRSLTE_CP_NORM};
char* input_file_name;
char* input_file_name; uint32_t offset = 0;
uint32_t offset = 0; float frequency_offset = 0.0;
float frequency_offset = 0.0; float snr = 100.0;
float snr = 100.0; bool use_standard_lte_rates = false;
bool use_standard_lte_rates = false; bool do_equalization = true;
bool do_equalization = true;
srslte_filesource_t fsrc; srslte_filesource_t fsrc;
@ -107,6 +105,11 @@ void parse_args(int argc, char** argv)
exit(-1); exit(-1);
} }
} }
if (SRSLTE_CP_ISEXT(cell.cp) && cell.tm >= SRSLTE_SIDELINK_TM3) {
ERROR("Selected TM does not support extended CP");
usage(argv[0]);
exit(-1);
}
} }
int main(int argc, char** argv) int main(int argc, char** argv)
@ -122,7 +125,7 @@ int main(int argc, char** argv)
uint32_t sf_n_samples = srslte_symbol_sz(cell.nof_prb) * 15; uint32_t sf_n_samples = srslte_symbol_sz(cell.nof_prb) * 15;
printf("sf_n_samples: %i\n", sf_n_samples); printf("sf_n_samples: %i\n", sf_n_samples);
uint32_t sf_n_re = SRSLTE_CP_NSYMB(cell.cp) * SRSLTE_NRE * 2 * cell.nof_prb; uint32_t sf_n_re = SRSLTE_SF_LEN_RE(cell.nof_prb, cell.cp);
cf_t* sf_buffer = srslte_vec_cf_malloc(sf_n_re); cf_t* sf_buffer = srslte_vec_cf_malloc(sf_n_re);
cf_t* equalized_sf_buffer = srslte_vec_cf_malloc(sf_n_re); cf_t* equalized_sf_buffer = srslte_vec_cf_malloc(sf_n_re);
@ -149,7 +152,7 @@ int main(int argc, char** argv)
// PSBCH // PSBCH
srslte_psbch_t psbch; srslte_psbch_t psbch;
if (srslte_psbch_init(&psbch, cell.nof_prb, cell.N_sl_id, cell.tm, SRSLTE_CP_NORM) != SRSLTE_SUCCESS) { if (srslte_psbch_init(&psbch, cell.nof_prb, cell.N_sl_id, cell.tm, cell.cp) != SRSLTE_SUCCESS) {
ERROR("Error in psbch init\n"); ERROR("Error in psbch init\n");
return SRSLTE_ERROR; return SRSLTE_ERROR;
} }

View File

@ -20,7 +20,6 @@
*/ */
#include <stdio.h> #include <stdio.h>
#include <string.h>
#include <strings.h> #include <strings.h>
#include <unistd.h> #include <unistd.h>
@ -30,18 +29,15 @@
#include <srslte/phy/utils/debug.h> #include <srslte/phy/utils/debug.h>
#include <srslte/phy/utils/vector.h> #include <srslte/phy/utils/vector.h>
int32_t N_sl_id = 168; srslte_cell_sl_t cell = {.nof_prb = 6, .N_sl_id = 168, .tm = SRSLTE_SIDELINK_TM2, .cp = SRSLTE_CP_NORM};
srslte_cp_t cp = SRSLTE_CP_NORM;
uint32_t nof_prb = 6;
srslte_sl_tm_t tm = SRSLTE_SIDELINK_TM2;
void usage(char* prog) void usage(char* prog)
{ {
printf("Usage: %s [cdeipt]\n", prog); printf("Usage: %s [cdeipt]\n", prog);
printf("\t-p nof_prb [Default %d]\n", nof_prb); printf("\t-p nof_prb [Default %d]\n", cell.nof_prb);
printf("\t-e extended CP [Default normal]\n"); printf("\t-e extended CP [Default normal]\n");
printf("\t-c N_sl_id [Default %d]\n", N_sl_id); printf("\t-c N_sl_id [Default %d]\n", cell.N_sl_id);
printf("\t-t Sidelink transmission mode {1,2,3,4} [Default %d]\n", (tm + 1)); printf("\t-t Sidelink transmission mode {1,2,3,4} [Default %d]\n", (cell.tm + 1));
printf("\t-v [set srslte_verbose to debug, default none]\n"); printf("\t-v [set srslte_verbose to debug, default none]\n");
} }
@ -51,27 +47,27 @@ void parse_args(int argc, char** argv)
while ((opt = getopt(argc, argv, "ceiptv")) != -1) { while ((opt = getopt(argc, argv, "ceiptv")) != -1) {
switch (opt) { switch (opt) {
case 'c': case 'c':
N_sl_id = (int32_t)strtol(argv[optind], NULL, 10); cell.N_sl_id = (int32_t)strtol(argv[optind], NULL, 10);
break; break;
case 'e': case 'e':
cp = SRSLTE_CP_EXT; cell.cp = SRSLTE_CP_EXT;
break; break;
case 'p': case 'p':
nof_prb = (uint32_t)strtol(argv[optind], NULL, 10); cell.nof_prb = (uint32_t)strtol(argv[optind], NULL, 10);
break; break;
case 't': case 't':
switch (strtol(argv[optind], NULL, 10)) { switch (strtol(argv[optind], NULL, 10)) {
case 1: case 1:
tm = SRSLTE_SIDELINK_TM1; cell.tm = SRSLTE_SIDELINK_TM1;
break; break;
case 2: case 2:
tm = SRSLTE_SIDELINK_TM2; cell.tm = SRSLTE_SIDELINK_TM2;
break; break;
case 3: case 3:
tm = SRSLTE_SIDELINK_TM3; cell.tm = SRSLTE_SIDELINK_TM3;
break; break;
case 4: case 4:
tm = SRSLTE_SIDELINK_TM4; cell.tm = SRSLTE_SIDELINK_TM4;
break; break;
default: default:
usage(argv[0]); usage(argv[0]);
@ -87,6 +83,11 @@ void parse_args(int argc, char** argv)
exit(-1); exit(-1);
} }
} }
if (SRSLTE_CP_ISEXT(cell.cp) && cell.tm >= SRSLTE_SIDELINK_TM3) {
ERROR("Selected TM does not support extended CP");
usage(argv[0]);
exit(-1);
}
} }
int main(int argc, char** argv) int main(int argc, char** argv)
@ -95,17 +96,17 @@ int main(int argc, char** argv)
parse_args(argc, argv); parse_args(argc, argv);
uint32_t sf_n_re = SRSLTE_SF_LEN_RE(nof_prb, cp); uint32_t sf_n_re = SRSLTE_SF_LEN_RE(cell.nof_prb, cell.cp);
cf_t* sf_buffer = srslte_vec_cf_malloc(sf_n_re); cf_t* sf_buffer = srslte_vec_cf_malloc(sf_n_re);
// MIB-SL // MIB-SL
srslte_mib_sl_t mib_sl; srslte_mib_sl_t mib_sl;
srslte_mib_sl_init(&mib_sl, tm); srslte_mib_sl_init(&mib_sl, cell.tm);
srslte_mib_sl_set(&mib_sl, nof_prb, 0, 128, 4, false); srslte_mib_sl_set(&mib_sl, cell.nof_prb, 0, 128, 4, false);
// PSBCH // PSBCH
srslte_psbch_t psbch; srslte_psbch_t psbch;
if (srslte_psbch_init(&psbch, nof_prb, N_sl_id, tm, SRSLTE_CP_NORM) != SRSLTE_SUCCESS) { if (srslte_psbch_init(&psbch, cell.nof_prb, cell.N_sl_id, cell.tm, cell.cp) != SRSLTE_SUCCESS) {
ERROR("Error in psbch init\n"); ERROR("Error in psbch init\n");
return SRSLTE_ERROR; return SRSLTE_ERROR;
} }
@ -132,16 +133,22 @@ int main(int argc, char** argv)
srslte_mib_sl_printf(stdout, &mib_sl); srslte_mib_sl_printf(stdout, &mib_sl);
// check decoded bandwidth matches user configured value // check decoded bandwidth matches user configured value
if (srslte_mib_sl_bandwith_to_prb[mib_sl.sl_bandwidth_r12] == nof_prb) { if (srslte_mib_sl_bandwith_to_prb[mib_sl.sl_bandwidth_r12] == cell.nof_prb) {
ret = SRSLTE_SUCCESS; ret = SRSLTE_SUCCESS;
} }
} }
// Sanity check (less REs are transmitted than mapped) // Sanity check (less REs are transmitted than mapped)
if (tm <= SRSLTE_SIDELINK_TM2) { if (cell.tm <= SRSLTE_SIDELINK_TM2) {
// TM1 and TM2 have always 576 mapped PSBCH resource elements of which 504 are transmitted if (SRSLTE_CP_ISNORM(cell.cp)) {
TESTASSERT(psbch.nof_data_re == 576); // TM1 and TM2 have always 576 mapped PSBCH resource elements of which 504 are transmitted
TESTASSERT(psbch.nof_tx_re == 504); TESTASSERT(psbch.nof_data_re == 576);
TESTASSERT(psbch.nof_tx_re == 504);
} else {
// TM1 and TM2 with extended cp have always 432 mapped PSBCH resource elements of which 360 are transmitted
TESTASSERT(psbch.nof_data_re == 432);
TESTASSERT(psbch.nof_tx_re == 360);
}
} else { } else {
// TM3 and TM4 have always 504 mapped PSBCH resource elements of which 432 are transmitted // TM3 and TM4 have always 504 mapped PSBCH resource elements of which 432 are transmitted
TESTASSERT(psbch.nof_data_re == 504); TESTASSERT(psbch.nof_data_re == 504);