Merge remote-tracking branch 'remotes/origin/master' into develop_SA_L3
This commit is contained in:
@@ -12,3 +12,9 @@ targets/bin/
|
|||||||
|
|
||||||
# vscode
|
# vscode
|
||||||
.vscode
|
.vscode
|
||||||
|
|
||||||
|
# Tags for vim/global
|
||||||
|
GPATH
|
||||||
|
GRTAGS
|
||||||
|
GTAGS
|
||||||
|
tags
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
import sys # arg
|
import sys # arg
|
||||||
import re # reg
|
import re # reg
|
||||||
import yaml
|
import yaml
|
||||||
|
import constants as CONST
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Parsing Command Line Arguements
|
# Parsing Command Line Arguements
|
||||||
|
|||||||
+83
-33
@@ -27,61 +27,111 @@
|
|||||||
# pexpect
|
# pexpect
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
|
#to use isfile
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
#to use logging.info()
|
#to use logging.info()
|
||||||
import logging
|
import logging
|
||||||
#to create a SSH object locally in the methods
|
#to create a SSH object locally in the methods
|
||||||
import sshconnection
|
import sshconnection
|
||||||
#time.sleep
|
#time.sleep
|
||||||
import time
|
import time
|
||||||
|
#to load cots_ue dictionary
|
||||||
|
import yaml
|
||||||
|
|
||||||
class CotsUe:
|
class CotsUe:
|
||||||
def __init__(self,model,UEIPAddr,UEUserName,UEPassWord):
|
def __init__(self,ADBIPAddr,ADBUserName,ADBPassWord):
|
||||||
self.model = model
|
self.cots_id = '' #cots id from yaml oppo, s10 etc...
|
||||||
self.UEIPAddr = UEIPAddr
|
self.ADBIPAddr = ADBIPAddr
|
||||||
self.UEUserName = UEUserName
|
self.ADBUserName = ADBUserName
|
||||||
self.UEPassWord = UEPassWord
|
self.ADBPassWord = ADBPassWord
|
||||||
self.runargs = '' #on of off to toggle airplane mode on/off
|
self.cots_run_mode = '' #on of off to toggle airplane mode on/off
|
||||||
|
self.__cots_cde_dict_file = 'cots_ue_ctl.yaml'
|
||||||
self.__SetAirplaneRetry = 3
|
self.__SetAirplaneRetry = 3
|
||||||
|
|
||||||
|
|
||||||
#-----------------$
|
#-----------------$
|
||||||
#PUBLIC Methods$
|
#PUBLIC Methods$
|
||||||
#-----------------$
|
#-----------------$
|
||||||
|
|
||||||
def Check_Airplane(self):
|
def Check_Airplane(self):
|
||||||
mySSH = sshconnection.SSHConnection()
|
mySSH = sshconnection.SSHConnection()
|
||||||
mySSH.open(self.UEIPAddr, self.UEUserName, self.UEPassWord)
|
mySSH.open(self.ADBIPAddr, self.ADBUserName, self.ADBPassWord)
|
||||||
status=mySSH.cde_check_value('sudo adb shell settings get global airplane_mode_on ', ['0','1'],5)
|
status=mySSH.cde_check_value('adb shell settings get global airplane_mode_on ', ['0','1'],5)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
return status
|
return status
|
||||||
|
|
||||||
|
#simply check if the device id exists in the dictionary
|
||||||
def Set_Airplane(self,target_state_str):
|
#returns true if it exists, false otherwise
|
||||||
mySSH = sshconnection.SSHConnection()
|
def Check_Exists(self,target_id):
|
||||||
mySSH.open(self.UEIPAddr, self.UEUserName, self.UEPassWord)
|
#load cots commands dictionary
|
||||||
mySSH.command('sudo adb start-server','$',5)
|
if (os.path.isfile(self.__cots_cde_dict_file)):
|
||||||
logging.info("Toggling COTS UE Airplane mode to : "+target_state_str)
|
yaml_file=self.__cots_cde_dict_file
|
||||||
current_state = self.Check_Airplane()
|
elif (os.path.isfile('ci-scripts/'+self.__cots_cde_dict_file)):
|
||||||
if target_state_str.lower()=="on":
|
yaml_file='ci-scripts/'+self.__cots_cde_dict_file
|
||||||
target_state=1
|
|
||||||
else:
|
else:
|
||||||
target_state=0
|
logging.error("COTS UE dictionary yaml file cannot be found")
|
||||||
if current_state != target_state:
|
sys.exit("COTS UE dictionary yaml file cannot be found")
|
||||||
#toggle state
|
|
||||||
retry = 0
|
#load cots commands dictionary
|
||||||
while (current_state!=target_state) and (retry < self.__SetAirplaneRetry):
|
with open(yaml_file,'r') as file:
|
||||||
mySSH.command('sudo adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS', '\$', 5)
|
cots_ue_ctl = yaml.load(file,Loader=yaml.FullLoader)
|
||||||
mySSH.command('sudo adb shell input keyevent 20', '\$', 5)
|
#check if ue id is in the dictionary
|
||||||
mySSH.command('sudo adb shell input tap 968 324', '\$', 5)
|
if target_id in cots_ue_ctl:
|
||||||
time.sleep(1)
|
return True
|
||||||
current_state = self.Check_Airplane()
|
else:
|
||||||
retry+=1
|
return False
|
||||||
|
|
||||||
|
def Set_Airplane(self, target_id, target_state_str):
|
||||||
|
#loading cots commands dictionary
|
||||||
|
|
||||||
|
if (os.path.isfile(self.__cots_cde_dict_file)):
|
||||||
|
yaml_file=self.__cots_cde_dict_file
|
||||||
|
elif (os.path.isfile('ci-scripts/'+self.__cots_cde_dict_file)):
|
||||||
|
yaml_file='ci-scripts/'+self.__cots_cde_dict_file
|
||||||
|
else:
|
||||||
|
logging.error("COTS UE dictionary yaml file cannot be found")
|
||||||
|
sys.exit("COTS UE dictionary yaml file cannot be found")
|
||||||
|
|
||||||
|
#load cots commands dictionary
|
||||||
|
with open(yaml_file,'r') as file:
|
||||||
|
cots_ue_ctl = yaml.load(file,Loader=yaml.FullLoader)
|
||||||
|
#check if ue id is in the dictionary
|
||||||
|
if target_id in cots_ue_ctl:
|
||||||
|
mySSH = sshconnection.SSHConnection()
|
||||||
|
mySSH.open(self.ADBIPAddr, self.ADBUserName, self.ADBPassWord)
|
||||||
|
logging.info(str(self.ADBIPAddr)+' '+str(self.ADBUserName)+' '+str(self.ADBPassWord))
|
||||||
|
mySSH.command('adb start-server','\$',5)
|
||||||
|
mySSH.command('adb devices','\$',5)
|
||||||
|
logging.info("Toggling COTS UE Airplane mode to : "+target_state_str)
|
||||||
|
#get current state
|
||||||
|
current_state = self.Check_Airplane()
|
||||||
|
if target_state_str.lower()=="on":
|
||||||
|
target_state=1
|
||||||
|
else:
|
||||||
|
target_state=0
|
||||||
if current_state != target_state:
|
if current_state != target_state:
|
||||||
logging.error("ATTENTION : Could not toggle to : "+target_state_str)
|
#toggle state
|
||||||
logging.error("Current state is : "+ str(current_state))
|
retry = 0
|
||||||
|
while (current_state!=target_state) and (retry < self.__SetAirplaneRetry):
|
||||||
|
#loop over the command list from dictionary for the selected ue, to switch to required state
|
||||||
|
for i in range (0,len(cots_ue_ctl[target_id])):
|
||||||
|
mySSH.command(cots_ue_ctl[target_id][i], '\$', 5)
|
||||||
|
time.sleep(1)
|
||||||
|
current_state = self.Check_Airplane()
|
||||||
|
retry+=1
|
||||||
|
#could not toggle despite the retry
|
||||||
|
if current_state != target_state:
|
||||||
|
logging.error("ATTENTION : Could not toggle to : "+target_state_str)
|
||||||
|
logging.error("Current state is : "+ str(current_state))
|
||||||
|
else:
|
||||||
|
logging.info("Airplane mode is already "+ target_state_str)
|
||||||
|
mySSH.command('adb kill-server','\$',5)
|
||||||
|
mySSH.close()
|
||||||
|
#ue id is NOT in the dictionary
|
||||||
else:
|
else:
|
||||||
print("Airplane mode is already "+ target_state_str)
|
logging.error("COTS UE Id from XML could not be found in UE YAML dictionary " + self.__cots_cde_dict_file)
|
||||||
mySSH.command('sudo adb kill-server','$',5)
|
sys.exit("COTS UE Id from XML could not be found in UE YAML dictionary " + self.__cots_cde_dict_file)
|
||||||
mySSH.close()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -71,6 +71,12 @@ gNBs =
|
|||||||
initialDLBWPmappingType_2 = 0;
|
initialDLBWPmappingType_2 = 0;
|
||||||
#this is SS=1,L=12
|
#this is SS=1,L=12
|
||||||
initialDLBWPstartSymbolAndLength_2 = 54;
|
initialDLBWPstartSymbolAndLength_2 = 54;
|
||||||
|
|
||||||
|
initialDLBWPk0_3 = 0;
|
||||||
|
initialDLBWPmappingType_3 = 0;
|
||||||
|
#this is SS=1,L=4
|
||||||
|
initialDLBWPstartSymbolAndLength_3 = 57;
|
||||||
|
|
||||||
#uplinkConfigCommon
|
#uplinkConfigCommon
|
||||||
#frequencyInfoUL
|
#frequencyInfoUL
|
||||||
ul_frequencyBand = 78;
|
ul_frequencyBand = 78;
|
||||||
@@ -105,8 +111,8 @@ gNBs =
|
|||||||
#1,2,4,8,10,20,40,80
|
#1,2,4,8,10,20,40,80
|
||||||
ra_ResponseWindow = 4;
|
ra_ResponseWindow = 4;
|
||||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||||
#0=oneeighth,1=onefourth,2=half,3=one,4=two,5=four,6=eight,7=sixteen
|
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
||||||
#ra_ContentionResolutionTimer
|
#ra_ContentionResolutionTimer
|
||||||
@@ -114,8 +120,8 @@ gNBs =
|
|||||||
ra_ContentionResolutionTimer = 7;
|
ra_ContentionResolutionTimer = 7;
|
||||||
rsrp_ThresholdSSB = 19;
|
rsrp_ThresholdSSB = 19;
|
||||||
#prach-RootSequenceIndex_PR
|
#prach-RootSequenceIndex_PR
|
||||||
#0 = 839, 1 = 139
|
#1 = 839, 2 = 139
|
||||||
prach_RootSequenceIndex_PR = 1;
|
prach_RootSequenceIndex_PR = 2;
|
||||||
prach_RootSequenceIndex = 1;
|
prach_RootSequenceIndex = 1;
|
||||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||||
#
|
#
|
||||||
@@ -135,7 +141,11 @@ gNBs =
|
|||||||
# this is SS=0 L=12
|
# this is SS=0 L=12
|
||||||
initialULBWPstartSymbolAndLength_1 = 69;
|
initialULBWPstartSymbolAndLength_1 = 69;
|
||||||
|
|
||||||
|
initialULBWPk2_2 = 7;
|
||||||
|
initialULBWPmappingType_2 = 1;
|
||||||
|
# this is SS=10 L=4
|
||||||
|
initialULBWPstartSymbolAndLength_2 = 52;
|
||||||
|
|
||||||
msg3_DeltaPreamble = 1;
|
msg3_DeltaPreamble = 1;
|
||||||
p0_NominalWithGrant =-90;
|
p0_NominalWithGrant =-90;
|
||||||
|
|
||||||
@@ -235,8 +245,10 @@ RUs = (
|
|||||||
att_rx = 0;
|
att_rx = 0;
|
||||||
bands = [7];
|
bands = [7];
|
||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 114;
|
max_rxgain = 75;
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
|
#beamforming 1x4 matrix:
|
||||||
|
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
||||||
sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2";
|
sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2";
|
||||||
clock_src = "external";
|
clock_src = "external";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
9d690a12: #oppo
|
||||||
|
- adb shell input keyevent KEYCODE_POWER
|
||||||
|
- adb shell input swipe 300 700 300 0
|
||||||
|
- adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
|
||||||
|
- adb shell input keyevent 20
|
||||||
|
- adb shell input tap 968 324
|
||||||
|
002: #s10
|
||||||
|
- adb shell input keyevent KEYCODE_POWER
|
||||||
|
- adb shell input swipe 200 900 200 300
|
||||||
|
- adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
|
||||||
|
- adb shell input tap 968 324
|
||||||
|
003: #s20
|
||||||
|
- adb shell input keyevent KEYCODE_POWER
|
||||||
|
- adb shell input swipe 200 900 200 300
|
||||||
|
- adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
|
||||||
|
- adb shell input tap 968 324
|
||||||
|
004: #xperia
|
||||||
|
- tbd
|
||||||
|
- tbd
|
||||||
|
- tbd
|
||||||
@@ -83,6 +83,10 @@ nullPointer:common/utils/T/tracer/multi.c:265
|
|||||||
// the tests
|
// the tests
|
||||||
arrayIndexOutOfBounds:openair2/LAYER2/rlc_v2/tests/test.c:401
|
arrayIndexOutOfBounds:openair2/LAYER2/rlc_v2/tests/test.c:401
|
||||||
//
|
//
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// cppcheck does not understand the different lengths of arrays
|
||||||
|
arrayIndexOutOfBounds:openair1/SIMULATION/TOOLS/random_channel.c:705
|
||||||
|
arrayIndexOutOfBounds:openair1/SIMULATION/TOOLS/random_channel.c:706
|
||||||
//*****************************************************************************
|
//*****************************************************************************
|
||||||
//
|
//
|
||||||
// True problems we don't know how to fix, Suppression is commented out,
|
// True problems we don't know how to fix, Suppression is commented out,
|
||||||
|
|||||||
+90
-48
@@ -285,21 +285,29 @@ class OaiCiTest():
|
|||||||
SSH.command('ssh ' + self.UEDevicesRemoteUser[idx] + '@' + self.UEDevicesRemoteServer[idx] + ' ' + self.UEDevicesOffCmd[idx], '\$', 60)
|
SSH.command('ssh ' + self.UEDevicesRemoteUser[idx] + '@' + self.UEDevicesRemoteServer[idx] + ' ' + self.UEDevicesOffCmd[idx], '\$', 60)
|
||||||
SSH.close()
|
SSH.close()
|
||||||
return
|
return
|
||||||
# enable data service
|
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "svc data enable"', '\$', 60)
|
|
||||||
|
|
||||||
# The following commands are deprecated since we no longer work on Android 7+
|
#RH quick add-on to integrate cots control defined by yaml
|
||||||
# SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell settings put global airplane_mode_on 1', '\$', 10)
|
#if device_id exists in yaml dictionary, we execute the new procedure defined in cots_ue class
|
||||||
# SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true', '\$', 60)
|
#otherwise we use the legacy procedure
|
||||||
# a dedicated script has to be installed inside the UE
|
if COTS_UE.Check_Exists(device_id):
|
||||||
# airplane mode on means call /data/local/tmp/off
|
#switch device to Airplane mode ON (ie Radio OFF)
|
||||||
if device_id == '84B7N16418004022':
|
COTS_UE.Set_Airplane(device_id, 'ON')
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/off"', '\$', 60)
|
|
||||||
else:
|
else:
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/off', '\$', 60)
|
# enable data service
|
||||||
#airplane mode off means call /data/local/tmp/on
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "svc data enable"', '\$', 60)
|
||||||
logging.debug('\u001B[1mUE (' + device_id + ') Initialize Completed\u001B[0m')
|
|
||||||
SSH.close()
|
# The following commands are deprecated since we no longer work on Android 7+
|
||||||
|
# SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell settings put global airplane_mode_on 1', '\$', 10)
|
||||||
|
# SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true', '\$', 60)
|
||||||
|
# a dedicated script has to be installed inside the UE
|
||||||
|
# airplane mode on means call /data/local/tmp/off
|
||||||
|
if device_id == '84B7N16418004022':
|
||||||
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/off"', '\$', 60)
|
||||||
|
else:
|
||||||
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/off', '\$', 60)
|
||||||
|
#airplane mode off means call /data/local/tmp/on
|
||||||
|
logging.debug('\u001B[1mUE (' + device_id + ') Initialize Completed\u001B[0m')
|
||||||
|
SSH.close()
|
||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
@@ -790,7 +798,13 @@ class OaiCiTest():
|
|||||||
try:
|
try:
|
||||||
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
||||||
if self.ADBCentralized:
|
if self.ADBCentralized:
|
||||||
if device_id == '84B7N16418004022':
|
#RH quick add on to integrate cots control defined by yaml
|
||||||
|
#if device Id exists in yaml dictionary, we execute the new procedure defined in cots_ue class
|
||||||
|
#otherwise we use the legacy procedure
|
||||||
|
if COTS_UE.Check_Exists(device_id):
|
||||||
|
#switch device to Airplane mode OFF (ie Radio ON)
|
||||||
|
COTS_UE.Set_Airplane(device_id, 'OFF')
|
||||||
|
elif device_id == '84B7N16418004022':
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/on"', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/on"', '\$', 60)
|
||||||
else:
|
else:
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/on', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/on', '\$', 60)
|
||||||
@@ -827,7 +841,13 @@ class OaiCiTest():
|
|||||||
if count == 15 or count == 30:
|
if count == 15 or count == 30:
|
||||||
logging.debug('\u001B[1;30;43m Retry UE (' + device_id + ') Flight Mode Off \u001B[0m')
|
logging.debug('\u001B[1;30;43m Retry UE (' + device_id + ') Flight Mode Off \u001B[0m')
|
||||||
if self.ADBCentralized:
|
if self.ADBCentralized:
|
||||||
if device_id == '84B7N16418004022':
|
#RH quick add on to intgrate cots control defined by yaml
|
||||||
|
#if device id exists in yaml dictionary, we execute the new procedure defined in cots_ue class
|
||||||
|
#otherwise we use the legacy procedure
|
||||||
|
if COTS_UE.Check_Exists(device_id):
|
||||||
|
#switch device to Airplane mode ON (ie Radio OFF)
|
||||||
|
COTS_UE.Set_Airplane(device_id, 'ON')
|
||||||
|
elif device_id == '84B7N16418004022':
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/off"', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/off"', '\$', 60)
|
||||||
else:
|
else:
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/off', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/off', '\$', 60)
|
||||||
@@ -835,7 +855,13 @@ class OaiCiTest():
|
|||||||
SSH.command('ssh ' + self.UEDevicesRemoteUser[idx] + '@' + self.UEDevicesRemoteServer[idx] + ' ' + self.UEDevicesOffCmd[idx], '\$', 60)
|
SSH.command('ssh ' + self.UEDevicesRemoteUser[idx] + '@' + self.UEDevicesRemoteServer[idx] + ' ' + self.UEDevicesOffCmd[idx], '\$', 60)
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
if self.ADBCentralized:
|
if self.ADBCentralized:
|
||||||
if device_id == '84B7N16418004022':
|
#RH quick add on to integrate cots control defined by yaml
|
||||||
|
#if device id exists in yaml dictionary, we execute the new procedre defined incots_ue class
|
||||||
|
#otherwise we use the legacy procedure
|
||||||
|
if COTS_UE.Check_Exists(device_id):
|
||||||
|
#switch device to Airplane mode OFF (ie Radio ON)
|
||||||
|
COTS_UE.Set_Airplane(device_id, 'OFF')
|
||||||
|
elif device_id == '84B7N16418004022':
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/on"', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/on"', '\$', 60)
|
||||||
else:
|
else:
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/on', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/on', '\$', 60)
|
||||||
@@ -918,7 +944,13 @@ class OaiCiTest():
|
|||||||
try:
|
try:
|
||||||
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
||||||
if self.ADBCentralized:
|
if self.ADBCentralized:
|
||||||
if device_id == '84B7N16418004022':
|
#RH quick add on to integrate cots control defined by yaml
|
||||||
|
#if device id exists in yaml dictionary, we execute the new procedure defined in cots_ue class
|
||||||
|
#otherwise we use the legacy procedure
|
||||||
|
if COTS_UE.Check_Exists(device_id):
|
||||||
|
#switch device to Airplane mode ON (ie Radio OFF)
|
||||||
|
COTS_UE.Set_Airplane(device_id,'ON')
|
||||||
|
elif device_id == '84B7N16418004022':
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/off"', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/off"', '\$', 60)
|
||||||
else:
|
else:
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/off', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/off', '\$', 60)
|
||||||
@@ -2697,7 +2729,13 @@ class OaiCiTest():
|
|||||||
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
||||||
# back in airplane mode on (ie radio off)
|
# back in airplane mode on (ie radio off)
|
||||||
if self.ADBCentralized:
|
if self.ADBCentralized:
|
||||||
if device_id == '84B7N16418004022':
|
#RH quick add on to intgrate cots control defined by yaml
|
||||||
|
#if device Id exists in yaml dictionary, we execute the new procedure defined in cots_ue class
|
||||||
|
#otherwise we use the legacy procedure
|
||||||
|
if COTS_UE.Check_Exists(device_id):
|
||||||
|
#switch device to Airplane mode ON (ie Radio OFF)
|
||||||
|
COTS_UE.Set_Airplane(device_id, 'ON')
|
||||||
|
elif device_id == '84B7N16418004022':
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/off"', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/off"', '\$', 60)
|
||||||
else:
|
else:
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/off', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/off', '\$', 60)
|
||||||
@@ -3133,7 +3171,7 @@ def GetParametersFromXML(action):
|
|||||||
else:
|
else:
|
||||||
RAN.backgroundBuild=False
|
RAN.backgroundBuild=False
|
||||||
|
|
||||||
if action == 'WaitEndBuild_eNB':
|
elif action == 'WaitEndBuild_eNB':
|
||||||
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
||||||
eNB_instance=test.findtext('eNB_instance')
|
eNB_instance=test.findtext('eNB_instance')
|
||||||
if (eNB_instance is None):
|
if (eNB_instance is None):
|
||||||
@@ -3144,7 +3182,7 @@ def GetParametersFromXML(action):
|
|||||||
if (RAN.eNB_serverId is None):
|
if (RAN.eNB_serverId is None):
|
||||||
RAN.eNB_serverId='0'
|
RAN.eNB_serverId='0'
|
||||||
|
|
||||||
if action == 'Initialize_eNB':
|
elif action == 'Initialize_eNB':
|
||||||
RAN.Initialize_eNB_args=test.findtext('Initialize_eNB_args')
|
RAN.Initialize_eNB_args=test.findtext('Initialize_eNB_args')
|
||||||
eNB_instance=test.findtext('eNB_instance')
|
eNB_instance=test.findtext('eNB_instance')
|
||||||
if (eNB_instance is None):
|
if (eNB_instance is None):
|
||||||
@@ -3164,7 +3202,7 @@ def GetParametersFromXML(action):
|
|||||||
else :
|
else :
|
||||||
RAN.air_interface[RAN.eNB_instance] = 'ocp-enb'
|
RAN.air_interface[RAN.eNB_instance] = 'ocp-enb'
|
||||||
|
|
||||||
if action == 'Terminate_eNB':
|
elif action == 'Terminate_eNB':
|
||||||
eNB_instance=test.findtext('eNB_instance')
|
eNB_instance=test.findtext('eNB_instance')
|
||||||
if (eNB_instance is None):
|
if (eNB_instance is None):
|
||||||
RAN.eNB_instance=0
|
RAN.eNB_instance=0
|
||||||
@@ -3183,21 +3221,21 @@ def GetParametersFromXML(action):
|
|||||||
else :
|
else :
|
||||||
RAN.air_interface[RAN.eNB_instance] = 'ocp-enb'
|
RAN.air_interface[RAN.eNB_instance] = 'ocp-enb'
|
||||||
|
|
||||||
if action == 'Attach_UE':
|
elif action == 'Attach_UE':
|
||||||
nbMaxUEtoAttach = test.findtext('nbMaxUEtoAttach')
|
nbMaxUEtoAttach = test.findtext('nbMaxUEtoAttach')
|
||||||
if (nbMaxUEtoAttach is None):
|
if (nbMaxUEtoAttach is None):
|
||||||
CiTestObj.nbMaxUEtoAttach = -1
|
CiTestObj.nbMaxUEtoAttach = -1
|
||||||
else:
|
else:
|
||||||
CiTestObj.nbMaxUEtoAttach = int(nbMaxUEtoAttach)
|
CiTestObj.nbMaxUEtoAttach = int(nbMaxUEtoAttach)
|
||||||
|
|
||||||
if action == 'CheckStatusUE':
|
elif action == 'CheckStatusUE':
|
||||||
expectedNBUE = test.findtext('expectedNbOfConnectedUEs')
|
expectedNBUE = test.findtext('expectedNbOfConnectedUEs')
|
||||||
if (expectedNBUE is None):
|
if (expectedNBUE is None):
|
||||||
CiTestObj.expectedNbOfConnectedUEs = -1
|
CiTestObj.expectedNbOfConnectedUEs = -1
|
||||||
else:
|
else:
|
||||||
CiTestObj.expectedNbOfConnectedUEs = int(expectedNBUE)
|
CiTestObj.expectedNbOfConnectedUEs = int(expectedNBUE)
|
||||||
|
|
||||||
if action == 'Build_OAI_UE':
|
elif action == 'Build_OAI_UE':
|
||||||
CiTestObj.Build_OAI_UE_args = test.findtext('Build_OAI_UE_args')
|
CiTestObj.Build_OAI_UE_args = test.findtext('Build_OAI_UE_args')
|
||||||
CiTestObj.clean_repository = test.findtext('clean_repository')
|
CiTestObj.clean_repository = test.findtext('clean_repository')
|
||||||
if (CiTestObj.clean_repository == 'false'):
|
if (CiTestObj.clean_repository == 'false'):
|
||||||
@@ -3205,7 +3243,7 @@ def GetParametersFromXML(action):
|
|||||||
else:
|
else:
|
||||||
CiTestObj.clean_repository = True
|
CiTestObj.clean_repository = True
|
||||||
|
|
||||||
if action == 'Initialize_OAI_UE':
|
elif action == 'Initialize_OAI_UE':
|
||||||
CiTestObj.Initialize_OAI_UE_args = test.findtext('Initialize_OAI_UE_args')
|
CiTestObj.Initialize_OAI_UE_args = test.findtext('Initialize_OAI_UE_args')
|
||||||
UE_instance = test.findtext('UE_instance')
|
UE_instance = test.findtext('UE_instance')
|
||||||
if (UE_instance is None):
|
if (UE_instance is None):
|
||||||
@@ -3223,7 +3261,7 @@ def GetParametersFromXML(action):
|
|||||||
#CiTestObj.air_interface = 'ocp-enb'
|
#CiTestObj.air_interface = 'ocp-enb'
|
||||||
logging.error('OCP UE -- NOT SUPPORTED')
|
logging.error('OCP UE -- NOT SUPPORTED')
|
||||||
|
|
||||||
if action == 'Terminate_OAI_UE':
|
elif action == 'Terminate_OAI_UE':
|
||||||
UE_instance=test.findtext('UE_instance')
|
UE_instance=test.findtext('UE_instance')
|
||||||
if (UE_instance is None):
|
if (UE_instance is None):
|
||||||
CiTestObj.UE_instance = '0'
|
CiTestObj.UE_instance = '0'
|
||||||
@@ -3240,11 +3278,11 @@ def GetParametersFromXML(action):
|
|||||||
#CiTestObj.air_interface = 'ocp-enb'
|
#CiTestObj.air_interface = 'ocp-enb'
|
||||||
logging.error('OCP UE -- NOT SUPPORTED')
|
logging.error('OCP UE -- NOT SUPPORTED')
|
||||||
|
|
||||||
if action == 'Ping' or action == 'Ping_CatM_module':
|
elif (action == 'Ping') or (action == 'Ping_CatM_module'):
|
||||||
CiTestObj.ping_args = test.findtext('ping_args')
|
CiTestObj.ping_args = test.findtext('ping_args')
|
||||||
CiTestObj.ping_packetloss_threshold = test.findtext('ping_packetloss_threshold')
|
CiTestObj.ping_packetloss_threshold = test.findtext('ping_packetloss_threshold')
|
||||||
|
|
||||||
if action == 'Iperf':
|
elif action == 'Iperf':
|
||||||
CiTestObj.iperf_args = test.findtext('iperf_args')
|
CiTestObj.iperf_args = test.findtext('iperf_args')
|
||||||
CiTestObj.iperf_packetloss_threshold = test.findtext('iperf_packetloss_threshold')
|
CiTestObj.iperf_packetloss_threshold = test.findtext('iperf_packetloss_threshold')
|
||||||
CiTestObj.iperf_profile = test.findtext('iperf_profile')
|
CiTestObj.iperf_profile = test.findtext('iperf_profile')
|
||||||
@@ -3262,14 +3300,14 @@ def GetParametersFromXML(action):
|
|||||||
logging.debug('ERROR: test-case has wrong option ' + CiTestObj.iperf_options)
|
logging.debug('ERROR: test-case has wrong option ' + CiTestObj.iperf_options)
|
||||||
CiTestObj.iperf_options = 'check'
|
CiTestObj.iperf_options = 'check'
|
||||||
|
|
||||||
if action == 'IdleSleep':
|
elif action == 'IdleSleep':
|
||||||
string_field = test.findtext('idle_sleep_time_in_sec')
|
string_field = test.findtext('idle_sleep_time_in_sec')
|
||||||
if (string_field is None):
|
if (string_field is None):
|
||||||
CiTestObj.idle_sleep_time = 5
|
CiTestObj.idle_sleep_time = 5
|
||||||
else:
|
else:
|
||||||
CiTestObj.idle_sleep_time = int(string_field)
|
CiTestObj.idle_sleep_time = int(string_field)
|
||||||
|
|
||||||
if action == 'Perform_X2_Handover':
|
elif action == 'Perform_X2_Handover':
|
||||||
string_field = test.findtext('x2_ho_options')
|
string_field = test.findtext('x2_ho_options')
|
||||||
if (string_field is None):
|
if (string_field is None):
|
||||||
CiTestObj.x2_ho_options = 'network'
|
CiTestObj.x2_ho_options = 'network'
|
||||||
@@ -3280,7 +3318,7 @@ def GetParametersFromXML(action):
|
|||||||
else:
|
else:
|
||||||
CiTestObj.x2_ho_options = string_field
|
CiTestObj.x2_ho_options = string_field
|
||||||
|
|
||||||
if action == 'Build_PhySim':
|
elif action == 'Build_PhySim':
|
||||||
ldpc.buildargs = test.findtext('physim_build_args')
|
ldpc.buildargs = test.findtext('physim_build_args')
|
||||||
forced_workspace_cleanup = test.findtext('forced_workspace_cleanup')
|
forced_workspace_cleanup = test.findtext('forced_workspace_cleanup')
|
||||||
if (forced_workspace_cleanup is None):
|
if (forced_workspace_cleanup is None):
|
||||||
@@ -3291,11 +3329,9 @@ def GetParametersFromXML(action):
|
|||||||
else:
|
else:
|
||||||
ldpc.forced_workspace_cleanup=False
|
ldpc.forced_workspace_cleanup=False
|
||||||
|
|
||||||
if action == 'Run_PhySim':
|
else: # ie action == 'Run_PhySim':
|
||||||
ldpc.runargs = test.findtext('physim_run_args')
|
ldpc.runargs = test.findtext('physim_run_args')
|
||||||
|
|
||||||
if action == 'COTS_UE_Airplane':
|
|
||||||
COTS_UE.runargs = test.findtext('cots_ue_airplane_args')
|
|
||||||
|
|
||||||
#check if given test is in list
|
#check if given test is in list
|
||||||
#it is in list if one of the strings in 'list' is at the beginning of 'test'
|
#it is in list if one of the strings in 'list' is at the beginning of 'test'
|
||||||
@@ -3320,15 +3356,21 @@ def receive_signal(signum, frame):
|
|||||||
|
|
||||||
#loading xml action list from yaml
|
#loading xml action list from yaml
|
||||||
import yaml
|
import yaml
|
||||||
xml_class_list_file=''
|
xml_class_list_file='xml_class_list.yml'
|
||||||
if (os.path.isfile('xml_class_list.yml')):
|
if (os.path.isfile(xml_class_list_file)):
|
||||||
xml_class_list_file='xml_class_list.yml'
|
yaml_file=xml_class_list_file
|
||||||
if (os.path.isfile('ci-scripts/xml_class_list.yml')):
|
elif (os.path.isfile('ci-scripts/'+xml_class_list_file)):
|
||||||
xml_class_list_file='ci-scripts/xml_class_list.yml'
|
yaml_file='ci-scripts/'+xml_class_list_file
|
||||||
with open(xml_class_list_file,'r') as file:
|
else:
|
||||||
# The FullLoader parameter handles the conversion from YAML
|
logging.error("XML action list yaml file cannot be found")
|
||||||
# scalar values to Python the dictionary format
|
sys.exit("XML action list yaml file cannot be found")
|
||||||
xml_class_list = yaml.load(file,Loader=yaml.FullLoader)
|
|
||||||
|
with open(yaml_file,'r') as f:
|
||||||
|
# The FullLoader parameter handles the conversion-$
|
||||||
|
#from YAML scalar values to Python dictionary format$
|
||||||
|
xml_class_list = yaml.load(f,Loader=yaml.FullLoader)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mode = ''
|
mode = ''
|
||||||
|
|
||||||
@@ -3375,8 +3417,9 @@ if py_param_file_present == True:
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# COTS UE instanciation
|
# COTS UE instanciation
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
#COTS_UE instanciation can only be done here for the moment, due to code architecture
|
#COTS_UE instanciation and ADB server init
|
||||||
COTS_UE=cls_cots_ue.CotsUe('oppo', CiTestObj.UEIPAddress, CiTestObj.UEUserName,CiTestObj.UEPassword)
|
#ue id and ue mode are retrieved from xml
|
||||||
|
COTS_UE=cls_cots_ue.CotsUe(CiTestObj.ADBIPAddress, CiTestObj.ADBUserName,CiTestObj.ADBPassword)
|
||||||
|
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -3613,7 +3656,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
GetParametersFromXML(action)
|
GetParametersFromXML(action)
|
||||||
if action == 'Initialize_UE' or action == 'Attach_UE' or action == 'Detach_UE' or action == 'Ping' or action == 'Iperf' or action == 'Reboot_UE' or action == 'DataDisable_UE' or action == 'DataEnable_UE' or action == 'CheckStatusUE':
|
if action == 'Initialize_UE' or action == 'Attach_UE' or action == 'Detach_UE' or action == 'Ping' or action == 'Iperf' or action == 'Reboot_UE' or action == 'DataDisable_UE' or action == 'DataEnable_UE' or action == 'CheckStatusUE':
|
||||||
if (CiTestObj.ADBIPAddress != 'none'):
|
if (CiTestObj.ADBIPAddress != 'none'):
|
||||||
terminate_ue_flag = False
|
#in these cases, having no devices is critical, GetAllUEDevices function has to manage it as a critical error, reason why terminate_ue_flag is set to True
|
||||||
|
terminate_ue_flag = True
|
||||||
CiTestObj.GetAllUEDevices(terminate_ue_flag)
|
CiTestObj.GetAllUEDevices(terminate_ue_flag)
|
||||||
if action == 'Build_eNB':
|
if action == 'Build_eNB':
|
||||||
RAN.BuildeNB()
|
RAN.BuildeNB()
|
||||||
@@ -3688,8 +3732,6 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
if ldpc.exitStatus==1:sys.exit()
|
if ldpc.exitStatus==1:sys.exit()
|
||||||
elif action == 'Run_PhySim':
|
elif action == 'Run_PhySim':
|
||||||
HTML=ldpc.Run_PhySim(HTML,CONST,id)
|
HTML=ldpc.Run_PhySim(HTML,CONST,id)
|
||||||
elif action == 'COTS_UE_Airplane':
|
|
||||||
COTS_UE.Set_Airplane(COTS_UE.runargs)
|
|
||||||
else:
|
else:
|
||||||
sys.exit('Invalid class (action) from xml')
|
sys.exit('Invalid class (action) from xml')
|
||||||
CiTestObj.FailReportCnt += 1
|
CiTestObj.FailReportCnt += 1
|
||||||
|
|||||||
+18
-12
@@ -90,6 +90,7 @@ class RANManagement():
|
|||||||
self.epcPcapFile = ''
|
self.epcPcapFile = ''
|
||||||
self.htmlObj = None
|
self.htmlObj = None
|
||||||
self.epcObj = None
|
self.epcObj = None
|
||||||
|
self.runtime_stats= ''
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -614,7 +615,7 @@ class RANManagement():
|
|||||||
logging.debug('\u001B[1m Analyzing eNB replay logfile \u001B[0m')
|
logging.debug('\u001B[1m Analyzing eNB replay logfile \u001B[0m')
|
||||||
logStatus = self.AnalyzeLogFile_eNB(extracted_log_file)
|
logStatus = self.AnalyzeLogFile_eNB(extracted_log_file)
|
||||||
if self.htmlObj is not None:
|
if self.htmlObj is not None:
|
||||||
self.htmlObj.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
self.htmlObj.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.eNBLogFiles[int(self.eNB_instance)] = ''
|
self.eNBLogFiles[int(self.eNB_instance)] = ''
|
||||||
else:
|
else:
|
||||||
analyzeFile = False
|
analyzeFile = False
|
||||||
@@ -643,10 +644,10 @@ class RANManagement():
|
|||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
if self.htmlObj is not None:
|
if self.htmlObj is not None:
|
||||||
self.htmlObj.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
self.htmlObj.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
else:
|
else:
|
||||||
if self.htmlObj is not None:
|
if self.htmlObj is not None:
|
||||||
self.htmlObj.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
self.htmlObj.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
||||||
self.eNBstatuses[int(self.eNB_instance)] = -1
|
self.eNBstatuses[int(self.eNB_instance)] = -1
|
||||||
|
|
||||||
@@ -712,16 +713,20 @@ class RANManagement():
|
|||||||
if runTime != '':
|
if runTime != '':
|
||||||
result = re.search('Time executing user inst', str(line))
|
result = re.search('Time executing user inst', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
userTime = 'to be decoded - 1'
|
fields=line.split(':')
|
||||||
|
userTime = 'userTime : ' + fields[1].replace('\n','')
|
||||||
result = re.search('Time executing system inst', str(line))
|
result = re.search('Time executing system inst', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
systemTime = 'to be decoded - 2'
|
fields=line.split(':')
|
||||||
|
systemTime = 'systemTime : ' + fields[1].replace('\n','')
|
||||||
result = re.search('Max. Phy. memory usage:', str(line))
|
result = re.search('Max. Phy. memory usage:', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
maxPhyMemUsage = 'to be decoded - 3'
|
fields=line.split(':')
|
||||||
|
maxPhyMemUsage = 'maxPhyMemUsage : ' + fields[1].replace('\n','')
|
||||||
result = re.search('Number of context switch.*process origin', str(line))
|
result = re.search('Number of context switch.*process origin', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
nbContextSwitches = 'to be decoded - 4'
|
fields=line.split(':')
|
||||||
|
nbContextSwitches = 'nbContextSwitches : ' + fields[1].replace('\n','')
|
||||||
if X2HO_state == CONST.X2_HO_REQ_STATE__IDLE:
|
if X2HO_state == CONST.X2_HO_REQ_STATE__IDLE:
|
||||||
result = re.search('target eNB Receives X2 HO Req X2AP_HANDOVER_REQ', str(line))
|
result = re.search('target eNB Receives X2 HO Req X2AP_HANDOVER_REQ', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
@@ -978,11 +983,12 @@ class RANManagement():
|
|||||||
global_status = CONST.ENB_PROCESS_REALTIME_ISSUE
|
global_status = CONST.ENB_PROCESS_REALTIME_ISSUE
|
||||||
if self.htmlObj is not None:
|
if self.htmlObj is not None:
|
||||||
self.htmlObj.htmleNBFailureMsg=htmleNBFailureMsg
|
self.htmlObj.htmleNBFailureMsg=htmleNBFailureMsg
|
||||||
# Runtime statistics
|
# Runtime statistics for console output and HTML
|
||||||
if runTime != '':
|
if runTime != '':
|
||||||
logging.debug(runTime)
|
logging.debug(runTime)
|
||||||
logging.debug('Time executing user inst : ' + userTime)
|
logging.debug(userTime)
|
||||||
logging.debug('Time executing system inst : ' + systemTime)
|
logging.debug(systemTime)
|
||||||
logging.debug('Max Physical Memory Usage : ' + maxPhyMemUsage)
|
logging.debug(maxPhyMemUsage)
|
||||||
logging.debug('Nb Context Switches : ' + nbContextSwitches)
|
logging.debug(nbContextSwitches)
|
||||||
|
self.runtime_stats='<pre>'+runTime + '\n'+ userTime + '\n' + systemTime + '\n' + maxPhyMemUsage + '\n' + nbContextSwitches+'</pre>'
|
||||||
return global_status
|
return global_status
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
- COTS_UE_Airplane
|
|
||||||
- Build_PhySim
|
- Build_PhySim
|
||||||
- Run_PhySim
|
- Run_PhySim
|
||||||
- Build_eNB
|
- Build_eNB
|
||||||
|
|||||||
+16
-8
@@ -21,19 +21,27 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>test-airplane-mode</htmlTabRef>
|
<htmlTabRef>epc-closure</htmlTabRef>
|
||||||
<htmlTabName>AirplaneToggle</htmlTabName>
|
<htmlTabName>EPC-Closure</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>log-out</htmlTabIcon>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
010000
|
060000 060001 060002
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
<testCase id="010000">
|
<testCase id="060000">
|
||||||
<class>COTS_UE_Airplane</class>
|
<class>Terminate_HSS</class>
|
||||||
<desc>Toggle COTS Airplane mode ON</desc>
|
<desc>Terminate HSS</desc>
|
||||||
<cots_ue_airplane_args>ON</cots_ue_airplane_args>
|
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060001">
|
||||||
|
<class>Terminate_MME</class>
|
||||||
|
<desc>Terminate MME</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060002">
|
||||||
|
<class>Terminate_SPGW</class>
|
||||||
|
<desc>Terminate SPGW</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
</testCaseList>
|
</testCaseList>
|
||||||
+15
-17
@@ -21,30 +21,28 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>test-fr1-tm1</htmlTabRef>
|
<htmlTabRef>epc-start-tab</htmlTabRef>
|
||||||
<htmlTabName>Test-FR1-TM1</htmlTabName>
|
<htmlTabName>EPC-Start</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>log-in</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
070001
|
000100 000101 000102
|
||||||
070000
|
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList>
|
<TestCaseExclusionList>
|
||||||
</TestCaseExclusionList>
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="000100">
|
||||||
<class>Terminate_eNB</class>
|
<class>Initialize_HSS</class>
|
||||||
<desc>Terminate eNB</desc>
|
<desc>Initialize HSS</desc>
|
||||||
<eNB_instance>0</eNB_instance>
|
|
||||||
<eNB_serverId>0</eNB_serverId>
|
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070001">
|
<testCase id="000101">
|
||||||
<class>Terminate_eNB</class>
|
<class>Initialize_MME</class>
|
||||||
<desc>Terminate gNB</desc>
|
<desc>Initialize MME</desc>
|
||||||
<eNB_instance>1</eNB_instance>
|
</testCase>
|
||||||
<eNB_serverId>1</eNB_serverId>
|
|
||||||
|
<testCase id="000102">
|
||||||
|
<class>Initialize_SPGW</class>
|
||||||
|
<desc>Initialize SPGW</desc>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
</testCaseList>
|
</testCaseList>
|
||||||
|
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>TEST-FR1-TM1</htmlTabRef>
|
||||||
|
<htmlTabName>FR1</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
010000
|
||||||
|
030000
|
||||||
|
040000
|
||||||
|
010001
|
||||||
|
000001
|
||||||
|
050000
|
||||||
|
050001
|
||||||
|
070001
|
||||||
|
070000
|
||||||
|
010002
|
||||||
|
010003
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010000">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010003">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010001">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010002">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="030000">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.fr1.25PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<air_interface>lte</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="040000">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize gNB</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf -E</Initialize_eNB_args>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050000">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 20pings in 20sec</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>0</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050001">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 5pings in 1sec</desc>
|
||||||
|
<ping_args>-c 5 -i 0.2</ping_args>
|
||||||
|
<ping_packetloss_threshold>0</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070000">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070001">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate gNB</desc>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
<testCase id="090102">
|
<testCase id="090102">
|
||||||
<class>Initialize_OAI_UE</class>
|
<class>Initialize_OAI_UE</class>
|
||||||
<desc>Initialize NR UE USRP</desc>
|
<desc>Initialize NR UE USRP</desc>
|
||||||
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --threadoffset 16 --rrc_config_path .</Initialize_OAI_UE_args>
|
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 75 --threadoffset 16 --rrc_config_path .</Initialize_OAI_UE_args>
|
||||||
<air_interface>NR</air_interface>
|
<air_interface>NR</air_interface>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@
|
|||||||
<testCase id="090104">
|
<testCase id="090104">
|
||||||
<class>Initialize_OAI_UE</class>
|
<class>Initialize_OAI_UE</class>
|
||||||
<desc>Initialize NR UE USRP</desc>
|
<desc>Initialize NR UE USRP</desc>
|
||||||
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --threadoffset 16 --rrc_config_path .</Initialize_OAI_UE_args>
|
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 75 --threadoffset 16 --rrc_config_path .</Initialize_OAI_UE_args>
|
||||||
<air_interface>NR</air_interface>
|
<air_interface>NR</air_interface>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -816,6 +816,42 @@ set(HWLIB_TCP_BRIDGE_OAI_SOURCE
|
|||||||
add_library(tcp_bridge_oai MODULE ${HWLIB_TCP_BRIDGE_OAI_SOURCE} )
|
add_library(tcp_bridge_oai MODULE ${HWLIB_TCP_BRIDGE_OAI_SOURCE} )
|
||||||
set_target_properties(tcp_bridge_oai PROPERTIES COMPILE_FLAGS "-fvisibility=hidden")
|
set_target_properties(tcp_bridge_oai PROPERTIES COMPILE_FLAGS "-fvisibility=hidden")
|
||||||
|
|
||||||
|
# Benetel 4G library
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
set(HWLIB_BENETEL_4G_SOURCE
|
||||||
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/4g/benetel.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/4g/shared_buffers.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/4g/low.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/4g/low_dpdk.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/4g/dpdk_driver.c
|
||||||
|
)
|
||||||
|
add_library(benetel_4g MODULE ${HWLIB_BENETEL_4G_SOURCE} )
|
||||||
|
|
||||||
|
set_target_properties(benetel_4g PROPERTIES COMPILE_FLAGS "-fvisibility=hidden -march=native -I$ENV{RTE_SDK}/$ENV{RTE_TARGET}/include")
|
||||||
|
|
||||||
|
SET(DPDK_LIBS "-Wl,-rpath,$ENV{RTE_SDK}/$ENV{RTE_TARGET}/lib -Wl,--whole-archive -L$ENV{RTE_SDK}/$ENV{RTE_TARGET}/lib -ldpdk -Wl,--no-whole-archive")
|
||||||
|
TARGET_LINK_LIBRARIES(benetel_4g ${DPDK_LIBS})
|
||||||
|
TARGET_LINK_LIBRARIES(benetel_4g pthread dl rt m numa)
|
||||||
|
|
||||||
|
# Benetel 5G library
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
set(HWLIB_BENETEL_5G_SOURCE
|
||||||
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/5g/benetel.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/5g/shared_buffers.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/5g/low.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/5g/low_dpdk.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/5g/dpdk_driver.c
|
||||||
|
)
|
||||||
|
add_library(benetel_5g MODULE ${HWLIB_BENETEL_5G_SOURCE} )
|
||||||
|
|
||||||
|
set_target_properties(benetel_5g PROPERTIES COMPILE_FLAGS "-fvisibility=hidden -march=native -I$ENV{RTE_SDK}/$ENV{RTE_TARGET}/include")
|
||||||
|
|
||||||
|
SET(DPDK_LIBS "-Wl,-rpath,$ENV{RTE_SDK}/$ENV{RTE_TARGET}/lib -Wl,--whole-archive -L$ENV{RTE_SDK}/$ENV{RTE_TARGET}/lib -ldpdk -Wl,--no-whole-archive")
|
||||||
|
TARGET_LINK_LIBRARIES(benetel_5g ${DPDK_LIBS})
|
||||||
|
TARGET_LINK_LIBRARIES(benetel_5g pthread dl rt m numa)
|
||||||
|
|
||||||
##########################################################
|
##########################################################
|
||||||
|
|
||||||
include_directories ("${OPENAIR_TARGETS}/ARCH/COMMON")
|
include_directories ("${OPENAIR_TARGETS}/ARCH/COMMON")
|
||||||
@@ -1605,7 +1641,7 @@ set(PHY_SRC_UE
|
|||||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/ptrs_nr.c
|
${OPENAIR1_DIR}/PHY/NR_REFSIG/ptrs_nr.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_UE_ESTIMATION/filt16a_32.c
|
${OPENAIR1_DIR}/PHY/NR_UE_ESTIMATION/filt16a_32.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
|
${OPENAIR1_DIR}/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_ESTIMATION/nr_adjust_sync_gNB.c
|
${OPENAIR1_DIR}/PHY/NR_ESTIMATION/nr_measurements_gNB.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/file_output.c
|
${OPENAIR1_DIR}/PHY/TOOLS/file_output.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
|
${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
|
||||||
#${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c
|
#${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c
|
||||||
@@ -1799,9 +1835,15 @@ set(NR_RLC_SRC
|
|||||||
${OPENAIR2_DIR}/LAYER2/nr_rlc/nr_rlc_sdu.c
|
${OPENAIR2_DIR}/LAYER2/nr_rlc/nr_rlc_sdu.c
|
||||||
${OPENAIR2_DIR}/LAYER2/nr_rlc/nr_rlc_ue_manager.c
|
${OPENAIR2_DIR}/LAYER2/nr_rlc/nr_rlc_ue_manager.c
|
||||||
)
|
)
|
||||||
|
|
||||||
|
set(NR_PDCP_SRC
|
||||||
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
|
||||||
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c
|
||||||
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_entity.c
|
||||||
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_entity_drb_am.c
|
||||||
|
)
|
||||||
|
|
||||||
set(L2_SRC
|
set(L2_SRC
|
||||||
${OPENAIR2_DIR}/LAYER2/openair2_proc.c
|
|
||||||
${PDCP_DIR}/pdcp.c
|
${PDCP_DIR}/pdcp.c
|
||||||
${PDCP_DIR}/pdcp_fifo.c
|
${PDCP_DIR}/pdcp_fifo.c
|
||||||
${PDCP_DIR}/pdcp_sequence_manager.c
|
${PDCP_DIR}/pdcp_sequence_manager.c
|
||||||
@@ -1809,6 +1851,7 @@ set(L2_SRC
|
|||||||
${PDCP_DIR}/pdcp_util.c
|
${PDCP_DIR}/pdcp_util.c
|
||||||
${PDCP_DIR}/pdcp_security.c
|
${PDCP_DIR}/pdcp_security.c
|
||||||
${PDCP_DIR}/pdcp_netlink.c
|
${PDCP_DIR}/pdcp_netlink.c
|
||||||
|
${OPENAIR2_DIR}/LAYER2/openair2_proc.c
|
||||||
# ${RRC_DIR}/rrc_UE.c
|
# ${RRC_DIR}/rrc_UE.c
|
||||||
${RRC_DIR}/rrc_eNB.c
|
${RRC_DIR}/rrc_eNB.c
|
||||||
${RRC_DIR}/rrc_eNB_endc.c
|
${RRC_DIR}/rrc_eNB_endc.c
|
||||||
@@ -1820,6 +1863,20 @@ set(L2_SRC
|
|||||||
${RRC_DIR}/L2_interface_common.c
|
${RRC_DIR}/L2_interface_common.c
|
||||||
${RRC_DIR}/L2_interface_ue.c
|
${RRC_DIR}/L2_interface_ue.c
|
||||||
)
|
)
|
||||||
|
|
||||||
|
set(L2_RRC_SRC
|
||||||
|
${OPENAIR2_DIR}/LAYER2/openair2_proc.c
|
||||||
|
# ${RRC_DIR}/rrc_UE.c
|
||||||
|
${RRC_DIR}/rrc_eNB.c
|
||||||
|
${RRC_DIR}/rrc_eNB_endc.c
|
||||||
|
${RRC_DIR}/rrc_eNB_S1AP.c
|
||||||
|
${RRC_DIR}/rrc_eNB_M2AP.c
|
||||||
|
${RRC_DIR}/rrc_eNB_UE_context.c
|
||||||
|
${RRC_DIR}/rrc_common.c
|
||||||
|
${RRC_DIR}/L2_interface.c
|
||||||
|
${RRC_DIR}/L2_interface_common.c
|
||||||
|
${RRC_DIR}/L2_interface_ue.c
|
||||||
|
)
|
||||||
|
|
||||||
set(L2_LTE_SRC
|
set(L2_LTE_SRC
|
||||||
${RLC_V2}
|
${RLC_V2}
|
||||||
@@ -1827,6 +1884,7 @@ set(L2_LTE_SRC
|
|||||||
|
|
||||||
set(L2_NR_SRC
|
set(L2_NR_SRC
|
||||||
${NR_RLC_SRC}
|
${NR_RLC_SRC}
|
||||||
|
# ${NR_PDCP_SRC}
|
||||||
${NR_RRC_DIR}/rrc_gNB.c
|
${NR_RRC_DIR}/rrc_gNB.c
|
||||||
${NR_RRC_DIR}/nr_rrc_common.c
|
${NR_RRC_DIR}/nr_rrc_common.c
|
||||||
${NR_RRC_DIR}/L2_nr_interface.c
|
${NR_RRC_DIR}/L2_nr_interface.c
|
||||||
@@ -1852,19 +1910,16 @@ set(L2_SRC_UE
|
|||||||
${RRC_DIR}/L2_interface_ue.c
|
${RRC_DIR}/L2_interface_ue.c
|
||||||
)
|
)
|
||||||
|
|
||||||
set(LTE_NR_L2_SRC_UE
|
set(L2_RRC_SRC_UE
|
||||||
${PDCP_DIR}/pdcp.c
|
${RRC_DIR}/rrc_UE.c
|
||||||
${PDCP_DIR}/pdcp_fifo.c
|
${RRC_DIR}/rrc_common.c
|
||||||
${PDCP_DIR}/pdcp_sequence_manager.c
|
${RRC_DIR}/L2_interface_common.c
|
||||||
${PDCP_DIR}/pdcp_primitives.c
|
${RRC_DIR}/L2_interface_ue.c
|
||||||
${PDCP_DIR}/pdcp_util.c
|
)
|
||||||
${PDCP_DIR}/pdcp_security.c
|
|
||||||
${PDCP_DIR}/pdcp_netlink.c
|
|
||||||
${RLC_V2}
|
|
||||||
)
|
|
||||||
|
|
||||||
set(NR_L2_SRC_UE
|
set(NR_L2_SRC_UE
|
||||||
${NR_RLC_SRC}
|
${NR_RLC_SRC}
|
||||||
|
# ${NR_PDCP_SRC}
|
||||||
${NR_UE_RRC_DIR}/L2_interface_ue.c
|
${NR_UE_RRC_DIR}/L2_interface_ue.c
|
||||||
${NR_UE_RRC_DIR}/main_ue.c
|
${NR_UE_RRC_DIR}/main_ue.c
|
||||||
${NR_UE_RRC_DIR}/rrc_UE.c
|
${NR_UE_RRC_DIR}/rrc_UE.c
|
||||||
@@ -1974,6 +2029,14 @@ add_library(L2_NR
|
|||||||
${MAC_NR_SRC}
|
${MAC_NR_SRC}
|
||||||
${GNB_APP_SRC}
|
${GNB_APP_SRC}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_library(L2_LTE_NR
|
||||||
|
${L2_RRC_SRC}
|
||||||
|
${MAC_SRC}
|
||||||
|
${ENB_APP_SRC}
|
||||||
|
${MCE_APP_SRC}
|
||||||
|
)
|
||||||
|
|
||||||
add_dependencies(L2_NR rrc_flag nr_rrc_flag s1ap_flag x2_flag)
|
add_dependencies(L2_NR rrc_flag nr_rrc_flag s1ap_flag x2_flag)
|
||||||
|
|
||||||
add_library(L2_UE
|
add_library(L2_UE
|
||||||
@@ -1981,6 +2044,11 @@ add_library(L2_UE
|
|||||||
${MAC_SRC_UE}
|
${MAC_SRC_UE}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_library(L2_UE_LTE_NR
|
||||||
|
${L2_RRC_SRC_UE}
|
||||||
|
${MAC_SRC_UE}
|
||||||
|
)
|
||||||
|
|
||||||
if (NOT ${NOS1})
|
if (NOT ${NOS1})
|
||||||
target_compile_definitions(L2_UE PUBLIC -DPDCP_USE_NETLINK)
|
target_compile_definitions(L2_UE PUBLIC -DPDCP_USE_NETLINK)
|
||||||
endif()
|
endif()
|
||||||
@@ -2363,6 +2431,7 @@ add_library(LFDS7
|
|||||||
add_library(SIMU_COMMON
|
add_library(SIMU_COMMON
|
||||||
${OPENAIR1_DIR}/SIMULATION/TOOLS/random_channel.c
|
${OPENAIR1_DIR}/SIMULATION/TOOLS/random_channel.c
|
||||||
${OPENAIR1_DIR}/SIMULATION/TOOLS/rangen_double.c
|
${OPENAIR1_DIR}/SIMULATION/TOOLS/rangen_double.c
|
||||||
|
${OPENAIR1_DIR}/SIMULATION/TOOLS/phase_noise.c
|
||||||
)
|
)
|
||||||
|
|
||||||
# Simulation library
|
# Simulation library
|
||||||
@@ -2843,7 +2912,7 @@ add_executable(nr-uesoftmodem
|
|||||||
target_link_libraries (nr-uesoftmodem
|
target_link_libraries (nr-uesoftmodem
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
RRC_LIB NR_RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
|
RRC_LIB NR_RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
|
||||||
PHY_COMMON PHY_NR_COMMON PHY_UE PHY_NR_UE PHY_RU LFDS NR_L2_UE L2_UE MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB
|
PHY_COMMON PHY_NR_COMMON PHY_UE PHY_NR_UE PHY_RU LFDS NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB
|
||||||
NFAPI_USER_LIB S1AP_LIB S1AP_ENB
|
NFAPI_USER_LIB S1AP_LIB S1AP_ENB
|
||||||
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES}
|
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES}
|
||||||
-Wl,--end-group z dl)
|
-Wl,--end-group z dl)
|
||||||
@@ -2962,6 +3031,7 @@ add_executable(nr_dlschsim
|
|||||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c
|
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c
|
||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
${UTIL_SRC}
|
${UTIL_SRC}
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${SHLIB_LOADER_SOURCES}
|
${SHLIB_LOADER_SOURCES}
|
||||||
@@ -2975,6 +3045,7 @@ add_executable(nr_pbchsim
|
|||||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/pbchsim.c
|
${OPENAIR1_DIR}/SIMULATION/NR_PHY/pbchsim.c
|
||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
${UTIL_SRC}
|
${UTIL_SRC}
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${SHLIB_LOADER_SOURCES}
|
${SHLIB_LOADER_SOURCES}
|
||||||
@@ -2990,6 +3061,7 @@ add_executable(nr_pucchsim
|
|||||||
${OPENAIR_DIR}/common/utils/backtrace.c
|
${OPENAIR_DIR}/common/utils/backtrace.c
|
||||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
${UTIL_SRC}
|
${UTIL_SRC}
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${SHLIB_LOADER_SOURCES}
|
${SHLIB_LOADER_SOURCES}
|
||||||
@@ -3001,6 +3073,7 @@ target_link_libraries(nr_pucchsim
|
|||||||
|
|
||||||
add_executable(nr_dlsim
|
add_executable(nr_dlsim
|
||||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlsim.c
|
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlsim.c
|
||||||
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
${OPENAIR_DIR}/executables/softmodem-common.c
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
@@ -3016,6 +3089,7 @@ target_compile_definitions(nr_dlsim PUBLIC -DPHYSICAL_SIMULATOR)
|
|||||||
|
|
||||||
add_executable(nr_prachsim
|
add_executable(nr_prachsim
|
||||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/prachsim.c
|
${OPENAIR1_DIR}/SIMULATION/NR_PHY/prachsim.c
|
||||||
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
${OPENAIR1_DIR}/SCHED_NR/phy_procedures_nr_common.c
|
${OPENAIR1_DIR}/SCHED_NR/phy_procedures_nr_common.c
|
||||||
@@ -3027,6 +3101,7 @@ target_link_libraries(nr_prachsim
|
|||||||
|
|
||||||
add_executable(nr_ulschsim
|
add_executable(nr_ulschsim
|
||||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
|
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
|
||||||
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
${UTIL_SRC}
|
${UTIL_SRC}
|
||||||
@@ -3040,6 +3115,7 @@ target_link_libraries(nr_ulschsim
|
|||||||
|
|
||||||
add_executable(nr_ulsim
|
add_executable(nr_ulsim
|
||||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulsim.c
|
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulsim.c
|
||||||
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
${OPENAIR_DIR}/executables/softmodem-common.c
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
@@ -3060,6 +3136,7 @@ foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim pr
|
|||||||
${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
|
${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
|
||||||
${OPENAIR_DIR}/common/utils/backtrace.c
|
${OPENAIR_DIR}/common/utils/backtrace.c
|
||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
${XFORMS_SOURCE}
|
${XFORMS_SOURCE}
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${CONFIG_SOURCES}
|
${CONFIG_SOURCES}
|
||||||
@@ -3146,7 +3223,7 @@ if (${T_TRACER})
|
|||||||
SECU_OSA SECU_CN SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB default_sched remote_sched RAL
|
SECU_OSA SECU_CN SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB default_sched remote_sched RAL
|
||||||
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
|
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
|
||||||
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU PHY_MEX
|
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU PHY_MEX
|
||||||
L2 L2_LTE L2_NR L2_UE NR_L2_UE MAC_NR_COMMON MAC_NR MAC_UE_NR
|
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE MAC_NR_COMMON MAC_NR MAC_UE_NR
|
||||||
CN_UTILS GTPV1U NR_GTPV1U SCTP_CLIENT MME_APP UDP LIB_NAS_UE NB_IoT LFDS LFDS7 SIMU_COMMON SIMU SIMU_ETH OPENAIR0_LIB
|
CN_UTILS GTPV1U NR_GTPV1U SCTP_CLIENT MME_APP UDP LIB_NAS_UE NB_IoT LFDS LFDS7 SIMU_COMMON SIMU SIMU_ETH OPENAIR0_LIB
|
||||||
ldpc_orig ldpc_optim ldpc_optim8seg ldpc PROTO_AGENT dfts)
|
ldpc_orig ldpc_optim ldpc_optim8seg ldpc PROTO_AGENT dfts)
|
||||||
if (TARGET ${i})
|
if (TARGET ${i})
|
||||||
|
|||||||
@@ -1276,7 +1276,10 @@
|
|||||||
(Test2: MCS 16 50 PRBs),
|
(Test2: MCS 16 50 PRBs),
|
||||||
(Test3: MCS 28 50 PRBs),
|
(Test3: MCS 28 50 PRBs),
|
||||||
(Test4: MCS 9 217 PRBs),
|
(Test4: MCS 9 217 PRBs),
|
||||||
(Test5: MCS 9 273 PRBs)</desc>
|
(Test5: MCS 9 273 PRBs),
|
||||||
|
(Test6: DMRS Type A, 3 DMRS, 4 PTRS, 5 Interpolated Symbols),
|
||||||
|
(Test7: DMRS Type B, 3 DMRS, 2 PTRS, 7 Interpolated Symbols),
|
||||||
|
(Test8: DMRS Type B, 3 DMRS, 2 PTRS, 3 Interpolated Symbols)</desc>
|
||||||
<pre_compile_prog></pre_compile_prog>
|
<pre_compile_prog></pre_compile_prog>
|
||||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||||
@@ -1287,8 +1290,11 @@
|
|||||||
-n100 -m16 -s10
|
-n100 -m16 -s10
|
||||||
-n100 -m28 -s20
|
-n100 -m28 -s20
|
||||||
-n100 -m9 -R217 -r217 -s5
|
-n100 -m9 -R217 -r217 -s5
|
||||||
-n100 -m9 -R273 -r273 -s5</main_exec_args>
|
-n100 -m9 -R273 -r273 -s5
|
||||||
<tags>nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5</tags>
|
-n100 -s5 -T 2 1 2 -U 2 0 2
|
||||||
|
-n100 -s5 -T 2 2 2 -U 2 1 2
|
||||||
|
-n100 -s5 -a4 -b8 -T 2 1 2 -U 2 1 3</main_exec_args>
|
||||||
|
<tags>nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8</tags>
|
||||||
<search_expr_true>PUSCH test OK</search_expr_true>
|
<search_expr_true>PUSCH test OK</search_expr_true>
|
||||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||||
<nruns>3</nruns>
|
<nruns>3</nruns>
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ function main() {
|
|||||||
GDB=0
|
GDB=0
|
||||||
CMAKE_BUILD_TYPE="RelWithDebInfo"
|
CMAKE_BUILD_TYPE="RelWithDebInfo"
|
||||||
echo_info "Will Compile with gdb symbols"
|
echo_info "Will Compile with gdb symbols"
|
||||||
CMAKE_CMD="$CMAKE_CMD -DCMAKE_BUILD_TYPE=RelWithDebInfo"
|
CMAKE_CMD="$CMAKE_CMD -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_EXPORT_COMPILE_COMMANDS=1"
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
"MinSizeRel")
|
"MinSizeRel")
|
||||||
|
|||||||
@@ -105,3 +105,9 @@ char *itoa(int i) {
|
|||||||
return strdup(buffer);
|
return strdup(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *memcpy1(void *dst,const void *src,size_t n) {
|
||||||
|
|
||||||
|
void *ret=dst;
|
||||||
|
asm volatile("rep movsb" : "+D" (dst) : "c"(n), "S"(src) : "cc","memory");
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|||||||
@@ -15,6 +15,9 @@ int hex_char_to_hex_value (char c);
|
|||||||
// Converts an hexadecimal ASCII coded string into its value.**
|
// Converts an hexadecimal ASCII coded string into its value.**
|
||||||
int hex_string_to_hex_value (uint8_t *hex_value, const char *hex_string, int size);
|
int hex_string_to_hex_value (uint8_t *hex_value, const char *hex_string, int size);
|
||||||
|
|
||||||
|
void *memcpy1(void *dst,const void *src,size_t n);
|
||||||
|
|
||||||
|
|
||||||
char *itoa(int i);
|
char *itoa(int i);
|
||||||
|
|
||||||
#define findInList(keY, result, list, element_type) {\
|
#define findInList(keY, result, list, element_type) {\
|
||||||
|
|||||||
+2
-1
@@ -16,6 +16,7 @@ This page is valid on tags starting from **`2019.w09`**.
|
|||||||
|
|
||||||
# Soft Modem Build Script
|
# Soft Modem Build Script
|
||||||
|
|
||||||
|
The OAI EPC is developed in a distinct project with it's own [documentation](https://github.com/OPENAIRINTERFACE/openair-epc-fed/wiki) , it is not described here.
|
||||||
|
|
||||||
OAI softmodem sources, which aim to implement 3GPP compliant UEs, eNodeB and gNodeB can be downloaded from the Eurecom [gitlab repository](./GET_SOURCES.md).
|
OAI softmodem sources, which aim to implement 3GPP compliant UEs, eNodeB and gNodeB can be downloaded from the Eurecom [gitlab repository](./GET_SOURCES.md).
|
||||||
|
|
||||||
@@ -33,7 +34,7 @@ The main oai binaries, which are tested by the Continuous Integration process ar
|
|||||||
|
|
||||||
Running the [build_oai](../cmake_targets/build_oai) script also generates some utilities required to build and/or run the oai softmodem binaries:
|
Running the [build_oai](../cmake_targets/build_oai) script also generates some utilities required to build and/or run the oai softmodem binaries:
|
||||||
|
|
||||||
- `con2uedata`: a binary used to build the UE data from a configuration file. The created file emulates the sim card of a 3GPP compliant phone.
|
- `conf2uedata`: a binary used to build the UE data from a configuration file. The created file emulates the sim card of a 3GPP compliant phone.
|
||||||
- `nvram`: a binary used to build UE (IMEI...) and EMM (IMSI, registered PLMN) non volatile data.
|
- `nvram`: a binary used to build UE (IMEI...) and EMM (IMSI, registered PLMN) non volatile data.
|
||||||
- `rb_tool`: radio bearer utility
|
- `rb_tool`: radio bearer utility
|
||||||
- `genids` T Tracer utility, used at build time to generate T_IDs.h include file. This binary is located in the [T Tracer source file directory](../common/utils/T) .
|
- `genids` T Tracer utility, used at build time to generate T_IDs.h include file. This binary is located in the [T Tracer source file directory](../common/utils/T) .
|
||||||
|
|||||||
+1
-7
@@ -33,12 +33,8 @@ holds the source code for (eNB RAN + UE RAN).
|
|||||||
For legal issues (licenses), the core network (EPC) source code is now moved away from
|
For legal issues (licenses), the core network (EPC) source code is now moved away from
|
||||||
the above openairinterface5g git repository.
|
the above openairinterface5g git repository.
|
||||||
|
|
||||||
* A very old version of the EPC is located under the same GitLab Eurecom server (splitted into 2 Git repos):
|
|
||||||
* [openair-cn](https://gitlab.eurecom.fr/oai/openair-cn.git) with apache license
|
|
||||||
* [xtables-addons-oai](https://gitlab.eurecom.fr/oai/xtables-addons-oai.git) with GPL license
|
|
||||||
* **These repositories are no more maintained.**
|
|
||||||
* A more recent version is available under our GitHub domain:
|
* A more recent version is available under our GitHub domain:
|
||||||
* [OAI GitHub openair-cn](https://github.com/OPENAIRINTERFACE/openair-cn)
|
* [OAI GitHub openair-cn domain](https://github.com/OPENAIRINTERFACE)
|
||||||
* Check its wiki pages for more details
|
* Check its wiki pages for more details
|
||||||
|
|
||||||
Configure git with your name/email address (only important if you are developer and want to contribute/push code to Git Repository):
|
Configure git with your name/email address (only important if you are developer and want to contribute/push code to Git Repository):
|
||||||
@@ -80,8 +76,6 @@ you do not have account on gitlab.eurecom.fr, please register yourself to gitlab
|
|||||||
* `git clone git@gitlab.eurecom.fr:oai/openairinterface5g.git`
|
* `git clone git@gitlab.eurecom.fr:oai/openairinterface5g.git`
|
||||||
* Clone with user name/password prompt:
|
* Clone with user name/password prompt:
|
||||||
* `git clone https://YOUR_USERNAME@gitlab.eurecom.fr/oai/openairinterface5g.git`
|
* `git clone https://YOUR_USERNAME@gitlab.eurecom.fr/oai/openairinterface5g.git`
|
||||||
* `git clone https://YOUR_USERNAME@gitlab.eurecom.fr/oai/openair-cn.git`
|
|
||||||
* `git clone https://YOUR_USERNAME@gitlab.eurecom.fr/oai/xtables-addons-oai.git` (optional, openair-cn build script can do it for you)
|
|
||||||
|
|
||||||
# Which branch to checkout?
|
# Which branch to checkout?
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
## Table of Contents ##
|
||||||
|
|
||||||
|
1. [Legacy 1 Bench](#legacy-1-bench)
|
||||||
|
2. [Legacy 2 Bench](#legacy-2-bench)
|
||||||
|
3. [Next Bench for DEV](#next-bench-for-dev)
|
||||||
|
4. [Next Bench for CI](#next-bench-for-ci)
|
||||||
|
5. [Indoor Live Network Bench](#indoor-live-network-bench)
|
||||||
|
6. [Outdoor Live Network Bench](#outdoor-live-network-bench)
|
||||||
|
|
||||||
|
|
||||||
|
## Legacy 1 Bench
|
||||||
|
|
||||||
|
**Purpose** : FDD Band 7 and Band 13, LTE-M
|
||||||
|
**Note** : Legacy1 and Legacy2 are duplicated so that they can run in parallel, thus avoiding a CI bottleneck
|
||||||
|
**Note** : Faraday Cages 1 and 2 are physically the same cage
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Legacy 2 Bench
|
||||||
|
|
||||||
|
**Purpose** : TDD Band 40, TM2 2xTX 2xRX
|
||||||
|
**Note** : CN can run in a container, could also run on Massive
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Next Bench for DEV
|
||||||
|
|
||||||
|
**Note** : Benetel CI can also run on this bench at night
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## Next Bench for CI
|
||||||
|
|
||||||
|
**Note** : The current test running on Caracal could run on this bench with a N300/N300 setup
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Indoor Live Network Bench
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Outdoor Live Network Bench
|
||||||
|
|
||||||
|

|
||||||
@@ -1,4 +1,4 @@
|
|||||||
STATUS 2020/07/30 : under continuous improvement ; updated the configuration files links with CI approved reference files
|
STATUS 2020/09/10 : updated the status of interop (end to end UL/DL traffic)
|
||||||
|
|
||||||
|
|
||||||
## Table of Contents ##
|
## Table of Contents ##
|
||||||
@@ -194,7 +194,7 @@ The order to run the different components is important:
|
|||||||
1- first, CN
|
1- first, CN
|
||||||
2- then, eNB
|
2- then, eNB
|
||||||
3- then, gNB
|
3- then, gNB
|
||||||
4- finally, switch UE from airplane mode OFF to ON
|
4- finally, switch UE from airplane mode ON to OFF (ie Radio from OFF to ON)
|
||||||
|
|
||||||
It is recommended to redirect the run commands to the same log file (fur further analysis and debug), using ```| tee **YOUR_LOG_FILE**``` especially for eNB and gNB.
|
It is recommended to redirect the run commands to the same log file (fur further analysis and debug), using ```| tee **YOUR_LOG_FILE**``` especially for eNB and gNB.
|
||||||
It is not very useful for the CN.
|
It is not very useful for the CN.
|
||||||
@@ -220,17 +220,16 @@ Execute:
|
|||||||
- **gNB** (on the gNB host)
|
- **gNB** (on the gNB host)
|
||||||
|
|
||||||
|
|
||||||
|
**ATTENTION** : for the gNB execution,
|
||||||
|
The **-E** option is required to enable the tri-quarter sampling rate when using a B2xx serie USRP
|
||||||
|
The **-E** option is **NOT supported** when using a a N300 USRP
|
||||||
|
|
||||||
Execute:
|
Execute:
|
||||||
```
|
```
|
||||||
~/openairinterface5g/cmake_targets/ran_build/build$ sudo ./nr-softmodem -O **YOUR_GNB_CONF_FILE** -E | tee **YOUR_LOG_FILE**
|
~/openairinterface5g/cmake_targets/ran_build/build$ sudo ./nr-softmodem -O **YOUR_GNB_CONF_FILE** -E | tee **YOUR_LOG_FILE**
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**ATTENTION** : for the gNB execution,
|
|
||||||
The -E option is required to enable the tri-quarter sampling rate when using a B2xx serie USRP
|
|
||||||
The -E opton is not needed when using a a N300 USRP
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Test Case
|
## Test Case
|
||||||
|
|
||||||
@@ -377,13 +376,11 @@ The following parts have been validated with FR1 COTS UE:
|
|||||||
PDCCH DCI format 1_1 and correponding PDSCH are decoded correctlyby the phone
|
PDCCH DCI format 1_1 and correponding PDSCH are decoded correctlyby the phone
|
||||||
ACK/NACK (PUCCH format 0) are successfully received at gNB
|
ACK/NACK (PUCCH format 0) are successfully received at gNB
|
||||||
|
|
||||||
- On going:
|
- **End-to end UL / DL traffic with HARQ procedures validated (ping, iperf)**
|
||||||
validation of HARQ procedures
|
|
||||||
Integration with higher layers to replace dummy data with real traffic
|
|
||||||
|
|
||||||
- Known limitations as of May 2020:
|
- Known limitations as of September 2020:
|
||||||
only dummy DL traffic
|
DL traffic : 3Mbps
|
||||||
no UL traffic
|
UL traffic : 1Mbps
|
||||||
no end-to-end traffic possible
|
some packet losses might still occur even in ideal channel conditions
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Executable
BIN
Binary file not shown.
BIN
Binary file not shown.
|
After Width: | Height: | Size: 248 KiB |
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 105 KiB |
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 119 KiB |
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 154 KiB |
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 181 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 164 KiB |
@@ -0,0 +1,92 @@
|
|||||||
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Dockerfile for the Open-Air-Interface eNB service
|
||||||
|
# Valid for RHEL7 in the OpenShift context (v4.4)
|
||||||
|
#
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
ARG REGISTRY=localhost
|
||||||
|
FROM $REGISTRY/oai-build-base:latest.el7 AS builder
|
||||||
|
|
||||||
|
ARG GIT_TAG=v1.1.1
|
||||||
|
|
||||||
|
WORKDIR /root
|
||||||
|
|
||||||
|
RUN if [ "$EURECOM_PROXY" == true ]; then git config --global http.proxy http://:@proxy.eurecom.fr:8080; fi
|
||||||
|
|
||||||
|
RUN git clone --depth=1 --branch=$GIT_TAG https://gitlab.eurecom.fr/oai/openairinterface5g.git
|
||||||
|
COPY patches patches/
|
||||||
|
RUN patch -p1 -d openairinterface5g < patches/disable_building_nasmesh_and_rbtool.patch \
|
||||||
|
&& patch -p1 -d openairinterface5g < patches/disable_sched_fifo_fail_exits.patch
|
||||||
|
RUN cd openairinterface5g/cmake_targets \
|
||||||
|
&& ln -sf /usr/local/bin/asn1c_oai /usr/local/bin/asn1c \
|
||||||
|
&& ln -sf /usr/local/share/asn1c_oai /usr/local/share/asn1c \
|
||||||
|
&& ./build_oai -c --eNB -w USRP --verbose-compile
|
||||||
|
|
||||||
|
|
||||||
|
FROM registry.redhat.io/ubi7/ubi
|
||||||
|
LABEL name="oai-enb" \
|
||||||
|
version="$GIT_TAG" \
|
||||||
|
maintainer="Frank A. Zdarsky <fzdarsky@redhat.com>" \
|
||||||
|
io.k8s.description="openairinterface5g eNB $GIT_TAG." \
|
||||||
|
io.openshift.tags="oai,enb" \
|
||||||
|
io.openshift.non-scalable="true"
|
||||||
|
|
||||||
|
RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \
|
||||||
|
&& REPOLIST="rhel-7-server-optional-rpms" \
|
||||||
|
&& PKGLIST="boost libconfig lksctp-tools protobuf-c iproute iputils procps-ng bind-utils xforms nettle libyaml libusb" \
|
||||||
|
# && yum -y upgrade-minimal --setopt=tsflags=nodocs --security --sec-severity=Critical --sec-severity=Important && \
|
||||||
|
&& yum -y install --enablerepo ${REPOLIST} --setopt=tsflag=nodocs ${PKGLIST} \
|
||||||
|
&& yum -y clean all \
|
||||||
|
&& rm -rf /var/cache/yum
|
||||||
|
|
||||||
|
ENV APP_ROOT=/opt/oai-enb
|
||||||
|
ENV PATH=${APP_ROOT}:${PATH} HOME=${APP_ROOT}
|
||||||
|
COPY --from=builder /root/openairinterface5g/cmake_targets/lte_build_oai/build/lte-softmodem ${APP_ROOT}/bin/
|
||||||
|
COPY --from=builder /root/openairinterface5g/cmake_targets/lte_build_oai/build/*.so* /lib64
|
||||||
|
COPY --from=builder /usr/local/lib64 /lib64
|
||||||
|
COPY --from=builder /usr/local/bin/uhd_* /usr/local/bin
|
||||||
|
COPY --from=builder /usr/local/share/uhd /usr/local/share/uhd
|
||||||
|
RUN cd /lib64 \
|
||||||
|
&& ln -sf liboai_eth_transpro.so liboai_transpro.so \
|
||||||
|
&& ln -sf liboai_usrpdevif.so liboai_device.so \
|
||||||
|
&& ln -sf libuhd.so.3.13 libuhd.so.3 \
|
||||||
|
&& ln -sf libuhd.so.3 libuhd.so
|
||||||
|
COPY scripts ${APP_ROOT}/bin/
|
||||||
|
COPY configs ${APP_ROOT}/etc/
|
||||||
|
RUN chmod -R u+x ${APP_ROOT} && \
|
||||||
|
chgrp -R 0 ${APP_ROOT} && \
|
||||||
|
chmod -R g=u ${APP_ROOT} /etc/passwd
|
||||||
|
USER 10001
|
||||||
|
WORKDIR ${APP_ROOT}
|
||||||
|
|
||||||
|
EXPOSE 2152/udp # S1U, GTP/UDP
|
||||||
|
EXPOSE 22100/tcp # ?
|
||||||
|
EXPOSE 36412/udp # S1C, SCTP/UDP
|
||||||
|
EXPOSE 36422/udp # X2C, SCTP/UDP
|
||||||
|
EXPOSE 50000/udp # IF5 / ORI (control)
|
||||||
|
EXPOSE 50001/udp # IF5 / ECPRI (data)
|
||||||
|
|
||||||
|
CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
|
||||||
|
ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
|
||||||
+44
-19
@@ -180,6 +180,17 @@ int attach_rru(RU_t *ru)
|
|||||||
((RRU_config_t *)&rru_config_msg.msg[0])->prach_ConfigIndex[0]);
|
((RRU_config_t *)&rru_config_msg.msg[0])->prach_ConfigIndex[0]);
|
||||||
AssertFatal((ru->ifdevice.trx_ctlsend_func(&ru->ifdevice,&rru_config_msg,rru_config_msg.len)!=-1),
|
AssertFatal((ru->ifdevice.trx_ctlsend_func(&ru->ifdevice,&rru_config_msg,rru_config_msg.len)!=-1),
|
||||||
"RU %d failed send configuration to remote radio\n",ru->idx);
|
"RU %d failed send configuration to remote radio\n",ru->idx);
|
||||||
|
|
||||||
|
if ((len = ru->ifdevice.trx_ctlrecv_func(&ru->ifdevice,
|
||||||
|
&rru_config_msg,
|
||||||
|
msg_len))<0) {
|
||||||
|
LOG_I(PHY,"Waiting for RRU %d\n",ru->idx);
|
||||||
|
} else if (rru_config_msg.type == RRU_config_ok) {
|
||||||
|
LOG_I(PHY, "RRU_config_ok received\n");
|
||||||
|
} else {
|
||||||
|
LOG_E(PHY,"Received incorrect message %d from RRU %d\n",rru_config_msg.type,ru->idx);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1442,6 +1453,8 @@ void *ru_thread( void *param ) {
|
|||||||
|
|
||||||
LOG_I(PHY,"Starting RU %d (%s,%s),\n",ru->idx,NB_functions[ru->function],NB_timing[ru->if_timing]);
|
LOG_I(PHY,"Starting RU %d (%s,%s),\n",ru->idx,NB_functions[ru->function],NB_timing[ru->if_timing]);
|
||||||
|
|
||||||
|
memcpy((void*)&ru->config,(void*)&RC.gNB[0]->gNB_config,sizeof(ru->config));
|
||||||
|
|
||||||
if(emulate_rf) {
|
if(emulate_rf) {
|
||||||
fill_rf_config(ru,ru->rf_config_file);
|
fill_rf_config(ru,ru->rf_config_file);
|
||||||
nr_init_frame_parms(&ru->config, fp);
|
nr_init_frame_parms(&ru->config, fp);
|
||||||
@@ -1464,8 +1477,6 @@ void *ru_thread( void *param ) {
|
|||||||
AssertFatal(ret==0,"Cannot connect to remote radio\n");
|
AssertFatal(ret==0,"Cannot connect to remote radio\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy((void*)&ru->config,(void*)&RC.gNB[0]->gNB_config,sizeof(ru->config));
|
|
||||||
|
|
||||||
if (ru->if_south == LOCAL_RF) { // configure RF parameters only
|
if (ru->if_south == LOCAL_RF) { // configure RF parameters only
|
||||||
nr_init_frame_parms(&ru->config, fp);
|
nr_init_frame_parms(&ru->config, fp);
|
||||||
nr_dump_frame_parms(fp);
|
nr_dump_frame_parms(fp);
|
||||||
@@ -1571,7 +1582,8 @@ void *ru_thread( void *param ) {
|
|||||||
if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) {
|
if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) {
|
||||||
//if (proc->tti_rx==8) {
|
//if (proc->tti_rx==8) {
|
||||||
|
|
||||||
if (ru->feprx) ru->feprx(ru,proc->tti_rx);
|
if (ru->feprx) {
|
||||||
|
ru->feprx(ru,proc->tti_rx);
|
||||||
//LOG_M("rxdata.m","rxs",ru->common.rxdata[0],1228800,1,1);
|
//LOG_M("rxdata.m","rxs",ru->common.rxdata[0],1228800,1,1);
|
||||||
|
|
||||||
LOG_D(PHY,"RU proc: frame_rx = %d, tti_rx = %d\n", proc->frame_rx, proc->tti_rx);
|
LOG_D(PHY,"RU proc: frame_rx = %d, tti_rx = %d\n", proc->frame_rx, proc->tti_rx);
|
||||||
@@ -1591,6 +1603,7 @@ void *ru_thread( void *param ) {
|
|||||||
proc->frame_rx,proc->tti_rx);
|
proc->frame_rx,proc->tti_rx);
|
||||||
free_nr_ru_prach_entry(ru,prach_id);
|
free_nr_ru_prach_entry(ru,prach_id);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// At this point, all information for subframe has been received on FH interface
|
// At this point, all information for subframe has been received on FH interface
|
||||||
@@ -2131,26 +2144,29 @@ void set_function_spec_param(RU_t *ru) {
|
|||||||
ru->fh_north_out = NULL; // no outgoing fronthaul to north
|
ru->fh_north_out = NULL; // no outgoing fronthaul to north
|
||||||
ru->nr_start_if = NULL; // no if interface
|
ru->nr_start_if = NULL; // no if interface
|
||||||
ru->rfdevice.host_type = RAU_HOST;
|
ru->rfdevice.host_type = RAU_HOST;
|
||||||
|
|
||||||
|
// FK this here looks messed up. The following lines should be part of the if (ru->function == gNodeB_3GPP), shouldn't they?
|
||||||
|
|
||||||
|
ru->fh_south_in = rx_rf; // local synchronous RF RX
|
||||||
|
ru->fh_south_out = tx_rf; // local synchronous RF TX
|
||||||
|
ru->start_rf = start_rf; // need to start the local RF interface
|
||||||
|
ru->stop_rf = stop_rf;
|
||||||
|
ru->start_write_thread = start_write_thread; // starting RF TX in different thread
|
||||||
|
printf("configuring ru_id %u (start_rf %p)\n", ru->idx, start_rf);
|
||||||
}
|
}
|
||||||
|
|
||||||
ru->fh_south_in = rx_rf; // local synchronous RF RX
|
|
||||||
ru->fh_south_out = tx_rf; // local synchronous RF TX
|
|
||||||
ru->start_rf = start_rf; // need to start the local RF interface
|
|
||||||
ru->stop_rf = stop_rf;
|
|
||||||
ru->start_write_thread = start_write_thread; // starting RF TX in different thread
|
|
||||||
printf("configuring ru_id %u (start_rf %p)\n", ru->idx, start_rf);
|
|
||||||
/*
|
/*
|
||||||
if (ru->function == gNodeB_3GPP) { // configure RF parameters only for 3GPP eNodeB, we need to get them from RAU otherwise
|
printf("configuring ru_id %u (start_rf %p)\n", ru->idx, start_rf);
|
||||||
fill_rf_config(ru,rf_config_file);
|
fill_rf_config(ru,rf_config_file);
|
||||||
init_frame_parms(&ru->frame_parms,1);
|
init_frame_parms(&ru->frame_parms,1);
|
||||||
nr_phy_init_RU(ru);
|
nr_phy_init_RU(ru);
|
||||||
}
|
|
||||||
|
|
||||||
ret = openair0_device_load(&ru->rfdevice,&ru->openair0_cfg);
|
ret = openair0_device_load(&ru->rfdevice,&ru->openair0_cfg);
|
||||||
if (setup_RU_buffers(ru)!=0) {
|
if (setup_RU_buffers(ru)!=0) {
|
||||||
printf("Exiting, cannot initialize RU Buffers\n");
|
printf("Exiting, cannot initialize RU Buffers\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}*/
|
}
|
||||||
|
*/
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case REMOTE_IF5: // the remote unit is IF5 RRU
|
case REMOTE_IF5: // the remote unit is IF5 RRU
|
||||||
@@ -2203,6 +2219,15 @@ void set_function_spec_param(RU_t *ru) {
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ru->ifdevice.get_internal_parameter != NULL) {
|
||||||
|
void *t = ru->ifdevice.get_internal_parameter("fh_if4p5_south_in");
|
||||||
|
if (t != NULL)
|
||||||
|
ru->fh_south_in = t;
|
||||||
|
t = ru->ifdevice.get_internal_parameter("fh_if4p5_south_out");
|
||||||
|
if (t != NULL)
|
||||||
|
ru->fh_south_out = t;
|
||||||
|
}
|
||||||
|
|
||||||
malloc_IF4p5_buffer(ru);
|
malloc_IF4p5_buffer(ru);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
+43
-40
@@ -364,8 +364,6 @@ static void UE_synch(void *arg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void processSlotTX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
void processSlotTX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
||||||
|
|
||||||
|
|
||||||
fapi_nr_config_request_t *cfg = &UE->nrUE_config;
|
fapi_nr_config_request_t *cfg = &UE->nrUE_config;
|
||||||
int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_tti_tx);
|
int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_tti_tx);
|
||||||
uint8_t gNB_id = 0;
|
uint8_t gNB_id = 0;
|
||||||
@@ -473,21 +471,22 @@ void UE_processing(void *arg) {
|
|||||||
UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
|
UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
|
||||||
PHY_VARS_NR_UE *UE = rxtxD->UE;
|
PHY_VARS_NR_UE *UE = rxtxD->UE;
|
||||||
|
|
||||||
uint8_t gNB_id = 0;
|
processSlotRX(UE, proc);
|
||||||
|
processSlotTX(UE, proc);
|
||||||
// params for UL time alignment procedure
|
|
||||||
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &UE->ul_time_alignment[gNB_id];
|
|
||||||
uint8_t numerology = UE->frame_parms.numerology_index;
|
|
||||||
uint16_t bwp_ul_NB_RB = UE->frame_parms.N_RB_UL;
|
|
||||||
int slot_tx = proc->nr_tti_tx;
|
|
||||||
int frame_tx = proc->frame_tx;
|
|
||||||
|
|
||||||
/* UL time alignment
|
/* UL time alignment
|
||||||
// If the current tx frame and slot match the TA configuration in ul_time_alignment
|
// If the current tx frame and slot match the TA configuration in ul_time_alignment
|
||||||
// then timing advance is processed and set to be applied in the next UL transmission */
|
// then timing advance is processed and set to be applied in the next UL transmission */
|
||||||
if (UE->mac_enabled == 1) {
|
if (UE->mac_enabled == 1) {
|
||||||
|
uint8_t gNB_id = 0;
|
||||||
|
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &UE->ul_time_alignment[gNB_id];
|
||||||
|
int slot_tx = proc->nr_tti_tx;
|
||||||
|
int frame_tx = proc->frame_tx;
|
||||||
|
|
||||||
if (frame_tx == ul_time_alignment->ta_frame && slot_tx == ul_time_alignment->ta_slot) {
|
if (frame_tx == ul_time_alignment->ta_frame && slot_tx == ul_time_alignment->ta_slot) {
|
||||||
|
uint8_t numerology = UE->frame_parms.numerology_index;
|
||||||
|
uint16_t bwp_ul_NB_RB = UE->frame_parms.N_RB_UL;
|
||||||
|
|
||||||
LOG_D(PHY,"Applying timing advance -- frame %d -- slot %d\n", frame_tx, slot_tx);
|
LOG_D(PHY,"Applying timing advance -- frame %d -- slot %d\n", frame_tx, slot_tx);
|
||||||
|
|
||||||
//if (nfapi_mode!=3){
|
//if (nfapi_mode!=3){
|
||||||
@@ -497,9 +496,6 @@ void UE_processing(void *arg) {
|
|||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
processSlotRX(UE, proc);
|
|
||||||
processSlotTX(UE, proc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void dummyWrite(PHY_VARS_NR_UE *UE,openair0_timestamp timestamp, int writeBlockSize) {
|
void dummyWrite(PHY_VARS_NR_UE *UE,openair0_timestamp timestamp, int writeBlockSize) {
|
||||||
@@ -624,6 +620,7 @@ void *UE_thread(void *arg) {
|
|||||||
notifiedFIFO_t freeBlocks;
|
notifiedFIFO_t freeBlocks;
|
||||||
initNotifiedFIFO_nothreadSafe(&freeBlocks);
|
initNotifiedFIFO_nothreadSafe(&freeBlocks);
|
||||||
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
||||||
|
int timing_advance = UE->timing_advance;
|
||||||
|
|
||||||
for (int i=0; i<RX_NB_TH+1; i++) // RX_NB_TH working + 1 we are making to be pushed
|
for (int i=0; i<RX_NB_TH+1; i++) // RX_NB_TH working + 1 we are making to be pushed
|
||||||
pushNotifiedFIFO_nothreadSafe(&freeBlocks,
|
pushNotifiedFIFO_nothreadSafe(&freeBlocks,
|
||||||
@@ -728,21 +725,26 @@ void *UE_thread(void *arg) {
|
|||||||
|
|
||||||
for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++)
|
for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++)
|
||||||
txp[i] = (void *)&UE->common_vars.txdata[i][UE->frame_parms.get_samples_slot_timestamp(
|
txp[i] = (void *)&UE->common_vars.txdata[i][UE->frame_parms.get_samples_slot_timestamp(
|
||||||
((curMsg->proc.nr_tti_rx + DURATION_RX_TO_TX -2)%nb_slot_frame),&UE->frame_parms,0)];
|
((slot_nr + DURATION_RX_TO_TX - RX_NB_TH)%nb_slot_frame),&UE->frame_parms,0)];
|
||||||
|
|
||||||
int readBlockSize, writeBlockSize;
|
int readBlockSize, writeBlockSize;
|
||||||
|
|
||||||
if (slot_nr<(nb_slot_frame - 1)) {
|
if (slot_nr<(nb_slot_frame - 1)) {
|
||||||
readBlockSize=get_readBlockSize(slot_nr, &UE->frame_parms);
|
readBlockSize=get_readBlockSize(slot_nr, &UE->frame_parms);
|
||||||
writeBlockSize=UE->frame_parms.get_samples_per_slot(curMsg->proc.nr_tti_tx,&UE->frame_parms);
|
writeBlockSize=UE->frame_parms.get_samples_per_slot((slot_nr + DURATION_RX_TO_TX - RX_NB_TH) % nb_slot_frame, &UE->frame_parms);
|
||||||
} else {
|
} else {
|
||||||
UE->rx_offset_diff = computeSamplesShift(UE);
|
UE->rx_offset_diff = computeSamplesShift(UE);
|
||||||
readBlockSize=get_readBlockSize(slot_nr, &UE->frame_parms) -
|
readBlockSize=get_readBlockSize(slot_nr, &UE->frame_parms) -
|
||||||
UE->rx_offset_diff;
|
UE->rx_offset_diff;
|
||||||
writeBlockSize=UE->frame_parms.get_samples_per_slot(curMsg->proc.nr_tti_tx,&UE->frame_parms) -
|
writeBlockSize=UE->frame_parms.get_samples_per_slot((slot_nr + DURATION_RX_TO_TX - RX_NB_TH) % nb_slot_frame, &UE->frame_parms)-
|
||||||
UE->rx_offset_diff;
|
UE->rx_offset_diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (UE->timing_advance != timing_advance) {
|
||||||
|
writeBlockSize -= UE->timing_advance - timing_advance;
|
||||||
|
timing_advance = UE->timing_advance;
|
||||||
|
}
|
||||||
|
|
||||||
AssertFatal(readBlockSize ==
|
AssertFatal(readBlockSize ==
|
||||||
UE->rfdevice.trx_read_func(&UE->rfdevice,
|
UE->rfdevice.trx_read_func(&UE->rfdevice,
|
||||||
×tamp,
|
×tamp,
|
||||||
@@ -750,29 +752,19 @@ void *UE_thread(void *arg) {
|
|||||||
readBlockSize,
|
readBlockSize,
|
||||||
UE->frame_parms.nb_antennas_rx),"");
|
UE->frame_parms.nb_antennas_rx),"");
|
||||||
|
|
||||||
AssertFatal( writeBlockSize ==
|
|
||||||
UE->rfdevice.trx_write_func(&UE->rfdevice,
|
|
||||||
timestamp+
|
|
||||||
UE->frame_parms.get_samples_slot_timestamp(slot_nr,
|
|
||||||
&UE->frame_parms,DURATION_RX_TO_TX -2) - firstSymSamp -
|
|
||||||
openair0_cfg[0].tx_sample_advance,
|
|
||||||
txp,
|
|
||||||
writeBlockSize,
|
|
||||||
UE->frame_parms.nb_antennas_tx,
|
|
||||||
1),"");
|
|
||||||
|
|
||||||
if( slot_nr==(nb_slot_frame-1)) {
|
if( slot_nr==(nb_slot_frame-1)) {
|
||||||
// read in first symbol of next frame and adjust for timing drift
|
// read in first symbol of next frame and adjust for timing drift
|
||||||
int first_symbols=UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0; // first symbol of every frames
|
int first_symbols=UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0; // first symbol of every frames
|
||||||
|
|
||||||
if ( first_symbols > 0 )
|
if ( first_symbols > 0 ) {
|
||||||
|
openair0_timestamp ignore_timestamp;
|
||||||
AssertFatal(first_symbols ==
|
AssertFatal(first_symbols ==
|
||||||
UE->rfdevice.trx_read_func(&UE->rfdevice,
|
UE->rfdevice.trx_read_func(&UE->rfdevice,
|
||||||
×tamp,
|
&ignore_timestamp,
|
||||||
(void **)UE->common_vars.rxdata,
|
(void **)UE->common_vars.rxdata,
|
||||||
first_symbols,
|
first_symbols,
|
||||||
UE->frame_parms.nb_antennas_rx),"");
|
UE->frame_parms.nb_antennas_rx),"");
|
||||||
else
|
} else
|
||||||
LOG_E(PHY,"can't compensate: diff =%d\n", first_symbols);
|
LOG_E(PHY,"can't compensate: diff =%d\n", first_symbols);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -783,18 +775,15 @@ void *UE_thread(void *arg) {
|
|||||||
notifiedFIFO_elt_t *res;
|
notifiedFIFO_elt_t *res;
|
||||||
|
|
||||||
while (nbSlotProcessing >= RX_NB_TH) {
|
while (nbSlotProcessing >= RX_NB_TH) {
|
||||||
if ( (res=tryPullTpool(&nf, Tpool)) != NULL ) {
|
res=pullTpool(&nf, Tpool);
|
||||||
nbSlotProcessing--;
|
nbSlotProcessing--;
|
||||||
processingData_t *tmp=(processingData_t *)res->msgData;
|
processingData_t *tmp=(processingData_t *)res->msgData;
|
||||||
|
|
||||||
if (tmp->proc.decoded_frame_rx != -1)
|
if (tmp->proc.decoded_frame_rx != -1)
|
||||||
decoded_frame_rx=(((mac->mib->systemFrameNumber.buf[0] >> mac->mib->systemFrameNumber.bits_unused)<<4) | tmp->proc.decoded_frame_rx);
|
decoded_frame_rx=(((mac->mib->systemFrameNumber.buf[0] >> mac->mib->systemFrameNumber.bits_unused)<<4) | tmp->proc.decoded_frame_rx);
|
||||||
//decoded_frame_rx=tmp->proc.decoded_frame_rx;
|
//decoded_frame_rx=tmp->proc.decoded_frame_rx;
|
||||||
|
|
||||||
pushNotifiedFIFO_nothreadSafe(&freeBlocks,res);
|
pushNotifiedFIFO_nothreadSafe(&freeBlocks,res);
|
||||||
}
|
|
||||||
|
|
||||||
usleep(200);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (decoded_frame_rx != curMsg->proc.frame_rx) &&
|
if ( (decoded_frame_rx != curMsg->proc.frame_rx) &&
|
||||||
@@ -803,6 +792,20 @@ void *UE_thread(void *arg) {
|
|||||||
LOG_E(PHY,"Decoded frame index (%d) is not compatible with current context (%d), UE should go back to synch mode\n",
|
LOG_E(PHY,"Decoded frame index (%d) is not compatible with current context (%d), UE should go back to synch mode\n",
|
||||||
decoded_frame_rx, curMsg->proc.frame_rx );
|
decoded_frame_rx, curMsg->proc.frame_rx );
|
||||||
|
|
||||||
|
AssertFatal( writeBlockSize ==
|
||||||
|
UE->rfdevice.trx_write_func(&UE->rfdevice,
|
||||||
|
timestamp+
|
||||||
|
UE->frame_parms.get_samples_slot_timestamp(slot_nr,
|
||||||
|
&UE->frame_parms,DURATION_RX_TO_TX - RX_NB_TH) - firstSymSamp -
|
||||||
|
openair0_cfg[0].tx_sample_advance - UE->N_TA_offset - UE->timing_advance,
|
||||||
|
txp,
|
||||||
|
writeBlockSize,
|
||||||
|
UE->frame_parms.nb_antennas_tx,
|
||||||
|
1),"");
|
||||||
|
|
||||||
|
for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++)
|
||||||
|
memset(txp[i], 0, writeBlockSize);
|
||||||
|
|
||||||
nbSlotProcessing++;
|
nbSlotProcessing++;
|
||||||
msgToPush->key=slot_nr;
|
msgToPush->key=slot_nr;
|
||||||
pushTpool(Tpool, msgToPush);
|
pushTpool(Tpool, msgToPush);
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
#include "../../ARCH/ETHERNET/USERSPACE/LIB/if_defs.h"
|
#include "../../ARCH/ETHERNET/USERSPACE/LIB/if_defs.h"
|
||||||
|
|
||||||
//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
|
//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
|
||||||
|
#include "openair1/PHY/MODULATION/nr_modulation.h"
|
||||||
#include "PHY/phy_vars_nr_ue.h"
|
#include "PHY/phy_vars_nr_ue.h"
|
||||||
#include "PHY/LTE_TRANSPORT/transport_vars.h"
|
#include "PHY/LTE_TRANSPORT/transport_vars.h"
|
||||||
#include "SCHED/sched_common_vars.h"
|
#include "SCHED/sched_common_vars.h"
|
||||||
@@ -584,7 +584,7 @@ void init_pdcp(void) {
|
|||||||
LOG_I(RLC, "Problem at RLC initiation \n");
|
LOG_I(RLC, "Problem at RLC initiation \n");
|
||||||
}
|
}
|
||||||
pdcp_layer_init();
|
pdcp_layer_init();
|
||||||
nr_ip_over_LTE_DRB_preconfiguration();*/
|
nr_DRB_preconfiguration();*/
|
||||||
pdcp_module_init(pdcp_initmask);
|
pdcp_module_init(pdcp_initmask);
|
||||||
pdcp_set_rlc_data_req_func((send_rlc_data_req_func_t) rlc_data_req);
|
pdcp_set_rlc_data_req_func((send_rlc_data_req_func_t) rlc_data_req);
|
||||||
pdcp_set_pdcp_data_ind_func((pdcp_data_ind_func_t) pdcp_data_ind);
|
pdcp_set_pdcp_data_ind_func((pdcp_data_ind_func_t) pdcp_data_ind);
|
||||||
@@ -685,11 +685,14 @@ int main( int argc, char **argv ) {
|
|||||||
|
|
||||||
fapi_nr_config_request_t *nrUE_config = &UE[CC_id]->nrUE_config;
|
fapi_nr_config_request_t *nrUE_config = &UE[CC_id]->nrUE_config;
|
||||||
nr_init_frame_parms_ue(frame_parms[CC_id],nrUE_config,NORMAL);
|
nr_init_frame_parms_ue(frame_parms[CC_id],nrUE_config,NORMAL);
|
||||||
|
|
||||||
// Overwrite DL frequency (for FR2 testing)
|
// Overwrite DL frequency (for FR2 testing)
|
||||||
if (downlink_frequency[0][0]!=0)
|
if (downlink_frequency[0][0]!=0) {
|
||||||
frame_parms[CC_id]->dl_CarrierFreq = downlink_frequency[0][0];
|
frame_parms[CC_id]->dl_CarrierFreq = downlink_frequency[0][0];
|
||||||
|
frame_parms[CC_id]->ul_CarrierFreq = downlink_frequency[0][0];
|
||||||
|
}
|
||||||
|
|
||||||
|
init_symbol_rotation(frame_parms[CC_id],frame_parms[CC_id]->dl_CarrierFreq);
|
||||||
init_nr_ue_vars(UE[CC_id],frame_parms[CC_id],0,abstraction_flag);
|
init_nr_ue_vars(UE[CC_id],frame_parms[CC_id],0,abstraction_flag);
|
||||||
|
|
||||||
UE[CC_id]->mac_enabled = 1;
|
UE[CC_id]->mac_enabled = 1;
|
||||||
@@ -766,13 +769,7 @@ int main( int argc, char **argv ) {
|
|||||||
for(int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
for(int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
PHY_vars_UE_g[0][CC_id]->rf_map.card=0;
|
PHY_vars_UE_g[0][CC_id]->rf_map.card=0;
|
||||||
PHY_vars_UE_g[0][CC_id]->rf_map.chain=CC_id+chain_offset;
|
PHY_vars_UE_g[0][CC_id]->rf_map.chain=CC_id+chain_offset;
|
||||||
#if defined(OAI_USRP) || defined(OAI_ADRV9371_ZC706)
|
|
||||||
PHY_vars_UE_g[0][CC_id]->hw_timing_advance = timing_advance;
|
|
||||||
PHY_vars_UE_g[0][CC_id]->timing_advance = timing_advance;
|
PHY_vars_UE_g[0][CC_id]->timing_advance = timing_advance;
|
||||||
#else
|
|
||||||
PHY_vars_UE_g[0][CC_id]->hw_timing_advance = 160;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
init_NR_UE_threads(1);
|
init_NR_UE_threads(1);
|
||||||
|
|||||||
@@ -236,13 +236,12 @@ void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f)
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int j2=0;
|
|
||||||
fp=f;
|
fp=f;
|
||||||
switch (Qm) {
|
switch (Qm) {
|
||||||
case 2:
|
case 2:
|
||||||
e0=e;
|
e0=e;
|
||||||
e1=e0+EQm;
|
e1=e0+EQm;
|
||||||
for (int j = 0; j< EQm; j++,j2+=2){
|
for (int j = 0, j2 = 0; j< EQm; j++,j2+=2){
|
||||||
fp=&f[j2];
|
fp=&f[j2];
|
||||||
fp[0] = e0[j];
|
fp[0] = e0[j];
|
||||||
fp[1] = e1[j];
|
fp[1] = e1[j];
|
||||||
@@ -253,7 +252,7 @@ void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f)
|
|||||||
e1=e0+EQm;
|
e1=e0+EQm;
|
||||||
e2=e1+EQm;
|
e2=e1+EQm;
|
||||||
e3=e2+EQm;
|
e3=e2+EQm;
|
||||||
for (int j = 0; j< EQm; j++,j2+=4){
|
for (int j = 0, j2 = 0; j< EQm; j++,j2+=4){
|
||||||
fp=&f[j2];
|
fp=&f[j2];
|
||||||
fp[0] = e0[j];
|
fp[0] = e0[j];
|
||||||
fp[1] = e1[j];
|
fp[1] = e1[j];
|
||||||
@@ -287,7 +286,7 @@ void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f)
|
|||||||
e5=e4+EQm;
|
e5=e4+EQm;
|
||||||
e6=e5+EQm;
|
e6=e5+EQm;
|
||||||
e7=e6+EQm;
|
e7=e6+EQm;
|
||||||
for (int j = 0; j< EQm; j++,j2+=8){
|
for (int j = 0, j2 = 0; j< EQm; j++,j2+=8){
|
||||||
fp=&f[j2];
|
fp=&f[j2];
|
||||||
fp[0] = e0[j];
|
fp[0] = e0[j];
|
||||||
fp[1] = e1[j];
|
fp[1] = e1[j];
|
||||||
@@ -310,15 +309,67 @@ void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f)
|
|||||||
void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f)
|
void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f)
|
||||||
{
|
{
|
||||||
|
|
||||||
uint32_t EQm;
|
int16_t *e1,*e2,*e3,*e4,*e5,*e6,*e7;
|
||||||
|
switch(Qm) {
|
||||||
EQm = E/Qm;
|
case 2:
|
||||||
|
e1=e+(E/2);
|
||||||
for (int j = 0; j< EQm; j++){
|
for (int j = 0,j2=0; j< E/2; j+=2,j2+=4){
|
||||||
for (int i = 0; i< Qm; i++){
|
e[j] = f[j2];
|
||||||
e[(i*EQm + j)] = f[(i+j*Qm)];
|
e1[j] = f[j2+1];
|
||||||
}
|
e[j+1] = f[j2+2];
|
||||||
|
e1[j+1] = f[j2+3];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
e1=e+(E/4);
|
||||||
|
e2=e1+(E/4);
|
||||||
|
e3=e2+(E/4);
|
||||||
|
for (int j = 0,j2=0; j< E/4; j++,j2+=4){
|
||||||
|
e[j] = f[j2];
|
||||||
|
e1[j] = f[j2+1];
|
||||||
|
e2[j] = f[j2+2];
|
||||||
|
e3[j] = f[j2+3];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
e1=e+(E/6);
|
||||||
|
e2=e1+(E/6);
|
||||||
|
e3=e2+(E/6);
|
||||||
|
e4=e3+(E/6);
|
||||||
|
e5=e4+(E/6);
|
||||||
|
for (int j = 0,j2=0; j< E/6; j++,j2+=6){
|
||||||
|
e[j] = f[j2];
|
||||||
|
e1[j] = f[j2+1];
|
||||||
|
e2[j] = f[j2+2];
|
||||||
|
e3[j] = f[j2+3];
|
||||||
|
e4[j] = f[j2+4];
|
||||||
|
e5[j] = f[j2+5];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
e1=e+(E/6);
|
||||||
|
e2=e1+(E/6);
|
||||||
|
e3=e2+(E/6);
|
||||||
|
e4=e3+(E/6);
|
||||||
|
e5=e4+(E/6);
|
||||||
|
e6=e5+(E/6);
|
||||||
|
e7=e6+(E/6);
|
||||||
|
for (int j = 0,j2=0; j< E/8; j++,j2+=8){
|
||||||
|
e[j] = f[j2];
|
||||||
|
e1[j] = f[j2+1];
|
||||||
|
e2[j] = f[j2+2];
|
||||||
|
e3[j] = f[j2+3];
|
||||||
|
e4[j] = f[j2+4];
|
||||||
|
e5[j] = f[j2+5];
|
||||||
|
e6[j] = f[j2+6];
|
||||||
|
e7[j] = f[j2+7];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(1==0,"Should not get here : Qm %d\n",Qm);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h"
|
#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h"
|
||||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||||
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
|
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
|
||||||
|
#include "openair1/PHY/MODULATION/nr_modulation.h"
|
||||||
/*#include "RadioResourceConfigCommonSIB.h"
|
/*#include "RadioResourceConfigCommonSIB.h"
|
||||||
#include "RadioResourceConfigDedicated.h"
|
#include "RadioResourceConfigDedicated.h"
|
||||||
#include "TDD-Config.h"
|
#include "TDD-Config.h"
|
||||||
@@ -200,6 +201,8 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
|
|||||||
common_vars->rxdataF[i] = (int32_t*)malloc16_clear(fp->samples_per_frame_wCP*sizeof(int32_t));
|
common_vars->rxdataF[i] = (int32_t*)malloc16_clear(fp->samples_per_frame_wCP*sizeof(int32_t));
|
||||||
common_vars->rxdata[i] = (int32_t*)malloc16_clear(fp->samples_per_frame*sizeof(int32_t));
|
common_vars->rxdata[i] = (int32_t*)malloc16_clear(fp->samples_per_frame*sizeof(int32_t));
|
||||||
}
|
}
|
||||||
|
common_vars->debugBuff = (int32_t*)malloc16_clear(fp->samples_per_frame*sizeof(int32_t)*100);
|
||||||
|
common_vars->debugBuff_sample_offset = 0;
|
||||||
|
|
||||||
|
|
||||||
// Channel estimates for SRS
|
// Channel estimates for SRS
|
||||||
@@ -248,10 +251,11 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
|
|||||||
pusch_vars[ULSCH_id]->ul_ch_estimates_ext = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_estimates_ext = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
||||||
|
pusch_vars[ULSCH_id]->ptrs_phase_per_slot = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_estimates_time = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_estimates_time = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->rxdataF_comp = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->rxdataF_comp = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_mag0 = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_mag0 = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_magb0 = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_magb0 = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_mag = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_mag = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_magb = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_magb = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->rho = (int32_t **)malloc16_clear(Prx*sizeof(int32_t*) );
|
pusch_vars[ULSCH_id]->rho = (int32_t **)malloc16_clear(Prx*sizeof(int32_t*) );
|
||||||
@@ -265,16 +269,18 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
|
|||||||
pusch_vars[ULSCH_id]->ul_ch_estimates_time[i] = (int32_t *)malloc16_clear( 2*sizeof(int32_t)*fp->ofdm_symbol_size );
|
pusch_vars[ULSCH_id]->ul_ch_estimates_time[i] = (int32_t *)malloc16_clear( 2*sizeof(int32_t)*fp->ofdm_symbol_size );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2*fp->symbols_per_slot ); // max intensity in freq is 1 sc every 2 RBs
|
pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2*fp->symbols_per_slot ); // max intensity in freq is 1 sc every 2 RBs
|
||||||
pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2*fp->symbols_per_slot );
|
pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2*fp->symbols_per_slot );
|
||||||
|
pusch_vars[ULSCH_id]->ptrs_phase_per_slot[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->symbols_per_slot); // symbols per slot
|
||||||
pusch_vars[ULSCH_id]->rxdataF_comp[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
|
pusch_vars[ULSCH_id]->rxdataF_comp[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_mag0[i] = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
|
pusch_vars[ULSCH_id]->ul_ch_mag0[i] = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_magb0[i] = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
|
pusch_vars[ULSCH_id]->ul_ch_magb0[i] = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_mag[i] = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
|
pusch_vars[ULSCH_id]->ul_ch_mag[i] = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_magb[i] = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
|
pusch_vars[ULSCH_id]->ul_ch_magb[i] = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
|
||||||
pusch_vars[ULSCH_id]->rho[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*(fp->N_RB_UL*12*7*2) );
|
pusch_vars[ULSCH_id]->rho[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*(fp->N_RB_UL*12*7*2) );
|
||||||
}
|
}
|
||||||
printf("ULSCH_id %d (before llr alloc) : %p\n",ULSCH_id,gNB->dlsch[0][0]->harq_processes[0]);
|
printf("ULSCH_id %d (before llr alloc) : %p\n",ULSCH_id,gNB->dlsch[0][0]->harq_processes[0]);
|
||||||
pusch_vars[ULSCH_id]->llr = (int16_t *)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); // [hna] 6144 is LTE and (8*((3*8*6144)+12)) is not clear
|
pusch_vars[ULSCH_id]->llr = (int16_t *)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); // [hna] 6144 is LTE and (8*((3*8*6144)+12)) is not clear
|
||||||
printf("ULSCH_id %d (after llr alloc) : %p\n",ULSCH_id,gNB->dlsch[0][0]->harq_processes[0]);
|
printf("ULSCH_id %d (after llr alloc) : %p\n",ULSCH_id,gNB->dlsch[0][0]->harq_processes[0]);
|
||||||
|
pusch_vars[ULSCH_id]->ul_valid_re_per_slot = (int16_t *)malloc16_clear( sizeof(int16_t)*fp->symbols_per_slot);
|
||||||
} //ulsch_id
|
} //ulsch_id
|
||||||
/*
|
/*
|
||||||
for (ulsch_id=0; ulsch_id<NUMBER_OF_UE_MAX; ulsch_id++)
|
for (ulsch_id=0; ulsch_id<NUMBER_OF_UE_MAX; ulsch_id++)
|
||||||
@@ -335,6 +341,7 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
|||||||
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_time[i]);
|
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_time[i]);
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates[i]);
|
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates[i]);
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext[i]);
|
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext[i]);
|
||||||
|
free_and_zero(pusch_vars[ULSCH_id]->ptrs_phase_per_slot[i]);
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_comp[i]);
|
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_comp[i]);
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_mag0[i]);
|
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_mag0[i]);
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb0[i]);
|
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb0[i]);
|
||||||
@@ -350,6 +357,8 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
|||||||
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates);
|
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates);
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext);
|
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext);
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_time);
|
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_time);
|
||||||
|
free_and_zero(pusch_vars[ULSCH_id]->ptrs_phase_per_slot);
|
||||||
|
free_and_zero(pusch_vars[ULSCH_id]->ul_valid_re_per_slot);
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_comp);
|
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_comp);
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_mag0);
|
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_mag0);
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb0);
|
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb0);
|
||||||
@@ -494,6 +503,9 @@ void nr_phy_config_request(NR_PHY_Config_t *phy_config) {
|
|||||||
compute_nr_prach_seq(short_sequence, num_sequences, rootSequenceIndex, RC.gNB[Mod_id]->X_u);
|
compute_nr_prach_seq(short_sequence, num_sequences, rootSequenceIndex, RC.gNB[Mod_id]->X_u);
|
||||||
|
|
||||||
RC.gNB[Mod_id]->configured = 1;
|
RC.gNB[Mod_id]->configured = 1;
|
||||||
|
|
||||||
|
init_symbol_rotation(fp,fp->dl_CarrierFreq);
|
||||||
|
|
||||||
LOG_I(PHY,"gNB %d configured\n",Mod_id);
|
LOG_I(PHY,"gNB %d configured\n",Mod_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -505,6 +517,15 @@ void init_nr_transport(PHY_VARS_gNB *gNB) {
|
|||||||
LOG_I(PHY, "Initialise nr transport\n");
|
LOG_I(PHY, "Initialise nr transport\n");
|
||||||
uint16_t grid_size = cfg->carrier_config.dl_grid_size[fp->numerology_index].value;
|
uint16_t grid_size = cfg->carrier_config.dl_grid_size[fp->numerology_index].value;
|
||||||
|
|
||||||
|
memset(gNB->num_pdsch_rnti, 0, sizeof(uint16_t)*80);
|
||||||
|
|
||||||
|
for (i=0; i <NUMBER_OF_NR_PDCCH_MAX; i++) {
|
||||||
|
LOG_I(PHY,"Initializing PDCCH list for PDCCH %d/%d\n",i,NUMBER_OF_NR_PDCCH_MAX);
|
||||||
|
gNB->pdcch_pdu[i].frame=-1;
|
||||||
|
LOG_I(PHY,"Initializing UL PDCCH list for UL PDCCH %d/%d\n",i,NUMBER_OF_NR_PDCCH_MAX);
|
||||||
|
gNB->ul_pdcch_pdu[i].frame=-1;
|
||||||
|
}
|
||||||
|
|
||||||
for (i=0; i<NUMBER_OF_NR_PUCCH_MAX; i++) {
|
for (i=0; i<NUMBER_OF_NR_PUCCH_MAX; i++) {
|
||||||
LOG_I(PHY,"Allocating Transport Channel Buffers for PUCCH %d/%d\n",i,NUMBER_OF_NR_PUCCH_MAX);
|
LOG_I(PHY,"Allocating Transport Channel Buffers for PUCCH %d/%d\n",i,NUMBER_OF_NR_PUCCH_MAX);
|
||||||
gNB->pucch[i] = new_gNB_pucch();
|
gNB->pucch[i] = new_gNB_pucch();
|
||||||
|
|||||||
@@ -643,10 +643,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
|
|||||||
// create shortcuts
|
// create shortcuts
|
||||||
NR_DL_FRAME_PARMS *const fp = &ue->frame_parms;
|
NR_DL_FRAME_PARMS *const fp = &ue->frame_parms;
|
||||||
NR_UE_COMMON *const common_vars = &ue->common_vars;
|
NR_UE_COMMON *const common_vars = &ue->common_vars;
|
||||||
NR_UE_PDSCH **const pdsch_vars_SI = ue->pdsch_vars_SI;
|
|
||||||
NR_UE_PDSCH **const pdsch_vars_ra = ue->pdsch_vars_ra;
|
|
||||||
NR_UE_PDSCH **const pdsch_vars_p = ue->pdsch_vars_p;
|
|
||||||
NR_UE_PDSCH **const pdsch_vars_mch = ue->pdsch_vars_MCH;
|
|
||||||
NR_UE_PBCH **const pbch_vars = ue->pbch_vars;
|
NR_UE_PBCH **const pbch_vars = ue->pbch_vars;
|
||||||
NR_UE_PRACH **const prach_vars = ue->prach_vars;
|
NR_UE_PRACH **const prach_vars = ue->prach_vars;
|
||||||
int i,j,k,l,slot,symb,q;
|
int i,j,k,l,slot,symb,q;
|
||||||
@@ -799,10 +795,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
|
|||||||
ue->pdcch_vars[th_id][eNB_id] = (NR_UE_PDCCH *)malloc16_clear(sizeof(NR_UE_PDCCH));
|
ue->pdcch_vars[th_id][eNB_id] = (NR_UE_PDCCH *)malloc16_clear(sizeof(NR_UE_PDCCH));
|
||||||
}
|
}
|
||||||
|
|
||||||
pdsch_vars_SI[eNB_id] = (NR_UE_PDSCH *)malloc16_clear(sizeof(NR_UE_PDSCH));
|
|
||||||
pdsch_vars_ra[eNB_id] = (NR_UE_PDSCH *)malloc16_clear(sizeof(NR_UE_PDSCH));
|
|
||||||
pdsch_vars_p[eNB_id] = (NR_UE_PDSCH *)malloc16_clear(sizeof(NR_UE_PDSCH));
|
|
||||||
pdsch_vars_mch[eNB_id] = (NR_UE_PDSCH *)malloc16_clear(sizeof(NR_UE_PDSCH));
|
|
||||||
prach_vars[eNB_id] = (NR_UE_PRACH *)malloc16_clear(sizeof(NR_UE_PRACH));
|
prach_vars[eNB_id] = (NR_UE_PRACH *)malloc16_clear(sizeof(NR_UE_PRACH));
|
||||||
pbch_vars[eNB_id] = (NR_UE_PBCH *)malloc16_clear(sizeof(NR_UE_PBCH));
|
pbch_vars[eNB_id] = (NR_UE_PBCH *)malloc16_clear(sizeof(NR_UE_PBCH));
|
||||||
|
|
||||||
@@ -864,11 +856,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
phy_init_nr_ue__PDSCH( pdsch_vars_SI[eNB_id], fp );
|
|
||||||
phy_init_nr_ue__PDSCH( pdsch_vars_ra[eNB_id], fp );
|
|
||||||
phy_init_nr_ue__PDSCH( pdsch_vars_p[eNB_id], fp );
|
|
||||||
phy_init_nr_ue__PDSCH( pdsch_vars_mch[eNB_id], fp );
|
|
||||||
|
|
||||||
// 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE
|
// 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
ue->pdcch_vars[th_id][eNB_id]->llr = (int16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
ue->pdcch_vars[th_id][eNB_id]->llr = (int16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
||||||
@@ -932,10 +919,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
|
|||||||
ue->pdsch_vars[th_id][eNB_id] = (NR_UE_PDSCH *)malloc16_clear( sizeof(NR_UE_PDSCH) );
|
ue->pdsch_vars[th_id][eNB_id] = (NR_UE_PDSCH *)malloc16_clear( sizeof(NR_UE_PDSCH) );
|
||||||
}
|
}
|
||||||
|
|
||||||
pdsch_vars_SI[eNB_id] = (NR_UE_PDSCH *)malloc16_clear( sizeof(NR_UE_PDSCH) );
|
|
||||||
pdsch_vars_ra[eNB_id] = (NR_UE_PDSCH *)malloc16_clear( sizeof(NR_UE_PDSCH) );
|
|
||||||
pdsch_vars_p[eNB_id] = (NR_UE_PDSCH *)malloc16_clear( sizeof(NR_UE_PDSCH) );
|
|
||||||
|
|
||||||
if (abstraction_flag == 0) {
|
if (abstraction_flag == 0) {
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
//phy_init_lte_ue__PDSCH( ue->pdsch_vars[th_id][eNB_id], fp );
|
//phy_init_lte_ue__PDSCH( ue->pdsch_vars[th_id][eNB_id], fp );
|
||||||
|
|||||||
@@ -500,3 +500,37 @@ void nr_dft(int32_t *z, int32_t *d, uint32_t Msc_PUSCH)
|
|||||||
z[i] = dft_out0[ip];
|
z[i] = dft_out0[ip];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void init_symbol_rotation(NR_DL_FRAME_PARMS *fp,uint64_t CarrierFreq) {
|
||||||
|
|
||||||
|
const int nsymb = fp->symbols_per_slot * fp->slots_per_frame/10;
|
||||||
|
const double Tc=(1/480e3/4096);
|
||||||
|
const double Nu=2048*64*.5;
|
||||||
|
const double f0= (double)CarrierFreq;
|
||||||
|
const double Ncp0=16*64 + (144*64*.5);
|
||||||
|
const double Ncp1=(144*64*.5);
|
||||||
|
double tl=0,poff,exp_re,exp_im;
|
||||||
|
double Ncp,Ncpm1=Ncp0;
|
||||||
|
|
||||||
|
poff = 2*M_PI*((Ncp0*Tc))*f0;
|
||||||
|
exp_re = cos(poff);
|
||||||
|
exp_im = sin(-poff);
|
||||||
|
fp->symbol_rotation[0]=(int16_t)floor(exp_re*32767);
|
||||||
|
fp->symbol_rotation[1]=(int16_t)floor(exp_im*32767);
|
||||||
|
LOG_I(PHY,"Doing symbol rotation calculation for gNB TX/RX, f0 %f Hz, Nsymb %d\n",f0,nsymb);
|
||||||
|
LOG_I(PHY,"Symbol rotation %d/%d => (%d,%d)\n",0,nsymb,fp->symbol_rotation[0],fp->symbol_rotation[1]);
|
||||||
|
for (int l=1;l<nsymb;l++) {
|
||||||
|
if (l==(7*(1<<fp->numerology_index))) Ncp=Ncp0;
|
||||||
|
else Ncp=Ncp1;
|
||||||
|
tl += (Nu+Ncpm1)*Tc;
|
||||||
|
poff = 2*M_PI*(tl + (Ncp*Tc))*f0;
|
||||||
|
exp_re = cos(poff);
|
||||||
|
exp_im = sin(-poff);
|
||||||
|
fp->symbol_rotation[l<<1]=(int16_t)floor(exp_re*32767);
|
||||||
|
fp->symbol_rotation[1+(l<<1)]=(int16_t)floor(exp_im*32767);
|
||||||
|
LOG_I(PHY,"Symbol rotation %d/%d => tl %f (%d,%d) (%f)\n",l,nsymb,tl,fp->symbol_rotation[l<<1],fp->symbol_rotation[1+(l<<1)],
|
||||||
|
(poff/2/M_PI)-floor(poff/2/M_PI));
|
||||||
|
Ncpm1=Ncp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -103,4 +103,13 @@ int nr_beam_precoding(int32_t **txdataF,
|
|||||||
int nb_antenna_ports
|
int nb_antenna_ports
|
||||||
);
|
);
|
||||||
|
|
||||||
|
void apply_nr_rotation(NR_DL_FRAME_PARMS *fp,
|
||||||
|
int16_t* txdata,
|
||||||
|
int slot,
|
||||||
|
int first_symbol,
|
||||||
|
int nsymb,
|
||||||
|
int length);
|
||||||
|
|
||||||
|
void init_symbol_rotation(NR_DL_FRAME_PARMS *fp,uint64_t CarrierFreq);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
This section deals with basic functions for OFDM Modulation.
|
This section deals with basic functions for OFDM Modulation.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "PHY/defs_eNB.h"
|
#include "PHY/defs_eNB.h"
|
||||||
@@ -47,6 +48,7 @@ void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRA
|
|||||||
PHY_ofdm_mod(txdataF, // input
|
PHY_ofdm_mod(txdataF, // input
|
||||||
txdata, // output
|
txdata, // output
|
||||||
frame_parms->ofdm_symbol_size,
|
frame_parms->ofdm_symbol_size,
|
||||||
|
|
||||||
1, // number of symbols
|
1, // number of symbols
|
||||||
frame_parms->nb_prefix_samples0, // number of prefix samples
|
frame_parms->nb_prefix_samples0, // number of prefix samples
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
@@ -191,7 +193,7 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
|
|||||||
/*for (j=0; j<fftsize ; j++) {
|
/*for (j=0; j<fftsize ; j++) {
|
||||||
output_ptr[j] = temp_ptr[j];
|
output_ptr[j] = temp_ptr[j];
|
||||||
}*/
|
}*/
|
||||||
memcpy((void*)output_ptr,(void*)temp_ptr,fftsize<<2);
|
memcpy1((void*)output_ptr,(void*)temp_ptr,fftsize<<2);
|
||||||
}
|
}
|
||||||
|
|
||||||
j=fftsize;
|
j=fftsize;
|
||||||
@@ -306,60 +308,23 @@ void do_OFDM_mod(int32_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t ne
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
void apply_nr_rotation(NR_DL_FRAME_PARMS *fp,
|
||||||
// OFDM modulation for each symbol
|
int16_t* trxdata,
|
||||||
void do_OFDM_mod_symbol(LTE_eNB_COMMON *eNB_common_vars, RU_COMMON *common, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms,int do_precoding)
|
int slot,
|
||||||
{
|
int first_symbol,
|
||||||
|
int nsymb,
|
||||||
|
int length) {
|
||||||
|
int symb_offset = (slot%fp->slots_per_subframe)*fp->symbols_per_slot;
|
||||||
|
|
||||||
int aa, l, slot_offset, slot_offsetF;
|
for (int sidx=0;sidx<nsymb;sidx++) {
|
||||||
int32_t **txdataF = eNB_common_vars->txdataF;
|
LOG_D(PHY,"Rotating symbol %d, slot %d, symbol_subframe_index %d, length %d (%d,%d)\n",
|
||||||
int32_t **txdataF_BF = common->txdataF_BF;
|
first_symbol+sidx,slot,sidx+first_symbol+symb_offset,length,
|
||||||
int32_t **txdata = common->txdata;
|
fp->symbol_rotation[2*(sidx+first_symbol+symb_offset)],fp->symbol_rotation[1+2*(sidx+first_symbol+symb_offset)]);
|
||||||
|
rotate_cpx_vector(trxdata+(sidx*length*2),
|
||||||
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
|
&fp->symbol_rotation[2*(sidx+first_symbol+symb_offset)],
|
||||||
slot_offsetF = (next_slot)*(frame_parms->ofdm_symbol_size)*((frame_parms->Ncp==EXTENDED) ? 6 : 7);
|
trxdata+(sidx*length*2),
|
||||||
//printf("Thread %d starting ... aa %d (%llu)\n",omp_get_thread_num(),aa,rdtsc());
|
length,
|
||||||
for (l=0; l<frame_parms->symbols_per_tti>>1; l++) {
|
15);
|
||||||
|
|
||||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
|
||||||
|
|
||||||
//printf("do_OFDM_mod_l, slot=%d, l=%d, NUMBER_OF_OFDM_CARRIERS=%d,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES=%d\n",next_slot, l,NUMBER_OF_OFDM_CARRIERS,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES);
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_BEAM_PRECODING,1);
|
|
||||||
if (do_precoding==1) beam_precoding(txdataF,txdataF_BF,frame_parms,eNB_common_vars->beam_weights,next_slot,l,aa);
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_BEAM_PRECODING,0);
|
|
||||||
|
|
||||||
//PMCH case not implemented...
|
|
||||||
|
|
||||||
if (frame_parms->Ncp == EXTENDED)
|
|
||||||
PHY_ofdm_mod((do_precoding == 1)?txdataF_BF[aa]:&txdataF[aa][slot_offsetF+l*frame_parms->ofdm_symbol_size], // input
|
|
||||||
&txdata[aa][slot_offset+l*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES], // output
|
|
||||||
frame_parms->ofdm_symbol_size,
|
|
||||||
1, // number of symbols
|
|
||||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
|
||||||
CYCLIC_PREFIX);
|
|
||||||
else {
|
|
||||||
if (l==0) {
|
|
||||||
PHY_ofdm_mod((do_precoding==1)?txdataF_BF[aa]:&txdataF[aa][slot_offsetF+l*frame_parms->ofdm_symbol_size], // input
|
|
||||||
&txdata[aa][slot_offset], // output
|
|
||||||
frame_parms->ofdm_symbol_size,
|
|
||||||
1, // number of symbols
|
|
||||||
frame_parms->nb_prefix_samples0, // number of prefix samples
|
|
||||||
CYCLIC_PREFIX);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
PHY_ofdm_mod((do_precoding==1)?txdataF_BF[aa]:&txdataF[aa][slot_offsetF+l*frame_parms->ofdm_symbol_size], // input
|
|
||||||
&txdata[aa][slot_offset+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0+(l-1)*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES], // output
|
|
||||||
frame_parms->ofdm_symbol_size,
|
|
||||||
1, // number of symbols
|
|
||||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
|
||||||
CYCLIC_PREFIX);
|
|
||||||
|
|
||||||
//printf("txdata[%d][%d]=%d\n",aa,slot_offset+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0+(l-1)*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES,txdata[aa][slot_offset+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0+(l-1)*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES]);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|||||||
@@ -133,8 +133,8 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
#ifdef DEBUG_FEP
|
#ifdef DEBUG_FEP
|
||||||
// if (ue->frame <100)
|
// if (ue->frame <100)
|
||||||
/*LOG_I(PHY,*/printf("slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %u, nb_prefix_samples0 %u, slot_offset %u, sample_offset %d,rx_offset %u, frame_length_samples %u\n",
|
/*LOG_I(PHY,*/printf("slot_fep: slot %d, symbol %d, nb_prefix_samples %u, nb_prefix_samples0 %u, slot_offset %u, sample_offset %d,rx_offset %u, frame_length_samples %u\n",
|
||||||
ue->proc.proc_rxtx[(Ns)&1].frame_rx, Ns, symbol, nb_prefix_samples, nb_prefix_samples0, slot_offset, sample_offset, rx_offset, frame_length_samples);
|
Ns, symbol, nb_prefix_samples, nb_prefix_samples0, slot_offset, sample_offset, rx_offset, frame_length_samples);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
abs_symbol = Ns * frame_parms->symbols_per_slot + symbol;
|
abs_symbol = Ns * frame_parms->symbols_per_slot + symbol;
|
||||||
@@ -198,12 +198,22 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_FEP
|
#ifdef DEBUG_FEP
|
||||||
// if (ue->frame <100)
|
// if (ue->frame <100)
|
||||||
printf("slot_fep: frame %d: symbol %d rx_offset %u\n", ue->proc.proc_rxtx[(Ns)&1].frame_rx, symbol, rx_offset);
|
printf("slot_fep: symbol %d rx_offset %u\n", symbol, rx_offset);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
|
||||||
|
int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation)[symbol+symb_offset];
|
||||||
|
((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
|
||||||
|
rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
|
||||||
|
(int16_t*)&rot2,
|
||||||
|
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
|
||||||
|
frame_parms->ofdm_symbol_size,
|
||||||
|
15);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG_FEP
|
#ifdef DEBUG_FEP
|
||||||
printf("slot_fep: done\n");
|
printf("slot_fep: done\n");
|
||||||
@@ -308,8 +318,8 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
#ifdef DEBUG_FEP
|
#ifdef DEBUG_FEP
|
||||||
// if (ue->frame <100)
|
// if (ue->frame <100)
|
||||||
/*LOG_I(PHY,*/printf("slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %u, nb_prefix_samples0 %u, slot_offset %u, sample_offset %d,rx_offset %u, frame_length_samples %u\n",
|
/*LOG_I(PHY,*/printf("slot_fep: slot %d, symbol %d, nb_prefix_samples %u, nb_prefix_samples0 %u, slot_offset %u, sample_offset %d,rx_offset %u, frame_length_samples %u\n",
|
||||||
ue->proc.proc_rxtx[(Ns)&1].frame_rx, Ns, symbol, nb_prefix_samples, nb_prefix_samples0, slot_offset, sample_offset, rx_offset, frame_length_samples);
|
Ns, symbol, nb_prefix_samples, nb_prefix_samples0, slot_offset, sample_offset, rx_offset, frame_length_samples);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
abs_symbol = Ns * frame_parms->symbols_per_slot + symbol;
|
abs_symbol = Ns * frame_parms->symbols_per_slot + symbol;
|
||||||
@@ -373,10 +383,22 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_FEP
|
int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
|
||||||
// if (ue->frame <100)
|
int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation)[symbol+symb_offset];
|
||||||
printf("slot_fep: frame %d: symbol %d rx_offset %u\n", ue->proc.proc_rxtx[(Ns)&1].frame_rx, symbol, rx_offset);
|
((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
|
||||||
#endif
|
|
||||||
|
#ifdef DEBUG_FEP
|
||||||
|
// if (ue->frame <100)
|
||||||
|
printf("slot_fep: slot %d, symbol %d rx_offset %u, rotation symbol %d %d.%d\n", Ns,symbol, rx_offset,
|
||||||
|
symbol+symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
|
||||||
|
(int16_t*)&rot2,
|
||||||
|
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
|
||||||
|
frame_parms->ofdm_symbol_size,
|
||||||
|
15);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -450,11 +472,11 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
rxdata_offset = slot_offset + nb_prefix_samples0 + (symbol * (frame_parms->ofdm_symbol_size + nb_prefix_samples)) - SOFFSET;
|
rxdata_offset = slot_offset + nb_prefix_samples0 + (symbol * (frame_parms->ofdm_symbol_size + nb_prefix_samples)) - SOFFSET;
|
||||||
|
|
||||||
if(sample_offset>rxdata_offset) {
|
if(sample_offset>rxdata_offset) {
|
||||||
memcpy((void *)tmp_dft_in,
|
memcpy1((void *)tmp_dft_in,
|
||||||
(void *) &rxdata[frame_parms->samples_per_frame-sample_offset+rxdata_offset],
|
(void *) &rxdata[frame_parms->samples_per_frame-sample_offset+rxdata_offset],
|
||||||
(sample_offset-rxdata_offset)*sizeof(int));
|
(sample_offset-rxdata_offset)*sizeof(int));
|
||||||
|
|
||||||
memcpy((void *)&tmp_dft_in[sample_offset-rxdata_offset],
|
memcpy1((void *)&tmp_dft_in[sample_offset-rxdata_offset],
|
||||||
(void *) &rxdata[0],
|
(void *) &rxdata[0],
|
||||||
(frame_parms->ofdm_symbol_size-sample_offset+rxdata_offset)*sizeof(int));
|
(frame_parms->ofdm_symbol_size-sample_offset+rxdata_offset)*sizeof(int));
|
||||||
|
|
||||||
@@ -468,5 +490,14 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
// clear DC carrier from OFDM symbols
|
// clear DC carrier from OFDM symbols
|
||||||
rxdataF[symbol * frame_parms->ofdm_symbol_size] = 0;
|
rxdataF[symbol * frame_parms->ofdm_symbol_size] = 0;
|
||||||
|
|
||||||
|
int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
|
||||||
|
uint32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation)[symbol+symb_offset];
|
||||||
|
((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
|
||||||
|
LOG_D(PHY,"slot %d, symb_offset %d rotating by %d.%d\n",Ns,symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]);
|
||||||
|
rotate_cpx_vector((int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol],
|
||||||
|
(int16_t*)&rot2,
|
||||||
|
(int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol],
|
||||||
|
frame_parms->ofdm_symbol_size,
|
||||||
|
15);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|||||||
+35
-1
@@ -19,7 +19,7 @@
|
|||||||
* contact@openairinterface.org
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*! \file PHY/NR_ESTIMATION/nr_adjust_sync_gNB.c
|
/*! \file PHY/NR_ESTIMATION/nr_measurements_gNB.c
|
||||||
* \brief TA estimation for TA updates
|
* \brief TA estimation for TA updates
|
||||||
* \author Ahmed Hussein
|
* \author Ahmed Hussein
|
||||||
* \date 2019
|
* \date 2019
|
||||||
@@ -69,3 +69,37 @@ int nr_est_timing_advance_pusch(PHY_VARS_gNB* gNB, int UE_id)
|
|||||||
return max_pos - sync_pos;
|
return max_pos - sync_pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void gNB_I0_measurements(PHY_VARS_gNB *gNB) {
|
||||||
|
|
||||||
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
|
NR_gNB_COMMON *common_vars = &gNB->common_vars;
|
||||||
|
PHY_MEASUREMENTS_gNB *measurements = &gNB->measurements;
|
||||||
|
uint32_t *rb_mask = gNB->rb_mask_ul;
|
||||||
|
int symbol = gNB->ulmask_symb;
|
||||||
|
int rb, offset, nb_rb;
|
||||||
|
uint32_t n0_power_tot, n0_subband_power_temp=0;
|
||||||
|
int32_t *ul_ch;
|
||||||
|
|
||||||
|
if (symbol>-1) {
|
||||||
|
n0_power_tot = 0;
|
||||||
|
for (int aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||||
|
nb_rb = 0;
|
||||||
|
for (rb=0; rb<frame_parms->N_RB_UL; rb++) {
|
||||||
|
if ((rb_mask[rb>>5]&(1<<(rb&31))) == 0) { // check that rb was not used in this subframe
|
||||||
|
nb_rb++;
|
||||||
|
offset = (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size;
|
||||||
|
offset += (symbol*frame_parms->ofdm_symbol_size);
|
||||||
|
ul_ch = &common_vars->rxdataF[aarx][offset];
|
||||||
|
//TODO what about DC?
|
||||||
|
n0_subband_power_temp += signal_energy_nodc(ul_ch,12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
measurements->n0_power[aarx] = n0_subband_power_temp/nb_rb;
|
||||||
|
measurements->n0_power_dB[aarx] = dB_fixed(measurements->n0_power[aarx]);
|
||||||
|
n0_power_tot += measurements->n0_power[aarx];
|
||||||
|
}
|
||||||
|
measurements->n0_power_tot_dB = dB_fixed(n0_power_tot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -25,15 +25,20 @@
|
|||||||
#include "nr_ul_estimation.h"
|
#include "nr_ul_estimation.h"
|
||||||
#include "PHY/sse_intrin.h"
|
#include "PHY/sse_intrin.h"
|
||||||
#include "PHY/NR_REFSIG/nr_refsig.h"
|
#include "PHY/NR_REFSIG/nr_refsig.h"
|
||||||
|
#include "PHY/NR_REFSIG/ptrs_nr.h"
|
||||||
|
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||||
#include "PHY/NR_UE_ESTIMATION/filt16a_32.h"
|
#include "PHY/NR_UE_ESTIMATION/filt16a_32.h"
|
||||||
|
|
||||||
//#define DEBUG_CH
|
//#define DEBUG_CH
|
||||||
//#define DEBUG_PUSCH
|
//#define DEBUG_PUSCH
|
||||||
|
|
||||||
|
#define dBc(x,y) (dB_fixed(((int32_t)(x))*(x) + ((int32_t)(y))*(y)))
|
||||||
|
|
||||||
int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||||
unsigned char Ns,
|
unsigned char Ns,
|
||||||
unsigned short p,
|
unsigned short p,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
|
int ul_id,
|
||||||
unsigned short bwp_start_subcarrier,
|
unsigned short bwp_start_subcarrier,
|
||||||
nfapi_nr_pusch_pdu_t *pusch_pdu) {
|
nfapi_nr_pusch_pdu_t *pusch_pdu) {
|
||||||
|
|
||||||
@@ -43,8 +48,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
unsigned int pilot_cnt,re_cnt;
|
unsigned int pilot_cnt,re_cnt;
|
||||||
int16_t ch[2],ch_r[2],ch_l[2],*pil,*rxF,*ul_ch;
|
int16_t ch[2],ch_r[2],ch_l[2],*pil,*rxF,*ul_ch;
|
||||||
int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh;
|
int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh;
|
||||||
int ch_offset,symbol_offset, UE_id = 0;
|
int ch_offset,symbol_offset ;
|
||||||
int32_t **ul_ch_estimates_time = gNB->pusch_vars[UE_id]->ul_ch_estimates_time;
|
int32_t **ul_ch_estimates_time = gNB->pusch_vars[ul_id]->ul_ch_estimates_time;
|
||||||
__m128i *ul_ch_128;
|
__m128i *ul_ch_128;
|
||||||
|
|
||||||
#ifdef DEBUG_CH
|
#ifdef DEBUG_CH
|
||||||
@@ -55,7 +60,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
//uint16_t Nid_cell = (eNB_offset == 0) ? gNB->frame_parms.Nid_cell : gNB->measurements.adj_cell_id[eNB_offset-1];
|
//uint16_t Nid_cell = (eNB_offset == 0) ? gNB->frame_parms.Nid_cell : gNB->measurements.adj_cell_id[eNB_offset-1];
|
||||||
|
|
||||||
uint8_t nushift;
|
uint8_t nushift;
|
||||||
int **ul_ch_estimates = gNB->pusch_vars[UE_id]->ul_ch_estimates;
|
int **ul_ch_estimates = gNB->pusch_vars[ul_id]->ul_ch_estimates;
|
||||||
int **rxdataF = gNB->common_vars.rxdataF;
|
int **rxdataF = gNB->common_vars.rxdataF;
|
||||||
|
|
||||||
nushift = (p>>1)&1;
|
nushift = (p>>1)&1;
|
||||||
@@ -122,7 +127,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], 1000, 0, nb_rb_pusch, 0, pusch_pdu->dmrs_config_type);
|
nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], 1000, 0, nb_rb_pusch, 0, pusch_pdu->dmrs_config_type);
|
||||||
|
|
||||||
//------------------------------------------------//
|
//------------------------------------------------//
|
||||||
|
#ifdef DEBUG_PUSCH
|
||||||
|
for (int i=0;i<(6*nb_rb_pusch);i++)
|
||||||
|
printf("%d+j*(%d)\n",((int16_t*)pilot)[2*i],((int16_t*)pilot)[1+(2*i)]);
|
||||||
|
#endif
|
||||||
for (aarx=0; aarx<gNB->frame_parms.nb_antennas_rx; aarx++) {
|
for (aarx=0; aarx<gNB->frame_parms.nb_antennas_rx; aarx++) {
|
||||||
|
|
||||||
pil = (int16_t *)&pilot[0];
|
pil = (int16_t *)&pilot[0];
|
||||||
@@ -134,7 +142,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
printf("symbol_offset %d, nushift %d\n",symbol_offset,nushift);
|
printf("symbol_offset %d, nushift %d\n",symbol_offset,nushift);
|
||||||
printf("ch est pilot addr %p RB_DL %d\n",&pilot[0], gNB->frame_parms.N_RB_UL);
|
printf("ch est pilot addr %p RB_DL %d\n",&pilot[0], gNB->frame_parms.N_RB_UL);
|
||||||
printf("bwp_start_subcarrier %d, k %d, first_carrier %d\n",bwp_start_subcarrier,k,gNB->frame_parms.first_carrier_offset);
|
printf("bwp_start_subcarrier %d, k %d, first_carrier %d, nb_rb_pusch %d\n",bwp_start_subcarrier,k,gNB->frame_parms.first_carrier_offset,nb_rb_pusch);
|
||||||
printf("rxF addr %p p %d\n", rxF,p);
|
printf("rxF addr %p p %d\n", rxF,p);
|
||||||
printf("ul_ch addr %p nushift %d\n",ul_ch,nushift);
|
printf("ul_ch addr %p nushift %d\n",ul_ch,nushift);
|
||||||
#endif
|
#endif
|
||||||
@@ -148,8 +156,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
|
printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
|
||||||
printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
|
printf("pilot 0 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
|
||||||
printf("data 0 : rxF - > (%d,%d)\n",rxF[2],rxF[3]);
|
printf("data 0 : rxF - > (%d,%d) (%d)\n",rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
multadd_real_vector_complex_scalar(fl,
|
multadd_real_vector_complex_scalar(fl,
|
||||||
@@ -166,8 +174,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
|
printf("pilot 1 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
|
||||||
printf("data 1 : rxF - > (%d,%d)\n",rxF[2],rxF[3]);
|
printf("data 1 : rxF - > (%d,%d) (%d)\n",rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
|
||||||
#endif
|
#endif
|
||||||
multadd_real_vector_complex_scalar(fml,
|
multadd_real_vector_complex_scalar(fml,
|
||||||
ch,
|
ch,
|
||||||
@@ -182,8 +190,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
printf("pilot 2 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
|
printf("pilot 2 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
|
||||||
printf("data 2 : rxF - > (%d,%d)\n",rxF[2],rxF[3]);
|
printf("data 2 : rxF - > (%d,%d) (%d)\n",rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
|
||||||
#endif
|
#endif
|
||||||
multadd_real_vector_complex_scalar(fmm,
|
multadd_real_vector_complex_scalar(fmm,
|
||||||
ch,
|
ch,
|
||||||
@@ -204,8 +212,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
|
printf("pilot %u : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
|
||||||
printf("data %u : rxF - > (%d,%d)\n",pilot_cnt,rxF[2],rxF[3]);
|
printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt,rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
|
||||||
#endif
|
#endif
|
||||||
multadd_real_vector_complex_scalar(fml,
|
multadd_real_vector_complex_scalar(fml,
|
||||||
ch,
|
ch,
|
||||||
@@ -220,8 +228,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
|
printf("pilot %u : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
|
||||||
printf("data %u : rxF - > (%d,%d)\n",pilot_cnt+1,rxF[2],rxF[3]);
|
printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt+1,rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
|
||||||
#endif
|
#endif
|
||||||
multadd_real_vector_complex_scalar(fmm,
|
multadd_real_vector_complex_scalar(fmm,
|
||||||
ch,
|
ch,
|
||||||
@@ -242,8 +250,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
|
printf("pilot %u : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
|
||||||
printf("data %u : rxF - > (%d,%d)\n",pilot_cnt,rxF[2],rxF[3]);
|
printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt,rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
|
||||||
#endif
|
#endif
|
||||||
multadd_real_vector_complex_scalar(fm,
|
multadd_real_vector_complex_scalar(fm,
|
||||||
ch,
|
ch,
|
||||||
@@ -261,8 +269,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
|
printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
|
||||||
printf("pilot %u: rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
|
printf("pilot %u : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
|
||||||
printf("data %u : rxF - > (%d,%d)\n",pilot_cnt+1,rxF[2],rxF[3]);
|
printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt+1,rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
|
||||||
#endif
|
#endif
|
||||||
multadd_real_vector_complex_scalar(fmr,
|
multadd_real_vector_complex_scalar(fmr,
|
||||||
ch,
|
ch,
|
||||||
@@ -277,8 +285,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
printf("pilot %u: rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
|
printf("pilot %u: rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
|
||||||
printf("data %u : rxF - > (%d,%d)\n",pilot_cnt+2,rxF[2],rxF[3]);
|
printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt+2,rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
|
||||||
#endif
|
#endif
|
||||||
multadd_real_vector_complex_scalar(fr,
|
multadd_real_vector_complex_scalar(fr,
|
||||||
ch,
|
ch,
|
||||||
@@ -338,7 +346,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
8);
|
8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef DEBUG_PDSCH
|
#ifdef DEBUG_PUSCH
|
||||||
ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset];
|
ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset];
|
||||||
for(uint16_t idxP=0; idxP<ceil((float)nb_rb_pusch*12/8); idxP++) {
|
for(uint16_t idxP=0; idxP<ceil((float)nb_rb_pusch*12/8); idxP++) {
|
||||||
for(uint8_t idxI=0; idxI<16; idxI+=2) {
|
for(uint8_t idxI=0; idxI<16; idxI+=2) {
|
||||||
@@ -501,3 +509,408 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
*
|
||||||
|
* NAME : nr_pusch_ptrs_processing
|
||||||
|
*
|
||||||
|
* PARAMETERS : gNB : gNB data structure
|
||||||
|
* rel15_ul : UL parameters
|
||||||
|
* UE_id : UE ID
|
||||||
|
* nr_tti_rx : slot rx TTI
|
||||||
|
* dmrs_symbol_flag: DMRS Symbol Flag
|
||||||
|
* symbol : OFDM Symbol
|
||||||
|
* nb_re_pusch : PUSCH RE's
|
||||||
|
* nb_re_pusch : PUSCH RE's
|
||||||
|
*
|
||||||
|
* RETURN : nothing
|
||||||
|
*
|
||||||
|
* DESCRIPTION :
|
||||||
|
* If ptrs is enabled process the symbol accordingly
|
||||||
|
* 1) Estimate phase noise per PTRS symbol
|
||||||
|
* 2) Interpolate PTRS estimated value in TD after all PTRS symbols
|
||||||
|
* 3) Compensated DMRS based estimated signal with PTRS estimation for slot
|
||||||
|
*********************************************************************/
|
||||||
|
void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
||||||
|
nfapi_nr_pusch_pdu_t *rel15_ul,
|
||||||
|
uint8_t ulsch_id,
|
||||||
|
uint8_t nr_tti_rx,
|
||||||
|
uint8_t dmrs_symbol_flag,
|
||||||
|
unsigned char symbol,
|
||||||
|
uint32_t nb_re_pusch)
|
||||||
|
{
|
||||||
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
|
int16_t *phase_per_symbol;
|
||||||
|
|
||||||
|
uint8_t L_ptrs = 0;
|
||||||
|
uint8_t right_side_ref = 0;
|
||||||
|
uint8_t left_side_ref = 0;
|
||||||
|
uint8_t nb_dmrs_in_slot = 0;
|
||||||
|
|
||||||
|
//#define DEBUG_UL_PTRS 1
|
||||||
|
/* First symbol calculate PTRS symbol index for slot & set the variables */
|
||||||
|
if(symbol == rel15_ul->start_symbol_index)
|
||||||
|
{
|
||||||
|
gNB->pusch_vars[ulsch_id]->ptrs_symbols = 0;
|
||||||
|
L_ptrs = 1<<(rel15_ul->pusch_ptrs.ptrs_time_density);
|
||||||
|
set_ptrs_symb_idx(&gNB->pusch_vars[ulsch_id]->ptrs_symbols,
|
||||||
|
rel15_ul->nr_of_symbols,
|
||||||
|
rel15_ul->start_symbol_index,
|
||||||
|
L_ptrs,
|
||||||
|
rel15_ul->ul_dmrs_symb_pos);
|
||||||
|
}/* First symbol check */
|
||||||
|
|
||||||
|
/* loop over antennas */
|
||||||
|
for (int aarx=0; aarx< frame_parms->nb_antennas_rx; aarx++)
|
||||||
|
{
|
||||||
|
phase_per_symbol = (int16_t*)gNB->pusch_vars[ulsch_id]->ptrs_phase_per_slot[aarx];
|
||||||
|
/* set the previous estimations to zero at first symbol */
|
||||||
|
if(symbol == rel15_ul->start_symbol_index)
|
||||||
|
{
|
||||||
|
memset(phase_per_symbol,0,sizeof(int32_t)*frame_parms->symbols_per_slot);
|
||||||
|
}
|
||||||
|
/* if not PTRS symbol set current ptrs symbol index to zero*/
|
||||||
|
gNB->pusch_vars[ulsch_id]->ptrs_symbol_index = 0;
|
||||||
|
gNB->pusch_vars[ulsch_id]->ptrs_sc_per_ofdm_symbol = 0;
|
||||||
|
/* Check if current symbol contains PTRS */
|
||||||
|
if(is_ptrs_symbol(symbol, gNB->pusch_vars[ulsch_id]->ptrs_symbols))
|
||||||
|
{
|
||||||
|
gNB->pusch_vars[ulsch_id]->ptrs_symbol_index = symbol;
|
||||||
|
/*------------------------------------------------------------------------------------------------------- */
|
||||||
|
/* 1) Estimate phase noise per PTRS symbol */
|
||||||
|
/*------------------------------------------------------------------------------------------------------- */
|
||||||
|
nr_pusch_phase_estimation(frame_parms,
|
||||||
|
rel15_ul,
|
||||||
|
(int16_t *)&gNB->pusch_vars[ulsch_id]->ul_ch_ptrs_estimates_ext[aarx][symbol*nb_re_pusch],
|
||||||
|
nr_tti_rx,
|
||||||
|
symbol,
|
||||||
|
(int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(symbol * nb_re_pusch)],
|
||||||
|
gNB->nr_gold_pusch_dmrs[rel15_ul->scid],
|
||||||
|
&phase_per_symbol[2* symbol],
|
||||||
|
&gNB->pusch_vars[ulsch_id]->ptrs_sc_per_ofdm_symbol);
|
||||||
|
}
|
||||||
|
/* DMRS Symbol channel estimates extraction */
|
||||||
|
else if(dmrs_symbol_flag)
|
||||||
|
{
|
||||||
|
phase_per_symbol[2* symbol]= (int16_t)((1<<15)-1); // 32767
|
||||||
|
phase_per_symbol[2* symbol +1]= 0;// no angle
|
||||||
|
}
|
||||||
|
/* For last OFDM symbol at each antenna perform interpolation and compensation for the slot*/
|
||||||
|
if(symbol == (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols -1))
|
||||||
|
{
|
||||||
|
nb_dmrs_in_slot = get_dmrs_symbols_in_slot(rel15_ul->ul_dmrs_symb_pos,(rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols));
|
||||||
|
for(uint8_t dmrs_sym = 0; dmrs_sym < nb_dmrs_in_slot; dmrs_sym ++)
|
||||||
|
{
|
||||||
|
if(dmrs_sym == 0)
|
||||||
|
{
|
||||||
|
/* get first DMRS position */
|
||||||
|
left_side_ref = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos, rel15_ul->start_symbol_index, (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols));
|
||||||
|
/* get first DMRS position is not at start symbol position then we need to extrapolate left side */
|
||||||
|
if(left_side_ref > rel15_ul->start_symbol_index)
|
||||||
|
{
|
||||||
|
left_side_ref = rel15_ul->start_symbol_index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* get the next symbol from left_side_ref value */
|
||||||
|
right_side_ref = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos, left_side_ref+1, (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols));
|
||||||
|
/* if no symbol found then interpolate till end of slot*/
|
||||||
|
if(right_side_ref == 0)
|
||||||
|
{
|
||||||
|
right_side_ref = (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols);
|
||||||
|
}
|
||||||
|
/*------------------------------------------------------------------------------------------------------- */
|
||||||
|
/* 2) Interpolate PTRS estimated value in TD */
|
||||||
|
/*------------------------------------------------------------------------------------------------------- */
|
||||||
|
nr_pusch_phase_interpolation(phase_per_symbol,left_side_ref,right_side_ref);
|
||||||
|
/* set left to last dmrs */
|
||||||
|
left_side_ref = right_side_ref;
|
||||||
|
} /*loop over dmrs positions */
|
||||||
|
|
||||||
|
#ifdef DEBUG_UL_PTRS
|
||||||
|
LOG_M("ptrsEst.m","est",gNB->pusch_vars[ulsch_id]->ptrs_phase_per_slot[aarx],frame_parms->symbols_per_slot,1,1 );
|
||||||
|
LOG_M("rxdataF_bf_ptrs_comp.m","bf_ptrs_cmp",
|
||||||
|
&gNB->pusch_vars[0]->rxdataF_comp[aarx][rel15_ul->start_symbol_index * NR_NB_SC_PER_RB * rel15_ul->rb_size],
|
||||||
|
rel15_ul->nr_of_symbols * NR_NB_SC_PER_RB * rel15_ul->rb_size,1,1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------------------------------- */
|
||||||
|
/* 3) Compensated DMRS based estimated signal with PTRS estimation */
|
||||||
|
/*--------------------------------------------------------------------------------------------------------*/
|
||||||
|
for(uint8_t i =rel15_ul->start_symbol_index; i< (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols);i++)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_UL_PTRS
|
||||||
|
printf("PTRS: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[2* i],phase_per_symbol[(2* i) +1]);
|
||||||
|
#endif
|
||||||
|
rotate_cpx_vector((int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(i * rel15_ul->rb_size * NR_NB_SC_PER_RB)],
|
||||||
|
&phase_per_symbol[2* i],
|
||||||
|
(int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(i * rel15_ul->rb_size * NR_NB_SC_PER_RB)],
|
||||||
|
(rel15_ul->rb_size * NR_NB_SC_PER_RB),
|
||||||
|
15);
|
||||||
|
}// symbol loop
|
||||||
|
}//interpolation and compensation
|
||||||
|
}// Antenna loop
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
*
|
||||||
|
* NAME : nr_pusch_phase_estimation
|
||||||
|
*
|
||||||
|
* PARAMETERS : frame_parms : UL frame parameters
|
||||||
|
* rel15_ul : UL PDU Structure
|
||||||
|
* Ns :
|
||||||
|
* Symbol : OFDM symbol index
|
||||||
|
* rxF : Channel compensated signal
|
||||||
|
* ptrs_gold_seq: Gold sequence for PTRS regeneration
|
||||||
|
* error_est : Estimated error output vector [Re Im]
|
||||||
|
* RETURN : nothing
|
||||||
|
*
|
||||||
|
* DESCRIPTION :
|
||||||
|
* perform phase estimation from regenerated PTRS SC and channel compensated
|
||||||
|
* signal
|
||||||
|
*********************************************************************/
|
||||||
|
void nr_pusch_phase_estimation(NR_DL_FRAME_PARMS *frame_parms,
|
||||||
|
nfapi_nr_pusch_pdu_t *rel15_ul,
|
||||||
|
int16_t *ptrs_ch_p,
|
||||||
|
unsigned char Ns,
|
||||||
|
unsigned char symbol,
|
||||||
|
int16_t *rxF_comp,
|
||||||
|
uint32_t ***ptrs_gold_seq,
|
||||||
|
int16_t *error_est,
|
||||||
|
uint16_t *ptrs_sc)
|
||||||
|
{
|
||||||
|
uint8_t is_ptrs_re = 0;
|
||||||
|
uint16_t re_cnt = 0;
|
||||||
|
uint16_t cnt = 0;
|
||||||
|
unsigned short nb_re_pusch = NR_NB_SC_PER_RB * rel15_ul->rb_size;
|
||||||
|
uint8_t K_ptrs = rel15_ul->pusch_ptrs.ptrs_freq_density;
|
||||||
|
uint16_t sc_per_symbol = (rel15_ul->rb_size + K_ptrs - 1)/K_ptrs;
|
||||||
|
int16_t *ptrs_p = (int16_t *)malloc(sizeof(int32_t)*(sc_per_symbol));
|
||||||
|
int16_t *dmrs_comp_p = (int16_t *)malloc(sizeof(int32_t)*(sc_per_symbol));
|
||||||
|
double abs = 0.0;
|
||||||
|
double real = 0.0;
|
||||||
|
double imag = 0.0;
|
||||||
|
#ifdef DEBUG_UL_PTRS
|
||||||
|
double alpha = 0;
|
||||||
|
#endif
|
||||||
|
/* generate PTRS RE for the symbol */
|
||||||
|
nr_gen_ref_conj_symbols(ptrs_gold_seq[Ns][symbol],sc_per_symbol*2,ptrs_p, NR_MOD_TABLE_QPSK_OFFSET,2);// 2 for QPSK
|
||||||
|
|
||||||
|
/* loop over all sub carriers to get compensated RE on ptrs symbols*/
|
||||||
|
for (int re = 0; re < nb_re_pusch; re++)
|
||||||
|
{
|
||||||
|
is_ptrs_re = is_ptrs_subcarrier(re,
|
||||||
|
rel15_ul->rnti,
|
||||||
|
0,
|
||||||
|
rel15_ul->dmrs_config_type,
|
||||||
|
K_ptrs,
|
||||||
|
rel15_ul->rb_size,
|
||||||
|
rel15_ul->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset,
|
||||||
|
0,// start_re is 0 here
|
||||||
|
frame_parms->ofdm_symbol_size);
|
||||||
|
if(is_ptrs_re)
|
||||||
|
{
|
||||||
|
dmrs_comp_p[re_cnt*2] = rxF_comp[re *2];
|
||||||
|
dmrs_comp_p[(re_cnt*2)+1] = rxF_comp[(re *2)+1];
|
||||||
|
re_cnt++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Skip PTRS symbols and keep data in a continuous vector */
|
||||||
|
rxF_comp[cnt *2]= rxF_comp[re *2];
|
||||||
|
rxF_comp[(cnt *2)+1]= rxF_comp[(re *2)+1];
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
}/* RE loop */
|
||||||
|
/* update the total ptrs RE in a symbol */
|
||||||
|
*ptrs_sc = re_cnt;
|
||||||
|
|
||||||
|
/*Multiple compensated data with conj of PTRS */
|
||||||
|
mult_cpx_vector(dmrs_comp_p, ptrs_p, ptrs_ch_p,(1 + sc_per_symbol/4)*4,15); // 2^15 shifted
|
||||||
|
|
||||||
|
/* loop over all ptrs sub carriers in a symbol */
|
||||||
|
/* sum the error vector */
|
||||||
|
for(int i = 0;i < sc_per_symbol; i++)
|
||||||
|
{
|
||||||
|
real+= ptrs_ch_p[(2*i)];
|
||||||
|
imag+= ptrs_ch_p[(2*i)+1];
|
||||||
|
}
|
||||||
|
#ifdef DEBUG_UL_PTRS
|
||||||
|
alpha = atan(imag/real);
|
||||||
|
printf("PTRS: Symbol %d atan(Im,real):= %f \n",symbol, alpha );
|
||||||
|
#endif
|
||||||
|
/* mean */
|
||||||
|
real /= sc_per_symbol;
|
||||||
|
imag /= sc_per_symbol;
|
||||||
|
/* absolute calculation */
|
||||||
|
abs = sqrt(((real * real) + (imag * imag)));
|
||||||
|
/* normalized error estimation */
|
||||||
|
error_est[0]= (real / abs)*(1<<15);
|
||||||
|
/* compensation in given by conjugate of estimated phase (e^-j*2*pi*fd*t)*/
|
||||||
|
error_est[1]= (-1)*(imag / abs)*(1<<15);
|
||||||
|
#ifdef DEBUG_UL_PTRS
|
||||||
|
printf("PTRS: Estimated Symbol %d -> %d + j* %d \n",symbol, error_est[0], error_est[1] );
|
||||||
|
#endif
|
||||||
|
/* free vectors */
|
||||||
|
free(ptrs_p);
|
||||||
|
free(dmrs_comp_p);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
*
|
||||||
|
* NAME : nr_pusch_phase_interpolation
|
||||||
|
*
|
||||||
|
* PARAMETERS : *error_est : Data Pointer [Re Im Re Im ...]
|
||||||
|
* start_symbol : Start Symbol
|
||||||
|
* end_symbol : End Symbol
|
||||||
|
* RETURN : nothing
|
||||||
|
*
|
||||||
|
* DESCRIPTION :
|
||||||
|
* Perform Interpolation, extrapolation based upon the estimation
|
||||||
|
* location between the data Pointer Array.
|
||||||
|
*
|
||||||
|
*********************************************************************/
|
||||||
|
void nr_pusch_phase_interpolation(int16_t *error_est,
|
||||||
|
uint8_t start_symbol,
|
||||||
|
uint8_t end_symbol
|
||||||
|
)
|
||||||
|
{
|
||||||
|
|
||||||
|
int next = 0, prev = 0, candidates= 0, distance=0, leftEdge= 0, rightEdge = 0, getDiff =0 ;
|
||||||
|
double weight = 0.0;
|
||||||
|
double scale = 0.125 ; // to avoid saturation due to fixed point multiplication
|
||||||
|
#ifdef DEBUG_UL_PTRS
|
||||||
|
printf("PTRS: INT: Left limit %d, Right limit %d, Loop over %d Symbols \n",
|
||||||
|
start_symbol,end_symbol-1, (end_symbol -start_symbol)-1);
|
||||||
|
#endif
|
||||||
|
for(int i =start_symbol; i< end_symbol;i++)
|
||||||
|
{
|
||||||
|
/* Only update when an estimation is found */
|
||||||
|
if( error_est[i*2] != 0 )
|
||||||
|
{
|
||||||
|
/* if found a symbol then set next symbol also */
|
||||||
|
next = nr_ptrs_find_next_estimate(error_est, i, end_symbol);
|
||||||
|
/* left extrapolation, if first estimate value is zero */
|
||||||
|
if( error_est[i*2] == 0 )
|
||||||
|
{
|
||||||
|
leftEdge = 1;
|
||||||
|
}
|
||||||
|
/* right extrapolation, if next is 0 before end symbol */
|
||||||
|
if((next == 0) && (end_symbol > i))
|
||||||
|
{
|
||||||
|
rightEdge = 1;
|
||||||
|
/* special case as no right extrapolation possible with DMRS on left */
|
||||||
|
/* In this case take mean of most recent 2 estimated points */
|
||||||
|
if(prev ==0)
|
||||||
|
{
|
||||||
|
prev = start_symbol -1;
|
||||||
|
next = start_symbol -2;
|
||||||
|
getDiff =1;
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
/* for right edge previous is second last from right side */
|
||||||
|
next = prev;
|
||||||
|
/* Set the current as recent estimation reference */
|
||||||
|
prev = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* update current symbol as prev for next symbol */
|
||||||
|
if (rightEdge==0)
|
||||||
|
/* Set the current as recent estimation reference */
|
||||||
|
prev = i;
|
||||||
|
}
|
||||||
|
/*extrapolation left side*/
|
||||||
|
if(leftEdge)
|
||||||
|
{
|
||||||
|
distance = next - prev;
|
||||||
|
weight = 1.0/distance;
|
||||||
|
candidates = i;
|
||||||
|
for(int j = 1; j <= candidates; j++)
|
||||||
|
{
|
||||||
|
error_est[(i-j)*2] = 8 *(((double)(error_est[prev*2]) * scale * (distance + j) * weight) -
|
||||||
|
((double)(error_est[next*2]) * scale * j * weight));
|
||||||
|
error_est[((i-j)*2)+1]= 8 *(((double)(error_est[(prev*2)+1]) * scale* (distance + j) * weight) -
|
||||||
|
((double)(error_est[((next*2)+1)]) * scale * j * weight));
|
||||||
|
#ifdef DEBUG_UL_PTRS
|
||||||
|
printf("PTRS: INT: Left Edge i= %d weight= %f %d + j*%d, Prev %d Next %d \n",
|
||||||
|
(i-j),weight, error_est[(i-j)*2],error_est[((i-j)*2)+1], prev,next);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
leftEdge = 0;
|
||||||
|
}
|
||||||
|
/* extrapolation at right side */
|
||||||
|
else if (rightEdge )
|
||||||
|
{
|
||||||
|
if(getDiff)
|
||||||
|
{
|
||||||
|
error_est[(i+1)*2] = ((1<<15) +(error_est[prev*2]) - error_est[next*2]);
|
||||||
|
error_est[((i+1)*2)+1]= error_est[(prev*2)+1] - error_est[(next*2)+1];
|
||||||
|
#ifdef DEBUG_UL_PTRS
|
||||||
|
printf("PTRS: INT: Right Edge Special Case i= %d weight= %f %d + j*%d, Prev %d Next %d \n",
|
||||||
|
(i+1),weight, error_est[(i+1)*2],error_est[((i+1)*2)+1], prev,next);
|
||||||
|
#endif
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
distance = prev - next;
|
||||||
|
candidates = (end_symbol -1) - i;
|
||||||
|
weight = 1.0/distance;
|
||||||
|
for(int j = 1; j <= candidates; j++)
|
||||||
|
{
|
||||||
|
error_est[(i+j)*2] = 8 *(((double)(error_est[prev*2]) * scale * (distance + j) * weight) -
|
||||||
|
((double)(error_est[next*2]) * scale * j * weight));
|
||||||
|
error_est[((i+j)*2)+1]= 8 *(((double)(error_est[(prev*2)+1]) * scale * (distance + j) * weight) -
|
||||||
|
((double)(error_est[((next*2)+1)]) * scale *j * weight));
|
||||||
|
#ifdef DEBUG_UL_PTRS
|
||||||
|
printf("PTRS: INT: Right Edge i= %d weight= %f %d + j*%d, Prev %d Next %d \n",
|
||||||
|
(i+j),weight, error_est[(i+j)*2],error_est[((i+j)*2)+1], prev,next);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if(candidates > 1)
|
||||||
|
{
|
||||||
|
i+=candidates;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Interpolation between 2 estimated points */
|
||||||
|
else if(next != 0 && ( error_est[2*i] == 0 ))
|
||||||
|
{
|
||||||
|
distance = next - prev;
|
||||||
|
weight = 1.0/distance;
|
||||||
|
candidates = next - i ;
|
||||||
|
for(int j = 0; j < candidates; j++)
|
||||||
|
{
|
||||||
|
|
||||||
|
error_est[(i+j)*2] = 8 *(((double)(error_est[prev*2]) * scale * (distance - (j+1)) * weight) +
|
||||||
|
((double)(error_est[next*2]) * scale * (j+1) * weight));
|
||||||
|
error_est[((i+j)*2)+1]= 8 *(((double)(error_est[(prev*2)+1]) * scale *(distance - (j+1)) * weight) +
|
||||||
|
((double)(error_est[((next*2)+1)]) * scale *(j+1) * weight));
|
||||||
|
#ifdef DEBUG_UL_PTRS
|
||||||
|
printf("PTRS: INT: Interpolation i= %d weight= %f %d + j*%d, Prev %d Next %d\n",
|
||||||
|
(i+j),weight, error_est[(i+j)*2],error_est[((i+j)*2)+1],prev,next);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if(candidates > 1)
|
||||||
|
{
|
||||||
|
i+=candidates-1;
|
||||||
|
}
|
||||||
|
}// interpolation
|
||||||
|
}// symbol loop
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find the next non zero Real value in a complex vector */
|
||||||
|
int nr_ptrs_find_next_estimate(int16_t *error_est,
|
||||||
|
uint8_t counter,
|
||||||
|
uint8_t end_symbol)
|
||||||
|
{
|
||||||
|
for (int i = counter +1 ; i< end_symbol; i++)
|
||||||
|
{
|
||||||
|
if( error_est[2*i] != 0)
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
@@ -43,9 +43,38 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
unsigned char Ns,
|
unsigned char Ns,
|
||||||
unsigned short p,
|
unsigned short p,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
|
int ul_id,
|
||||||
unsigned short bwp_start_subcarrier,
|
unsigned short bwp_start_subcarrier,
|
||||||
nfapi_nr_pusch_pdu_t *pusch_pdu);
|
nfapi_nr_pusch_pdu_t *pusch_pdu);
|
||||||
|
|
||||||
|
void gNB_I0_measurements(PHY_VARS_gNB *gNB);
|
||||||
|
|
||||||
int nr_est_timing_advance_pusch(PHY_VARS_gNB* phy_vars_gNB, int UE_id);
|
int nr_est_timing_advance_pusch(PHY_VARS_gNB* phy_vars_gNB, int UE_id);
|
||||||
|
|
||||||
|
|
||||||
|
void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
||||||
|
nfapi_nr_pusch_pdu_t *rel15_ul,
|
||||||
|
uint8_t ulsch_id,
|
||||||
|
uint8_t nr_tti_rx,
|
||||||
|
uint8_t dmrs_symbol_flag,
|
||||||
|
unsigned char symbol,
|
||||||
|
uint32_t nb_re_pusch);
|
||||||
|
|
||||||
|
void nr_pusch_phase_estimation(NR_DL_FRAME_PARMS *frame_parms,
|
||||||
|
nfapi_nr_pusch_pdu_t *rel15_ul,
|
||||||
|
int16_t *ptrs_ch_p,
|
||||||
|
unsigned char Ns,
|
||||||
|
unsigned char symbol,
|
||||||
|
int16_t *rxF_comp,
|
||||||
|
uint32_t ***ptrs_gold_seq,
|
||||||
|
int16_t *error_est,
|
||||||
|
uint16_t *ptrs_sc);
|
||||||
|
|
||||||
|
void nr_pusch_phase_interpolation(int16_t *error_est,
|
||||||
|
uint8_t start_symbol,
|
||||||
|
uint8_t end_symbol);
|
||||||
|
|
||||||
|
int nr_ptrs_find_next_estimate(int16_t *error_est,
|
||||||
|
uint8_t counter,
|
||||||
|
uint8_t end_symbol);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -362,4 +362,25 @@ void generate_dmrs_pbch(uint32_t dmrs_pbch_bitmap[DMRS_PBCH_I_SSB][DMRS_PBCH_N_H
|
|||||||
free(dmrs_sequence);
|
free(dmrs_sequence);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
/* return the position of next dmrs symbol in a slot */
|
||||||
|
int get_next_dmrs_symbol_in_slot(uint16_t ul_dmrs_symb_pos, uint8_t counter, uint8_t end_symbol)
|
||||||
|
{
|
||||||
|
for(uint8_t symbol = counter; symbol < end_symbol; symbol++)
|
||||||
|
if((ul_dmrs_symb_pos >>symbol)&0x01 )
|
||||||
|
{
|
||||||
|
return symbol;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* return the total number of dmrs symbol in a slot */
|
||||||
|
uint8_t get_dmrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t nb_symb)
|
||||||
|
{
|
||||||
|
uint8_t tmp = 0;
|
||||||
|
for (int i = 0; i < nb_symb; i++)
|
||||||
|
{
|
||||||
|
tmp += (l_prime_mask >> i) & 0x01;
|
||||||
|
}
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|||||||
@@ -223,3 +223,27 @@ int nr_pbch_dmrs_rx(int symbol,
|
|||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief This function generate gold ptrs sequence for each OFDM symbol
|
||||||
|
\param *in gold sequence for ptrs per OFDM symbol
|
||||||
|
\param length is number of RE in a OFDM symbol
|
||||||
|
\param *output pointer to all ptrs RE in a OFDM symbol
|
||||||
|
*/
|
||||||
|
void nr_gen_ref_conj_symbols(uint32_t *in, uint32_t length, int16_t *output, uint16_t offset, int mod_order)
|
||||||
|
{
|
||||||
|
uint8_t idx, b_idx;
|
||||||
|
for (int i=0; i<length/mod_order; i++)
|
||||||
|
{
|
||||||
|
idx = 0;
|
||||||
|
for (int j=0; j<mod_order; j++)
|
||||||
|
{
|
||||||
|
b_idx = (i*mod_order+j)&0x1f;
|
||||||
|
if (i && (!b_idx))
|
||||||
|
in++;
|
||||||
|
idx ^= (((*in)>>b_idx)&1)<<(mod_order-j-1);
|
||||||
|
}
|
||||||
|
output[i<<1] = nr_rx_mod_table[(offset+idx)<<1];
|
||||||
|
output[(i<<1)+1] = nr_rx_mod_table[((offset+idx)<<1)+1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -52,10 +52,14 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB,
|
|||||||
uint8_t dmrs_type);
|
uint8_t dmrs_type);
|
||||||
|
|
||||||
void init_scrambling_luts(void);
|
void init_scrambling_luts(void);
|
||||||
|
void nr_gen_ref_conj_symbols(uint32_t *in, uint32_t length, int16_t *output, uint16_t offset, int mod_order);
|
||||||
|
uint8_t get_next_dmrs_symbol_in_slot(uint16_t ul_dmrs_symb_pos, uint8_t counter, uint8_t end_symbol);
|
||||||
|
uint8_t get_dmrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t nb_symb);
|
||||||
|
|
||||||
void nr_generate_modulation_table(void);
|
void nr_generate_modulation_table(void);
|
||||||
|
|
||||||
extern __m64 byte2m64_re[256];
|
extern __m64 byte2m64_re[256];
|
||||||
extern __m64 byte2m64_im[256];
|
extern __m64 byte2m64_im[256];
|
||||||
|
extern __m128i byte2m128i[256];
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -32,6 +32,8 @@
|
|||||||
__m64 byte2m64_re[256];
|
__m64 byte2m64_re[256];
|
||||||
__m64 byte2m64_im[256];
|
__m64 byte2m64_im[256];
|
||||||
|
|
||||||
|
__m128i byte2m128i[256];
|
||||||
|
|
||||||
void init_byte2m64(void) {
|
void init_byte2m64(void) {
|
||||||
|
|
||||||
for (int s=0;s<256;s++) {
|
for (int s=0;s<256;s++) {
|
||||||
@@ -54,10 +56,24 @@ void init_byte2m64(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void init_byte2m128i(void) {
|
||||||
|
|
||||||
|
for (int s=0;s<256;s++) {
|
||||||
|
byte2m128i[s] = _mm_insert_epi16(byte2m128i[s],(1-2*(s&1)),0);
|
||||||
|
byte2m128i[s] = _mm_insert_epi16(byte2m128i[s],(1-2*((s>>1)&1)),1);
|
||||||
|
byte2m128i[s] = _mm_insert_epi16(byte2m128i[s],(1-2*((s>>2)&1)),2);
|
||||||
|
byte2m128i[s] = _mm_insert_epi16(byte2m128i[s],(1-2*((s>>3)&1)),3);
|
||||||
|
byte2m128i[s] = _mm_insert_epi16(byte2m128i[s],(1-2*((s>>4)&1)),4);
|
||||||
|
byte2m128i[s] = _mm_insert_epi16(byte2m128i[s],(1-2*((s>>5)&1)),5);
|
||||||
|
byte2m128i[s] = _mm_insert_epi16(byte2m128i[s],(1-2*((s>>6)&1)),6);
|
||||||
|
byte2m128i[s] = _mm_insert_epi16(byte2m128i[s],(1-2*((s>>7)&1)),7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void init_scrambling_luts(void) {
|
void init_scrambling_luts(void) {
|
||||||
|
|
||||||
init_byte2m64();
|
init_byte2m64();
|
||||||
|
init_byte2m128i();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -154,8 +154,10 @@ void nr_pdcch_scrambling(uint32_t *in,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint8_t nr_generate_dci_top(nfapi_nr_dl_tti_pdcch_pdu *pdcch_pdu,
|
|
||||||
nfapi_nr_ul_dci_request_pdus_t *ul_dci_pdu,
|
uint8_t nr_generate_dci_top(PHY_VARS_gNB *gNB,
|
||||||
|
nfapi_nr_dl_tti_pdcch_pdu *pdcch_pdu,
|
||||||
|
nfapi_nr_dl_tti_pdcch_pdu *ul_dci_pdu,
|
||||||
uint32_t **gold_pdcch_dmrs,
|
uint32_t **gold_pdcch_dmrs,
|
||||||
int32_t *txdataF,
|
int32_t *txdataF,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
@@ -180,15 +182,17 @@ uint8_t nr_generate_dci_top(nfapi_nr_dl_tti_pdcch_pdu *pdcch_pdu,
|
|||||||
|
|
||||||
|
|
||||||
if (pdcch_pdu) pdcch_pdu_rel15 = &pdcch_pdu->pdcch_pdu_rel15;
|
if (pdcch_pdu) pdcch_pdu_rel15 = &pdcch_pdu->pdcch_pdu_rel15;
|
||||||
else if (ul_dci_pdu) pdcch_pdu_rel15 = &ul_dci_pdu->pdcch_pdu.pdcch_pdu_rel15;
|
else if (ul_dci_pdu) pdcch_pdu_rel15 = &ul_dci_pdu->pdcch_pdu_rel15;
|
||||||
|
|
||||||
|
nr_fill_cce_list(gNB,0,pdcch_pdu_rel15);
|
||||||
|
|
||||||
get_coreset_rballoc(pdcch_pdu_rel15->FreqDomainResource,&n_rb,&rb_offset);
|
get_coreset_rballoc(pdcch_pdu_rel15->FreqDomainResource,&n_rb,&rb_offset);
|
||||||
|
|
||||||
// compute rb_offset and n_prb based on frequency allocation
|
// compute rb_offset and n_prb based on frequency allocation
|
||||||
|
|
||||||
if (pdcch_pdu_rel15->CoreSetType == NFAPI_NR_CSET_CONFIG_MIB_SIB1) {
|
if (pdcch_pdu_rel15->CoreSetType == NFAPI_NR_CSET_CONFIG_MIB_SIB1) {
|
||||||
cset_start_sc = frame_parms.first_carrier_offset + (frame_parms.ssb_start_subcarrier/NR_NB_SC_PER_RB +
|
cset_start_sc = frame_parms.first_carrier_offset +
|
||||||
rb_offset)*NR_NB_SC_PER_RB;
|
(frame_parms.ssb_start_subcarrier/NR_NB_SC_PER_RB + rb_offset)*NR_NB_SC_PER_RB;
|
||||||
} else
|
} else
|
||||||
cset_start_sc = frame_parms.first_carrier_offset + rb_offset*NR_NB_SC_PER_RB;
|
cset_start_sc = frame_parms.first_carrier_offset + rb_offset*NR_NB_SC_PER_RB;
|
||||||
|
|
||||||
@@ -324,6 +328,7 @@ uint8_t nr_generate_dci_top(nfapi_nr_dl_tti_pdcch_pdu *pdcch_pdu,
|
|||||||
k -= frame_parms.ofdm_symbol_size;
|
k -= frame_parms.ofdm_symbol_size;
|
||||||
} // m
|
} // m
|
||||||
} // reg_idx
|
} // reg_idx
|
||||||
|
|
||||||
} // for (int d=0;d<pdcch_pdu_rel15->numDlDci;d++)
|
} // for (int d=0;d<pdcch_pdu_rel15->numDlDci;d++)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,9 +29,10 @@ uint16_t nr_get_dci_size(nfapi_nr_dci_format_e format,
|
|||||||
nfapi_nr_rnti_type_e rnti_type,
|
nfapi_nr_rnti_type_e rnti_type,
|
||||||
uint16_t N_RB);
|
uint16_t N_RB);
|
||||||
|
|
||||||
uint8_t nr_generate_dci_top(nfapi_nr_dl_tti_pdcch_pdu *pdcch_pdu,
|
uint8_t nr_generate_dci_top(PHY_VARS_gNB *gNB,
|
||||||
nfapi_nr_ul_dci_request_pdus_t *ul_dci_pdu,
|
nfapi_nr_dl_tti_pdcch_pdu *pdcch_pdu,
|
||||||
uint32_t **gold_pdcch_dmrs,
|
nfapi_nr_dl_tti_pdcch_pdu *ul_pdcch_pdu,
|
||||||
|
uint32_t **gold_pdcch_dmrs,
|
||||||
int32_t *txdataF,
|
int32_t *txdataF,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
NR_DL_FRAME_PARMS frame_parms);
|
NR_DL_FRAME_PARMS frame_parms);
|
||||||
@@ -42,15 +43,21 @@ void nr_pdcch_scrambling(uint32_t *in,
|
|||||||
uint32_t n_RNTI,
|
uint32_t n_RNTI,
|
||||||
uint32_t *out);
|
uint32_t *out);
|
||||||
|
|
||||||
|
int16_t find_nr_pdcch(int frame,int slot, PHY_VARS_gNB *gNB,find_type_t type);
|
||||||
|
|
||||||
void nr_fill_dci(PHY_VARS_gNB *gNB,
|
void nr_fill_dci(PHY_VARS_gNB *gNB,
|
||||||
int frame,
|
int frame,
|
||||||
int slot);
|
int slot,
|
||||||
|
nfapi_nr_dl_tti_pdcch_pdu *pdcch_pdu);
|
||||||
|
|
||||||
|
int16_t find_nr_ul_dci(int frame,int slot, PHY_VARS_gNB *gNB,find_type_t type);
|
||||||
|
|
||||||
void nr_fill_ul_dci(PHY_VARS_gNB *gNB,
|
void nr_fill_ul_dci(PHY_VARS_gNB *gNB,
|
||||||
int frame,
|
int frame,
|
||||||
int slot);
|
int slot,
|
||||||
|
nfapi_nr_ul_dci_request_pdus_t *pdcch_pdu);
|
||||||
|
|
||||||
void nr_fill_cce_list(PHY_VARS_gNB *gNB, uint8_t m);
|
void nr_fill_cce_list(PHY_VARS_gNB *gNB, uint8_t m,nfapi_nr_dl_tti_pdcch_pdu_rel15_t *);
|
||||||
|
|
||||||
void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset);
|
void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset);
|
||||||
|
|
||||||
|
|||||||
@@ -118,11 +118,11 @@ void nr_fill_cce_list(PHY_VARS_gNB *gNB, uint16_t n_shift, uint8_t m) {
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void nr_fill_cce_list(PHY_VARS_gNB *gNB, uint8_t m) {
|
void nr_fill_cce_list(PHY_VARS_gNB *gNB, uint8_t m, nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15) {
|
||||||
|
|
||||||
nr_cce_t* cce;
|
nr_cce_t* cce;
|
||||||
nr_reg_t* reg;
|
nr_reg_t* reg;
|
||||||
nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu_rel15 = &gNB->pdcch_pdu->pdcch_pdu_rel15;
|
|
||||||
int bsize = pdcch_pdu_rel15->RegBundleSize;
|
int bsize = pdcch_pdu_rel15->RegBundleSize;
|
||||||
int R = pdcch_pdu_rel15->InterleaverSize;
|
int R = pdcch_pdu_rel15->InterleaverSize;
|
||||||
int n_shift = pdcch_pdu_rel15->ShiftIndex;
|
int n_shift = pdcch_pdu_rel15->ShiftIndex;
|
||||||
@@ -139,6 +139,8 @@ void nr_fill_cce_list(PHY_VARS_gNB *gNB, uint8_t m) {
|
|||||||
int N_reg = n_rb * pdcch_pdu_rel15->DurationSymbols;
|
int N_reg = n_rb * pdcch_pdu_rel15->DurationSymbols;
|
||||||
int C=-1;
|
int C=-1;
|
||||||
|
|
||||||
|
AssertFatal(N_reg > 0,"N_reg cannot be 0\n");
|
||||||
|
|
||||||
for (int d=0;d<pdcch_pdu_rel15->numDlDci;d++) {
|
for (int d=0;d<pdcch_pdu_rel15->numDlDci;d++) {
|
||||||
int L = pdcch_pdu_rel15->dci_pdu.AggregationLevel[d];
|
int L = pdcch_pdu_rel15->dci_pdu.AggregationLevel[d];
|
||||||
|
|
||||||
@@ -200,14 +202,38 @@ void nr_fill_cce_list(PHY_VARS_gNB *gNB, uint8_t m) {
|
|||||||
ret |= ((field>>i)&1)<<(size-i-1);
|
ret |= ((field>>i)&1)<<(size-i-1);
|
||||||
return ret;
|
return ret;
|
||||||
}*/
|
}*/
|
||||||
|
int16_t find_nr_pdcch(int frame,int slot, PHY_VARS_gNB *gNB,find_type_t type) {
|
||||||
|
|
||||||
|
uint16_t i;
|
||||||
|
int16_t first_free_index=-1;
|
||||||
|
|
||||||
|
AssertFatal(gNB!=NULL,"gNB is null\n");
|
||||||
|
for (i=0; i<NUMBER_OF_NR_PDCCH_MAX; i++) {
|
||||||
|
LOG_D(PHY,"searching for frame.slot %d.%d : pdcch_index %d frame.slot %d.%d, first_free_index %d\n", frame,slot,i,gNB->pdcch_pdu[i].frame,gNB->pdcch_pdu[i].slot,first_free_index);
|
||||||
|
if ((gNB->pdcch_pdu[i].frame == frame) &&
|
||||||
|
(gNB->pdcch_pdu[i].slot==slot)) return i;
|
||||||
|
else if ( gNB->pdcch_pdu[i].frame==-1 && first_free_index==-1) first_free_index=i;
|
||||||
|
}
|
||||||
|
if (type == SEARCH_EXIST) return -1;
|
||||||
|
|
||||||
|
return first_free_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void nr_fill_dci(PHY_VARS_gNB *gNB,
|
void nr_fill_dci(PHY_VARS_gNB *gNB,
|
||||||
int frame,
|
int frame,
|
||||||
int slot) {
|
int slot,
|
||||||
|
nfapi_nr_dl_tti_pdcch_pdu *pdcch_pdu) {
|
||||||
|
|
||||||
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = &gNB->pdcch_pdu->pdcch_pdu_rel15;
|
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = &pdcch_pdu->pdcch_pdu_rel15;
|
||||||
NR_gNB_DLSCH_t *dlsch;
|
NR_gNB_DLSCH_t *dlsch;
|
||||||
|
|
||||||
|
int pdcch_id = find_nr_pdcch(frame,slot,gNB,SEARCH_EXIST_OR_FREE);
|
||||||
|
AssertFatal(pdcch_id>=0 && pdcch_id<NUMBER_OF_NR_PDCCH_MAX,"Cannot find space for PDCCH, exiting\n");
|
||||||
|
memcpy((void*)&gNB->pdcch_pdu[pdcch_id].pdcch_pdu,(void*)pdcch_pdu,sizeof(*pdcch_pdu));
|
||||||
|
gNB->pdcch_pdu[pdcch_id].frame = frame;
|
||||||
|
gNB->pdcch_pdu[pdcch_id].slot = slot;
|
||||||
|
|
||||||
for (int i=0;i<pdcch_pdu_rel15->numDlDci;i++) {
|
for (int i=0;i<pdcch_pdu_rel15->numDlDci;i++) {
|
||||||
|
|
||||||
//uint64_t *dci_pdu = (uint64_t*)pdcch_pdu_rel15->dci_pdu.Payload[i];
|
//uint64_t *dci_pdu = (uint64_t*)pdcch_pdu_rel15->dci_pdu.Payload[i];
|
||||||
@@ -230,7 +256,7 @@ void nr_fill_dci(PHY_VARS_gNB *gNB,
|
|||||||
dlsch->harq_mask |= (1<<harq_pid);
|
dlsch->harq_mask |= (1<<harq_pid);
|
||||||
dlsch->rnti = pdcch_pdu_rel15->dci_pdu.RNTI[i];
|
dlsch->rnti = pdcch_pdu_rel15->dci_pdu.RNTI[i];
|
||||||
|
|
||||||
nr_fill_cce_list(gNB,0);
|
// nr_fill_cce_list(gNB,0);
|
||||||
/*
|
/*
|
||||||
LOG_D(PHY, "DCI PDU: [0]->0x%lx \t [1]->0x%lx \n",dci_pdu[0], dci_pdu[1]);
|
LOG_D(PHY, "DCI PDU: [0]->0x%lx \t [1]->0x%lx \n",dci_pdu[0], dci_pdu[1]);
|
||||||
LOG_D(PHY, "DCI type %d payload (size %d) generated on candidate %d\n", dci_alloc->pdcch_params.dci_format, dci_alloc->size, cand_idx);
|
LOG_D(PHY, "DCI type %d payload (size %d) generated on candidate %d\n", dci_alloc->pdcch_params.dci_format, dci_alloc->size, cand_idx);
|
||||||
@@ -239,19 +265,45 @@ void nr_fill_dci(PHY_VARS_gNB *gNB,
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int16_t find_nr_ul_dci(int frame,int slot, PHY_VARS_gNB *gNB,find_type_t type) {
|
||||||
|
|
||||||
|
uint16_t i;
|
||||||
|
int16_t first_free_index=-1;
|
||||||
|
|
||||||
|
AssertFatal(gNB!=NULL,"gNB is null\n");
|
||||||
|
for (i=0; i<NUMBER_OF_NR_PDCCH_MAX; i++) {
|
||||||
|
LOG_D(PHY,"searching for frame.slot %d.%d : ul_pdcch_index %d frame.slot %d.%d, first_free_index %d\n", frame,slot,i,gNB->ul_pdcch_pdu[i].frame,gNB->ul_pdcch_pdu[i].slot,first_free_index);
|
||||||
|
if ((gNB->ul_pdcch_pdu[i].frame == frame) &&
|
||||||
|
(gNB->ul_pdcch_pdu[i].slot==slot)) return i;
|
||||||
|
else if (gNB->ul_pdcch_pdu[i].frame==-1 && first_free_index==-1) first_free_index=i;
|
||||||
|
}
|
||||||
|
if (type == SEARCH_EXIST) return -1;
|
||||||
|
|
||||||
|
return first_free_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void nr_fill_ul_dci(PHY_VARS_gNB *gNB,
|
void nr_fill_ul_dci(PHY_VARS_gNB *gNB,
|
||||||
int frame,
|
int frame,
|
||||||
int slot) {
|
int slot,
|
||||||
|
nfapi_nr_ul_dci_request_pdus_t *pdcch_pdu) {
|
||||||
|
|
||||||
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = &gNB->ul_dci_pdu->pdcch_pdu.pdcch_pdu_rel15;
|
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = &pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
|
||||||
|
|
||||||
|
int pdcch_id = find_nr_ul_dci(frame,slot,gNB,SEARCH_EXIST_OR_FREE);
|
||||||
|
AssertFatal(pdcch_id>=0 && pdcch_id<NUMBER_OF_NR_PDCCH_MAX,"Cannot find space for UL PDCCH, exiting\n");
|
||||||
|
memcpy((void*)&gNB->ul_pdcch_pdu[pdcch_id].pdcch_pdu,(void*)pdcch_pdu,sizeof(*pdcch_pdu));
|
||||||
|
gNB->ul_pdcch_pdu[pdcch_id].frame = frame;
|
||||||
|
gNB->ul_pdcch_pdu[pdcch_id].slot = slot;
|
||||||
|
|
||||||
for (int i=0;i<pdcch_pdu_rel15->numDlDci;i++) {
|
for (int i=0;i<pdcch_pdu_rel15->numDlDci;i++) {
|
||||||
|
|
||||||
//uint64_t *dci_pdu = (uint64_t*)pdcch_pdu_rel15->dci_pdu.Payload[i];
|
//uint64_t *dci_pdu = (uint64_t*)pdcch_pdu_rel15->dci_pdu.Payload[i];
|
||||||
|
|
||||||
// if there's no DL DCI then generate CCE list
|
// if there's no DL DCI then generate CCE list
|
||||||
if (gNB->pdcch_pdu) nr_fill_cce_list(gNB,0);
|
// nr_fill_cce_list(gNB,0);
|
||||||
/*
|
/*
|
||||||
LOG_D(PHY, "DCI PDU: [0]->0x%lx \t [1]->0x%lx \n",dci_pdu[0], dci_pdu[1]);
|
LOG_D(PHY, "DCI PDU: [0]->0x%lx \t [1]->0x%lx \n",dci_pdu[0], dci_pdu[1]);
|
||||||
LOG_D(PHY, "DCI type %d payload (size %d) generated on candidate %d\n", dci_alloc->pdcch_params.dci_format, dci_alloc->size, cand_idx);
|
LOG_D(PHY, "DCI type %d payload (size %d) generated on candidate %d\n", dci_alloc->pdcch_params.dci_format, dci_alloc->size, cand_idx);
|
||||||
|
|||||||
@@ -109,220 +109,255 @@ void nr_pdsch_codeword_scrambling_optim(uint8_t *in,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t *dlsch,
|
uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
||||||
uint32_t ***pdsch_dmrs,
|
int frame,
|
||||||
int32_t** txdataF,
|
int slot) {
|
||||||
int16_t amp,
|
|
||||||
int frame,
|
|
||||||
uint8_t slot,
|
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
|
||||||
int xOverhead,
|
|
||||||
time_stats_t *dlsch_encoding_stats,
|
|
||||||
time_stats_t *dlsch_scrambling_stats,
|
|
||||||
time_stats_t *dlsch_modulation_stats,
|
|
||||||
time_stats_t *tinput,
|
|
||||||
time_stats_t *tprep,
|
|
||||||
time_stats_t *tparity,
|
|
||||||
time_stats_t *toutput,
|
|
||||||
time_stats_t *dlsch_rate_matching_stats,
|
|
||||||
time_stats_t *dlsch_interleaving_stats,
|
|
||||||
time_stats_t *dlsch_segmentation_stats) {
|
|
||||||
|
|
||||||
int harq_pid = dlsch->harq_ids[frame%2][slot];
|
NR_gNB_DLSCH_t *dlsch;
|
||||||
NR_DL_gNB_HARQ_t *harq = dlsch->harq_processes[harq_pid];
|
uint32_t ***pdsch_dmrs = gNB->nr_gold_pdsch_dmrs[slot];
|
||||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &harq->pdsch_pdu.pdsch_pdu_rel15;
|
int32_t** txdataF = gNB->common_vars.txdataF;
|
||||||
uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5];
|
int16_t amp = AMP;
|
||||||
int16_t **mod_symbs = (int16_t**)dlsch->mod_symbs;
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
int16_t **tx_layers = (int16_t**)dlsch->txdataF;
|
int xOverhead = 0;
|
||||||
int8_t Wf[2], Wt[2], l0, l_prime[2], delta;
|
time_stats_t *dlsch_encoding_stats=&gNB->dlsch_encoding_stats;
|
||||||
uint8_t dmrs_Type = rel15->dmrsConfigType;
|
time_stats_t *dlsch_scrambling_stats=&gNB->dlsch_scrambling_stats;
|
||||||
int nb_re_dmrs;
|
time_stats_t *dlsch_modulation_stats=&gNB->dlsch_modulation_stats;
|
||||||
uint16_t n_dmrs;
|
time_stats_t *tinput=&gNB->tinput;
|
||||||
if (rel15->dmrsConfigType==NFAPI_NR_DMRS_TYPE1) {
|
time_stats_t *tprep=&gNB->tprep;
|
||||||
nb_re_dmrs = 6*rel15->numDmrsCdmGrpsNoData;
|
time_stats_t *tparity=&gNB->tparity;
|
||||||
n_dmrs = ((rel15->rbSize+rel15->rbStart)*6)<<1;
|
time_stats_t *toutput=&gNB->toutput;
|
||||||
}
|
time_stats_t *dlsch_rate_matching_stats=&gNB->dlsch_rate_matching_stats;
|
||||||
else {
|
time_stats_t *dlsch_interleaving_stats=&gNB->dlsch_interleaving_stats;
|
||||||
nb_re_dmrs = 4*rel15->numDmrsCdmGrpsNoData;
|
time_stats_t *dlsch_segmentation_stats=&gNB->dlsch_segmentation_stats;
|
||||||
n_dmrs = ((rel15->rbSize+rel15->rbStart)*4)<<1;
|
|
||||||
}
|
|
||||||
uint16_t nb_re;
|
|
||||||
nb_re = ((12*rel15->NrOfSymbols)-nb_re_dmrs-xOverhead)*rel15->rbSize*rel15->NrOfCodewords;
|
|
||||||
uint8_t Qm = rel15->qamModOrder[0];
|
|
||||||
uint32_t encoded_length = nb_re*Qm;
|
|
||||||
int16_t mod_dmrs[n_dmrs<<1] __attribute__ ((aligned(16)));
|
|
||||||
|
|
||||||
/// CRC, coding, interleaving and rate matching
|
for (int dlsch_id=0;dlsch_id<NUMBER_OF_NR_DLSCH_MAX;dlsch_id++) {
|
||||||
AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n");
|
dlsch = gNB->dlsch[dlsch_id][0];
|
||||||
start_meas(dlsch_encoding_stats);
|
if (dlsch->slot_tx[slot] == 0) continue;
|
||||||
nr_dlsch_encoding(harq->pdu, frame, slot, dlsch, frame_parms,tinput,tprep,tparity,toutput,
|
|
||||||
dlsch_rate_matching_stats,
|
int harq_pid = dlsch->harq_ids[frame%2][slot];
|
||||||
dlsch_interleaving_stats,
|
NR_DL_gNB_HARQ_t *harq = dlsch->harq_processes[harq_pid];
|
||||||
dlsch_segmentation_stats);
|
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &harq->pdsch_pdu.pdsch_pdu_rel15;
|
||||||
stop_meas(dlsch_encoding_stats);
|
uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5];
|
||||||
|
int16_t **mod_symbs = (int16_t**)dlsch->mod_symbs;
|
||||||
|
int16_t **tx_layers = (int16_t**)dlsch->txdataF;
|
||||||
|
int8_t Wf[2], Wt[2], l0, l_prime[2], delta;
|
||||||
|
uint8_t dmrs_Type = rel15->dmrsConfigType;
|
||||||
|
int nb_re_dmrs;
|
||||||
|
uint16_t n_dmrs;
|
||||||
|
if (rel15->dmrsConfigType==NFAPI_NR_DMRS_TYPE1) {
|
||||||
|
nb_re_dmrs = 6*rel15->numDmrsCdmGrpsNoData;
|
||||||
|
n_dmrs = ((rel15->rbSize+rel15->rbStart)*6)<<1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nb_re_dmrs = 4*rel15->numDmrsCdmGrpsNoData;
|
||||||
|
n_dmrs = ((rel15->rbSize+rel15->rbStart)*4)<<1;
|
||||||
|
}
|
||||||
|
uint16_t nb_re;
|
||||||
|
nb_re = ((12*rel15->NrOfSymbols)-nb_re_dmrs-xOverhead)*rel15->rbSize*rel15->NrOfCodewords;
|
||||||
|
uint8_t Qm = rel15->qamModOrder[0];
|
||||||
|
uint32_t encoded_length = nb_re*Qm;
|
||||||
|
int16_t mod_dmrs[n_dmrs<<1] __attribute__ ((aligned(16)));
|
||||||
|
|
||||||
|
|
||||||
|
/// CRC, coding, interleaving and rate matching
|
||||||
|
AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n");
|
||||||
|
start_meas(dlsch_encoding_stats);
|
||||||
|
nr_dlsch_encoding(gNB,
|
||||||
|
harq->pdu, frame, slot, dlsch, frame_parms,tinput,tprep,tparity,toutput,
|
||||||
|
dlsch_rate_matching_stats,
|
||||||
|
dlsch_interleaving_stats,
|
||||||
|
dlsch_segmentation_stats);
|
||||||
|
stop_meas(dlsch_encoding_stats);
|
||||||
#ifdef DEBUG_DLSCH
|
#ifdef DEBUG_DLSCH
|
||||||
printf("PDSCH encoding:\nPayload:\n");
|
printf("PDSCH encoding:\nPayload:\n");
|
||||||
for (int i=0; i<harq->B>>7; i++) {
|
for (int i=0; i<harq->B>>7; i++) {
|
||||||
for (int j=0; j<16; j++)
|
for (int j=0; j<16; j++)
|
||||||
printf("0x%02x\t", harq->pdu[(i<<4)+j]);
|
printf("0x%02x\t", harq->pdu[(i<<4)+j]);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
printf("\nEncoded payload:\n");
|
printf("\nEncoded payload:\n");
|
||||||
for (int i=0; i<encoded_length>>3; i++) {
|
for (int i=0; i<encoded_length>>3; i++) {
|
||||||
for (int j=0; j<8; j++)
|
for (int j=0; j<8; j++)
|
||||||
printf("%d", harq->f[(i<<3)+j]);
|
printf("%d", harq->f[(i<<3)+j]);
|
||||||
printf("\t");
|
printf("\t");
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// scrambling
|
|
||||||
start_meas(dlsch_scrambling_stats);
|
|
||||||
for (int q=0; q<rel15->NrOfCodewords; q++)
|
|
||||||
memset((void*)scrambled_output[q], 0, (encoded_length>>5)*sizeof(uint32_t));
|
|
||||||
for (int q=0; q<rel15->NrOfCodewords; q++)
|
|
||||||
nr_pdsch_codeword_scrambling_optim(harq->f,
|
|
||||||
encoded_length,
|
|
||||||
q,
|
|
||||||
rel15->dlDmrsScramblingId,
|
|
||||||
rel15->rnti,
|
|
||||||
scrambled_output[q]);
|
|
||||||
|
|
||||||
stop_meas(dlsch_scrambling_stats);
|
|
||||||
#ifdef DEBUG_DLSCH
|
|
||||||
printf("PDSCH scrambling:\n");
|
|
||||||
for (int i=0; i<encoded_length>>8; i++) {
|
|
||||||
for (int j=0; j<8; j++)
|
|
||||||
printf("0x%08x\t", scrambled_output[0][(i<<3)+j]);
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/// Modulation
|
|
||||||
start_meas(dlsch_modulation_stats);
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_PDSCH_MODULATION, 1);
|
|
||||||
for (int q=0; q<rel15->NrOfCodewords; q++)
|
|
||||||
nr_modulation(scrambled_output[q],
|
|
||||||
encoded_length,
|
|
||||||
Qm,
|
|
||||||
mod_symbs[q]);
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_PDSCH_MODULATION, 0);
|
|
||||||
stop_meas(dlsch_modulation_stats);
|
|
||||||
#ifdef DEBUG_DLSCH
|
|
||||||
printf("PDSCH Modulation: Qm %d(%d)\n", Qm, nb_re);
|
|
||||||
for (int i=0; i<nb_re>>3; i++) {
|
|
||||||
for (int j=0; j<8; j++) {
|
|
||||||
printf("%d %d\t", mod_symbs[0][((i<<3)+j)<<1], mod_symbs[0][(((i<<3)+j)<<1)+1]);
|
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/// Layer mapping
|
|
||||||
nr_layer_mapping(mod_symbs,
|
/// scrambling
|
||||||
rel15->nrOfLayers,
|
start_meas(dlsch_scrambling_stats);
|
||||||
nb_re,
|
for (int q=0; q<rel15->NrOfCodewords; q++)
|
||||||
tx_layers);
|
memset((void*)scrambled_output[q], 0, (encoded_length>>5)*sizeof(uint32_t));
|
||||||
|
for (int q=0; q<rel15->NrOfCodewords; q++)
|
||||||
|
nr_pdsch_codeword_scrambling_optim(harq->f,
|
||||||
|
encoded_length,
|
||||||
|
q,
|
||||||
|
rel15->dlDmrsScramblingId,
|
||||||
|
rel15->rnti,
|
||||||
|
scrambled_output[q]);
|
||||||
|
|
||||||
|
stop_meas(dlsch_scrambling_stats);
|
||||||
#ifdef DEBUG_DLSCH
|
#ifdef DEBUG_DLSCH
|
||||||
printf("Layer mapping (%d layers):\n", rel15->nrOfLayers);
|
printf("PDSCH scrambling:\n");
|
||||||
for (int l=0; l<rel15->nrOfLayers; l++)
|
for (int i=0; i<encoded_length>>8; i++) {
|
||||||
for (int i=0; i<(nb_re/rel15->nrOfLayers)>>3; i++) {
|
for (int j=0; j<8; j++)
|
||||||
printf("layer %d, Re %d..%d : ",l,i<<3,(i<<3)+7);
|
printf("0x%08x\t", scrambled_output[0][(i<<3)+j]);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// Modulation
|
||||||
|
start_meas(dlsch_modulation_stats);
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_PDSCH_MODULATION, 1);
|
||||||
|
for (int q=0; q<rel15->NrOfCodewords; q++)
|
||||||
|
nr_modulation(scrambled_output[q],
|
||||||
|
encoded_length,
|
||||||
|
Qm,
|
||||||
|
mod_symbs[q]);
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_PDSCH_MODULATION, 0);
|
||||||
|
stop_meas(dlsch_modulation_stats);
|
||||||
|
#ifdef DEBUG_DLSCH
|
||||||
|
printf("PDSCH Modulation: Qm %d(%d)\n", Qm, nb_re);
|
||||||
|
for (int i=0; i<nb_re>>3; i++) {
|
||||||
for (int j=0; j<8; j++) {
|
for (int j=0; j<8; j++) {
|
||||||
printf("l%d %d\t", tx_layers[l][((i<<3)+j)<<1], tx_layers[l][(((i<<3)+j)<<1)+1]);
|
printf("%d %d\t", mod_symbs[0][((i<<3)+j)<<1], mod_symbs[0][(((i<<3)+j)<<1)+1]);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Antenna port mapping
|
|
||||||
//to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007
|
/// Layer mapping
|
||||||
|
nr_layer_mapping(mod_symbs,
|
||||||
/// DMRS QPSK modulation
|
rel15->nrOfLayers,
|
||||||
|
nb_re,
|
||||||
|
tx_layers);
|
||||||
l0 = get_l0(rel15->dlDmrsSymbPos);
|
|
||||||
nr_modulation(pdsch_dmrs[l0][0], n_dmrs, DMRS_MOD_ORDER, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
|
|
||||||
|
|
||||||
#ifdef DEBUG_DLSCH
|
#ifdef DEBUG_DLSCH
|
||||||
printf("DMRS modulation (single symbol %d, %d symbols, type %d):\n", l0, n_dmrs>>1, dmrs_Type);
|
printf("Layer mapping (%d layers):\n", rel15->nrOfLayers);
|
||||||
for (int i=0; i<n_dmrs>>4; i++) {
|
for (int l=0; l<rel15->nrOfLayers; l++)
|
||||||
for (int j=0; j<8; j++) {
|
for (int i=0; i<(nb_re/rel15->nrOfLayers)>>3; i++) {
|
||||||
printf("%d %d\t", mod_dmrs[((i<<3)+j)<<1], mod_dmrs[(((i<<3)+j)<<1)+1]);
|
printf("layer %d, Re %d..%d : ",l,i<<3,(i<<3)+7);
|
||||||
|
for (int j=0; j<8; j++) {
|
||||||
|
printf("l%d %d\t", tx_layers[l][((i<<3)+j)<<1], tx_layers[l][(((i<<3)+j)<<1)+1]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// Antenna port mapping
|
||||||
|
//to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007
|
||||||
|
|
||||||
|
/// DMRS QPSK modulation
|
||||||
|
|
||||||
|
|
||||||
|
l0 = get_l0(rel15->dlDmrsSymbPos);
|
||||||
|
nr_modulation(pdsch_dmrs[l0][0], n_dmrs, DMRS_MOD_ORDER, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
|
||||||
|
|
||||||
|
#ifdef DEBUG_DLSCH
|
||||||
|
printf("DMRS modulation (single symbol %d, %d symbols, type %d):\n", l0, n_dmrs>>1, dmrs_Type);
|
||||||
|
for (int i=0; i<n_dmrs>>4; i++) {
|
||||||
|
for (int j=0; j<8; j++) {
|
||||||
|
printf("%d %d\t", mod_dmrs[((i<<3)+j)<<1], mod_dmrs[(((i<<3)+j)<<1)+1]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
}
|
}
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/// Resource mapping
|
/// Resource mapping
|
||||||
|
|
||||||
// Non interleaved VRB to PRB mapping
|
// Non interleaved VRB to PRB mapping
|
||||||
uint16_t start_sc = frame_parms->first_carrier_offset + rel15->rbStart*NR_NB_SC_PER_RB;
|
uint16_t start_sc = frame_parms->first_carrier_offset + rel15->rbStart*NR_NB_SC_PER_RB;
|
||||||
if (start_sc >= frame_parms->ofdm_symbol_size)
|
if (start_sc >= frame_parms->ofdm_symbol_size)
|
||||||
start_sc -= frame_parms->ofdm_symbol_size;
|
start_sc -= frame_parms->ofdm_symbol_size;
|
||||||
|
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
printf("PDSCH resource mapping started (start SC %d\tstart symbol %d\tN_PRB %d\tnb_re %d,nb_layers %d)\n",
|
printf("PDSCH resource mapping started (start SC %d\tstart symbol %d\tN_PRB %d\tnb_re %d,nb_layers %d)\n",
|
||||||
start_sc, rel15->StartSymbolIndex, rel15->rbSize, nb_re,rel15->nrOfLayers);
|
start_sc, rel15->StartSymbolIndex, rel15->rbSize, nb_re,rel15->nrOfLayers);
|
||||||
#endif
|
#endif
|
||||||
for (int ap=0; ap<rel15->nrOfLayers; ap++) {
|
for (int ap=0; ap<rel15->nrOfLayers; ap++) {
|
||||||
|
|
||||||
// DMRS params for this ap
|
// DMRS params for this ap
|
||||||
get_Wt(Wt, ap, dmrs_Type);
|
get_Wt(Wt, ap, dmrs_Type);
|
||||||
get_Wf(Wf, ap, dmrs_Type);
|
get_Wf(Wf, ap, dmrs_Type);
|
||||||
delta = get_delta(ap, dmrs_Type);
|
delta = get_delta(ap, dmrs_Type);
|
||||||
l_prime[0] = 0; // single symbol ap 0
|
l_prime[0] = 0; // single symbol ap 0
|
||||||
uint8_t dmrs_symbol = l0+l_prime[0];
|
uint8_t dmrs_symbol = l0+l_prime[0];
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
printf("DMRS Type %d params for ap %d: Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t l0 %d\tDMRS symbol %d\n",
|
printf("DMRS Type %d params for ap %d: Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t l0 %d\tDMRS symbol %d\n",
|
||||||
1+dmrs_Type,ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime[0], l0, dmrs_symbol);
|
1+dmrs_Type,ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime[0], l0, dmrs_symbol);
|
||||||
#endif
|
#endif
|
||||||
uint8_t k_prime=0;
|
uint8_t k_prime=0;
|
||||||
uint16_t m=0, n=0, dmrs_idx=0, k=0;
|
uint16_t m=0, n=0, dmrs_idx=0, k=0;
|
||||||
|
|
||||||
int txdataF_offset = (slot%2)*frame_parms->samples_per_slot_wCP;
|
int txdataF_offset = (slot%2)*frame_parms->samples_per_slot_wCP;
|
||||||
if (dmrs_Type == NFAPI_NR_DMRS_TYPE1) // another if condition to be included to check pdsch config type (reference of k)
|
if (dmrs_Type == NFAPI_NR_DMRS_TYPE1) // another if condition to be included to check pdsch config type (reference of k)
|
||||||
dmrs_idx = rel15->rbStart*6;
|
dmrs_idx = rel15->rbStart*6;
|
||||||
else
|
else
|
||||||
dmrs_idx = rel15->rbStart*4;
|
dmrs_idx = rel15->rbStart*4;
|
||||||
|
|
||||||
for (int l=rel15->StartSymbolIndex; l<rel15->StartSymbolIndex+rel15->NrOfSymbols; l++) {
|
for (int l=rel15->StartSymbolIndex; l<rel15->StartSymbolIndex+rel15->NrOfSymbols; l++) {
|
||||||
k = start_sc;
|
k = start_sc;
|
||||||
for (int i=0; i<rel15->rbSize*NR_NB_SC_PER_RB; i++) {
|
for (int i=0; i<rel15->rbSize*NR_NB_SC_PER_RB; i++) {
|
||||||
if ((l == dmrs_symbol) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_Type))%(frame_parms->ofdm_symbol_size)))) {
|
if ((l == dmrs_symbol) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_Type))%(frame_parms->ofdm_symbol_size)))) {
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15;
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15;
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
|
printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
|
||||||
dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
|
|
||||||
#endif
|
|
||||||
dmrs_idx++;
|
|
||||||
k_prime++;
|
|
||||||
k_prime&=1;
|
|
||||||
n+=(k_prime)?0:1;
|
|
||||||
}
|
|
||||||
|
|
||||||
else {
|
|
||||||
if( (l != dmrs_symbol) || allowed_xlsch_re_in_dmrs_symbol(k,start_sc,rel15->numDmrsCdmGrpsNoData,dmrs_Type)) {
|
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (amp * tx_layers[ap][m<<1]) >> 15;
|
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
|
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
|
||||||
printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
|
|
||||||
m, l, k, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
|
||||||
#endif
|
#endif
|
||||||
m++;
|
dmrs_idx++;
|
||||||
}
|
k_prime++;
|
||||||
}
|
k_prime&=1;
|
||||||
if (++k >= frame_parms->ofdm_symbol_size)
|
n+=(k_prime)?0:1;
|
||||||
k -= frame_parms->ofdm_symbol_size;
|
}
|
||||||
}
|
|
||||||
}
|
else {
|
||||||
}
|
if( (l != dmrs_symbol) || allowed_xlsch_re_in_dmrs_symbol(k,start_sc,rel15->numDmrsCdmGrpsNoData,dmrs_Type)) {
|
||||||
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (amp * tx_layers[ap][m<<1]) >> 15;
|
||||||
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
|
||||||
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
|
printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
|
||||||
|
m, l, k, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
||||||
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
|
||||||
|
#endif
|
||||||
|
m++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (++k >= frame_parms->ofdm_symbol_size)
|
||||||
|
k -= frame_parms->ofdm_symbol_size;
|
||||||
|
} //RE loop
|
||||||
|
} // symbol loop
|
||||||
|
}// layer loop
|
||||||
|
dlsch->slot_tx[slot]=0;
|
||||||
|
}// dlsch loop
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dump_pdsch_stats(PHY_VARS_gNB *gNB) {
|
||||||
|
|
||||||
|
for (int i=0;i<NUMBER_OF_NR_SCH_STATS_MAX;i++)
|
||||||
|
if (gNB->dlsch_stats[i].rnti > 0)
|
||||||
|
LOG_I(PHY,"DLSCH RNTI %x: round_trials %d(%1.1e):%d(%1.1e):%d(%1.1e):%d, current_Qm %d, current_RI %d, total_bytes TX %d\n",
|
||||||
|
gNB->dlsch_stats[i].rnti,
|
||||||
|
gNB->dlsch_stats[i].round_trials[0],
|
||||||
|
(double)gNB->dlsch_stats[i].round_trials[1]/gNB->dlsch_stats[i].round_trials[0],
|
||||||
|
gNB->dlsch_stats[i].round_trials[1],
|
||||||
|
(double)gNB->dlsch_stats[i].round_trials[2]/gNB->dlsch_stats[i].round_trials[0],
|
||||||
|
gNB->dlsch_stats[i].round_trials[2],
|
||||||
|
(double)gNB->dlsch_stats[i].round_trials[3]/gNB->dlsch_stats[i].round_trials[0],
|
||||||
|
gNB->dlsch_stats[i].round_trials[3],
|
||||||
|
gNB->dlsch_stats[i].current_Qm,
|
||||||
|
gNB->dlsch_stats[i].current_RI,
|
||||||
|
gNB->dlsch_stats[i].total_bytes_tx);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear_pdsch_stats(PHY_VARS_gNB *gNB) {
|
||||||
|
|
||||||
|
for (int i=0;i<NUMBER_OF_NR_DLSCH_MAX;i++)
|
||||||
|
memset((void*)&gNB->dlsch_stats[i],0,sizeof(gNB->dlsch_stats[i]));
|
||||||
|
}
|
||||||
|
|||||||
@@ -69,27 +69,9 @@ void nr_fill_dlsch(PHY_VARS_gNB *gNB,
|
|||||||
nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
|
nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
|
||||||
unsigned char *sdu);
|
unsigned char *sdu);
|
||||||
|
|
||||||
uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t *dlsch,
|
uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
||||||
uint32_t ***pdsch_dmrs,
|
int frame,
|
||||||
int32_t** txdataF,
|
int slot);
|
||||||
int16_t amp,
|
|
||||||
int frame,
|
|
||||||
uint8_t slot,
|
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
|
||||||
int xOverhead,
|
|
||||||
time_stats_t *dlsch_encoding_stats,
|
|
||||||
time_stats_t *dlsch_scrambling_stats,
|
|
||||||
time_stats_t *dlsch_modulation_stats,
|
|
||||||
time_stats_t *tinput,
|
|
||||||
time_stats_t *tprep,
|
|
||||||
time_stats_t *tparity,
|
|
||||||
time_stats_t *toutput,
|
|
||||||
time_stats_t *dlsch_rate_matching_stats,
|
|
||||||
time_stats_t *dlsch_interleaving_stats,
|
|
||||||
time_stats_t *dlsch_segmentation_stats);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, uint16_t N_RB);
|
void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, uint16_t N_RB);
|
||||||
|
|
||||||
void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch);
|
void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch);
|
||||||
@@ -98,7 +80,10 @@ void clean_gNB_ulsch(NR_gNB_ULSCH_t *ulsch);
|
|||||||
|
|
||||||
int16_t find_nr_dlsch(uint16_t rnti, PHY_VARS_gNB *gNB,find_type_t type);
|
int16_t find_nr_dlsch(uint16_t rnti, PHY_VARS_gNB *gNB,find_type_t type);
|
||||||
|
|
||||||
int nr_dlsch_encoding(unsigned char *a,int frame,
|
NR_gNB_SCH_STATS_t *find_nr_dlsch_stats(uint16_t rnti, PHY_VARS_gNB *gNB,find_type_t type);
|
||||||
|
|
||||||
|
int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
|
||||||
|
unsigned char *a,int frame,
|
||||||
uint8_t slot,
|
uint8_t slot,
|
||||||
NR_gNB_DLSCH_t *dlsch,
|
NR_gNB_DLSCH_t *dlsch,
|
||||||
NR_DL_FRAME_PARMS* frame_parms,
|
NR_DL_FRAME_PARMS* frame_parms,
|
||||||
@@ -113,4 +98,8 @@ int nr_dlsch_encoding(unsigned char *a,int frame,
|
|||||||
|
|
||||||
void nr_emulate_dlsch_payload(uint8_t* payload, uint16_t size);
|
void nr_emulate_dlsch_payload(uint8_t* payload, uint16_t size);
|
||||||
|
|
||||||
|
void dump_pdsch_stats(PHY_VARS_gNB *gNB);
|
||||||
|
|
||||||
|
void clear_pdsch_stats(PHY_VARS_gNB *gNB);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, uint16_t N_RB)
|
|||||||
|
|
||||||
if (N_RB != 273) {
|
if (N_RB != 273) {
|
||||||
a_segments = a_segments*N_RB;
|
a_segments = a_segments*N_RB;
|
||||||
a_segments = a_segments/273;
|
a_segments = a_segments/273 +1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -150,7 +150,7 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
|
|
||||||
if (N_RB != 273) {
|
if (N_RB != 273) {
|
||||||
a_segments = a_segments*N_RB;
|
a_segments = a_segments*N_RB;
|
||||||
a_segments = (a_segments + 272) / 273;
|
a_segments = a_segments/273 +1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t dlsch_bytes = a_segments*1056; // allocated bytes per segment
|
uint16_t dlsch_bytes = a_segments*1056; // allocated bytes per segment
|
||||||
@@ -309,7 +309,8 @@ void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int nr_dlsch_encoding(unsigned char *a,
|
int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
|
||||||
|
unsigned char *a,
|
||||||
int frame,
|
int frame,
|
||||||
uint8_t slot,
|
uint8_t slot,
|
||||||
NR_gNB_DLSCH_t *dlsch,
|
NR_gNB_DLSCH_t *dlsch,
|
||||||
@@ -326,7 +327,8 @@ int nr_dlsch_encoding(unsigned char *a,
|
|||||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &dlsch->harq_processes[harq_pid]->pdsch_pdu.pdsch_pdu_rel15;
|
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &dlsch->harq_processes[harq_pid]->pdsch_pdu.pdsch_pdu_rel15;
|
||||||
uint16_t nb_rb = rel15->rbSize;
|
uint16_t nb_rb = rel15->rbSize;
|
||||||
uint8_t nb_symb_sch = rel15->NrOfSymbols;
|
uint8_t nb_symb_sch = rel15->NrOfSymbols;
|
||||||
uint32_t A, Z, Kb, F=0;
|
uint32_t A, Kb, F=0;
|
||||||
|
static uint32_t Z = 0;
|
||||||
uint32_t *Zc = &Z;
|
uint32_t *Zc = &Z;
|
||||||
uint8_t mod_order = rel15->qamModOrder[0];
|
uint8_t mod_order = rel15->qamModOrder[0];
|
||||||
uint16_t Kr=0,r;
|
uint16_t Kr=0,r;
|
||||||
@@ -347,10 +349,34 @@ int nr_dlsch_encoding(unsigned char *a,
|
|||||||
float Coderate = 0.0;
|
float Coderate = 0.0;
|
||||||
uint8_t Nl = 4;
|
uint8_t Nl = 4;
|
||||||
|
|
||||||
|
dlsch->harq_processes[harq_pid]->round = nr_rv_round_map[rel15->rvIndex[0]];
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ENCODING, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ENCODING, VCD_FUNCTION_IN);
|
||||||
|
|
||||||
A = rel15->TBSize[0]<<3;
|
A = rel15->TBSize[0]<<3;
|
||||||
|
|
||||||
|
NR_gNB_SCH_STATS_t *stats=NULL;
|
||||||
|
int first_free=-1;
|
||||||
|
for (int i=0;i<NUMBER_OF_NR_SCH_STATS_MAX;i++) {
|
||||||
|
if (gNB->dlsch_stats[i].rnti == 0 && first_free == -1) {
|
||||||
|
first_free = i;
|
||||||
|
stats=&gNB->dlsch_stats[i];
|
||||||
|
}
|
||||||
|
if (gNB->dlsch_stats[i].rnti == dlsch->rnti) {
|
||||||
|
stats=&gNB->dlsch_stats[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stats) {
|
||||||
|
stats->round_trials[dlsch->harq_processes[harq_pid]->round]++;
|
||||||
|
stats->rnti = dlsch->rnti;
|
||||||
|
if (dlsch->harq_processes[harq_pid]->round == 0){
|
||||||
|
stats->total_bytes_tx += rel15->TBSize[0];
|
||||||
|
stats->current_RI = rel15->nrOfLayers;
|
||||||
|
stats->current_Qm = rel15->qamModOrder[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,rel15->nrOfLayers);
|
G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,rel15->nrOfLayers);
|
||||||
|
|
||||||
LOG_D(PHY,"dlsch coding A %d G %d mod_order %d\n", A,G, mod_order);
|
LOG_D(PHY,"dlsch coding A %d G %d mod_order %d\n", A,G, mod_order);
|
||||||
|
|||||||
@@ -255,27 +255,28 @@ void nr_emulate_dlsch_payload(uint8_t* pdu, uint16_t size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int16_t find_nr_dlsch(uint16_t rnti, PHY_VARS_gNB *gNB,find_type_t type) {
|
int16_t find_nr_dlsch(uint16_t rnti, PHY_VARS_gNB *gNB,find_type_t type) {
|
||||||
|
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
int16_t first_free_index=-1;
|
int16_t first_free_index=-1;
|
||||||
|
|
||||||
AssertFatal(gNB!=NULL,"gNB is null\n");
|
AssertFatal(gNB!=NULL,"gNB is null\n");
|
||||||
for (i=0; i<NUMBER_OF_NR_DLSCH_MAX; i++) {
|
for (i=0; i<NUMBER_OF_NR_DLSCH_MAX; i++) {
|
||||||
AssertFatal(gNB->dlsch[i]!=NULL,"gNB->dlsch[%d] is null\n",i);
|
AssertFatal(gNB->dlsch[i]!=NULL,"gNB->dlsch[%d] is null\n",i);
|
||||||
AssertFatal(gNB->dlsch[i][0]!=NULL,"gNB->dlsch[%d][0] is null\n",i);
|
AssertFatal(gNB->dlsch[i][0]!=NULL,"gNB->dlsch[%d][0] is null\n",i);
|
||||||
LOG_D(PHY,"searching for rnti %x : dlsch_index %d=> harq_mask %x, rnti %x, first_free_index %d\n", rnti,i,gNB->dlsch[i][0]->harq_mask,gNB->dlsch[i][0]->rnti,first_free_index);
|
LOG_D(PHY,"searching for rnti %x : dlsch_index %d=> harq_mask %x, rnti %x, first_free_index %d\n", rnti,i,
|
||||||
if ((gNB->dlsch[i][0]->harq_mask >0) &&
|
gNB->dlsch[i][0]->harq_mask,gNB->dlsch[i][0]->rnti,first_free_index);
|
||||||
(gNB->dlsch[i][0]->rnti==rnti)) return i;
|
if ((gNB->dlsch[i][0]->harq_mask >0) &&
|
||||||
else if ((gNB->dlsch[i][0]->harq_mask == 0) && (first_free_index==-1)) first_free_index=i;
|
(gNB->dlsch[i][0]->rnti==rnti)) return i;
|
||||||
}
|
else if ((gNB->dlsch[i][0]->harq_mask == 0) && (first_free_index==-1)) first_free_index=i;
|
||||||
if (type == SEARCH_EXIST) return -1;
|
}
|
||||||
if (first_free_index != -1)
|
if (type == SEARCH_EXIST) return -1;
|
||||||
gNB->dlsch[first_free_index][0]->rnti = 0;
|
if (first_free_index != -1)
|
||||||
return first_free_index;
|
gNB->dlsch[first_free_index][0]->rnti = 0;
|
||||||
|
return first_free_index;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void nr_fill_dlsch(PHY_VARS_gNB *gNB,
|
void nr_fill_dlsch(PHY_VARS_gNB *gNB,
|
||||||
int frame,
|
int frame,
|
||||||
int slot,
|
int slot,
|
||||||
@@ -291,7 +292,7 @@ void nr_fill_dlsch(PHY_VARS_gNB *gNB,
|
|||||||
NR_DL_gNB_HARQ_t **harq = dlsch->harq_processes;
|
NR_DL_gNB_HARQ_t **harq = dlsch->harq_processes;
|
||||||
/// DLSCH struct
|
/// DLSCH struct
|
||||||
memcpy((void*)&harq[dlsch->harq_ids[frame%2][slot]]->pdsch_pdu, (void*)pdsch_pdu, sizeof(nfapi_nr_dl_tti_pdsch_pdu));
|
memcpy((void*)&harq[dlsch->harq_ids[frame%2][slot]]->pdsch_pdu, (void*)pdsch_pdu, sizeof(nfapi_nr_dl_tti_pdsch_pdu));
|
||||||
gNB->num_pdsch_rnti++;
|
gNB->num_pdsch_rnti[slot]++;
|
||||||
AssertFatal(sdu!=NULL,"sdu is null\n");
|
AssertFatal(sdu!=NULL,"sdu is null\n");
|
||||||
harq[dlsch->harq_ids[frame%2][slot]]->pdu = sdu;
|
harq[dlsch->harq_ids[frame%2][slot]]->pdu = sdu;
|
||||||
|
|
||||||
|
|||||||
@@ -342,6 +342,11 @@ void nr_decode_pucch1(int32_t **rxdataF,
|
|||||||
uint8_t timeDomainOCC,
|
uint8_t timeDomainOCC,
|
||||||
uint8_t nr_bit);
|
uint8_t nr_bit);
|
||||||
|
|
||||||
|
void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
||||||
|
int slot,
|
||||||
|
nfapi_nr_uci_pucch_pdu_format_2_3_4_t* uci_pdu,
|
||||||
|
nfapi_nr_pucch_pdu_t* pucch_pdu);
|
||||||
|
|
||||||
void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||||
int slot,
|
int slot,
|
||||||
nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu,
|
nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu,
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
|
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
|
||||||
#include "PHY/NR_TRANSPORT/nr_ulsch.h"
|
#include "PHY/NR_TRANSPORT/nr_ulsch.h"
|
||||||
#include "PHY/LTE_REFSIG/lte_refsig.h"
|
#include "PHY/NR_REFSIG/nr_refsig.h"
|
||||||
|
|
||||||
int16_t find_nr_ulsch(uint16_t rnti, PHY_VARS_gNB *gNB,find_type_t type) {
|
int16_t find_nr_ulsch(uint16_t rnti, PHY_VARS_gNB *gNB,find_type_t type) {
|
||||||
|
|
||||||
@@ -103,3 +103,62 @@ void nr_ulsch_unscrambling(int16_t* llr,
|
|||||||
llr[i] = -llr[i];
|
llr[i] = -llr[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nr_ulsch_unscrambling_optim(int16_t* llr,
|
||||||
|
uint32_t size,
|
||||||
|
uint8_t q,
|
||||||
|
uint32_t Nid,
|
||||||
|
uint32_t n_RNTI) {
|
||||||
|
|
||||||
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
|
uint32_t x1, x2, s=0;
|
||||||
|
|
||||||
|
x2 = (n_RNTI<<15) + Nid;
|
||||||
|
|
||||||
|
uint8_t *s8=(uint8_t *)&s;
|
||||||
|
__m128i *llr128 = (__m128i*)llr;
|
||||||
|
int j=0;
|
||||||
|
s = lte_gold_generic(&x1, &x2, 1);
|
||||||
|
|
||||||
|
for (int i=0; i<((size>>5)+((size&0x1f) > 0 ? 1 : 0)); i++,j+=4) {
|
||||||
|
llr128[j] = _mm_mullo_epi16(llr128[j],byte2m128i[s8[0]]);
|
||||||
|
llr128[j+1] = _mm_mullo_epi16(llr128[j+1],byte2m128i[s8[1]]);
|
||||||
|
llr128[j+2] = _mm_mullo_epi16(llr128[j+2],byte2m128i[s8[2]]);
|
||||||
|
llr128[j+3] = _mm_mullo_epi16(llr128[j+3],byte2m128i[s8[3]]);
|
||||||
|
s = lte_gold_generic(&x1, &x2, 0);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
nr_ulsch_unscrambling(llr,
|
||||||
|
size,
|
||||||
|
q,
|
||||||
|
Nid,
|
||||||
|
n_RNTI);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_pusch_stats(PHY_VARS_gNB *gNB) {
|
||||||
|
|
||||||
|
for (int i=0;i<NUMBER_OF_NR_ULSCH_MAX;i++)
|
||||||
|
if (gNB->ulsch_stats[i].rnti>0)
|
||||||
|
LOG_I(PHY,"ULSCH RNTI %x: round_trials %d(%1.1e):%d(%1.1e):%d(%1.1e):%d, current_Qm %d, current_RI %d, total_bytes RX/SCHED %d/%d\n",
|
||||||
|
gNB->ulsch_stats[i].rnti,
|
||||||
|
gNB->ulsch_stats[i].round_trials[0],
|
||||||
|
(double)gNB->ulsch_stats[i].round_trials[1]/gNB->ulsch_stats[i].round_trials[0],
|
||||||
|
gNB->ulsch_stats[i].round_trials[1],
|
||||||
|
(double)gNB->ulsch_stats[i].round_trials[2]/gNB->ulsch_stats[i].round_trials[0],
|
||||||
|
gNB->ulsch_stats[i].round_trials[2],
|
||||||
|
(double)gNB->ulsch_stats[i].round_trials[3]/gNB->ulsch_stats[i].round_trials[0],
|
||||||
|
gNB->ulsch_stats[i].round_trials[3],
|
||||||
|
gNB->ulsch_stats[i].current_Qm,
|
||||||
|
gNB->ulsch_stats[i].current_RI,
|
||||||
|
gNB->ulsch_stats[i].total_bytes_rx,
|
||||||
|
gNB->ulsch_stats[i].total_bytes_tx);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear_pusch_stats(PHY_VARS_gNB *gNB) {
|
||||||
|
|
||||||
|
for (int i=0;i<NUMBER_OF_NR_ULSCH_MAX;i++)
|
||||||
|
memset((void*)&gNB->ulsch_stats[i],0,sizeof(gNB->ulsch_stats[i]));
|
||||||
|
}
|
||||||
|
|||||||
@@ -75,9 +75,19 @@ void nr_ulsch_unscrambling(int16_t* llr,
|
|||||||
uint32_t n_RNTI);
|
uint32_t n_RNTI);
|
||||||
|
|
||||||
|
|
||||||
|
void nr_ulsch_unscrambling_optim(int16_t* llr,
|
||||||
|
uint32_t size,
|
||||||
|
uint8_t q,
|
||||||
|
uint32_t Nid,
|
||||||
|
uint32_t n_RNTI);
|
||||||
|
|
||||||
void nr_ulsch_procedures(PHY_VARS_gNB *gNB,
|
void nr_ulsch_procedures(PHY_VARS_gNB *gNB,
|
||||||
int frame_rx,
|
int frame_rx,
|
||||||
int slot_rx,
|
int slot_rx,
|
||||||
int UE_id,
|
int UE_id,
|
||||||
uint8_t harq_pid);
|
uint8_t harq_pid);
|
||||||
int16_t find_nr_ulsch(uint16_t rnti, PHY_VARS_gNB *gNB,find_type_t type);
|
int16_t find_nr_ulsch(uint16_t rnti, PHY_VARS_gNB *gNB,find_type_t type);
|
||||||
|
|
||||||
|
void dump_pusch_stats(PHY_VARS_gNB *gNB);
|
||||||
|
|
||||||
|
void clear_pusch_stats(PHY_VARS_gNB *gNB);
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ void free_gNB_ulsch(NR_gNB_ULSCH_t **ulschptr,uint8_t N_RB_UL)
|
|||||||
if (ulsch) {
|
if (ulsch) {
|
||||||
if (N_RB_UL != 273) {
|
if (N_RB_UL != 273) {
|
||||||
a_segments = a_segments*N_RB_UL;
|
a_segments = a_segments*N_RB_UL;
|
||||||
a_segments = a_segments/273;
|
a_segments = a_segments/273 +1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -119,11 +119,10 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations,uint16_t N_RB_UL, uint
|
|||||||
|
|
||||||
if (N_RB_UL != 273) {
|
if (N_RB_UL != 273) {
|
||||||
a_segments = a_segments*N_RB_UL;
|
a_segments = a_segments*N_RB_UL;
|
||||||
a_segments = a_segments/273;
|
a_segments = a_segments/273 +1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t ulsch_bytes = a_segments*1056; // allocated bytes per segment
|
uint16_t ulsch_bytes = a_segments*1056; // allocated bytes per segment
|
||||||
|
|
||||||
ulsch = (NR_gNB_ULSCH_t *)malloc16(sizeof(NR_gNB_ULSCH_t));
|
ulsch = (NR_gNB_ULSCH_t *)malloc16(sizeof(NR_gNB_ULSCH_t));
|
||||||
|
|
||||||
if (ulsch) {
|
if (ulsch) {
|
||||||
@@ -209,8 +208,6 @@ void clean_gNB_ulsch(NR_gNB_ULSCH_t *ulsch)
|
|||||||
ulsch->Mlimit = 0;
|
ulsch->Mlimit = 0;
|
||||||
ulsch->max_ldpc_iterations = 0;
|
ulsch->max_ldpc_iterations = 0;
|
||||||
ulsch->last_iteration_cnt = 0;
|
ulsch->last_iteration_cnt = 0;
|
||||||
ulsch->num_active_cba_groups = 0;
|
|
||||||
for (i=0;i<NUM_MAX_CBA_GROUP;i++) ulsch->cba_rnti[i] = 0;
|
|
||||||
for (i=0;i<NR_MAX_SLOTS_PER_FRAME;i++) ulsch->harq_process_id[i] = 0;
|
for (i=0;i<NR_MAX_SLOTS_PER_FRAME;i++) ulsch->harq_process_id[i] = 0;
|
||||||
|
|
||||||
for (i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) {
|
for (i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) {
|
||||||
@@ -226,7 +223,6 @@ void clean_gNB_ulsch(NR_gNB_ULSCH_t *ulsch)
|
|||||||
ulsch->harq_processes[i]->rar_alloc=0;
|
ulsch->harq_processes[i]->rar_alloc=0;
|
||||||
ulsch->harq_processes[i]->status=NR_SCH_IDLE;
|
ulsch->harq_processes[i]->status=NR_SCH_IDLE;
|
||||||
ulsch->harq_processes[i]->subframe_scheduling_flag=0;
|
ulsch->harq_processes[i]->subframe_scheduling_flag=0;
|
||||||
ulsch->harq_processes[i]->subframe_cba_scheduling_flag=0;
|
|
||||||
ulsch->harq_processes[i]->phich_active=0;
|
ulsch->harq_processes[i]->phich_active=0;
|
||||||
ulsch->harq_processes[i]->phich_ACK=0;
|
ulsch->harq_processes[i]->phich_ACK=0;
|
||||||
ulsch->harq_processes[i]->previous_first_rb=0;
|
ulsch->harq_processes[i]->previous_first_rb=0;
|
||||||
@@ -290,7 +286,7 @@ void clean_gNB_ulsch(NR_gNB_ULSCH_t *ulsch)
|
|||||||
static uint32_t prnt_crc_cnt = 0;
|
static uint32_t prnt_crc_cnt = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
uint32_t nr_ulsch_decoding(PHY_VARS_gNB *gNB,
|
||||||
uint8_t UE_id,
|
uint8_t UE_id,
|
||||||
short *ulsch_llr,
|
short *ulsch_llr,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
@@ -312,7 +308,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
NR_gNB_ULSCH_t *ulsch = phy_vars_gNB->ulsch[UE_id][0];
|
NR_gNB_ULSCH_t *ulsch = gNB->ulsch[UE_id][0];
|
||||||
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
|
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
|
||||||
|
|
||||||
t_nrLDPC_dec_params decParams;
|
t_nrLDPC_dec_params decParams;
|
||||||
@@ -360,28 +356,21 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_ULSCH_DECODING,1);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_ULSCH_DECODING,1);
|
||||||
harq_process->TBS = pusch_pdu->pusch_data.tb_size;
|
harq_process->TBS = pusch_pdu->pusch_data.tb_size;
|
||||||
|
harq_process->round = nr_rv_round_map[pusch_pdu->pusch_data.rv_index];
|
||||||
|
|
||||||
A = (harq_process->TBS)<<3;
|
A = (harq_process->TBS)<<3;
|
||||||
ret = ulsch->max_ldpc_iterations + 1;
|
ret = ulsch->max_ldpc_iterations + 1;
|
||||||
|
|
||||||
LOG_D(PHY,"ULSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_rb %d, Qm %d, n_layers %d\n",harq_pid,A,G, mcs, n_layers, nb_rb, Qm, n_layers);
|
LOG_D(PHY,"ULSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_rb %d, Qm %d, n_layers %d\n",harq_pid,A,G, mcs, n_layers, nb_rb, Qm, n_layers);
|
||||||
|
|
||||||
if (harq_process->round == 0) {
|
if (R<1024)
|
||||||
|
Coderate = (float) R /(float) 1024;
|
||||||
// This is a new packet, so compute quantities regarding segmentation
|
else
|
||||||
if (A > 3824)
|
Coderate = (float) R /(float) 2048;
|
||||||
harq_process->B = A+24;
|
|
||||||
else
|
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25){
|
||||||
harq_process->B = A+16;
|
p_decParams->BG = 2;
|
||||||
|
if (Coderate < 0.3333) {
|
||||||
if (R<1024)
|
|
||||||
Coderate = (float) R /(float) 1024;
|
|
||||||
else
|
|
||||||
Coderate = (float) R /(float) 2048;
|
|
||||||
|
|
||||||
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25){
|
|
||||||
p_decParams->BG = 2;
|
|
||||||
if (Coderate < 0.3333) {
|
|
||||||
p_decParams->R = 15;
|
p_decParams->R = 15;
|
||||||
kc = 52;
|
kc = 52;
|
||||||
}
|
}
|
||||||
@@ -408,6 +397,34 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
kc = 27;
|
kc = 27;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NR_gNB_SCH_STATS_t *stats=NULL;
|
||||||
|
int first_free=-1;
|
||||||
|
for (int i=0;i<NUMBER_OF_NR_SCH_STATS_MAX;i++) {
|
||||||
|
if (gNB->ulsch_stats[i].rnti == 0 && first_free == -1) {
|
||||||
|
first_free = i;
|
||||||
|
stats=&gNB->ulsch_stats[i];
|
||||||
|
}
|
||||||
|
if (gNB->ulsch_stats[i].rnti == ulsch->rnti) {
|
||||||
|
stats=&gNB->ulsch_stats[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (stats) {
|
||||||
|
stats->rnti = ulsch->rnti;
|
||||||
|
stats->round_trials[harq_process->round]++;
|
||||||
|
}
|
||||||
|
if (harq_process->round == 0) {
|
||||||
|
if (stats) {
|
||||||
|
stats->current_Qm = Qm;
|
||||||
|
stats->current_RI = n_layers;
|
||||||
|
stats->total_bytes_tx += harq_process->TBS;
|
||||||
|
}
|
||||||
|
// This is a new packet, so compute quantities regarding segmentation
|
||||||
|
if (A > 3824)
|
||||||
|
harq_process->B = A+24;
|
||||||
|
else
|
||||||
|
harq_process->B = A+16;
|
||||||
|
|
||||||
// [hna] Perform nr_segmenation with input and output set to NULL to calculate only (B, C, K, Z, F)
|
// [hna] Perform nr_segmenation with input and output set to NULL to calculate only (B, C, K, Z, F)
|
||||||
nr_segmentation(NULL,
|
nr_segmentation(NULL,
|
||||||
@@ -438,7 +455,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
|
|
||||||
if (nb_rb != 273) {
|
if (nb_rb != 273) {
|
||||||
a_segments = a_segments*nb_rb;
|
a_segments = a_segments*nb_rb;
|
||||||
a_segments = a_segments/273;
|
a_segments = a_segments/273 +1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (harq_process->C > a_segments) {
|
if (harq_process->C > a_segments) {
|
||||||
@@ -460,7 +477,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
E = nr_get_E(G, harq_process->C, Qm, n_layers, r);
|
E = nr_get_E(G, harq_process->C, Qm, n_layers, r);
|
||||||
|
|
||||||
|
|
||||||
start_meas(&phy_vars_gNB->ulsch_deinterleaving_stats);
|
start_meas(&gNB->ulsch_deinterleaving_stats);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
///////////////////////////////// nr_deinterleaving_ldpc ///////////////////////////////////
|
///////////////////////////////// nr_deinterleaving_ldpc ///////////////////////////////////
|
||||||
@@ -476,11 +493,10 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
//for (int i =0; i<16; i++)
|
//for (int i =0; i<16; i++)
|
||||||
// printf("rx output deinterleaving w[%d]= %d r_offset %d\n", i,harq_process->w[r][i], r_offset);
|
// printf("rx output deinterleaving w[%d]= %d r_offset %d\n", i,harq_process->w[r][i], r_offset);
|
||||||
|
|
||||||
stop_meas(&phy_vars_gNB->ulsch_deinterleaving_stats);
|
stop_meas(&gNB->ulsch_deinterleaving_stats);
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG_ULSCH_DECODING
|
LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rvidx %d, round %d)...\n",
|
||||||
LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
|
|
||||||
harq_pid,r, G,
|
harq_pid,r, G,
|
||||||
Kr*3,
|
Kr*3,
|
||||||
harq_process->TBS,
|
harq_process->TBS,
|
||||||
@@ -489,7 +505,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
n_layers,
|
n_layers,
|
||||||
pusch_pdu->pusch_data.rv_index,
|
pusch_pdu->pusch_data.rv_index,
|
||||||
harq_process->round);
|
harq_process->round);
|
||||||
#endif
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
@@ -499,7 +514,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
|
|
||||||
///////////////////////// harq_process->e =====> harq_process->d /////////////////////////
|
///////////////////////// harq_process->e =====> harq_process->d /////////////////////////
|
||||||
|
|
||||||
start_meas(&phy_vars_gNB->ulsch_rate_unmatching_stats);
|
start_meas(&gNB->ulsch_rate_unmatching_stats);
|
||||||
|
|
||||||
Tbslbrm = nr_compute_tbslbrm(0,nb_rb,n_layers,harq_process->C);
|
Tbslbrm = nr_compute_tbslbrm(0,nb_rb,n_layers,harq_process->C);
|
||||||
|
|
||||||
@@ -516,12 +531,12 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
harq_process->F,
|
harq_process->F,
|
||||||
Kr-harq_process->F-2*(p_decParams->Z))==-1) {
|
Kr-harq_process->F-2*(p_decParams->Z))==-1) {
|
||||||
|
|
||||||
stop_meas(&phy_vars_gNB->ulsch_rate_unmatching_stats);
|
stop_meas(&gNB->ulsch_rate_unmatching_stats);
|
||||||
|
|
||||||
LOG_E(PHY,"ulsch_decoding.c: Problem in rate_matching\n");
|
LOG_E(PHY,"ulsch_decoding.c: Problem in rate_matching\n");
|
||||||
return (ulsch->max_ldpc_iterations + 1);
|
return (ulsch->max_ldpc_iterations + 1);
|
||||||
} else {
|
} else {
|
||||||
stop_meas(&phy_vars_gNB->ulsch_rate_unmatching_stats);
|
stop_meas(&gNB->ulsch_rate_unmatching_stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
r_offset += E;
|
r_offset += E;
|
||||||
@@ -559,7 +574,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
|
|
||||||
if (err_flag == 0) {
|
if (err_flag == 0) {
|
||||||
|
|
||||||
start_meas(&phy_vars_gNB->ulsch_ldpc_decoding_stats);
|
start_meas(&gNB->ulsch_ldpc_decoding_stats);
|
||||||
|
|
||||||
//LOG_E(PHY,"AbsSubframe %d.%d Start LDPC segment %d/%d A %d ",frame%1024,nr_tti_rx,r,harq_process->C-1, A);
|
//LOG_E(PHY,"AbsSubframe %d.%d Start LDPC segment %d/%d A %d ",frame%1024,nr_tti_rx,r,harq_process->C-1, A);
|
||||||
|
|
||||||
@@ -573,7 +588,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
|
|
||||||
AssertFatal(kc!=255,"");
|
AssertFatal(kc!=255,"");
|
||||||
j+=(harq_process->F>>3);
|
j+=(harq_process->F>>3);
|
||||||
// for (i=Kr_bytes,j=K_bytes_F-((2*p_decParams->Z)>>3); i < ((kc*p_decParams->Z)>>3); i++, j++) {
|
|
||||||
for (i=Kr_bytes; i < ((kc*p_decParams->Z)>>3); i++, j++) {
|
for (i=Kr_bytes; i < ((kc*p_decParams->Z)>>3); i++, j++) {
|
||||||
pv[i]= _mm_loadu_si128((__m128i*)(&harq_process->d[r][8*j]));
|
pv[i]= _mm_loadu_si128((__m128i*)(&harq_process->d[r][8*j]));
|
||||||
}
|
}
|
||||||
@@ -628,7 +642,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
//write_output("dec_output.m","dec0",harq_process->c[0],Kr_bytes,1,4);
|
//write_output("dec_output.m","dec0",harq_process->c[0],Kr_bytes,1,4);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
stop_meas(&phy_vars_gNB->ulsch_ldpc_decoding_stats);
|
stop_meas(&gNB->ulsch_ldpc_decoding_stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((err_flag == 0) && (ret >= (ulsch->max_ldpc_iterations + 1))) {
|
if ((err_flag == 0) && (ret >= (ulsch->max_ldpc_iterations + 1))) {
|
||||||
@@ -651,7 +665,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
|
|
||||||
#ifdef gNB_DEBUG_TRACE
|
#ifdef gNB_DEBUG_TRACE
|
||||||
LOG_I(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) Kr %d r %d\n",
|
LOG_I(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) Kr %d r %d\n",
|
||||||
phy_vars_gNB->Mod_id, frame, nr_tti_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,Kr,r);
|
gNB->Mod_id, frame, nr_tti_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,Kr,r);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// harq_process->harq_ack.ack = 0;
|
// harq_process->harq_ack.ack = 0;
|
||||||
@@ -668,7 +682,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// LOG_D(PHY,"[gNB %d] ULSCH: Setting NACK for nr_tti_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
|
// LOG_D(PHY,"[gNB %d] ULSCH: Setting NACK for nr_tti_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
|
||||||
// phy_vars_gNB->Mod_id,nr_tti_rx,harq_pid,harq_process->status,harq_process->round,ulsch->Mlimit,harq_process->TBS);
|
// gNB->Mod_id,nr_tti_rx,harq_pid,harq_process->status,harq_process->round,ulsch->Mlimit,harq_process->TBS);
|
||||||
|
|
||||||
harq_process->handled = 1;
|
harq_process->handled = 1;
|
||||||
ret = ulsch->max_ldpc_iterations + 1;
|
ret = ulsch->max_ldpc_iterations + 1;
|
||||||
@@ -677,18 +691,18 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
|
|
||||||
#ifdef gNB_DEBUG_TRACE
|
#ifdef gNB_DEBUG_TRACE
|
||||||
LOG_I(PHY,"[gNB %d] ULSCH: Setting ACK for nr_tti_rx %d TBS %d\n",
|
LOG_I(PHY,"[gNB %d] ULSCH: Setting ACK for nr_tti_rx %d TBS %d\n",
|
||||||
phy_vars_gNB->Mod_id,nr_tti_rx,harq_process->TBS);
|
gNB->Mod_id,nr_tti_rx,harq_process->TBS);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
harq_process->status = SCH_IDLE;
|
harq_process->status = SCH_IDLE;
|
||||||
harq_process->round = 0;
|
harq_process->round = 0;
|
||||||
// harq_process->handled = 0;
|
// harq_process->handled = 0;
|
||||||
ulsch->harq_mask &= ~(1 << harq_pid);
|
ulsch->harq_mask &= ~(1 << harq_pid);
|
||||||
// harq_process->harq_ack.ack = 1;
|
// harq_process->harq_ack.ack = 1;
|
||||||
// harq_process->harq_ack.harq_id = harq_pid;
|
// harq_process->harq_ack.harq_id = harq_pid;
|
||||||
// harq_process->harq_ack.send_harq_status = 1;
|
// harq_process->harq_ack.send_harq_status = 1;
|
||||||
|
|
||||||
// LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for nr_tti_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_gNB->Mod_id,nr_tti_rx,harq_pid,harq_process->round,harq_process->TBS);
|
// LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for nr_tti_rx %d (pid %d, round %d, TBS %d)\n",gNB->Mod_id,nr_tti_rx,harq_pid,harq_process->round,harq_process->TBS);
|
||||||
|
|
||||||
|
|
||||||
// Reassembly of Transport block here
|
// Reassembly of Transport block here
|
||||||
@@ -711,11 +725,12 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
if (stats) stats->total_bytes_rx += harq_process->TBS;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_ULSCH_DECODING
|
#ifdef DEBUG_ULSCH_DECODING
|
||||||
LOG_I(PHY, "Decoder output (payload) at SFN/SF: %d/%d \n", frame, nr_tti_rx);
|
LOG_I(PHY, "Decoder output (payload) at SFN/SF: %d/%d TBS: %d\n", frame, nr_tti_rx,harq_process->TBS);
|
||||||
for (i = 0; i < harq_process->TBS ; i++) {
|
for (i = 0; i < harq_process->TBS; i++) {
|
||||||
//harq_process_ul_ue->a[i] = (unsigned char) rand();
|
//harq_process_ul_ue->a[i] = (unsigned char) rand();
|
||||||
//printf("a[%d]=0x%02x\n",i,harq_process_ul_ue->a[i]);
|
//printf("a[%d]=0x%02x\n",i,harq_process_ul_ue->a[i]);
|
||||||
printf("%02x ",harq_process->b[i]);
|
printf("%02x ",harq_process->b[i]);
|
||||||
|
|||||||
@@ -232,18 +232,13 @@ void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
|
|||||||
|
|
||||||
unsigned short start_re, re, nb_re_pusch;
|
unsigned short start_re, re, nb_re_pusch;
|
||||||
unsigned char aarx;
|
unsigned char aarx;
|
||||||
uint8_t K_ptrs = 0;
|
|
||||||
uint32_t rxF_ext_index = 0;
|
uint32_t rxF_ext_index = 0;
|
||||||
uint32_t ul_ch0_ext_index = 0;
|
uint32_t ul_ch0_ext_index = 0;
|
||||||
uint32_t ul_ch0_index = 0;
|
uint32_t ul_ch0_index = 0;
|
||||||
uint32_t ul_ch0_ptrs_ext_index = 0;
|
uint8_t k_prime;
|
||||||
uint32_t ul_ch0_ptrs_index = 0;
|
uint16_t n;
|
||||||
uint8_t is_ptrs_symbol_flag,k_prime;
|
|
||||||
uint16_t n=0, num_ptrs_symbols;
|
|
||||||
int16_t *rxF,*rxF_ext;
|
int16_t *rxF,*rxF_ext;
|
||||||
int *ul_ch0,*ul_ch0_ext;
|
int *ul_ch0,*ul_ch0_ext;
|
||||||
int *ul_ch0_ptrs,*ul_ch0_ptrs_ext;
|
|
||||||
uint16_t n_rnti = pusch_pdu->rnti;
|
|
||||||
uint8_t delta = 0;
|
uint8_t delta = 0;
|
||||||
|
|
||||||
#ifdef DEBUG_RB_EXT
|
#ifdef DEBUG_RB_EXT
|
||||||
@@ -252,84 +247,74 @@ void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
|
|||||||
printf("--------------------ch_ext_index = %d-----------------------\n", symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size);
|
printf("--------------------ch_ext_index = %d-----------------------\n", symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint8_t is_dmrs_re;
|
uint8_t is_dmrs_re;
|
||||||
start_re = (frame_parms->first_carrier_offset + (pusch_pdu->rb_start * NR_NB_SC_PER_RB))%frame_parms->ofdm_symbol_size;
|
start_re = (frame_parms->first_carrier_offset + (pusch_pdu->rb_start * NR_NB_SC_PER_RB))%frame_parms->ofdm_symbol_size;
|
||||||
nb_re_pusch = NR_NB_SC_PER_RB * pusch_pdu->rb_size;
|
nb_re_pusch = NR_NB_SC_PER_RB * pusch_pdu->rb_size;
|
||||||
is_ptrs_symbol_flag = 0;
|
#ifdef __AVX2__
|
||||||
num_ptrs_symbols = 0;
|
int nb_re_pusch2 = nb_re_pusch + (nb_re_pusch&7);
|
||||||
|
#else
|
||||||
|
int nb_re_pusch2 = nb_re_pusch;
|
||||||
|
#endif
|
||||||
|
|
||||||
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
||||||
|
|
||||||
rxF = (int16_t *)&rxdataF[aarx][symbol * frame_parms->ofdm_symbol_size];
|
rxF = (int16_t *)&rxdataF[aarx][symbol * frame_parms->ofdm_symbol_size];
|
||||||
rxF_ext = (int16_t *)&pusch_vars->rxdataF_ext[aarx][symbol * nb_re_pusch]; // [hna] rxdataF_ext isn't contiguous in order to solve an alignment problem ib llr computation in case of mod_order = 4, 6
|
rxF_ext = (int16_t *)&pusch_vars->rxdataF_ext[aarx][symbol * nb_re_pusch2]; // [hna] rxdataF_ext isn't contiguous in order to solve an alignment problem ib llr computation in case of mod_order = 4, 6
|
||||||
|
|
||||||
ul_ch0 = &pusch_vars->ul_ch_estimates[aarx][pusch_vars->dmrs_symbol*frame_parms->ofdm_symbol_size]; // update channel estimates if new dmrs symbol are available
|
ul_ch0 = &pusch_vars->ul_ch_estimates[aarx][pusch_vars->dmrs_symbol*frame_parms->ofdm_symbol_size]; // update channel estimates if new dmrs symbol are available
|
||||||
|
|
||||||
ul_ch0_ext = &pusch_vars->ul_ch_estimates_ext[aarx][symbol*nb_re_pusch];
|
ul_ch0_ext = &pusch_vars->ul_ch_estimates_ext[aarx][symbol*nb_re_pusch2];
|
||||||
|
|
||||||
ul_ch0_ptrs = &pusch_vars->ul_ch_ptrs_estimates[aarx][pusch_vars->ptrs_symbol_index*frame_parms->ofdm_symbol_size]; // update channel estimates if new dmrs symbol are available
|
|
||||||
|
|
||||||
ul_ch0_ptrs_ext = &pusch_vars->ul_ch_ptrs_estimates_ext[aarx][symbol*nb_re_pusch];
|
|
||||||
|
|
||||||
n = 0;
|
n = 0;
|
||||||
k_prime = 0;
|
k_prime = 0;
|
||||||
|
|
||||||
for (re = 0; re < nb_re_pusch; re++) {
|
if (is_dmrs_symbol == 0) {
|
||||||
|
//
|
||||||
if (is_dmrs_symbol)
|
//rxF[ ((start_re + re)*2) % (frame_parms->ofdm_symbol_size*2)]);
|
||||||
is_dmrs_re = (re == get_dmrs_freq_idx_ul(n, k_prime, delta, pusch_pdu->dmrs_config_type));
|
if (start_re + nb_re_pusch < frame_parms->ofdm_symbol_size) {
|
||||||
else
|
memcpy1((void*)rxF_ext,
|
||||||
is_dmrs_re = 0;
|
(void*)&rxF[start_re*2],
|
||||||
|
nb_re_pusch*sizeof(int32_t));
|
||||||
if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
|
|
||||||
K_ptrs = (pusch_pdu->pusch_ptrs.ptrs_freq_density)?4:2;
|
|
||||||
if(is_ptrs_symbol(symbol, pusch_vars->ptrs_symbols))
|
|
||||||
is_ptrs_symbol_flag = is_ptrs_subcarrier((start_re + re) % frame_parms->ofdm_symbol_size,
|
|
||||||
n_rnti,
|
|
||||||
aarx,
|
|
||||||
pusch_pdu->dmrs_config_type,
|
|
||||||
K_ptrs,
|
|
||||||
pusch_pdu->rb_size,
|
|
||||||
pusch_pdu->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset,
|
|
||||||
start_re,
|
|
||||||
frame_parms->ofdm_symbol_size);
|
|
||||||
|
|
||||||
if (is_ptrs_symbol_flag == 1)
|
|
||||||
num_ptrs_symbols++;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DEBUG_RB_EXT
|
|
||||||
printf("re = %d, is_ptrs_symbol_flag = %d, symbol = %d\n", re, is_ptrs_symbol_flag, symbol);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ( is_dmrs_re == 0 && is_ptrs_symbol_flag == 0) {
|
|
||||||
|
|
||||||
rxF_ext[rxF_ext_index] = (rxF[ ((start_re + re)*2) % (frame_parms->ofdm_symbol_size*2)]);
|
|
||||||
rxF_ext[rxF_ext_index + 1] = (rxF[(((start_re + re)*2) + 1) % (frame_parms->ofdm_symbol_size*2)]);
|
|
||||||
ul_ch0_ext[ul_ch0_ext_index] = ul_ch0[ul_ch0_index];
|
|
||||||
ul_ch0_ptrs_ext[ul_ch0_ptrs_ext_index] = ul_ch0_ptrs[ul_ch0_ptrs_index];
|
|
||||||
|
|
||||||
#ifdef DEBUG_RB_EXT
|
|
||||||
printf("rxF_ext[%d] = (%d,%d)\n", rxF_ext_index>>1, rxF_ext[rxF_ext_index],rxF_ext[rxF_ext_index+1]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ul_ch0_ext_index++;
|
|
||||||
ul_ch0_ptrs_ext_index++;
|
|
||||||
rxF_ext_index +=2;
|
|
||||||
} else {
|
} else {
|
||||||
k_prime++;
|
int neg_length = frame_parms->ofdm_symbol_size-start_re;
|
||||||
k_prime&=1;
|
int pos_length = nb_re_pusch-neg_length;
|
||||||
n+=(k_prime)?0:1;
|
|
||||||
|
memcpy1((void*)rxF_ext,(void*)&rxF[start_re*2],neg_length*sizeof(int32_t));
|
||||||
|
memcpy1((void*)&rxF_ext[2*neg_length],(void*)rxF,pos_length*sizeof(int32_t));
|
||||||
|
}
|
||||||
|
memcpy1((void*)ul_ch0_ext,(void*)ul_ch0,nb_re_pusch*sizeof(int32_t));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (re = 0; re < nb_re_pusch; re++) {
|
||||||
|
|
||||||
|
is_dmrs_re = (re == get_dmrs_freq_idx_ul(n, k_prime, delta, pusch_pdu->dmrs_config_type));
|
||||||
|
|
||||||
|
#ifdef DEBUG_RB_EXT
|
||||||
|
printf("re = %d, kprime %d, n %d, is_dmrs_symbol = %d, symbol = %d\n", re, k_prime, n, is_dmrs_symbol, symbol);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* save only data and respective channel estimates */
|
||||||
|
if (is_dmrs_re == 0) {
|
||||||
|
rxF_ext[rxF_ext_index] = (rxF[ ((start_re + re)*2) % (frame_parms->ofdm_symbol_size*2)]);
|
||||||
|
rxF_ext[rxF_ext_index + 1] = (rxF[(((start_re + re)*2) + 1) % (frame_parms->ofdm_symbol_size*2)]);
|
||||||
|
ul_ch0_ext[ul_ch0_ext_index] = ul_ch0[ul_ch0_index];
|
||||||
|
|
||||||
|
#ifdef DEBUG_RB_EXT
|
||||||
|
printf("dmrs symb %d: rxF_ext[%d] = (%d,%d), ul_ch0_ext[%d] = (%d,%d)\n",
|
||||||
|
is_dmrs_symbol,rxF_ext_index>>1, rxF_ext[rxF_ext_index],rxF_ext[rxF_ext_index+1],
|
||||||
|
ul_ch0_ext_index, ((int16_t*)&ul_ch0_ext[ul_ch0_ext_index])[0], ((int16_t*)&ul_ch0_ext[ul_ch0_ext_index])[1]);
|
||||||
|
#endif
|
||||||
|
ul_ch0_ext_index++;
|
||||||
|
rxF_ext_index +=2;
|
||||||
|
} else {
|
||||||
|
n += k_prime;
|
||||||
|
k_prime ^= 1;
|
||||||
|
}
|
||||||
|
ul_ch0_index++;
|
||||||
}
|
}
|
||||||
ul_ch0_index++;
|
|
||||||
ul_ch0_ptrs_index++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pusch_vars->ptrs_sc_per_ofdm_symbol = num_ptrs_symbols;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
|
void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
|
||||||
@@ -356,10 +341,16 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
|
|||||||
|
|
||||||
ch_amp128 = _mm_set1_epi16(ch_amp); // Q3.13
|
ch_amp128 = _mm_set1_epi16(ch_amp); // Q3.13
|
||||||
|
|
||||||
|
#ifdef __AVX2__
|
||||||
|
int off = ((nb_rb&1) == 1)? 4:0;
|
||||||
|
#else
|
||||||
|
int off = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
for (aatx=0; aatx < frame_parms->nb_antenna_ports_gNB; aatx++) {
|
for (aatx=0; aatx < frame_parms->nb_antenna_ports_gNB; aatx++) {
|
||||||
for (aarx=0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
for (aarx=0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
||||||
|
|
||||||
ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aarx][symbol*nb_rb*NR_NB_SC_PER_RB];
|
ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aarx][symbol*(off+(nb_rb*NR_NB_SC_PER_RB))];
|
||||||
|
|
||||||
if (is_dmrs_symbol==1){
|
if (is_dmrs_symbol==1){
|
||||||
if (pusch_dmrs_type == pusch_dmrs_type1)
|
if (pusch_dmrs_type == pusch_dmrs_type1)
|
||||||
@@ -408,12 +399,18 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
|
|||||||
int16_t x = factor2(len);
|
int16_t x = factor2(len);
|
||||||
int16_t y = (len)>>x;
|
int16_t y = (len)>>x;
|
||||||
|
|
||||||
|
#ifdef __AVX2__
|
||||||
|
int off = ((nb_rb&1) == 1)? 4:0;
|
||||||
|
#else
|
||||||
|
int off = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
for (aatx = 0; aatx < frame_parms->nb_antennas_tx; aatx++)
|
for (aatx = 0; aatx < frame_parms->nb_antennas_tx; aatx++)
|
||||||
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
||||||
//clear average level
|
//clear average level
|
||||||
avg128U = _mm_setzero_si128();
|
avg128U = _mm_setzero_si128();
|
||||||
|
|
||||||
ul_ch128=(__m128i *)&ul_ch_estimates_ext[(aatx<<1)+aarx][symbol*nb_rb*12];
|
ul_ch128=(__m128i *)&ul_ch_estimates_ext[(aatx<<1)+aarx][symbol*(off+(nb_rb*12))];
|
||||||
|
|
||||||
for (rb = 0; rb < len/12; rb++) {
|
for (rb = 0; rb < len/12; rb++) {
|
||||||
avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[0], ul_ch128[0]), x));
|
avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[0], ul_ch128[0]), x));
|
||||||
@@ -501,13 +498,13 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
|
|||||||
unsigned short nb_rb,
|
unsigned short nb_rb,
|
||||||
unsigned char output_shift) {
|
unsigned char output_shift) {
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG_CH_COMP
|
#ifdef DEBUG_CH_COMP
|
||||||
int16_t *rxF, *ul_ch;
|
int16_t *rxF, *ul_ch;
|
||||||
int prnt_idx;
|
int prnt_idx;
|
||||||
|
|
||||||
|
rxF = (int16_t *)&rxdataF_ext[0][symbol*(off+(nb_rb*12))];
|
||||||
rxF = (int16_t *)&rxdataF_ext[0][(symbol*nb_rb*12)];
|
ul_ch = (int16_t *)&ul_ch_estimates_ext[0][symbol*(off+(nb_rb*1))2];
|
||||||
ul_ch = (int16_t *)&ul_ch_estimates_ext[0][symbol*nb_rb*12];
|
|
||||||
|
|
||||||
printf("--------------------symbol = %d, mod_order = %d, output_shift = %d-----------------------\n", symbol, mod_order, output_shift);
|
printf("--------------------symbol = %d, mod_order = %d, output_shift = %d-----------------------\n", symbol, mod_order, output_shift);
|
||||||
printf("----------------Before compensation------------------\n");
|
printf("----------------Before compensation------------------\n");
|
||||||
@@ -526,7 +523,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
|
|||||||
int print_idx;
|
int print_idx;
|
||||||
|
|
||||||
|
|
||||||
ch_mag = (int16_t *)&ul_ch_mag[0][(symbol*nb_rb*12)];
|
ch_mag = (int16_t *)&ul_ch_mag[0][symbol*(off+(nb_rb*12))];
|
||||||
|
|
||||||
printf("--------------------symbol = %d, mod_order = %d-----------------------\n", symbol, mod_order);
|
printf("--------------------symbol = %d, mod_order = %d-----------------------\n", symbol, mod_order);
|
||||||
printf("----------------Before computation------------------\n");
|
printf("----------------Before computation------------------\n");
|
||||||
@@ -539,7 +536,13 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__i386) || defined(__x86_64)
|
#ifdef __AVX2__
|
||||||
|
int off = ((nb_rb&1) == 1)? 4:0;
|
||||||
|
#else
|
||||||
|
int off = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__i386) || defined(__x86_64__)
|
||||||
|
|
||||||
unsigned short rb;
|
unsigned short rb;
|
||||||
unsigned char aatx,aarx;
|
unsigned char aatx,aarx;
|
||||||
@@ -561,11 +564,11 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
|
|||||||
|
|
||||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||||
|
|
||||||
ul_ch128 = (__m128i *)&ul_ch_estimates_ext[(aatx<<1)+aarx][symbol*nb_rb*12];
|
ul_ch128 = (__m128i *)&ul_ch_estimates_ext[(aatx<<1)+aarx][symbol*(off+(nb_rb*12))];
|
||||||
ul_ch_mag128 = (__m128i *)&ul_ch_mag[(aatx<<1)+aarx][symbol*nb_rb*12];
|
ul_ch_mag128 = (__m128i *)&ul_ch_mag[(aatx<<1)+aarx][symbol*(off+(nb_rb*12))];
|
||||||
ul_ch_mag128b = (__m128i *)&ul_ch_magb[(aatx<<1)+aarx][symbol*nb_rb*12];
|
ul_ch_mag128b = (__m128i *)&ul_ch_magb[(aatx<<1)+aarx][symbol*(off+(nb_rb*12))];
|
||||||
rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*nb_rb*12];
|
rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*(off+(nb_rb*12))];
|
||||||
rxdataF_comp128 = (__m128i *)&rxdataF_comp[(aatx<<1)+aarx][symbol*nb_rb*12];
|
rxdataF_comp128 = (__m128i *)&rxdataF_comp[(aatx<<1)+aarx][symbol*(off+(nb_rb*12))];
|
||||||
|
|
||||||
|
|
||||||
for (rb=0; rb<nb_rb; rb++) {
|
for (rb=0; rb<nb_rb; rb++) {
|
||||||
@@ -981,7 +984,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
|
|||||||
|
|
||||||
#ifdef DEBUG_CH_COMP
|
#ifdef DEBUG_CH_COMP
|
||||||
|
|
||||||
rxF = (int16_t *)&rxdataF_comp[0][(symbol*nb_rb*12)];
|
rxF = (int16_t *)&rxdataF_comp[0][(symbol*(off+(nb_rb*12)))];
|
||||||
|
|
||||||
printf("----------------After compansation------------------\n");
|
printf("----------------After compansation------------------\n");
|
||||||
|
|
||||||
@@ -996,7 +999,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
|
|||||||
#ifdef DEBUG_CH_MAG
|
#ifdef DEBUG_CH_MAG
|
||||||
|
|
||||||
|
|
||||||
ch_mag = (int16_t *)&ul_ch_mag[0][(symbol*nb_rb*12)];
|
ch_mag = (int16_t *)&ul_ch_mag[0][(symbol*(off+(nb_rb*12)))];
|
||||||
|
|
||||||
printf("----------------After computation------------------\n");
|
printf("----------------After computation------------------\n");
|
||||||
|
|
||||||
@@ -1010,6 +1013,67 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nr_ulsch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
|
||||||
|
int32_t **rxdataF_comp,
|
||||||
|
int32_t **ul_ch_mag,
|
||||||
|
int32_t **ul_ch_magb,
|
||||||
|
uint8_t symbol,
|
||||||
|
uint16_t nb_rb) {
|
||||||
|
int n_rx = frame_parms->nb_antennas_rx;
|
||||||
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
|
__m128i *rxdataF_comp128[1+n_rx],*ul_ch_mag128[1+n_rx],*ul_ch_mag128b[1+n_rx];
|
||||||
|
#elif defined(__arm__)
|
||||||
|
int16x8_t *rxdataF_comp128_0,*ul_ch_mag128_0,*ul_ch_mag128_0b;
|
||||||
|
int16x8_t *rxdataF_comp128_1,*ul_ch_mag128_1,*ul_ch_mag128_1b;
|
||||||
|
#endif
|
||||||
|
int32_t i;
|
||||||
|
|
||||||
|
#ifdef __AVX2__
|
||||||
|
int off = ((nb_rb&1) == 1)? 4:0;
|
||||||
|
#else
|
||||||
|
int off = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (frame_parms->nb_antennas_rx>1) {
|
||||||
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
|
int nb_re = nb_rb*12;
|
||||||
|
for (int aa=0;aa<frame_parms->nb_antennas_rx;aa++) {
|
||||||
|
rxdataF_comp128[aa] = (__m128i *)&rxdataF_comp[aa][(symbol*(nb_re + off))];
|
||||||
|
ul_ch_mag128[aa] = (__m128i *)&ul_ch_mag[aa][(symbol*(nb_re + off))];
|
||||||
|
ul_ch_mag128b[aa] = (__m128i *)&ul_ch_magb[aa][(symbol*(nb_re + off))];
|
||||||
|
|
||||||
|
// MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation)
|
||||||
|
for (i=0; i<nb_rb*3; i++) {
|
||||||
|
rxdataF_comp128[0][i] = _mm_adds_epi16(_mm_srai_epi16(rxdataF_comp128[aa][i],1),_mm_srai_epi16(rxdataF_comp128[aa][i],1));
|
||||||
|
ul_ch_mag128[0][i] = _mm_adds_epi16(_mm_srai_epi16(ul_ch_mag128[aa][i],1),_mm_srai_epi16(ul_ch_mag128[aa][i],1));
|
||||||
|
ul_ch_mag128b[0][i] = _mm_adds_epi16(_mm_srai_epi16(ul_ch_mag128b[aa][i],1),_mm_srai_epi16(ul_ch_mag128b[aa][i],1));
|
||||||
|
// rxdataF_comp128[0][i] = _mm_add_epi16(rxdataF_comp128_0[i],(*(__m128i *)&jitterc[0]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif defined(__arm__)
|
||||||
|
rxdataF_comp128_0 = (int16x8_t *)&rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12];
|
||||||
|
rxdataF_comp128_1 = (int16x8_t *)&rxdataF_comp[1][symbol*frame_parms->N_RB_DL*12];
|
||||||
|
ul_ch_mag128_0 = (int16x8_t *)&ul_ch_mag[0][symbol*frame_parms->N_RB_DL*12];
|
||||||
|
ul_ch_mag128_1 = (int16x8_t *)&ul_ch_mag[1][symbol*frame_parms->N_RB_DL*12];
|
||||||
|
ul_ch_mag128_0b = (int16x8_t *)&ul_ch_magb[0][symbol*frame_parms->N_RB_DL*12];
|
||||||
|
ul_ch_mag128_1b = (int16x8_t *)&ul_ch_magb[1][symbol*frame_parms->N_RB_DL*12];
|
||||||
|
|
||||||
|
// MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation)
|
||||||
|
for (i=0; i<nb_rb*3; i++) {
|
||||||
|
rxdataF_comp128_0[i] = vhaddq_s16(rxdataF_comp128_0[i],rxdataF_comp128_1[i]);
|
||||||
|
ul_ch_mag128_0[i] = vhaddq_s16(ul_ch_mag128_0[i],ul_ch_mag128_1[i]);
|
||||||
|
ul_ch_mag128_0b[i] = vhaddq_s16(ul_ch_mag128_0b[i],ul_ch_mag128_1b[i]);
|
||||||
|
rxdataF_comp128_0[i] = vqaddq_s16(rxdataF_comp128_0[i],(*(int16x8_t *)&jitterc[0]));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
|
_mm_empty();
|
||||||
|
_m_empty();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
||||||
uint8_t ulsch_id,
|
uint8_t ulsch_id,
|
||||||
uint32_t frame,
|
uint32_t frame,
|
||||||
@@ -1020,36 +1084,26 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
uint8_t aarx, aatx, dmrs_symbol_flag; // dmrs_symbol_flag, a flag to indicate DMRS REs in current symbol
|
uint8_t aarx, aatx, dmrs_symbol_flag; // dmrs_symbol_flag, a flag to indicate DMRS REs in current symbol
|
||||||
uint32_t nb_re_pusch, bwp_start_subcarrier;
|
uint32_t nb_re_pusch, bwp_start_subcarrier;
|
||||||
uint8_t L_ptrs = 0; // PTRS parameter
|
|
||||||
int avgs;
|
int avgs;
|
||||||
int avg[4];
|
int avg[4];
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu;
|
nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu;
|
||||||
|
|
||||||
dmrs_symbol_flag = 0;
|
dmrs_symbol_flag = 0;
|
||||||
gNB->pusch_vars[ulsch_id]->ptrs_sc_per_ofdm_symbol = 0;
|
|
||||||
|
|
||||||
if(symbol == rel15_ul->start_symbol_index){
|
if(symbol == rel15_ul->start_symbol_index){
|
||||||
gNB->pusch_vars[ulsch_id]->rxdataF_ext_offset = 0;
|
|
||||||
gNB->pusch_vars[ulsch_id]->dmrs_symbol = 0;
|
gNB->pusch_vars[ulsch_id]->dmrs_symbol = 0;
|
||||||
gNB->pusch_vars[ulsch_id]->cl_done = 0;
|
gNB->pusch_vars[ulsch_id]->cl_done = 0;
|
||||||
gNB->pusch_vars[ulsch_id]->ptrs_symbols = 0;
|
|
||||||
|
|
||||||
if (rel15_ul->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) { // if there is ptrs pdu
|
|
||||||
L_ptrs = 1<<(rel15_ul->pusch_ptrs.ptrs_time_density);
|
|
||||||
|
|
||||||
set_ptrs_symb_idx(&gNB->pusch_vars[ulsch_id]->ptrs_symbols,
|
|
||||||
rel15_ul->nr_of_symbols,
|
|
||||||
rel15_ul->start_symbol_index,
|
|
||||||
L_ptrs,
|
|
||||||
rel15_ul->ul_dmrs_symb_pos);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bwp_start_subcarrier = (rel15_ul->rb_start*NR_NB_SC_PER_RB + frame_parms->first_carrier_offset) % frame_parms->ofdm_symbol_size;
|
bwp_start_subcarrier = (rel15_ul->rb_start*NR_NB_SC_PER_RB + frame_parms->first_carrier_offset) % frame_parms->ofdm_symbol_size;
|
||||||
|
|
||||||
dmrs_symbol_flag = ((rel15_ul->ul_dmrs_symb_pos)>>symbol)&0x01;
|
dmrs_symbol_flag = ((rel15_ul->ul_dmrs_symb_pos)>>symbol)&0x01;
|
||||||
|
|
||||||
|
LOG_D(PHY,"symbol %d bwp_start_subcarrier %d, rb_start %d, first_carrier_offset %d\n",symbol,bwp_start_subcarrier,rel15_ul->rb_start,frame_parms->first_carrier_offset);
|
||||||
|
LOG_D(PHY,"ul_dmrs_symb_pos %x\n",rel15_ul->ul_dmrs_symb_pos);
|
||||||
|
|
||||||
if (dmrs_symbol_flag == 1){
|
if (dmrs_symbol_flag == 1){
|
||||||
if (((rel15_ul->ul_dmrs_symb_pos)>>((symbol+1)%frame_parms->symbols_per_slot))&0x01)
|
if (((rel15_ul->ul_dmrs_symb_pos)>>((symbol+1)%frame_parms->symbols_per_slot))&0x01)
|
||||||
AssertFatal(1==0,"Double DMRS configuration is not yet supported\n");
|
AssertFatal(1==0,"Double DMRS configuration is not yet supported\n");
|
||||||
@@ -1062,28 +1116,32 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
else {
|
else {
|
||||||
nb_re_pusch = rel15_ul->rb_size *(12 - (rel15_ul->num_dmrs_cdm_grps_no_data*4));
|
nb_re_pusch = rel15_ul->rb_size *(12 - (rel15_ul->num_dmrs_cdm_grps_no_data*4));
|
||||||
}
|
}
|
||||||
|
LOG_D(PHY,"dmrs_symbol: nb_re_pusch %d\n",nb_re_pusch);
|
||||||
gNB->pusch_vars[ulsch_id]->dmrs_symbol = symbol;
|
gNB->pusch_vars[ulsch_id]->dmrs_symbol = symbol;
|
||||||
} else {
|
} else {
|
||||||
nb_re_pusch = rel15_ul->rb_size * NR_NB_SC_PER_RB;
|
nb_re_pusch = rel15_ul->rb_size * NR_NB_SC_PER_RB;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rel15_ul->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) { // if there is ptrs pdu
|
|
||||||
if(is_ptrs_symbol(symbol, gNB->pusch_vars[ulsch_id]->ptrs_symbols))
|
|
||||||
gNB->pusch_vars[ulsch_id]->ptrs_symbol_index = symbol;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------
|
//----------------------------------------------------------
|
||||||
//--------------------- Channel estimation ---------------------
|
//--------------------- Channel estimation ---------------------
|
||||||
//----------------------------------------------------------
|
//----------------------------------------------------------
|
||||||
start_meas(&gNB->ulsch_channel_estimation_stats);
|
start_meas(&gNB->ulsch_channel_estimation_stats);
|
||||||
if (dmrs_symbol_flag == 1)
|
if (dmrs_symbol_flag == 1) {
|
||||||
nr_pusch_channel_estimation(gNB,
|
nr_pusch_channel_estimation(gNB,
|
||||||
nr_tti_rx,
|
nr_tti_rx,
|
||||||
0, // p
|
0, // p
|
||||||
symbol,
|
symbol,
|
||||||
|
ulsch_id,
|
||||||
bwp_start_subcarrier,
|
bwp_start_subcarrier,
|
||||||
rel15_ul);
|
rel15_ul);
|
||||||
|
|
||||||
|
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
||||||
|
gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] = signal_energy(&gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aarx][symbol*frame_parms->ofdm_symbol_size],
|
||||||
|
rel15_ul->rb_size*12);
|
||||||
|
if (gNB->pusch_vars[ulsch_id]->ulsch_power[aarx]==1) return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
stop_meas(&gNB->ulsch_channel_estimation_stats);
|
stop_meas(&gNB->ulsch_channel_estimation_stats);
|
||||||
//----------------------------------------------------------
|
//----------------------------------------------------------
|
||||||
//--------------------- RBs extraction ---------------------
|
//--------------------- RBs extraction ---------------------
|
||||||
@@ -1091,6 +1149,8 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
if (nb_re_pusch > 0) {
|
if (nb_re_pusch > 0) {
|
||||||
|
|
||||||
|
gNB->pusch_vars[ulsch_id]->ul_valid_re_per_slot[symbol] = nb_re_pusch;
|
||||||
|
|
||||||
start_meas(&gNB->ulsch_rbs_extraction_stats);
|
start_meas(&gNB->ulsch_rbs_extraction_stats);
|
||||||
nr_ulsch_extract_rbs_single(gNB->common_vars.rxdataF,
|
nr_ulsch_extract_rbs_single(gNB->common_vars.rxdataF,
|
||||||
gNB->pusch_vars[ulsch_id],
|
gNB->pusch_vars[ulsch_id],
|
||||||
@@ -1100,6 +1160,10 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
frame_parms);
|
frame_parms);
|
||||||
stop_meas(&gNB->ulsch_rbs_extraction_stats);
|
stop_meas(&gNB->ulsch_rbs_extraction_stats);
|
||||||
|
|
||||||
|
//----------------------------------------------------------
|
||||||
|
//--------------------- Channel Scaling --------------------
|
||||||
|
//----------------------------------------------------------
|
||||||
|
|
||||||
nr_ulsch_scale_channel(gNB->pusch_vars[ulsch_id]->ul_ch_estimates_ext,
|
nr_ulsch_scale_channel(gNB->pusch_vars[ulsch_id]->ul_ch_estimates_ext,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
gNB->ulsch[ulsch_id],
|
gNB->ulsch[ulsch_id],
|
||||||
@@ -1124,10 +1188,14 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++)
|
for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++)
|
||||||
avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
|
avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
|
||||||
|
|
||||||
gNB->pusch_vars[ulsch_id]->log2_maxh = (log2_approx(avgs)/2)+1;
|
gNB->pusch_vars[ulsch_id]->log2_maxh = (log2_approx(avgs)/2)+3;
|
||||||
gNB->pusch_vars[ulsch_id]->cl_done = 1;
|
gNB->pusch_vars[ulsch_id]->cl_done = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------
|
||||||
|
//--------------------- Channel Compensation ---------------
|
||||||
|
//----------------------------------------------------------
|
||||||
|
|
||||||
start_meas(&gNB->ulsch_channel_compensation_stats);
|
start_meas(&gNB->ulsch_channel_compensation_stats);
|
||||||
nr_ulsch_channel_compensation(gNB->pusch_vars[ulsch_id]->rxdataF_ext,
|
nr_ulsch_channel_compensation(gNB->pusch_vars[ulsch_id]->rxdataF_ext,
|
||||||
gNB->pusch_vars[ulsch_id]->ul_ch_estimates_ext,
|
gNB->pusch_vars[ulsch_id]->ul_ch_estimates_ext,
|
||||||
@@ -1143,34 +1211,66 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
gNB->pusch_vars[ulsch_id]->log2_maxh);
|
gNB->pusch_vars[ulsch_id]->log2_maxh);
|
||||||
stop_meas(&gNB->ulsch_channel_compensation_stats);
|
stop_meas(&gNB->ulsch_channel_compensation_stats);
|
||||||
|
|
||||||
|
start_meas(&gNB->ulsch_mrc_stats);
|
||||||
int rxsig = signal_energy(&gNB->pusch_vars[ulsch_id]->rxdataF_comp[0][(symbol*rel15_ul->rb_size*12)],
|
nr_ulsch_detection_mrc(frame_parms,
|
||||||
rel15_ul->rb_size*12);
|
gNB->pusch_vars[ulsch_id]->rxdataF_comp,
|
||||||
|
gNB->pusch_vars[ulsch_id]->ul_ch_mag,
|
||||||
if (rxsig==1) return (rxsig);
|
gNB->pusch_vars[ulsch_id]->ul_ch_magb,
|
||||||
|
symbol,
|
||||||
|
rel15_ul->rb_size);
|
||||||
|
stop_meas(&gNB->ulsch_mrc_stats);
|
||||||
#ifdef NR_SC_FDMA
|
#ifdef NR_SC_FDMA
|
||||||
nr_idft(&((uint32_t*)gNB->pusch_vars[ulsch_id]->rxdataF_ext[0])[symbol * rel15_ul->rb_size * NR_NB_SC_PER_RB], nb_re_pusch);
|
nr_idft(&((uint32_t*)gNB->pusch_vars[ulsch_id]->rxdataF_ext[0])[symbol * rel15_ul->rb_size * NR_NB_SC_PER_RB], nb_re_pusch);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//----------------------------------------------------------
|
|
||||||
//-------------------- LLRs computation --------------------
|
|
||||||
//----------------------------------------------------------
|
|
||||||
start_meas(&gNB->ulsch_llr_stats);
|
|
||||||
AssertFatal(gNB->pusch_vars[ulsch_id]->rxdataF_ext_offset * rel15_ul->qam_mod_order+nb_re_pusch*rel15_ul->qam_mod_order < (8*((3*8*6144)+12)) , "Mysterious llr buffer size check");
|
|
||||||
nr_ulsch_compute_llr(&gNB->pusch_vars[ulsch_id]->rxdataF_comp[0][symbol * rel15_ul->rb_size * NR_NB_SC_PER_RB],
|
|
||||||
gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
|
|
||||||
gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
|
|
||||||
&gNB->pusch_vars[ulsch_id]->llr[gNB->pusch_vars[ulsch_id]->rxdataF_ext_offset * rel15_ul->qam_mod_order],
|
|
||||||
rel15_ul->rb_size,
|
|
||||||
nb_re_pusch,
|
|
||||||
symbol,
|
|
||||||
rel15_ul->qam_mod_order);
|
|
||||||
stop_meas(&gNB->ulsch_llr_stats);
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------
|
||||||
|
//--------------------- PTRS Processing --------------------
|
||||||
|
//----------------------------------------------------------
|
||||||
|
|
||||||
|
/* In case PTRS is enabled then LLR will be calculated after PTRS symbols are processed *
|
||||||
|
* otherwise LLR are calculated for each symbol based upon DMRS channel estimates only. */
|
||||||
|
if (rel15_ul->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS)
|
||||||
|
{
|
||||||
|
start_meas(&gNB->ulsch_ptrs_processing_stats);
|
||||||
|
nr_pusch_ptrs_processing(gNB,
|
||||||
|
rel15_ul,
|
||||||
|
ulsch_id,
|
||||||
|
nr_tti_rx,
|
||||||
|
dmrs_symbol_flag,
|
||||||
|
symbol,
|
||||||
|
nb_re_pusch);
|
||||||
|
stop_meas(&gNB->ulsch_ptrs_processing_stats);
|
||||||
|
|
||||||
|
/* Subtract total PTRS RE's in the symbol from PUSCH RE's */
|
||||||
|
gNB->pusch_vars[ulsch_id]->ul_valid_re_per_slot[symbol] -= gNB->pusch_vars[ulsch_id]->ptrs_sc_per_ofdm_symbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------------------------- */
|
||||||
|
/*-------------------- LLRs computation -------------------------------------------------------------*/
|
||||||
|
/*-----------------------------------------------------------------------------------------------------*/
|
||||||
|
if(symbol == (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols -1))
|
||||||
|
{
|
||||||
|
#ifdef __AVX2__
|
||||||
|
int off = ((rel15_ul->rb_size&1) == 1)? 4:0;
|
||||||
|
#else
|
||||||
|
int off = 0;
|
||||||
|
#endif
|
||||||
|
uint32_t rxdataF_ext_offset = 0;
|
||||||
|
for(uint8_t i =rel15_ul->start_symbol_index; i< (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols);i++) {
|
||||||
|
start_meas(&gNB->ulsch_llr_stats);
|
||||||
|
nr_ulsch_compute_llr(&gNB->pusch_vars[ulsch_id]->rxdataF_comp[0][i * (off + rel15_ul->rb_size * NR_NB_SC_PER_RB)],
|
||||||
|
gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
|
||||||
|
gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
|
||||||
|
&gNB->pusch_vars[ulsch_id]->llr[rxdataF_ext_offset * rel15_ul->qam_mod_order],
|
||||||
|
rel15_ul->rb_size,
|
||||||
|
gNB->pusch_vars[ulsch_id]->ul_valid_re_per_slot[i],
|
||||||
|
i,
|
||||||
|
rel15_ul->qam_mod_order);
|
||||||
|
stop_meas(&gNB->ulsch_llr_stats);
|
||||||
|
rxdataF_ext_offset += gNB->pusch_vars[ulsch_id]->ul_valid_re_per_slot[i];
|
||||||
|
}// symbol loop
|
||||||
|
}// last symbol check
|
||||||
}
|
}
|
||||||
|
|
||||||
gNB->pusch_vars[ulsch_id]->rxdataF_ext_offset = gNB->pusch_vars[ulsch_id]->rxdataF_ext_offset + nb_re_pusch;
|
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,9 +34,6 @@
|
|||||||
#include "PHY/sse_intrin.h"
|
#include "PHY/sse_intrin.h"
|
||||||
#include "PHY/impl_defs_top.h"
|
#include "PHY/impl_defs_top.h"
|
||||||
|
|
||||||
__m128i xmm0 __attribute__ ((aligned(32)));
|
|
||||||
__m128i xmm1 __attribute__ ((aligned(32)));
|
|
||||||
__m128i xmm2 __attribute__ ((aligned(32)));
|
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------
|
||||||
@@ -47,20 +44,19 @@ void nr_ulsch_qpsk_llr(int32_t *rxdataF_comp,
|
|||||||
uint32_t nb_re,
|
uint32_t nb_re,
|
||||||
uint8_t symbol)
|
uint8_t symbol)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
uint32_t *rxF = (uint32_t*)rxdataF_comp;
|
uint32_t *rxF = (uint32_t*)rxdataF_comp;
|
||||||
uint32_t *llr32 = (uint32_t*)ulsch_llr;
|
uint32_t *llr32 = (uint32_t*)ulsch_llr;
|
||||||
|
|
||||||
if (!llr32) {
|
if (!llr32) {
|
||||||
LOG_E(PHY,"nr_ulsch_qpsk_llr: llr is null, symbol %d, llr32 = %p\n",symbol, llr32);
|
LOG_E(PHY,"nr_ulsch_qpsk_llr: llr is null, symbol %d, llr32 = %p\n",symbol, llr32);
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
for (i = 0; i < nb_re; i++) {
|
for (i = 0; i < nb_re; i++) {
|
||||||
*llr32 = *rxF;
|
*llr32 = *rxF;
|
||||||
rxF++;
|
rxF++;
|
||||||
llr32++;
|
llr32++;
|
||||||
}
|
}*/
|
||||||
|
memcpy1((void*)llr32,(void*)rxF,nb_re<<2);
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------
|
||||||
@@ -76,9 +72,17 @@ void nr_ulsch_16qam_llr(int32_t *rxdataF_comp,
|
|||||||
{
|
{
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
|
#ifdef __AVX2__
|
||||||
|
__m256i *rxF = (__m256i*)rxdataF_comp;
|
||||||
|
__m256i *ch_mag;
|
||||||
|
__m256i llr256[2];
|
||||||
|
register __m256i xmm0;
|
||||||
|
#else
|
||||||
__m128i *rxF = (__m128i*)rxdataF_comp;
|
__m128i *rxF = (__m128i*)rxdataF_comp;
|
||||||
__m128i *ch_mag;
|
__m128i *ch_mag;
|
||||||
__m128i llr128[2];
|
__m128i llr128[2];
|
||||||
|
register __m128i xmm0;
|
||||||
|
#endif
|
||||||
uint32_t *llr32;
|
uint32_t *llr32;
|
||||||
|
|
||||||
#elif defined(__arm__)
|
#elif defined(__arm__)
|
||||||
@@ -90,7 +94,12 @@ void nr_ulsch_16qam_llr(int32_t *rxdataF_comp,
|
|||||||
|
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
unsigned char len_mod4 = 0;
|
|
||||||
|
#ifdef __AVX2__
|
||||||
|
int off = ((nb_rb&1) == 1)? 4:0;
|
||||||
|
#else
|
||||||
|
int off = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
@@ -100,22 +109,69 @@ void nr_ulsch_16qam_llr(int32_t *rxdataF_comp,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
ch_mag = (__m128i*)&ul_ch_mag[0][(symbol*nb_rb*12)];
|
#ifdef __AVX2__
|
||||||
|
ch_mag = (__m256i*)&ul_ch_mag[0][(symbol*(off+(nb_rb*12)))];
|
||||||
|
#else
|
||||||
|
ch_mag = (__m128i*)&ul_ch_mag[0][(symbol*(off+(nb_rb*12)))];
|
||||||
|
#endif
|
||||||
#elif defined(__arm__)
|
#elif defined(__arm__)
|
||||||
ch_mag = (int16x8_t*)&ul_ch_mag[0][(symbol*nb_rb*12)];
|
ch_mag = (int16x8_t*)&ul_ch_mag[0][(symbol*nb_rb*12)];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
len_mod4 = nb_re&3;
|
#ifdef __AVX2__
|
||||||
|
unsigned char len_mod8 = nb_re&7;
|
||||||
|
nb_re >>= 3; // length in quad words (4 REs)
|
||||||
|
nb_re += (len_mod8 == 0 ? 0 : 1);
|
||||||
|
#else
|
||||||
|
unsigned char len_mod4 = nb_re&3;
|
||||||
nb_re >>= 2; // length in quad words (4 REs)
|
nb_re >>= 2; // length in quad words (4 REs)
|
||||||
nb_re += (len_mod4 == 0 ? 0 : 1);
|
nb_re += (len_mod4 == 0 ? 0 : 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
for (i=0; i<nb_re; i++) {
|
for (i=0; i<nb_re; i++) {
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__i386)
|
#if defined(__x86_64__) || defined(__i386)
|
||||||
|
#ifdef __AVX2__
|
||||||
|
xmm0 = _mm256_abs_epi16(rxF[i]); // registers of even index in xmm0-> |y_R|, registers of odd index in xmm0-> |y_I|
|
||||||
|
xmm0 = _mm256_subs_epi16(ch_mag[i],xmm0); // registers of even index in xmm0-> |y_R|-|h|^2, registers of odd index in xmm0-> |y_I|-|h|^2
|
||||||
|
|
||||||
|
llr256[0] = _mm256_unpacklo_epi32(rxF[i],xmm0); // llr128[0] contains the llrs of the 1st,2nd,5th and 6th REs
|
||||||
|
llr256[1] = _mm256_unpackhi_epi32(rxF[i],xmm0); // llr128[1] contains the llrs of the 3rd, 4th, 7th and 8th REs
|
||||||
|
|
||||||
|
// 1st RE
|
||||||
|
llr32[0] = _mm256_extract_epi32(llr256[0],0); // llr32[0] low 16 bits-> y_R , high 16 bits-> y_I
|
||||||
|
llr32[1] = _mm256_extract_epi32(llr256[0],1); // llr32[1] low 16 bits-> |h|-|y_R|^2, high 16 bits-> |h|-|y_I|^2
|
||||||
|
|
||||||
|
// 2nd RE
|
||||||
|
llr32[2] = _mm256_extract_epi32(llr256[0],2); // llr32[2] low 16 bits-> y_R , high 16 bits-> y_I
|
||||||
|
llr32[3] = _mm256_extract_epi32(llr256[0],3); // llr32[3] low 16 bits-> |h|-|y_R|^2, high 16 bits-> |h|-|y_I|^2
|
||||||
|
|
||||||
|
// 3rd RE
|
||||||
|
llr32[4] = _mm256_extract_epi32(llr256[1],0); // llr32[4] low 16 bits-> y_R , high 16 bits-> y_I
|
||||||
|
llr32[5] = _mm256_extract_epi32(llr256[1],1); // llr32[5] low 16 bits-> |h|-|y_R|^2, high 16 bits-> |h|-|y_I|^2
|
||||||
|
|
||||||
|
// 4th RE
|
||||||
|
llr32[6] = _mm256_extract_epi32(llr256[1],2); // llr32[6] low 16 bits-> y_R , high 16 bits-> y_I
|
||||||
|
llr32[7] = _mm256_extract_epi32(llr256[1],3); // llr32[7] low 16 bits-> |h|-|y_R|^2, high 16 bits-> |h|-|y_I|^2
|
||||||
|
|
||||||
|
// 5th RE
|
||||||
|
llr32[8] = _mm256_extract_epi32(llr256[0],4); // llr32[8] low 16 bits-> y_R , high 16 bits-> y_I
|
||||||
|
llr32[9] = _mm256_extract_epi32(llr256[0],5); // llr32[9] low 16 bits-> |h|-|y_R|^2, high 16 bits-> |h|-|y_I|^2
|
||||||
|
|
||||||
|
// 6th RE
|
||||||
|
llr32[10] = _mm256_extract_epi32(llr256[0],6); // llr32[10] low 16 bits-> y_R , high 16 bits-> y_I
|
||||||
|
llr32[11] = _mm256_extract_epi32(llr256[0],7); // llr32[11] low 16 bits-> |h|-|y_R|^2, high 16 bits-> |h|-|y_I|^2
|
||||||
|
|
||||||
|
// 7th RE
|
||||||
|
llr32[12] = _mm256_extract_epi32(llr256[1],4); // llr32[12] low 16 bits-> y_R , high 16 bits-> y_I
|
||||||
|
llr32[13] = _mm256_extract_epi32(llr256[1],5); // llr32[13] low 16 bits-> |h|-|y_R|^2, high 16 bits-> |h|-|y_I|^2
|
||||||
|
|
||||||
|
// 8th RE
|
||||||
|
llr32[14] = _mm256_extract_epi32(llr256[1],6); // llr32[14] low 16 bits-> y_R , high 16 bits-> y_I
|
||||||
|
llr32[15] = _mm256_extract_epi32(llr256[1],7); // llr32[15] low 16 bits-> |h|-|y_R|^2, high 16 bits-> |h|-|y_I|^2
|
||||||
|
|
||||||
|
llr32+=16;
|
||||||
|
#else
|
||||||
xmm0 = _mm_abs_epi16(rxF[i]); // registers of even index in xmm0-> |y_R|, registers of odd index in xmm0-> |y_I|
|
xmm0 = _mm_abs_epi16(rxF[i]); // registers of even index in xmm0-> |y_R|, registers of odd index in xmm0-> |y_I|
|
||||||
|
|
||||||
|
|
||||||
xmm0 = _mm_subs_epi16(ch_mag[i],xmm0); // registers of even index in xmm0-> |y_R|-|h|^2, registers of odd index in xmm0-> |y_I|-|h|^2
|
xmm0 = _mm_subs_epi16(ch_mag[i],xmm0); // registers of even index in xmm0-> |y_R|-|h|^2, registers of odd index in xmm0-> |y_I|-|h|^2
|
||||||
|
|
||||||
llr128[0] = _mm_unpacklo_epi32(rxF[i],xmm0); // llr128[0] contains the llrs of the 1st and 2nd REs
|
llr128[0] = _mm_unpacklo_epi32(rxF[i],xmm0); // llr128[0] contains the llrs of the 1st and 2nd REs
|
||||||
@@ -138,6 +194,7 @@ void nr_ulsch_16qam_llr(int32_t *rxdataF_comp,
|
|||||||
llr32[7] = _mm_extract_epi32(llr128[1],3); // llr32[7] low 16 bits-> |h|-|y_R|^2, high 16 bits-> |h|-|y_I|^2
|
llr32[7] = _mm_extract_epi32(llr128[1],3); // llr32[7] low 16 bits-> |h|-|y_R|^2, high 16 bits-> |h|-|y_I|^2
|
||||||
|
|
||||||
llr32+=8;
|
llr32+=8;
|
||||||
|
#endif
|
||||||
#elif defined(__arm__)
|
#elif defined(__arm__)
|
||||||
xmm0 = vabsq_s16(rxF[i]);
|
xmm0 = vabsq_s16(rxF[i]);
|
||||||
xmm0 = vqsubq_s16((*(__m128i*)&ones[0]),xmm0);
|
xmm0 = vqsubq_s16((*(__m128i*)&ones[0]),xmm0);
|
||||||
@@ -182,40 +239,69 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp,
|
|||||||
uint8_t symbol)
|
uint8_t symbol)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifdef __AVX2__
|
||||||
|
int off = ((nb_rb&1) == 1)? 4:0;
|
||||||
|
#else
|
||||||
|
int off = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
|
#ifdef __AVX2__
|
||||||
|
__m256i *rxF = (__m256i*)rxdataF_comp;
|
||||||
|
__m256i *ch_mag,*ch_magb;
|
||||||
|
register __m256i xmm0,xmm1,xmm2;
|
||||||
|
#else
|
||||||
__m128i *rxF = (__m128i*)rxdataF_comp;
|
__m128i *rxF = (__m128i*)rxdataF_comp;
|
||||||
__m128i *ch_mag,*ch_magb;
|
__m128i *ch_mag,*ch_magb;
|
||||||
|
register __m128i xmm0,xmm1,xmm2;
|
||||||
|
#endif
|
||||||
#elif defined(__arm__)
|
#elif defined(__arm__)
|
||||||
int16x8_t *rxF = (int16x8_t*)&rxdataF_comp;
|
int16x8_t *rxF = (int16x8_t*)&rxdataF_comp;
|
||||||
int16x8_t *ch_mag,*ch_magb; // [hna] This should be uncommented once channel estimation is implemented
|
int16x8_t *ch_mag,*ch_magb; // [hna] This should be uncommented once channel estimation is implemented
|
||||||
int16x8_t xmm1,xmm2;
|
int16x8_t xmm0,xmm1,xmm2;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
unsigned char len_mod4;
|
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
|
#ifdef __AVX2__
|
||||||
|
ch_mag = (__m256i*)&ul_ch_mag[0][(symbol*(off+(nb_rb*12)))];
|
||||||
|
ch_magb = (__m256i*)&ul_ch_magb[0][(symbol*(off+(nb_rb*12)))];
|
||||||
|
#else
|
||||||
ch_mag = (__m128i*)&ul_ch_mag[0][(symbol*nb_rb*12)];
|
ch_mag = (__m128i*)&ul_ch_mag[0][(symbol*nb_rb*12)];
|
||||||
ch_magb = (__m128i*)&ul_ch_magb[0][(symbol*nb_rb*12)];
|
ch_magb = (__m128i*)&ul_ch_magb[0][(symbol*nb_rb*12)];
|
||||||
|
#endif
|
||||||
#elif defined(__arm__)
|
#elif defined(__arm__)
|
||||||
ch_mag = (int16x8_t*)&ul_ch_mag[0][(symbol*nb_rb*12)];
|
ch_mag = (int16x8_t*)&ul_ch_mag[0][(symbol*nb_rb*12)];
|
||||||
ch_magb = (int16x8_t*)&ul_ch_magb[0][(symbol*nb_rb*12)];
|
ch_magb = (int16x8_t*)&ul_ch_magb[0][(symbol*nb_rb*12)];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
len_mod4 = nb_re&3;
|
#ifdef __AVX2__
|
||||||
|
int len_mod8 = nb_re&7;
|
||||||
|
nb_re = nb_re>>3; // length in quad words (4 REs)
|
||||||
|
nb_re += ((len_mod8 == 0) ? 0 : 1);
|
||||||
|
#else
|
||||||
|
int len_mod4 = nb_re&3;
|
||||||
nb_re = nb_re>>2; // length in quad words (4 REs)
|
nb_re = nb_re>>2; // length in quad words (4 REs)
|
||||||
nb_re += ((len_mod4 == 0) ? 0 : 1);
|
nb_re += ((len_mod4 == 0) ? 0 : 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
for (i=0; i<nb_re; i++) {
|
for (i=0; i<nb_re; i++) {
|
||||||
|
xmm0 = rxF[i];
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
xmm1 = _mm_abs_epi16(rxF[i]);
|
#ifdef __AVX2__
|
||||||
|
xmm1 = _mm256_abs_epi16(xmm0);
|
||||||
|
xmm1 = _mm256_subs_epi16(ch_mag[i],xmm1);
|
||||||
|
xmm2 = _mm256_abs_epi16(xmm1);
|
||||||
|
xmm2 = _mm256_subs_epi16(ch_magb[i],xmm2);
|
||||||
|
#else
|
||||||
|
xmm1 = _mm_abs_epi16(xmm0);
|
||||||
xmm1 = _mm_subs_epi16(ch_mag[i],xmm1);
|
xmm1 = _mm_subs_epi16(ch_mag[i],xmm1);
|
||||||
xmm2 = _mm_abs_epi16(xmm1);
|
xmm2 = _mm_abs_epi16(xmm1);
|
||||||
xmm2 = _mm_subs_epi16(ch_magb[i],xmm2);
|
xmm2 = _mm_subs_epi16(ch_magb[i],xmm2);
|
||||||
|
#endif
|
||||||
#elif defined(__arm__)
|
#elif defined(__arm__)
|
||||||
xmm1 = vabsq_s16(rxF[i]);
|
xmm1 = vabsq_s16(xmm0);
|
||||||
xmm1 = vsubq_s16(ch_mag[i],xmm1);
|
xmm1 = vsubq_s16(ch_mag[i],xmm1);
|
||||||
xmm2 = vabsq_s16(xmm1);
|
xmm2 = vabsq_s16(xmm1);
|
||||||
xmm2 = vsubq_s16(ch_magb[i],xmm2);
|
xmm2 = vsubq_s16(ch_magb[i],xmm2);
|
||||||
@@ -224,14 +310,25 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp,
|
|||||||
// ---------------------------------------
|
// ---------------------------------------
|
||||||
// 1st RE
|
// 1st RE
|
||||||
// ---------------------------------------
|
// ---------------------------------------
|
||||||
ulsch_llr[0] = ((short *)&rxF[i])[0];
|
|
||||||
ulsch_llr[1] = ((short *)&rxF[i])[1];
|
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
|
#ifdef __AVX2__
|
||||||
|
ulsch_llr[0] = _mm256_extract_epi16(xmm0,0);
|
||||||
|
ulsch_llr[1] = _mm256_extract_epi16(xmm0,1);
|
||||||
|
ulsch_llr[2] = _mm256_extract_epi16(xmm1,0);
|
||||||
|
ulsch_llr[3] = _mm256_extract_epi16(xmm1,1);
|
||||||
|
ulsch_llr[4] = _mm256_extract_epi16(xmm2,0);
|
||||||
|
ulsch_llr[5] = _mm256_extract_epi16(xmm2,1);
|
||||||
|
#else
|
||||||
|
ulsch_llr[0] = _mm_extract_epi16(xmm0,0);
|
||||||
|
ulsch_llr[1] = _mm_extract_epi16(xmm0,1);
|
||||||
ulsch_llr[2] = _mm_extract_epi16(xmm1,0);
|
ulsch_llr[2] = _mm_extract_epi16(xmm1,0);
|
||||||
ulsch_llr[3] = _mm_extract_epi16(xmm1,1);
|
ulsch_llr[3] = _mm_extract_epi16(xmm1,1);
|
||||||
ulsch_llr[4] = _mm_extract_epi16(xmm2,0);
|
ulsch_llr[4] = _mm_extract_epi16(xmm2,0);
|
||||||
ulsch_llr[5] = _mm_extract_epi16(xmm2,1);
|
ulsch_llr[5] = _mm_extract_epi16(xmm2,1);
|
||||||
|
#endif
|
||||||
#elif defined(__arm__)
|
#elif defined(__arm__)
|
||||||
|
ulsch_llr[0] = vgetq_lane_s16(xmm0,0);
|
||||||
|
ulsch_llr[1] = vgetq_lane_s16(xmm0,1);
|
||||||
ulsch_llr[2] = vgetq_lane_s16(xmm1,0);
|
ulsch_llr[2] = vgetq_lane_s16(xmm1,0);
|
||||||
ulsch_llr[3] = vgetq_lane_s16(xmm1,1);
|
ulsch_llr[3] = vgetq_lane_s16(xmm1,1);
|
||||||
ulsch_llr[4] = vgetq_lane_s16(xmm2,0);
|
ulsch_llr[4] = vgetq_lane_s16(xmm2,0);
|
||||||
@@ -244,14 +341,25 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp,
|
|||||||
// ---------------------------------------
|
// ---------------------------------------
|
||||||
// 2nd RE
|
// 2nd RE
|
||||||
// ---------------------------------------
|
// ---------------------------------------
|
||||||
ulsch_llr[0] = ((short *)&rxF[i])[2];
|
|
||||||
ulsch_llr[1] = ((short *)&rxF[i])[3];
|
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
|
#ifdef __AVX2__
|
||||||
|
ulsch_llr[0] = _mm256_extract_epi16(xmm0,2);
|
||||||
|
ulsch_llr[1] = _mm256_extract_epi16(xmm0,3);
|
||||||
|
ulsch_llr[2] = _mm256_extract_epi16(xmm1,2);
|
||||||
|
ulsch_llr[3] = _mm256_extract_epi16(xmm1,3);
|
||||||
|
ulsch_llr[4] = _mm256_extract_epi16(xmm2,2);
|
||||||
|
ulsch_llr[5] = _mm256_extract_epi16(xmm2,3);
|
||||||
|
#else
|
||||||
|
ulsch_llr[0] = _mm_extract_epi16(xmm0,2);
|
||||||
|
ulsch_llr[1] = _mm_extract_epi16(xmm0,3);
|
||||||
ulsch_llr[2] = _mm_extract_epi16(xmm1,2);
|
ulsch_llr[2] = _mm_extract_epi16(xmm1,2);
|
||||||
ulsch_llr[3] = _mm_extract_epi16(xmm1,3);
|
ulsch_llr[3] = _mm_extract_epi16(xmm1,3);
|
||||||
ulsch_llr[4] = _mm_extract_epi16(xmm2,2);
|
ulsch_llr[4] = _mm_extract_epi16(xmm2,2);
|
||||||
ulsch_llr[5] = _mm_extract_epi16(xmm2,3);
|
ulsch_llr[5] = _mm_extract_epi16(xmm2,3);
|
||||||
|
#endif
|
||||||
#elif defined(__arm__)
|
#elif defined(__arm__)
|
||||||
|
ulsch_llr[2] = vgetq_lane_s16(xmm0,2);
|
||||||
|
ulsch_llr[3] = vgetq_lane_s16(xmm0,3);
|
||||||
ulsch_llr[2] = vgetq_lane_s16(xmm1,2);
|
ulsch_llr[2] = vgetq_lane_s16(xmm1,2);
|
||||||
ulsch_llr[3] = vgetq_lane_s16(xmm1,3);
|
ulsch_llr[3] = vgetq_lane_s16(xmm1,3);
|
||||||
ulsch_llr[4] = vgetq_lane_s16(xmm2,2);
|
ulsch_llr[4] = vgetq_lane_s16(xmm2,2);
|
||||||
@@ -264,14 +372,25 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp,
|
|||||||
// ---------------------------------------
|
// ---------------------------------------
|
||||||
// 3rd RE
|
// 3rd RE
|
||||||
// ---------------------------------------
|
// ---------------------------------------
|
||||||
ulsch_llr[0] = ((short *)&rxF[i])[4];
|
|
||||||
ulsch_llr[1] = ((short *)&rxF[i])[5];
|
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
|
#ifdef __AVX2__
|
||||||
|
ulsch_llr[0] = _mm256_extract_epi16(xmm0,4);
|
||||||
|
ulsch_llr[1] = _mm256_extract_epi16(xmm0,5);
|
||||||
|
ulsch_llr[2] = _mm256_extract_epi16(xmm1,4);
|
||||||
|
ulsch_llr[3] = _mm256_extract_epi16(xmm1,5);
|
||||||
|
ulsch_llr[4] = _mm256_extract_epi16(xmm2,4);
|
||||||
|
ulsch_llr[5] = _mm256_extract_epi16(xmm2,5);
|
||||||
|
#else
|
||||||
|
ulsch_llr[0] = _mm_extract_epi16(xmm0,4);
|
||||||
|
ulsch_llr[1] = _mm_extract_epi16(xmm0,5);
|
||||||
ulsch_llr[2] = _mm_extract_epi16(xmm1,4);
|
ulsch_llr[2] = _mm_extract_epi16(xmm1,4);
|
||||||
ulsch_llr[3] = _mm_extract_epi16(xmm1,5);
|
ulsch_llr[3] = _mm_extract_epi16(xmm1,5);
|
||||||
ulsch_llr[4] = _mm_extract_epi16(xmm2,4);
|
ulsch_llr[4] = _mm_extract_epi16(xmm2,4);
|
||||||
ulsch_llr[5] = _mm_extract_epi16(xmm2,5);
|
ulsch_llr[5] = _mm_extract_epi16(xmm2,5);
|
||||||
|
#endif
|
||||||
#elif defined(__arm__)
|
#elif defined(__arm__)
|
||||||
|
ulsch_llr[0] = vgetq_lane_s16(xmm0,4);
|
||||||
|
ulsch_llr[1] = vgetq_lane_s16(xmm0,5);
|
||||||
ulsch_llr[2] = vgetq_lane_s16(xmm1,4);
|
ulsch_llr[2] = vgetq_lane_s16(xmm1,4);
|
||||||
ulsch_llr[3] = vgetq_lane_s16(xmm1,5);
|
ulsch_llr[3] = vgetq_lane_s16(xmm1,5);
|
||||||
ulsch_llr[4] = vgetq_lane_s16(xmm2,4);
|
ulsch_llr[4] = vgetq_lane_s16(xmm2,4);
|
||||||
@@ -284,14 +403,25 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp,
|
|||||||
// ---------------------------------------
|
// ---------------------------------------
|
||||||
// 4th RE
|
// 4th RE
|
||||||
// ---------------------------------------
|
// ---------------------------------------
|
||||||
ulsch_llr[0] = ((short *)&rxF[i])[6];
|
|
||||||
ulsch_llr[1] = ((short *)&rxF[i])[7];
|
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
|
#ifdef __AVX2__
|
||||||
|
ulsch_llr[0] = _mm256_extract_epi16(xmm0,6);
|
||||||
|
ulsch_llr[1] = _mm256_extract_epi16(xmm0,7);
|
||||||
|
ulsch_llr[2] = _mm256_extract_epi16(xmm1,6);
|
||||||
|
ulsch_llr[3] = _mm256_extract_epi16(xmm1,7);
|
||||||
|
ulsch_llr[4] = _mm256_extract_epi16(xmm2,6);
|
||||||
|
ulsch_llr[5] = _mm256_extract_epi16(xmm2,7);
|
||||||
|
#else
|
||||||
|
ulsch_llr[0] = _mm_extract_epi16(xmm0,6);
|
||||||
|
ulsch_llr[1] = _mm_extract_epi16(xmm0,7);
|
||||||
ulsch_llr[2] = _mm_extract_epi16(xmm1,6);
|
ulsch_llr[2] = _mm_extract_epi16(xmm1,6);
|
||||||
ulsch_llr[3] = _mm_extract_epi16(xmm1,7);
|
ulsch_llr[3] = _mm_extract_epi16(xmm1,7);
|
||||||
ulsch_llr[4] = _mm_extract_epi16(xmm2,6);
|
ulsch_llr[4] = _mm_extract_epi16(xmm2,6);
|
||||||
ulsch_llr[5] = _mm_extract_epi16(xmm2,7);
|
ulsch_llr[5] = _mm_extract_epi16(xmm2,7);
|
||||||
|
#endif
|
||||||
#elif defined(__arm__)
|
#elif defined(__arm__)
|
||||||
|
ulsch_llr[0] = vgetq_lane_s16(xmm0,6);
|
||||||
|
ulsch_llr[1] = vgetq_lane_s16(xmm0,7);
|
||||||
ulsch_llr[2] = vgetq_lane_s16(xmm1,6);
|
ulsch_llr[2] = vgetq_lane_s16(xmm1,6);
|
||||||
ulsch_llr[3] = vgetq_lane_s16(xmm1,7);
|
ulsch_llr[3] = vgetq_lane_s16(xmm1,7);
|
||||||
ulsch_llr[4] = vgetq_lane_s16(xmm2,6);
|
ulsch_llr[4] = vgetq_lane_s16(xmm2,6);
|
||||||
@@ -300,6 +430,37 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp,
|
|||||||
// ---------------------------------------
|
// ---------------------------------------
|
||||||
|
|
||||||
ulsch_llr+=6;
|
ulsch_llr+=6;
|
||||||
|
#ifdef __AVX2__
|
||||||
|
ulsch_llr[0] = _mm256_extract_epi16(xmm0,8);
|
||||||
|
ulsch_llr[1] = _mm256_extract_epi16(xmm0,9);
|
||||||
|
ulsch_llr[2] = _mm256_extract_epi16(xmm1,8);
|
||||||
|
ulsch_llr[3] = _mm256_extract_epi16(xmm1,9);
|
||||||
|
ulsch_llr[4] = _mm256_extract_epi16(xmm2,8);
|
||||||
|
ulsch_llr[5] = _mm256_extract_epi16(xmm2,9);
|
||||||
|
|
||||||
|
ulsch_llr[6] = _mm256_extract_epi16(xmm0,10);
|
||||||
|
ulsch_llr[7] = _mm256_extract_epi16(xmm0,11);
|
||||||
|
ulsch_llr[8] = _mm256_extract_epi16(xmm1,10);
|
||||||
|
ulsch_llr[9] = _mm256_extract_epi16(xmm1,11);
|
||||||
|
ulsch_llr[10] = _mm256_extract_epi16(xmm2,10);
|
||||||
|
ulsch_llr[11] = _mm256_extract_epi16(xmm2,11);
|
||||||
|
|
||||||
|
ulsch_llr[12] = _mm256_extract_epi16(xmm0,12);
|
||||||
|
ulsch_llr[13] = _mm256_extract_epi16(xmm0,13);
|
||||||
|
ulsch_llr[14] = _mm256_extract_epi16(xmm1,12);
|
||||||
|
ulsch_llr[15] = _mm256_extract_epi16(xmm1,13);
|
||||||
|
ulsch_llr[16] = _mm256_extract_epi16(xmm2,12);
|
||||||
|
ulsch_llr[17] = _mm256_extract_epi16(xmm2,13);
|
||||||
|
|
||||||
|
ulsch_llr[18] = _mm256_extract_epi16(xmm0,14);
|
||||||
|
ulsch_llr[19] = _mm256_extract_epi16(xmm0,15);
|
||||||
|
ulsch_llr[20] = _mm256_extract_epi16(xmm1,14);
|
||||||
|
ulsch_llr[21] = _mm256_extract_epi16(xmm1,15);
|
||||||
|
ulsch_llr[22] = _mm256_extract_epi16(xmm2,14);
|
||||||
|
ulsch_llr[23] = _mm256_extract_epi16(xmm2,15);
|
||||||
|
|
||||||
|
ulsch_llr+=24;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
|
|||||||
@@ -315,7 +315,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
int16_t xr[24] __attribute__((aligned(32)));
|
int16_t xr[24] __attribute__((aligned(32)));
|
||||||
//int16_t xrt[24] __attribute__((aligned(32)));
|
//int16_t xrt[24] __attribute__((aligned(32)));
|
||||||
int32_t xrtmag=0;
|
int32_t xrtmag=0;
|
||||||
int maxpos=0;
|
uint8_t maxpos=0;
|
||||||
int n2=0;
|
int n2=0;
|
||||||
uint8_t index=0;
|
uint8_t index=0;
|
||||||
memset((void*)xr,0,24*sizeof(int16_t));
|
memset((void*)xr,0,24*sizeof(int16_t));
|
||||||
@@ -339,7 +339,8 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int32_t corr_re,corr_im,temp;
|
int32_t corr_re,corr_im,temp,no_corr=0;
|
||||||
|
int32_t av_corr=0;
|
||||||
int seq_index;
|
int seq_index;
|
||||||
|
|
||||||
for(i=0;i<nr_sequences;i++){
|
for(i=0;i<nr_sequences;i++){
|
||||||
@@ -359,63 +360,81 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
#ifdef DEBUG_NR_PUCCH_RX
|
#ifdef DEBUG_NR_PUCCH_RX
|
||||||
printf("PUCCH IDFT[%d/%d] = (%d,%d)=>%f\n",mcs[i],seq_index,corr_re,corr_im,10*log10(corr_re*corr_re + corr_im*corr_im));
|
printf("PUCCH IDFT[%d/%d] = (%d,%d)=>%f\n",mcs[i],seq_index,corr_re,corr_im,10*log10(corr_re*corr_re + corr_im*corr_im));
|
||||||
#endif
|
#endif
|
||||||
if ((temp=corr_re*corr_re + corr_im*corr_im)>xrtmag) {
|
temp=corr_re*corr_re + corr_im*corr_im;
|
||||||
|
av_corr+=temp;
|
||||||
|
if (temp>xrtmag) {
|
||||||
xrtmag=temp;
|
xrtmag=temp;
|
||||||
maxpos=i;
|
maxpos=i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(nr_sequences>1)
|
||||||
|
no_corr=(av_corr-xrtmag)/(nr_sequences-1);
|
||||||
|
av_corr/=nr_sequences;
|
||||||
|
|
||||||
uint8_t xrtmag_dB = dB_fixed(xrtmag);
|
uint8_t xrtmag_dB = dB_fixed(xrtmag);
|
||||||
|
|
||||||
//#ifdef DEBUG_NR_PUCCH_RX
|
#ifdef DEBUG_NR_PUCCH_RX
|
||||||
printf("PUCCH 0 : maxpos %d\n",maxpos);
|
printf("PUCCH 0 : maxpos %d\n",maxpos);
|
||||||
//#endif
|
#endif
|
||||||
|
|
||||||
index=maxpos;
|
index=maxpos;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// estimate CQI for MAC (from antenna port 0 only)
|
||||||
|
int SNRtimes10 = dB_fixed_times10(signal_energy(&rxdataF[0][pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size+re_offset],12)) - (10*gNB->measurements.n0_power_tot_dB);
|
||||||
|
int cqi;
|
||||||
|
if (SNRtimes10 < -640) cqi=0;
|
||||||
|
else if (SNRtimes10 > 635) cqi=255;
|
||||||
|
else cqi=(640+SNRtimes10)/5;
|
||||||
|
|
||||||
|
bool no_conf=false;
|
||||||
|
if (nr_sequences>1) {
|
||||||
|
if ((xrtmag_dB<(11+dB_fixed(no_corr))) || (dB_fixed(av_corr)<(13+gNB->measurements.n0_power_tot_dB))) //TODO these are temporary threshold based on measurments with the phone
|
||||||
|
no_conf=true;
|
||||||
|
}
|
||||||
// first bit of bitmap for sr presence and second bit for acknack presence
|
// first bit of bitmap for sr presence and second bit for acknack presence
|
||||||
uci_pdu->pduBitmap = pucch_pdu->sr_flag | ((pucch_pdu->bit_len_harq>0)<<1);
|
uci_pdu->pduBitmap = pucch_pdu->sr_flag | ((pucch_pdu->bit_len_harq>0)<<1);
|
||||||
uci_pdu->pucch_format = 0; // format 0
|
uci_pdu->pucch_format = 0; // format 0
|
||||||
uci_pdu->ul_cqi = 0xff; // currently not valid
|
uci_pdu->ul_cqi = cqi; // currently not valid
|
||||||
uci_pdu->timing_advance = 0xffff; // currently not valid
|
uci_pdu->timing_advance = 0xffff; // currently not valid
|
||||||
uci_pdu->rssi = 0xffff; // currently not valid
|
uci_pdu->rssi = 1280 - (10*dB_fixed(32767*32767)-dB_fixed_times10(signal_energy(&rxdataF[0][pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size+re_offset],12)));
|
||||||
|
|
||||||
if (pucch_pdu->bit_len_harq==0) {
|
if (pucch_pdu->bit_len_harq==0) {
|
||||||
uci_pdu->harq = NULL;
|
uci_pdu->harq = NULL;
|
||||||
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
||||||
if (xrtmag_dB>(gNB->measurements.n0_subband_power_tot_dB[pucch_pdu->prb_start]+gNB->pucch0_thres)) {
|
uci_pdu->sr->sr_confidence_level = (xrtmag_dB<(13+gNB->measurements.n0_power_tot_dB)) ? 1 : 0;
|
||||||
|
if (xrtmag_dB>(gNB->measurements.n0_power_tot_dB)) {
|
||||||
uci_pdu->sr->sr_indication = 1;
|
uci_pdu->sr->sr_indication = 1;
|
||||||
uci_pdu->sr->sr_confidence_level = xrtmag_dB-(gNB->measurements.n0_subband_power_tot_dB[pucch_pdu->prb_start]+gNB->pucch0_thres);
|
|
||||||
} else {
|
} else {
|
||||||
uci_pdu->sr->sr_indication = 0;
|
uci_pdu->sr->sr_indication = 0;
|
||||||
uci_pdu->sr->sr_confidence_level = (gNB->measurements.n0_subband_power_tot_dB[pucch_pdu->prb_start]+gNB->pucch0_thres)-xrtmag_dB;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (pucch_pdu->bit_len_harq==1) {
|
else if (pucch_pdu->bit_len_harq==1) {
|
||||||
uci_pdu->harq = calloc(1,sizeof(*uci_pdu->harq));
|
uci_pdu->harq = calloc(1,sizeof(*uci_pdu->harq));
|
||||||
uci_pdu->harq->num_harq = 1;
|
uci_pdu->harq->num_harq = 1;
|
||||||
uci_pdu->harq->harq_confidence_level = xrtmag_dB-(gNB->measurements.n0_subband_power_tot_dB[pucch_pdu->prb_start]+gNB->pucch0_thres);
|
uci_pdu->harq->harq_confidence_level = (no_conf) ? 1 : 0;
|
||||||
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(1);
|
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(1);
|
||||||
uci_pdu->harq->harq_list[0].harq_value = index&0x01;
|
uci_pdu->harq->harq_list[0].harq_value = index&0x01;
|
||||||
|
LOG_I(PHY, "HARQ value %d with confidence level (0 is good, 1 is bad) %d\n",
|
||||||
|
uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level);
|
||||||
if (pucch_pdu->sr_flag == 1) {
|
if (pucch_pdu->sr_flag == 1) {
|
||||||
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
||||||
uci_pdu->sr->sr_indication = (index>1) ? 1 : 0;
|
uci_pdu->sr->sr_indication = (index>1) ? 1 : 0;
|
||||||
uci_pdu->sr->sr_confidence_level = xrtmag_dB-(gNB->measurements.n0_subband_power_tot_dB[pucch_pdu->prb_start]+gNB->pucch0_thres);
|
uci_pdu->sr->sr_confidence_level = (no_conf) ? 1 : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
uci_pdu->harq = calloc(1,sizeof(*uci_pdu->harq));
|
uci_pdu->harq = calloc(1,sizeof(*uci_pdu->harq));
|
||||||
uci_pdu->harq->num_harq = 2;
|
uci_pdu->harq->num_harq = 2;
|
||||||
uci_pdu->harq->harq_confidence_level = xrtmag_dB-(gNB->measurements.n0_subband_power_tot_dB[pucch_pdu->prb_start]+gNB->pucch0_thres);
|
uci_pdu->harq->harq_confidence_level = (no_conf) ? 1 : 0;
|
||||||
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(2);
|
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(2);
|
||||||
|
|
||||||
uci_pdu->harq->harq_list[1].harq_value = index&0x01;
|
uci_pdu->harq->harq_list[1].harq_value = index&0x01;
|
||||||
uci_pdu->harq->harq_list[0].harq_value = (index>>1)&0x01;
|
uci_pdu->harq->harq_list[0].harq_value = (index>>1)&0x01;
|
||||||
|
LOG_I(PHY, "HARQ values %d and %d with confidence level (0 is good, 1 is bad) %d\n",
|
||||||
|
uci_pdu->harq->harq_list[1].harq_value,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level);
|
||||||
if (pucch_pdu->sr_flag == 1) {
|
if (pucch_pdu->sr_flag == 1) {
|
||||||
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
||||||
uci_pdu->sr->sr_indication = (index>3) ? 1 : 0;
|
uci_pdu->sr->sr_indication = (index>3) ? 1 : 0;
|
||||||
uci_pdu->sr->sr_confidence_level = xrtmag_dB-(gNB->measurements.n0_subband_power_tot_dB[pucch_pdu->prb_start]+gNB->pucch0_thres);
|
uci_pdu->sr->sr_confidence_level = (no_conf) ? 1 : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1047,6 +1066,8 @@ void init_pucch2_luts() {
|
|||||||
bit = (i&0x80) > 0 ? 0 : 1;
|
bit = (i&0x80) > 0 ? 0 : 1;
|
||||||
*lut_num_i = _mm_insert_epi16(*lut_num_i,bit,7);
|
*lut_num_i = _mm_insert_epi16(*lut_num_i,bit,7);
|
||||||
*lut_den_i = _mm_insert_epi16(*lut_den_i,1-bit,7);
|
*lut_den_i = _mm_insert_epi16(*lut_den_i,1-bit,7);
|
||||||
|
|
||||||
|
#ifdef DEBUG_NR_PUCCH_RX
|
||||||
printf("i %d, lut_num (%d,%d,%d,%d,%d,%d,%d,%d)\n",i,
|
printf("i %d, lut_num (%d,%d,%d,%d,%d,%d,%d,%d)\n",i,
|
||||||
((int16_t *)lut_num_i)[0],
|
((int16_t *)lut_num_i)[0],
|
||||||
((int16_t *)lut_num_i)[1],
|
((int16_t *)lut_num_i)[1],
|
||||||
@@ -1056,6 +1077,7 @@ void init_pucch2_luts() {
|
|||||||
((int16_t *)lut_num_i)[5],
|
((int16_t *)lut_num_i)[5],
|
||||||
((int16_t *)lut_num_i)[6],
|
((int16_t *)lut_num_i)[6],
|
||||||
((int16_t *)lut_num_i)[7]);
|
((int16_t *)lut_num_i)[7]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1418,56 +1440,60 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
|||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
#endif
|
#endif
|
||||||
// do complex correlation
|
|
||||||
for (int aa=0;aa<Prx;aa++) {
|
|
||||||
prod_re[aa] = _mm256_srai_epi16(_mm256_adds_epi16(_mm256_mullo_epi16(pucch2_lut[nb_bit-3][cw<<1],rp_re[aa][0]),
|
|
||||||
_mm256_mullo_epi16(pucch2_lut[nb_bit-3][(cw<<1)+1],rp_im[aa][0])),5);
|
|
||||||
prod_im[aa] = _mm256_srai_epi16(_mm256_subs_epi16(_mm256_mullo_epi16(pucch2_lut[nb_bit-3][cw<<1],rp2_im[aa][0]),
|
|
||||||
_mm256_mullo_epi16(pucch2_lut[nb_bit-3][(cw<<1)+1],rp2_re[aa][0])),5);
|
|
||||||
#ifdef DEBUG_NR_PUCCH_RX
|
|
||||||
printf("prod_re[%d] => (%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)",aa,
|
|
||||||
((int16_t*)&prod_re[aa])[0],((int16_t*)&prod_re[aa])[1],((int16_t*)&prod_re[aa])[2],((int16_t*)&prod_re[aa])[3],
|
|
||||||
((int16_t*)&prod_re[aa])[4],((int16_t*)&prod_re[aa])[5],((int16_t*)&prod_re[aa])[6],((int16_t*)&prod_re[aa])[7],
|
|
||||||
((int16_t*)&prod_re[aa])[8],((int16_t*)&prod_re[aa])[9],((int16_t*)&prod_re[aa])[10],((int16_t*)&prod_re[aa])[11],
|
|
||||||
((int16_t*)&prod_re[aa])[12],((int16_t*)&prod_re[aa])[13],((int16_t*)&prod_re[aa])[14],((int16_t*)&prod_re[aa])[15]);
|
|
||||||
printf("prod_im[%d] => (%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)",aa,
|
|
||||||
((int16_t*)&prod_im[aa])[0],((int16_t*)&prod_im[aa])[1],((int16_t*)&prod_im[aa])[2],((int16_t*)&prod_im[aa])[3],
|
|
||||||
((int16_t*)&prod_im[aa])[4],((int16_t*)&prod_im[aa])[5],((int16_t*)&prod_im[aa])[6],((int16_t*)&prod_im[aa])[7],
|
|
||||||
((int16_t*)&prod_im[aa])[8],((int16_t*)&prod_im[aa])[9],((int16_t*)&prod_im[aa])[10],((int16_t*)&prod_im[aa])[11],
|
|
||||||
((int16_t*)&prod_im[aa])[12],((int16_t*)&prod_im[aa])[13],((int16_t*)&prod_im[aa])[14],((int16_t*)&prod_im[aa])[15]);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
prod_re[aa] = _mm256_hadds_epi16(prod_re[aa],prod_re[aa]);// 0+1
|
|
||||||
prod_im[aa] = _mm256_hadds_epi16(prod_im[aa],prod_im[aa]);
|
|
||||||
prod_re[aa] = _mm256_hadds_epi16(prod_re[aa],prod_re[aa]);// 0+1+2+3
|
|
||||||
prod_im[aa] = _mm256_hadds_epi16(prod_im[aa],prod_im[aa]);
|
|
||||||
prod_re[aa] = _mm256_hadds_epi16(prod_re[aa],prod_re[aa]);// 0+1+2+3+4+5+6+7
|
|
||||||
prod_im[aa] = _mm256_hadds_epi16(prod_im[aa],prod_im[aa]);
|
|
||||||
prod_re[aa] = _mm256_hadds_epi16(prod_re[aa],prod_re[aa]);// 0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15
|
|
||||||
prod_im[aa] = _mm256_hadds_epi16(prod_im[aa],prod_im[aa]);
|
|
||||||
}
|
|
||||||
int64_t corr_re=0,corr_im=0;
|
|
||||||
|
|
||||||
int64_t corr_tmp = 0;
|
int64_t corr_tmp = 0;
|
||||||
for (int aa=0;aa<Prx;aa++) {
|
|
||||||
LOG_D(PHY,"pucch2 cw %d aa %d: (%d,%d)+(%d,%d) = (%d,%d)\n",cw,aa,
|
|
||||||
corr32_re[0][aa],corr32_im[0][aa],
|
|
||||||
((int16_t*)(&prod_re[aa]))[0],
|
|
||||||
((int16_t*)(&prod_im[aa]))[0],
|
|
||||||
corr32_re[0][aa]+((int16_t*)(&prod_re[0]))[0],
|
|
||||||
corr32_im[0][aa]+((int16_t*)(&prod_im[0]))[0]);
|
|
||||||
|
|
||||||
corr_re = ( corr32_re[0][aa]+((int16_t*)(&prod_re[0]))[0]);
|
|
||||||
corr_im = ( corr32_im[0][aa]+((int16_t*)(&prod_im[0]))[0]);
|
|
||||||
|
|
||||||
corr_tmp += corr_re*corr_re + corr_im*corr_im;
|
for (int group=0;group<ngroup;group++) {
|
||||||
}
|
// do complex correlation
|
||||||
|
for (int aa=0;aa<Prx;aa++) {
|
||||||
|
prod_re[aa] = _mm256_srai_epi16(_mm256_adds_epi16(_mm256_mullo_epi16(pucch2_lut[nb_bit-3][cw<<1],rp_re[aa][group]),
|
||||||
|
_mm256_mullo_epi16(pucch2_lut[nb_bit-3][(cw<<1)+1],rp_im[aa][group])),5);
|
||||||
|
prod_im[aa] = _mm256_srai_epi16(_mm256_subs_epi16(_mm256_mullo_epi16(pucch2_lut[nb_bit-3][cw<<1],rp2_im[aa][group]),
|
||||||
|
_mm256_mullo_epi16(pucch2_lut[nb_bit-3][(cw<<1)+1],rp2_re[aa][group])),5);
|
||||||
|
#ifdef DEBUG_NR_PUCCH_RX
|
||||||
|
printf("prod_re[%d] => (%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)",aa,
|
||||||
|
((int16_t*)&prod_re[aa])[0],((int16_t*)&prod_re[aa])[1],((int16_t*)&prod_re[aa])[2],((int16_t*)&prod_re[aa])[3],
|
||||||
|
((int16_t*)&prod_re[aa])[4],((int16_t*)&prod_re[aa])[5],((int16_t*)&prod_re[aa])[6],((int16_t*)&prod_re[aa])[7],
|
||||||
|
((int16_t*)&prod_re[aa])[8],((int16_t*)&prod_re[aa])[9],((int16_t*)&prod_re[aa])[10],((int16_t*)&prod_re[aa])[11],
|
||||||
|
((int16_t*)&prod_re[aa])[12],((int16_t*)&prod_re[aa])[13],((int16_t*)&prod_re[aa])[14],((int16_t*)&prod_re[aa])[15]);
|
||||||
|
printf("prod_im[%d] => (%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)",aa,
|
||||||
|
((int16_t*)&prod_im[aa])[0],((int16_t*)&prod_im[aa])[1],((int16_t*)&prod_im[aa])[2],((int16_t*)&prod_im[aa])[3],
|
||||||
|
((int16_t*)&prod_im[aa])[4],((int16_t*)&prod_im[aa])[5],((int16_t*)&prod_im[aa])[6],((int16_t*)&prod_im[aa])[7],
|
||||||
|
((int16_t*)&prod_im[aa])[8],((int16_t*)&prod_im[aa])[9],((int16_t*)&prod_im[aa])[10],((int16_t*)&prod_im[aa])[11],
|
||||||
|
((int16_t*)&prod_im[aa])[12],((int16_t*)&prod_im[aa])[13],((int16_t*)&prod_im[aa])[14],((int16_t*)&prod_im[aa])[15]);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
prod_re[aa] = _mm256_hadds_epi16(prod_re[aa],prod_re[aa]);// 0+1
|
||||||
|
prod_im[aa] = _mm256_hadds_epi16(prod_im[aa],prod_im[aa]);
|
||||||
|
prod_re[aa] = _mm256_hadds_epi16(prod_re[aa],prod_re[aa]);// 0+1+2+3
|
||||||
|
prod_im[aa] = _mm256_hadds_epi16(prod_im[aa],prod_im[aa]);
|
||||||
|
prod_re[aa] = _mm256_hadds_epi16(prod_re[aa],prod_re[aa]);// 0+1+2+3+4+5+6+7
|
||||||
|
prod_im[aa] = _mm256_hadds_epi16(prod_im[aa],prod_im[aa]);
|
||||||
|
prod_re[aa] = _mm256_hadds_epi16(prod_re[aa],prod_re[aa]);// 0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15
|
||||||
|
prod_im[aa] = _mm256_hadds_epi16(prod_im[aa],prod_im[aa]);
|
||||||
|
}
|
||||||
|
int64_t corr_re=0,corr_im=0;
|
||||||
|
|
||||||
|
|
||||||
|
for (int aa=0;aa<Prx;aa++) {
|
||||||
|
LOG_D(PHY,"pucch2 cw %d group %d aa %d: (%d,%d)+(%d,%d) = (%d,%d)\n",cw,group,aa,
|
||||||
|
corr32_re[group][aa],corr32_im[0][aa],
|
||||||
|
((int16_t*)(&prod_re[aa]))[0],
|
||||||
|
((int16_t*)(&prod_im[aa]))[0],
|
||||||
|
corr32_re[group][aa]+((int16_t*)(&prod_re[aa]))[0],
|
||||||
|
corr32_im[group][aa]+((int16_t*)(&prod_im[aa]))[0]);
|
||||||
|
|
||||||
|
corr_re = ( corr32_re[group][aa]+((int16_t*)(&prod_re[aa]))[0]);
|
||||||
|
corr_im = ( corr32_im[group][aa]+((int16_t*)(&prod_im[aa]))[0]);
|
||||||
|
|
||||||
|
corr_tmp += corr_re*corr_re + corr_im*corr_im;
|
||||||
|
} // aa loop
|
||||||
|
}// group loop
|
||||||
|
|
||||||
if (corr_tmp > corr) {
|
if (corr_tmp > corr) {
|
||||||
corr = corr_tmp;
|
corr = corr_tmp;
|
||||||
cw_ML=cw;
|
cw_ML=cw;
|
||||||
}
|
}
|
||||||
}
|
} // cw loop
|
||||||
corr_dB = dB_fixed64((uint64_t)corr);
|
corr_dB = dB_fixed64((uint64_t)corr);
|
||||||
LOG_D(PHY,"cw_ML %d, metric %d dB\n",cw_ML,corr_dB);
|
LOG_D(PHY,"cw_ML %d, metric %d dB\n",cw_ML,corr_dB);
|
||||||
decodedPayload[0]=(uint64_t)cw_ML;
|
decodedPayload[0]=(uint64_t)cw_ML;
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL)
|
|||||||
if (dlsch) {
|
if (dlsch) {
|
||||||
if (N_RB_DL != 273) {
|
if (N_RB_DL != 273) {
|
||||||
a_segments = a_segments*N_RB_DL;
|
a_segments = a_segments*N_RB_DL;
|
||||||
a_segments = a_segments/273;
|
a_segments = a_segments/273 +1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -283,7 +283,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
__m128i *pl = (__m128i*)&l;
|
__m128i *pl = (__m128i*)&l;
|
||||||
|
|
||||||
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_IN);
|
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_IN);
|
||||||
|
|
||||||
//NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[0];
|
//NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[0];
|
||||||
|
|
||||||
if (!dlsch_llr) {
|
if (!dlsch_llr) {
|
||||||
@@ -415,7 +415,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
|
|
||||||
if (nb_rb != 273) {
|
if (nb_rb != 273) {
|
||||||
a_segments = a_segments*nb_rb;
|
a_segments = a_segments*nb_rb;
|
||||||
a_segments = (a_segments + 272) / 273;
|
a_segments = a_segments/273 +1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (harq_process->C > a_segments) {
|
if (harq_process->C > a_segments) {
|
||||||
@@ -590,6 +590,9 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
// Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int
|
// Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int
|
||||||
if (check_crc((uint8_t*)llrProcBuf,length_dec,harq_process->F,crc_type)) {
|
if (check_crc((uint8_t*)llrProcBuf,length_dec,harq_process->F,crc_type)) {
|
||||||
LOG_D(PHY,"Segment %u CRC OK\n\033[0m",r);
|
LOG_D(PHY,"Segment %u CRC OK\n\033[0m",r);
|
||||||
|
if (r==0)
|
||||||
|
for (int i=0;i<10;i++) LOG_D(PHY,"byte %d : %x\n",i,((uint8_t*)llrProcBuf)[i]);
|
||||||
|
|
||||||
//Temporary hack
|
//Temporary hack
|
||||||
no_iteration_ldpc = dlsch->max_ldpc_iterations;
|
no_iteration_ldpc = dlsch->max_ldpc_iterations;
|
||||||
ret = no_iteration_ldpc;
|
ret = no_iteration_ldpc;
|
||||||
@@ -663,9 +666,8 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
harq_process->harq_ack.harq_id = harq_pid;
|
harq_process->harq_ack.harq_id = harq_pid;
|
||||||
harq_process->harq_ack.send_harq_status = 1;
|
harq_process->harq_ack.send_harq_status = 1;
|
||||||
harq_process->errors[harq_process->round]++;
|
harq_process->errors[harq_process->round]++;
|
||||||
// harq_process->round++; // [hna] uncomment this line when HARQ is implemented
|
|
||||||
|
|
||||||
// printf("Rate: [UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
|
// printf("Rate: [UE %d] DLSCH: Setting NACK for slot %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,nr_tti_rx,harq_pid,harq_process->round);
|
||||||
if (harq_process->round >= dlsch->Mlimit) {
|
if (harq_process->round >= dlsch->Mlimit) {
|
||||||
harq_process->status = SCH_IDLE;
|
harq_process->status = SCH_IDLE;
|
||||||
harq_process->round = 0;
|
harq_process->round = 0;
|
||||||
@@ -958,7 +960,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
|
|
||||||
if (nb_rb != 273) {
|
if (nb_rb != 273) {
|
||||||
a_segments = a_segments*nb_rb;
|
a_segments = a_segments*nb_rb;
|
||||||
a_segments = a_segments/273;
|
a_segments = a_segments/273 +1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (harq_process->C > a_segments) {
|
if (harq_process->C > a_segments) {
|
||||||
@@ -1536,7 +1538,7 @@ void nr_dlsch_decoding_process(void *arg)
|
|||||||
|
|
||||||
if (nb_rb != 273) {
|
if (nb_rb != 273) {
|
||||||
a_segments = a_segments*nb_rb;
|
a_segments = a_segments*nb_rb;
|
||||||
a_segments = a_segments/273;
|
a_segments = a_segments/273 +1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (harq_process->C > a_segments) {
|
if (harq_process->C > a_segments) {
|
||||||
|
|||||||
@@ -159,20 +159,17 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SI_PDSCH:
|
case SI_PDSCH:
|
||||||
pdsch_vars = ue->pdsch_vars_SI;
|
pdsch_vars = ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]];
|
||||||
dlsch = &ue->dlsch_SI[eNB_id];
|
dlsch = &ue->dlsch_SI[eNB_id];
|
||||||
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RA_PDSCH:
|
case RA_PDSCH:
|
||||||
pdsch_vars = ue->pdsch_vars_ra;
|
pdsch_vars = ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]];
|
||||||
dlsch = &ue->dlsch_ra[eNB_id];
|
dlsch = &ue->dlsch_ra[eNB_id];
|
||||||
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
||||||
|
|
||||||
// WIP TBR Hotfix
|
|
||||||
memcpy((void*)&pdsch_vars[eNB_id]->dl_ch_estimates[0][ue->frame_parms.ofdm_symbol_size*2], (void*)&ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][0]->dl_ch_estimates[0][ue->frame_parms.ofdm_symbol_size*2], ue->frame_parms.ofdm_symbol_size*sizeof(int32_t));
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PDSCH:
|
case PDSCH:
|
||||||
@@ -189,7 +186,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dlsch1_harq){
|
if (dlsch0_harq && dlsch1_harq){
|
||||||
|
|
||||||
//printf("status TB0 = %d, status TB1 = %d \n", dlsch[0]->harq_processes[harq_pid]->status, dlsch[1]->harq_processes[harq_pid]->status);
|
//printf("status TB0 = %d, status TB1 = %d \n", dlsch[0]->harq_processes[harq_pid]->status, dlsch[1]->harq_processes[harq_pid]->status);
|
||||||
LOG_D(PHY,"AbsSubframe %d.%d / Sym %d harq_pid %d, harq status %d.%d \n", frame, nr_tti_rx, symbol, harq_pid, dlsch0_harq->status, dlsch1_harq->status);
|
LOG_D(PHY,"AbsSubframe %d.%d / Sym %d harq_pid %d, harq status %d.%d \n", frame, nr_tti_rx, symbol, harq_pid, dlsch0_harq->status, dlsch1_harq->status);
|
||||||
@@ -230,19 +227,18 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
} else if (dlsch0_harq) {
|
} else if (dlsch0_harq) {
|
||||||
if (dlsch0_harq->status == ACTIVE)
|
if (dlsch0_harq->status == ACTIVE) {
|
||||||
codeword_TB0 = dlsch0_harq->codeword;
|
codeword_TB0 = dlsch0_harq->codeword;
|
||||||
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
||||||
|
|
||||||
#ifdef DEBUG_HARQ
|
#ifdef DEBUG_HARQ
|
||||||
printf("[DEMOD] I am assuming only TB0 is active\n");
|
printf("[DEMOD] I am assuming only TB0 is active\n");
|
||||||
#endif
|
#endif
|
||||||
|
} else {
|
||||||
|
LOG_E(PHY,"[UE][FATAL] nr_tti_rx %d: no active DLSCH\n", nr_tti_rx);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_E(PHY,"[UE][FATAL] nr_tti_rx %d: no active DLSCH\n", nr_tti_rx);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dlsch0_harq == NULL) {
|
|
||||||
LOG_E(PHY, "Done\n");
|
LOG_E(PHY, "Done\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -347,9 +343,9 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
dlsch0_harq->pmi_alloc,
|
dlsch0_harq->pmi_alloc,
|
||||||
pdsch_vars[eNB_id_i]->pmi_ext,
|
pdsch_vars[eNB_id_i]->pmi_ext,
|
||||||
symbol,
|
symbol,
|
||||||
pilots,
|
pilots,
|
||||||
start_rb,
|
start_rb,
|
||||||
nb_rb_pdsch,
|
nb_rb_pdsch,
|
||||||
nr_tti_rx,
|
nr_tti_rx,
|
||||||
ue->high_speed_flag,
|
ue->high_speed_flag,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
@@ -362,9 +358,9 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
dlsch0_harq->pmi_alloc,
|
dlsch0_harq->pmi_alloc,
|
||||||
pdsch_vars[eNB_id_i]->pmi_ext,
|
pdsch_vars[eNB_id_i]->pmi_ext,
|
||||||
symbol,
|
symbol,
|
||||||
pilots,
|
pilots,
|
||||||
start_rb,
|
start_rb,
|
||||||
nb_rb_pdsch,
|
nb_rb_pdsch,
|
||||||
nr_tti_rx,
|
nr_tti_rx,
|
||||||
ue->high_speed_flag,
|
ue->high_speed_flag,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
@@ -524,7 +520,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
(aatx>1) ? pdsch_vars[eNB_id]->rho : NULL,
|
(aatx>1) ? pdsch_vars[eNB_id]->rho : NULL,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
symbol,
|
symbol,
|
||||||
pilots,
|
pilots,
|
||||||
first_symbol_flag,
|
first_symbol_flag,
|
||||||
dlsch0_harq->Qm,
|
dlsch0_harq->Qm,
|
||||||
nb_rb,
|
nb_rb,
|
||||||
@@ -1155,7 +1151,7 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
|
|||||||
int **rho,
|
int **rho,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
uint8_t pilots,
|
uint8_t pilots,
|
||||||
uint8_t first_symbol_flag,
|
uint8_t first_symbol_flag,
|
||||||
unsigned char mod_order,
|
unsigned char mod_order,
|
||||||
unsigned short nb_rb,
|
unsigned short nb_rb,
|
||||||
|
|||||||
@@ -786,16 +786,16 @@ void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
//----------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||||
int32_t **rxdataF_comp,
|
int32_t **rxdataF_comp,
|
||||||
int16_t *dlsch_llr,
|
int16_t *dlsch_llr,
|
||||||
int32_t **dl_ch_mag,
|
int32_t **dl_ch_mag,
|
||||||
int32_t **dl_ch_magb,
|
int32_t **dl_ch_magb,
|
||||||
uint8_t symbol,
|
uint8_t symbol,
|
||||||
uint32_t len,
|
uint32_t len,
|
||||||
uint8_t first_symbol_flag,
|
uint8_t first_symbol_flag,
|
||||||
uint16_t nb_rb,
|
uint16_t nb_rb,
|
||||||
uint32_t llr_offset,
|
uint32_t llr_offset,
|
||||||
uint8_t beamforming_mode)
|
uint8_t beamforming_mode)
|
||||||
{
|
{
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
__m128i *rxF = (__m128i*)&rxdataF_comp[0][(symbol*nb_rb*12)];
|
__m128i *rxF = (__m128i*)&rxdataF_comp[0][(symbol*nb_rb*12)];
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
|||||||
int16_t prach_tmp[98304*2*4] __attribute__((aligned(32)));
|
int16_t prach_tmp[98304*2*4] __attribute__((aligned(32)));
|
||||||
|
|
||||||
int16_t Ncp = 0, amp, *prach, *prach2, *prachF, *Xu;
|
int16_t Ncp = 0, amp, *prach, *prach2, *prachF, *Xu;
|
||||||
int32_t Xu_re, Xu_im, samp_count;
|
int32_t Xu_re, Xu_im;
|
||||||
int prach_start, prach_sequence_length, i, prach_len, dftlen, mu, kbar, K, n_ra_prb, k;
|
int prach_start, prach_sequence_length, i, prach_len, dftlen, mu, kbar, K, n_ra_prb, k;
|
||||||
//int restricted_Type;
|
//int restricted_Type;
|
||||||
|
|
||||||
@@ -103,22 +103,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
|||||||
nrUE_config->prach_config.num_prach_fd_occasions_list[fd_occasion].prach_root_sequence_index,
|
nrUE_config->prach_config.num_prach_fd_occasions_list[fd_occasion].prach_root_sequence_index,
|
||||||
ue->X_u);
|
ue->X_u);
|
||||||
|
|
||||||
if (mu == 0)
|
prach_start = fp->get_samples_slot_timestamp(slot, fp, 0);
|
||||||
samp_count = fp->samples_per_subframe;
|
|
||||||
else
|
|
||||||
samp_count = (slot%(fp->slots_per_subframe/2)) ? fp->samples_per_slotN0 : fp->samples_per_slot0;
|
|
||||||
|
|
||||||
#ifdef OAI_USRP
|
|
||||||
prach_start = (ue->rx_offset + slot*samp_count - ue->hw_timing_advance - ue->N_TA_offset);
|
|
||||||
#else //normal case (simulation)
|
|
||||||
prach_start = slot*samp_count - ue->N_TA_offset;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (prach_start<0)
|
|
||||||
prach_start += (fp->samples_per_subframe*NR_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
|
||||||
|
|
||||||
if (prach_start >= (fp->samples_per_subframe*NR_NUMBER_OF_SUBFRAMES_PER_FRAME))
|
|
||||||
prach_start -= (fp->samples_per_subframe*NR_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
|
||||||
|
|
||||||
// First compute physical root sequence
|
// First compute physical root sequence
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
@@ -796,40 +781,16 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NR_PRACH_DEBUG
|
#ifdef NR_PRACH_DEBUG
|
||||||
LOG_I(PHY, "PRACH [UE %d] N_RB_UL %d prach_start %d, prach_len %d, rx_offset %d, hw_timing_advance %d, N_TA_offset %d\n", Mod_id,
|
LOG_I(PHY, "PRACH [UE %d] N_RB_UL %d prach_start %d, prach_len %d\n", Mod_id,
|
||||||
fp->N_RB_UL,
|
fp->N_RB_UL,
|
||||||
prach_start,
|
prach_start,
|
||||||
prach_len,
|
prach_len);
|
||||||
ue->rx_offset,
|
|
||||||
ue->hw_timing_advance,
|
|
||||||
ue->N_TA_offset);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
for (i=0; i<prach_len; i++) {
|
||||||
int j, overflow = prach_start + prach_len - NR_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_subframe;
|
((int16_t*)(&ue->common_vars.txdata[0][prach_start]))[2*i] = prach[2*i];
|
||||||
|
((int16_t*)(&ue->common_vars.txdata[0][prach_start]))[2*i+1] = prach[2*i+1];
|
||||||
#ifdef NR_PRACH_DEBUG
|
}
|
||||||
LOG_I( PHY, "PRACH [UE %d] overflow = %d\n", Mod_id, overflow);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// prach_start=414.730, overflow=-39470 prach_len=6600 fp->samples_per_subframe*NR_NUMBER_OF_SUBFRAMES_PER_FRAME 460.800 prach_start+prach_len 421.330 fp->samples_per_subframe 46080
|
|
||||||
|
|
||||||
// from prach_start=414.730 to prach_start+prach_len 421.330
|
|
||||||
for (i = prach_start, j = 0; i < min(fp->samples_per_subframe*NR_NUMBER_OF_SUBFRAMES_PER_FRAME, prach_start + prach_len); i++, j++) {
|
|
||||||
((int16_t*)ue->common_vars.txdata[0])[2*i] = prach[2*j];
|
|
||||||
((int16_t*)ue->common_vars.txdata[0])[2*i+1] = prach[2*j+1];
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < overflow; i++,j++) {
|
|
||||||
((int16_t*)ue->common_vars.txdata[0])[2*i] = prach[2*j];
|
|
||||||
((int16_t*)ue->common_vars.txdata[0])[2*i+1] = prach[2*j+1];
|
|
||||||
}
|
|
||||||
#else // simulators
|
|
||||||
for (i=0; i<prach_len; i++) {
|
|
||||||
((int16_t*)(&ue->common_vars.txdata[0][prach_start]))[2*i] = prach[2*i];
|
|
||||||
((int16_t*)(&ue->common_vars.txdata[0][prach_start]))[2*i+1] = prach[2*i+1];
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//printf("----------------------\n");
|
//printf("----------------------\n");
|
||||||
//for(int ii = prach_start; ii<2*(prach_start + prach_len); ii++){
|
//for(int ii = prach_start; ii<2*(prach_start + prach_len); ii++){
|
||||||
|
|||||||
@@ -1074,11 +1074,9 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
|
uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
|
||||||
uint8_t harq_pid,
|
|
||||||
uint8_t slot,
|
uint8_t slot,
|
||||||
uint8_t thread_id,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
uint8_t gNB_id,
|
uint8_t Nl);
|
||||||
NR_DL_FRAME_PARMS *frame_parms);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr,unsigned char N_RB_UL)
|
|||||||
|
|
||||||
if (N_RB_UL != 273) {
|
if (N_RB_UL != 273) {
|
||||||
a_segments = a_segments*N_RB_UL;
|
a_segments = a_segments*N_RB_UL;
|
||||||
a_segments = a_segments/273;
|
a_segments = a_segments/273 +1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -114,7 +114,7 @@ NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL,
|
|||||||
|
|
||||||
if (N_RB_UL != 273) {
|
if (N_RB_UL != 273) {
|
||||||
a_segments = a_segments*N_RB_UL;
|
a_segments = a_segments*N_RB_UL;
|
||||||
a_segments = a_segments/273;
|
a_segments = a_segments/273 +1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t ulsch_bytes = a_segments*1056; // allocated bytes per segment
|
uint16_t ulsch_bytes = a_segments*1056; // allocated bytes per segment
|
||||||
@@ -225,8 +225,9 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
|
|||||||
unsigned int crc;
|
unsigned int crc;
|
||||||
NR_UL_UE_HARQ_t *harq_process;
|
NR_UL_UE_HARQ_t *harq_process;
|
||||||
uint16_t nb_rb ;
|
uint16_t nb_rb ;
|
||||||
uint32_t A, Z, F;
|
uint32_t A, F;
|
||||||
uint32_t *pz;
|
static uint32_t Z = 0;
|
||||||
|
uint32_t *pz = &Z;
|
||||||
uint8_t mod_order;
|
uint8_t mod_order;
|
||||||
uint16_t Kr,r;
|
uint16_t Kr,r;
|
||||||
uint32_t r_offset;
|
uint32_t r_offset;
|
||||||
@@ -258,6 +259,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
|
|||||||
Ilbrm = 0;
|
Ilbrm = 0;
|
||||||
Tbslbrm = 950984; //max tbs
|
Tbslbrm = 950984; //max tbs
|
||||||
Coderate = 0.0;
|
Coderate = 0.0;
|
||||||
|
harq_process->round = nr_rv_round_map_ue[harq_process->pusch_pdu.pusch_data.rv_index];
|
||||||
|
|
||||||
///////////
|
///////////
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -409,6 +411,8 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
}
|
}
|
||||||
|
F = harq_process->F;
|
||||||
|
Kr = harq_process->K;
|
||||||
|
|
||||||
for (r=0; r<harq_process->C; r++) { // looping over C segments
|
for (r=0; r<harq_process->C; r++) { // looping over C segments
|
||||||
|
|
||||||
@@ -420,19 +424,15 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_DLSCH_CODING
|
|
||||||
printf("Rate Matching, Code segment %d (coded bits (G) %u, unpunctured/repeated bits per code segment %d, mod_order %d, nb_rb %d)...\n",
|
LOG_D(PHY,"Rate Matching, Code segment %d (coded bits (G) %u, unpunctured/repeated bits per code segment %d, mod_order %d, nb_rb %d, rvidx %d)...\n",
|
||||||
r,
|
r,
|
||||||
G,
|
G,
|
||||||
Kr*3,
|
Kr*3,
|
||||||
mod_order,nb_rb);
|
mod_order,nb_rb,
|
||||||
#endif
|
harq_process->pusch_pdu.pusch_data.rv_index);
|
||||||
|
|
||||||
//start_meas(rm_stats);
|
//start_meas(rm_stats);
|
||||||
#ifdef DEBUG_DLSCH_CODING
|
|
||||||
printf("rvidx in encoding = %d\n", harq_process->pusch_pdu.pusch_data.rv_index);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
///////////////////////// d---->| Rate matching bit selection |---->e /////////////////////////
|
///////////////////////// d---->| Rate matching bit selection |---->e /////////////////////////
|
||||||
///////////
|
///////////
|
||||||
|
|
||||||
|
|||||||
@@ -226,12 +226,12 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
/////////////////////////PTRS parameters' initialization/////////////////////////
|
/////////////////////////PTRS parameters' initialization/////////////////////////
|
||||||
///////////
|
///////////
|
||||||
|
|
||||||
int16_t mod_ptrs[(nb_rb/2)*(NR_SYMBOLS_PER_SLOT-1)*2]; // assume maximum number of PTRS per pusch allocation
|
int16_t mod_ptrs[nb_rb] __attribute((aligned(16))); // assume maximum number of PTRS per pusch allocation
|
||||||
K_ptrs = 0; // just to avoid a warning
|
K_ptrs = 0; // just to avoid a warning
|
||||||
|
|
||||||
if (harq_process_ul_ue->pusch_pdu.pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
|
if (harq_process_ul_ue->pusch_pdu.pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
|
||||||
|
|
||||||
K_ptrs = (harq_process_ul_ue->pusch_pdu.pusch_ptrs.ptrs_freq_density)?4:2;
|
K_ptrs = harq_process_ul_ue->pusch_pdu.pusch_ptrs.ptrs_freq_density;
|
||||||
L_ptrs = 1<<harq_process_ul_ue->pusch_pdu.pusch_ptrs.ptrs_time_density;
|
L_ptrs = 1<<harq_process_ul_ue->pusch_pdu.pusch_ptrs.ptrs_time_density;
|
||||||
|
|
||||||
beta_ptrs = 1; // temp value until power control is implemented
|
beta_ptrs = 1; // temp value until power control is implemented
|
||||||
@@ -322,7 +322,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
uint16_t m=0, n=0, dmrs_idx=0, ptrs_idx = 0;
|
uint16_t m=0, n=0, dmrs_idx=0, ptrs_idx = 0;
|
||||||
|
|
||||||
for (l=start_symbol; l<start_symbol+number_of_symbols; l++) {
|
for (l=start_symbol; l<start_symbol+number_of_symbols; l++) {
|
||||||
|
ptrs_idx = 0; // every PTRS symbol has a new gold sequence
|
||||||
k = start_sc;
|
k = start_sc;
|
||||||
n = 0;
|
n = 0;
|
||||||
dmrs_idx = 0;
|
dmrs_idx = 0;
|
||||||
@@ -425,31 +425,18 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
|
|
||||||
|
|
||||||
uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
|
uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
|
||||||
uint8_t harq_pid,
|
|
||||||
uint8_t slot,
|
uint8_t slot,
|
||||||
uint8_t thread_id,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
uint8_t gNB_id,
|
uint8_t Nl) {
|
||||||
NR_DL_FRAME_PARMS *frame_parms) {
|
|
||||||
|
|
||||||
int tx_offset, ap;
|
int tx_offset, ap;
|
||||||
int32_t **txdata;
|
int32_t **txdata;
|
||||||
int32_t **txdataF;
|
int32_t **txdataF;
|
||||||
int timing_advance;
|
|
||||||
uint8_t Nl = UE->ulsch[thread_id][gNB_id][0]->harq_processes[harq_pid]->pusch_pdu.nrOfLayers; // cw 0
|
|
||||||
|
|
||||||
/////////////////////////IFFT///////////////////////
|
/////////////////////////IFFT///////////////////////
|
||||||
///////////
|
///////////
|
||||||
|
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) || defined(OAI_ADRV9371_ZC706)
|
tx_offset = frame_parms->get_samples_slot_timestamp(slot, frame_parms, 0);
|
||||||
timing_advance = UE->timing_advance;
|
|
||||||
#else
|
|
||||||
timing_advance = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
tx_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0) - timing_advance;
|
|
||||||
|
|
||||||
if (tx_offset < 0)
|
|
||||||
tx_offset += frame_parms->samples_per_frame;
|
|
||||||
|
|
||||||
// clear the transmit data array for the current subframe
|
// clear the transmit data array for the current subframe
|
||||||
/*for (int aa=0; aa<UE->frame_parms.nb_antennas_tx; aa++) {
|
/*for (int aa=0; aa<UE->frame_parms.nb_antennas_tx; aa++) {
|
||||||
@@ -461,49 +448,32 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
txdata = UE->common_vars.txdata;
|
txdata = UE->common_vars.txdata;
|
||||||
txdataF = UE->common_vars.txdataF;
|
txdataF = UE->common_vars.txdataF;
|
||||||
|
|
||||||
if(UE->N_TA_offset > tx_offset) {
|
int symb_offset = (slot%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
|
||||||
int32_t *tmp_idft_out = (int32_t*)malloc16(frame_parms->get_samples_per_slot(slot, frame_parms) * sizeof(int32_t));
|
for(ap = 0; ap < Nl; ap++) {
|
||||||
|
for (int s=0;s<NR_NUMBER_OF_SYMBOLS_PER_SLOT;s++){
|
||||||
for(ap = 0; ap < Nl; ap++) {
|
LOG_D(PHY,"rotating txdataF symbol %d (%d) => (%d.%d)\n",
|
||||||
if (frame_parms->Ncp == 1) { // extended cyclic prefix
|
s,s+symb_offset,frame_parms->symbol_rotation[2*(s+symb_offset)],frame_parms->symbol_rotation[1+(2*(s+symb_offset))]);
|
||||||
PHY_ofdm_mod(txdataF[ap],
|
rotate_cpx_vector((int16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size*s],
|
||||||
tmp_idft_out,
|
&frame_parms->symbol_rotation[2*(s+symb_offset)],
|
||||||
frame_parms->ofdm_symbol_size,
|
(int16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size*s],
|
||||||
12,
|
frame_parms->ofdm_symbol_size,
|
||||||
frame_parms->nb_prefix_samples,
|
15);
|
||||||
CYCLIC_PREFIX);
|
|
||||||
} else { // normal cyclic prefix
|
|
||||||
nr_normal_prefix_mod(txdataF[ap],
|
|
||||||
tmp_idft_out,
|
|
||||||
14,
|
|
||||||
frame_parms);
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy((void *) &txdata[ap][frame_parms->samples_per_frame - UE->N_TA_offset + tx_offset],
|
|
||||||
(void *) tmp_idft_out,
|
|
||||||
(UE->N_TA_offset - tx_offset) * sizeof(int32_t));
|
|
||||||
|
|
||||||
memcpy((void *) &txdata[ap][0],
|
|
||||||
(void *) &tmp_idft_out[UE->N_TA_offset - tx_offset],
|
|
||||||
(frame_parms->get_samples_per_slot(slot, frame_parms) - UE->N_TA_offset + tx_offset) * sizeof(int32_t));
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
free(tmp_idft_out);
|
for (ap = 0; ap < Nl; ap++) {
|
||||||
} else { // UE->N_TA_offset <= tx_offset
|
if (frame_parms->Ncp == 1) { // extended cyclic prefix
|
||||||
for (ap = 0; ap < Nl; ap++) {
|
PHY_ofdm_mod(txdataF[ap],
|
||||||
if (frame_parms->Ncp == 1) { // extended cyclic prefix
|
&txdata[ap][tx_offset],
|
||||||
PHY_ofdm_mod(txdataF[ap],
|
frame_parms->ofdm_symbol_size,
|
||||||
&txdata[ap][tx_offset-UE->N_TA_offset],
|
12,
|
||||||
frame_parms->ofdm_symbol_size,
|
frame_parms->nb_prefix_samples,
|
||||||
12,
|
CYCLIC_PREFIX);
|
||||||
frame_parms->nb_prefix_samples,
|
} else { // normal cyclic prefix
|
||||||
CYCLIC_PREFIX);
|
nr_normal_prefix_mod(txdataF[ap],
|
||||||
} else { // normal cyclic prefix
|
&txdata[ap][tx_offset],
|
||||||
nr_normal_prefix_mod(txdataF[ap],
|
14,
|
||||||
&txdata[ap][tx_offset-UE->N_TA_offset],
|
frame_parms);
|
||||||
14,
|
|
||||||
frame_parms);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -270,7 +270,6 @@ void generate_pss_nr(NR_DL_FRAME_PARMS *fp,int N_ID_2)
|
|||||||
if (k>= fp->ofdm_symbol_size) k-=fp->ofdm_symbol_size;
|
if (k>= fp->ofdm_symbol_size) k-=fp->ofdm_symbol_size;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (int i=0; i < LENGTH_PSS_NR; i++) {
|
for (int i=0; i < LENGTH_PSS_NR; i++) {
|
||||||
synchroF_tmp[2*k] = primary_synchro[2*i];
|
synchroF_tmp[2*k] = primary_synchro[2*i];
|
||||||
synchroF_tmp[2*k+1] = primary_synchro[2*i+1];
|
synchroF_tmp[2*k+1] = primary_synchro[2*i+1];
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
|
|||||||
// if frequency hopping is enabled n_hop = 1 for second hop. Not sure frequency hopping concerns format 0. FIXME!!!
|
// if frequency hopping is enabled n_hop = 1 for second hop. Not sure frequency hopping concerns format 0. FIXME!!!
|
||||||
// if ((PUCCH_Frequency_Hopping == 1)&&(l == (nrofSymbols-1))) n_hop = 1;
|
// if ((PUCCH_Frequency_Hopping == 1)&&(l == (nrofSymbols-1))) n_hop = 1;
|
||||||
nr_group_sequence_hopping(pucch_GroupHopping,hoppingId,n_hop,nr_tti_tx,&u,&v); // calculating u and v value
|
nr_group_sequence_hopping(pucch_GroupHopping,hoppingId,n_hop,nr_tti_tx,&u,&v); // calculating u and v value
|
||||||
alpha = nr_cyclic_shift_hopping(ue->pucch_config_common_nr->hoppingId,m0,mcs,l,startingSymbolIndex,nr_tti_tx);
|
alpha = nr_cyclic_shift_hopping(hoppingId,m0,mcs,l,startingSymbolIndex,nr_tti_tx);
|
||||||
#ifdef DEBUG_NR_PUCCH_TX
|
#ifdef DEBUG_NR_PUCCH_TX
|
||||||
printf("\t [nr_generate_pucch0] sequence generation \tu=%d \tv=%d \talpha=%lf \t(for symbol l=%d)\n",u,v,alpha,l);
|
printf("\t [nr_generate_pucch0] sequence generation \tu=%d \tv=%d \talpha=%lf \t(for symbol l=%d)\n",u,v,alpha,l);
|
||||||
#endif
|
#endif
|
||||||
@@ -928,7 +928,17 @@ void nr_uci_encoding(uint64_t payload,
|
|||||||
if (A<=11) {
|
if (A<=11) {
|
||||||
// procedure in subclause 6.3.1.2.2 (UCI encoded by channel coding of small block lengths -> subclause 6.3.1.3.2)
|
// procedure in subclause 6.3.1.2.2 (UCI encoded by channel coding of small block lengths -> subclause 6.3.1.3.2)
|
||||||
// CRC bits are not attached, and coding small block lengths (subclause 5.3.3)
|
// CRC bits are not attached, and coding small block lengths (subclause 5.3.3)
|
||||||
b[0] = encodeSmallBlock((uint16_t*)&payload,A);
|
uint64_t b0= encodeSmallBlock((uint16_t*)&payload,A);
|
||||||
|
// repetition for rate-matching up to 16 PRB
|
||||||
|
b[0] = b0 | (b0<<32);
|
||||||
|
b[1] = b[0];
|
||||||
|
b[2] = b[0];
|
||||||
|
b[3] = b[0];
|
||||||
|
b[4] = b[0];
|
||||||
|
b[5] = b[0];
|
||||||
|
b[6] = b[0];
|
||||||
|
b[7] = b[0];
|
||||||
|
AssertFatal(nrofPRB<=16,"Number of PRB >16\n");
|
||||||
} else if (A>=12) {
|
} else if (A>=12) {
|
||||||
AssertFatal(A<65,"Polar encoding not supported yet for UCI with more than 64 bits\n");
|
AssertFatal(A<65,"Polar encoding not supported yet for UCI with more than 64 bits\n");
|
||||||
t_nrPolar_params *currentPtr = nr_polar_params(NR_POLAR_UCI_PUCCH_MESSAGE_TYPE,
|
t_nrPolar_params *currentPtr = nr_polar_params(NR_POLAR_UCI_PUCCH_MESSAGE_TYPE,
|
||||||
|
|||||||
@@ -525,32 +525,25 @@ static void uePcchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_
|
|||||||
if (!phy_vars_ue->pdcch_vars[0][eNB_id]->llr)
|
if (!phy_vars_ue->pdcch_vars[0][eNB_id]->llr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
|
int num_re = 4*273*12; // 12*frame_parms->N_RB_DL*num_pdcch_symbols
|
||||||
uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
|
int Qm = 2;
|
||||||
uint8_t nb_antennas_tx = frame_parms->nb_antennas_tx;
|
int coded_bits_per_codeword = num_re*Qm;
|
||||||
scopeSample_t **chest_f = (scopeSample_t **) phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates;
|
localBuff(llr,coded_bits_per_codeword*RX_NB_TH_MAX);
|
||||||
int ind = 0;
|
localBuff(bit,coded_bits_per_codeword*RX_NB_TH_MAX);
|
||||||
float chest_f_abs[frame_parms->ofdm_symbol_size];
|
int base=0;
|
||||||
float freq[frame_parms->ofdm_symbol_size];
|
|
||||||
|
|
||||||
for (int atx=0; atx<nb_antennas_tx; atx++) {
|
for (int thr=0 ; thr < RX_NB_TH_MAX ; thr ++ ) {
|
||||||
for (int arx=0; arx<nb_antennas_rx; arx++) {
|
int16_t *pdcch_llr = (int16_t *) phy_vars_ue->pdcch_vars[thr][eNB_id]->llr;
|
||||||
if (chest_f[(atx<<1)+arx] != NULL) {
|
|
||||||
for (int k=0; k<frame_parms->ofdm_symbol_size; k++) {
|
for (int i=0; i<coded_bits_per_codeword; i++) {
|
||||||
freq[ind] = (float)ind;
|
llr[base+i] = (float) pdcch_llr[i];
|
||||||
chest_f_abs[ind] = (short)10*log10(1.0+SquaredNorm(chest_f[(atx<<1)+arx][6144+k]));
|
bit[base+i] = (float) base+i;
|
||||||
ind++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
base+=coded_bits_per_codeword;
|
||||||
}
|
}
|
||||||
|
|
||||||
// tx antenna 0
|
oai_xygraph(graph,bit,llr,base,0,10);
|
||||||
//fl_set_xyplot_xbounds(form->chest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce);
|
|
||||||
//fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2);
|
|
||||||
// fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2);
|
|
||||||
//fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
|
|
||||||
oai_xygraph(graph,freq,chest_f_abs,frame_parms->ofdm_symbol_size,0,10);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void uePcchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
|
static void uePcchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
|
||||||
|
|||||||
@@ -452,55 +452,6 @@ typedef struct {
|
|||||||
uint32_t llr_length[14];
|
uint32_t llr_length[14];
|
||||||
} LTE_UE_PDSCH;
|
} LTE_UE_PDSCH;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/// \brief Received frequency-domain signal after extraction.
|
|
||||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
|
||||||
/// - second index: ? [0..]
|
|
||||||
int32_t **rxdataF_ext;
|
|
||||||
/// \brief Received frequency-domain signal after extraction and channel compensation.
|
|
||||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
|
||||||
/// - second index: ? [0..]
|
|
||||||
double **rxdataF_comp;
|
|
||||||
/// \brief Downlink channel estimates extracted in PRBS.
|
|
||||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
|
||||||
/// - second index: ? [0..]
|
|
||||||
int32_t **dl_ch_estimates_ext;
|
|
||||||
/// \brief Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS.
|
|
||||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
|
||||||
/// - second index: ? [0..]
|
|
||||||
double **dl_ch_rho_ext;
|
|
||||||
/// \brief Downlink PMIs extracted in PRBS and grouped in subbands.
|
|
||||||
/// - first index: ressource block [0..N_RB_DL[
|
|
||||||
uint8_t *pmi_ext;
|
|
||||||
/// \brief Magnitude of Downlink Channel (16QAM level/First 64QAM level).
|
|
||||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
|
||||||
/// - second index: ? [0..]
|
|
||||||
double **dl_ch_mag;
|
|
||||||
/// \brief Magnitude of Downlink Channel (2nd 64QAM level).
|
|
||||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
|
||||||
/// - second index: ? [0..]
|
|
||||||
double **dl_ch_magb;
|
|
||||||
/// \brief Cross-correlation of two eNB signals.
|
|
||||||
/// - first index: rx antenna [0..nb_antennas_rx[
|
|
||||||
/// - second index: ? [0..]
|
|
||||||
double **rho;
|
|
||||||
/// never used... always send dl_ch_rho_ext instead...
|
|
||||||
double **rho_i;
|
|
||||||
/// \brief Pointers to llr vectors (2 TBs).
|
|
||||||
/// - first index: ? [0..1] (hard coded)
|
|
||||||
/// - second index: ? [0..1179743] (hard coded)
|
|
||||||
int16_t *llr[2];
|
|
||||||
/// \f$\log_2(\max|H_i|^2)\f$
|
|
||||||
uint8_t log2_maxh;
|
|
||||||
/// \brief Pointers to llr vectors (128-bit alignment).
|
|
||||||
/// - first index: ? [0..0] (hard coded)
|
|
||||||
/// - second index: ? [0..]
|
|
||||||
int16_t **llr128;
|
|
||||||
//uint32_t *rb_alloc;
|
|
||||||
//uint8_t Qm[2];
|
|
||||||
//MIMO_mode_t mimo_mode;
|
|
||||||
} LTE_UE_PDSCH_FLP;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/// \brief Pointers to extracted PDCCH symbols in frequency-domain.
|
/// \brief Pointers to extracted PDCCH symbols in frequency-domain.
|
||||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||||
@@ -667,7 +618,6 @@ typedef struct {
|
|||||||
uint8_t current_thread_id[10];
|
uint8_t current_thread_id[10];
|
||||||
|
|
||||||
LTE_UE_PDSCH *pdsch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX+1]; // two RxTx Threads
|
LTE_UE_PDSCH *pdsch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX+1]; // two RxTx Threads
|
||||||
LTE_UE_PDSCH_FLP *pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
|
||||||
LTE_UE_PDSCH *pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
LTE_UE_PDSCH *pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||||
LTE_UE_PDSCH *pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
LTE_UE_PDSCH *pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||||
LTE_UE_PDSCH *pdsch_vars_p[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
LTE_UE_PDSCH *pdsch_vars_p[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||||
|
|||||||
@@ -1094,5 +1094,4 @@ static inline int release_thread(pthread_mutex_t *mutex,
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif // __PHY_DEFS_COMMON_H__
|
#endif // __PHY_DEFS_COMMON_H__
|
||||||
|
|||||||
+49
-9
@@ -112,6 +112,26 @@ typedef struct {
|
|||||||
uint32_t F;
|
uint32_t F;
|
||||||
} NR_DL_gNB_HARQ_t;
|
} NR_DL_gNB_HARQ_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int frame;
|
||||||
|
int slot;
|
||||||
|
nfapi_nr_dl_tti_pdcch_pdu pdcch_pdu;
|
||||||
|
} NR_gNB_PDCCH_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int frame;
|
||||||
|
int slot;
|
||||||
|
nfapi_nr_ul_dci_request_pdus_t pdcch_pdu;
|
||||||
|
} NR_gNB_UL_PDCCH_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t rnti;
|
||||||
|
int round_trials[8];
|
||||||
|
int total_bytes_tx;
|
||||||
|
int total_bytes_rx;
|
||||||
|
int current_Qm;
|
||||||
|
int current_RI;
|
||||||
|
} NR_gNB_SCH_STATS_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/// Pointers to 16 HARQ processes for the DLSCH
|
/// Pointers to 16 HARQ processes for the DLSCH
|
||||||
@@ -158,6 +178,8 @@ typedef struct {
|
|||||||
int16_t sqrt_rho_b;
|
int16_t sqrt_rho_b;
|
||||||
} NR_gNB_DLSCH_t;
|
} NR_gNB_DLSCH_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int frame;
|
int frame;
|
||||||
int slot;
|
int slot;
|
||||||
@@ -334,10 +356,6 @@ typedef struct {
|
|||||||
uint8_t max_ldpc_iterations;
|
uint8_t max_ldpc_iterations;
|
||||||
/// number of iterations used in last LDPC decoding
|
/// number of iterations used in last LDPC decoding
|
||||||
uint8_t last_iteration_cnt;
|
uint8_t last_iteration_cnt;
|
||||||
/// num active cba group
|
|
||||||
uint8_t num_active_cba_groups;
|
|
||||||
/// num active cba group
|
|
||||||
uint16_t cba_rnti[NUM_MAX_CBA_GROUP];
|
|
||||||
} NR_gNB_ULSCH_t;
|
} NR_gNB_ULSCH_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -365,6 +383,8 @@ typedef struct {
|
|||||||
/// - second index: tx antenna [0..14[ where 14 is the total supported antenna ports.
|
/// - second index: tx antenna [0..14[ where 14 is the total supported antenna ports.
|
||||||
/// - third index: sample [0..]
|
/// - third index: sample [0..]
|
||||||
int32_t **txdataF;
|
int32_t **txdataF;
|
||||||
|
int32_t *debugBuff;
|
||||||
|
int32_t debugBuff_sample_offset;
|
||||||
} NR_gNB_COMMON;
|
} NR_gNB_COMMON;
|
||||||
|
|
||||||
|
|
||||||
@@ -377,8 +397,6 @@ typedef struct {
|
|||||||
/// - first index: rx antenna id [0..nb_antennas_rx[
|
/// - first index: rx antenna id [0..nb_antennas_rx[
|
||||||
/// - second index (definition from phy_init_lte_eNB()): ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
/// - second index (definition from phy_init_lte_eNB()): ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||||
int32_t **rxdataF_ext2;
|
int32_t **rxdataF_ext2;
|
||||||
/// \brief Offset for calculating the index of rxdataF_ext for the current symbol
|
|
||||||
uint32_t rxdataF_ext_offset;
|
|
||||||
/// \brief Hold the channel estimates in time domain based on DRS.
|
/// \brief Hold the channel estimates in time domain based on DRS.
|
||||||
/// - first index: rx antenna id [0..nb_antennas_rx[
|
/// - first index: rx antenna id [0..nb_antennas_rx[
|
||||||
/// - second index: ? [0..4*ofdm_symbol_size[
|
/// - second index: ? [0..4*ofdm_symbol_size[
|
||||||
@@ -446,6 +464,13 @@ typedef struct {
|
|||||||
uint16_t ptrs_symbols;
|
uint16_t ptrs_symbols;
|
||||||
// PTRS subcarriers per OFDM symbol
|
// PTRS subcarriers per OFDM symbol
|
||||||
uint16_t ptrs_sc_per_ofdm_symbol;
|
uint16_t ptrs_sc_per_ofdm_symbol;
|
||||||
|
/// \brief Estimated phase error based upon PTRS on each symbol .
|
||||||
|
/// - first index: ? [0..7] Number of Antenna
|
||||||
|
/// - second index: ? [0...14] smybol per slot
|
||||||
|
int32_t **ptrs_phase_per_slot;
|
||||||
|
/// \brief Total RE count after DMRS/PTRS RE's are extracted from respective symbol.
|
||||||
|
/// - first index: ? [0...14] smybol per slot
|
||||||
|
int16_t *ul_valid_re_per_slot;
|
||||||
/// flag to verify if channel level computation is done
|
/// flag to verify if channel level computation is done
|
||||||
uint8_t cl_done;
|
uint8_t cl_done;
|
||||||
} NR_gNB_PUSCH;
|
} NR_gNB_PUSCH;
|
||||||
@@ -674,21 +699,28 @@ typedef struct PHY_VARS_gNB_s {
|
|||||||
nfapi_nr_ul_tti_request_t UL_tti_req;
|
nfapi_nr_ul_tti_request_t UL_tti_req;
|
||||||
nfapi_nr_uci_indication_t uci_indication;
|
nfapi_nr_uci_indication_t uci_indication;
|
||||||
|
|
||||||
nfapi_nr_dl_tti_pdcch_pdu *pdcch_pdu;
|
// nfapi_nr_dl_tti_pdcch_pdu *pdcch_pdu;
|
||||||
nfapi_nr_ul_dci_request_pdus_t *ul_dci_pdu;
|
// nfapi_nr_ul_dci_request_pdus_t *ul_dci_pdu;
|
||||||
nfapi_nr_dl_tti_ssb_pdu ssb_pdu;
|
nfapi_nr_dl_tti_ssb_pdu ssb_pdu;
|
||||||
|
|
||||||
int num_pdsch_rnti;
|
uint16_t num_pdsch_rnti[80];
|
||||||
NR_gNB_PBCH pbch;
|
NR_gNB_PBCH pbch;
|
||||||
nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL];
|
nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL];
|
||||||
NR_gNB_COMMON common_vars;
|
NR_gNB_COMMON common_vars;
|
||||||
NR_gNB_PRACH prach_vars;
|
NR_gNB_PRACH prach_vars;
|
||||||
NR_gNB_PUSCH *pusch_vars[NUMBER_OF_NR_ULSCH_MAX];
|
NR_gNB_PUSCH *pusch_vars[NUMBER_OF_NR_ULSCH_MAX];
|
||||||
NR_gNB_PUCCH_t *pucch[NUMBER_OF_NR_PUCCH_MAX];
|
NR_gNB_PUCCH_t *pucch[NUMBER_OF_NR_PUCCH_MAX];
|
||||||
|
NR_gNB_PDCCH_t pdcch_pdu[NUMBER_OF_NR_PDCCH_MAX];
|
||||||
|
NR_gNB_UL_PDCCH_t ul_pdcch_pdu[NUMBER_OF_NR_PDCCH_MAX];
|
||||||
NR_gNB_DLSCH_t *dlsch[NUMBER_OF_NR_DLSCH_MAX][2]; // Nusers times two spatial streams
|
NR_gNB_DLSCH_t *dlsch[NUMBER_OF_NR_DLSCH_MAX][2]; // Nusers times two spatial streams
|
||||||
NR_gNB_ULSCH_t *ulsch[NUMBER_OF_NR_ULSCH_MAX][2]; // [Nusers times][2 codewords]
|
NR_gNB_ULSCH_t *ulsch[NUMBER_OF_NR_ULSCH_MAX][2]; // [Nusers times][2 codewords]
|
||||||
NR_gNB_DLSCH_t *dlsch_SI,*dlsch_ra,*dlsch_p;
|
NR_gNB_DLSCH_t *dlsch_SI,*dlsch_ra,*dlsch_p;
|
||||||
NR_gNB_DLSCH_t *dlsch_PCH;
|
NR_gNB_DLSCH_t *dlsch_PCH;
|
||||||
|
/// statistics for DLSCH measurement collection
|
||||||
|
NR_gNB_SCH_STATS_t dlsch_stats[NUMBER_OF_NR_SCH_STATS_MAX];
|
||||||
|
/// statistics for ULSCH measurement collection
|
||||||
|
NR_gNB_SCH_STATS_t ulsch_stats[NUMBER_OF_NR_SCH_STATS_MAX];
|
||||||
|
|
||||||
t_nrPolar_params *uci_polarParams;
|
t_nrPolar_params *uci_polarParams;
|
||||||
|
|
||||||
uint8_t pbch_configured;
|
uint8_t pbch_configured;
|
||||||
@@ -715,6 +747,10 @@ typedef struct PHY_VARS_gNB_s {
|
|||||||
/// PUSCH DMRS
|
/// PUSCH DMRS
|
||||||
uint32_t ****nr_gold_pusch_dmrs;
|
uint32_t ****nr_gold_pusch_dmrs;
|
||||||
|
|
||||||
|
// Mask of occupied RBs
|
||||||
|
uint32_t rb_mask_ul[9];
|
||||||
|
int ulmask_symb;
|
||||||
|
|
||||||
/// Indicator set to 0 after first SR
|
/// Indicator set to 0 after first SR
|
||||||
uint8_t first_sr[NUMBER_OF_NR_SR_MAX];
|
uint8_t first_sr[NUMBER_OF_NR_SR_MAX];
|
||||||
|
|
||||||
@@ -769,15 +805,19 @@ typedef struct PHY_VARS_gNB_s {
|
|||||||
time_stats_t dlsch_interleaving_stats;
|
time_stats_t dlsch_interleaving_stats;
|
||||||
time_stats_t dlsch_segmentation_stats;
|
time_stats_t dlsch_segmentation_stats;
|
||||||
|
|
||||||
|
time_stats_t rx_pusch_stats;
|
||||||
time_stats_t ulsch_decoding_stats;
|
time_stats_t ulsch_decoding_stats;
|
||||||
time_stats_t ulsch_rate_unmatching_stats;
|
time_stats_t ulsch_rate_unmatching_stats;
|
||||||
time_stats_t ulsch_ldpc_decoding_stats;
|
time_stats_t ulsch_ldpc_decoding_stats;
|
||||||
time_stats_t ulsch_deinterleaving_stats;
|
time_stats_t ulsch_deinterleaving_stats;
|
||||||
time_stats_t ulsch_unscrambling_stats;
|
time_stats_t ulsch_unscrambling_stats;
|
||||||
time_stats_t ulsch_channel_estimation_stats;
|
time_stats_t ulsch_channel_estimation_stats;
|
||||||
|
time_stats_t ulsch_ptrs_processing_stats;
|
||||||
time_stats_t ulsch_channel_compensation_stats;
|
time_stats_t ulsch_channel_compensation_stats;
|
||||||
time_stats_t ulsch_rbs_extraction_stats;
|
time_stats_t ulsch_rbs_extraction_stats;
|
||||||
|
time_stats_t ulsch_mrc_stats;
|
||||||
time_stats_t ulsch_llr_stats;
|
time_stats_t ulsch_llr_stats;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
time_stats_t rx_dft_stats;
|
time_stats_t rx_dft_stats;
|
||||||
time_stats_t ulsch_freq_offset_estimation_stats;
|
time_stats_t ulsch_freq_offset_estimation_stats;
|
||||||
|
|||||||
@@ -416,55 +416,6 @@ typedef struct {
|
|||||||
uint32_t llr_length[14];
|
uint32_t llr_length[14];
|
||||||
} NR_UE_PDSCH;
|
} NR_UE_PDSCH;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/// \brief Received frequency-domain signal after extraction.
|
|
||||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
|
||||||
/// - second index: ? [0..]
|
|
||||||
int32_t **rxdataF_ext;
|
|
||||||
/// \brief Received frequency-domain signal after extraction and channel compensation.
|
|
||||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
|
||||||
/// - second index: ? [0..]
|
|
||||||
double **rxdataF_comp;
|
|
||||||
/// \brief Downlink channel estimates extracted in PRBS.
|
|
||||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
|
||||||
/// - second index: ? [0..]
|
|
||||||
int32_t **dl_ch_estimates_ext;
|
|
||||||
/// \brief Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS.
|
|
||||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
|
||||||
/// - second index: ? [0..]
|
|
||||||
double **dl_ch_rho_ext;
|
|
||||||
/// \brief Downlink PMIs extracted in PRBS and grouped in subbands.
|
|
||||||
/// - first index: ressource block [0..N_RB_DL[
|
|
||||||
uint8_t *pmi_ext;
|
|
||||||
/// \brief Magnitude of Downlink Channel (16QAM level/First 64QAM level).
|
|
||||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
|
||||||
/// - second index: ? [0..]
|
|
||||||
double **dl_ch_mag;
|
|
||||||
/// \brief Magnitude of Downlink Channel (2nd 64QAM level).
|
|
||||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
|
||||||
/// - second index: ? [0..]
|
|
||||||
double **dl_ch_magb;
|
|
||||||
/// \brief Cross-correlation of two eNB signals.
|
|
||||||
/// - first index: rx antenna [0..nb_antennas_rx[
|
|
||||||
/// - second index: ? [0..]
|
|
||||||
double **rho;
|
|
||||||
/// never used... always send dl_ch_rho_ext instead...
|
|
||||||
double **rho_i;
|
|
||||||
/// \brief Pointers to llr vectors (2 TBs).
|
|
||||||
/// - first index: ? [0..1] (hard coded)
|
|
||||||
/// - second index: ? [0..1179743] (hard coded)
|
|
||||||
int16_t *llr[2];
|
|
||||||
/// \f$\log_2(\max|H_i|^2)\f$
|
|
||||||
uint8_t log2_maxh;
|
|
||||||
/// \brief Pointers to llr vectors (128-bit alignment).
|
|
||||||
/// - first index: ? [0..0] (hard coded)
|
|
||||||
/// - second index: ? [0..]
|
|
||||||
int16_t **llr128;
|
|
||||||
//uint32_t *rb_alloc;
|
|
||||||
//uint8_t Qm[2];
|
|
||||||
//MIMO_mode_t mimo_mode;
|
|
||||||
} NR_UE_PDSCH_FLP;
|
|
||||||
|
|
||||||
#define NR_PDCCH_DEFS_NR_UE
|
#define NR_PDCCH_DEFS_NR_UE
|
||||||
#define NR_NBR_CORESET_ACT_BWP 3 // The number of CoreSets per BWP is limited to 3 (including initial CORESET: ControlResourceId 0)
|
#define NR_NBR_CORESET_ACT_BWP 3 // The number of CoreSets per BWP is limited to 3 (including initial CORESET: ControlResourceId 0)
|
||||||
#define NR_NBR_SEARCHSPACE_ACT_BWP 10 // The number of SearchSpaces per BWP is limited to 10 (including initial SEARCHSPACE: SearchSpaceId 0)
|
#define NR_NBR_SEARCHSPACE_ACT_BWP 10 // The number of SearchSpaces per BWP is limited to 10 (including initial SEARCHSPACE: SearchSpaceId 0)
|
||||||
@@ -902,11 +853,6 @@ typedef struct {
|
|||||||
|
|
||||||
t_nrPolar_params *polarList;
|
t_nrPolar_params *polarList;
|
||||||
NR_UE_PDSCH *pdsch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX+1]; // two RxTx Threads
|
NR_UE_PDSCH *pdsch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX+1]; // two RxTx Threads
|
||||||
NR_UE_PDSCH_FLP *pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
|
||||||
NR_UE_PDSCH *pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
|
||||||
NR_UE_PDSCH *pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
|
||||||
NR_UE_PDSCH *pdsch_vars_p[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
|
||||||
NR_UE_PDSCH *pdsch_vars_MCH[NUMBER_OF_CONNECTED_eNB_MAX];
|
|
||||||
NR_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
NR_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
NR_UE_PDCCH *pdcch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX];
|
NR_UE_PDCCH *pdcch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
NR_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
NR_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
@@ -1022,7 +968,6 @@ typedef struct {
|
|||||||
/// Timing Advance updates variables
|
/// Timing Advance updates variables
|
||||||
/// Timing advance update computed from the TA command signalled from gNB
|
/// Timing advance update computed from the TA command signalled from gNB
|
||||||
int timing_advance;
|
int timing_advance;
|
||||||
int hw_timing_advance;
|
|
||||||
int N_TA_offset; ///timing offset used in TDD
|
int N_TA_offset; ///timing offset used in TDD
|
||||||
NR_UL_TIME_ALIGNMENT_t ul_time_alignment[NUMBER_OF_CONNECTED_gNB_MAX];
|
NR_UL_TIME_ALIGNMENT_t ul_time_alignment[NUMBER_OF_CONNECTED_gNB_MAX];
|
||||||
|
|
||||||
|
|||||||
@@ -111,6 +111,9 @@
|
|||||||
#define MAX_NUM_NR_CHANNEL_BITS (14*273*12*8) // 14 symbols, 273 RB
|
#define MAX_NUM_NR_CHANNEL_BITS (14*273*12*8) // 14 symbols, 273 RB
|
||||||
#define MAX_NUM_NR_RE (14*273*12)
|
#define MAX_NUM_NR_RE (14*273*12)
|
||||||
|
|
||||||
|
extern const uint8_t nr_rv_round_map[4];
|
||||||
|
extern const uint8_t nr_rv_round_map_ue[4];
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NR_MU_0=0,
|
NR_MU_0=0,
|
||||||
NR_MU_1,
|
NR_MU_1,
|
||||||
@@ -319,6 +322,8 @@ struct NR_DL_FRAME_PARMS {
|
|||||||
uint8_t nb_antenna_ports_gNB;
|
uint8_t nb_antenna_ports_gNB;
|
||||||
/// Cyclic Prefix for DL (0=Normal CP, 1=Extended CP)
|
/// Cyclic Prefix for DL (0=Normal CP, 1=Extended CP)
|
||||||
lte_prefix_type_t Ncp;
|
lte_prefix_type_t Ncp;
|
||||||
|
/// sequence which is computed based on carrier frequency and numerology to rotate/derotate each OFDM symbol according to Section 5.3 in 38.211
|
||||||
|
int16_t symbol_rotation[224*2];
|
||||||
/// shift of pilot position in one RB
|
/// shift of pilot position in one RB
|
||||||
uint8_t nushift;
|
uint8_t nushift;
|
||||||
/// SRS configuration from TS 38.331 RRC
|
/// SRS configuration from TS 38.331 RRC
|
||||||
|
|||||||
@@ -94,9 +94,9 @@ void handle_nfapi_nr_pdcch_pdu(PHY_VARS_gNB *gNB,
|
|||||||
LOG_D(PHY,"Frame %d, Slot %d: DCI processing - proc:slot_tx:%d pdcch_pdu_rel15->numDlDci:%d\n",frame,slot, slot, pdcch_pdu->pdcch_pdu_rel15.numDlDci);
|
LOG_D(PHY,"Frame %d, Slot %d: DCI processing - proc:slot_tx:%d pdcch_pdu_rel15->numDlDci:%d\n",frame,slot, slot, pdcch_pdu->pdcch_pdu_rel15.numDlDci);
|
||||||
|
|
||||||
// copy dci configuration into gNB structure
|
// copy dci configuration into gNB structure
|
||||||
gNB->pdcch_pdu = pdcch_pdu;
|
// gNB->pdcch_pdu = pdcch_pdu;
|
||||||
|
|
||||||
nr_fill_dci(gNB,frame,slot);
|
nr_fill_dci(gNB,frame,slot,pdcch_pdu);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -109,9 +109,9 @@ void handle_nfapi_nr_ul_dci_pdu(PHY_VARS_gNB *gNB,
|
|||||||
LOG_D(PHY,"Frame %d, Slot %d: UL DCI processing - proc:slot_tx:%d pdcch_pdu_rel15->numDlDci:%d\n",frame,slot, slot, ul_dci_request_pdu->pdcch_pdu.pdcch_pdu_rel15.numDlDci);
|
LOG_D(PHY,"Frame %d, Slot %d: UL DCI processing - proc:slot_tx:%d pdcch_pdu_rel15->numDlDci:%d\n",frame,slot, slot, ul_dci_request_pdu->pdcch_pdu.pdcch_pdu_rel15.numDlDci);
|
||||||
|
|
||||||
// copy dci configuration into gNB structure
|
// copy dci configuration into gNB structure
|
||||||
gNB->ul_dci_pdu = ul_dci_request_pdu;
|
// gNB->ul_dci_pdu = ul_dci_request_pdu;
|
||||||
|
|
||||||
nr_fill_ul_dci(gNB,frame,slot);
|
nr_fill_ul_dci(gNB,frame,slot,ul_dci_request_pdu);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,13 +154,12 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
|
|||||||
number_ul_dci_pdu,number_ul_tti_pdu);
|
number_ul_dci_pdu,number_ul_tti_pdu);
|
||||||
|
|
||||||
int pdcch_received=0;
|
int pdcch_received=0;
|
||||||
gNB->num_pdsch_rnti=0;
|
gNB->num_pdsch_rnti[slot]=0;
|
||||||
for (int i=0; i<NUMBER_OF_NR_DLSCH_MAX; i++) {
|
for (int i=0; i<NUMBER_OF_NR_DLSCH_MAX; i++) {
|
||||||
gNB->dlsch[i][0]->rnti=0;
|
gNB->dlsch[i][0]->rnti=0;
|
||||||
gNB->dlsch[i][0]->harq_mask=0;
|
gNB->dlsch[i][0]->harq_mask=0;
|
||||||
}
|
}
|
||||||
gNB->pdcch_pdu = NULL;
|
|
||||||
gNB->ul_dci_pdu = NULL;
|
|
||||||
gNB->pbch_configured=0;
|
gNB->pbch_configured=0;
|
||||||
|
|
||||||
for (int i=0;i<number_dl_pdu;i++) {
|
for (int i=0;i<number_dl_pdu;i++) {
|
||||||
@@ -219,7 +218,7 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
|
|||||||
LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PRACH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot);
|
LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PRACH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot);
|
||||||
nfapi_nr_prach_pdu_t *prach_pdu = &UL_tti_req->pdus_list[i].prach_pdu;
|
nfapi_nr_prach_pdu_t *prach_pdu = &UL_tti_req->pdus_list[i].prach_pdu;
|
||||||
nr_fill_prach(gNB, UL_tti_req->SFN, UL_tti_req->Slot, prach_pdu);
|
nr_fill_prach(gNB, UL_tti_req->SFN, UL_tti_req->Slot, prach_pdu);
|
||||||
nr_fill_prach_ru(gNB->RU_list[0], UL_tti_req->SFN, UL_tti_req->Slot, prach_pdu);
|
if (gNB->RU_list[0]->if_south == LOCAL_RF) nr_fill_prach_ru(gNB->RU_list[0], UL_tti_req->SFN, UL_tti_req->Slot, prach_pdu);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,14 +87,29 @@ void nr_feptx0(RU_t *ru,int tti_tx,int first_symbol, int num_symbols, int aa) {
|
|||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
else {
|
else {
|
||||||
if (fp->numerology_index != 0) {
|
if (fp->numerology_index != 0) {
|
||||||
|
|
||||||
|
if (!(slot%(fp->slots_per_subframe/2))&&(first_symbol==0)) { // case where first symbol in slot has longer prefix
|
||||||
|
apply_nr_rotation(fp,
|
||||||
|
(int16_t*)&ru->common.txdataF_BF[aa][slot_offsetF],
|
||||||
|
slot,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
fp->ofdm_symbol_size);
|
||||||
|
|
||||||
if (!(slot%(fp->slots_per_subframe/2))&&(first_symbol==0)) {
|
|
||||||
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF],
|
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF],
|
||||||
(int*)&ru->common.txdata[aa][slot_offset],
|
(int*)&ru->common.txdata[aa][slot_offset],
|
||||||
fp->ofdm_symbol_size,
|
fp->ofdm_symbol_size,
|
||||||
1,
|
1,
|
||||||
fp->nb_prefix_samples0,
|
fp->nb_prefix_samples0,
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
|
|
||||||
|
apply_nr_rotation(fp,
|
||||||
|
(int16_t*)&ru->common.txdataF_BF[aa][slot_offsetF+fp->ofdm_symbol_size],
|
||||||
|
slot,
|
||||||
|
1,
|
||||||
|
num_symbols-1,
|
||||||
|
fp->ofdm_symbol_size);
|
||||||
|
|
||||||
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF+fp->ofdm_symbol_size],
|
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF+fp->ofdm_symbol_size],
|
||||||
(int*)&ru->common.txdata[aa][slot_offset+fp->nb_prefix_samples0+fp->ofdm_symbol_size],
|
(int*)&ru->common.txdata[aa][slot_offset+fp->nb_prefix_samples0+fp->ofdm_symbol_size],
|
||||||
fp->ofdm_symbol_size,
|
fp->ofdm_symbol_size,
|
||||||
@@ -102,7 +117,13 @@ void nr_feptx0(RU_t *ru,int tti_tx,int first_symbol, int num_symbols, int aa) {
|
|||||||
fp->nb_prefix_samples,
|
fp->nb_prefix_samples,
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
}
|
}
|
||||||
else {
|
else { // all symbols in slot have shorter prefix
|
||||||
|
apply_nr_rotation(fp,
|
||||||
|
(int16_t*)&ru->common.txdataF_BF[aa][slot_offsetF],
|
||||||
|
slot,
|
||||||
|
first_symbol,
|
||||||
|
num_symbols,
|
||||||
|
fp->ofdm_symbol_size);
|
||||||
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF],
|
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF],
|
||||||
(int*)&ru->common.txdata[aa][slot_offset],
|
(int*)&ru->common.txdata[aa][slot_offset],
|
||||||
fp->ofdm_symbol_size,
|
fp->ofdm_symbol_size,
|
||||||
@@ -110,9 +131,8 @@ void nr_feptx0(RU_t *ru,int tti_tx,int first_symbol, int num_symbols, int aa) {
|
|||||||
fp->nb_prefix_samples,
|
fp->nb_prefix_samples,
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
}
|
}
|
||||||
}
|
} // numerology_index!=0
|
||||||
|
else { //numerology_index == 0
|
||||||
else {
|
|
||||||
for (uint16_t idx_sym=abs_first_symbol; idx_sym<abs_first_symbol+num_symbols; idx_sym++) {
|
for (uint16_t idx_sym=abs_first_symbol; idx_sym<abs_first_symbol+num_symbols; idx_sym++) {
|
||||||
if (idx_sym%0x7) {
|
if (idx_sym%0x7) {
|
||||||
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF],
|
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF],
|
||||||
@@ -121,6 +141,12 @@ void nr_feptx0(RU_t *ru,int tti_tx,int first_symbol, int num_symbols, int aa) {
|
|||||||
1,
|
1,
|
||||||
fp->nb_prefix_samples,
|
fp->nb_prefix_samples,
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
|
apply_nr_rotation(fp,
|
||||||
|
(int16_t*)&ru->common.txdata[aa][slot_offset],
|
||||||
|
slot,
|
||||||
|
idx_sym,
|
||||||
|
1,
|
||||||
|
fp->ofdm_symbol_size+fp->nb_prefix_samples);
|
||||||
slot_offset += fp->nb_prefix_samples+fp->ofdm_symbol_size;
|
slot_offset += fp->nb_prefix_samples+fp->ofdm_symbol_size;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -130,6 +156,12 @@ void nr_feptx0(RU_t *ru,int tti_tx,int first_symbol, int num_symbols, int aa) {
|
|||||||
1,
|
1,
|
||||||
fp->nb_prefix_samples0,
|
fp->nb_prefix_samples0,
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
|
apply_nr_rotation(fp,
|
||||||
|
(int16_t*)&ru->common.txdata[aa][slot_offset],
|
||||||
|
slot,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
fp->ofdm_symbol_size+fp->nb_prefix_samples0);
|
||||||
slot_offset += fp->nb_prefix_samples0+fp->ofdm_symbol_size;
|
slot_offset += fp->nb_prefix_samples0+fp->ofdm_symbol_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||||
#include "PHY/NR_TRANSPORT/nr_dlsch.h"
|
#include "PHY/NR_TRANSPORT/nr_dlsch.h"
|
||||||
#include "PHY/NR_TRANSPORT/nr_ulsch.h"
|
#include "PHY/NR_TRANSPORT/nr_ulsch.h"
|
||||||
|
#include "PHY/NR_TRANSPORT/nr_dci.h"
|
||||||
#include "PHY/NR_ESTIMATION/nr_ul_estimation.h"
|
#include "PHY/NR_ESTIMATION/nr_ul_estimation.h"
|
||||||
#include "PHY/NR_UE_TRANSPORT/pucch_nr.h"
|
#include "PHY/NR_UE_TRANSPORT/pucch_nr.h"
|
||||||
#include "SCHED/sched_eNB.h"
|
#include "SCHED/sched_eNB.h"
|
||||||
@@ -160,41 +161,41 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
|
|||||||
}
|
}
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_COMMON_TX,0);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_COMMON_TX,0);
|
||||||
|
|
||||||
|
int pdcch_pdu_id=find_nr_pdcch(frame,slot,gNB,SEARCH_EXIST);
|
||||||
|
int ul_pdcch_pdu_id=find_nr_ul_dci(frame,slot,gNB,SEARCH_EXIST);
|
||||||
|
|
||||||
if (gNB->pdcch_pdu || gNB->ul_dci_pdu) {
|
LOG_D(PHY,"[gNB %d] Frame %d slot %d, pdcch_pdu_id %d, ul_pdcch_pdu_id %d\n",
|
||||||
|
gNB->Mod_id,frame,slot,pdcch_pdu_id,ul_pdcch_pdu_id);
|
||||||
|
|
||||||
|
if (pdcch_pdu_id >= 0 || ul_pdcch_pdu_id >= 0) {
|
||||||
LOG_D(PHY, "[gNB %d] Frame %d slot %d Calling nr_generate_dci_top (number of UL/DL DCI %d/%d)\n",
|
LOG_D(PHY, "[gNB %d] Frame %d slot %d Calling nr_generate_dci_top (number of UL/DL DCI %d/%d)\n",
|
||||||
gNB->Mod_id, frame, slot,
|
gNB->Mod_id, frame, slot,
|
||||||
gNB->ul_dci_pdu==NULL?0:gNB->ul_dci_pdu->pdcch_pdu.pdcch_pdu_rel15.numDlDci,
|
gNB->ul_pdcch_pdu[ul_pdcch_pdu_id].pdcch_pdu.pdcch_pdu.pdcch_pdu_rel15.numDlDci,
|
||||||
gNB->pdcch_pdu==NULL?0:gNB->pdcch_pdu->pdcch_pdu_rel15.numDlDci);
|
gNB->pdcch_pdu[pdcch_pdu_id].pdcch_pdu.pdcch_pdu_rel15.numDlDci);
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_PDCCH_TX,1);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_PDCCH_TX,1);
|
||||||
|
|
||||||
nr_generate_dci_top(gNB->pdcch_pdu,
|
nr_generate_dci_top(gNB,
|
||||||
gNB->ul_dci_pdu,
|
pdcch_pdu_id>=0 ? &gNB->pdcch_pdu[pdcch_pdu_id].pdcch_pdu : NULL,
|
||||||
|
ul_pdcch_pdu_id>=0 ? &gNB->ul_pdcch_pdu[ul_pdcch_pdu_id].pdcch_pdu.pdcch_pdu : NULL,
|
||||||
gNB->nr_gold_pdcch_dmrs[slot],
|
gNB->nr_gold_pdcch_dmrs[slot],
|
||||||
&gNB->common_vars.txdataF[0][txdataF_offset],
|
&gNB->common_vars.txdataF[0][txdataF_offset],
|
||||||
AMP, *fp);
|
AMP, *fp);
|
||||||
|
|
||||||
|
// free up entry in pdcch tables
|
||||||
|
if (pdcch_pdu_id>=0) gNB->pdcch_pdu[pdcch_pdu_id].frame = -1;
|
||||||
|
if (ul_pdcch_pdu_id>=0) gNB->ul_pdcch_pdu[ul_pdcch_pdu_id].frame = -1;
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_PDCCH_TX,0);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_PDCCH_TX,0);
|
||||||
|
if (pdcch_pdu_id >= 0) gNB->pdcch_pdu[pdcch_pdu_id].frame = -1;
|
||||||
|
if (ul_pdcch_pdu_id >= 0) gNB->ul_pdcch_pdu[ul_pdcch_pdu_id].frame = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i=0; i<gNB->num_pdsch_rnti; i++) {
|
for (int i=0; i<gNB->num_pdsch_rnti[slot]; i++) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,1);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,1);
|
||||||
LOG_D(PHY, "PDSCH generation started (%d)\n", gNB->num_pdsch_rnti);
|
LOG_D(PHY, "PDSCH generation started (%d) in frame %d.%d\n", gNB->num_pdsch_rnti[slot],frame,slot);
|
||||||
nr_generate_pdsch(gNB->dlsch[i][0],
|
nr_generate_pdsch(gNB,frame, slot);
|
||||||
gNB->nr_gold_pdsch_dmrs[slot],
|
if ((frame&127) == 0) dump_pdsch_stats(gNB);
|
||||||
gNB->common_vars.txdataF,
|
|
||||||
AMP, frame, slot, fp, 0,
|
|
||||||
&gNB->dlsch_encoding_stats,
|
|
||||||
&gNB->dlsch_scrambling_stats,
|
|
||||||
&gNB->dlsch_modulation_stats,
|
|
||||||
&gNB->tinput,
|
|
||||||
&gNB->tprep,
|
|
||||||
&gNB->tparity,
|
|
||||||
&gNB->toutput,
|
|
||||||
&gNB->dlsch_rate_matching_stats,
|
|
||||||
&gNB->dlsch_interleaving_stats,
|
|
||||||
&gNB->dlsch_segmentation_stats);
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,0);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -239,16 +240,30 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH
|
|||||||
number_dmrs_symbols, // number of dmrs symbols irrespective of single or double symbol dmrs
|
number_dmrs_symbols, // number of dmrs symbols irrespective of single or double symbol dmrs
|
||||||
pusch_pdu->qam_mod_order,
|
pusch_pdu->qam_mod_order,
|
||||||
pusch_pdu->nrOfLayers);
|
pusch_pdu->nrOfLayers);
|
||||||
|
|
||||||
|
AssertFatal(G>0,"G is 0 : rb_size %u, number_symbols %d, nb_re_dmrs %d, number_dmrs_symbols %d, qam_mod_order %u, nrOfLayer %u\n",
|
||||||
|
pusch_pdu->rb_size,
|
||||||
|
number_symbols,
|
||||||
|
nb_re_dmrs,
|
||||||
|
number_dmrs_symbols, // number of dmrs symbols irrespective of single or double symbol dmrs
|
||||||
|
pusch_pdu->qam_mod_order,
|
||||||
|
pusch_pdu->nrOfLayers);
|
||||||
|
LOG_D(PHY,"rb_size %d, number_symbols %d, nb_re_dmrs %d, number_dmrs_symbols %d, qam_mod_order %d, nrOfLayer %d\n",
|
||||||
|
pusch_pdu->rb_size,
|
||||||
|
number_symbols,
|
||||||
|
nb_re_dmrs,
|
||||||
|
number_dmrs_symbols, // number of dmrs symbols irrespective of single or double symbol dmrs
|
||||||
|
pusch_pdu->qam_mod_order,
|
||||||
|
pusch_pdu->nrOfLayers);
|
||||||
//----------------------------------------------------------
|
//----------------------------------------------------------
|
||||||
//------------------- ULSCH unscrambling -------------------
|
//------------------- ULSCH unscrambling -------------------
|
||||||
//----------------------------------------------------------
|
//----------------------------------------------------------
|
||||||
start_meas(&gNB->ulsch_unscrambling_stats);
|
start_meas(&gNB->ulsch_unscrambling_stats);
|
||||||
nr_ulsch_unscrambling(gNB->pusch_vars[ULSCH_id]->llr,
|
nr_ulsch_unscrambling_optim(gNB->pusch_vars[ULSCH_id]->llr,
|
||||||
G,
|
G,
|
||||||
0,
|
0,
|
||||||
pusch_pdu->data_scrambling_id,
|
pusch_pdu->data_scrambling_id,
|
||||||
pusch_pdu->rnti);
|
pusch_pdu->rnti);
|
||||||
stop_meas(&gNB->ulsch_unscrambling_stats);
|
stop_meas(&gNB->ulsch_unscrambling_stats);
|
||||||
//----------------------------------------------------------
|
//----------------------------------------------------------
|
||||||
//--------------------- ULSCH decoding ---------------------
|
//--------------------- ULSCH decoding ---------------------
|
||||||
@@ -266,13 +281,12 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH
|
|||||||
G);
|
G);
|
||||||
stop_meas(&gNB->ulsch_decoding_stats);
|
stop_meas(&gNB->ulsch_decoding_stats);
|
||||||
|
|
||||||
|
|
||||||
if (ret > gNB->ulsch[ULSCH_id][0]->max_ldpc_iterations){
|
if (ret > gNB->ulsch[ULSCH_id][0]->max_ldpc_iterations){
|
||||||
LOG_I(PHY, "ULSCH %d in error\n",ULSCH_id);
|
LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id);
|
||||||
nr_fill_indication(gNB,frame_rx, slot_rx, ULSCH_id, harq_pid, 1);
|
nr_fill_indication(gNB,frame_rx, slot_rx, ULSCH_id, harq_pid, 1);
|
||||||
}
|
}
|
||||||
else if(gNB->ulsch[ULSCH_id][0]->harq_processes[harq_pid]->b!=NULL){
|
else if(gNB->ulsch[ULSCH_id][0]->harq_processes[harq_pid]->b!=NULL){
|
||||||
LOG_I(PHY, "ULSCH received ok \n");
|
LOG_D(PHY, "ULSCH received ok \n");
|
||||||
nr_fill_indication(gNB,frame_rx, slot_rx, ULSCH_id, harq_pid, 0);
|
nr_fill_indication(gNB,frame_rx, slot_rx, ULSCH_id, harq_pid, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -313,7 +327,9 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
|||||||
LOG_D(PHY, "Estimated timing advance PUSCH is = %d, timing_advance_update is %d \n", sync_pos,timing_advance_update);
|
LOG_D(PHY, "Estimated timing advance PUSCH is = %d, timing_advance_update is %d \n", sync_pos,timing_advance_update);
|
||||||
|
|
||||||
// estimate UL_CQI for MAC (from antenna port 0 only)
|
// estimate UL_CQI for MAC (from antenna port 0 only)
|
||||||
int SNRtimes10 = dB_fixed_times10(gNB->pusch_vars[ULSCH_id]->ulsch_power[0]) - 300;//(10*gNB->measurements.n0_power_dB[0]);
|
int SNRtimes10 = dB_fixed_times10(gNB->pusch_vars[ULSCH_id]->ulsch_power[0]) - (10*gNB->measurements.n0_power_dB[0]);
|
||||||
|
|
||||||
|
LOG_D(PHY, "Estimated SNR for PUSCH is = %d dB\n", SNRtimes10/10);
|
||||||
|
|
||||||
if (SNRtimes10 < -640) cqi=0;
|
if (SNRtimes10 < -640) cqi=0;
|
||||||
else if (SNRtimes10 > 635) cqi=255;
|
else if (SNRtimes10 > 635) cqi=255;
|
||||||
@@ -332,7 +348,8 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
|||||||
gNB->crc_pdu_list[num_crc].num_cb = pusch_pdu->pusch_data.num_cb;
|
gNB->crc_pdu_list[num_crc].num_cb = pusch_pdu->pusch_data.num_cb;
|
||||||
gNB->crc_pdu_list[num_crc].ul_cqi = cqi;
|
gNB->crc_pdu_list[num_crc].ul_cqi = cqi;
|
||||||
gNB->crc_pdu_list[num_crc].timing_advance = timing_advance_update;
|
gNB->crc_pdu_list[num_crc].timing_advance = timing_advance_update;
|
||||||
gNB->crc_pdu_list[num_crc].rssi = 0xffff; // invalid value as this is not yet computed
|
// in terms of dBFS range -128 to 0 with 0.1 step
|
||||||
|
gNB->crc_pdu_list[num_crc].rssi = 1280 - (10*dB_fixed(32767*32767)-dB_fixed_times10(gNB->pusch_vars[ULSCH_id]->ulsch_power[0]));
|
||||||
|
|
||||||
gNB->UL_INFO.crc_ind.number_crcs++;
|
gNB->UL_INFO.crc_ind.number_crcs++;
|
||||||
|
|
||||||
@@ -346,7 +363,7 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
|||||||
gNB->rx_pdu_list[num_rx].harq_id = harq_pid;
|
gNB->rx_pdu_list[num_rx].harq_id = harq_pid;
|
||||||
gNB->rx_pdu_list[num_rx].ul_cqi = cqi;
|
gNB->rx_pdu_list[num_rx].ul_cqi = cqi;
|
||||||
gNB->rx_pdu_list[num_rx].timing_advance = timing_advance_update;
|
gNB->rx_pdu_list[num_rx].timing_advance = timing_advance_update;
|
||||||
gNB->rx_pdu_list[num_rx].rssi = 0xffff; // invalid value as this is not yet computed
|
gNB->rx_pdu_list[num_rx].rssi = 1280 - (10*dB_fixed(32767*32767)-dB_fixed_times10(gNB->pusch_vars[ULSCH_id]->ulsch_power[0]));
|
||||||
if (crc_flag)
|
if (crc_flag)
|
||||||
gNB->rx_pdu_list[num_rx].pdu_length = 0;
|
gNB->rx_pdu_list[num_rx].pdu_length = 0;
|
||||||
else {
|
else {
|
||||||
@@ -359,6 +376,71 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
|||||||
pthread_mutex_unlock(&gNB->UL_INFO_mutex);
|
pthread_mutex_unlock(&gNB->UL_INFO_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function to fill UL RB mask to be used for N0 measurements
|
||||||
|
void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
||||||
|
|
||||||
|
int rb2, rb, nb_rb;
|
||||||
|
for (int symbol=0;symbol<14;symbol++) {
|
||||||
|
if (gNB->gNB_config.tdd_table.max_tdd_periodicity_list[slot_rx].max_num_of_symbol_per_slot_list[symbol].slot_config.value==1){
|
||||||
|
nb_rb = 0;
|
||||||
|
for (int m=0;m<9;m++) gNB->rb_mask_ul[m] = 0;
|
||||||
|
gNB->ulmask_symb = -1;
|
||||||
|
|
||||||
|
for (int i=0;i<NUMBER_OF_NR_PUCCH_MAX;i++){
|
||||||
|
NR_gNB_PUCCH_t *pucch = gNB->pucch[i];
|
||||||
|
if (pucch) {
|
||||||
|
if ((pucch->active == 1) &&
|
||||||
|
(pucch->frame == frame_rx) &&
|
||||||
|
(pucch->slot == slot_rx) ) {
|
||||||
|
gNB->ulmask_symb = symbol;
|
||||||
|
nfapi_nr_pucch_pdu_t *pucch_pdu = &pucch[i].pucch_pdu;
|
||||||
|
if ((symbol>=pucch_pdu->start_symbol_index) &&
|
||||||
|
(symbol<(pucch_pdu->start_symbol_index + pucch_pdu->nr_of_symbols))){
|
||||||
|
for (rb=0; rb<pucch_pdu->prb_size; rb++) {
|
||||||
|
rb2 = rb+pucch_pdu->prb_start;
|
||||||
|
gNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31));
|
||||||
|
}
|
||||||
|
nb_rb+=pucch_pdu->prb_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int ULSCH_id=0;ULSCH_id<NUMBER_OF_NR_ULSCH_MAX;ULSCH_id++) {
|
||||||
|
NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id][0];
|
||||||
|
int harq_pid;
|
||||||
|
NR_UL_gNB_HARQ_t *ulsch_harq;
|
||||||
|
|
||||||
|
if ((ulsch) &&
|
||||||
|
(ulsch->rnti > 0)) {
|
||||||
|
for (harq_pid=0;harq_pid<NR_MAX_ULSCH_HARQ_PROCESSES;harq_pid++) {
|
||||||
|
ulsch_harq = ulsch->harq_processes[harq_pid];
|
||||||
|
AssertFatal(ulsch_harq!=NULL,"harq_pid %d is not allocated\n",harq_pid);
|
||||||
|
if ((ulsch_harq->status == NR_ACTIVE) &&
|
||||||
|
(ulsch_harq->frame == frame_rx) &&
|
||||||
|
(ulsch_harq->slot == slot_rx) &&
|
||||||
|
(ulsch_harq->handled == 0)){
|
||||||
|
uint8_t symbol_start = ulsch_harq->ulsch_pdu.start_symbol_index;
|
||||||
|
uint8_t symbol_end = symbol_start + ulsch_harq->ulsch_pdu.nr_of_symbols;
|
||||||
|
gNB->ulmask_symb = symbol;
|
||||||
|
if ((symbol>=symbol_start) &&
|
||||||
|
(symbol<symbol_end)){
|
||||||
|
for (rb=0; rb<ulsch_harq->ulsch_pdu.rb_size; rb++) {
|
||||||
|
rb2 = rb+ulsch_harq->ulsch_pdu.rb_start;
|
||||||
|
gNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31));
|
||||||
|
}
|
||||||
|
nb_rb+=ulsch_harq->ulsch_pdu.rb_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//TODO Add check for PRACH as well?
|
||||||
|
}
|
||||||
|
if (nb_rb<gNB->frame_parms.N_RB_UL)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
||||||
|
|
||||||
uint8_t symbol;
|
uint8_t symbol;
|
||||||
@@ -385,6 +467,9 @@ void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
|
|||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_UESPEC_RX,1);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_UESPEC_RX,1);
|
||||||
LOG_D(PHY,"phy_procedures_gNB_uespec_RX frame %d, slot %d\n",frame_rx,slot_rx);
|
LOG_D(PHY,"phy_procedures_gNB_uespec_RX frame %d, slot %d\n",frame_rx,slot_rx);
|
||||||
|
|
||||||
|
fill_ul_rb_mask(gNB, frame_rx, slot_rx);
|
||||||
|
gNB_I0_measurements(gNB);
|
||||||
|
|
||||||
for (int i=0;i<NUMBER_OF_NR_PUCCH_MAX;i++){
|
for (int i=0;i<NUMBER_OF_NR_PUCCH_MAX;i++){
|
||||||
NR_gNB_PUCCH_t *pucch = gNB->pucch[i];
|
NR_gNB_PUCCH_t *pucch = gNB->pucch[i];
|
||||||
if (pucch) {
|
if (pucch) {
|
||||||
@@ -424,49 +509,73 @@ void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
|
|||||||
for (int ULSCH_id=0;ULSCH_id<NUMBER_OF_NR_ULSCH_MAX;ULSCH_id++) {
|
for (int ULSCH_id=0;ULSCH_id<NUMBER_OF_NR_ULSCH_MAX;ULSCH_id++) {
|
||||||
NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id][0];
|
NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id][0];
|
||||||
int harq_pid;
|
int harq_pid;
|
||||||
//int no_sig;
|
int no_sig;
|
||||||
NR_UL_gNB_HARQ_t *ulsch_harq;
|
NR_UL_gNB_HARQ_t *ulsch_harq;
|
||||||
|
|
||||||
if ((ulsch) &&
|
if ((ulsch) &&
|
||||||
(ulsch->rnti > 0)) {
|
(ulsch->rnti > 0)) {
|
||||||
// for for an active HARQ process
|
// for for an active HARQ process
|
||||||
for (harq_pid=0;harq_pid<NR_MAX_ULSCH_HARQ_PROCESSES;harq_pid++) {
|
for (harq_pid=0;harq_pid<NR_MAX_ULSCH_HARQ_PROCESSES;harq_pid++) {
|
||||||
ulsch_harq = ulsch->harq_processes[harq_pid];
|
ulsch_harq = ulsch->harq_processes[harq_pid];
|
||||||
AssertFatal(ulsch_harq!=NULL,"harq_pid %d is not allocated\n",harq_pid);
|
AssertFatal(ulsch_harq!=NULL,"harq_pid %d is not allocated\n",harq_pid);
|
||||||
if ((ulsch_harq->status == NR_ACTIVE) &&
|
if ((ulsch_harq->status == NR_ACTIVE) &&
|
||||||
(ulsch_harq->frame == frame_rx) &&
|
(ulsch_harq->frame == frame_rx) &&
|
||||||
(ulsch_harq->slot == slot_rx) &&
|
(ulsch_harq->slot == slot_rx) &&
|
||||||
(ulsch_harq->handled == 0)){
|
(ulsch_harq->handled == 0)){
|
||||||
|
|
||||||
|
LOG_D(PHY, "PUSCH detection started in frame %d slot %d\n",
|
||||||
|
frame_rx,slot_rx);
|
||||||
|
|
||||||
#ifdef DEBUG_RXDATA
|
#ifdef DEBUG_RXDATA
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
RU_t *ru = gNB->RU_list[0];
|
RU_t *ru = gNB->RU_list[0];
|
||||||
int slot_offset = frame_parms->get_samples_slot_timestamp(slot_rx,frame_parms,0);
|
int slot_offset = frame_parms->get_samples_slot_timestamp(slot_rx,frame_parms,0);
|
||||||
slot_offset -= ru->N_TA_offset;
|
slot_offset -= ru->N_TA_offset;
|
||||||
char name[128];
|
((int16_t*)&gNB->common_vars.debugBuff[gNB->common_vars.debugBuff_sample_offset])[0]=(int16_t)ulsch->rnti;
|
||||||
FILE *f;
|
((int16_t*)&gNB->common_vars.debugBuff[gNB->common_vars.debugBuff_sample_offset])[1]=(int16_t)ulsch_harq->ulsch_pdu.rb_size;
|
||||||
sprintf(name, "rxdata.%d.%d.raw", frame_rx,slot_rx);
|
((int16_t*)&gNB->common_vars.debugBuff[gNB->common_vars.debugBuff_sample_offset])[2]=(int16_t)ulsch_harq->ulsch_pdu.rb_start;
|
||||||
f = fopen(name, "w"); if (f == NULL) exit(1);
|
((int16_t*)&gNB->common_vars.debugBuff[gNB->common_vars.debugBuff_sample_offset])[3]=(int16_t)ulsch_harq->ulsch_pdu.nr_of_symbols;
|
||||||
fwrite(&ru->common.rxdata[0][slot_offset],2,frame_parms->get_samples_per_slot(slot_rx,frame_parms)*2, f);
|
((int16_t*)&gNB->common_vars.debugBuff[gNB->common_vars.debugBuff_sample_offset])[4]=(int16_t)ulsch_harq->ulsch_pdu.start_symbol_index;
|
||||||
fclose(f);
|
((int16_t*)&gNB->common_vars.debugBuff[gNB->common_vars.debugBuff_sample_offset])[5]=(int16_t)ulsch_harq->ulsch_pdu.mcs_index;
|
||||||
|
((int16_t*)&gNB->common_vars.debugBuff[gNB->common_vars.debugBuff_sample_offset])[6]=(int16_t)ulsch_harq->ulsch_pdu.pusch_data.rv_index;
|
||||||
|
((int16_t*)&gNB->common_vars.debugBuff[gNB->common_vars.debugBuff_sample_offset])[7]=(int16_t)harq_pid;
|
||||||
|
memcpy(&gNB->common_vars.debugBuff[gNB->common_vars.debugBuff_sample_offset+4],&ru->common.rxdata[0][slot_offset],frame_parms->get_samples_per_slot(slot_rx,frame_parms)*sizeof(int32_t));
|
||||||
|
gNB->common_vars.debugBuff_sample_offset+=(frame_parms->get_samples_per_slot(slot_rx,frame_parms)+1000+4);
|
||||||
|
if(gNB->common_vars.debugBuff_sample_offset>((frame_parms->get_samples_per_slot(slot_rx,frame_parms)+1000+2)*20)) {
|
||||||
|
FILE *f;
|
||||||
|
f = fopen("rxdata_buff.raw", "w"); if (f == NULL) exit(1);
|
||||||
|
fwrite((int16_t*)gNB->common_vars.debugBuff,2,(frame_parms->get_samples_per_slot(slot_rx,frame_parms)+1000+4)*20*2, f);
|
||||||
|
fclose(f);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint8_t symbol_start = ulsch_harq->ulsch_pdu.start_symbol_index;
|
uint8_t symbol_start = ulsch_harq->ulsch_pdu.start_symbol_index;
|
||||||
uint8_t symbol_end = symbol_start + ulsch_harq->ulsch_pdu.nr_of_symbols;
|
uint8_t symbol_end = symbol_start + ulsch_harq->ulsch_pdu.nr_of_symbols;
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RX_PUSCH,1);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RX_PUSCH,1);
|
||||||
for(uint8_t symbol = symbol_start; symbol < symbol_end; symbol++) {
|
start_meas(&gNB->rx_pusch_stats);
|
||||||
nr_rx_pusch(gNB, ULSCH_id, frame_rx, slot_rx, symbol, harq_pid);
|
for(uint8_t symbol = symbol_start; symbol < symbol_end; symbol++) {
|
||||||
}
|
no_sig = nr_rx_pusch(gNB, ULSCH_id, frame_rx, slot_rx, symbol, harq_pid);
|
||||||
|
if (no_sig) {
|
||||||
|
LOG_I(PHY, "PUSCH not detected in symbol %d\n",symbol);
|
||||||
|
nr_fill_indication(gNB,frame_rx, slot_rx, ULSCH_id, harq_pid, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stop_meas(&gNB->rx_pusch_stats);
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RX_PUSCH,0);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RX_PUSCH,0);
|
||||||
//LOG_M("rxdataF_comp.m","rxF_comp",gNB->pusch_vars[0]->rxdataF_comp[0],6900,1,1);
|
//LOG_M("rxdataF_comp.m","rxF_comp",gNB->pusch_vars[0]->rxdataF_comp[0],6900,1,1);
|
||||||
//LOG_M("rxdataF_ext.m","rxF_ext",gNB->pusch_vars[0]->rxdataF_ext[0],6900,1,1);
|
//LOG_M("rxdataF_ext.m","rxF_ext",gNB->pusch_vars[0]->rxdataF_ext[0],6900,1,1);
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_ULSCH_PROCEDURES_RX,1);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_ULSCH_PROCEDURES_RX,1);
|
||||||
nr_ulsch_procedures(gNB, frame_rx, slot_rx, ULSCH_id, harq_pid);
|
nr_ulsch_procedures(gNB, frame_rx, slot_rx, ULSCH_id, harq_pid);
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_ULSCH_PROCEDURES_RX,0);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_ULSCH_PROCEDURES_RX,0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// figure out a better way to choose slot_rx, 19 is ok for a particular TDD configuration with 30kHz SCS
|
||||||
|
if ((frame_rx&127) == 0 && slot_rx==19) dump_pusch_stats(gNB);
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_UESPEC_RX,0);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_UESPEC_RX,0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
#include "PHY/NR_TRANSPORT/nr_dci.h"
|
#include "PHY/NR_TRANSPORT/nr_dci.h"
|
||||||
#include "phy_frame_config_nr.h"
|
#include "phy_frame_config_nr.h"
|
||||||
|
|
||||||
|
void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx);
|
||||||
void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_scf_t *cfg, NR_DL_FRAME_PARMS *fp);
|
void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_scf_t *cfg, NR_DL_FRAME_PARMS *fp);
|
||||||
void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, int frame_tx, int slot_tx, int do_meas);
|
void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, int frame_tx, int slot_tx, int do_meas);
|
||||||
void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx);
|
void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx);
|
||||||
|
|||||||
@@ -117,6 +117,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
|
|||||||
dlsch0_harq->harq_ack.rx_status = downlink_harq_process(dlsch0_harq, dlsch0->current_harq_pid, dlsch_config_pdu->ndi, dlsch0->rnti_type);
|
dlsch0_harq->harq_ack.rx_status = downlink_harq_process(dlsch0_harq, dlsch0->current_harq_pid, dlsch_config_pdu->ndi, dlsch0->rnti_type);
|
||||||
dlsch0_harq->harq_ack.vDAI_DL = dlsch_config_pdu->dai;
|
dlsch0_harq->harq_ack.vDAI_DL = dlsch_config_pdu->dai;
|
||||||
LOG_D(MAC, ">>>> \tdlsch0->g_pucch = %d\tdlsch0_harq.mcs = %d\n", dlsch0->g_pucch, dlsch0_harq->mcs);
|
LOG_D(MAC, ">>>> \tdlsch0->g_pucch = %d\tdlsch0_harq.mcs = %d\n", dlsch0->g_pucch, dlsch0_harq->mcs);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,6 +86,8 @@ fifo_dump_emos_UE emos_dump_UE;
|
|||||||
|
|
||||||
char nr_mode_string[4][20] = {"NOT SYNCHED","PRACH","RAR","PUSCH"};
|
char nr_mode_string[4][20] = {"NOT SYNCHED","PRACH","RAR","PUSCH"};
|
||||||
|
|
||||||
|
const uint8_t nr_rv_round_map_ue[4] = {0, 2, 1, 3};
|
||||||
|
|
||||||
extern double cpuf;
|
extern double cpuf;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1099,169 +1101,6 @@ uint16_t nr_get_n1_pucch(PHY_VARS_NR_UE *ue,
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ulsch_common_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t empty_subframe) {
|
|
||||||
|
|
||||||
int aa;
|
|
||||||
NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
|
|
||||||
|
|
||||||
int nsymb;
|
|
||||||
int nr_tti_tx = proc->nr_tti_tx;
|
|
||||||
int frame_tx = proc->frame_tx;
|
|
||||||
int ulsch_start;
|
|
||||||
int overflow=0;
|
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) || defined(OAI_ADRV9371_ZC706)
|
|
||||||
int k,l;
|
|
||||||
int dummy_tx_buffer[frame_parms->samples_per_subframe] __attribute__((aligned(16)));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_COMMON,VCD_FUNCTION_IN);
|
|
||||||
#if UE_TIMING_TRACE
|
|
||||||
start_meas(&ue->ofdm_mod_stats);
|
|
||||||
#endif
|
|
||||||
nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
|
|
||||||
|
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) || defined(OAI_ADRV9371_ZC706)//this is the EXPRESS MIMO case
|
|
||||||
ulsch_start = (ue->rx_offset+nr_tti_tx*frame_parms->samples_per_subframe-
|
|
||||||
ue->hw_timing_advance-
|
|
||||||
ue->timing_advance-
|
|
||||||
ue->N_TA_offset+5);
|
|
||||||
//LOG_E(PHY,"ul-signal [nr_tti_rx: %d, ulsch_start %d]\n",nr_tti_tx, ulsch_start);
|
|
||||||
|
|
||||||
if(ulsch_start < 0)
|
|
||||||
ulsch_start = ulsch_start + (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_subframe);
|
|
||||||
|
|
||||||
if (ulsch_start > (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_subframe))
|
|
||||||
ulsch_start = ulsch_start % (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_subframe);
|
|
||||||
|
|
||||||
//LOG_E(PHY,"ul-signal [nr_tti_rx: %d, ulsch_start %d]\n",nr_tti_tx, ulsch_start);
|
|
||||||
#else //this is the normal case
|
|
||||||
ulsch_start = (frame_parms->samples_per_subframe*nr_tti_tx)-ue->N_TA_offset; //-ue->timing_advance;
|
|
||||||
#endif //else EXMIMO
|
|
||||||
|
|
||||||
//#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) || defined(OAI_ADRV9371_ZC706)
|
|
||||||
if (empty_subframe)
|
|
||||||
{
|
|
||||||
//#if 1
|
|
||||||
overflow = ulsch_start - 9*frame_parms->samples_per_subframe;
|
|
||||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
|
||||||
|
|
||||||
if (overflow > 0)
|
|
||||||
{
|
|
||||||
memset(&ue->common_vars.txdata[aa][ulsch_start],0,4*(frame_parms->samples_per_subframe-overflow));
|
|
||||||
memset(&ue->common_vars.txdata[aa][0],0,4*overflow);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memset(&ue->common_vars.txdata[aa][ulsch_start],0,4*frame_parms->samples_per_subframe);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*#else
|
|
||||||
overflow = ulsch_start - 9*frame_parms->samples_per_subframe;
|
|
||||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
|
||||||
for (k=ulsch_start; k<cmin(frame_parms->samples_per_subframe*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,ulsch_start+frame_parms->samples_per_subframe); k++) {
|
|
||||||
((short*)ue->common_vars.txdata[aa])[2*k] = 0;
|
|
||||||
((short*)ue->common_vars.txdata[aa])[2*k+1] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (k=0; k<overflow; k++) {
|
|
||||||
((short*)ue->common_vars.txdata[aa])[2*k] = 0;
|
|
||||||
((short*)ue->common_vars.txdata[aa])[2*k+1] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
endif*/
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if ((frame_tx%100) == 0)
|
|
||||||
LOG_D(PHY,"[UE %d] Frame %d, nr_tti_rx %d: ulsch_start = %d (rxoff %d, HW TA %d, timing advance %d, TA_offset %d\n",
|
|
||||||
ue->Mod_id,frame_tx,nr_tti_tx,
|
|
||||||
ulsch_start,
|
|
||||||
ue->rx_offset,
|
|
||||||
ue->hw_timing_advance,
|
|
||||||
ue->timing_advance,
|
|
||||||
ue->N_TA_offset);
|
|
||||||
|
|
||||||
|
|
||||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
|
||||||
if (frame_parms->Ncp == 1)
|
|
||||||
PHY_ofdm_mod(&ue->common_vars.txdataF[aa][nr_tti_tx*nsymb*frame_parms->ofdm_symbol_size],
|
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) || defined(OAI_ADRV9371_ZC706)
|
|
||||||
dummy_tx_buffer,
|
|
||||||
#else
|
|
||||||
&ue->common_vars.txdata[aa][ulsch_start],
|
|
||||||
#endif
|
|
||||||
frame_parms->ofdm_symbol_size,
|
|
||||||
nsymb,
|
|
||||||
frame_parms->nb_prefix_samples,
|
|
||||||
CYCLIC_PREFIX);
|
|
||||||
else
|
|
||||||
normal_prefix_mod(&ue->common_vars.txdataF[aa][nr_tti_tx*nsymb*frame_parms->ofdm_symbol_size],
|
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) || defined(OAI_ADRV9371_ZC706)
|
|
||||||
dummy_tx_buffer,
|
|
||||||
#else
|
|
||||||
&ue->common_vars.txdata[aa][ulsch_start],
|
|
||||||
#endif
|
|
||||||
nsymb,
|
|
||||||
&ue->frame_parms);
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) || defined(OAI_ADRV9371_ZC706)
|
|
||||||
apply_7_5_kHz(ue,dummy_tx_buffer,0);
|
|
||||||
apply_7_5_kHz(ue,dummy_tx_buffer,1);
|
|
||||||
#else
|
|
||||||
apply_7_5_kHz(ue,&ue->common_vars.txdata[aa][ulsch_start],0);
|
|
||||||
apply_7_5_kHz(ue,&ue->common_vars.txdata[aa][ulsch_start],1);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) || defined(OAI_ADRV9371_ZC706)
|
|
||||||
overflow = ulsch_start - 9*frame_parms->samples_per_subframe;
|
|
||||||
|
|
||||||
|
|
||||||
for (k=ulsch_start,l=0; k<cmin(frame_parms->samples_per_subframe*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,ulsch_start+frame_parms->samples_per_subframe); k++,l++) {
|
|
||||||
((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4;
|
|
||||||
((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (k=0; k<overflow; k++,l++) {
|
|
||||||
((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4;
|
|
||||||
((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4;
|
|
||||||
}
|
|
||||||
#if defined(EXMIMO)
|
|
||||||
// handle switch before 1st TX nr_tti_rx, guarantee that the slot prior to transmission is switch on
|
|
||||||
for (k=ulsch_start - (frame_parms->samples_per_subframe>>1) ; k<ulsch_start ; k++) {
|
|
||||||
if (k<0)
|
|
||||||
ue->common_vars.txdata[aa][k+frame_parms->samples_per_subframe*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE;
|
|
||||||
else if (k>(frame_parms->samples_per_subframe*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME))
|
|
||||||
ue->common_vars.txdata[aa][k-frame_parms->samples_per_subframe*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE;
|
|
||||||
else
|
|
||||||
ue->common_vars.txdata[aa][k] &= 0xFFFEFFFE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
only for debug
|
|
||||||
LOG_I(PHY,"ul-signal [nr_tti_rx: %d, ulsch_start %d, TA: %d, rxOffset: %d, timing_advance: %d, hw_timing_advance: %d]\n",nr_tti_tx, ulsch_start, ue->N_TA_offset, ue->rx_offset, ue->timing_advance, ue->hw_timing_advance);
|
|
||||||
if( (crash == 1) && (nr_tti_tx == 0) )
|
|
||||||
{
|
|
||||||
LOG_E(PHY,"***** DUMP TX Signal [ulsch_start %d] *****\n",ulsch_start);
|
|
||||||
write_output("txBuff.m","txSignal",&ue->common_vars.txdata[aa][ulsch_start],frame_parms->samples_per_subframe,1,1);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
} //nb_antennas_tx
|
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
|
||||||
stop_meas(&ue->ofdm_mod_stats);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_COMMON,VCD_FUNCTION_OUT);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
UE_MODE_t get_nrUE_mode(uint8_t Mod_id,uint8_t CC_id,uint8_t gNB_id){
|
UE_MODE_t get_nrUE_mode(uint8_t Mod_id,uint8_t CC_id,uint8_t gNB_id){
|
||||||
@@ -1424,7 +1263,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isBad) {
|
if (isBad) {
|
||||||
LOG_I(PHY,"Skip PUSCH generation!\n");
|
LOG_D(PHY,"Skip PUSCH generation!\n");
|
||||||
ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
|
ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2229,7 +2068,7 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
memset(ue->common_vars.txdataF[0], 0, sizeof(int)*14*ue->frame_parms.ofdm_symbol_size);
|
memset(ue->common_vars.txdataF[0], 0, sizeof(int)*14*ue->frame_parms.ofdm_symbol_size);
|
||||||
|
|
||||||
LOG_I(PHY,"****** start TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, slot_tx);
|
LOG_D(PHY,"****** start TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, slot_tx);
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
start_meas(&ue->phy_proc_tx);
|
start_meas(&ue->phy_proc_tx);
|
||||||
@@ -2250,20 +2089,18 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if (get_softmodem_params()->usim_test==0) {
|
if (get_softmodem_params()->usim_test==0) {
|
||||||
LOG_D(PHY, "Sending PUCCH\n");
|
LOG_D(PHY, "Generating PUCCH\n");
|
||||||
pucch_procedures_ue_nr(ue,
|
pucch_procedures_ue_nr(ue,
|
||||||
gNB_id,
|
gNB_id,
|
||||||
proc,
|
proc,
|
||||||
TRUE);
|
FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(PHY, "Sending data \n");
|
LOG_D(PHY, "Sending Uplink data \n");
|
||||||
nr_ue_pusch_common_procedures(ue,
|
nr_ue_pusch_common_procedures(ue,
|
||||||
harq_pid,
|
|
||||||
slot_tx,
|
slot_tx,
|
||||||
thread_id,
|
&ue->frame_parms,1);
|
||||||
gNB_id,
|
//ue->ulsch[thread_id][gNB_id][0]->harq_processes[harq_pid]->pusch_pdu.nrOfLayers);
|
||||||
&ue->frame_parms);
|
|
||||||
}
|
}
|
||||||
//LOG_M("txdata.m","txs",ue->common_vars.txdata[0],1228800,1,1);
|
//LOG_M("txdata.m","txs",ue->common_vars.txdata[0],1228800,1,1);
|
||||||
|
|
||||||
@@ -2273,7 +2110,7 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
|
|||||||
nr_ue_prach_procedures(ue, proc, gNB_id, mode);
|
nr_ue_prach_procedures(ue, proc, gNB_id, mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LOG_I(PHY,"****** end TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, slot_tx);
|
LOG_D(PHY,"****** end TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, slot_tx);
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
@@ -3026,7 +2863,7 @@ void copy_harq_proc_struct(NR_DL_UE_HARQ_t *harq_processes_dest, NR_DL_UE_HARQ_t
|
|||||||
memcpy(harq_ack_dest, current_harq_ack, sizeof(nr_harq_status_t));
|
memcpy(harq_ack_dest, current_harq_ack, sizeof(nr_harq_status_t));
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
void nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_id, PDSCH_t pdsch, NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t *dlsch1) {
|
int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_id, PDSCH_t pdsch, NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t *dlsch1) {
|
||||||
|
|
||||||
int nr_tti_rx = proc->nr_tti_rx;
|
int nr_tti_rx = proc->nr_tti_rx;
|
||||||
int m;
|
int m;
|
||||||
@@ -3034,9 +2871,9 @@ void nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB
|
|||||||
int first_symbol_flag=0;
|
int first_symbol_flag=0;
|
||||||
|
|
||||||
if (!dlsch0)
|
if (!dlsch0)
|
||||||
return;
|
return 0;
|
||||||
if (dlsch0->active == 0)
|
if (dlsch0->active == 0)
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
if (!dlsch1) {
|
if (!dlsch1) {
|
||||||
int harq_pid = dlsch0->current_harq_pid;
|
int harq_pid = dlsch0->current_harq_pid;
|
||||||
@@ -3047,7 +2884,7 @@ void nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB
|
|||||||
uint16_t s0 = dlsch0->harq_processes[harq_pid]->start_symbol;
|
uint16_t s0 = dlsch0->harq_processes[harq_pid]->start_symbol;
|
||||||
uint16_t s1 = dlsch0->harq_processes[harq_pid]->nb_symbols;
|
uint16_t s1 = dlsch0->harq_processes[harq_pid]->nb_symbols;
|
||||||
|
|
||||||
LOG_D(PHY,"[UE %d] PDSCH type %d active in nr_tti_rx %d, harq_pid %d, rb_start %d, nb_rb %d, symbol_start %d, nb_symbols %d, DMRS mask %x\n",ue->Mod_id,pdsch,nr_tti_rx,harq_pid,pdsch_start_rb,pdsch_nb_rb,s0,s1,dlsch0->harq_processes[harq_pid]->dlDmrsSymbPos);
|
LOG_D(PHY,"[UE %d] PDSCH type %d active in nr_tti_rx %d, harq_pid %d (%d), rb_start %d, nb_rb %d, symbol_start %d, nb_symbols %d, DMRS mask %x\n",ue->Mod_id,pdsch,nr_tti_rx,harq_pid,dlsch0->harq_processes[harq_pid]->status,pdsch_start_rb,pdsch_nb_rb,s0,s1,dlsch0->harq_processes[harq_pid]->dlDmrsSymbPos);
|
||||||
|
|
||||||
// do channel estimation for first DMRS only
|
// do channel estimation for first DMRS only
|
||||||
for (m = s0; m < 3; m++) {
|
for (m = s0; m < 3; m++) {
|
||||||
@@ -3081,8 +2918,8 @@ void nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB
|
|||||||
#endif
|
#endif
|
||||||
// process DLSCH received in first slot
|
// process DLSCH received in first slot
|
||||||
// skip DMRS symbols (will have to check later if PDSCH/DMRS are multiplexed
|
// skip DMRS symbols (will have to check later if PDSCH/DMRS are multiplexed
|
||||||
if (((1<<m)&dlsch0->harq_processes[harq_pid]->dlDmrsSymbPos) == 0)
|
if (((1<<m)&dlsch0->harq_processes[harq_pid]->dlDmrsSymbPos) == 0) {
|
||||||
nr_rx_pdsch(ue,
|
if (nr_rx_pdsch(ue,
|
||||||
pdsch,
|
pdsch,
|
||||||
eNB_id,
|
eNB_id,
|
||||||
eNB_id_i,
|
eNB_id_i,
|
||||||
@@ -3092,20 +2929,25 @@ void nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB
|
|||||||
first_symbol_flag,
|
first_symbol_flag,
|
||||||
dual_stream_UE,
|
dual_stream_UE,
|
||||||
i_mod,
|
i_mod,
|
||||||
dlsch0->current_harq_pid);
|
dlsch0->current_harq_pid) < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
else { // This is to adjust the llr offset in the case of skipping over a dmrs symbol (i.e. in case of no PDSCH REs in DMRS)
|
else { // This is to adjust the llr offset in the case of skipping over a dmrs symbol (i.e. in case of no PDSCH REs in DMRS)
|
||||||
if (pdsch == RA_PDSCH) ue->pdsch_vars_ra[eNB_id]->llr_offset[m]=ue->pdsch_vars_ra[eNB_id]->llr_offset[m-1];
|
if (pdsch == RA_PDSCH) ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->llr_offset[m]=ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->llr_offset[m-1];
|
||||||
else if (pdsch == PDSCH) nr_rx_pdsch(ue,
|
else if (pdsch == PDSCH) {
|
||||||
pdsch,
|
if (nr_rx_pdsch(ue,
|
||||||
eNB_id,
|
pdsch,
|
||||||
eNB_id_i,
|
eNB_id,
|
||||||
proc->frame_rx,
|
eNB_id_i,
|
||||||
nr_tti_rx, // nr_tti_rx,
|
proc->frame_rx,
|
||||||
m,
|
nr_tti_rx, // nr_tti_rx,
|
||||||
first_symbol_flag,
|
m,
|
||||||
dual_stream_UE,
|
first_symbol_flag,
|
||||||
i_mod,
|
dual_stream_UE,
|
||||||
dlsch0->current_harq_pid);
|
i_mod,
|
||||||
|
dlsch0->current_harq_pid) < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
else AssertFatal(1==0,"not RA_PDSCH or PDSCH\n");
|
else AssertFatal(1==0,"not RA_PDSCH or PDSCH\n");
|
||||||
}
|
}
|
||||||
if (pdsch == PDSCH) LOG_D(PHY,"Done processing symbol %d : llr_offset %d\n",m,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->llr_offset[m]);
|
if (pdsch == PDSCH) LOG_D(PHY,"Done processing symbol %d : llr_offset %d\n",m,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->llr_offset[m]);
|
||||||
@@ -3124,6 +2966,7 @@ void nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB
|
|||||||
}
|
}
|
||||||
} // CRNTI active
|
} // CRNTI active
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// WIP fix:
|
// WIP fix:
|
||||||
@@ -3341,14 +3184,8 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
if (1) {
|
if (1) {
|
||||||
switch (pdsch) {
|
switch (pdsch) {
|
||||||
case SI_PDSCH:
|
case SI_PDSCH:
|
||||||
pdsch_vars = ue->pdsch_vars_SI[eNB_id];
|
|
||||||
break;
|
|
||||||
case RA_PDSCH:
|
case RA_PDSCH:
|
||||||
pdsch_vars = ue->pdsch_vars_ra[eNB_id];
|
|
||||||
break;
|
|
||||||
case P_PDSCH:
|
case P_PDSCH:
|
||||||
pdsch_vars = ue->pdsch_vars_p[eNB_id];
|
|
||||||
break;
|
|
||||||
case PDSCH:
|
case PDSCH:
|
||||||
pdsch_vars = ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id];
|
pdsch_vars = ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id];
|
||||||
break;
|
break;
|
||||||
@@ -3377,6 +3214,9 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// exit dlsch procedures as there are no active dlsch
|
||||||
|
if (is_cw0_active != ACTIVE && is_cw1_active != ACTIVE)
|
||||||
|
return;
|
||||||
|
|
||||||
// start ldpc decode for CW 0
|
// start ldpc decode for CW 0
|
||||||
dlsch0->harq_processes[harq_pid]->G = nr_get_G(dlsch0->harq_processes[harq_pid]->nb_rb,
|
dlsch0->harq_processes[harq_pid]->G = nr_get_G(dlsch0->harq_processes[harq_pid]->nb_rb,
|
||||||
@@ -3726,7 +3566,7 @@ void *UE_thread_slot1_dl_processing(void *arg) {
|
|||||||
|
|
||||||
int frame_rx;
|
int frame_rx;
|
||||||
uint8_t nr_tti_rx;
|
uint8_t nr_tti_rx;
|
||||||
uint8_t pilot0;
|
uint8_t pilot0;
|
||||||
uint8_t pilot1;
|
uint8_t pilot1;
|
||||||
uint8_t slot1;
|
uint8_t slot1;
|
||||||
|
|
||||||
@@ -4052,6 +3892,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
int coreset_nb_rb=0;
|
int coreset_nb_rb=0;
|
||||||
int coreset_start_rb=0;
|
int coreset_start_rb=0;
|
||||||
|
|
||||||
if (pdcch_vars->nb_search_space > 0)
|
if (pdcch_vars->nb_search_space > 0)
|
||||||
get_coreset_rballoc(pdcch_vars->pdcch_config[0].coreset.frequency_domain_resource,&coreset_nb_rb,&coreset_start_rb);
|
get_coreset_rballoc(pdcch_vars->pdcch_config[0].coreset.frequency_domain_resource,&coreset_nb_rb,&coreset_start_rb);
|
||||||
|
|
||||||
@@ -4061,7 +3902,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
|||||||
if ((ue->decode_MIB == 1) && slot_pbch)
|
if ((ue->decode_MIB == 1) && slot_pbch)
|
||||||
{
|
{
|
||||||
LOG_I(PHY," ------ PBCH ChannelComp/LLR: frame.slot %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
|
LOG_I(PHY," ------ PBCH ChannelComp/LLR: frame.slot %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
|
||||||
|
|
||||||
for (int i=1; i<4; i++) {
|
for (int i=1; i<4; i++) {
|
||||||
|
|
||||||
nr_slot_fep(ue,
|
nr_slot_fep(ue,
|
||||||
@@ -4142,27 +3982,29 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
|||||||
} else if (ue->dlsch_ra[0]->active == 1){
|
} else if (ue->dlsch_ra[0]->active == 1){
|
||||||
dlsch = ue->dlsch_ra[0];
|
dlsch = ue->dlsch_ra[0];
|
||||||
}
|
}
|
||||||
AssertFatal(dlsch != NULL, "Unsupported mode\n");
|
|
||||||
uint8_t harq_pid = dlsch->current_harq_pid;
|
|
||||||
NR_DL_UE_HARQ_t *dlsch0_harq = dlsch->harq_processes[harq_pid];
|
|
||||||
uint16_t nb_symb_sch = dlsch0_harq->nb_symbols;
|
|
||||||
uint16_t start_symb_sch = dlsch0_harq->start_symbol;
|
|
||||||
int symb_dmrs = -1;
|
|
||||||
|
|
||||||
LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
|
if (dlsch) {
|
||||||
//to update from pdsch config
|
uint8_t harq_pid = dlsch->current_harq_pid;
|
||||||
|
NR_DL_UE_HARQ_t *dlsch0_harq = dlsch->harq_processes[harq_pid];
|
||||||
|
uint16_t nb_symb_sch = dlsch0_harq->nb_symbols;
|
||||||
|
uint16_t start_symb_sch = dlsch0_harq->start_symbol;
|
||||||
|
int symb_dmrs = -1;
|
||||||
|
|
||||||
for (int i=0;i<4;i++) if (((1<<i)&dlsch0_harq->dlDmrsSymbPos) > 0) {symb_dmrs=i;break;}
|
LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
|
||||||
AssertFatal(symb_dmrs>=0,"no dmrs in 0..3\n");
|
//to update from pdsch config
|
||||||
LOG_D(PHY,"Initializing dmrs for symb %d DMRS mask %x\n",symb_dmrs,dlsch0_harq->dlDmrsSymbPos);
|
|
||||||
nr_gold_pdsch(ue,symb_dmrs,0, 1);
|
for (int i=0;i<4;i++) if (((1<<i)&dlsch0_harq->dlDmrsSymbPos) > 0) {symb_dmrs=i;break;}
|
||||||
|
AssertFatal(symb_dmrs>=0,"no dmrs in 0..3\n");
|
||||||
|
LOG_D(PHY,"Initializing dmrs for symb %d DMRS mask %x\n",symb_dmrs,dlsch0_harq->dlDmrsSymbPos);
|
||||||
|
nr_gold_pdsch(ue,symb_dmrs,0, 1);
|
||||||
|
|
||||||
for (uint16_t m=start_symb_sch;m<(nb_symb_sch+start_symb_sch) ; m++){
|
for (uint16_t m=start_symb_sch;m<(nb_symb_sch+start_symb_sch) ; m++){
|
||||||
nr_slot_fep(ue,
|
nr_slot_fep(ue,
|
||||||
m, //to be updated from higher layer
|
m, //to be updated from higher layer
|
||||||
nr_tti_rx,
|
nr_tti_rx,
|
||||||
0,
|
0,
|
||||||
0);
|
0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_D(PHY,"[UE %d] Frame %d, nr_tti_rx %d: No DCIs found\n", ue->Mod_id, frame_rx, nr_tti_rx);
|
LOG_D(PHY,"[UE %d] Frame %d, nr_tti_rx %d: No DCIs found\n", ue->Mod_id, frame_rx, nr_tti_rx);
|
||||||
@@ -4174,9 +4016,10 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
|||||||
start_meas(&ue->generic_stat);
|
start_meas(&ue->generic_stat);
|
||||||
#endif
|
#endif
|
||||||
// do procedures for C-RNTI
|
// do procedures for C-RNTI
|
||||||
|
int ret_pdsch = 0;
|
||||||
if (ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active == 1) {
|
if (ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active == 1) {
|
||||||
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN);
|
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN);
|
||||||
nr_ue_pdsch_procedures(ue,
|
ret_pdsch = nr_ue_pdsch_procedures(ue,
|
||||||
proc,
|
proc,
|
||||||
eNB_id,
|
eNB_id,
|
||||||
PDSCH,
|
PDSCH,
|
||||||
@@ -4271,7 +4114,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
|||||||
start_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[nr_tti_rx]]);
|
start_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[nr_tti_rx]]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
nr_ue_dlsch_procedures(ue,
|
if (ret_pdsch >= 0)
|
||||||
|
nr_ue_dlsch_procedures(ue,
|
||||||
proc,
|
proc,
|
||||||
eNB_id,
|
eNB_id,
|
||||||
PDSCH,
|
PDSCH,
|
||||||
|
|||||||
@@ -78,6 +78,8 @@ double t_rx_min = 1000000000; /*!< \brief initial min process time for rx */
|
|||||||
int n_tx_dropped = 0; /*!< \brief initial max process time for tx */
|
int n_tx_dropped = 0; /*!< \brief initial max process time for tx */
|
||||||
int n_rx_dropped = 0; /*!< \brief initial max process time for rx */
|
int n_rx_dropped = 0; /*!< \brief initial max process time for rx */
|
||||||
|
|
||||||
|
double DS_TDL = .03;
|
||||||
|
|
||||||
int emulate_rf = 0;
|
int emulate_rf = 0;
|
||||||
int split73=0;
|
int split73=0;
|
||||||
void sendFs6Ul(PHY_VARS_eNB *eNB, int UE_id, int harq_pid, int segmentID, int16_t *data, int dataLen, int r_offset) {
|
void sendFs6Ul(PHY_VARS_eNB *eNB, int UE_id, int harq_pid, int segmentID, int16_t *data, int dataLen, int r_offset) {
|
||||||
@@ -161,7 +163,7 @@ void DL_channel(RU_t *ru,PHY_VARS_UE *UE,uint subframe,int awgn_flag,double SNR,
|
|||||||
// Multipath channel
|
// Multipath channel
|
||||||
if (awgn_flag == 0) {
|
if (awgn_flag == 0) {
|
||||||
multipath_channel(eNB2UE[round],s_re,s_im,r_re,r_im,
|
multipath_channel(eNB2UE[round],s_re,s_im,r_re,r_im,
|
||||||
2*UE->frame_parms.samples_per_tti,hold_channel);
|
2*UE->frame_parms.samples_per_tti,hold_channel,0);
|
||||||
|
|
||||||
// printf("amc: ****************** eNB2UE[%d]->n_rx = %d,dd %d\n",round,eNB2UE[round]->nb_rx,eNB2UE[round]->channel_offset);
|
// printf("amc: ****************** eNB2UE[%d]->n_rx = %d,dd %d\n",round,eNB2UE[round]->nb_rx,eNB2UE[round]->channel_offset);
|
||||||
if(abstx==1 && num_rounds>1)
|
if(abstx==1 && num_rounds>1)
|
||||||
@@ -1172,6 +1174,7 @@ int main(int argc, char **argv) {
|
|||||||
channel_model,
|
channel_model,
|
||||||
N_RB2sampling_rate(eNB->frame_parms.N_RB_DL),
|
N_RB2sampling_rate(eNB->frame_parms.N_RB_DL),
|
||||||
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
|
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
|
||||||
|
DS_TDL,
|
||||||
forgetting_factor,
|
forgetting_factor,
|
||||||
rx_sample_offset,
|
rx_sample_offset,
|
||||||
0);
|
0);
|
||||||
@@ -1185,6 +1188,7 @@ int main(int argc, char **argv) {
|
|||||||
channel_model,
|
channel_model,
|
||||||
N_RB2sampling_rate(eNB->frame_parms.N_RB_DL),
|
N_RB2sampling_rate(eNB->frame_parms.N_RB_DL),
|
||||||
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
|
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
|
||||||
|
DS_TDL,
|
||||||
forgetting_factor,
|
forgetting_factor,
|
||||||
rx_sample_offset,
|
rx_sample_offset,
|
||||||
0);
|
0);
|
||||||
|
|||||||
@@ -729,6 +729,7 @@ int main(int argc, char **argv) {
|
|||||||
channel_model,
|
channel_model,
|
||||||
N_RB2sampling_rate(eNB->frame_parms.N_RB_UL),
|
N_RB2sampling_rate(eNB->frame_parms.N_RB_UL),
|
||||||
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL),
|
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL),
|
||||||
|
30e-9,
|
||||||
forgetting_factor,
|
forgetting_factor,
|
||||||
delay,
|
delay,
|
||||||
0);
|
0);
|
||||||
@@ -1086,7 +1087,7 @@ int main(int argc, char **argv) {
|
|||||||
if (awgn_flag == 0) {
|
if (awgn_flag == 0) {
|
||||||
if (UE2eNB->max_Doppler == 0) {
|
if (UE2eNB->max_Doppler == 0) {
|
||||||
multipath_channel(UE2eNB,s_re,s_im,r_re,r_im,
|
multipath_channel(UE2eNB,s_re,s_im,r_re,r_im,
|
||||||
eNB->frame_parms.samples_per_tti,hold_channel);
|
eNB->frame_parms.samples_per_tti,hold_channel,0);
|
||||||
} else {
|
} else {
|
||||||
multipath_tv_channel(UE2eNB,s_re,s_im,r_re,r_im,
|
multipath_tv_channel(UE2eNB,s_re,s_im,r_re,r_im,
|
||||||
2*eNB->frame_parms.samples_per_tti,hold_channel);
|
2*eNB->frame_parms.samples_per_tti,hold_channel);
|
||||||
|
|||||||
@@ -58,7 +58,8 @@ double cpuf;
|
|||||||
uint8_t nfapi_mode = 0;
|
uint8_t nfapi_mode = 0;
|
||||||
uint16_t NB_UE_INST = 1;
|
uint16_t NB_UE_INST = 1;
|
||||||
|
|
||||||
|
uint8_t const nr_rv_round_map[4] = {0, 2, 1, 3};
|
||||||
|
uint8_t const nr_rv_round_map_ue[4] = {0, 2, 1, 3};
|
||||||
|
|
||||||
// needed for some functions
|
// needed for some functions
|
||||||
PHY_VARS_NR_UE *PHY_vars_UE_g[1][1] = { { NULL } };
|
PHY_VARS_NR_UE *PHY_vars_UE_g[1][1] = { { NULL } };
|
||||||
@@ -113,7 +114,7 @@ int main(int argc, char **argv)
|
|||||||
uint16_t nb_rb = 50;
|
uint16_t nb_rb = 50;
|
||||||
uint8_t Imcs = 9;
|
uint8_t Imcs = 9;
|
||||||
uint8_t mcs_table = 0;
|
uint8_t mcs_table = 0;
|
||||||
|
double DS_TDL = .03;
|
||||||
cpuf = get_cpu_freq_GHz();
|
cpuf = get_cpu_freq_GHz();
|
||||||
|
|
||||||
if (load_configmodule(argc, argv, CONFIG_ENABLECMDLINEONLY) == 0) {
|
if (load_configmodule(argc, argv, CONFIG_ENABLECMDLINEONLY) == 0) {
|
||||||
@@ -336,6 +337,7 @@ int main(int argc, char **argv)
|
|||||||
gNB2UE = new_channel_desc_scm(n_tx, n_rx, channel_model,
|
gNB2UE = new_channel_desc_scm(n_tx, n_rx, channel_model,
|
||||||
61.44e6, //N_RB2sampling_rate(N_RB_DL),
|
61.44e6, //N_RB2sampling_rate(N_RB_DL),
|
||||||
40e6, //N_RB2channel_bandwidth(N_RB_DL),
|
40e6, //N_RB2channel_bandwidth(N_RB_DL),
|
||||||
|
DS_TDL,
|
||||||
0, 0, 0);
|
0, 0, 0);
|
||||||
|
|
||||||
if (gNB2UE == NULL) {
|
if (gNB2UE == NULL) {
|
||||||
@@ -499,7 +501,7 @@ int main(int argc, char **argv)
|
|||||||
//printf("crc32: [0]->0x%08x\n",crc24c(test_input, 32));
|
//printf("crc32: [0]->0x%08x\n",crc24c(test_input, 32));
|
||||||
// generate signal
|
// generate signal
|
||||||
if (input_fd == NULL) {
|
if (input_fd == NULL) {
|
||||||
nr_dlsch_encoding(test_input, frame, slot, dlsch, frame_parms,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
|
nr_dlsch_encoding(gNB, test_input, frame, slot, dlsch, frame_parms,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (SNR = snr0; SNR < snr1; SNR += snr_step) {
|
for (SNR = snr0; SNR < snr1; SNR += snr_step) {
|
||||||
|
|||||||
@@ -38,8 +38,10 @@
|
|||||||
#include "PHY/types.h"
|
#include "PHY/types.h"
|
||||||
#include "PHY/INIT/phy_init.h"
|
#include "PHY/INIT/phy_init.h"
|
||||||
#include "PHY/MODULATION/modulation_eNB.h"
|
#include "PHY/MODULATION/modulation_eNB.h"
|
||||||
|
#include "PHY/MODULATION/nr_modulation.h"
|
||||||
#include "PHY/MODULATION/modulation_UE.h"
|
#include "PHY/MODULATION/modulation_UE.h"
|
||||||
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
|
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
|
||||||
|
#include "PHY/NR_TRANSPORT/nr_dlsch.h"
|
||||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||||
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
|
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
|
||||||
#include "SCHED_NR/fapi_nr_l1.h"
|
#include "SCHED_NR/fapi_nr_l1.h"
|
||||||
@@ -122,7 +124,7 @@ int generate_dlsch_header(unsigned char *mac_header,
|
|||||||
unsigned char *ue_cont_res_id,
|
unsigned char *ue_cont_res_id,
|
||||||
unsigned char short_padding,
|
unsigned char short_padding,
|
||||||
unsigned short post_padding){return 0;}
|
unsigned short post_padding){return 0;}
|
||||||
void nr_ip_over_LTE_DRB_preconfiguration(void){}
|
void nr_DRB_preconfiguration(void){}
|
||||||
|
|
||||||
// needed for some functions
|
// needed for some functions
|
||||||
openair0_config_t openair0_cfg[MAX_CARDS];
|
openair0_config_t openair0_cfg[MAX_CARDS];
|
||||||
@@ -180,7 +182,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
//unsigned char frame_type = 0;
|
//unsigned char frame_type = 0;
|
||||||
|
|
||||||
int frame=0,slot=1;
|
int frame=1,slot=1;
|
||||||
int frame_length_complex_samples;
|
int frame_length_complex_samples;
|
||||||
int frame_length_complex_samples_no_prefix;
|
int frame_length_complex_samples_no_prefix;
|
||||||
NR_DL_FRAME_PARMS *frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms;
|
||||||
@@ -191,7 +193,8 @@ int main(int argc, char **argv)
|
|||||||
int cyclic_prefix_type = NFAPI_CP_NORMAL;
|
int cyclic_prefix_type = NFAPI_CP_NORMAL;
|
||||||
int run_initial_sync=0;
|
int run_initial_sync=0;
|
||||||
int do_pdcch_flag=1;
|
int do_pdcch_flag=1;
|
||||||
|
int pusch_tgt_snrx10 = 200;
|
||||||
|
int pucch_tgt_snrx10 = 200;
|
||||||
int loglvl=OAILOG_INFO;
|
int loglvl=OAILOG_INFO;
|
||||||
|
|
||||||
float target_error_rate = 0.01;
|
float target_error_rate = 0.01;
|
||||||
@@ -528,9 +531,9 @@ int main(int argc, char **argv)
|
|||||||
AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
|
AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
|
||||||
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
|
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
|
||||||
// common configuration
|
// common configuration
|
||||||
rrc_mac_config_req_gNB(0,0,1,scc,0,0,NULL);
|
rrc_mac_config_req_gNB(0,0,1,pusch_tgt_snrx10,pucch_tgt_snrx10,scc,0,0,NULL);
|
||||||
// UE dedicated configuration
|
// UE dedicated configuration
|
||||||
rrc_mac_config_req_gNB(0,0,1,NULL,1,secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
|
rrc_mac_config_req_gNB(0,0,1,pusch_tgt_snrx10,pucch_tgt_snrx10,NULL,1,secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
|
||||||
phy_init_nr_gNB(gNB,0,0);
|
phy_init_nr_gNB(gNB,0,0);
|
||||||
N_RB_DL = gNB->frame_parms.N_RB_DL;
|
N_RB_DL = gNB->frame_parms.N_RB_DL;
|
||||||
// stub to configure frame_parms
|
// stub to configure frame_parms
|
||||||
@@ -571,6 +574,7 @@ int main(int argc, char **argv)
|
|||||||
channel_model,
|
channel_model,
|
||||||
fs,
|
fs,
|
||||||
bw,
|
bw,
|
||||||
|
30e-9,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0);
|
0);
|
||||||
@@ -713,12 +717,16 @@ int main(int argc, char **argv)
|
|||||||
reset_meas(&gNB->tparity);
|
reset_meas(&gNB->tparity);
|
||||||
reset_meas(&gNB->toutput);
|
reset_meas(&gNB->toutput);
|
||||||
|
|
||||||
|
clear_pdsch_stats(gNB);
|
||||||
|
|
||||||
n_errors = 0;
|
n_errors = 0;
|
||||||
effRate = 0;
|
effRate = 0;
|
||||||
//n_errors2 = 0;
|
//n_errors2 = 0;
|
||||||
//n_alamouti = 0;
|
//n_alamouti = 0;
|
||||||
errors_scrambling=0;
|
errors_scrambling=0;
|
||||||
n_false_positive = 0;
|
n_false_positive = 0;
|
||||||
|
if (n_trials== 1) num_rounds = 1;
|
||||||
|
|
||||||
for (trial = 0; trial < n_trials; trial++) {
|
for (trial = 0; trial < n_trials; trial++) {
|
||||||
|
|
||||||
errors_bit = 0;
|
errors_bit = 0;
|
||||||
@@ -753,6 +761,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
UE_list->UE_sched_ctrl[0].harq_processes[harq_pid].ndi = !(trial&1);
|
UE_list->UE_sched_ctrl[0].harq_processes[harq_pid].ndi = !(trial&1);
|
||||||
|
|
||||||
|
|
||||||
UE_list->UE_sched_ctrl[0].harq_processes[harq_pid].round = round;
|
UE_list->UE_sched_ctrl[0].harq_processes[harq_pid].round = round;
|
||||||
UE_list->UE_sched_ctrl[0].current_harq_pid = harq_pid;
|
UE_list->UE_sched_ctrl[0].current_harq_pid = harq_pid;
|
||||||
gNB->dlsch[0][0]->harq_processes[harq_pid]->round = round;
|
gNB->dlsch[0][0]->harq_processes[harq_pid]->round = round;
|
||||||
@@ -777,12 +786,12 @@ int main(int argc, char **argv)
|
|||||||
int txdataF_offset = (slot%2) * frame_parms->samples_per_slot_wCP;
|
int txdataF_offset = (slot%2) * frame_parms->samples_per_slot_wCP;
|
||||||
|
|
||||||
if (n_trials==1) {
|
if (n_trials==1) {
|
||||||
LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1);
|
LOG_M("txsigF0.m","txsF0", &gNB->common_vars.txdataF[0][txdataF_offset],frame_parms->samples_per_slot_wCP,1,1);
|
||||||
if (gNB->frame_parms.nb_antennas_tx>1)
|
if (gNB->frame_parms.nb_antennas_tx>1)
|
||||||
LOG_M("txsigF1.m","txsF1", gNB->common_vars.txdataF[1],frame_length_complex_samples_no_prefix,1,1);
|
LOG_M("txsigF1.m","txsF1", &gNB->common_vars.txdataF[1][txdataF_offset],frame_parms->samples_per_slot_wCP,1,1);
|
||||||
}
|
}
|
||||||
int tx_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
|
int tx_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
|
||||||
if (n_trials==1) printf("samples_per_slot_wCP = %d\n", frame_parms->samples_per_slot_wCP);
|
if (n_trials==1) printf("tx_offset %d, txdataF_offset %d \n", tx_offset,txdataF_offset);
|
||||||
|
|
||||||
//TODO: loop over slots
|
//TODO: loop over slots
|
||||||
for (aa=0; aa<gNB->frame_parms.nb_antennas_tx; aa++) {
|
for (aa=0; aa<gNB->frame_parms.nb_antennas_tx; aa++) {
|
||||||
@@ -794,24 +803,51 @@ int main(int argc, char **argv)
|
|||||||
12,
|
12,
|
||||||
frame_parms->nb_prefix_samples,
|
frame_parms->nb_prefix_samples,
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
} else {
|
} else {/*
|
||||||
nr_normal_prefix_mod(&gNB->common_vars.txdataF[aa][txdataF_offset],
|
nr_normal_prefix_mod(&gNB->common_vars.txdataF[aa][txdataF_offset],
|
||||||
&txdata[aa][tx_offset],
|
&txdata[aa][tx_offset],
|
||||||
14,
|
14,
|
||||||
frame_parms);
|
frame_parms);
|
||||||
|
*/
|
||||||
|
PHY_ofdm_mod(&gNB->common_vars.txdataF[aa][txdataF_offset],
|
||||||
|
(int*)&txdata[aa][tx_offset],
|
||||||
|
frame_parms->ofdm_symbol_size,
|
||||||
|
1,
|
||||||
|
frame_parms->nb_prefix_samples0,
|
||||||
|
CYCLIC_PREFIX);
|
||||||
|
|
||||||
|
apply_nr_rotation(frame_parms,
|
||||||
|
(int16_t*)&txdata[aa][tx_offset],
|
||||||
|
slot,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples0);
|
||||||
|
PHY_ofdm_mod(&gNB->common_vars.txdataF[aa][txdataF_offset+frame_parms->ofdm_symbol_size],
|
||||||
|
(int*)&txdata[aa][tx_offset+frame_parms->nb_prefix_samples0+frame_parms->ofdm_symbol_size],
|
||||||
|
frame_parms->ofdm_symbol_size,
|
||||||
|
13,
|
||||||
|
frame_parms->nb_prefix_samples,
|
||||||
|
CYCLIC_PREFIX);
|
||||||
|
apply_nr_rotation(frame_parms,
|
||||||
|
(int16_t*)&txdata[aa][tx_offset+frame_parms->nb_prefix_samples0+frame_parms->ofdm_symbol_size],
|
||||||
|
slot,
|
||||||
|
1,
|
||||||
|
13,
|
||||||
|
frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n_trials==1) {
|
if (n_trials==1) {
|
||||||
LOG_M("txsig0.m","txs0", txdata[0],frame_length_complex_samples,1,1);
|
LOG_M("txsig0.m","txs0", &txdata[0][tx_offset],frame_parms->get_samples_slot_timestamp(slot,frame_parms,0),1,1);
|
||||||
if (gNB->frame_parms.nb_antennas_tx>1)
|
if (gNB->frame_parms.nb_antennas_tx>1)
|
||||||
LOG_M("txsig1.m","txs1", txdata[1],frame_length_complex_samples,1,1);
|
LOG_M("txsig1.m","txs1", &txdata[1][tx_offset],frame_parms->get_samples_slot_timestamp(slot,frame_parms,0),1,1);
|
||||||
}
|
}
|
||||||
if (output_fd) {
|
if (output_fd) {
|
||||||
printf("writing txdata to binary file\n");
|
printf("writing txdata to binary file\n");
|
||||||
fwrite(txdata[0],sizeof(int32_t),frame_length_complex_samples,output_fd);
|
fwrite(txdata[0],sizeof(int32_t),frame_length_complex_samples,output_fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
int txlev = signal_energy(&txdata[0][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)+5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0], frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
|
int txlev = signal_energy(&txdata[0][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)+5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0], frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
|
||||||
|
|
||||||
// if (n_trials==1) printf("txlev %d (%f)\n",txlev,10*log10((double)txlev));
|
// if (n_trials==1) printf("txlev %d (%f)\n",txlev,10*log10((double)txlev));
|
||||||
@@ -923,6 +959,7 @@ int main(int argc, char **argv)
|
|||||||
(float) n_errors / (float) n_trials);
|
(float) n_errors / (float) n_trials);
|
||||||
printf("*****************************************\n");
|
printf("*****************************************\n");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
dump_pdsch_stats(gNB);
|
||||||
printf("SNR %f : n_errors (negative CRC) = %d/%d, Avg round %.2f, Channel BER %e, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %d bits/slot\n", SNR, n_errors, n_trials,roundStats[snrRun],(double)errors_scrambling/available_bits/n_trials,effRate,effRate/TBS*100,TBS);
|
printf("SNR %f : n_errors (negative CRC) = %d/%d, Avg round %.2f, Channel BER %e, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %d bits/slot\n", SNR, n_errors, n_trials,roundStats[snrRun],(double)errors_scrambling/available_bits/n_trials,effRate,effRate/TBS*100,TBS);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
@@ -984,6 +1021,7 @@ int main(int argc, char **argv)
|
|||||||
LOG_M("rxsig1.m","rxs1", UE->common_vars.rxdata[1], frame_length_complex_samples, 1, 1);
|
LOG_M("rxsig1.m","rxs1", UE->common_vars.rxdata[1], frame_length_complex_samples, 1, 1);
|
||||||
LOG_M("chestF0.m","chF0",UE->pdsch_vars[0][0]->dl_ch_estimates_ext,N_RB_DL*12*14,1,1);
|
LOG_M("chestF0.m","chF0",UE->pdsch_vars[0][0]->dl_ch_estimates_ext,N_RB_DL*12*14,1,1);
|
||||||
write_output("rxF_comp.m","rxFc",&UE->pdsch_vars[0][0]->rxdataF_comp0[0][0],N_RB_DL*12*14,1,1);
|
write_output("rxF_comp.m","rxFc",&UE->pdsch_vars[0][0]->rxdataF_comp0[0][0],N_RB_DL*12*14,1,1);
|
||||||
|
LOG_M("rxF_llr.m","rxFllr",UE->pdsch_vars[UE->current_thread_id[UE_proc.nr_tti_rx]][0]->llr[0],available_bits,1,0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,6 +59,10 @@ uint16_t NB_UE_INST = 1;
|
|||||||
|
|
||||||
// needed for some functions
|
// needed for some functions
|
||||||
openair0_config_t openair0_cfg[MAX_CARDS];
|
openair0_config_t openair0_cfg[MAX_CARDS];
|
||||||
|
|
||||||
|
uint8_t const nr_rv_round_map[4] = {0, 2, 1, 3};
|
||||||
|
uint8_t const nr_rv_round_map_ue[4] = {0, 2, 1, 3};
|
||||||
|
|
||||||
uint64_t get_softmodem_optmask(void) {return 0;}
|
uint64_t get_softmodem_optmask(void) {return 0;}
|
||||||
|
|
||||||
void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {}
|
void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {}
|
||||||
@@ -104,6 +108,9 @@ void nr_phy_config_request_sim_pbchsim(PHY_VARS_gNB *gNB,
|
|||||||
gNB_config->carrier_config.dl_bandwidth.value = config_bandwidth(mu, N_RB_DL, fp->nr_band);
|
gNB_config->carrier_config.dl_bandwidth.value = config_bandwidth(mu, N_RB_DL, fp->nr_band);
|
||||||
|
|
||||||
nr_init_frame_parms(gNB_config, fp);
|
nr_init_frame_parms(gNB_config, fp);
|
||||||
|
|
||||||
|
init_symbol_rotation(fp,fp->dl_CarrierFreq);
|
||||||
|
|
||||||
gNB->configured = 1;
|
gNB->configured = 1;
|
||||||
LOG_I(PHY,"gNB configured\n");
|
LOG_I(PHY,"gNB configured\n");
|
||||||
}
|
}
|
||||||
@@ -467,6 +474,7 @@ int main(int argc, char **argv)
|
|||||||
channel_model,
|
channel_model,
|
||||||
fs,
|
fs,
|
||||||
bw,
|
bw,
|
||||||
|
300e-9,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0);
|
0);
|
||||||
@@ -547,10 +555,35 @@ int main(int argc, char **argv)
|
|||||||
frame_parms->nb_prefix_samples,
|
frame_parms->nb_prefix_samples,
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
} else {
|
} else {
|
||||||
nr_normal_prefix_mod(gNB->common_vars.txdataF[aa],
|
/* nr_normal_prefix_mod(gNB->common_vars.txdataF[aa],
|
||||||
&txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)],
|
&txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)],
|
||||||
14,
|
14,
|
||||||
frame_parms);
|
frame_parms);*/
|
||||||
|
PHY_ofdm_mod(gNB->common_vars.txdataF[aa],
|
||||||
|
(int*)&txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)],
|
||||||
|
frame_parms->ofdm_symbol_size,
|
||||||
|
1,
|
||||||
|
frame_parms->nb_prefix_samples0,
|
||||||
|
CYCLIC_PREFIX);
|
||||||
|
|
||||||
|
apply_nr_rotation(frame_parms,
|
||||||
|
(int16_t*)&txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)],
|
||||||
|
slot,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples0);
|
||||||
|
PHY_ofdm_mod(&gNB->common_vars.txdataF[aa][frame_parms->ofdm_symbol_size],
|
||||||
|
(int*)&txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)+frame_parms->nb_prefix_samples0+frame_parms->ofdm_symbol_size],
|
||||||
|
frame_parms->ofdm_symbol_size,
|
||||||
|
13,
|
||||||
|
frame_parms->nb_prefix_samples,
|
||||||
|
CYCLIC_PREFIX);
|
||||||
|
apply_nr_rotation(frame_parms,
|
||||||
|
(int16_t*)&txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)+frame_parms->nb_prefix_samples0+frame_parms->ofdm_symbol_size],
|
||||||
|
slot,
|
||||||
|
1,
|
||||||
|
13,
|
||||||
|
frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ boolean_t pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP,
|
|||||||
const sdu_size_t sdu_buffer_sizeP,
|
const sdu_size_t sdu_buffer_sizeP,
|
||||||
mem_block_t *const sdu_buffer_pP) {return(false);}
|
mem_block_t *const sdu_buffer_pP) {return(false);}
|
||||||
|
|
||||||
void nr_ip_over_LTE_DRB_preconfiguration(void){}
|
void nr_DRB_preconfiguration(void){}
|
||||||
void pdcp_layer_init(void) {}
|
void pdcp_layer_init(void) {}
|
||||||
int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, const int CC_id, const uint8_t gNB_index, const int8_t channel, const uint8_t* pduP, const sdu_size_t pdu_len) {return 0;}
|
int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, const int CC_id, const uint8_t gNB_index, const int8_t channel, const uint8_t* pduP, const sdu_size_t pdu_len) {return 0;}
|
||||||
|
|
||||||
@@ -92,6 +92,7 @@ int main(int argc, char **argv){
|
|||||||
uint16_t Nid_cell = 0, preamble_tx = 0, preamble_delay, format, format0, format1;
|
uint16_t Nid_cell = 0, preamble_tx = 0, preamble_delay, format, format0, format1;
|
||||||
uint32_t tx_lev = 10000, prach_errors = 0, samp_count; //,tx_lev_dB;
|
uint32_t tx_lev = 10000, prach_errors = 0, samp_count; //,tx_lev_dB;
|
||||||
uint64_t SSB_positions = 0x01, absoluteFrequencyPointA = 640000;
|
uint64_t SSB_positions = 0x01, absoluteFrequencyPointA = 640000;
|
||||||
|
double DS_TDL = .03;
|
||||||
|
|
||||||
// int8_t interf1=-19,interf2=-19;
|
// int8_t interf1=-19,interf2=-19;
|
||||||
// uint8_t abstraction_flag=0,calibration_flag=0;
|
// uint8_t abstraction_flag=0,calibration_flag=0;
|
||||||
@@ -557,6 +558,7 @@ int main(int argc, char **argv){
|
|||||||
channel_model,
|
channel_model,
|
||||||
fs,
|
fs,
|
||||||
bw,
|
bw,
|
||||||
|
DS_TDL,
|
||||||
0.0,
|
0.0,
|
||||||
delay,
|
delay,
|
||||||
0);
|
0);
|
||||||
@@ -602,7 +604,7 @@ int main(int argc, char **argv){
|
|||||||
/* tx_lev_dB not used later, no need to set */
|
/* tx_lev_dB not used later, no need to set */
|
||||||
//tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
|
//tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
|
||||||
|
|
||||||
prach_start = subframe*frame_parms->samples_per_subframe-UE->N_TA_offset;
|
prach_start = subframe*frame_parms->samples_per_subframe;
|
||||||
|
|
||||||
#ifdef NR_PRACH_DEBUG
|
#ifdef NR_PRACH_DEBUG
|
||||||
LOG_M("txsig0.m", "txs0", &txdata[0][subframe*frame_parms->samples_per_subframe], frame_parms->samples_per_subframe, 1, 1);
|
LOG_M("txsig0.m", "txs0", &txdata[0][subframe*frame_parms->samples_per_subframe], frame_parms->samples_per_subframe, 1, 1);
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
|
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
|
||||||
#include "PHY/MODULATION/modulation_eNB.h"
|
#include "PHY/MODULATION/modulation_eNB.h"
|
||||||
#include "PHY/MODULATION/modulation_UE.h"
|
#include "PHY/MODULATION/modulation_UE.h"
|
||||||
|
#include "PHY/NR_ESTIMATION/nr_ul_estimation.h"
|
||||||
#include "PHY/INIT/phy_init.h"
|
#include "PHY/INIT/phy_init.h"
|
||||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||||
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
|
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
|
||||||
@@ -54,6 +55,8 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
|||||||
double cpuf;
|
double cpuf;
|
||||||
uint8_t nfapi_mode = 0;
|
uint8_t nfapi_mode = 0;
|
||||||
uint16_t NB_UE_INST = 1;
|
uint16_t NB_UE_INST = 1;
|
||||||
|
uint8_t const nr_rv_round_map[4] = {0, 2, 1, 3};
|
||||||
|
uint8_t const nr_rv_round_map_ue[4] = {0, 2, 1, 3};
|
||||||
|
|
||||||
// needed for some functions
|
// needed for some functions
|
||||||
PHY_VARS_NR_UE * PHY_vars_UE_g[1][1]={{NULL}};
|
PHY_VARS_NR_UE * PHY_vars_UE_g[1][1]={{NULL}};
|
||||||
@@ -77,11 +80,11 @@ int main(int argc, char **argv)
|
|||||||
//int freq_offset;
|
//int freq_offset;
|
||||||
//int subframe_offset;
|
//int subframe_offset;
|
||||||
//char fname[40], vname[40];
|
//char fname[40], vname[40];
|
||||||
int trial,n_trials=100,n_errors=0,ack_nack_errors=0;
|
int trial,n_trials=100,n_errors=0,ack_nack_errors=0,sr_errors=0;
|
||||||
uint8_t transmission_mode = 1,n_tx=1,n_rx=1;
|
uint8_t transmission_mode = 1,n_tx=1,n_rx=1;
|
||||||
uint16_t Nid_cell=0;
|
uint16_t Nid_cell=0;
|
||||||
uint64_t SSB_positions=0x01;
|
uint64_t SSB_positions=0x01;
|
||||||
channel_desc_t *gNB2UE;
|
channel_desc_t *UE2gNB;
|
||||||
int format=0;
|
int format=0;
|
||||||
//uint8_t extended_prefix_flag=0;
|
//uint8_t extended_prefix_flag=0;
|
||||||
FILE *input_fd=NULL;
|
FILE *input_fd=NULL;
|
||||||
@@ -97,6 +100,8 @@ int main(int argc, char **argv)
|
|||||||
uint16_t nrofPRB=2;
|
uint16_t nrofPRB=2;
|
||||||
uint8_t timeDomainOCC=0;
|
uint8_t timeDomainOCC=0;
|
||||||
SCM_t channel_model=AWGN;//Rayleigh1_anticorr;
|
SCM_t channel_model=AWGN;//Rayleigh1_anticorr;
|
||||||
|
|
||||||
|
double DS_TDL = .03;
|
||||||
|
|
||||||
int N_RB_DL=273,mu=1;
|
int N_RB_DL=273,mu=1;
|
||||||
float target_error_rate=0.001;
|
float target_error_rate=0.001;
|
||||||
@@ -159,6 +164,20 @@ int main(int argc, char **argv)
|
|||||||
case 'G':
|
case 'G':
|
||||||
channel_model=ETU;
|
channel_model=ETU;
|
||||||
break;
|
break;
|
||||||
|
case 'H':
|
||||||
|
channel_model = TDL_C;
|
||||||
|
DS_TDL = .030; // 30 ns
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'I':
|
||||||
|
channel_model = TDL_C;
|
||||||
|
DS_TDL = .3; // 300ns
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'J':
|
||||||
|
channel_model=TDL_D;
|
||||||
|
DS_TDL = .03;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printf("Unsupported channel model!\n");
|
printf("Unsupported channel model!\n");
|
||||||
@@ -399,9 +418,9 @@ int main(int argc, char **argv)
|
|||||||
printf("FFO = %lf; IFO = %d\n",eps-IFO,IFO);
|
printf("FFO = %lf; IFO = %d\n",eps-IFO,IFO);
|
||||||
}
|
}
|
||||||
|
|
||||||
gNB2UE = new_channel_desc_scm(n_tx, n_rx, channel_model, fs, bw, 0, 0, 0);
|
UE2gNB = new_channel_desc_scm(n_tx, n_rx, channel_model, fs, bw, DS_TDL,0, 0, 0);
|
||||||
|
|
||||||
if (gNB2UE==NULL) {
|
if (UE2gNB==NULL) {
|
||||||
printf("Problem generating channel model. Exiting.\n");
|
printf("Problem generating channel model. Exiting.\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
@@ -460,20 +479,24 @@ int main(int argc, char **argv)
|
|||||||
uint32_t dmrs_scrambling_id = 0, data_scrambling_id=0;
|
uint32_t dmrs_scrambling_id = 0, data_scrambling_id=0;
|
||||||
//t_nrPolar_params *currentPtr;
|
//t_nrPolar_params *currentPtr;
|
||||||
|
|
||||||
|
int shift = 0;
|
||||||
|
|
||||||
if(format==0){
|
if(format==0){
|
||||||
// for now we are not considering SR just HARQ-ACK
|
if (sr_flag)
|
||||||
|
shift = 1<<nr_bit;
|
||||||
if (nr_bit ==0)
|
if (nr_bit ==0)
|
||||||
mcs=table1_mcs[0];
|
mcs=table1_mcs[0];
|
||||||
else if(nr_bit==1)
|
else if(nr_bit==1)
|
||||||
mcs=table1_mcs[actual_payload];
|
mcs=table1_mcs[actual_payload+shift];
|
||||||
else if(nr_bit==2)
|
else if(nr_bit==2)
|
||||||
mcs=table2_mcs[actual_payload];
|
mcs=table2_mcs[actual_payload+shift];
|
||||||
else AssertFatal(1==0,"Either nr_bit %d or sr_flag %d must be non-zero\n", nr_bit, sr_flag);
|
else AssertFatal(1==0,"Either nr_bit %d or sr_flag %d must be non-zero\n", nr_bit, sr_flag);
|
||||||
}
|
}
|
||||||
else if (format == 2 && nr_bit > 11) gNB->uci_polarParams = nr_polar_params(2, nr_bit, nrofPRB, 1, NULL);
|
else if (format == 2 && nr_bit > 11) gNB->uci_polarParams = nr_polar_params(2, nr_bit, nrofPRB, 1, NULL);
|
||||||
|
|
||||||
for(SNR=snr0;SNR<=snr1;SNR=SNR+1){
|
for(SNR=snr0;SNR<=snr1;SNR=SNR+1){
|
||||||
ack_nack_errors=0;
|
ack_nack_errors=0;
|
||||||
|
sr_errors=0;
|
||||||
n_errors = 0;
|
n_errors = 0;
|
||||||
for (trial=0; trial<n_trials; trial++) {
|
for (trial=0; trial<n_trials; trial++) {
|
||||||
bzero(txdataF[aa],frame_parms->ofdm_symbol_size*sizeof(int));
|
bzero(txdataF[aa],frame_parms->ofdm_symbol_size*sizeof(int));
|
||||||
@@ -502,6 +525,15 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
int rxlev = signal_energy(&rxdataF[aa][startingSymbolIndex*frame_parms->ofdm_symbol_size],
|
int rxlev = signal_energy(&rxdataF[aa][startingSymbolIndex*frame_parms->ofdm_symbol_size],
|
||||||
frame_parms->ofdm_symbol_size);
|
frame_parms->ofdm_symbol_size);
|
||||||
|
|
||||||
|
// noise measurement
|
||||||
|
gNB->ulmask_symb = startingSymbolIndex;
|
||||||
|
for (int rb=0; rb<nrofPRB; rb++) {
|
||||||
|
int rb2 = rb+startingPRB;
|
||||||
|
gNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31));
|
||||||
|
}
|
||||||
|
gNB_I0_measurements(gNB);
|
||||||
|
|
||||||
if (n_trials==1) printf("rxlev %d (%d dB), sigma2 %f dB, SNR %f, TX %f\n",rxlev,dB_fixed(rxlev),sigma2_dB,SNR,10*log10((double)txlev*UE->frame_parms.ofdm_symbol_size/12));
|
if (n_trials==1) printf("rxlev %d (%d dB), sigma2 %f dB, SNR %f, TX %f\n",rxlev,dB_fixed(rxlev),sigma2_dB,SNR,10*log10((double)txlev*UE->frame_parms.ofdm_symbol_size/12));
|
||||||
if(format==0){
|
if(format==0){
|
||||||
nfapi_nr_uci_pucch_pdu_format_0_1_t uci_pdu;
|
nfapi_nr_uci_pucch_pdu_format_0_1_t uci_pdu;
|
||||||
@@ -519,15 +551,23 @@ int main(int argc, char **argv)
|
|||||||
pucch_pdu.start_symbol_index = startingSymbolIndex;
|
pucch_pdu.start_symbol_index = startingSymbolIndex;
|
||||||
pucch_pdu.prb_start = startingPRB;
|
pucch_pdu.prb_start = startingPRB;
|
||||||
nr_decode_pucch0(gNB,nr_tti_tx,&uci_pdu,&pucch_pdu);
|
nr_decode_pucch0(gNB,nr_tti_tx,&uci_pdu,&pucch_pdu);
|
||||||
if(nr_bit==1)
|
if(sr_flag==1){
|
||||||
ack_nack_errors+=(actual_payload^uci_pdu.harq->harq_list[0].harq_value);
|
if (uci_pdu.sr->sr_indication == 0 || uci_pdu.sr->sr_confidence_level == 1)
|
||||||
else
|
sr_errors+=1;
|
||||||
ack_nack_errors+=(((actual_payload&1)^uci_pdu.harq->harq_list[0].harq_value)+((actual_payload>>1)^uci_pdu.harq->harq_list[1].harq_value));
|
}
|
||||||
free(uci_pdu.harq->harq_list);
|
if(nr_bit>0){
|
||||||
|
if(nr_bit==1)
|
||||||
|
ack_nack_errors+=(actual_payload^uci_pdu.harq->harq_list[0].harq_value);
|
||||||
|
else
|
||||||
|
ack_nack_errors+=(((actual_payload&1)^uci_pdu.harq->harq_list[0].harq_value)+((actual_payload>>1)^uci_pdu.harq->harq_list[1].harq_value));
|
||||||
|
free(uci_pdu.harq->harq_list);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (format==1) {
|
else if (format==1) {
|
||||||
|
nr_decode_pucch1(rxdataF,PUCCH_GroupHopping,hopping_id,
|
||||||
nr_decode_pucch1(rxdataF,PUCCH_GroupHopping,hopping_id,&(payload_received),frame_parms,amp,nr_tti_tx,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,timeDomainOCC,nr_bit);
|
&(payload_received),frame_parms,amp,nr_tti_tx,
|
||||||
|
m0,nrofSymbols,startingSymbolIndex,startingPRB,
|
||||||
|
startingPRB_intraSlotHopping,timeDomainOCC,nr_bit);
|
||||||
if(nr_bit==1)
|
if(nr_bit==1)
|
||||||
ack_nack_errors+=((actual_payload^payload_received)&1);
|
ack_nack_errors+=((actual_payload^payload_received)&1);
|
||||||
else
|
else
|
||||||
@@ -566,8 +606,11 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
n_errors=((actual_payload^payload_received)&1)+(((actual_payload^payload_received)&2)>>1)+(((actual_payload^payload_received)&4)>>2)+n_errors;
|
n_errors=((actual_payload^payload_received)&1)+(((actual_payload^payload_received)&2)>>1)+(((actual_payload^payload_received)&4)>>2)+n_errors;
|
||||||
}
|
}
|
||||||
printf("SNR=%f, n_trials=%d, n_bit_errors=%d\n",SNR,n_trials,ack_nack_errors);
|
if (sr_flag == 1)
|
||||||
if((float)ack_nack_errors/(float)(n_trials)<=target_error_rate){
|
printf("SR: SNR=%f, n_trials=%d, n_bit_errors=%d\n",SNR,n_trials,sr_errors);
|
||||||
|
if(nr_bit > 0)
|
||||||
|
printf("ACK/NACK: SNR=%f, n_trials=%d, n_bit_errors=%d\n",SNR,n_trials,ack_nack_errors);
|
||||||
|
if((float)(ack_nack_errors+sr_errors)/(float)(n_trials)<=target_error_rate){
|
||||||
printf("PUCCH test OK\n");
|
printf("PUCCH test OK\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,6 +55,9 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
|||||||
|
|
||||||
void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {}
|
void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {}
|
||||||
|
|
||||||
|
uint8_t const nr_rv_round_map[4] = {0, 2, 1, 3};
|
||||||
|
uint8_t const nr_rv_round_map_ue[4] = {0, 2, 1, 3};
|
||||||
|
|
||||||
double cpuf;
|
double cpuf;
|
||||||
uint8_t nfapi_mode = 0;
|
uint8_t nfapi_mode = 0;
|
||||||
uint16_t NB_UE_INST = 1;
|
uint16_t NB_UE_INST = 1;
|
||||||
@@ -96,6 +99,8 @@ int main(int argc, char **argv)
|
|||||||
uint16_t nb_rb = 50;
|
uint16_t nb_rb = 50;
|
||||||
uint8_t Imcs = 9;
|
uint8_t Imcs = 9;
|
||||||
|
|
||||||
|
double DS_TDL = .03;
|
||||||
|
|
||||||
cpuf = get_cpu_freq_GHz();
|
cpuf = get_cpu_freq_GHz();
|
||||||
|
|
||||||
if (load_configmodule(argc, argv, CONFIG_ENABLECMDLINEONLY) == 0) {
|
if (load_configmodule(argc, argv, CONFIG_ENABLECMDLINEONLY) == 0) {
|
||||||
@@ -315,13 +320,12 @@ int main(int argc, char **argv)
|
|||||||
snr1 = snr0 + 10;
|
snr1 = snr0 + 10;
|
||||||
|
|
||||||
gNB2UE = new_channel_desc_scm(n_tx,
|
gNB2UE = new_channel_desc_scm(n_tx,
|
||||||
n_rx,
|
n_rx,
|
||||||
channel_model,
|
channel_model,
|
||||||
61.44e6, //N_RB2sampling_rate(N_RB_DL),
|
61.44e6, //N_RB2sampling_rate(N_RB_DL),
|
||||||
40e6, //N_RB2channel_bandwidth(N_RB_DL),
|
40e6, //N_RB2channel_bandwidth(N_RB_DL),
|
||||||
0,
|
DS_TDL,
|
||||||
0,
|
0,0,0);
|
||||||
0);
|
|
||||||
|
|
||||||
if (gNB2UE == NULL) {
|
if (gNB2UE == NULL) {
|
||||||
printf("Problem generating channel model. Exiting.\n");
|
printf("Problem generating channel model. Exiting.\n");
|
||||||
|
|||||||
+430
-202
@@ -55,7 +55,6 @@
|
|||||||
//#include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c"
|
//#include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c"
|
||||||
#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
|
#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
|
||||||
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
|
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||||
|
|
||||||
#define inMicroS(a) (((double)(a))/(cpu_freq_GHz*1000.0))
|
#define inMicroS(a) (((double)(a))/(cpu_freq_GHz*1000.0))
|
||||||
#include "SIMULATION/LTE_PHY/common_sim.h"
|
#include "SIMULATION/LTE_PHY/common_sim.h"
|
||||||
|
|
||||||
@@ -96,13 +95,20 @@ boolean_t pdcp_data_ind(
|
|||||||
) { return(false);}
|
) { return(false);}
|
||||||
|
|
||||||
void pdcp_run (const protocol_ctxt_t *const ctxt_pP) { return;}
|
void pdcp_run (const protocol_ctxt_t *const ctxt_pP) { return;}
|
||||||
void nr_ip_over_LTE_DRB_preconfiguration(void){}
|
void nr_DRB_preconfiguration(void){}
|
||||||
int rrc_init_nr_global_param(void){return(0);}
|
int rrc_init_nr_global_param(void){return(0);}
|
||||||
|
|
||||||
|
|
||||||
// needed for some functions
|
// needed for some functions
|
||||||
uint16_t n_rnti = 0x1234;
|
uint16_t n_rnti = 0x1234;
|
||||||
openair0_config_t openair0_cfg[MAX_CARDS];
|
openair0_config_t openair0_cfg[MAX_CARDS];
|
||||||
|
//const uint8_t nr_rv_round_map[4] = {0, 2, 1, 3};
|
||||||
|
|
||||||
|
channel_desc_t *UE2gNB[NUMBER_OF_UE_MAX][NUMBER_OF_gNB_MAX];
|
||||||
|
double s_re0[122880],s_im0[122880],r_re0[122880],r_im0[122880];
|
||||||
|
double s_re1[122880],s_im1[122880],r_re1[122880],r_im1[122880];
|
||||||
|
double r_re2[122880],r_im2[122880];
|
||||||
|
double r_re3[122880],r_im3[122880];
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@@ -112,27 +118,35 @@ int main(int argc, char **argv)
|
|||||||
double sigma, sigma_dB;
|
double sigma, sigma_dB;
|
||||||
double snr_step = .2;
|
double snr_step = .2;
|
||||||
uint8_t snr1set = 0;
|
uint8_t snr1set = 0;
|
||||||
int slot = 8, frame = 0;
|
int slot = 8, frame = 1;
|
||||||
FILE *output_fd = NULL;
|
FILE *output_fd = NULL;
|
||||||
|
double *s_re[2]= {s_re0,s_re1};
|
||||||
|
double *s_im[2]= {s_im0,s_im1};
|
||||||
|
double *r_re[4]= {r_re0,r_re1,r_re2,r_re3};
|
||||||
|
double *r_im[4]= {r_im0,r_im1,r_im2,r_im3};
|
||||||
//uint8_t write_output_file = 0;
|
//uint8_t write_output_file = 0;
|
||||||
int trial, n_trials = 1, n_errors = 0, n_false_positive = 0, delay = 0;
|
int trial, n_trials = 1, n_false_positive = 0, delay = 0;
|
||||||
|
double maxDoppler = 0.0;
|
||||||
uint8_t n_tx = 1, n_rx = 1;
|
uint8_t n_tx = 1, n_rx = 1;
|
||||||
//uint8_t transmission_mode = 1;
|
//uint8_t transmission_mode = 1;
|
||||||
//uint16_t Nid_cell = 0;
|
//uint16_t Nid_cell = 0;
|
||||||
channel_desc_t *gNB2UE;
|
channel_desc_t *UE2gNB;
|
||||||
uint8_t extended_prefix_flag = 0;
|
uint8_t extended_prefix_flag = 0;
|
||||||
//int8_t interf1 = -21, interf2 = -21;
|
//int8_t interf1 = -21, interf2 = -21;
|
||||||
FILE *input_fd = NULL;
|
FILE *input_fd = NULL;
|
||||||
SCM_t channel_model = AWGN; //Rayleigh1_anticorr;
|
SCM_t channel_model = AWGN; //Rayleigh1_anticorr;
|
||||||
uint16_t N_RB_DL = 106, N_RB_UL = 106, mu = 1;
|
uint16_t N_RB_DL = 106, N_RB_UL = 106, mu = 1;
|
||||||
|
double tx_gain=1.0;
|
||||||
|
double N0=30;
|
||||||
|
|
||||||
//unsigned char frame_type = 0;
|
//unsigned char frame_type = 0;
|
||||||
NR_DL_FRAME_PARMS *frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms;
|
||||||
int loglvl = OAILOG_WARNING;
|
int loglvl = OAILOG_INFO;
|
||||||
//uint64_t SSB_positions=0x01;
|
//uint64_t SSB_positions=0x01;
|
||||||
uint16_t nb_symb_sch = 12;
|
uint16_t nb_symb_sch = 12;
|
||||||
int start_symbol = 2;
|
int start_symbol = 0;
|
||||||
uint16_t nb_rb = 50;
|
uint16_t nb_rb = 50;
|
||||||
uint8_t Imcs = 9;
|
int Imcs = 9;
|
||||||
uint8_t precod_nbr_layers = 1;
|
uint8_t precod_nbr_layers = 1;
|
||||||
int gNB_id = 0;
|
int gNB_id = 0;
|
||||||
int ap;
|
int ap;
|
||||||
@@ -145,10 +159,26 @@ int main(int argc, char **argv)
|
|||||||
int print_perf = 0;
|
int print_perf = 0;
|
||||||
cpuf = get_cpu_freq_GHz();
|
cpuf = get_cpu_freq_GHz();
|
||||||
int msg3_flag = 0;
|
int msg3_flag = 0;
|
||||||
|
int rv_index = 0;
|
||||||
|
float roundStats[50];
|
||||||
|
float effRate;
|
||||||
|
//float eff_tp_check = 0.7;
|
||||||
|
uint8_t snrRun;
|
||||||
|
|
||||||
|
int enable_ptrs = 0;
|
||||||
|
int modify_dmrs = 0;
|
||||||
|
/* L_PTRS = ptrs_arg[0], K_PTRS = ptrs_arg[1] */
|
||||||
|
int ptrs_arg[2] = {-1,-1};// Invalid values
|
||||||
|
/* DMRS TYPE = dmrs_arg[0], Add Pos = dmrs_arg[1] */
|
||||||
|
int dmrs_arg[2] = {-1,-1};// Invalid values
|
||||||
|
|
||||||
UE_nr_rxtx_proc_t UE_proc;
|
UE_nr_rxtx_proc_t UE_proc;
|
||||||
FILE *scg_fd=NULL;
|
FILE *scg_fd=NULL;
|
||||||
|
int file_offset = 0;
|
||||||
|
|
||||||
|
double DS_TDL = .03;
|
||||||
|
int pusch_tgt_snrx10 = 200;
|
||||||
|
int pucch_tgt_snrx10 = 200;
|
||||||
int ibwps=24;
|
int ibwps=24;
|
||||||
int ibwp_rboffset=41;
|
int ibwp_rboffset=41;
|
||||||
if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0 ) {
|
if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0 ) {
|
||||||
@@ -158,7 +188,7 @@ int main(int argc, char **argv)
|
|||||||
//logInit();
|
//logInit();
|
||||||
randominit(0);
|
randominit(0);
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:i:j:kl:m:n:p:r:s:y:z:F:M:N:PR:S:L:")) != -1) {
|
while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:i:j:kl:m:n:p:r:s:y:z:F:G:H:M:N:PR:S:T:U:L:")) != -1) {
|
||||||
printf("handling optarg %c\n",c);
|
printf("handling optarg %c\n",c);
|
||||||
switch (c) {
|
switch (c) {
|
||||||
|
|
||||||
@@ -227,7 +257,22 @@ int main(int argc, char **argv)
|
|||||||
case 'G':
|
case 'G':
|
||||||
channel_model = ETU;
|
channel_model = ETU;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'H':
|
||||||
|
channel_model = TDL_C;
|
||||||
|
DS_TDL = .030; // 30 ns
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'I':
|
||||||
|
channel_model = TDL_C;
|
||||||
|
DS_TDL = .3; // 300ns
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'J':
|
||||||
|
channel_model=TDL_D;
|
||||||
|
DS_TDL = .03;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printf("Unsupported channel model!\n");
|
printf("Unsupported channel model!\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
@@ -272,7 +317,12 @@ int main(int argc, char **argv)
|
|||||||
snr0 = atof(optarg);
|
snr0 = atof(optarg);
|
||||||
printf("Setting SNR0 to %f\n", snr0);
|
printf("Setting SNR0 to %f\n", snr0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
case 't':
|
||||||
|
eff_tp_check = (float)atoi(optarg)/100;
|
||||||
|
break;
|
||||||
|
*/
|
||||||
/*
|
/*
|
||||||
case 'r':
|
case 'r':
|
||||||
ricean_factor = pow(10,-.1*atof(optarg));
|
ricean_factor = pow(10,-.1*atof(optarg));
|
||||||
@@ -316,7 +366,15 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'G':
|
||||||
|
file_offset = atoi(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'H':
|
||||||
|
slot = atoi(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
case 'M':
|
case 'M':
|
||||||
// SSB_positions = atoi(optarg);
|
// SSB_positions = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
@@ -344,7 +402,21 @@ int main(int argc, char **argv)
|
|||||||
case 'L':
|
case 'L':
|
||||||
loglvl = atoi(optarg);
|
loglvl = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'T':
|
||||||
|
enable_ptrs=1;
|
||||||
|
for(i=0; i < atoi(optarg); i++){
|
||||||
|
ptrs_arg[i] = atoi(argv[optind++]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'U':
|
||||||
|
modify_dmrs = 1;
|
||||||
|
for(i=0; i < atoi(optarg); i++){
|
||||||
|
dmrs_arg[i] = atoi(argv[optind++]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
case 'h':
|
case 'h':
|
||||||
printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n", argv[0]);
|
printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n", argv[0]);
|
||||||
@@ -371,8 +443,11 @@ int main(int argc, char **argv)
|
|||||||
printf("-N Nid_cell\n");
|
printf("-N Nid_cell\n");
|
||||||
printf("-O oversampling factor (1,2,4,8,16)\n");
|
printf("-O oversampling factor (1,2,4,8,16)\n");
|
||||||
printf("-R N_RB_DL\n");
|
printf("-R N_RB_DL\n");
|
||||||
|
printf("-t Acceptable effective throughput (in percentage)\n");
|
||||||
printf("-S Ending SNR, runs from SNR0 to SNR1\n");
|
printf("-S Ending SNR, runs from SNR0 to SNR1\n");
|
||||||
printf("-P Print ULSCH performances\n");
|
printf("-P Print ULSCH performances\n");
|
||||||
|
printf("-T Enable PTRS, arguments list L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n");
|
||||||
|
printf("-U Change DMRS Config, arguments list DMRS TYPE{0=A,1=B} DMRS AddPos{0:3}, e.g. -U 2 0 2 \n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -390,19 +465,34 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
if (snr1set == 0)
|
if (snr1set == 0)
|
||||||
snr1 = snr0 + 10;
|
snr1 = snr0 + 10;
|
||||||
|
double sampling_frequency;
|
||||||
|
double bandwidth;
|
||||||
|
|
||||||
gNB2UE = new_channel_desc_scm(n_tx, n_rx, channel_model,
|
if (N_RB_UL >= 217) sampling_frequency = 122.88;
|
||||||
61.44e6, //N_RB2sampling_rate(N_RB_DL),
|
else if (N_RB_UL >= 106) sampling_frequency = 61.44;
|
||||||
40e6, //N_RB2channel_bandwidth(N_RB_DL),
|
else { printf("Need at least 106 PRBs\b"); exit(-1); }
|
||||||
|
if (N_RB_UL == 273) bandwidth = 100;
|
||||||
|
else if (N_RB_UL == 217) bandwidth = 80;
|
||||||
|
else if (N_RB_UL == 106) bandwidth = 40;
|
||||||
|
else { printf("Add N_RB_UL %d\n",N_RB_UL); exit(-1); }
|
||||||
|
|
||||||
|
if (openair0_cfg[0].threequarter_fs == 1) sampling_frequency*=.75;
|
||||||
|
|
||||||
|
UE2gNB = new_channel_desc_scm(n_tx, n_rx, channel_model,
|
||||||
|
sampling_frequency,
|
||||||
|
bandwidth,
|
||||||
|
DS_TDL,
|
||||||
0, 0, 0);
|
0, 0, 0);
|
||||||
|
|
||||||
if (gNB2UE == NULL) {
|
if (UE2gNB == NULL) {
|
||||||
printf("Problem generating channel model. Exiting.\n");
|
printf("Problem generating channel model. Exiting.\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UE2gNB->max_Doppler = maxDoppler;
|
||||||
|
|
||||||
RC.gNB = (PHY_VARS_gNB **) malloc(sizeof(PHY_VARS_gNB *));
|
RC.gNB = (PHY_VARS_gNB **) malloc(sizeof(PHY_VARS_gNB *));
|
||||||
RC.gNB[0] = malloc(sizeof(PHY_VARS_gNB));
|
RC.gNB[0] = calloc(1,sizeof(PHY_VARS_gNB));
|
||||||
gNB = RC.gNB[0];
|
gNB = RC.gNB[0];
|
||||||
//gNB_config = &gNB->gNB_config;
|
//gNB_config = &gNB->gNB_config;
|
||||||
|
|
||||||
@@ -446,20 +536,19 @@ int main(int argc, char **argv)
|
|||||||
0);
|
0);
|
||||||
fix_scc(scc,ssb_bitmap);
|
fix_scc(scc,ssb_bitmap);
|
||||||
|
|
||||||
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
|
// xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
|
||||||
|
|
||||||
AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
|
AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
|
||||||
|
|
||||||
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
|
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
|
||||||
// common configuration
|
// common configuration
|
||||||
rrc_mac_config_req_gNB(0,0,1,scc,0,0,NULL);
|
rrc_mac_config_req_gNB(0,0,1,pusch_tgt_snrx10,pucch_tgt_snrx10,scc,0,0,NULL);
|
||||||
// UE dedicated configuration
|
// UE dedicated configuration
|
||||||
rrc_mac_config_req_gNB(0,0,1,NULL,1,secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
|
rrc_mac_config_req_gNB(0,0,1,pusch_tgt_snrx10,pucch_tgt_snrx10,NULL,1,secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
|
||||||
phy_init_nr_gNB(gNB,0,0);
|
phy_init_nr_gNB(gNB,0,0);
|
||||||
N_RB_DL = gNB->frame_parms.N_RB_DL;
|
N_RB_DL = gNB->frame_parms.N_RB_DL;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NR_BWP_Uplink_t *ubwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0];
|
NR_BWP_Uplink_t *ubwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0];
|
||||||
|
|
||||||
//crcTableInit();
|
//crcTableInit();
|
||||||
@@ -534,20 +623,16 @@ int main(int argc, char **argv)
|
|||||||
unsigned char *estimated_output_bit;
|
unsigned char *estimated_output_bit;
|
||||||
unsigned char *test_input_bit;
|
unsigned char *test_input_bit;
|
||||||
uint32_t errors_decoding = 0;
|
uint32_t errors_decoding = 0;
|
||||||
uint32_t errors_scrambling = 0;
|
|
||||||
|
|
||||||
test_input_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384);
|
test_input_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384);
|
||||||
estimated_output_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384);
|
estimated_output_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384);
|
||||||
|
|
||||||
nr_scheduled_response_t scheduled_response;
|
nr_scheduled_response_t scheduled_response;
|
||||||
fapi_nr_ul_config_request_t ul_config;
|
fapi_nr_ul_config_request_t ul_config;
|
||||||
|
fapi_nr_tx_request_t tx_req;
|
||||||
|
fapi_nr_tx_request_body_t tx_req_body;
|
||||||
|
|
||||||
unsigned int TBS;
|
|
||||||
uint16_t number_dmrs_symbols = 0;
|
|
||||||
unsigned int available_bits;
|
|
||||||
uint8_t nb_re_dmrs;
|
|
||||||
unsigned char mod_order;
|
|
||||||
uint16_t code_rate;
|
|
||||||
uint8_t ptrs_mcs1 = 2;
|
uint8_t ptrs_mcs1 = 2;
|
||||||
uint8_t ptrs_mcs2 = 4;
|
uint8_t ptrs_mcs2 = 4;
|
||||||
uint8_t ptrs_mcs3 = 10;
|
uint8_t ptrs_mcs3 = 10;
|
||||||
@@ -555,59 +640,160 @@ int main(int argc, char **argv)
|
|||||||
uint16_t n_rb1 = 75;
|
uint16_t n_rb1 = 75;
|
||||||
uint8_t mcs_table = 0;
|
uint8_t mcs_table = 0;
|
||||||
uint16_t pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA; // | PUSCH_PDU_BITMAP_PUSCH_PTRS;
|
uint16_t pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA; // | PUSCH_PDU_BITMAP_PUSCH_PTRS;
|
||||||
|
uint8_t max_rounds = 4;
|
||||||
|
uint8_t crc_status = 0;
|
||||||
|
|
||||||
|
unsigned char mod_order = nr_get_Qm_ul(Imcs, 0);
|
||||||
|
uint16_t code_rate = nr_get_code_rate_ul(Imcs, 0);
|
||||||
|
|
||||||
|
uint8_t mapping_type = typeB; // Default Values
|
||||||
|
pusch_dmrs_type_t dmrs_config_type = pusch_dmrs_type1; // Default Values
|
||||||
|
pusch_dmrs_AdditionalPosition_t add_pos = pusch_dmrs_pos0; // Default Values
|
||||||
|
|
||||||
|
/* validate parameters othwerwise default values are used */
|
||||||
|
/* -U flag can be used to set DMRS parameters*/
|
||||||
|
if(modify_dmrs)
|
||||||
|
{
|
||||||
|
if(dmrs_arg[0] == 0)
|
||||||
|
{
|
||||||
|
mapping_type = typeA;
|
||||||
|
}
|
||||||
|
else if (dmrs_arg[0] == 1)
|
||||||
|
{
|
||||||
|
mapping_type = typeB;
|
||||||
|
}
|
||||||
|
/* Additional DMRS positions */
|
||||||
|
if(dmrs_arg[1] >= 0 && dmrs_arg[1] <=3 )
|
||||||
|
{
|
||||||
|
add_pos = dmrs_arg[1];
|
||||||
|
}
|
||||||
|
printf("NOTE: DMRS config is modified with Mapping Type %d , Additional Position %d \n", mapping_type, add_pos );
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t length_dmrs = pusch_len1;
|
||||||
|
uint16_t l_prime_mask = get_l_prime(nb_symb_sch, mapping_type, add_pos, length_dmrs);
|
||||||
|
uint16_t number_dmrs_symbols = get_dmrs_symbols_in_slot(l_prime_mask, nb_symb_sch);
|
||||||
|
uint8_t nb_re_dmrs = (dmrs_config_type == pusch_dmrs_type1) ? 6 : 4;
|
||||||
|
unsigned int available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, number_dmrs_symbols, mod_order, 1);
|
||||||
|
unsigned int TBS = nr_compute_tbs(mod_order, code_rate, nb_rb, nb_symb_sch, nb_re_dmrs * number_dmrs_symbols, 0, 0, precod_nbr_layers);
|
||||||
|
|
||||||
|
uint8_t ulsch_input_buffer[TBS/8];
|
||||||
|
|
||||||
|
ulsch_input_buffer[0] = 0x31;
|
||||||
|
for (i = 1; i < TBS/8; i++) {
|
||||||
|
ulsch_input_buffer[i] = (unsigned char) rand();
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t length_dmrs = pusch_len1; // [hna] remove dmrs struct
|
|
||||||
uint16_t l_prime_mask = get_l_prime(nb_symb_sch, typeB, pusch_dmrs_pos0, length_dmrs); // [hna] remove dmrs struct
|
|
||||||
uint8_t ptrs_time_density = get_L_ptrs(ptrs_mcs1, ptrs_mcs2, ptrs_mcs3, Imcs, mcs_table);
|
uint8_t ptrs_time_density = get_L_ptrs(ptrs_mcs1, ptrs_mcs2, ptrs_mcs3, Imcs, mcs_table);
|
||||||
uint8_t ptrs_freq_density = get_K_ptrs(n_rb0, n_rb1, nb_rb);
|
uint8_t ptrs_freq_density = get_K_ptrs(n_rb0, n_rb1, nb_rb);
|
||||||
|
int ptrs_symbols = 0; // to calculate total PTRS RE's in a slot
|
||||||
|
|
||||||
|
double ts = 1.0/(frame_parms->subcarrier_spacing * frame_parms->ofdm_symbol_size);
|
||||||
|
|
||||||
|
/* -T option enable PTRS */
|
||||||
|
if(enable_ptrs)
|
||||||
|
{
|
||||||
|
/* validate parameters othwerwise default values are used */
|
||||||
|
if(ptrs_arg[0] == 0 || ptrs_arg[0] == 1 || ptrs_arg[0] == 2 )
|
||||||
|
{
|
||||||
|
ptrs_time_density = ptrs_arg[0];
|
||||||
|
}
|
||||||
|
if(ptrs_arg[1] == 2 || ptrs_arg[1] == 4 )
|
||||||
|
{
|
||||||
|
ptrs_freq_density = ptrs_arg[1];
|
||||||
|
}
|
||||||
|
pdu_bit_map |= PUSCH_PDU_BITMAP_PUSCH_PTRS;
|
||||||
|
printf("NOTE: PTRS Enabled with L %d, K %d \n", ptrs_time_density, ptrs_freq_density );
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input_fd != NULL) max_rounds=1;
|
||||||
|
|
||||||
if(1<<ptrs_time_density >= nb_symb_sch)
|
if(1<<ptrs_time_density >= nb_symb_sch)
|
||||||
pdu_bit_map &= ~PUSCH_PDU_BITMAP_PUSCH_PTRS; // disable PUSCH PTRS
|
pdu_bit_map &= ~PUSCH_PDU_BITMAP_PUSCH_PTRS; // disable PUSCH PTRS
|
||||||
|
|
||||||
for (i = 0; i < nb_symb_sch; i++) {
|
|
||||||
number_dmrs_symbols += (l_prime_mask >> i) & 0x01;
|
|
||||||
}
|
|
||||||
|
|
||||||
mod_order = nr_get_Qm_ul(Imcs, 0);
|
|
||||||
code_rate = nr_get_code_rate_ul(Imcs, 0);
|
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
for (int i=0;i<16;i++) printf("%f\n",gaussdouble(0.0,1.0));
|
//for (int i=0;i<16;i++) printf("%f\n",gaussdouble(0.0,1.0));
|
||||||
for (SNR = snr0; SNR < snr1; SNR += snr_step) {
|
snrRun = 0;
|
||||||
|
int n_errs = 0;
|
||||||
|
|
||||||
varArray_t *table_rx=initVarArray(1000,sizeof(double));
|
int slot_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
|
||||||
|
int slot_length = slot_offset - frame_parms->get_samples_slot_timestamp(slot-1,frame_parms,0);
|
||||||
|
|
||||||
|
if (input_fd != NULL) {
|
||||||
|
AssertFatal(frame_parms->nb_antennas_rx == 1, "nb_ant != 1\n");
|
||||||
|
// 800 samples is N_TA_OFFSET for FR1 @ 30.72 Ms/s,
|
||||||
|
AssertFatal(frame_parms->subcarrier_spacing==30000,"only 30 kHz for file input for now (%d)\n",frame_parms->subcarrier_spacing);
|
||||||
|
|
||||||
|
fseek(input_fd,file_offset*((slot_length<<2)+4000+16),SEEK_SET);
|
||||||
|
fread((void*)&n_rnti,sizeof(int16_t),1,input_fd);
|
||||||
|
printf("rnti %x\n",n_rnti);
|
||||||
|
fread((void*)&nb_rb,sizeof(int16_t),1,input_fd);
|
||||||
|
printf("nb_rb %d\n",nb_rb);
|
||||||
|
int16_t dummy;
|
||||||
|
fread((void*)&start_rb,sizeof(int16_t),1,input_fd);
|
||||||
|
//fread((void*)&dummy,sizeof(int16_t),1,input_fd);
|
||||||
|
printf("rb_start %d\n",start_rb);
|
||||||
|
fread((void*)&nb_symb_sch,sizeof(int16_t),1,input_fd);
|
||||||
|
//fread((void*)&dummy,sizeof(int16_t),1,input_fd);
|
||||||
|
printf("nb_symb_sch %d\n",nb_symb_sch);
|
||||||
|
fread((void*)&start_symbol,sizeof(int16_t),1,input_fd);
|
||||||
|
printf("start_symbol %d\n",start_symbol);
|
||||||
|
fread((void*)&Imcs,sizeof(int16_t),1,input_fd);
|
||||||
|
printf("mcs %d\n",Imcs);
|
||||||
|
fread((void*)&rv_index,sizeof(int16_t),1,input_fd);
|
||||||
|
printf("rv_index %d\n",rv_index);
|
||||||
|
// fread((void*)&harq_pid,sizeof(int16_t),1,input_fd);
|
||||||
|
fread((void*)&dummy,sizeof(int16_t),1,input_fd);
|
||||||
|
printf("harq_pid %d\n",harq_pid);
|
||||||
|
fread((void*)&gNB->common_vars.rxdata[0][slot_offset-delay],
|
||||||
|
sizeof(int16_t),
|
||||||
|
slot_length<<1,
|
||||||
|
input_fd);
|
||||||
|
for (int i=0;i<16;i+=2) printf("slot_offset %d : %d,%d\n",
|
||||||
|
slot_offset,
|
||||||
|
((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[i],
|
||||||
|
((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[1+i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (SNR = snr0; SNR < snr1; SNR += snr_step) {
|
||||||
|
varArray_t *table_rx=initVarArray(1000,sizeof(double));
|
||||||
|
int error_flag = 0;
|
||||||
|
n_false_positive = 0;
|
||||||
|
effRate = 0;
|
||||||
|
int n_errors[4] = {0,0,0,0};;
|
||||||
|
int round_trials[4]={0,0,0,0};
|
||||||
|
uint32_t errors_scrambling[4] = {0,0,0,0};
|
||||||
|
|
||||||
|
clear_pusch_stats(gNB);
|
||||||
|
for (trial = 0; trial < n_trials; trial++) {
|
||||||
|
uint8_t round = 0;
|
||||||
|
|
||||||
|
crc_status = 1;
|
||||||
|
errors_decoding = 0;
|
||||||
|
memset((void*)roundStats,0,50*sizeof(roundStats[0]));
|
||||||
|
while (round<max_rounds && crc_status) {
|
||||||
|
round_trials[round]++;
|
||||||
|
ulsch_ue[0]->harq_processes[harq_pid]->round = round;
|
||||||
|
gNB->ulsch[0][0]->harq_processes[harq_pid]->round = round;
|
||||||
|
rv_index = nr_rv_round_map[round];
|
||||||
reset_meas(&gNB->phy_proc_rx);
|
reset_meas(&gNB->phy_proc_rx);
|
||||||
|
reset_meas(&gNB->rx_pusch_stats);
|
||||||
reset_meas(&gNB->ulsch_decoding_stats);
|
reset_meas(&gNB->ulsch_decoding_stats);
|
||||||
reset_meas(&gNB->ulsch_deinterleaving_stats);
|
reset_meas(&gNB->ulsch_deinterleaving_stats);
|
||||||
reset_meas(&gNB->ulsch_rate_unmatching_stats);
|
reset_meas(&gNB->ulsch_rate_unmatching_stats);
|
||||||
reset_meas(&gNB->ulsch_ldpc_decoding_stats);
|
reset_meas(&gNB->ulsch_ldpc_decoding_stats);
|
||||||
reset_meas(&gNB->ulsch_unscrambling_stats);
|
reset_meas(&gNB->ulsch_unscrambling_stats);
|
||||||
reset_meas(&gNB->ulsch_channel_estimation_stats);
|
reset_meas(&gNB->ulsch_channel_estimation_stats);
|
||||||
|
reset_meas(&gNB->ulsch_ptrs_processing_stats);
|
||||||
reset_meas(&gNB->ulsch_llr_stats);
|
reset_meas(&gNB->ulsch_llr_stats);
|
||||||
|
reset_meas(&gNB->ulsch_mrc_stats);
|
||||||
reset_meas(&gNB->ulsch_channel_compensation_stats);
|
reset_meas(&gNB->ulsch_channel_compensation_stats);
|
||||||
reset_meas(&gNB->ulsch_rbs_extraction_stats);
|
reset_meas(&gNB->ulsch_rbs_extraction_stats);
|
||||||
|
|
||||||
UE_proc.nr_tti_tx = slot;
|
UE_proc.nr_tti_tx = slot;
|
||||||
UE_proc.frame_tx = frame;
|
UE_proc.frame_tx = frame;
|
||||||
|
|
||||||
// --------- setting parameters for gNB --------
|
|
||||||
/*
|
|
||||||
rel15_ul->rnti = n_rnti;
|
|
||||||
rel15_ul->ulsch_pdu_rel15.start_rb = start_rb;
|
|
||||||
rel15_ul->ulsch_pdu_rel15.number_rbs = nb_rb;
|
|
||||||
rel15_ul->ulsch_pdu_rel15.start_symbol = start_symbol;
|
|
||||||
rel15_ul->ulsch_pdu_rel15.number_symbols = nb_symb_sch;
|
|
||||||
rel15_ul->ulsch_pdu_rel15.length_dmrs = length_dmrs;
|
|
||||||
rel15_ul->ulsch_pdu_rel15.Qm = mod_order;
|
|
||||||
rel15_ul->ulsch_pdu_rel15.mcs = Imcs;
|
|
||||||
rel15_ul->ulsch_pdu_rel15.rv = 0;
|
|
||||||
rel15_ul->ulsch_pdu_rel15.ndi = 0;
|
|
||||||
rel15_ul->ulsch_pdu_rel15.n_layers = precod_nbr_layers;
|
|
||||||
rel15_ul->ulsch_pdu_rel15.R = code_rate;
|
|
||||||
///////////////////////////////////////////////////
|
|
||||||
*/
|
|
||||||
|
|
||||||
UL_tti_req->SFN = frame;
|
UL_tti_req->SFN = frame;
|
||||||
UL_tti_req->Slot = slot;
|
UL_tti_req->Slot = slot;
|
||||||
UL_tti_req->n_pdus = 1;
|
UL_tti_req->n_pdus = 1;
|
||||||
@@ -625,7 +811,7 @@ int main(int argc, char **argv)
|
|||||||
else
|
else
|
||||||
pusch_pdu->bwp_start = ibwp_start;
|
pusch_pdu->bwp_start = ibwp_start;
|
||||||
pusch_pdu->bwp_size = ibwp_size;
|
pusch_pdu->bwp_size = ibwp_size;
|
||||||
start_rb += (ibwp_start - abwp_start);
|
start_rb = (ibwp_start - abwp_start);
|
||||||
printf("msg3: ibwp_size %d, abwp_size %d, ibwp_start %d, abwp_start %d\n",
|
printf("msg3: ibwp_size %d, abwp_size %d, ibwp_start %d, abwp_start %d\n",
|
||||||
ibwp_size,abwp_size,ibwp_start,abwp_start);
|
ibwp_size,abwp_size,ibwp_start,abwp_start);
|
||||||
}
|
}
|
||||||
@@ -634,6 +820,7 @@ int main(int argc, char **argv)
|
|||||||
pusch_pdu->bwp_size = abwp_size;
|
pusch_pdu->bwp_size = abwp_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pusch_pdu->pusch_data.tb_size = TBS/8;
|
||||||
pusch_pdu->pdu_bit_map = pdu_bit_map;
|
pusch_pdu->pdu_bit_map = pdu_bit_map;
|
||||||
pusch_pdu->rnti = n_rnti;
|
pusch_pdu->rnti = n_rnti;
|
||||||
pusch_pdu->mcs_index = Imcs;
|
pusch_pdu->mcs_index = Imcs;
|
||||||
@@ -644,11 +831,11 @@ int main(int argc, char **argv)
|
|||||||
pusch_pdu->data_scrambling_id = *scc->physCellId;
|
pusch_pdu->data_scrambling_id = *scc->physCellId;
|
||||||
pusch_pdu->nrOfLayers = 1;
|
pusch_pdu->nrOfLayers = 1;
|
||||||
pusch_pdu->ul_dmrs_symb_pos = l_prime_mask << start_symbol;
|
pusch_pdu->ul_dmrs_symb_pos = l_prime_mask << start_symbol;
|
||||||
pusch_pdu->dmrs_config_type = 0;
|
pusch_pdu->dmrs_config_type = dmrs_config_type;
|
||||||
pusch_pdu->ul_dmrs_scrambling_id = *scc->physCellId;
|
pusch_pdu->ul_dmrs_scrambling_id = *scc->physCellId;
|
||||||
pusch_pdu->scid = 0;
|
pusch_pdu->scid = 0;
|
||||||
pusch_pdu->dmrs_ports = 1;
|
pusch_pdu->dmrs_ports = 1;
|
||||||
pusch_pdu->num_dmrs_cdm_grps_no_data = 1;
|
pusch_pdu->num_dmrs_cdm_grps_no_data = msg3_flag == 0 ? 1 : 2;
|
||||||
pusch_pdu->resource_alloc = 1;
|
pusch_pdu->resource_alloc = 1;
|
||||||
pusch_pdu->rb_start = start_rb;
|
pusch_pdu->rb_start = start_rb;
|
||||||
pusch_pdu->rb_size = nb_rb;
|
pusch_pdu->rb_size = nb_rb;
|
||||||
@@ -657,9 +844,9 @@ int main(int argc, char **argv)
|
|||||||
pusch_pdu->uplink_frequency_shift_7p5khz = 0;
|
pusch_pdu->uplink_frequency_shift_7p5khz = 0;
|
||||||
pusch_pdu->start_symbol_index = start_symbol;
|
pusch_pdu->start_symbol_index = start_symbol;
|
||||||
pusch_pdu->nr_of_symbols = nb_symb_sch;
|
pusch_pdu->nr_of_symbols = nb_symb_sch;
|
||||||
pusch_pdu->pusch_data.rv_index = 0;
|
pusch_pdu->pusch_data.rv_index = rv_index;
|
||||||
pusch_pdu->pusch_data.harq_process_id = 0;
|
pusch_pdu->pusch_data.harq_process_id = 0;
|
||||||
pusch_pdu->pusch_data.new_data_indicator = 0;
|
pusch_pdu->pusch_data.new_data_indicator = trial & 0x1;
|
||||||
pusch_pdu->pusch_data.num_cb = 0;
|
pusch_pdu->pusch_data.num_cb = 0;
|
||||||
pusch_pdu->pusch_ptrs.ptrs_time_density = ptrs_time_density;
|
pusch_pdu->pusch_ptrs.ptrs_time_density = ptrs_time_density;
|
||||||
pusch_pdu->pusch_ptrs.ptrs_freq_density = ptrs_freq_density;
|
pusch_pdu->pusch_ptrs.ptrs_freq_density = ptrs_freq_density;
|
||||||
@@ -677,8 +864,17 @@ int main(int argc, char **argv)
|
|||||||
scheduled_response.slot = slot;
|
scheduled_response.slot = slot;
|
||||||
scheduled_response.dl_config = NULL;
|
scheduled_response.dl_config = NULL;
|
||||||
scheduled_response.ul_config = &ul_config;
|
scheduled_response.ul_config = &ul_config;
|
||||||
scheduled_response.tx_request = (fapi_nr_tx_request_t *) malloc(sizeof(fapi_nr_tx_request_t));
|
scheduled_response.tx_request = &tx_req;
|
||||||
scheduled_response.tx_request->tx_request_body = (fapi_nr_tx_request_body_t *) malloc(sizeof(fapi_nr_tx_request_body_t));
|
scheduled_response.tx_request->tx_request_body = &tx_req_body;
|
||||||
|
|
||||||
|
// Config UL TX PDU
|
||||||
|
tx_req.slot = slot;
|
||||||
|
tx_req.sfn = frame;
|
||||||
|
// tx_req->tx_config // TbD
|
||||||
|
tx_req.number_of_pdus = 1;
|
||||||
|
tx_req_body.pdu_length = TBS/8;
|
||||||
|
tx_req_body.pdu_index = 0;
|
||||||
|
tx_req_body.pdu = &ulsch_input_buffer[0];
|
||||||
|
|
||||||
ul_config.slot = slot;
|
ul_config.slot = slot;
|
||||||
ul_config.number_pdus = 1;
|
ul_config.number_pdus = 1;
|
||||||
@@ -690,38 +886,30 @@ int main(int argc, char **argv)
|
|||||||
ul_config.ul_config_list[0].pusch_config_pdu.nr_of_symbols = nb_symb_sch;
|
ul_config.ul_config_list[0].pusch_config_pdu.nr_of_symbols = nb_symb_sch;
|
||||||
ul_config.ul_config_list[0].pusch_config_pdu.start_symbol_index = start_symbol;
|
ul_config.ul_config_list[0].pusch_config_pdu.start_symbol_index = start_symbol;
|
||||||
ul_config.ul_config_list[0].pusch_config_pdu.ul_dmrs_symb_pos = l_prime_mask << start_symbol;
|
ul_config.ul_config_list[0].pusch_config_pdu.ul_dmrs_symb_pos = l_prime_mask << start_symbol;
|
||||||
ul_config.ul_config_list[0].pusch_config_pdu.dmrs_config_type = 0;
|
ul_config.ul_config_list[0].pusch_config_pdu.dmrs_config_type = dmrs_config_type;
|
||||||
ul_config.ul_config_list[0].pusch_config_pdu.mcs_index = Imcs;
|
ul_config.ul_config_list[0].pusch_config_pdu.mcs_index = Imcs;
|
||||||
ul_config.ul_config_list[0].pusch_config_pdu.mcs_table = mcs_table;
|
ul_config.ul_config_list[0].pusch_config_pdu.mcs_table = mcs_table;
|
||||||
ul_config.ul_config_list[0].pusch_config_pdu.num_dmrs_cdm_grps_no_data = 1;
|
ul_config.ul_config_list[0].pusch_config_pdu.num_dmrs_cdm_grps_no_data = msg3_flag == 0 ? 1 : 2;
|
||||||
ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.new_data_indicator = 0;
|
|
||||||
ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.rv_index = 0;
|
|
||||||
ul_config.ul_config_list[0].pusch_config_pdu.nrOfLayers = precod_nbr_layers;
|
ul_config.ul_config_list[0].pusch_config_pdu.nrOfLayers = precod_nbr_layers;
|
||||||
|
ul_config.ul_config_list[0].pusch_config_pdu.absolute_delta_PUSCH = 0;
|
||||||
|
|
||||||
|
ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.tb_size = TBS;
|
||||||
|
ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.new_data_indicator = trial & 0x1;
|
||||||
|
ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.rv_index = rv_index;
|
||||||
ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.harq_process_id = harq_pid;
|
ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.harq_process_id = harq_pid;
|
||||||
|
|
||||||
ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_time_density = ptrs_time_density;
|
ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_time_density = ptrs_time_density;
|
||||||
ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_freq_density = ptrs_freq_density;
|
ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_freq_density = ptrs_freq_density;
|
||||||
ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_ports_list = (nfapi_nr_ue_ptrs_ports_t *) malloc(2*sizeof(nfapi_nr_ue_ptrs_ports_t));
|
ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_ports_list = (nfapi_nr_ue_ptrs_ports_t *) malloc(2*sizeof(nfapi_nr_ue_ptrs_ports_t));
|
||||||
ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset = 0;
|
ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset = 0;
|
||||||
//there are plenty of other parameters that we don't seem to be using for now. e.g.
|
|
||||||
ul_config.ul_config_list[0].pusch_config_pdu.absolute_delta_PUSCH = 0;
|
|
||||||
|
|
||||||
nb_re_dmrs = ((ul_config.ul_config_list[0].pusch_config_pdu.dmrs_config_type == pusch_dmrs_type1) ? 6 : 4);
|
|
||||||
|
|
||||||
available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, number_dmrs_symbols, mod_order, 1);
|
|
||||||
TBS = nr_compute_tbs(mod_order, code_rate, nb_rb, nb_symb_sch, nb_re_dmrs * number_dmrs_symbols, 0, 0, precod_nbr_layers);
|
|
||||||
pusch_pdu->pusch_data.tb_size = TBS>>3;
|
|
||||||
ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.tb_size = TBS;
|
|
||||||
|
|
||||||
nr_fill_ulsch(gNB,frame,slot,pusch_pdu);
|
nr_fill_ulsch(gNB,frame,slot,pusch_pdu);
|
||||||
int slot_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);// - (int)(800*factor);
|
|
||||||
int slot_length = slot_offset - frame_parms->get_samples_slot_timestamp(slot-1,frame_parms,0);
|
|
||||||
|
|
||||||
for (int i=0;i<(TBS>>3);i++) ulsch_ue[0]->harq_processes[harq_pid]->a[i]=i&0xff;
|
for (int i=0;i<(TBS>>3);i++) ulsch_ue[0]->harq_processes[harq_pid]->a[i]=i&0xff;
|
||||||
double scale = 1;
|
double scale = 1;
|
||||||
|
|
||||||
if (input_fd == NULL) {
|
if (input_fd == NULL) {
|
||||||
|
|
||||||
if (SNR==snr0) {
|
|
||||||
// set FAPI parameters for UE, put them in the scheduled response and call
|
// set FAPI parameters for UE, put them in the scheduled response and call
|
||||||
nr_ue_scheduled_response(&scheduled_response);
|
nr_ue_scheduled_response(&scheduled_response);
|
||||||
|
|
||||||
@@ -746,57 +934,46 @@ int main(int argc, char **argv)
|
|||||||
txlev_float = (double)txlev/scale; // output of signal_energy is fixed point representation
|
txlev_float = (double)txlev/scale; // output of signal_energy is fixed point representation
|
||||||
|
|
||||||
|
|
||||||
//AWGN
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else n_trials = 1;
|
else n_trials = 1;
|
||||||
|
|
||||||
|
if (input_fd == NULL ) {
|
||||||
|
|
||||||
sigma_dB = 10*log10(txlev_float)-SNR;
|
sigma_dB = N0;
|
||||||
sigma = pow(10,sigma_dB/10);
|
sigma = pow(10,sigma_dB/10);
|
||||||
printf("txlev_float %f, sigma_dB %f\n",10*log10(txlev_float),sigma_dB);
|
|
||||||
|
|
||||||
n_errors = 0;
|
tx_gain = sqrt(pow(10.0,.1*(N0+SNR))/txlev_float);
|
||||||
n_false_positive = 0;
|
if(n_trials==1) printf("txlev_float %f, sigma_dB %f, tx_gain %f tx_offset %d, slot_offset %d\n",10*log10(txlev_float),sigma_dB,tx_gain,tx_offset,slot_offset);
|
||||||
|
|
||||||
errors_scrambling = 0;
|
for (i=0; i<slot_length; i++) {
|
||||||
errors_decoding = 0;
|
for (int aa=0; aa<1; aa++) {
|
||||||
|
s_re[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)]);
|
||||||
int error_flag;
|
s_im[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)+1]);
|
||||||
for (trial = 0; trial < n_trials; trial++) {
|
|
||||||
|
|
||||||
error_flag = 0;
|
|
||||||
//----------------------------------------------------------
|
|
||||||
//------------------------ add noise -----------------------
|
|
||||||
//----------------------------------------------------------
|
|
||||||
if (input_fd == NULL ) {
|
|
||||||
for (i=0; i<slot_length; i++) {
|
|
||||||
for (ap=0; ap<frame_parms->nb_antennas_rx; ap++) {
|
|
||||||
((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i) + (delay*2)] = (int16_t)((double)(((int16_t *)&UE->common_vars.txdata[ap][slot_offset])[(i<<1)])/sqrt(scale) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point
|
|
||||||
((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1 + (delay*2)] = (int16_t)((double)(((int16_t *)&UE->common_vars.txdata[ap][slot_offset])[(i<<1)+1])/sqrt(scale) + (sqrt(sigma/2)*gaussdouble(0.0,1.0)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
AssertFatal(frame_parms->nb_antennas_rx == 1, "nb_ant != 1\n");
|
|
||||||
// 800 samples is N_TA_OFFSET for FR1 @ 30.72 Ms/s,
|
|
||||||
AssertFatal(frame_parms->subcarrier_spacing==30000,"only 30 kHz for file input for now (%d)\n",frame_parms->subcarrier_spacing);
|
|
||||||
double factor = 1;
|
|
||||||
if (openair0_cfg[0].threequarter_fs== 1) factor =.75;
|
|
||||||
int ta_offset=1600;
|
|
||||||
if (N_RB_DL <217) ta_offset=800;
|
|
||||||
else if (N_RB_DL < 106) ta_offset = 400;
|
|
||||||
|
|
||||||
fread((void*)&gNB->common_vars.rxdata[0][slot_offset],
|
if (UE2gNB->max_Doppler == 0) {
|
||||||
sizeof(int16_t),
|
multipath_channel(UE2gNB,s_re,s_im,r_re,r_im,
|
||||||
slot_length<<1,
|
slot_length,0,(n_trials==1)?1:0);
|
||||||
input_fd);
|
} else {
|
||||||
for (int i=0;i<16;i+=2) printf("slot_offset %d : %d,%d\n",
|
multipath_tv_channel(UE2gNB,s_re,s_im,r_re,r_im,
|
||||||
slot_offset,
|
2*slot_length,0);
|
||||||
((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[i],
|
|
||||||
((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[1+i]);
|
|
||||||
fclose(input_fd);
|
|
||||||
}
|
}
|
||||||
|
for (i=0; i<slot_length; i++) {
|
||||||
|
for (ap=0; ap<frame_parms->nb_antennas_rx; ap++) {
|
||||||
|
((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i) + (delay*2)] = (int16_t)((tx_gain*r_re[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point
|
||||||
|
((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1 + (delay*2)] = (int16_t)((tx_gain*r_im[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0)));
|
||||||
|
/* Add phase noise if enabled */
|
||||||
|
if (pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
|
||||||
|
phase_noise(ts, &((int16_t*)&gNB->common_vars.rxdata[ap][slot_offset])[(2*i)],
|
||||||
|
&((int16_t*)&gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
//----------------------------------------------------------
|
//----------------------------------------------------------
|
||||||
@@ -808,111 +985,162 @@ int main(int argc, char **argv)
|
|||||||
start_meas(&gNB->phy_proc_rx);
|
start_meas(&gNB->phy_proc_rx);
|
||||||
phy_procedures_gNB_common_RX(gNB, frame, slot);
|
phy_procedures_gNB_common_RX(gNB, frame, slot);
|
||||||
|
|
||||||
if (n_trials==1) {
|
phy_procedures_gNB_uespec_RX(gNB, frame, slot);
|
||||||
LOG_M("rxsig0.m","rx0",&gNB->common_vars.rxdata[0][0],frame_parms->samples_per_subframe*10,1,1);
|
|
||||||
|
if (n_trials==1 && round==0) {
|
||||||
|
LOG_M("rxsig0.m","rx0",&gNB->common_vars.rxdata[0][slot_offset],slot_length,1,1);
|
||||||
|
|
||||||
LOG_M("rxsigF0.m","rxsF0",gNB->common_vars.rxdataF[0]+start_symbol*frame_parms->ofdm_symbol_size,nb_symb_sch*frame_parms->ofdm_symbol_size,1,1);
|
LOG_M("rxsigF0.m","rxsF0",gNB->common_vars.rxdataF[0]+start_symbol*frame_parms->ofdm_symbol_size,nb_symb_sch*frame_parms->ofdm_symbol_size,1,1);
|
||||||
|
|
||||||
}
|
}
|
||||||
phy_procedures_gNB_uespec_RX(gNB, frame, slot);
|
|
||||||
if (n_trials == 1) {
|
|
||||||
|
if (n_trials == 1 && round==0) {
|
||||||
|
#ifdef __AVX2__
|
||||||
|
int off = ((nb_rb&1) == 1)? 4:0;
|
||||||
|
#else
|
||||||
|
int off = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
LOG_M("rxsigF0_ext.m","rxsF0_ext",
|
LOG_M("rxsigF0_ext.m","rxsF0_ext",
|
||||||
&gNB->pusch_vars[0]->rxdataF_ext[0][(start_symbol+1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size,1,1);
|
&gNB->pusch_vars[0]->rxdataF_ext[0][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
|
||||||
LOG_M("chestF0.m","chF0",
|
LOG_M("chestF0.m","chF0",
|
||||||
&gNB->pusch_vars[0]->ul_ch_estimates[0][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
|
&gNB->pusch_vars[0]->ul_ch_estimates[0][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
|
||||||
LOG_M("chestF0_ext.m","chF0_ext",
|
LOG_M("chestF0_ext.m","chF0_ext",
|
||||||
&gNB->pusch_vars[0]->ul_ch_estimates_ext[0][(start_symbol+1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size,1,1);
|
&gNB->pusch_vars[0]->ul_ch_estimates_ext[0][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
|
||||||
|
(nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
|
||||||
LOG_M("rxsigF0_comp.m","rxsF0_comp",
|
LOG_M("rxsigF0_comp.m","rxsF0_comp",
|
||||||
&gNB->pusch_vars[0]->rxdataF_comp[0][(start_symbol+1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size,1,1);
|
&gNB->pusch_vars[0]->rxdataF_comp[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
|
||||||
|
LOG_M("rxsigF0_llr.m","rxsF0_llr",
|
||||||
|
&gNB->pusch_vars[0]->llr[0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0);
|
||||||
}
|
}
|
||||||
start_meas(&gNB->phy_proc_rx);
|
start_meas(&gNB->phy_proc_rx);
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
if (gNB->ulsch[0][0]->last_iteration_cnt >=
|
if (gNB->ulsch[0][0]->last_iteration_cnt >=
|
||||||
gNB->ulsch[0][0]->max_ldpc_iterations+1) {
|
gNB->ulsch[0][0]->max_ldpc_iterations+1) {
|
||||||
error_flag = 1;
|
error_flag = 1;
|
||||||
n_errors++;
|
n_errors[round]++;
|
||||||
|
crc_status = 1;
|
||||||
|
} else {
|
||||||
|
crc_status = 0;
|
||||||
}
|
}
|
||||||
|
if(n_trials==1) printf("end of round %d rv_index %d\n",round, rv_index);
|
||||||
|
|
||||||
//----------------------------------------------------------
|
//----------------------------------------------------------
|
||||||
//----------------- count and print errors -----------------
|
//----------------- count and print errors -----------------
|
||||||
//----------------------------------------------------------
|
//----------------------------------------------------------
|
||||||
|
|
||||||
for (i = 0; i < available_bits; i++) {
|
if ((pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) && (SNR==snr0) && (trial==0) && (round==0)) {
|
||||||
|
ptrs_symbols = 0;
|
||||||
if(((ulsch_ue[0]->g[i] == 0) && (gNB->pusch_vars[UE_id]->llr[i] <= 0)) ||
|
for (int i = pusch_pdu->start_symbol_index; i < pusch_pdu->start_symbol_index + pusch_pdu->nr_of_symbols; i++){
|
||||||
((ulsch_ue[0]->g[i] == 1) && (gNB->pusch_vars[UE_id]->llr[i] >= 0)))
|
ptrs_symbols += ((gNB->pusch_vars[UE_id]->ptrs_symbols) >> i) & 1;
|
||||||
{
|
}
|
||||||
/*if(errors_scrambling == 0)
|
/* 2*5*(50/2), for RB = 50,K = 2 for 5 OFDM PTRS symbols */
|
||||||
printf("\x1B[34m" "[frame %d][trial %d]\t1st bit in error in unscrambling = %d\n" "\x1B[0m", frame, trial, i);*/
|
available_bits -= 2 * ptrs_symbols * ((nb_rb + ptrs_freq_density - 1) /ptrs_freq_density);
|
||||||
errors_scrambling++;
|
printf("After PTRS subtraction available_bits are : %u \n", available_bits);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (errors_scrambling > 0) {
|
for (i = 0; i < available_bits; i++) {
|
||||||
if (n_trials==1)
|
|
||||||
printf("\x1B[31m""[frame %d][trial %d]\tnumber of errors in unscrambling = %u\n" "\x1B[0m", frame, trial, errors_scrambling);
|
if(((ulsch_ue[0]->g[i] == 0) && (gNB->pusch_vars[UE_id]->llr[i] <= 0)) ||
|
||||||
}
|
((ulsch_ue[0]->g[i] == 1) && (gNB->pusch_vars[UE_id]->llr[i] >= 0)))
|
||||||
|
{
|
||||||
for (i = 0; i < TBS; i++) {
|
/*if(errors_scrambling == 0)
|
||||||
|
printf("\x1B[34m" "[frame %d][trial %d]\t1st bit in error in unscrambling = %d\n" "\x1B[0m", frame, trial, i);*/
|
||||||
estimated_output_bit[i] = (ulsch_gNB->harq_processes[harq_pid]->b[i/8] & (1 << (i & 7))) >> (i & 7);
|
errors_scrambling[round]++;
|
||||||
test_input_bit[i] = (ulsch_ue[0]->harq_processes[harq_pid]->b[i/8] & (1 << (i & 7))) >> (i & 7);
|
|
||||||
|
|
||||||
if (estimated_output_bit[i] != test_input_bit[i]) {
|
|
||||||
/*if(errors_decoding == 0)
|
|
||||||
printf("\x1B[34m""[frame %d][trial %d]\t1st bit in error in decoding = %d\n" "\x1B[0m", frame, trial, i);*/
|
|
||||||
errors_decoding++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (n_trials == 1) {
|
|
||||||
for (int r=0;r<ulsch_ue[0]->harq_processes[harq_pid]->C;r++)
|
|
||||||
for (int i=0;i<ulsch_ue[0]->harq_processes[harq_pid]->K>>3;i++) {
|
|
||||||
if ((ulsch_ue[0]->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]) != 0) printf("************");
|
|
||||||
printf("r %d: in[%d] %x, out[%d] %x (%x)\n",r,
|
|
||||||
i,ulsch_ue[0]->harq_processes[harq_pid]->c[r][i],
|
|
||||||
i,ulsch_gNB->harq_processes[harq_pid]->c[r][i],
|
|
||||||
ulsch_ue[0]->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (errors_decoding > 0 && error_flag == 0) {
|
round++;
|
||||||
n_false_positive++;
|
|
||||||
if (n_trials==1)
|
|
||||||
printf("\x1B[31m""[frame %d][trial %d]\tnumber of errors in decoding = %u\n" "\x1B[0m", frame, trial, errors_decoding);
|
|
||||||
}
|
|
||||||
} // trial loop
|
|
||||||
|
|
||||||
printf("*****************************************\n");
|
} // round
|
||||||
printf("SNR %f: n_errors (negative CRC) = %d/%d, false_positive %d/%d, errors_scrambling %u/%u\n", SNR, n_errors, n_trials, n_false_positive, n_trials, errors_scrambling, available_bits*n_trials);
|
|
||||||
printf("\n");
|
if (n_trials == 1 && errors_scrambling[0] > 0) {
|
||||||
printf("SNR %f: Channel BLER %e, Channel BER %e\n", SNR,(double)n_errors/n_trials,(double)errors_scrambling/available_bits/n_trials);
|
printf("\x1B[31m""[frame %d][trial %d]\tnumber of errors in unscrambling = %u\n" "\x1B[0m", frame, trial, errors_scrambling[0]);
|
||||||
printf("*****************************************\n");
|
}
|
||||||
printf("\n");
|
|
||||||
|
for (i = 0; i < TBS; i++) {
|
||||||
if (print_perf==1) {
|
|
||||||
printDistribution(&gNB->phy_proc_rx,table_rx,"Total PHY proc rx");
|
|
||||||
printStatIndent(&gNB->ulsch_channel_estimation_stats,"ULSCH channel estimation time");
|
|
||||||
printStatIndent(&gNB->ulsch_rbs_extraction_stats,"ULSCH rbs extraction time");
|
|
||||||
printStatIndent(&gNB->ulsch_channel_compensation_stats,"ULSCH channel compensation time");
|
|
||||||
printStatIndent(&gNB->ulsch_llr_stats,"ULSCH llr computation");
|
|
||||||
printStatIndent(&gNB->ulsch_unscrambling_stats,"ULSCH unscrambling");
|
|
||||||
printStatIndent(&gNB->ulsch_decoding_stats,"ULSCH total decoding time");
|
|
||||||
printStatIndent2(&gNB->ulsch_deinterleaving_stats,"ULSCH deinterleaving");
|
|
||||||
printStatIndent2(&gNB->ulsch_rate_unmatching_stats,"ULSCH rate matching rx");
|
|
||||||
printStatIndent2(&gNB->ulsch_ldpc_decoding_stats,"ULSCH ldpc decoding");
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(n_trials==1)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if ((float)n_errors/(float)n_trials <= target_error_rate) {
|
|
||||||
printf("*************\n");
|
|
||||||
printf("PUSCH test OK\n");
|
|
||||||
printf("*************\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
estimated_output_bit[i] = (ulsch_gNB->harq_processes[harq_pid]->b[i/8] & (1 << (i & 7))) >> (i & 7);
|
||||||
|
test_input_bit[i] = (ulsch_ue[0]->harq_processes[harq_pid]->b[i/8] & (1 << (i & 7))) >> (i & 7);
|
||||||
|
|
||||||
|
if (estimated_output_bit[i] != test_input_bit[i]) {
|
||||||
|
/*if(errors_decoding == 0)
|
||||||
|
printf("\x1B[34m""[frame %d][trial %d]\t1st bit in error in decoding = %d\n" "\x1B[0m", frame, trial, i);*/
|
||||||
|
errors_decoding++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (n_trials == 1) {
|
||||||
|
for (int r=0;r<ulsch_ue[0]->harq_processes[harq_pid]->C;r++)
|
||||||
|
for (int i=0;i<ulsch_ue[0]->harq_processes[harq_pid]->K>>3;i++) {
|
||||||
|
/*if ((ulsch_ue[0]->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]) != 0) printf("************");
|
||||||
|
printf("r %d: in[%d] %x, out[%d] %x (%x)\n",r,
|
||||||
|
i,ulsch_ue[0]->harq_processes[harq_pid]->c[r][i],
|
||||||
|
i,ulsch_gNB->harq_processes[harq_pid]->c[r][i],
|
||||||
|
ulsch_ue[0]->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]);*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (errors_decoding > 0 && error_flag == 0) {
|
||||||
|
n_false_positive++;
|
||||||
|
if (n_trials==1)
|
||||||
|
printf("\x1B[31m""[frame %d][trial %d]\tnumber of errors in decoding = %u\n" "\x1B[0m", frame, trial, errors_decoding);
|
||||||
|
}
|
||||||
|
roundStats[snrRun] += ((float)round);
|
||||||
|
if (!crc_status) effRate += ((float)TBS)/round;
|
||||||
|
} // trial loop
|
||||||
|
|
||||||
|
roundStats[snrRun]/=((float)n_trials);
|
||||||
|
effRate /= n_trials;
|
||||||
|
|
||||||
|
printf("*****************************************\n");
|
||||||
|
printf("SNR %f: n_errors (%d/%d,%d/%d,%d/%d,%d/%d) (negative CRC), false_positive %d/%d, errors_scrambling (%u/%u,%u/%u,%u/%u,%u/%u\n", SNR, n_errors[0], round_trials[0],n_errors[1], round_trials[1],n_errors[2], round_trials[2],n_errors[3], round_trials[3], n_false_positive, n_trials, errors_scrambling[0],available_bits*n_trials,errors_scrambling[1],available_bits*n_trials,errors_scrambling[2],available_bits*n_trials,errors_scrambling[3],available_bits*n_trials);
|
||||||
|
printf("\n");
|
||||||
|
printf("SNR %f: Channel BLER (%e,%e,%e,%e), Channel BER (%e,%e,%e,%e) Avg round %.2f, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %u bits/slot\n",
|
||||||
|
SNR,
|
||||||
|
(double)n_errors[0]/round_trials[0],
|
||||||
|
(double)n_errors[1]/round_trials[0],
|
||||||
|
(double)n_errors[2]/round_trials[0],
|
||||||
|
(double)n_errors[3]/round_trials[0],
|
||||||
|
(double)errors_scrambling[0]/available_bits/round_trials[0],
|
||||||
|
(double)errors_scrambling[1]/available_bits/round_trials[0],
|
||||||
|
(double)errors_scrambling[2]/available_bits/round_trials[0],
|
||||||
|
(double)errors_scrambling[3]/available_bits/round_trials[0],
|
||||||
|
roundStats[snrRun],effRate,effRate/TBS*100,TBS);
|
||||||
|
|
||||||
|
dump_pusch_stats(gNB);
|
||||||
|
|
||||||
|
printf("*****************************************\n");
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
if (print_perf==1) {
|
||||||
|
printDistribution(&gNB->phy_proc_rx,table_rx,"Total PHY proc rx");
|
||||||
|
printStatIndent(&gNB->rx_pusch_stats,"RX PUSCH time");
|
||||||
|
printStatIndent2(&gNB->ulsch_channel_estimation_stats,"ULSCH channel estimation time");
|
||||||
|
printStatIndent2(&gNB->ulsch_ptrs_processing_stats,"ULSCH PTRS Processing time");
|
||||||
|
printStatIndent2(&gNB->ulsch_rbs_extraction_stats,"ULSCH rbs extraction time");
|
||||||
|
printStatIndent2(&gNB->ulsch_channel_compensation_stats,"ULSCH channel compensation time");
|
||||||
|
printStatIndent2(&gNB->ulsch_mrc_stats,"ULSCH mrc computation");
|
||||||
|
printStatIndent2(&gNB->ulsch_llr_stats,"ULSCH llr computation");
|
||||||
|
printStatIndent(&gNB->ulsch_unscrambling_stats,"ULSCH unscrambling");
|
||||||
|
printStatIndent(&gNB->ulsch_decoding_stats,"ULSCH total decoding time");
|
||||||
|
printStatIndent2(&gNB->ulsch_deinterleaving_stats,"ULSCH deinterleaving");
|
||||||
|
printStatIndent2(&gNB->ulsch_rate_unmatching_stats,"ULSCH rate matching rx");
|
||||||
|
printStatIndent2(&gNB->ulsch_ldpc_decoding_stats,"ULSCH ldpc decoding");
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(n_trials==1)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if ((float)n_errors[0]/(float)n_trials <= target_error_rate) {
|
||||||
|
printf("*************\n");
|
||||||
|
printf("PUSCH test OK\n");
|
||||||
|
printf("*************\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
snrRun++;
|
||||||
|
n_errs = n_errors[0];
|
||||||
} // SNR loop
|
} // SNR loop
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
@@ -928,5 +1156,5 @@ int main(int argc, char **argv)
|
|||||||
if (scg_fd)
|
if (scg_fd)
|
||||||
fclose(scg_fd);
|
fclose(scg_fd);
|
||||||
|
|
||||||
return (n_errors);
|
return (n_errs);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ void do_DL_sig(sim_t *sim,
|
|||||||
|
|
||||||
//RU2UE[eNB_id][UE_id]->path_loss_dB = 0;
|
//RU2UE[eNB_id][UE_id]->path_loss_dB = 0;
|
||||||
multipath_channel(sim->RU2UE[ru_id][UE_id][CC_id],s_re,s_im,r_re0,r_im0,
|
multipath_channel(sim->RU2UE[ru_id][UE_id][CC_id],s_re,s_im,r_re0,r_im0,
|
||||||
length,hold_channel);
|
length,hold_channel,0);
|
||||||
#ifdef DEBUG_SIM
|
#ifdef DEBUG_SIM
|
||||||
rx_pwr = signal_energy_fp2(sim->RU2UE[ru_id][UE_id][CC_id]->ch[0],
|
rx_pwr = signal_energy_fp2(sim->RU2UE[ru_id][UE_id][CC_id]->ch[0],
|
||||||
sim->RU2UE[ru_id][UE_id][CC_id]->channel_length)*sim->RU2UE[ru_id][UE_id][CC_id]->channel_length;
|
sim->RU2UE[ru_id][UE_id][CC_id]->channel_length)*sim->RU2UE[ru_id][UE_id][CC_id]->channel_length;
|
||||||
@@ -394,7 +394,7 @@ void do_UL_sig(sim_t *sim,
|
|||||||
|
|
||||||
|
|
||||||
multipath_channel(sim->UE2RU[UE_id][ru_id][CC_id],s_re,s_im,r_re0,r_im0,
|
multipath_channel(sim->UE2RU[UE_id][ru_id][CC_id],s_re,s_im,r_re0,r_im0,
|
||||||
frame_parms->samples_per_tti,hold_channel);
|
frame_parms->samples_per_tti,hold_channel,0);
|
||||||
|
|
||||||
|
|
||||||
rx_pwr = signal_energy_fp2(sim->UE2RU[UE_id][ru_id][CC_id]->ch[0],
|
rx_pwr = signal_energy_fp2(sim->UE2RU[UE_id][ru_id][CC_id]->ch[0],
|
||||||
|
|||||||
@@ -44,7 +44,8 @@ void multipath_channel(channel_desc_t *desc,
|
|||||||
double rx_sig_re[2][30720*2],
|
double rx_sig_re[2][30720*2],
|
||||||
double rx_sig_im[2][30720*2],
|
double rx_sig_im[2][30720*2],
|
||||||
uint32_t length,
|
uint32_t length,
|
||||||
uint8_t keep_channel)
|
uint8_t keep_channel,
|
||||||
|
int log_channel)
|
||||||
{
|
{
|
||||||
|
|
||||||
int i,ii,j,l;
|
int i,ii,j,l;
|
||||||
@@ -150,7 +151,8 @@ void multipath_channel(channel_desc_t *desc,
|
|||||||
double *rx_sig_re[2],
|
double *rx_sig_re[2],
|
||||||
double *rx_sig_im[2],
|
double *rx_sig_im[2],
|
||||||
uint32_t length,
|
uint32_t length,
|
||||||
uint8_t keep_channel)
|
uint8_t keep_channel,
|
||||||
|
int log_channel)
|
||||||
{
|
{
|
||||||
|
|
||||||
int i,ii,j,l;
|
int i,ii,j,l;
|
||||||
@@ -196,16 +198,21 @@ void multipath_channel(channel_desc_t *desc,
|
|||||||
|
|
||||||
rx_tmp.x += (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].x) - (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].y);
|
rx_tmp.x += (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].x) - (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].y);
|
||||||
rx_tmp.y += (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].x) + (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].y);
|
rx_tmp.y += (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].x) + (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].y);
|
||||||
|
if (i==0 && log_channel == 1) {
|
||||||
|
printf("channel[%d][%d][%d] = %f dB (%e,%e)\n",ii,j,l,10*log10(pow(desc->ch[ii+(j*desc->nb_rx)][l].x,2.0)+pow(desc->ch[ii+(j*desc->nb_rx)][l].y,2.0)),
|
||||||
|
desc->ch[ii+(j*desc->nb_rx)][l].x,
|
||||||
|
desc->ch[ii+(j*desc->nb_rx)][l].y);
|
||||||
|
}
|
||||||
} //l
|
} //l
|
||||||
} // j
|
} // j
|
||||||
|
|
||||||
rx_sig_re[ii][i+dd] = rx_tmp.x*path_loss;
|
rx_sig_re[ii][i+dd] = rx_tmp.x*path_loss;
|
||||||
rx_sig_im[ii][i+dd] = rx_tmp.y*path_loss;
|
rx_sig_im[ii][i+dd] = rx_tmp.y*path_loss;
|
||||||
/*
|
|
||||||
if ((ii==0)&&((i%32)==0)) {
|
/* if ((ii==0)&&((i%32)==0)) {
|
||||||
printf("%p %p %f,%f => %e,%e\n",rx_sig_re[ii],rx_sig_im[ii],rx_tmp.x,rx_tmp.y,rx_sig_re[ii][i-dd],rx_sig_im[ii][i-dd]);
|
printf("%p %p %f,%f => %e,%e\n",rx_sig_re[ii],rx_sig_im[ii],rx_tmp.x,rx_tmp.y,rx_sig_re[ii][i-dd],rx_sig_im[ii][i-dd]);
|
||||||
}
|
}*/
|
||||||
*/
|
|
||||||
//rx_sig_re[ii][i] = sqrt(.5)*(tx_sig_re[0][i] + tx_sig_re[1][i]);
|
//rx_sig_re[ii][i] = sqrt(.5)*(tx_sig_re[0][i] + tx_sig_re[1][i]);
|
||||||
//rx_sig_im[ii][i] = sqrt(.5)*(tx_sig_im[0][i] + tx_sig_im[1][i]);
|
//rx_sig_im[ii][i] = sqrt(.5)*(tx_sig_im[0][i] + tx_sig_im[1][i]);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "sim.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* linear phase noise model */
|
||||||
|
void phase_noise(double ts, int16_t * InRe, int16_t * InIm)
|
||||||
|
{
|
||||||
|
double fd = 300;//0.01*30000
|
||||||
|
static double i=0;
|
||||||
|
double real, imag,x ,y;
|
||||||
|
i++;
|
||||||
|
real = cos(fd * 2 * M_PI * i * ts);
|
||||||
|
imag = sin (fd * 2 * M_PI * i * ts);
|
||||||
|
x = ((real * (double)InRe[0]) - (imag * (double)InIm[0])) ;
|
||||||
|
y= ((real * (double)InIm[0]) + (imag * (double)InRe[0])) ;
|
||||||
|
InRe[0]= (int16_t)(x);
|
||||||
|
InIm[0]= (int16_t)(y);
|
||||||
|
}
|
||||||
@@ -178,6 +178,223 @@ double mbsfn_amps_dB[] = {0,-1.5,-1.4,-3.6,-0.6,-7.0,-10,-11.5,-11.4,-13.6,-10.6
|
|||||||
double scm_c_delays[] = {0, 0.0125, 0.0250, 0.3625, 0.3750, 0.3875, 0.2500, 0.2625, 0.2750, 1.0375, 1.0500, 1.0625, 2.7250, 2.7375, 2.7500, 4.6000, 4.6125, 4.6250};
|
double scm_c_delays[] = {0, 0.0125, 0.0250, 0.3625, 0.3750, 0.3875, 0.2500, 0.2625, 0.2750, 1.0375, 1.0500, 1.0625, 2.7250, 2.7375, 2.7500, 4.6000, 4.6125, 4.6250};
|
||||||
double scm_c_amps_dB[] = {0.00, -2.22, -3.98, -1.86, -4.08, -5.84, -1.08, -3.30, -5.06, -9.08, -11.30, -13.06, -15.14, -17.36, -19.12, -20.64, -22.85, -24.62};
|
double scm_c_amps_dB[] = {0.00, -2.22, -3.98, -1.86, -4.08, -5.84, -1.08, -3.30, -5.06, -9.08, -11.30, -13.06, -15.14, -17.36, -19.12, -20.64, -22.85, -24.62};
|
||||||
|
|
||||||
|
double tdl_a_delays[] = {0.0000,
|
||||||
|
0.3819,
|
||||||
|
0.4025,
|
||||||
|
0.5868,
|
||||||
|
0.4610,
|
||||||
|
0.5375,
|
||||||
|
0.6708,
|
||||||
|
0.5750,
|
||||||
|
0.7618,
|
||||||
|
1.5375,
|
||||||
|
1.8978,
|
||||||
|
2.2242,
|
||||||
|
2.1718,
|
||||||
|
2.4942,
|
||||||
|
2.5119,
|
||||||
|
3.0582,
|
||||||
|
4.0810,
|
||||||
|
4.4579,
|
||||||
|
4.5695,
|
||||||
|
4.7966,
|
||||||
|
5.0066,
|
||||||
|
5.3043,
|
||||||
|
9.6586};
|
||||||
|
double tdl_a_amps_dB[] = {-13.4,
|
||||||
|
0,
|
||||||
|
-2.2,
|
||||||
|
-4,
|
||||||
|
-6,
|
||||||
|
-8.2,
|
||||||
|
-9.9,
|
||||||
|
-10.5,
|
||||||
|
-7.5,
|
||||||
|
-15.9,
|
||||||
|
-6.6,
|
||||||
|
-16.7,
|
||||||
|
-12.4,
|
||||||
|
-15.2,
|
||||||
|
-10.8,
|
||||||
|
-11.3,
|
||||||
|
-12.7,
|
||||||
|
-16.2,
|
||||||
|
-18.3,
|
||||||
|
-18.9,
|
||||||
|
-16.6,
|
||||||
|
-19.9,
|
||||||
|
-29.7};
|
||||||
|
#define TDL_A_PATHS 23
|
||||||
|
|
||||||
|
double tdl_b_delays[] = {0.0000,
|
||||||
|
0.1072,
|
||||||
|
0.2155,
|
||||||
|
0.2095,
|
||||||
|
0.2870,
|
||||||
|
0.2986,
|
||||||
|
0.3752,
|
||||||
|
0.5055,
|
||||||
|
0.3681,
|
||||||
|
0.3697,
|
||||||
|
0.5700,
|
||||||
|
0.5283,
|
||||||
|
1.1021,
|
||||||
|
1.2756,
|
||||||
|
1.5474,
|
||||||
|
1.7842,
|
||||||
|
2.0169,
|
||||||
|
2.8294,
|
||||||
|
3.0219,
|
||||||
|
3.6187,
|
||||||
|
4.1067,
|
||||||
|
4.2790,
|
||||||
|
4.7834};
|
||||||
|
|
||||||
|
double tdl_b_amps_dB[] = {0,
|
||||||
|
-2.2,
|
||||||
|
-4,
|
||||||
|
-3.2,
|
||||||
|
-9.8,
|
||||||
|
-1.2,
|
||||||
|
-3.4,
|
||||||
|
-5.2,
|
||||||
|
-7.6,
|
||||||
|
-3,
|
||||||
|
-8.9,
|
||||||
|
-9,
|
||||||
|
-4.8,
|
||||||
|
-5.7,
|
||||||
|
-7.5,
|
||||||
|
-1.9,
|
||||||
|
-7.6,
|
||||||
|
-12.2,
|
||||||
|
-9.8,
|
||||||
|
-11.4,
|
||||||
|
-14.9,
|
||||||
|
-9.2,
|
||||||
|
-11.3};
|
||||||
|
#define TDL_B_PATHS 23
|
||||||
|
|
||||||
|
double tdl_c_delays[] = {0,
|
||||||
|
0.2099,
|
||||||
|
0.2219,
|
||||||
|
0.2329,
|
||||||
|
0.2176,
|
||||||
|
0.6366,
|
||||||
|
0.6448,
|
||||||
|
0.6560,
|
||||||
|
0.6584,
|
||||||
|
0.7935,
|
||||||
|
0.8213,
|
||||||
|
0.9336,
|
||||||
|
1.2285,
|
||||||
|
1.3083,
|
||||||
|
2.1704,
|
||||||
|
2.7105,
|
||||||
|
4.2589,
|
||||||
|
4.6003,
|
||||||
|
5.4902,
|
||||||
|
5.6077,
|
||||||
|
6.3065,
|
||||||
|
6.6374,
|
||||||
|
7.0427,
|
||||||
|
8.6523};
|
||||||
|
|
||||||
|
double tdl_c_amps_dB[] = {-4.4,
|
||||||
|
-1.2,
|
||||||
|
-3.5,
|
||||||
|
-5.2,
|
||||||
|
-2.5,
|
||||||
|
0,
|
||||||
|
-2.2,
|
||||||
|
-3.9,
|
||||||
|
-7.4,
|
||||||
|
-7.1,
|
||||||
|
-10.7,
|
||||||
|
-11.1,
|
||||||
|
-5.1,
|
||||||
|
-6.8,
|
||||||
|
-8.7,
|
||||||
|
-13.2,
|
||||||
|
-13.9,
|
||||||
|
-13.9,
|
||||||
|
-15.8,
|
||||||
|
-17.1,
|
||||||
|
-16,
|
||||||
|
-15.7,
|
||||||
|
-21.6,
|
||||||
|
-22.8};
|
||||||
|
#define TDL_C_PATHS 24
|
||||||
|
|
||||||
|
double tdl_d_delays[] = {//0,
|
||||||
|
0,
|
||||||
|
0.035,
|
||||||
|
0.612,
|
||||||
|
1.363,
|
||||||
|
1.405,
|
||||||
|
1.804,
|
||||||
|
2.596,
|
||||||
|
1.775,
|
||||||
|
4.042,
|
||||||
|
7.937,
|
||||||
|
9.424,
|
||||||
|
9.708,
|
||||||
|
12.525};
|
||||||
|
|
||||||
|
double tdl_d_amps_dB[] = {//-0.2,
|
||||||
|
//-13.5,
|
||||||
|
-.00147,
|
||||||
|
-18.8,
|
||||||
|
-21,
|
||||||
|
-22.8,
|
||||||
|
-17.9,
|
||||||
|
-20.1,
|
||||||
|
-21.9,
|
||||||
|
-22.9,
|
||||||
|
-27.8,
|
||||||
|
-23.6,
|
||||||
|
-24.8,
|
||||||
|
-30.0,
|
||||||
|
-27.7};
|
||||||
|
|
||||||
|
#define TDL_D_PATHS 13
|
||||||
|
#define TDL_D_RICEAN_FACTOR .046774
|
||||||
|
|
||||||
|
double tdl_e_delays[] = {0,
|
||||||
|
0.5133,
|
||||||
|
0.5440,
|
||||||
|
0.5630,
|
||||||
|
0.5440,
|
||||||
|
0.7112,
|
||||||
|
1.9092,
|
||||||
|
1.9293,
|
||||||
|
1.9589,
|
||||||
|
2.6426,
|
||||||
|
3.7136,
|
||||||
|
5.4524,
|
||||||
|
12.0034,
|
||||||
|
20.6519};
|
||||||
|
|
||||||
|
double tdl_e_amps_dB[] = {//-0.03,
|
||||||
|
//-22.03,
|
||||||
|
-.00433,
|
||||||
|
-15.8,
|
||||||
|
-18.1,
|
||||||
|
-19.8,
|
||||||
|
-22.9,
|
||||||
|
-22.4,
|
||||||
|
-18.6,
|
||||||
|
-20.8,
|
||||||
|
-22.6,
|
||||||
|
-22.3,
|
||||||
|
-25.6,
|
||||||
|
-20.2,
|
||||||
|
-29.8,
|
||||||
|
-29.2};
|
||||||
|
|
||||||
|
#define TDL_E_PATHS 14
|
||||||
|
#define TDL_E_RICEAN_FACTOR 0.0063096
|
||||||
|
|
||||||
double epa_delays[] = { 0,.03,.07,.09,.11,.19,.41};
|
double epa_delays[] = { 0,.03,.07,.09,.11,.19,.41};
|
||||||
double epa_amps_dB[] = {0.0,-1.0,-2.0,-3.0,-8.0,-17.2,-20.8};
|
double epa_amps_dB[] = {0.0,-1.0,-2.0,-3.0,-8.0,-17.2,-20.8};
|
||||||
|
|
||||||
@@ -282,7 +499,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
SCM_t channel_model,
|
SCM_t channel_model,
|
||||||
double sampling_rate,
|
double sampling_rate,
|
||||||
double channel_bandwidth,
|
double channel_bandwidth,
|
||||||
double forgetting_factor,
|
double DS_TDL,
|
||||||
|
double forgetting_factor,
|
||||||
int32_t channel_offset,
|
int32_t channel_offset,
|
||||||
double path_loss_dB) {
|
double path_loss_dB) {
|
||||||
channel_desc_t *chan_desc = (channel_desc_t *)calloc(1,sizeof(channel_desc_t));
|
channel_desc_t *chan_desc = (channel_desc_t *)calloc(1,sizeof(channel_desc_t));
|
||||||
@@ -300,6 +518,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
uint16_t i,j;
|
uint16_t i,j;
|
||||||
double sum_amps;
|
double sum_amps;
|
||||||
double aoa,ricean_factor,Td,maxDoppler;
|
double aoa,ricean_factor,Td,maxDoppler;
|
||||||
|
|
||||||
int channel_length,nb_taps;
|
int channel_length,nb_taps;
|
||||||
chan_desc->modelid = channel_model;
|
chan_desc->modelid = channel_model;
|
||||||
chan_desc->nb_tx = nb_tx;
|
chan_desc->nb_tx = nb_tx;
|
||||||
@@ -313,6 +532,11 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
chan_desc->ip = 0.0;
|
chan_desc->ip = 0.0;
|
||||||
LOG_I(OCM,"Channel Model (inside of new_channel_desc_scm)=%d\n\n", channel_model);
|
LOG_I(OCM,"Channel Model (inside of new_channel_desc_scm)=%d\n\n", channel_model);
|
||||||
|
|
||||||
|
int tdl_paths=0;
|
||||||
|
double tdl_ricean_factor = 1;
|
||||||
|
double *tdl_amps_dB;
|
||||||
|
double *tdl_delays;
|
||||||
|
|
||||||
switch (channel_model) {
|
switch (channel_model) {
|
||||||
case SCM_A:
|
case SCM_A:
|
||||||
LOG_W(OCM,"channel model not yet supported\n");
|
LOG_W(OCM,"channel model not yet supported\n");
|
||||||
@@ -442,7 +666,101 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TDL_A:
|
||||||
|
case TDL_B:
|
||||||
|
case TDL_C:
|
||||||
|
case TDL_D:
|
||||||
|
case TDL_E:
|
||||||
|
if (channel_model == TDL_A) {
|
||||||
|
tdl_paths=TDL_A_PATHS;
|
||||||
|
tdl_delays=tdl_a_delays;
|
||||||
|
tdl_amps_dB=tdl_a_amps_dB;
|
||||||
|
}else if (channel_model == TDL_B) {
|
||||||
|
tdl_paths=TDL_B_PATHS;
|
||||||
|
tdl_delays=tdl_b_delays;
|
||||||
|
tdl_amps_dB=tdl_b_amps_dB;
|
||||||
|
}
|
||||||
|
else if (channel_model == TDL_C) {
|
||||||
|
tdl_paths=TDL_C_PATHS;
|
||||||
|
tdl_delays=tdl_c_delays;
|
||||||
|
tdl_amps_dB=tdl_c_amps_dB;
|
||||||
|
printf("Initializing TDL_C channel with %d paths\n",TDL_C_PATHS);
|
||||||
|
} else if (channel_model == TDL_D) {
|
||||||
|
tdl_paths=TDL_D_PATHS;
|
||||||
|
tdl_delays=tdl_d_delays;
|
||||||
|
tdl_amps_dB=tdl_d_amps_dB;
|
||||||
|
tdl_ricean_factor = TDL_D_RICEAN_FACTOR;
|
||||||
|
} else if (channel_model == TDL_E) {
|
||||||
|
tdl_paths=TDL_E_PATHS-1;
|
||||||
|
tdl_delays=tdl_e_delays+1;
|
||||||
|
tdl_amps_dB=tdl_e_amps_dB;
|
||||||
|
tdl_ricean_factor = TDL_E_RICEAN_FACTOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tdl_pathsby3 = tdl_paths/3;
|
||||||
|
if ((tdl_paths%3)>0) tdl_pathsby3++;
|
||||||
|
|
||||||
|
chan_desc->nb_taps = tdl_paths;
|
||||||
|
chan_desc->Td = tdl_delays[tdl_paths-1]*DS_TDL;
|
||||||
|
printf("last path (%d) at %f * %e = %e\n",tdl_paths-1,tdl_delays[tdl_paths-1],DS_TDL,chan_desc->Td);
|
||||||
|
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
||||||
|
printf("TDL : %f Ms/s, nb_taps %d, Td %e, channel_length %d\n",chan_desc->sampling_rate,tdl_paths,chan_desc->Td,chan_desc->channel_length);
|
||||||
|
sum_amps = 0;
|
||||||
|
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
||||||
|
|
||||||
|
for (i = 0; i<chan_desc->nb_taps; i++) {
|
||||||
|
chan_desc->amps[i] = pow(10,.1*tdl_amps_dB[i]);
|
||||||
|
sum_amps += chan_desc->amps[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i<chan_desc->nb_taps; i++) {
|
||||||
|
chan_desc->amps[i] /= sum_amps;
|
||||||
|
tdl_delays[i] *= DS_TDL;
|
||||||
|
}
|
||||||
|
chan_desc->delays = tdl_delays;
|
||||||
|
chan_desc->ricean_factor = tdl_ricean_factor;
|
||||||
|
chan_desc->aoa = 0;
|
||||||
|
chan_desc->random_aoa = 0;
|
||||||
|
chan_desc->ch = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
|
||||||
|
chan_desc->chF = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
|
||||||
|
chan_desc->a = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
|
||||||
|
|
||||||
|
for (i = 0; i<nb_tx*nb_rx; i++)
|
||||||
|
chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
|
||||||
|
|
||||||
|
for (i = 0; i<nb_tx*nb_rx; i++)
|
||||||
|
chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
|
||||||
|
|
||||||
|
for (i = 0; i<chan_desc->nb_taps; i++)
|
||||||
|
chan_desc->a[i] = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
|
||||||
|
|
||||||
|
chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **));
|
||||||
|
|
||||||
|
if (nb_tx==2 && nb_rx==2) {
|
||||||
|
for (i = 0; i<(tdl_pathsby3); i++)
|
||||||
|
chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
|
||||||
|
} else if (nb_tx==2 && nb_rx==1) {
|
||||||
|
for (i = 0; i<(tdl_pathsby3); i++)
|
||||||
|
chan_desc->R_sqrt[i] = (struct complex *) &R21_sqrt[i][0];
|
||||||
|
} else if (nb_tx==1 && nb_rx==2) {
|
||||||
|
for (i = 0; i<(tdl_pathsby3); i++)
|
||||||
|
chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0];
|
||||||
|
} else {
|
||||||
|
for (i = 0; i<(tdl_pathsby3); i++) {
|
||||||
|
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
|
||||||
|
|
||||||
|
for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
|
||||||
|
chan_desc->R_sqrt[i][j].x = 1.0;
|
||||||
|
chan_desc->R_sqrt[i][j].y = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
case EPA:
|
case EPA:
|
||||||
chan_desc->nb_taps = 7;
|
chan_desc->nb_taps = 7;
|
||||||
chan_desc->Td = .410;
|
chan_desc->Td = .410;
|
||||||
@@ -1462,15 +1780,14 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
|
|||||||
|
|
||||||
desc->ch[aarx+(aatx*desc->nb_rx)][k].x += s*desc->a[l][aarx+(aatx*desc->nb_rx)].x;
|
desc->ch[aarx+(aatx*desc->nb_rx)][k].x += s*desc->a[l][aarx+(aatx*desc->nb_rx)].x;
|
||||||
desc->ch[aarx+(aatx*desc->nb_rx)][k].y += s*desc->a[l][aarx+(aatx*desc->nb_rx)].y;
|
desc->ch[aarx+(aatx*desc->nb_rx)][k].y += s*desc->a[l][aarx+(aatx*desc->nb_rx)].y;
|
||||||
// printf("l %d : desc->ch.x %f\n",l,desc->a[l][aarx+(aatx*desc->nb_rx)].x);
|
// printf("l %d : desc->ch.x %f, s %e, delay %f\n",l,desc->a[l][aarx+(aatx*desc->nb_rx)].x,s,desc->delays[l]);
|
||||||
} //nb_taps
|
} //nb_taps
|
||||||
|
|
||||||
#ifdef DEBUG_CH
|
#ifdef DEBUG_CH
|
||||||
k=0;
|
printf("(%d,%d,%d)->(%e,%e)\n",k,aarx,aatx,desc->ch[aarx+(aatx*desc->nb_rx)][k].x,desc->ch[aarx+(aatx*desc->nb_rx)][k].y);
|
||||||
printf("(%d,%d,%d)->(%f,%f)\n",k,aarx,aatx,desc->ch[aarx+(aatx*desc->nb_rx)][k].x,desc->ch[aarx+(aatx*desc->nb_rx)][k].y);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
} //channel_length
|
||||||
} //channel_length
|
}
|
||||||
} //aatx
|
} //aatx
|
||||||
} //aarx
|
} //aarx
|
||||||
|
|
||||||
|
|||||||
@@ -178,6 +178,11 @@ typedef enum {
|
|||||||
EVA,
|
EVA,
|
||||||
ETU,
|
ETU,
|
||||||
MBSFN,
|
MBSFN,
|
||||||
|
TDL_A,
|
||||||
|
TDL_B,
|
||||||
|
TDL_C,
|
||||||
|
TDL_D,
|
||||||
|
TDL_E,
|
||||||
Rayleigh8,
|
Rayleigh8,
|
||||||
Rayleigh1,
|
Rayleigh1,
|
||||||
Rayleigh1_800,
|
Rayleigh1_800,
|
||||||
@@ -208,6 +213,11 @@ typedef enum {
|
|||||||
{"EVA",EVA},\
|
{"EVA",EVA},\
|
||||||
{"ETU",ETU},\
|
{"ETU",ETU},\
|
||||||
{"MBSFN",MBSFN},\
|
{"MBSFN",MBSFN},\
|
||||||
|
{"TDL_A",TDL_A},\
|
||||||
|
{"TDL_B",TDL_B},\
|
||||||
|
{"TDL_C",TDL_C},\
|
||||||
|
{"TDL_D",TDL_D},\
|
||||||
|
{"TDL_E",TDL_E},\
|
||||||
{"Rayleigh8",Rayleigh8},\
|
{"Rayleigh8",Rayleigh8},\
|
||||||
{"Rayleigh1",Rayleigh1},\
|
{"Rayleigh1",Rayleigh1},\
|
||||||
{"Rayleigh1_800",Rayleigh1_800},\
|
{"Rayleigh1_800",Rayleigh1_800},\
|
||||||
@@ -262,33 +272,12 @@ typedef struct {
|
|||||||
} sim_t;
|
} sim_t;
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief This routine initializes a new channel descriptor
|
|
||||||
\param nb_tx Number of TX antennas
|
|
||||||
\param nb_rx Number of RX antennas
|
|
||||||
\param nb_taps Number of taps
|
|
||||||
\param channel_length Length of the interpolated channel impulse response
|
|
||||||
\param amps Linear amplitudes of the taps (length(amps)=channel_length). The values should sum up to 1.
|
|
||||||
\param delays Delays of the taps. If delays==NULL the taps are assumed to be spaced equidistantly between 0 and t_max.
|
|
||||||
\param R_sqrt Channel correlation matrix. If R_sqrt==NULL, no channel correlation is applied.
|
|
||||||
\param Td Maximum path delay in mus.
|
|
||||||
\param BW Channel bandwidth in MHz.
|
|
||||||
\param ricean_factor Ricean factor applied to all taps.
|
|
||||||
\param aoa Anlge of arrival
|
|
||||||
\param forgetting_factor This parameter (0...1) allows for simple 1st order temporal variation
|
|
||||||
\param max_Doppler This is the maximum Doppler frequency for Jakes' Model
|
|
||||||
\param channel_offset This is a time delay to apply to channel
|
|
||||||
\param path_loss_dB This is the path loss in dB
|
|
||||||
\param random_aoa If set to 1, AoA of ricean component is randomized
|
|
||||||
*/
|
|
||||||
|
|
||||||
//channel_desc_t *new_channel_desc(uint8_t nb_tx,uint8_t nb_rx, uint8_t nb_taps, uint8_t channel_length, double *amps, double* delays, struct complex** R_sqrt, double Td, double BW, double ricean_factor, double aoa, double forgetting_factor, double max_Doppler, int32_t channel_offset, double path_loss_dB,uint8_t random_aoa);
|
|
||||||
|
|
||||||
channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||||
uint8_t nb_rx,
|
uint8_t nb_rx,
|
||||||
SCM_t channel_model,
|
SCM_t channel_model,
|
||||||
double sampling_rate,
|
double sampling_rate,
|
||||||
double channel_bandwidth,
|
double channel_bandwidth,
|
||||||
|
double TDL_DS,
|
||||||
double forgetting_factor,
|
double forgetting_factor,
|
||||||
int32_t channel_offset,
|
int32_t channel_offset,
|
||||||
double path_loss_dB);
|
double path_loss_dB);
|
||||||
@@ -316,7 +305,8 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag);
|
|||||||
double rx_sig_re[2],
|
double rx_sig_re[2],
|
||||||
double rx_sig_im[2],
|
double rx_sig_im[2],
|
||||||
uint32_t length,
|
uint32_t length,
|
||||||
uint8_t keep_channel)
|
uint8_t keep_channel,
|
||||||
|
int log_channel)
|
||||||
|
|
||||||
\brief This function generates and applys a random frequency selective random channel model.
|
\brief This function generates and applys a random frequency selective random channel model.
|
||||||
@param desc Pointer to channel descriptor
|
@param desc Pointer to channel descriptor
|
||||||
@@ -326,6 +316,7 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag);
|
|||||||
@param rx_sig_im output signal (imaginary component)
|
@param rx_sig_im output signal (imaginary component)
|
||||||
@param length Length of input signal
|
@param length Length of input signal
|
||||||
@param keep_channel Set to 1 to keep channel constant for null-B/F
|
@param keep_channel Set to 1 to keep channel constant for null-B/F
|
||||||
|
@param log_channel=1 make channel coefficients come out for first sample of input
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void multipath_channel(channel_desc_t *desc,
|
void multipath_channel(channel_desc_t *desc,
|
||||||
@@ -334,7 +325,8 @@ void multipath_channel(channel_desc_t *desc,
|
|||||||
double *rx_sig_re[2],
|
double *rx_sig_re[2],
|
||||||
double *rx_sig_im[2],
|
double *rx_sig_im[2],
|
||||||
uint32_t length,
|
uint32_t length,
|
||||||
uint8_t keep_channel);
|
uint8_t keep_channel,
|
||||||
|
int log_channel);
|
||||||
/*
|
/*
|
||||||
\fn double compute_pbch_sinr(channel_desc_t *desc,
|
\fn double compute_pbch_sinr(channel_desc_t *desc,
|
||||||
channel_desc_t *desc_i1,
|
channel_desc_t *desc_i1,
|
||||||
@@ -468,6 +460,14 @@ void init_channelmod(void) ;
|
|||||||
double N_RB2sampling_rate(uint16_t N_RB);
|
double N_RB2sampling_rate(uint16_t N_RB);
|
||||||
double N_RB2channel_bandwidth(uint16_t N_RB);
|
double N_RB2channel_bandwidth(uint16_t N_RB);
|
||||||
|
|
||||||
|
/* Linear phase noise model */
|
||||||
|
/*!
|
||||||
|
\brief This function produce phase noise and add to input signal
|
||||||
|
\param ts Sampling time
|
||||||
|
\param *Re *Im Real and Imag part of the signal
|
||||||
|
*/
|
||||||
|
void phase_noise(double ts, int16_t * InRe, int16_t * InIm);
|
||||||
|
|
||||||
#include "targets/RT/USER/rfsim.h"
|
#include "targets/RT/USER/rfsim.h"
|
||||||
|
|
||||||
void do_DL_sig(sim_t *sim,
|
void do_DL_sig(sim_t *sim,
|
||||||
|
|||||||
@@ -101,9 +101,10 @@
|
|||||||
|
|
||||||
#define NUMBER_OF_NR_DLSCH_MAX 2//16
|
#define NUMBER_OF_NR_DLSCH_MAX 2//16
|
||||||
#define NUMBER_OF_NR_ULSCH_MAX 2//16
|
#define NUMBER_OF_NR_ULSCH_MAX 2//16
|
||||||
#define NUMBER_OF_NR_PUCCH_MAX 2
|
#define NUMBER_OF_NR_SCH_STATS_MAX 16
|
||||||
|
#define NUMBER_OF_NR_PUCCH_MAX 16
|
||||||
#define NUMBER_OF_NR_SR_MAX 16
|
#define NUMBER_OF_NR_SR_MAX 16
|
||||||
|
#define NUMBER_OF_NR_PDCCH_MAX 16
|
||||||
|
|
||||||
#define MAX_MANAGED_ENB_PER_MOBILE 2
|
#define MAX_MANAGED_ENB_PER_MOBILE 2
|
||||||
#define MAX_MANAGED_GNB_PER_MOBILE 2
|
#define MAX_MANAGED_GNB_PER_MOBILE 2
|
||||||
|
|||||||
@@ -403,8 +403,10 @@ typedef struct NRRrcConfigurationReq_s {
|
|||||||
uint16_t mnc[PLMN_LIST_MAX_SIZE];
|
uint16_t mnc[PLMN_LIST_MAX_SIZE];
|
||||||
uint8_t mnc_digit_length[PLMN_LIST_MAX_SIZE];
|
uint8_t mnc_digit_length[PLMN_LIST_MAX_SIZE];
|
||||||
NR_ServingCellConfigCommon_t *scc;
|
NR_ServingCellConfigCommon_t *scc;
|
||||||
int ssb_SubcarrierOffset;
|
int ssb_SubcarrierOffset;
|
||||||
int pdsch_AntennaPorts;
|
int pdsch_AntennaPorts;
|
||||||
|
int pusch_TargetSNRx10;
|
||||||
|
int pucch_TargetSNRx10;
|
||||||
} gNB_RrcConfigurationReq;
|
} gNB_RrcConfigurationReq;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -38,8 +38,7 @@
|
|||||||
|
|
||||||
/* cell configuration section name */
|
/* cell configuration section name */
|
||||||
#define GNB_CONFIG_STRING_GNB_LIST "gNBs"
|
#define GNB_CONFIG_STRING_GNB_LIST "gNBs"
|
||||||
#define GNB_CONFIG_STRING_SSBSUBCARRIEROFFSET "ssb_SubcarrierOffset"
|
|
||||||
#define GNB_CONFIG_STRING_PDSCHANTENNAPORTS "pdsch_AntennaPorts"
|
|
||||||
#define GNB_CONFIG_STRING_SERVINGCELLCONFIGCOMMON "servingCellConfigCommon"
|
#define GNB_CONFIG_STRING_SERVINGCELLCONFIGCOMMON "servingCellConfigCommon"
|
||||||
#define GNB_CONFIG_STRING_PHYSCELLID "physCellId"
|
#define GNB_CONFIG_STRING_PHYSCELLID "physCellId"
|
||||||
#define GNB_CONFIG_STRING_NTIMINGADVANCEOFFSET "n_TimingAdvanceOffset"
|
#define GNB_CONFIG_STRING_NTIMINGADVANCEOFFSET "n_TimingAdvanceOffset"
|
||||||
@@ -223,9 +222,6 @@
|
|||||||
#define GNB_CONFIG_DLCARRIERBANDWIDTH_IDX 10
|
#define GNB_CONFIG_DLCARRIERBANDWIDTH_IDX 10
|
||||||
|
|
||||||
|
|
||||||
#define SSBPARAMS_DESC {{GNB_CONFIG_STRING_SSBSUBCARRIEROFFSET,NULL,0,iptr:&ssb_SubcarrierOffset,defintval:0,TYPE_INT,0}}
|
|
||||||
#define PDSCHANTENNAPARAMS_DESC {{GNB_CONFIG_STRING_PDSCHANTENNAPORTS,NULL,0,iptr:&pdsch_AntennaPorts,defintval:1,TYPE_INT,0}}
|
|
||||||
|
|
||||||
#define SCCPARAMS_DESC(scc) { \
|
#define SCCPARAMS_DESC(scc) { \
|
||||||
{GNB_CONFIG_STRING_PHYSCELLID,NULL,0,i64ptr:scc->physCellId,defint64val:0,TYPE_INT64,0/*0*/}, \
|
{GNB_CONFIG_STRING_PHYSCELLID,NULL,0,i64ptr:scc->physCellId,defint64val:0,TYPE_INT64,0/*0*/}, \
|
||||||
{GNB_CONFIG_STRING_NTIMINGADVANCEOFFSET,NULL,0,i64ptr:scc->n_TimingAdvanceOffset,defint64val:NR_ServingCellConfigCommon__n_TimingAdvanceOffset_n0,TYPE_INT64,0/*1*/},\
|
{GNB_CONFIG_STRING_NTIMINGADVANCEOFFSET,NULL,0,i64ptr:scc->n_TimingAdvanceOffset,defint64val:NR_ServingCellConfigCommon__n_TimingAdvanceOffset_n0,TYPE_INT64,0/*1*/},\
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user