Skip to content

Commit 6d80e7e

Browse files
Fix cyclic prefix length of first symbol for 5g NR PUSCH
Signed-off-by: Daniel Schäufele <[email protected]>
1 parent 0aeca34 commit 6d80e7e

File tree

3 files changed

+61
-9
lines changed

3 files changed

+61
-9
lines changed

sionna/nr/carrier_config.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
"""
77
# pylint: disable=line-too-long
88

9+
import numpy as np
10+
911
from .config import Config
1012

1113
class CarrierConfig(Config):
@@ -244,16 +246,23 @@ def kappa(self):
244246
@property
245247
def cyclic_prefix_length(self):
246248
r"""
247-
float, read-only : Cyclic prefix length
249+
np.ndarray[float], read-only : Vector of cyclic prefix length of all
250+
symbols in the current slot as defined in Section 5.3.1 [3GPP38211]_
248251
:math:`N_{\text{CP},l}^{\mu} \cdot T_{\text{c}}` [s]
249252
"""
250-
if self.cyclic_prefix=="extended":
251-
cp = 512*self.kappa*2**(-self.mu)
253+
cp = np.zeros(self.num_symbols_per_slot)
254+
if self.cyclic_prefix == "extended":
255+
cp[:] = 512 * self.kappa * 2 ** (-self.mu)
252256
else:
253-
cp = 144*self.kappa*2**(-self.mu)
254-
if self.slot_number in [0, 7*2**self.mu]:
255-
cp += 16*self.kappa
256-
return cp*self.t_c
257+
cp[:] = 144 * self.kappa * 2 ** (-self.mu)
258+
259+
# Extend cyclic prefix for l=0 or l=7*2^\mu
260+
long_cp_period = 7 * 2 ** self.mu
261+
l_start = self.slot_number * self.num_symbols_per_slot
262+
for i in range(l_start % long_cp_period,
263+
self.num_symbols_per_slot, long_cp_period):
264+
cp[i] += 16 * self.kappa
265+
return cp * self.t_c
257266

258267
#-------------------#
259268
#---Class methods---#

sionna/nr/pusch_transmitter.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,9 @@ def __init__(self,
168168
subcarrier_spacing=self._subcarrier_spacing,
169169
num_tx=self._num_tx,
170170
num_streams_per_tx=self._num_layers,
171-
cyclic_prefix_length=self._cyclic_prefix_length,
171+
# TODO: pass vector of cyclic prefix lengths
172+
# (requires rewrite of channel simulation code)
173+
cyclic_prefix_length=self._cyclic_prefix_length[1],
172174
pilot_pattern=self._pilot_pattern,
173175
dtype=dtype)
174176

test/unit/nr/test_pusch_config.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import numpy as np
99
import tensorflow as tf
1010
import sionna
11-
from sionna.nr import PUSCHConfig
11+
from sionna.nr import PUSCHConfig, CarrierConfig
1212
from sionna import config
1313

1414
script_dir = os.path.dirname(os.path.abspath(__file__))
@@ -228,3 +228,44 @@ def test_precoding_against_reference(self):
228228
for i in range(5):
229229
pusch_config.tpmi = i
230230
self.assertTrue(np.allclose(pusch_config.dmrs_grid_precoded/np.sqrt(3), ref[i]))
231+
232+
233+
class TestCarrierConfig(unittest.TestCase):
234+
"""Tests for the CarrierConfig Class"""
235+
236+
def test_cyclic_prefix_length(self):
237+
carrier_config = CarrierConfig(subcarrier_spacing=15, slot_number=0)
238+
np.testing.assert_array_almost_equal(carrier_config.cyclic_prefix_length * 1e6, ([5.2] + [4.69]*6)*2, decimal=2)
239+
carrier_config = CarrierConfig(subcarrier_spacing=15, slot_number=1)
240+
np.testing.assert_array_almost_equal(carrier_config.cyclic_prefix_length * 1e6, ([5.2] + [4.69]*6)*2, decimal=2)
241+
242+
carrier_config = CarrierConfig(subcarrier_spacing=30, slot_number=0)
243+
np.testing.assert_array_almost_equal(carrier_config.cyclic_prefix_length * 1e6, [2.86] + [2.34]*13, decimal=2)
244+
carrier_config = CarrierConfig(subcarrier_spacing=30, slot_number=1)
245+
np.testing.assert_array_almost_equal(carrier_config.cyclic_prefix_length * 1e6, [2.86] + [2.34]*13, decimal=2)
246+
247+
carrier_config = CarrierConfig(subcarrier_spacing=60, slot_number=0)
248+
np.testing.assert_array_almost_equal(carrier_config.cyclic_prefix_length * 1e6, [1.69] + [1.17]*13, decimal=2)
249+
carrier_config = CarrierConfig(subcarrier_spacing=60, slot_number=1)
250+
np.testing.assert_array_almost_equal(carrier_config.cyclic_prefix_length * 1e6, [1.17] * 14, decimal=2)
251+
252+
carrier_config = CarrierConfig(subcarrier_spacing=60, slot_number=0, cyclic_prefix='extended')
253+
np.testing.assert_array_almost_equal(carrier_config.cyclic_prefix_length * 1e6, [4.17] * 12, decimal=2)
254+
carrier_config = CarrierConfig(subcarrier_spacing=60, slot_number=1, cyclic_prefix='extended')
255+
np.testing.assert_array_almost_equal(carrier_config.cyclic_prefix_length * 1e6, [4.17] * 12, decimal=2)
256+
257+
carrier_config = CarrierConfig(subcarrier_spacing=120, slot_number=0)
258+
np.testing.assert_array_almost_equal(carrier_config.cyclic_prefix_length * 1e6, [1.11] + [0.59] * 13, decimal=2)
259+
carrier_config = CarrierConfig(subcarrier_spacing=120, slot_number=1)
260+
np.testing.assert_array_almost_equal(carrier_config.cyclic_prefix_length * 1e6, [0.59] * 14, decimal=2)
261+
carrier_config = CarrierConfig(subcarrier_spacing=120, slot_number=2)
262+
np.testing.assert_array_almost_equal(carrier_config.cyclic_prefix_length * 1e6, [0.59] * 14, decimal=2)
263+
carrier_config = CarrierConfig(subcarrier_spacing=120, slot_number=3)
264+
np.testing.assert_array_almost_equal(carrier_config.cyclic_prefix_length * 1e6, [0.59] * 14, decimal=2)
265+
carrier_config = CarrierConfig(subcarrier_spacing=120, slot_number=4)
266+
np.testing.assert_array_almost_equal(carrier_config.cyclic_prefix_length * 1e6, [1.11] + [0.59] * 13, decimal=2)
267+
268+
carrier_config = CarrierConfig(subcarrier_spacing=240, slot_number=0)
269+
np.testing.assert_array_almost_equal(carrier_config.cyclic_prefix_length * 1e6, [0.81] + [0.29] * 13, decimal=2)
270+
carrier_config = CarrierConfig(subcarrier_spacing=240, slot_number=1)
271+
np.testing.assert_array_almost_equal(carrier_config.cyclic_prefix_length * 1e6, [0.29] * 14, decimal=2)

0 commit comments

Comments
 (0)