@@ -39,48 +39,42 @@ void pbch_modulator_impl::modulate(span<const uint8_t> b_hat, span<cf_t> d_pbch)
3939
4040void pbch_modulator_impl::map (span<const cf_t > d_pbch, resource_grid_writer& grid, const config_t & config)
4141{
42- unsigned count = 0 ;
43- unsigned l0 = config.ssb_first_symbol ;
44- unsigned k0 = config.ssb_first_subcarrier ;
42+ unsigned l0 = config.ssb_first_symbol ;
43+ unsigned k0 = config.ssb_first_subcarrier ;
4544
46- // Calculate DMRS index shift
45+ // Calculate DM-RS index shift.
4746 uint32_t v = config.phys_cell_id % 4 ;
4847
49- // Create resource grid coordinates
50- std::array<resource_grid_coordinate, M_symb> coordinates;
48+ // Resource element mask within each resource block. Remove DM-RS from the mask.
49+ bounded_bitset<NRE> re_mask = ~bounded_bitset<NRE>(NRE);
50+ re_mask.reset (v);
51+ re_mask.reset (v + 4 );
52+ re_mask.reset (v + 8 );
5153
52- // Put sequence in symbol 1 (0, 1, ..., 239) not reserved for PBCH DM-RS
53- for (uint32_t k = 0 ; k < SSB_BW_RE; ++k) {
54- if (k % 4 != v) {
55- coordinates[count++] = {l0 + 1 , k0 + k};
56- }
57- }
54+ // Full SS/PBCH block bandwidth resource blocks.
55+ bounded_bitset<MAX_RB> rb_full_mask = ~bounded_bitset<MAX_RB>(SSB_BW_RB);
56+ bounded_bitset<NRE* MAX_RB> full_mask = rb_full_mask.kronecker_product <NRE>(re_mask);
5857
59- // Put sequence in symbol 2, lower section (0 + v , 4 + v , 8 + v ,..., 44 + v) not reserved for PBCH DM-RS
60- for (uint32_t k = 0 ; k < 48 ; ++k) {
61- if (k % 4 != v) {
62- coordinates[count++] = {l0 + 2 , k0 + k};
63- }
64- }
58+ // Edges SS/PBCH block bandwidth resource blocks.
59+ bounded_bitset<MAX_RB> rb_edge_mask = bounded_bitset<MAX_RB>(SSB_BW_RB);
60+ rb_edge_mask.fill (0 , 4 );
61+ rb_edge_mask.fill (16 , 20 );
62+ bounded_bitset<NRE* MAX_RB> edge_mask = rb_edge_mask.kronecker_product <NRE>(re_mask);
6563
66- // Put sequence in symbol 2, upper section (192 + v , 196 + v ,..., 236 + v) not reserved for PBCH DM-RS
67- for (uint32_t k = 192 ; k < SSB_BW_RE; ++k) {
68- if (k % 4 != v) {
69- coordinates[count++] = {l0 + 2 , k0 + k};
70- }
71- }
64+ // Map symbols for each of the ports.
65+ for (unsigned port : config.ports ) {
66+ span<const cf_t > symbols = d_pbch;
7267
73- // Put sequence in symbol 3 (0, 1, ..., 239) not reserved for PBCH DM-RS
74- for (uint32_t k = 0 ; k < SSB_BW_RE; ++k) {
75- if (k % 4 != v) {
76- coordinates[count++] = {l0 + 3 , k0 + k};
77- }
78- }
68+ // Put sequence in symbol 1 (0, 1, ..., 239), skip the subcarriers reserved for PBCH DM-RS.
69+ symbols = grid.put (port, l0 + 1 , k0, full_mask, symbols);
7970
80- // For each port
81- for (unsigned port : config.ports ) {
82- // write data in grid
83- grid.put (port, coordinates, d_pbch);
71+ // Put sequence in symbol 2 (0, 1, ..., 41) and (192, 193, ..., 239), skip the subcarriers reserved for PBCH DM-RS.
72+ symbols = grid.put (port, l0 + 2 , k0, edge_mask, symbols);
73+
74+ // Put sequence in symbol 3 (0, 1, ..., 239), skip the subcarriers reserved for PBCH DM-RS.
75+ symbols = grid.put (port, l0 + 3 , k0, full_mask, symbols);
76+
77+ srsran_assert (symbols.empty (), " Symbols must be empty." );
8478 }
8579}
8680
0 commit comments