Merge remote-tracking branch 'origin/develop-nr' into nr_pdcch_updates
This commit is contained in:
@@ -212,7 +212,7 @@ pipeline {
|
||||
steps {
|
||||
gitlabCommitStatus(name: "Build eNb-ethernet") {
|
||||
timeout (time: 20, unit: 'MINUTES') {
|
||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant enb-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant enb-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -221,7 +221,7 @@ pipeline {
|
||||
steps {
|
||||
gitlabCommitStatus(name: "Build UE-ethernet") {
|
||||
timeout (time: 20, unit: 'MINUTES') {
|
||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+13
-6
@@ -94,15 +94,22 @@ function build_on_vm {
|
||||
echo "############################################################"
|
||||
echo "Creating VM ($VM_NAME) on Ubuntu Cloud Image base"
|
||||
echo "############################################################"
|
||||
acquire_vm_create_lock
|
||||
uvt-kvm create $VM_NAME release=xenial --memory $VM_MEMORY --cpu $VM_CPU --unsafe-caching --template ci-scripts/template-host.xml
|
||||
echo "Waiting for VM to be started"
|
||||
uvt-kvm wait $VM_NAME --insecure
|
||||
|
||||
VM_IP_ADDR=`uvt-kvm ip $VM_NAME`
|
||||
echo "$VM_NAME has for IP addr = $VM_IP_ADDR"
|
||||
release_vm_create_lock
|
||||
else
|
||||
echo "Waiting for VM to be started"
|
||||
uvt-kvm wait $VM_NAME --insecure
|
||||
|
||||
VM_IP_ADDR=`uvt-kvm ip $VM_NAME`
|
||||
echo "$VM_NAME has for IP addr = $VM_IP_ADDR"
|
||||
fi
|
||||
|
||||
echo "Waiting for VM to be started"
|
||||
uvt-kvm wait $VM_NAME --insecure
|
||||
|
||||
VM_IP_ADDR=`uvt-kvm ip $VM_NAME`
|
||||
echo "$VM_NAME has for IP addr = $VM_IP_ADDR"
|
||||
|
||||
echo "############################################################"
|
||||
echo "Copying GIT repo into VM ($VM_NAME)"
|
||||
echo "############################################################"
|
||||
|
||||
@@ -49,6 +49,35 @@ function create_usage {
|
||||
echo ""
|
||||
}
|
||||
|
||||
function acquire_vm_create_lock {
|
||||
local FlockFile="/tmp/vmclone.lck"
|
||||
local unlocked="0"
|
||||
touch ${FlockFile} 2>/dev/null
|
||||
if [[ $? -ne 0 ]]
|
||||
then
|
||||
echo "Cannot access lock file ${FlockFile}"
|
||||
exit 2
|
||||
fi
|
||||
while [ $unlocked -eq 0 ]
|
||||
do
|
||||
exec 5>${FlockFile}
|
||||
flock -nx 5
|
||||
if [[ $? -ne 0 ]]
|
||||
then
|
||||
echo "Another instance of VM creation is running"
|
||||
sleep 10
|
||||
else
|
||||
unlocked="1"
|
||||
fi
|
||||
done
|
||||
chmod 666 ${FlockFile} 2>/dev/null
|
||||
}
|
||||
|
||||
function release_vm_create_lock {
|
||||
local FlockFile="/tmp/vmclone.lck"
|
||||
rm -Rf ${FlockFile}
|
||||
}
|
||||
|
||||
function create_vm {
|
||||
echo "############################################################"
|
||||
echo "OAI CI VM script"
|
||||
@@ -60,10 +89,12 @@ function create_vm {
|
||||
echo "############################################################"
|
||||
echo "Creating VM ($VM_NAME) on Ubuntu Cloud Image base"
|
||||
echo "############################################################"
|
||||
acquire_vm_create_lock
|
||||
uvt-kvm create $VM_NAME release=xenial --memory $VM_MEMORY --cpu $VM_CPU --unsafe-caching --template ci-scripts/template-host.xml
|
||||
echo "Waiting for VM to be started"
|
||||
uvt-kvm wait $VM_NAME --insecure
|
||||
|
||||
VM_IP_ADDR=`uvt-kvm ip $VM_NAME`
|
||||
echo "$VM_NAME has for IP addr = $VM_IP_ADDR"
|
||||
release_vm_create_lock
|
||||
}
|
||||
|
||||
@@ -252,8 +252,9 @@ case $key in
|
||||
VM_NAME=ci-phy-sim
|
||||
ARCHIVES_LOC=phy_sim
|
||||
LOG_PATTERN=.Rel15.txt
|
||||
NB_PATTERN_FILES=7
|
||||
NB_PATTERN_FILES=8
|
||||
BUILD_OPTIONS="--phy_simulators"
|
||||
VM_MEMORY=4096
|
||||
RUN_OPTIONS="./run_exec_autotests.bash -g \"01510*\" -q -np -b"
|
||||
NBARGS=$[$NBARGS+256]
|
||||
shift
|
||||
@@ -330,8 +331,9 @@ case $key in
|
||||
VM_NAME=ci-phy-sim
|
||||
ARCHIVES_LOC=phy_sim
|
||||
LOG_PATTERN=.Rel15.txt
|
||||
NB_PATTERN_FILES=7
|
||||
NB_PATTERN_FILES=8
|
||||
BUILD_OPTIONS="--phy_simulators"
|
||||
VM_MEMORY=4096
|
||||
RUN_OPTIONS="./run_exec_autotests.bash -g \"01510*\" -q -np -b"
|
||||
NBARGS=$[$NBARGS+256]
|
||||
;;
|
||||
|
||||
@@ -441,10 +441,16 @@ function run_test_on_vm {
|
||||
echo "############################################################"
|
||||
echo "Creating test EPC VM ($EPC_VM_NAME) on Ubuntu Cloud Image base"
|
||||
echo "############################################################"
|
||||
acquire_vm_create_lock
|
||||
uvt-kvm create $EPC_VM_NAME release=xenial --unsafe-caching
|
||||
echo "Waiting for VM to be started"
|
||||
uvt-kvm wait $EPC_VM_NAME --insecure
|
||||
release_vm_create_lock
|
||||
else
|
||||
echo "Waiting for VM to be started"
|
||||
uvt-kvm wait $EPC_VM_NAME --insecure
|
||||
fi
|
||||
|
||||
uvt-kvm wait $EPC_VM_NAME --insecure
|
||||
EPC_VM_IP_ADDR=`uvt-kvm ip $EPC_VM_NAME`
|
||||
echo "$EPC_VM_NAME has for IP addr = $EPC_VM_IP_ADDR"
|
||||
scp -o StrictHostKeyChecking=no /etc/apt/apt.conf.d/01proxy ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu
|
||||
|
||||
@@ -165,6 +165,10 @@ function check_on_vm_build {
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $NB_PATTERN_FILES -ne $NB_FOUND_FILES ]; then STATUS=-1; fi
|
||||
if [ $NB_PATTERN_FILES -ne $NB_FOUND_FILES ]
|
||||
then
|
||||
echo "Expecting $NB_PATTERN_FILES log files and found $NB_FOUND_FILES"
|
||||
STATUS=-1
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
@@ -1057,26 +1057,65 @@
|
||||
(Test2: PBCH and synchronization, 106PBR),
|
||||
(Test3: PBCH-only, 217 PRB),
|
||||
(Test4: PBCH and synchronization, 217 RPB),
|
||||
(Test5: PBCH-only, 217 PRB),
|
||||
(Test6: PBCH and synchronization, 217 PRB)</desc>
|
||||
(Test5: PBCH-only, 273 PRB),
|
||||
(Test6: PBCH and synchronization, 273 PRB)</desc>
|
||||
<pre_compile_prog></pre_compile_prog>
|
||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||
<pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</pre_exec>
|
||||
<pre_exec_args></pre_exec_args>
|
||||
<main_exec> $OPENAIR_DIR/targets/bin/nr_pbchsim.Rel15</main_exec>
|
||||
<main_exec_args>-s-11 -S-10 -n1000 -R106
|
||||
-s-11 -S-10 -n10 -I -R106
|
||||
-s-11 -S-10 -n1000 -R217 -N10
|
||||
-s-11 -S-10 -n10 -I -R217 -N10
|
||||
-s-11 -S-10 -n1000 -R273 -N20
|
||||
-s-11 -S-10 -n10 -I -R273 -N20</main_exec_args>
|
||||
<tags>nr_pbchsim.test1 nr_pbchsim.test2</tags>
|
||||
<main_exec_args>-s0 -S1 -n1000 -R106
|
||||
-s0 -S1 -n10 -I -R106
|
||||
-s0 -S1 -n1000 -R217
|
||||
-s0 -S1 -n10 -I -R217
|
||||
-s0 -S1 -n1000 -R273
|
||||
-s0 -S1 -n10 -I -R273</main_exec_args>
|
||||
<tags>nr_pbchsim.test1 nr_pbchsim.test2 nr_pbchsim.test3 nr_pbchsim.test4 nr_pbchsim.test5 nr_pbchsim.test6</tags>
|
||||
<search_expr_true>PBCH test OK</search_expr_true>
|
||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||
<nruns>3</nruns>
|
||||
</testCase>
|
||||
|
||||
<testCase id="015105">
|
||||
<class>execution</class>
|
||||
<desc>nr_dlsim Test cases. (Test1: 106 PRB),
|
||||
(Test2: 217 PRB),
|
||||
(Test3: 273 PRB)</desc>
|
||||
<pre_compile_prog></pre_compile_prog>
|
||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||
<pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</pre_exec>
|
||||
<pre_exec_args></pre_exec_args>
|
||||
<main_exec> $OPENAIR_DIR/targets/bin/nr_dlsim.Rel15</main_exec>
|
||||
<main_exec_args>-n100 -R106
|
||||
-n100 -R217
|
||||
-n100 -R273</main_exec_args>
|
||||
<tags>nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3</tags>
|
||||
<search_expr_true>PDCCH test OK</search_expr_true>
|
||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||
<nruns>3</nruns>
|
||||
</testCase>
|
||||
|
||||
<testCase id="015106">
|
||||
<class>execution</class>
|
||||
<desc>nr_dlschsim Test cases. (Test1: 106 PRB),
|
||||
(Test2: 217 PRB),
|
||||
(Test3: 273 PRB)</desc>
|
||||
<pre_compile_prog></pre_compile_prog>
|
||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||
<pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</pre_exec>
|
||||
<pre_exec_args></pre_exec_args>
|
||||
<main_exec> $OPENAIR_DIR/targets/bin/nr_dlschsim.Rel15</main_exec>
|
||||
<main_exec_args>-R 106 -m9 -s13 -n100
|
||||
-R 217 -m15 -s15 -n100
|
||||
-R 273 -m19 -s20 -n100</main_exec_args>
|
||||
<tags>nr_dlschsim.test1 nr_dlschsim.test2 nr_dlschsim.test3</tags>
|
||||
<search_expr_true>PDSCH test OK</search_expr_true>
|
||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||
<nruns>3</nruns>
|
||||
</testCase>
|
||||
|
||||
<testCase id="015110">
|
||||
<class>execution</class>
|
||||
|
||||
@@ -696,7 +696,7 @@ function main() {
|
||||
echo_info "Compiling unitary tests simulators"
|
||||
# TODO: fix: dlsim_tm4 pucchsim prachsim pdcchsim pbchsim mbmssim
|
||||
#simlist="dlsim_tm4 dlsim ulsim pucchsim prachsim pdcchsim pbchsim mbmssim"
|
||||
simlist="dlsim ulsim polartest ldpctest nr_pbchsim nr_dlschsim"
|
||||
simlist="dlsim ulsim polartest ldpctest nr_pbchsim nr_dlschsim nr_dlsim"
|
||||
for f in $simlist ; do
|
||||
compilations \
|
||||
phy_simulators $f \
|
||||
|
||||
@@ -467,33 +467,26 @@ 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);
|
||||
|
||||
uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm,
|
||||
uint32_t Tbslbrm,
|
||||
uint8_t BG,
|
||||
uint16_t Z,
|
||||
uint32_t G,
|
||||
uint8_t *w,
|
||||
uint8_t *e,
|
||||
uint8_t C,
|
||||
uint8_t rvidx,
|
||||
uint8_t Qm,
|
||||
uint8_t Nl,
|
||||
uint8_t r);
|
||||
int nr_rate_matching_ldpc(uint8_t Ilbrm,
|
||||
uint32_t Tbslbrm,
|
||||
uint8_t BG,
|
||||
uint16_t Z,
|
||||
uint8_t *w,
|
||||
uint8_t *e,
|
||||
uint8_t C,
|
||||
uint8_t rvidx,
|
||||
uint32_t E);
|
||||
|
||||
int nr_rate_matching_ldpc_rx(uint8_t Ilbrm,
|
||||
uint32_t Tbslbrm,
|
||||
uint8_t BG,
|
||||
uint16_t Z,
|
||||
uint32_t G,
|
||||
uint32_t Tbslbrm,
|
||||
uint8_t BG,
|
||||
uint16_t Z,
|
||||
int16_t *w,
|
||||
int16_t *soft_input,
|
||||
uint8_t C,
|
||||
uint8_t rvidx,
|
||||
uint8_t clear,
|
||||
uint8_t Qm,
|
||||
uint8_t Nl,
|
||||
uint8_t r,
|
||||
uint32_t *E_out);
|
||||
uint32_t E);
|
||||
|
||||
decoder_if_t phy_threegpplte_turbo_decoder;
|
||||
decoder_if_t phy_threegpplte_turbo_decoder8;
|
||||
|
||||
@@ -63,55 +63,39 @@ void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f)
|
||||
}
|
||||
|
||||
|
||||
uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm,
|
||||
uint32_t Tbslbrm,
|
||||
uint8_t BG,
|
||||
uint16_t Z,
|
||||
uint32_t G,
|
||||
uint8_t *w,
|
||||
uint8_t *e,
|
||||
uint8_t C,
|
||||
uint8_t rvidx,
|
||||
uint8_t Qm,
|
||||
uint8_t Nl,
|
||||
uint8_t r)
|
||||
int nr_rate_matching_ldpc(uint8_t Ilbrm,
|
||||
uint32_t Tbslbrm,
|
||||
uint8_t BG,
|
||||
uint16_t Z,
|
||||
uint8_t *w,
|
||||
uint8_t *e,
|
||||
uint8_t C,
|
||||
uint8_t rvidx,
|
||||
uint32_t E)
|
||||
{
|
||||
uint8_t Cprime;
|
||||
uint32_t Ncb,E,ind,k,Nref,N;
|
||||
//uint8_t *e2;
|
||||
uint32_t Ncb,ind,k,Nref,N;
|
||||
|
||||
AssertFatal(Nl>0,"Nl is 0\n");
|
||||
AssertFatal(Qm>0,"Qm is 0\n");
|
||||
if (C==0) {
|
||||
printf("nr_rate_matching: invalid parameters (C %d\n",C);
|
||||
return -1;
|
||||
}
|
||||
|
||||
//Bit selection
|
||||
N = (BG==1)?(66*Z):(50*Z);
|
||||
|
||||
if (Ilbrm == 0)
|
||||
Ncb = N;
|
||||
Ncb = N;
|
||||
else {
|
||||
Nref = 3*Tbslbrm/(2*C); //R_LBRM = 2/3
|
||||
Ncb = min(N, Nref);
|
||||
}
|
||||
|
||||
#ifdef RM_DEBUG
|
||||
printf("nr_rate_matching: Ncb %d, rvidx %d, G %d, Qm %d, Nl%d, r %d\n",Ncb,rvidx, G, Qm,Nl,r);
|
||||
#endif
|
||||
|
||||
Cprime = C; //assume CBGTI not present
|
||||
|
||||
if (r <= Cprime - ((G/(Nl*Qm))%Cprime) - 1)
|
||||
E = Nl*Qm*(G/(Nl*Qm*Cprime));
|
||||
else
|
||||
E = Nl*Qm*((G/(Nl*Qm*Cprime))+1);
|
||||
|
||||
ind = (index_k0[BG-1][rvidx]*Ncb/N)*Z;
|
||||
|
||||
#ifdef RM_DEBUG
|
||||
printf("nr_rate_matching: E %d, k0 %d Cprime %d modcprime %d\n",E,ind, Cprime,((G/(Nl*Qm))%Cprime));
|
||||
printf("nr_rate_matching_ldpc: E %d, k0 %d, Ncb %d, rvidx %d\n", E, ind, Ncb, rvidx);
|
||||
#endif
|
||||
|
||||
//e2 = e;
|
||||
|
||||
k=0;
|
||||
|
||||
for (; (ind<Ncb)&&(k<E); ind++) {
|
||||
@@ -120,7 +104,6 @@ uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm,
|
||||
printf("RM_TX k%d Ind: %d (%d)\n",k,ind,w[ind]);
|
||||
#endif
|
||||
|
||||
//if (w[ind] != NR_NULL) e2[k++]=w[ind];
|
||||
if (w[ind] != NR_NULL) e[k++]=w[ind];
|
||||
}
|
||||
|
||||
@@ -131,79 +114,60 @@ uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm,
|
||||
printf("RM_TX k%d Ind: %d (%d)\n",k,ind,w[ind]);
|
||||
#endif
|
||||
|
||||
//if (w[ind] != NR_NULL) e2[k++]=w[ind];
|
||||
if (w[ind] != NR_NULL) e[k++]=w[ind];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return(E);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nr_rate_matching_ldpc_rx(uint8_t Ilbrm,
|
||||
uint32_t Tbslbrm,
|
||||
uint8_t BG,
|
||||
uint16_t Z,
|
||||
uint32_t G,
|
||||
uint32_t Tbslbrm,
|
||||
uint8_t BG,
|
||||
uint16_t Z,
|
||||
int16_t *w,
|
||||
int16_t *soft_input,
|
||||
uint8_t C,
|
||||
uint8_t rvidx,
|
||||
uint8_t clear,
|
||||
uint8_t Qm,
|
||||
uint8_t Nl,
|
||||
uint8_t r,
|
||||
uint32_t *E_out)
|
||||
uint32_t E)
|
||||
{
|
||||
uint8_t Cprime;
|
||||
uint32_t Ncb,E,ind,k,Nref,N;
|
||||
|
||||
int16_t *soft_input2;
|
||||
uint32_t Ncb,ind,k,Nref,N;
|
||||
|
||||
#ifdef RM_DEBUG
|
||||
int nulled=0;
|
||||
#endif
|
||||
|
||||
if (C==0 || Qm==0 || Nl==0) {
|
||||
printf("nr_rate_matching: invalid parameters (C %d, Qm %d, Nl %d\n",C,Qm,Nl);
|
||||
return(-1);
|
||||
if (C==0) {
|
||||
printf("nr_rate_matching: invalid parameters (C %d\n",C);
|
||||
return -1;
|
||||
}
|
||||
|
||||
AssertFatal(Nl>0,"Nl is 0\n");
|
||||
AssertFatal(Qm>0,"Qm is 0\n");
|
||||
|
||||
//Bit selection
|
||||
N = (BG==1)?(66*Z):(50*Z);
|
||||
|
||||
if (Ilbrm == 0)
|
||||
Ncb = N;
|
||||
Ncb = N;
|
||||
else {
|
||||
Nref = (3*Tbslbrm/(2*C)); //R_LBRM = 2/3
|
||||
Ncb = min(N, Nref);
|
||||
}
|
||||
|
||||
Cprime = C; //assume CBGTI not present
|
||||
|
||||
if (r <= Cprime - ((G/(Nl*Qm))%Cprime) - 1)
|
||||
E = Nl*Qm*(G/(Nl*Qm*Cprime));
|
||||
else
|
||||
E = Nl*Qm*((G/(Nl*Qm*Cprime))+1);
|
||||
|
||||
ind = (index_k0[BG-1][rvidx]*Ncb/N)*Z;
|
||||
|
||||
#ifdef RM_DEBUG
|
||||
printf("nr_rate_matching_ldpc_rx: Clear %d, E %d, Ncb %d,rvidx %d, G %d, Qm %d, Nl%d, r %d\n",clear,E,Ncb,rvidx, G, Qm,Nl,r);
|
||||
printf("nr_rate_matching_ldpc_rx: Clear %d, E %d, k0 %d, Ncb %d, rvidx %d\n", clear, E, ind, Ncb, rvidx);
|
||||
#endif
|
||||
|
||||
if (clear==1)
|
||||
memset(w,0,Ncb*sizeof(int16_t));
|
||||
|
||||
soft_input2 = soft_input;
|
||||
k=0;
|
||||
|
||||
for (; (ind<Ncb)&&(k<E); ind++) {
|
||||
if (soft_input2[ind] != NR_NULL) {
|
||||
w[ind] += soft_input2[k++];
|
||||
if (soft_input[ind] != NR_NULL) {
|
||||
w[ind] += soft_input[k++];
|
||||
#ifdef RM_DEBUG
|
||||
printf("RM_RX k%d Ind: %d (%d)\n",k-1,ind,w[ind]);
|
||||
#endif
|
||||
@@ -220,10 +184,10 @@ int nr_rate_matching_ldpc_rx(uint8_t Ilbrm,
|
||||
|
||||
while(k<E) {
|
||||
for (ind=0; (ind<Ncb)&&(k<E); ind++) {
|
||||
if (soft_input2[ind] != NR_NULL) {
|
||||
w[ind] += soft_input2[k++];
|
||||
if (soft_input[ind] != NR_NULL) {
|
||||
w[ind] += soft_input[k++];
|
||||
#ifdef RM_DEBUG
|
||||
printf("RM_RX k%d Ind: %d (%d)(soft in %d)\n",k-1,ind,w[ind],soft_input2[k-1]);
|
||||
printf("RM_RX k%d Ind: %d (%d)(soft in %d)\n",k-1,ind,w[ind],soft_input[k-1]);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -237,7 +201,5 @@ int nr_rate_matching_ldpc_rx(uint8_t Ilbrm,
|
||||
}
|
||||
}
|
||||
|
||||
*E_out = E;
|
||||
return(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -56,11 +56,17 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
|
||||
unsigned int rx_offset;
|
||||
NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[ue->current_thread_id[Ns]][0];
|
||||
uint16_t coreset_start_subcarrier = frame_parms->first_carrier_offset;//+((int)floor(frame_parms->ssb_start_subcarrier/NR_NB_SC_PER_RB)+pdcch_vars->coreset[0].rb_offset)*NR_NB_SC_PER_RB;
|
||||
uint16_t nb_rb_coreset = 24;
|
||||
uint16_t nb_rb_coreset = 0;
|
||||
uint16_t bwp_start_subcarrier = frame_parms->first_carrier_offset;//+516;
|
||||
uint16_t nb_rb_pdsch = 50;
|
||||
uint8_t p=0;
|
||||
uint8_t l0 = 2;
|
||||
uint8_t l0 = pdcch_vars->coreset[0].duration;
|
||||
uint64_t coreset_freq_dom = pdcch_vars->coreset[0].frequencyDomainResources;
|
||||
for (int i = 0; i < 45; i++) {
|
||||
if (((coreset_freq_dom & 0x1FFFFFFFFFFF) >> i) & 0x1) nb_rb_coreset++;
|
||||
}
|
||||
nb_rb_coreset = 6 * nb_rb_coreset;
|
||||
//printf("corset duration %d nb_rb_coreset %d\n", l0, nb_rb_coreset);
|
||||
|
||||
void (*dft)(int16_t *,int16_t *, int);
|
||||
int tmp_dft_in[8192] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs
|
||||
|
||||
@@ -137,7 +137,9 @@ int set_pss_nr(int ofdm_symbol_size);
|
||||
int pss_synchro_nr(PHY_VARS_NR_UE *PHY_vars_UE, int rate_change);
|
||||
int pss_search_time_nr(int **rxdata, ///rx data in time domain
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
int *eNB_id);
|
||||
int fo_flag,
|
||||
int *eNB_id,
|
||||
int *f_off);
|
||||
|
||||
#endif
|
||||
#undef EXTERN
|
||||
|
||||
@@ -90,6 +90,8 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch,
|
||||
@param nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs */
|
||||
uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs,uint8_t Qm, uint8_t Nl);
|
||||
|
||||
uint32_t nr_get_E(uint32_t G, uint8_t C, uint8_t Qm, uint8_t Nl, uint8_t r);
|
||||
|
||||
void free_gNB_dlsch(NR_gNB_DLSCH_t *dlsch);
|
||||
|
||||
void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch);
|
||||
|
||||
@@ -280,7 +280,7 @@ int nr_dlsch_encoding(unsigned char *a,
|
||||
uint32_t A, Z;
|
||||
uint32_t *pz = &Z;
|
||||
uint8_t mod_order = rel15.modulation_order;
|
||||
uint16_t Kr=0,r,r_offset=0;//Kr_bytes
|
||||
uint16_t Kr=0,r,r_offset=0,Kr_bytes;
|
||||
uint8_t *d_tmp[MAX_NUM_DLSCH_SEGMENTS];
|
||||
uint8_t kb,BG=1;
|
||||
uint32_t E;
|
||||
@@ -346,7 +346,7 @@ int nr_dlsch_encoding(unsigned char *a,
|
||||
}
|
||||
|
||||
Kr = dlsch->harq_processes[harq_pid]->K;
|
||||
//Kr_bytes = Kr>>3;
|
||||
Kr_bytes = Kr>>3;
|
||||
|
||||
//printf("segment Z %d kb %d k %d Kr %d BG %d\n", *pz,kb,dlsch->harq_processes[harq_pid]->K,Kr,BG);
|
||||
|
||||
@@ -403,25 +403,24 @@ int nr_dlsch_encoding(unsigned char *a,
|
||||
|
||||
//start_meas(rm_stats);
|
||||
#ifdef DEBUG_DLSCH_CODING
|
||||
printf("rvidx in encoding = %d\n", dlsch->harq_processes[harq_pid]->rvidx);
|
||||
printf("rvidx in encoding = %d\n", rel15.redundancy_version);
|
||||
#endif
|
||||
|
||||
E = nr_rate_matching_ldpc(Ilbrm,
|
||||
Tbslbrm,
|
||||
BG,
|
||||
*pz,
|
||||
G,
|
||||
dlsch->harq_processes[harq_pid]->d[r],
|
||||
dlsch->harq_processes[harq_pid]->e+r_offset,
|
||||
dlsch->harq_processes[harq_pid]->C,
|
||||
rel15.redundancy_version,
|
||||
mod_order,
|
||||
rel15.nb_layers,
|
||||
r);
|
||||
E = nr_get_E(G, dlsch->harq_processes[harq_pid]->C, mod_order, rel15.nb_layers, r);
|
||||
|
||||
nr_rate_matching_ldpc(Ilbrm,
|
||||
Tbslbrm,
|
||||
BG,
|
||||
*pz,
|
||||
dlsch->harq_processes[harq_pid]->d[r],
|
||||
dlsch->harq_processes[harq_pid]->e+r_offset,
|
||||
dlsch->harq_processes[harq_pid]->C,
|
||||
rel15.redundancy_version,
|
||||
E);
|
||||
|
||||
#ifdef DEBUG_DLSCH_CODING
|
||||
for (int i =0; i<16; i++)
|
||||
printf("output ratematching e[%d]= %d r_offset %d\n", i,dlsch->harq_processes[harq_pid]->e[i], r_offset);
|
||||
printf("output ratematching e[%d]= %d r_offset %d\n", i,dlsch->harq_processes[harq_pid]->e[i+r_offset], r_offset);
|
||||
#endif
|
||||
//stop_meas(rm_stats);
|
||||
|
||||
@@ -432,18 +431,15 @@ int nr_dlsch_encoding(unsigned char *a,
|
||||
dlsch->harq_processes[harq_pid]->f+r_offset);
|
||||
//stop_meas(i_stats);
|
||||
|
||||
r_offset += E;
|
||||
#ifdef DEBUG_DLSCH_CODING
|
||||
for (int i =0; i<16; i++)
|
||||
printf("output interleaving f[%d]= %d r_offset %d\n", i,dlsch->harq_processes[harq_pid]->f[i+r*r_offset], r_offset);
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_DLSCH_CODING
|
||||
printf("output interleaving f[%d]= %d r_offset %d\n", i,dlsch->harq_processes[harq_pid]->f[i+r_offset], r_offset);
|
||||
|
||||
if (r==dlsch->harq_processes[harq_pid]->C-1)
|
||||
write_output("enc_output.m","enc",dlsch->harq_processes[harq_pid]->f,r_offset,1,4);
|
||||
|
||||
write_output("enc_output.m","enc",dlsch->harq_processes[harq_pid]->f,G,1,4);
|
||||
#endif
|
||||
|
||||
r_offset += E;
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT);
|
||||
|
||||
@@ -176,3 +176,18 @@ uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16
|
||||
G = ((NR_NB_SC_PER_RB*nb_symb_sch)-(nb_re_dmrs*length_dmrs))*nb_rb*Qm*Nl;
|
||||
return(G);
|
||||
}
|
||||
|
||||
uint32_t nr_get_E(uint32_t G, uint8_t C, uint8_t Qm, uint8_t Nl, uint8_t r) {
|
||||
uint32_t E;
|
||||
uint8_t Cprime = C; //assume CBGTI not present
|
||||
|
||||
AssertFatal(Nl>0,"Nl is 0\n");
|
||||
AssertFatal(Qm>0,"Qm is 0\n");
|
||||
|
||||
if (r <= Cprime - ((G/(Nl*Qm))%Cprime) - 1)
|
||||
E = Nl*Qm*(G/(Nl*Qm*Cprime));
|
||||
else
|
||||
E = Nl*Qm*((G/(Nl*Qm*Cprime))+1);
|
||||
|
||||
return E;
|
||||
}
|
||||
|
||||
@@ -821,8 +821,8 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
||||
|
||||
#ifdef NR_PDCCH_DCI_DEBUG
|
||||
printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> symbol_mon=(%d) and start_symbol=(%d)\n",symbol_mon,start_symbol);
|
||||
printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> coreset_freq_dom=(%ld) n_rb_offset=(%d) coreset_time_dur=(%d) n_shift=(%d) reg_bundle_size_L=(%d) coreset_interleaver_size_R=(%d) \n",
|
||||
coreset_freq_dom,n_rb_offset,coreset_time_dur,n_shift,reg_bundle_size_L,coreset_interleaver_size_R);
|
||||
printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> coreset_freq_dom=(%ld) n_rb_offset=(%d) coreset_time_dur=(%d) n_shift=(%d) reg_bundle_size_L=(%d) coreset_interleaver_size_R=(%d) scrambling_ID=(%d) \n",
|
||||
coreset_freq_dom,n_rb_offset,coreset_time_dur,n_shift,reg_bundle_size_L,coreset_interleaver_size_R,pdcch_DMRS_scrambling_id);
|
||||
#endif
|
||||
|
||||
//
|
||||
|
||||
@@ -376,6 +376,22 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
||||
for (r=0; r<harq_process->C; r++) {
|
||||
|
||||
//printf("start rx segment %d\n",r);
|
||||
E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
start_meas(dlsch_deinterleaving_stats);
|
||||
#endif
|
||||
nr_deinterleaving_ldpc(E,
|
||||
harq_process->Qm,
|
||||
harq_process->w[r],
|
||||
dlsch_llr+r_offset);
|
||||
|
||||
//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);
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
stop_meas(dlsch_deinterleaving_stats);
|
||||
#endif
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
start_meas(dlsch_rate_unmatching_stats);
|
||||
@@ -394,20 +410,15 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
||||
#endif
|
||||
|
||||
if (nr_rate_matching_ldpc_rx(Ilbrm,
|
||||
Tbslbrm,
|
||||
p_decParams->BG,
|
||||
p_decParams->Z,
|
||||
G,
|
||||
harq_process->w[r],
|
||||
dlsch_llr+r_offset,
|
||||
harq_process->C,
|
||||
harq_process->rvidx,
|
||||
(harq_process->round==0)?1:0,
|
||||
harq_process->Qm,
|
||||
harq_process->Nl,
|
||||
r,
|
||||
&E)==-1) {
|
||||
|
||||
Tbslbrm,
|
||||
p_decParams->BG,
|
||||
p_decParams->Z,
|
||||
harq_process->d[r],
|
||||
harq_process->w[r],
|
||||
harq_process->C,
|
||||
harq_process->rvidx,
|
||||
(harq_process->round==0)?1:0,
|
||||
E)==-1) {
|
||||
#if UE_TIMING_TRACE
|
||||
stop_meas(dlsch_rate_unmatching_stats);
|
||||
#endif
|
||||
@@ -419,27 +430,13 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
||||
stop_meas(dlsch_rate_unmatching_stats);
|
||||
#endif
|
||||
}
|
||||
|
||||
//for (int i =0; i<16; i++)
|
||||
// printf("rx output ratematching d[%d]= %d r_offset %d\n", i,harq_process->d[r][i], r_offset);
|
||||
|
||||
r_offset += E;
|
||||
|
||||
//for (int i =0; i<16; i++)
|
||||
// printf("rx output ratematching w[%d]= %d r_offset %d\n", i,harq_process->w[r][i], r_offset);
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
start_meas(dlsch_deinterleaving_stats);
|
||||
#endif
|
||||
nr_deinterleaving_ldpc(E,
|
||||
harq_process->Qm,
|
||||
harq_process->d[r],
|
||||
harq_process->w[r]);
|
||||
|
||||
//for (int i =0; i<16; i++)
|
||||
// printf("rx output interleaving d[%d]= %d r_offset %d\n", i,harq_process->d[r][i], r_offset);
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
stop_meas(dlsch_deinterleaving_stats);
|
||||
#endif
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
|
||||
if (r==0) {
|
||||
write_output("decoder_llr.m","decllr",dlsch_llr,G,1,0);
|
||||
write_output("decoder_in.m","dec",&harq_process->d[0][0],(3*8*Kr_bytes)+12,1,0);
|
||||
@@ -979,6 +976,30 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment
|
||||
|
||||
Tbslbrm = nr_compute_tbs(28,nb_rb,frame_parms->symbols_per_slot,0,0, harq_process->Nl);
|
||||
|
||||
E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
|
||||
|
||||
/*
|
||||
printf("Subblock deinterleaving, dlsch_llr %p, w %p\n",
|
||||
dlsch_llr+r_offset,
|
||||
&harq_process->w[r]);
|
||||
*/
|
||||
#if UE_TIMING_TRACE
|
||||
start_meas(dlsch_deinterleaving_stats);
|
||||
#endif
|
||||
nr_deinterleaving_ldpc(E,
|
||||
harq_process->Qm,
|
||||
harq_process->w[r],
|
||||
dlsch_llr+r_offset);
|
||||
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
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);
|
||||
#endif
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
stop_meas(dlsch_deinterleaving_stats);
|
||||
#endif
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
start_meas(dlsch_rate_unmatching_stats);
|
||||
#endif
|
||||
@@ -995,23 +1016,16 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment
|
||||
harq_process->round);
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
printf(" in decoding dlsch->harq_processes[harq_pid]->rvidx = %d\n", dlsch->harq_processes[harq_pid]->rvidx);
|
||||
#endif
|
||||
if (nr_rate_matching_ldpc_rx(Ilbrm,
|
||||
Tbslbrm,
|
||||
p_decParams->BG,
|
||||
p_decParams->Z,
|
||||
G,
|
||||
harq_process->w[r],
|
||||
dlsch_llr+r_offset,
|
||||
harq_process->C,
|
||||
harq_process->rvidx,
|
||||
(harq_process->round==0)?1:0,
|
||||
harq_process->Qm,
|
||||
harq_process->Nl,
|
||||
r,
|
||||
&E)==-1) {
|
||||
Tbslbrm,
|
||||
p_decParams->BG,
|
||||
p_decParams->Z,
|
||||
harq_process->d[r],
|
||||
harq_process->w[r],
|
||||
harq_process->C,
|
||||
harq_process->rvidx,
|
||||
(harq_process->round==0)?1:0,
|
||||
E)==-1) {
|
||||
#if UE_TIMING_TRACE
|
||||
stop_meas(dlsch_rate_unmatching_stats);
|
||||
#endif
|
||||
@@ -1023,34 +1037,18 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment
|
||||
stop_meas(dlsch_rate_unmatching_stats);
|
||||
#endif
|
||||
}
|
||||
|
||||
//for (int i =0; i<16; i++)
|
||||
// printf("rx output ratematching d[%d]= %d r_offset %d\n", i,harq_process->d[r][i], r_offset);
|
||||
|
||||
//r_offset += E;
|
||||
//printf("main thread r_offset %d\n",r_offset);
|
||||
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
for (int i =0; i<16; i++)
|
||||
printf("rx output ratematching w[%d]= %d r_offset %d\n", i,harq_process->w[r][i], r_offset);
|
||||
printf("rx output ratematching d[%d]= %d r_offset %d\n", i,harq_process->d[r][i], r_offset);
|
||||
#endif
|
||||
|
||||
/*
|
||||
printf("Subblock deinterleaving, d %p w %p\n",
|
||||
harq_process->d[r],
|
||||
harq_process->w);
|
||||
*/
|
||||
#if UE_TIMING_TRACE
|
||||
start_meas(dlsch_deinterleaving_stats);
|
||||
#endif
|
||||
nr_deinterleaving_ldpc(E,
|
||||
harq_process->Qm,
|
||||
harq_process->d[r],
|
||||
harq_process->w[r]);
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
for (int i =0; i<16; i++)
|
||||
printf("rx output interleaving d[%d]= %d r_offset %d\n", i,harq_process->d[r][i], r_offset);
|
||||
#endif
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
stop_meas(dlsch_deinterleaving_stats);
|
||||
#endif
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
|
||||
if (r==0) {
|
||||
@@ -1526,6 +1524,23 @@ void *nr_dlsch_decoding_2thread0(void *arg)
|
||||
|
||||
Tbslbrm = nr_compute_tbs(28,nb_rb,frame_parms->symbols_per_slot,0,0, harq_process->Nl);
|
||||
|
||||
E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
start_meas(dlsch_deinterleaving_stats);
|
||||
#endif
|
||||
nr_deinterleaving_ldpc(E,
|
||||
harq_process->Qm,
|
||||
harq_process->w[r],
|
||||
dlsch_llr+r_offset);
|
||||
|
||||
//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);
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
stop_meas(dlsch_deinterleaving_stats);
|
||||
#endif
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
start_meas(dlsch_rate_unmatching_stats);
|
||||
#endif
|
||||
@@ -1542,23 +1557,16 @@ void *nr_dlsch_decoding_2thread0(void *arg)
|
||||
harq_process->round);
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
printf(" in decoding dlsch->harq_processes[harq_pid]->rvidx = %d\n", dlsch->harq_processes[harq_pid]->rvidx);
|
||||
#endif
|
||||
if (nr_rate_matching_ldpc_rx(Ilbrm,
|
||||
Tbslbrm,
|
||||
p_decParams->BG,
|
||||
p_decParams->Z,
|
||||
G,
|
||||
harq_process->w[r],
|
||||
dlsch_llr+r_offset,
|
||||
harq_process->C,
|
||||
harq_process->rvidx,
|
||||
(harq_process->round==0)?1:0,
|
||||
harq_process->Qm,
|
||||
harq_process->Nl,
|
||||
r,
|
||||
&E)==-1) {
|
||||
Tbslbrm,
|
||||
p_decParams->BG,
|
||||
p_decParams->Z,
|
||||
harq_process->d[r],
|
||||
harq_process->w[r],
|
||||
harq_process->C,
|
||||
harq_process->rvidx,
|
||||
(harq_process->round==0)?1:0,
|
||||
E)==-1) {
|
||||
#if UE_TIMING_TRACE
|
||||
stop_meas(dlsch_rate_unmatching_stats);
|
||||
#endif
|
||||
@@ -1570,23 +1578,13 @@ void *nr_dlsch_decoding_2thread0(void *arg)
|
||||
stop_meas(dlsch_rate_unmatching_stats);
|
||||
#endif
|
||||
}
|
||||
//r_offset += E;
|
||||
|
||||
//for (int i =0; i<16; i++)
|
||||
// printf("rx output ratematching w[%d]= %d r_offset %d\n", i,harq_process->w[r][i], r_offset);
|
||||
// printf("rx output ratematching d[%d]= %d r_offset %d\n", i,harq_process->d[r][i], r_offset);
|
||||
|
||||
//r_offset += E;
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
start_meas(dlsch_deinterleaving_stats);
|
||||
#endif
|
||||
nr_deinterleaving_ldpc(E,
|
||||
harq_process->Qm,
|
||||
harq_process->d[r],
|
||||
harq_process->w[r]);
|
||||
#if UE_TIMING_TRACE
|
||||
stop_meas(dlsch_deinterleaving_stats);
|
||||
#endif
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
|
||||
if (r==0) {
|
||||
write_output("decoder_llr.m","decllr",dlsch_llr,G,1,0);
|
||||
write_output("decoder_in.m","dec",&harq_process->d[0][0],(3*8*Kr_bytes)+12,1,0);
|
||||
@@ -2043,6 +2041,28 @@ void *nr_dlsch_decoding_2thread1(void *arg)
|
||||
|
||||
Tbslbrm = nr_compute_tbs(28,nb_rb,frame_parms->symbols_per_slot,0,0, harq_process->Nl);
|
||||
|
||||
E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
|
||||
|
||||
/*
|
||||
printf("Subblock deinterleaving, d %p w %p\n",
|
||||
harq_process->d[r],
|
||||
harq_process->w);
|
||||
*/
|
||||
#if UE_TIMING_TRACE
|
||||
start_meas(dlsch_deinterleaving_stats);
|
||||
#endif
|
||||
nr_deinterleaving_ldpc(E,
|
||||
harq_process->Qm,
|
||||
harq_process->w[r],
|
||||
dlsch_llr+r_offset);
|
||||
|
||||
//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);
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
stop_meas(dlsch_deinterleaving_stats);
|
||||
#endif
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
start_meas(dlsch_rate_unmatching_stats);
|
||||
#endif
|
||||
@@ -2059,23 +2079,16 @@ void *nr_dlsch_decoding_2thread1(void *arg)
|
||||
harq_process->round);
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
printf(" in decoding dlsch->harq_processes[harq_pid]->rvidx = %d\n", dlsch->harq_processes[harq_pid]->rvidx);
|
||||
#endif
|
||||
if (nr_rate_matching_ldpc_rx(Ilbrm,
|
||||
Tbslbrm,
|
||||
p_decParams->BG,
|
||||
p_decParams->Z,
|
||||
G,
|
||||
harq_process->d[r],
|
||||
harq_process->w[r],
|
||||
dlsch_llr+r_offset,
|
||||
harq_process->C,
|
||||
harq_process->rvidx,
|
||||
(harq_process->round==0)?1:0,
|
||||
harq_process->Qm,
|
||||
harq_process->Nl,
|
||||
r,
|
||||
&E)==-1) {
|
||||
E)==-1) {
|
||||
#if UE_TIMING_TRACE
|
||||
stop_meas(dlsch_rate_unmatching_stats);
|
||||
#endif
|
||||
@@ -2087,23 +2100,12 @@ void *nr_dlsch_decoding_2thread1(void *arg)
|
||||
stop_meas(dlsch_rate_unmatching_stats);
|
||||
#endif
|
||||
}
|
||||
|
||||
//for (int i =0; i<16; i++)
|
||||
// printf("rx output ratematching d[%d]= %d r_offset %d\n", i,harq_process->d[r][i], r_offset);
|
||||
|
||||
//r_offset += E;
|
||||
|
||||
/*
|
||||
printf("Subblock deinterleaving, d %p w %p\n",
|
||||
harq_process->d[r],
|
||||
harq_process->w);
|
||||
*/
|
||||
#if UE_TIMING_TRACE
|
||||
start_meas(dlsch_deinterleaving_stats);
|
||||
#endif
|
||||
nr_deinterleaving_ldpc(E,
|
||||
harq_process->Qm,
|
||||
harq_process->d[r],
|
||||
harq_process->w[r]);
|
||||
#if UE_TIMING_TRACE
|
||||
stop_meas(dlsch_deinterleaving_stats);
|
||||
#endif
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
if (r==0) {
|
||||
write_output("decoder_llr.m","decllr",dlsch_llr,G,1,0);
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
//#include "SCHED/extern.h"
|
||||
|
||||
#include "common_lib.h"
|
||||
#include <math.h>
|
||||
|
||||
#include "PHY/NR_REFSIG/pss_nr.h"
|
||||
#include "PHY/NR_REFSIG/sss_nr.h"
|
||||
@@ -56,6 +57,7 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, runmode_t mode)
|
||||
NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
|
||||
int ret =-1;
|
||||
|
||||
|
||||
#ifdef DEBUG_INITIAL_SYNCH
|
||||
LOG_I(PHY,"[UE%d] Initial sync: starting PBCH detection (rx_offset %d)\n",ue->Mod_id,
|
||||
ue->rx_offset);
|
||||
@@ -65,6 +67,7 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, runmode_t mode)
|
||||
int nb_prefix_samples0 = frame_parms->nb_prefix_samples0;
|
||||
frame_parms->nb_prefix_samples0 = frame_parms->nb_prefix_samples;
|
||||
|
||||
|
||||
//symbol 1
|
||||
nr_slot_fep(ue,
|
||||
1,
|
||||
@@ -143,6 +146,7 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode)
|
||||
int32_t sync_pos, sync_pos_slot; // k_ssb, N_ssb_crb, sync_pos2,
|
||||
int32_t metric_tdd_ncp=0;
|
||||
uint8_t phase_tdd_ncp;
|
||||
double im, re;
|
||||
|
||||
NR_DL_FRAME_PARMS *fp = &ue->frame_parms;
|
||||
int ret=-1;
|
||||
@@ -183,14 +187,14 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode)
|
||||
sync_pos = pss_synchro_nr(ue, NO_RATE_CHANGE);
|
||||
|
||||
sync_pos_slot = (fp->samples_per_subframe/fp->slots_per_subframe) - 10*(fp->ofdm_symbol_size + fp->nb_prefix_samples);
|
||||
|
||||
|
||||
if (sync_pos >= fp->nb_prefix_samples){
|
||||
ue->ssb_offset = sync_pos - fp->nb_prefix_samples;}
|
||||
else{
|
||||
ue->ssb_offset = sync_pos + (fp->samples_per_subframe * 10) - fp->nb_prefix_samples;}
|
||||
|
||||
ue->rx_offset = ue->ssb_offset - sync_pos_slot;
|
||||
|
||||
ue->rx_offset = ue->ssb_offset - sync_pos_slot;
|
||||
|
||||
//write_output("rxdata1.m","rxd1",ue->common_vars.rxdata[0],10*fp->samples_per_subframe,1,1);
|
||||
|
||||
#ifdef DEBUG_INITIAL_SYNCH
|
||||
@@ -198,6 +202,25 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode)
|
||||
LOG_I(PHY,"sync_pos %d ssb_offset %d sync_pos_slot %d \n",sync_pos,ue->ssb_offset,sync_pos_slot);
|
||||
#endif
|
||||
|
||||
// digital compensation of FFO for SSB symbols
|
||||
if (ue->UE_fo_compensation){
|
||||
double s_time = 1/(1.0e3*fp->samples_per_subframe); // sampling time
|
||||
double off_angle = -2*M_PI*s_time*(ue->common_vars.freq_offset); // offset rotation angle compensation per sample
|
||||
|
||||
int start = ue->ssb_offset; // start for offset correction is at ssb_offset (pss time position)
|
||||
int end = start + 4*(fp->ofdm_symbol_size + fp->nb_prefix_samples); // loop over samples in 4 symbols (ssb size), including prefix
|
||||
|
||||
for(int n=start; n<end; n++){
|
||||
for (int ar=0; ar<fp->nb_antennas_rx; ar++) {
|
||||
re = ((double)(((short *)ue->common_vars.rxdata[ar]))[2*n]);
|
||||
im = ((double)(((short *)ue->common_vars.rxdata[ar]))[2*n+1]);
|
||||
((short *)ue->common_vars.rxdata[ar])[2*n] = (short)(round(re*cos(n*off_angle) - im*sin(n*off_angle)));
|
||||
((short *)ue->common_vars.rxdata[ar])[2*n+1] = (short)(round(re*sin(n*off_angle) + im*cos(n*off_angle)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* check that SSS/PBCH block is continuous inside the received buffer */
|
||||
if (sync_pos < (NR_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_subframe - (NB_SYMBOLS_PBCH * fp->ofdm_symbol_size))) {
|
||||
|
||||
@@ -244,7 +267,8 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode)
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
/* Consider this is a false detection if the offset is > 1000 Hz */
|
||||
/* Consider this is a false detection if the offset is > 1000 Hz
|
||||
Not to be used now that offest estimation is in place
|
||||
if( (abs(ue->common_vars.freq_offset) > 150) && (ret == 0) )
|
||||
{
|
||||
ret=-1;
|
||||
@@ -253,7 +277,7 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode)
|
||||
#else
|
||||
LOG_E(HW, "Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset);
|
||||
#endif
|
||||
}
|
||||
}*/
|
||||
|
||||
if (ret==0) { // PBCH found so indicate sync to higher layers and configure frame parameters
|
||||
|
||||
@@ -329,13 +353,13 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode)
|
||||
printf("[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n",
|
||||
ue->Mod_id,
|
||||
ue->proc.proc_rxtx[0].frame_rx,
|
||||
openair0_cfg[0].rx_freq[0]-ue->common_vars.freq_offset,
|
||||
openair0_cfg[0].rx_freq[0]+ue->common_vars.freq_offset,
|
||||
ue->common_vars.freq_offset);
|
||||
# else
|
||||
LOG_I(PHY, "[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n",
|
||||
ue->Mod_id,
|
||||
ue->proc.proc_rxtx[0].frame_rx,
|
||||
openair0_cfg[0].rx_freq[0]-ue->common_vars.freq_offset,
|
||||
openair0_cfg[0].rx_freq[0]+ue->common_vars.freq_offset,
|
||||
ue->common_vars.freq_offset);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "PHY/defs_nr_UE.h"
|
||||
|
||||
@@ -662,6 +663,7 @@ int pss_synchro_nr(PHY_VARS_NR_UE *PHY_vars_UE, int rate_change)
|
||||
NR_DL_FRAME_PARMS *frame_parms = &(PHY_vars_UE->frame_parms);
|
||||
int synchro_position;
|
||||
int **rxdata = NULL;
|
||||
int fo_flag = PHY_vars_UE->UE_fo_compensation; // flag to enable freq offset estimation and compensation
|
||||
|
||||
#ifdef DBG_PSS_NR
|
||||
|
||||
@@ -705,7 +707,10 @@ int pss_synchro_nr(PHY_VARS_NR_UE *PHY_vars_UE, int rate_change)
|
||||
|
||||
synchro_position = pss_search_time_nr(rxdata,
|
||||
frame_parms,
|
||||
(int *)&PHY_vars_UE->common_vars.eNb_id);
|
||||
fo_flag,
|
||||
(int *)&PHY_vars_UE->common_vars.eNb_id,
|
||||
(int *)&PHY_vars_UE->common_vars.freq_offset);
|
||||
|
||||
|
||||
#if TEST_SYNCHRO_TIMING_PSS
|
||||
|
||||
@@ -751,6 +756,15 @@ static inline int64_t abs64(int64_t x)
|
||||
return (((int64_t)((int32_t*)&x)[0])*((int64_t)((int32_t*)&x)[0]) + ((int64_t)((int32_t*)&x)[1])*((int64_t)((int32_t*)&x)[1]));
|
||||
}
|
||||
|
||||
static inline double angle64(int64_t x)
|
||||
{
|
||||
|
||||
double re=((int32_t*)&x)[0];
|
||||
double im=((int32_t*)&x)[1];
|
||||
return (atan2(im,re));
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************
|
||||
*
|
||||
* NAME : pss_search_time_nr
|
||||
@@ -803,47 +817,28 @@ static inline int64_t abs64(int64_t x)
|
||||
|
||||
#define DOT_PRODUCT_SCALING_SHIFT (17)
|
||||
|
||||
int max3(int64_t a, int64_t b, int64_t c) {
|
||||
if (a>b) {
|
||||
if (a>c) {
|
||||
return(0);
|
||||
}
|
||||
else {
|
||||
return(2);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (b>c) {
|
||||
return(1);
|
||||
}
|
||||
else {
|
||||
return(2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int pss_search_time_nr(int **rxdata, ///rx data in time domain
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
int *eNB_id)
|
||||
int fo_flag,
|
||||
int *eNB_id,
|
||||
int *f_off)
|
||||
{
|
||||
uint8_t L_max = 4;
|
||||
unsigned int m, n, ar, n_peaks=0;
|
||||
unsigned int peak_position[3*L_max], pss_source[3*L_max];
|
||||
int64_t peak_value, threshold;
|
||||
unsigned int n, ar, peak_position, pss_source;
|
||||
int64_t peak_value;
|
||||
int64_t result;
|
||||
int64_t avg[NUMBER_PSS_SEQUENCE];
|
||||
uint8_t found_peak=0;
|
||||
double ffo_est=0;
|
||||
|
||||
|
||||
unsigned int length = (NR_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_subframe); /* 1 frame for now, it should be 2 TODO_NR */
|
||||
|
||||
AssertFatal(length>0,"illegal length %d\n",length);
|
||||
for (int i = 0; i < NUMBER_PSS_SEQUENCE; i++) AssertFatal(pss_corr_ue[i] != NULL,"pss_corr_ue[%d] not yet allocated! Exiting.\n", i);
|
||||
|
||||
for (int i=0;i<4;i++) {
|
||||
peak_position[i] = length; //max possible value
|
||||
pss_source[i] = 0;
|
||||
}
|
||||
|
||||
peak_value = 0;
|
||||
peak_position = 0;
|
||||
pss_source = 0;
|
||||
|
||||
int maxval=0;
|
||||
for (int i=0;i<2*(frame_parms->ofdm_symbol_size);i++) {
|
||||
@@ -853,7 +848,6 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain
|
||||
maxval = max(maxval,-primary_synchro_time_nr[1][i]);
|
||||
maxval = max(maxval,primary_synchro_time_nr[2][i]);
|
||||
maxval = max(maxval,-primary_synchro_time_nr[2][i]);
|
||||
|
||||
}
|
||||
int shift = log2_approx(maxval);//*(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*2);
|
||||
|
||||
@@ -866,9 +860,9 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain
|
||||
memset(pss_corr_ue[pss_index],0,length*sizeof(int64_t));
|
||||
}
|
||||
|
||||
for (int pss_index = 0; pss_index < NUMBER_PSS_SEQUENCE; pss_index++) {
|
||||
for (n=0; n < length; n+=4) { //
|
||||
|
||||
for (n=0; n < length; n+=4) { //
|
||||
for (int pss_index = 0; pss_index < NUMBER_PSS_SEQUENCE; pss_index++) {
|
||||
|
||||
if ( n < (length - frame_parms->ofdm_symbol_size)) {
|
||||
|
||||
@@ -881,7 +875,6 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain
|
||||
frame_parms->ofdm_symbol_size,
|
||||
shift);
|
||||
pss_corr_ue[pss_index][n] += abs64(result);
|
||||
|
||||
//((short*)pss_corr_ue[pss_index])[2*n] += ((short*) &result)[0]; /* real part */
|
||||
//((short*)pss_corr_ue[pss_index])[2*n+1] += ((short*) &result)[1]; /* imaginary part */
|
||||
//((short*)&synchro_out)[0] += ((int*) &result)[0]; /* real part */
|
||||
@@ -889,43 +882,64 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* calculate the absolute value of sync_corr[n] */
|
||||
avg[pss_index]+=pss_corr_ue[pss_index][n];
|
||||
}
|
||||
|
||||
avg[pss_index]/=(length/4);
|
||||
}
|
||||
|
||||
threshold = 10*avg[max3(avg[0],avg[1],avg[2])];
|
||||
peak_value = threshold;
|
||||
|
||||
for (n=0; n < length; n+=4) {
|
||||
|
||||
m = max3(pss_corr_ue[0][n],pss_corr_ue[1][n],pss_corr_ue[2][n]);
|
||||
|
||||
if (pss_corr_ue[m][n] > peak_value) {
|
||||
peak_value = pss_corr_ue[m][n];
|
||||
peak_position[n_peaks] = n;
|
||||
pss_source[n_peaks] = m;
|
||||
found_peak = 1;
|
||||
}
|
||||
|
||||
if ((peak_position[n_peaks]+4*(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)<n) &&
|
||||
(found_peak==1)) {
|
||||
//#ifdef DEBUG_PSS_NR
|
||||
printf("peak %d found at pss_index %d, n %6d, peak_value %15llu\n", n_peaks, pss_source[n_peaks], peak_position[n_peaks], (unsigned long long)pss_corr_ue[ pss_source[n_peaks]][peak_position[n_peaks]]);
|
||||
//#endif
|
||||
peak_value = threshold;
|
||||
found_peak = 0;
|
||||
n_peaks++;
|
||||
//if (n_peaks==L_max) break;
|
||||
if (pss_corr_ue[pss_index][n] > peak_value) {
|
||||
peak_value = pss_corr_ue[pss_index][n];
|
||||
peak_position = n;
|
||||
pss_source = pss_index;
|
||||
|
||||
#ifdef DEBUG_PSS_NR
|
||||
printf("pss_index %d: n %6d peak_value %15llu\n", pss_index, n, (unsigned long long)pss_corr_ue[pss_index][n]);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*eNB_id = pss_source[0];
|
||||
if (fo_flag){
|
||||
// fractional frequency offser computation according to Cross-correlation Synchronization Algorithm Using PSS
|
||||
// Shoujun Huang, Yongtao Su, Ying He and Shan Tang, "Joint time and frequency offset estimation in LTE downlink," 7th International Conference on Communications and Networking in China, 2012.
|
||||
|
||||
int64_t result1,result2;
|
||||
// Computing cross-correlation at peak on half the symbol size for first half of data
|
||||
result1 = dot_product64((short*)primary_synchro_time_nr[pss_source],
|
||||
(short*) &(rxdata[0][peak_position]),
|
||||
frame_parms->ofdm_symbol_size>>1,
|
||||
shift);
|
||||
// Computing cross-correlation at peak on half the symbol size for data shifted by half symbol size
|
||||
// as it is real and complex it is necessary to shift by a value equal to symbol size to obtain such shift
|
||||
result2 = dot_product64((short*)primary_synchro_time_nr[pss_source]+(frame_parms->ofdm_symbol_size),
|
||||
(short*) &(rxdata[0][peak_position])+(frame_parms->ofdm_symbol_size),
|
||||
frame_parms->ofdm_symbol_size>>1,
|
||||
shift);
|
||||
|
||||
int64_t re1,re2,im1,im2;
|
||||
re1=((int*) &result1)[0];
|
||||
re2=((int*) &result2)[0];
|
||||
im1=((int*) &result1)[1];
|
||||
im2=((int*) &result2)[1];
|
||||
|
||||
// estimation of fractional frequency offset: angle[(result1)'*(result2)]/pi
|
||||
ffo_est=atan2(re1*im2-re2*im1,re1*re2+im1*im2)/M_PI;
|
||||
|
||||
#ifdef DBG_PSS_NR
|
||||
printf("ffo %lf\n",ffo_est);
|
||||
#endif
|
||||
}
|
||||
|
||||
// computing absolute value of frequency offset
|
||||
*f_off = ffo_est*frame_parms->subcarrier_spacing;
|
||||
|
||||
for (int pss_index = 0; pss_index < NUMBER_PSS_SEQUENCE; pss_index++) avg[pss_index]/=(length/4);
|
||||
|
||||
*eNB_id = pss_source;
|
||||
|
||||
LOG_I(PHY,"[UE] nr_synchro_time: Sync source = %d, Peak found at pos %d, val = %llu (%d dB) avg %d dB, ffo %lf\n", pss_source, peak_position, (unsigned long long)peak_value, dB_fixed64(peak_value),dB_fixed64(avg[pss_source]),ffo_est);
|
||||
|
||||
if (peak_value < 5*avg[pss_source])
|
||||
return(-1);
|
||||
|
||||
//LOG_I(PHY,"[UE] nr_synchro_time: Sync source = %d, Peak found at pos %d, val = %llu (%d dB) avg %d dB\n", pss_source, peak_position, (unsigned long long)peak_value, dB_fixed64(peak_value),dB_fixed64(avg[pss_source]));
|
||||
|
||||
#ifdef DBG_PSS_NR
|
||||
|
||||
@@ -942,6 +956,6 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain
|
||||
|
||||
#endif
|
||||
|
||||
return(peak_position[0]);
|
||||
return(peak_position);
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -180,14 +180,13 @@ int64_t dot_product64(int16_t *x,
|
||||
for (n=0; n<(N>>2); n++) {
|
||||
|
||||
// printf("n=%d, x128=%p, y128=%p\n",n,x128,y128);
|
||||
// print_shorts("x",&x128[0]);
|
||||
// print_shorts("y",&y128[0]);
|
||||
// print_shorts("x",&x128[0]);
|
||||
// print_shorts("y",&y128[0]);
|
||||
|
||||
// this computes Re(z) = Re(x)*Re(y) + Im(x)*Im(y)
|
||||
mmtmp1 = _mm_madd_epi16(x128[0],y128[0]);
|
||||
// print_ints("retmp",&mmtmp1);
|
||||
// mmtmp1 contains real part of 4 consecutive outputs (32-bit)
|
||||
|
||||
// shift and accumulate results
|
||||
mmtmp1 = _mm_srai_epi32(mmtmp1,output_shift);
|
||||
mmcumul_re = _mm_add_epi32(mmcumul_re,mmtmp1);
|
||||
@@ -205,7 +204,6 @@ int64_t dot_product64(int16_t *x,
|
||||
mmtmp3 = _mm_madd_epi16(x128[0],mmtmp2);
|
||||
//print_ints("imtmp",&mmtmp3);
|
||||
// mmtmp3 contains imag part of 4 consecutive outputs (32-bit)
|
||||
|
||||
// shift and accumulate results
|
||||
mmtmp3 = _mm_srai_epi32(mmtmp3,output_shift);
|
||||
mmcumul_im = _mm_add_epi32(mmcumul_im,mmtmp3);
|
||||
@@ -218,13 +216,10 @@ int64_t dot_product64(int16_t *x,
|
||||
// this gives Re Re Im Im
|
||||
mmcumul = _mm_hadd_epi32(mmcumul_re,mmcumul_im);
|
||||
//print_ints("cumul1",&mmcumul);
|
||||
|
||||
// this gives Re Im Re Im
|
||||
mmcumul = _mm_hadd_epi32(mmcumul,mmcumul);
|
||||
|
||||
//print_ints("cumul2",&mmcumul);
|
||||
|
||||
|
||||
//mmcumul = _mm_srai_epi32(mmcumul,output_shift);
|
||||
// extract the lower half
|
||||
result = _mm_extract_epi64(mmcumul,0);
|
||||
|
||||
@@ -498,10 +498,8 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
float **rxsig_t_dB;
|
||||
float *time;
|
||||
float *corr;
|
||||
/*
|
||||
int16_t **chest_t;
|
||||
int16_t **chest_f;
|
||||
*/
|
||||
int16_t *pdsch_llr;
|
||||
int16_t *pdsch_comp;
|
||||
//int16_t *pdsch_mag;
|
||||
@@ -519,10 +517,13 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
int coded_bits_per_codeword = num_re*Qm;
|
||||
int symbol, first_symbol,nb_re;
|
||||
int nb_rb_pdsch =50;
|
||||
float ymax=1;
|
||||
float **chest_t_abs;
|
||||
float Re,Im;
|
||||
float *chest_f_abs;
|
||||
float *freq;
|
||||
static int overlay = 0;
|
||||
/*
|
||||
float Re,Im,ymax=1;
|
||||
float **chest_t_abs, *chest_f_abs;
|
||||
float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
|
||||
int frame = phy_vars_ue->proc.proc_rxtx[0].frame_rx;
|
||||
int mcs = 0;
|
||||
unsigned char harq_pid = 0;
|
||||
@@ -565,15 +566,15 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
*/
|
||||
I = (float*) calloc(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_slot*2,sizeof(float));
|
||||
Q = (float*) calloc(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_slot*2,sizeof(float));
|
||||
/*
|
||||
|
||||
chest_t_abs = (float**) malloc(nb_antennas_rx*sizeof(float*));
|
||||
|
||||
for (arx=0; arx<nb_antennas_rx; arx++) {
|
||||
chest_t_abs[arx] = (float*) calloc(frame_parms->ofdm_symbol_size,sizeof(float));
|
||||
}
|
||||
|
||||
chest_f_abs = (float*) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float));
|
||||
*/
|
||||
chest_f_abs = (float*) calloc(frame_parms->ofdm_symbol_size,sizeof(float));
|
||||
freq = (float*) calloc(frame_parms->ofdm_symbol_size,sizeof(float));
|
||||
|
||||
llr = (float*) calloc(coded_bits_per_codeword,sizeof(float)); // init to zero
|
||||
bit = malloc(coded_bits_per_codeword*sizeof(float));
|
||||
@@ -589,10 +590,9 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
time = calloc(samples_per_frame,sizeof(float));
|
||||
corr = calloc(samples_per_frame,sizeof(float));
|
||||
|
||||
/*
|
||||
chest_t = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id];
|
||||
chest_f = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id];
|
||||
*/
|
||||
|
||||
pbch_llr = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->llr;
|
||||
pbch_comp = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0];
|
||||
|
||||
@@ -628,29 +628,37 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
}
|
||||
|
||||
if (phy_vars_ue->is_synchronized==0) {
|
||||
for (ind=0;ind<3;ind++) {
|
||||
if (pss_corr_ue[ind]) {
|
||||
for (i=0; i<samples_per_frame; i++) {
|
||||
corr[i] = (float) pss_corr_ue[ind][i];
|
||||
time[i] = (float) i;
|
||||
for (ind=0;ind<3;ind++) {
|
||||
if (pss_corr_ue[ind]) {
|
||||
for (i=0; i<samples_per_frame; i++) {
|
||||
corr[i] = (float) pss_corr_ue[ind][i];
|
||||
time[i] = (float) i;
|
||||
}
|
||||
|
||||
if (ind==0)
|
||||
fl_set_xyplot_data(form->chest_t,time,corr,samples_per_frame,"","","");
|
||||
else
|
||||
fl_add_xyplot_overlay(form->chest_t,ind,time,corr,samples_per_frame,rx_antenna_colors[ind]);
|
||||
|
||||
overlay = 1;
|
||||
}
|
||||
|
||||
if (ind==0)
|
||||
fl_set_xyplot_data(form->chest_t,time,corr,samples_per_frame,"","","");
|
||||
else
|
||||
fl_add_xyplot_overlay(form->chest_t,ind,time,corr,samples_per_frame,rx_antenna_colors[ind]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
if (overlay) { //there was a previous overlay
|
||||
fl_clear_xyplot(form->chest_t);
|
||||
overlay = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
// Channel Impulse Response (still repeated format)
|
||||
// Channel Impulse Response
|
||||
if (chest_t != NULL) {
|
||||
ymax = 0;
|
||||
|
||||
if (chest_t[0] !=NULL) {
|
||||
for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) {
|
||||
chest_t_abs[0][i] = (float) (chest_t[0][4*i]*chest_t[0][4*i]+chest_t[0][4*i+1]*chest_t[0][4*i+1]);
|
||||
chest_t_abs[0][i] = (float) (chest_t[0][2*i]*chest_t[0][2*i]+chest_t[0][2*i+1]*chest_t[0][2*i+1]);
|
||||
time[i] = (float) i;
|
||||
|
||||
if (chest_t_abs[0][i] > ymax)
|
||||
ymax = chest_t_abs[0][i];
|
||||
@@ -658,7 +666,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
|
||||
fl_set_xyplot_data(form->chest_t,time,chest_t_abs[0],(frame_parms->ofdm_symbol_size>>3),"","","");
|
||||
}
|
||||
|
||||
/*
|
||||
for (arx=1; arx<nb_antennas_rx; arx++) {
|
||||
if (chest_t[arx] !=NULL) {
|
||||
for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) {
|
||||
@@ -672,11 +680,12 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
fl_set_xyplot_overlay_type(form->chest_t,arx,FL_DASHED_XYPLOT);
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
// Avoid flickering effect
|
||||
// fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax); // Does not always work...
|
||||
fl_set_xyplot_ybounds(form->chest_t,0,(double) ymax);
|
||||
}
|
||||
}
|
||||
|
||||
// Channel Frequency Response (includes 5 complex sample for filter)
|
||||
if (chest_f != NULL) {
|
||||
@@ -685,7 +694,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
for (atx=0; atx<nb_antennas_tx; atx++) {
|
||||
for (arx=0; arx<nb_antennas_rx; arx++) {
|
||||
if (chest_f[(atx<<1)+arx] != NULL) {
|
||||
for (k=0; k<nsymb_ce; k++) {
|
||||
for (k=0; k<frame_parms->ofdm_symbol_size; k++) {
|
||||
freq[ind] = (float)ind;
|
||||
Re = (float)(chest_f[(atx<<1)+arx][(2*k)]);
|
||||
Im = (float)(chest_f[(atx<<1)+arx][(2*k)+1]);
|
||||
@@ -698,12 +707,13 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
}
|
||||
|
||||
// tx antenna 0
|
||||
fl_set_xyplot_xbounds(form->chest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce);
|
||||
//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);
|
||||
fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","","");
|
||||
//fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
|
||||
fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,frame_parms->ofdm_symbol_size,"","","");
|
||||
|
||||
/*
|
||||
for (arx=1; arx<nb_antennas_rx; arx++) {
|
||||
fl_add_xyplot_overlay(form->chest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
|
||||
}
|
||||
@@ -722,8 +732,8 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
*/
|
||||
|
||||
// PBCH LLRs
|
||||
if (pbch_llr != NULL) {
|
||||
@@ -735,10 +745,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
fl_set_xyplot_data(form->pbch_llr,bit_pbch,llr_pbch,864,"","","");
|
||||
}
|
||||
|
||||
if (phy_vars_ue->is_synchronized==1)
|
||||
first_symbol=5;
|
||||
else
|
||||
first_symbol=1;
|
||||
first_symbol=1;
|
||||
|
||||
// PBCH I/Q of MF Output
|
||||
if (pbch_comp!=NULL) {
|
||||
|
||||
@@ -983,6 +983,8 @@ typedef struct {
|
||||
int UE_scan;
|
||||
/// \brief Indicator that UE should perform coarse scanning around carrier
|
||||
int UE_scan_carrier;
|
||||
/// \brief Indicator that UE should enable estimation and compensation of frequency offset
|
||||
int UE_fo_compensation;
|
||||
/// \brief Indicator that UE is synchronized to an eNB
|
||||
int is_synchronized;
|
||||
/// Data structure for UE process scheduling
|
||||
|
||||
@@ -736,7 +736,7 @@ typedef struct {
|
||||
-- Corresponds to L1 parameter 'HoppingID' (see 38.211, section 6.3.2.2)
|
||||
hoppingId BIT STRING (SIZE (10)) OPTIONAL, -- Need R
|
||||
*/
|
||||
uint16_t hoppingId;
|
||||
uint32_t hoppingId;
|
||||
/*
|
||||
-- Power control parameter P0 for PUCCH transmissions. Value in dBm. Only even values (step size 2) allowed.
|
||||
-- Corresponds to L1 parameter 'p0-nominal-pucch' (see 38.213, section 7.2)
|
||||
|
||||
Regular → Executable
@@ -138,20 +138,22 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) {
|
||||
LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol);
|
||||
|
||||
nr_generate_pss(gNB->d_pss, txdataF[0], AMP, ssb_start_symbol, cfg, fp);
|
||||
nr_generate_sss(gNB->d_sss, txdataF[0], AMP_OVER_2, ssb_start_symbol, cfg, fp);
|
||||
nr_generate_sss(gNB->d_sss, txdataF[0], AMP, ssb_start_symbol, cfg, fp);
|
||||
|
||||
if (!(frame&7)){
|
||||
LOG_D(PHY,"%d.%d : pbch_configured %d\n",frame,slot,gNB->pbch_configured);
|
||||
if (gNB->pbch_configured != 1)return;
|
||||
gNB->pbch_configured = 0;
|
||||
}
|
||||
nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index],txdataF[0], AMP_OVER_2, ssb_start_symbol, cfg, fp);
|
||||
|
||||
nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index],txdataF[0], AMP, ssb_start_symbol, cfg, fp);
|
||||
|
||||
nr_generate_pbch(&gNB->pbch,
|
||||
gNB->nrPolar_params,
|
||||
pbch_pdu,
|
||||
gNB->nr_pbch_interleaver,
|
||||
txdataF[0],
|
||||
AMP_OVER_2,
|
||||
AMP,
|
||||
ssb_start_symbol,
|
||||
n_hf,Lmax,ssb_index,
|
||||
frame, cfg, fp);
|
||||
|
||||
@@ -48,11 +48,13 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
|
||||
/// component carrier id
|
||||
uint8_t cc_id = scheduled_response->CC_id;
|
||||
uint32_t i;
|
||||
int slot = scheduled_response->slot;
|
||||
uint8_t thread_id = PHY_vars_UE_g[module_id][cc_id]->current_thread_id[slot];
|
||||
|
||||
if(scheduled_response != NULL){
|
||||
// Note: we have to handle the thread IDs for this. To be revisited completely.
|
||||
NR_UE_PDCCH *pdcch_vars2 = PHY_vars_UE_g[module_id][cc_id]->pdcch_vars[0][0];
|
||||
NR_UE_DLSCH_t *dlsch0 = PHY_vars_UE_g[module_id][cc_id]->dlsch[0][0][0];
|
||||
NR_UE_PDCCH *pdcch_vars2 = PHY_vars_UE_g[module_id][cc_id]->pdcch_vars[thread_id][0];
|
||||
NR_UE_DLSCH_t *dlsch0 = PHY_vars_UE_g[module_id][cc_id]->dlsch[thread_id][0][0];
|
||||
NR_UE_ULSCH_t *ulsch0 = PHY_vars_UE_g[module_id][cc_id]->ulsch[0];
|
||||
NR_DL_FRAME_PARMS frame_parms = PHY_vars_UE_g[module_id][cc_id]->frame_parms;
|
||||
PRACH_RESOURCES_t *prach_resources = PHY_vars_UE_g[module_id][cc_id]->prach_resources[0];
|
||||
|
||||
@@ -2781,8 +2781,6 @@ void nr_ue_measurement_procedures(
|
||||
*/
|
||||
eNB_id = 0;
|
||||
|
||||
|
||||
|
||||
LOG_D(PHY,"start adjust sync l = %d slot = %d no timing %d\n",l, slot, ue->no_timing_correction);
|
||||
if (ue->no_timing_correction==0)
|
||||
nr_adjust_synch_ue(&ue->frame_parms,
|
||||
@@ -2791,7 +2789,6 @@ void nr_ue_measurement_procedures(
|
||||
nr_tti_rx,
|
||||
0,
|
||||
16384);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -4969,95 +4966,20 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
|
||||
|
||||
int frame_rx = proc->frame_rx;
|
||||
int nr_tti_rx = proc->nr_tti_rx;
|
||||
NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][0];
|
||||
uint16_t nb_symb_sch = 8; // to be updated by higher layer
|
||||
uint8_t nb_symb_pdcch =2;
|
||||
//proc->decoder_switch = 0;
|
||||
//int counter_decoder = 0;
|
||||
uint8_t nb_symb_pdcch = pdcch_vars->coreset[0].duration;
|
||||
|
||||
LOG_D(PHY," ****** start RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, nr_tti_rx);
|
||||
LOG_D(PHY," ****** start RX-Chain for Frame.Slot %d.%d ****** \n", frame_rx%1024, nr_tti_rx);
|
||||
|
||||
uint8_t next1_thread_id = ue->current_thread_id[nr_tti_rx]== (RX_NB_TH-1) ? 0:(ue->current_thread_id[nr_tti_rx]+1);
|
||||
uint8_t next2_thread_id = next1_thread_id== (RX_NB_TH-1) ? 0:(next1_thread_id+1);
|
||||
|
||||
#if 0
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN);
|
||||
|
||||
#if T_TRACER
|
||||
T(T_UE_PHY_DL_TICK, T_INT(ue->Mod_id), T_INT(frame_rx%1024), T_INT(nr_tti_rx));
|
||||
|
||||
T(T_UE_PHY_INPUT_SIGNAL, T_INT(ue->Mod_id), T_INT(frame_rx%1024), T_INT(nr_tti_rx), T_INT(0),
|
||||
T_BUFFER(&ue->common_vars.rxdata[0][nr_tti_rx*ue->frame_parms.samples_per_subframe],
|
||||
ue->frame_parms.samples_per_subframe * 4));
|
||||
#endif
|
||||
|
||||
// start timers
|
||||
//#ifdef UE_DEBUG_TRACE
|
||||
LOG_I(PHY," ****** start RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, nr_tti_rx);
|
||||
//#endif
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
start_meas(&ue->phy_proc_rx[ue->current_thread_id[nr_tti_rx]]);
|
||||
start_meas(&ue->generic_stat);
|
||||
#endif
|
||||
|
||||
if (do_pdcch_flag) {
|
||||
// deactivate reception until we scan pdcch
|
||||
if (ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0])
|
||||
ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 0;
|
||||
if (ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][1])
|
||||
ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][1]->active = 0;
|
||||
|
||||
if (ue->dlsch_SI[eNB_id])
|
||||
ue->dlsch_SI[eNB_id]->active = 0;
|
||||
if (ue->dlsch_p[eNB_id])
|
||||
ue->dlsch_p[eNB_id]->active = 0;
|
||||
if (ue->dlsch_ra[eNB_id])
|
||||
ue->dlsch_ra[eNB_id]->active = 0;
|
||||
}
|
||||
|
||||
#ifdef DEBUG_PHY_PROC
|
||||
LOG_D(PHY,"[%s %d] Frame %d nr_tti_rx %d: Doing phy_procedures_UE_RX\n",
|
||||
(r_type == multicast_relay) ? "RN/UE" : "UE",
|
||||
ue->Mod_id,frame_rx, nr_tti_rx);
|
||||
#endif
|
||||
|
||||
|
||||
if (ue->frame_parms.Ncp == 0) { // normal prefix
|
||||
pilot1 = 4;
|
||||
} else { // extended prefix
|
||||
pilot1 = 3;
|
||||
}
|
||||
|
||||
/*
|
||||
if (nr_subframe_select(&ue->frame_parms,nr_tti_rx) == SF_S) { // S-subframe, do first 5 symbols only
|
||||
l2 = 5;
|
||||
} else */
|
||||
{ // normal nr_tti_rx, last symbol to be processed is the first of the second slot
|
||||
l2 = (ue->frame_parms.symbols_per_tti/2)-1;
|
||||
}
|
||||
|
||||
int prev_nr_tti_rx = (nr_tti_rx - 1)<0? 9: (nr_tti_rx - 1);/*
|
||||
if (nr_subframe_select(&ue->frame_parms,prev_nr_tti_rx) != SF_DL) {
|
||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// RX processing of symbols l=0...l2
|
||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
l=0;
|
||||
} else */
|
||||
{
|
||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// RX processing of symbols l=1...l2 (l=0 is done in last scheduling epoch)
|
||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
l=1;
|
||||
}
|
||||
|
||||
LOG_D(PHY," ------ slot 0 Processing: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
|
||||
LOG_D(PHY," ------ --> FFT/ChannelEst/PDCCH slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
|
||||
#endif
|
||||
|
||||
#ifdef NR_PDCCH_SCHED
|
||||
//nr_gold_pdcch(ue,0, 2);
|
||||
nr_gold_pdcch(ue,0, 2);
|
||||
|
||||
//if (nr_tti_rx==1){
|
||||
LOG_D(PHY," ------ --> PDCCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
|
||||
for (uint16_t l=0; l<nb_symb_pdcch; l++) {
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
@@ -5088,16 +5010,16 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
|
||||
//}
|
||||
#endif //NR_PDCCH_SCHED
|
||||
|
||||
LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
|
||||
|
||||
if (nr_tti_rx==1){
|
||||
LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
|
||||
//to update from pdsch config
|
||||
nr_gold_pdsch(ue,nb_symb_pdcch,0, 1);
|
||||
|
||||
for (uint16_t m=nb_symb_pdcch;m<=(nb_symb_sch+nb_symb_pdcch-1) ; m++){
|
||||
nr_slot_fep(ue,
|
||||
m, //to be updated from higher layer
|
||||
nr_tti_rx<<1,
|
||||
nr_tti_rx,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
@@ -5108,7 +5030,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
|
||||
|
||||
}
|
||||
//set active for testing, to be removed
|
||||
ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 1;
|
||||
ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 0;
|
||||
}
|
||||
else
|
||||
ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 0;
|
||||
@@ -5131,7 +5053,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT);
|
||||
}
|
||||
|
||||
LOG_D(PHY," ------ end PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
|
||||
// do procedures for SI-RNTI
|
||||
if ((ue->dlsch_SI[eNB_id]) && (ue->dlsch_SI[eNB_id]->active == 1)) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI, VCD_FUNCTION_IN);
|
||||
@@ -5173,62 +5094,12 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
|
||||
ue->frame_parms.symbols_per_tti>>1);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_OUT);
|
||||
}
|
||||
//#if 0
|
||||
LOG_D(PHY," ------ slot 1 Processing: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
|
||||
LOG_D(PHY," ------ --> FFT/ChannelEst/PDCCH slot 1: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
|
||||
|
||||
/*if (nr_subframe_select(&ue->frame_parms,nr_tti_rx) != SF_S)*/
|
||||
{ // do front-end processing for second slot, and first symbol of next nr_tti_rx
|
||||
for (l=1; l<ue->frame_parms.symbols_per_tti>>1; l++) {
|
||||
#if UE_TIMING_TRACE
|
||||
start_meas(&ue->ofdm_demod_stats);
|
||||
#endif
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN);
|
||||
/*nr_slot_fep(ue,
|
||||
l,
|
||||
1+(nr_tti_rx<<1),
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
NR_PDSCH_EST);*/
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT);
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
stop_meas(&ue->ofdm_demod_stats);
|
||||
#endif
|
||||
|
||||
|
||||
//ue_measurement_procedures(l-1,ue,proc,eNB_id,1+(nr_tti_rx<<1),abstraction_flag,mode);
|
||||
|
||||
} // for l=1..l2
|
||||
|
||||
// do first symbol of next downlink nr_tti_rx for channel estimation
|
||||
int next_nr_tti_rx = (1+nr_tti_rx)%10;
|
||||
/* if (nr_subframe_select(&ue->frame_parms,next_nr_tti_rx) != SF_UL)*/
|
||||
{
|
||||
/*nr_slot_fep(ue,
|
||||
0,
|
||||
(next_nr_tti_rx<<1),
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
NR_PDSCH_EST);*/
|
||||
}
|
||||
} // not an S-subframe
|
||||
#if UE_TIMING_TRACE
|
||||
stop_meas(&ue->generic_stat);
|
||||
#if DISABLE_LOG_X
|
||||
printf("[SFN %d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",nr_tti_rx,ue->generic_stat.p_time/(cpuf*1000.0));
|
||||
#else
|
||||
LOG_D(PHY, "[SFN %d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",nr_tti_rx,ue->generic_stat.p_time/(cpuf*1000.0));
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
//LOG_D(PHY," ------ end FFT/ChannelEst/PDCCH slot 1: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
|
||||
|
||||
if ( (nr_tti_rx == 0) && (ue->decode_MIB == 1))
|
||||
{
|
||||
LOG_D(PHY," ------ PBCH ChannelComp/LLR: frame.slot %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
|
||||
for (int i=0; i<3; i++)
|
||||
nr_slot_fep(ue,
|
||||
(5+i), //mu=1 case B
|
||||
@@ -5242,7 +5113,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
|
||||
}
|
||||
|
||||
// do procedures for C-RNTI
|
||||
LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
|
||||
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);
|
||||
|
||||
@@ -144,7 +144,7 @@ int main(int argc, char **argv) {
|
||||
//char input_val_str[50],input_val_str2[50];
|
||||
//uint16_t NB_RB=25;
|
||||
SCM_t channel_model = AWGN; //Rayleigh1_anticorr;
|
||||
uint8_t N_RB_DL = 106, mu = 1;
|
||||
uint16_t N_RB_DL = 106, mu = 1;
|
||||
unsigned char frame_type = 0;
|
||||
unsigned char pbch_phase = 0;
|
||||
int frame = 0, subframe = 0;
|
||||
@@ -362,9 +362,10 @@ int main(int argc, char **argv) {
|
||||
if (snr1set == 0)
|
||||
snr1 = snr0 + 10;
|
||||
|
||||
gNB2UE = new_channel_desc_scm(n_tx, n_rx, channel_model, 61.44e6, //N_RB2sampling_rate(N_RB_DL),
|
||||
40e6, //N_RB2channel_bandwidth(N_RB_DL),
|
||||
0, 0, 0);
|
||||
gNB2UE = new_channel_desc_scm(n_tx, n_rx, channel_model,
|
||||
61.44e6, //N_RB2sampling_rate(N_RB_DL),
|
||||
40e6, //N_RB2channel_bandwidth(N_RB_DL),
|
||||
0, 0, 0);
|
||||
|
||||
if (gNB2UE == NULL) {
|
||||
msg("Problem generating channel model. Exiting.\n");
|
||||
@@ -599,8 +600,10 @@ int main(int argc, char **argv) {
|
||||
(float) n_errors / (float) n_trials,
|
||||
(float) n_false_positive / (float) n_trials);
|
||||
|
||||
if ((float) n_errors / (float) n_trials < target_error_rate)
|
||||
break;
|
||||
if ((float) n_errors / (float) n_trials < target_error_rate) {
|
||||
printf("PDSCH test OK\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1);
|
||||
|
||||
@@ -154,7 +154,7 @@ int main(int argc, char **argv)
|
||||
unsigned char frame_type = 0;
|
||||
unsigned char pbch_phase = 0;
|
||||
|
||||
int frame=0,slot=0;
|
||||
int frame=0,slot=1;
|
||||
int frame_length_complex_samples;
|
||||
int frame_length_complex_samples_no_prefix;
|
||||
int slot_length_complex_samples_no_prefix;
|
||||
@@ -543,18 +543,20 @@ int main(int argc, char **argv)
|
||||
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);
|
||||
|
||||
int tx_offset = slot*frame_parms->samples_per_slot;
|
||||
|
||||
//TODO: loop over slots
|
||||
for (aa=0; aa<gNB->frame_parms.nb_antennas_tx; aa++) {
|
||||
if (gNB_config->subframe_config.dl_cyclic_prefix_type.value == 1) {
|
||||
PHY_ofdm_mod(gNB->common_vars.txdataF[aa],
|
||||
txdata[aa],
|
||||
&txdata[aa][tx_offset],
|
||||
frame_parms->ofdm_symbol_size,
|
||||
12,
|
||||
frame_parms->nb_prefix_samples,
|
||||
CYCLIC_PREFIX);
|
||||
} else {
|
||||
nr_normal_prefix_mod(gNB->common_vars.txdataF[aa],
|
||||
txdata[aa],
|
||||
&txdata[aa][tx_offset],
|
||||
14,
|
||||
frame_parms);
|
||||
}
|
||||
|
||||
@@ -87,11 +87,13 @@ int main(int argc, char **argv)
|
||||
|
||||
int i,aa;//,l;
|
||||
double sigma2, sigma2_dB=10,SNR,snr0=-2.0,snr1=2.0;
|
||||
double cfo=0;
|
||||
uint8_t snr1set=0;
|
||||
int **txdata;
|
||||
double **s_re,**s_im,**r_re,**r_im;
|
||||
//double iqim = 0.0;
|
||||
//unsigned char pbch_pdu[6];
|
||||
double iqim = 0.0;
|
||||
double ip =0.0;
|
||||
unsigned char pbch_pdu[6];
|
||||
// int sync_pos, sync_pos_slot;
|
||||
// FILE *rx_frame_file;
|
||||
FILE *output_fd = NULL;
|
||||
@@ -146,7 +148,7 @@ int main(int argc, char **argv)
|
||||
|
||||
randominit(0);
|
||||
|
||||
while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:N:F:GR:dP:IL:")) != -1) {
|
||||
while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:o:s:S:t:x:y:z:N:F:GR:dP:IL:")) != -1) {
|
||||
switch (c) {
|
||||
case 'f':
|
||||
write_output_file=1;
|
||||
@@ -212,6 +214,11 @@ int main(int argc, char **argv)
|
||||
n_trials = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
cfo = atof(optarg);
|
||||
msg("Setting CFO to %f Hz\n",cfo);
|
||||
break;
|
||||
|
||||
case 's':
|
||||
snr0 = atof(optarg);
|
||||
msg("Setting SNR0 to %f\n",snr0);
|
||||
@@ -325,6 +332,7 @@ int main(int argc, char **argv)
|
||||
printf("-z Number of RX antennas used in UE\n");
|
||||
printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
|
||||
printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
|
||||
printf("-o Carrier frequency offset in Hz\n");
|
||||
printf("-N Nid_cell\n");
|
||||
printf("-R N_RB_DL\n");
|
||||
printf("-O oversampling factor (1,2,4,8,16)\n");
|
||||
@@ -356,30 +364,49 @@ int main(int argc, char **argv)
|
||||
frame_parms->nb_antennas_rx = n_rx;
|
||||
frame_parms->N_RB_DL = N_RB_DL;
|
||||
frame_parms->N_RB_UL = N_RB_DL;
|
||||
frame_parms->Nid_cell = Nid_cell;
|
||||
|
||||
nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell);
|
||||
phy_init_nr_gNB(gNB,0,0);
|
||||
|
||||
double fs,bw;
|
||||
double fs,bw,scs,eps;
|
||||
|
||||
if (mu == 1 && N_RB_DL == 217) {
|
||||
fs = 122.88e6;
|
||||
bw = 80e6;
|
||||
scs = 30000;
|
||||
}
|
||||
else if (mu == 1 && N_RB_DL == 245) {
|
||||
fs = 122.88e6;
|
||||
bw = 90e6;
|
||||
scs = 30000;
|
||||
}
|
||||
else if (mu == 1 && N_RB_DL == 273) {
|
||||
fs = 122.88e6;
|
||||
bw = 100e6;
|
||||
scs = 30000;
|
||||
}
|
||||
else if (mu == 1 && N_RB_DL == 106) {
|
||||
fs = 61.44e6;
|
||||
bw = 40e6;
|
||||
scs = 30000;
|
||||
}
|
||||
else AssertFatal(1==0,"Unsupported numerology for mu %d, N_RB %d\n",mu, N_RB_DL);
|
||||
|
||||
// cfo with respect to sub-carrier spacing
|
||||
eps = cfo/scs;
|
||||
|
||||
// computation of integer and fractional FO to compare with estimation results
|
||||
int IFO;
|
||||
if(eps!=0.0){
|
||||
printf("Introducing a CFO of %lf relative to SCS of %d kHz\n",eps,(int)(scs/1000));
|
||||
if (eps>0)
|
||||
IFO=(int)(eps+0.5);
|
||||
else
|
||||
IFO=(int)(eps-0.5);
|
||||
printf("FFO = %lf; IFO = %d\n",eps-IFO,IFO);
|
||||
}
|
||||
|
||||
gNB2UE = new_channel_desc_scm(n_tx,
|
||||
n_rx,
|
||||
channel_model,
|
||||
@@ -435,6 +462,9 @@ int main(int argc, char **argv)
|
||||
|
||||
UE->perfect_ce = 0;
|
||||
|
||||
if(eps!=0.0)
|
||||
UE->UE_fo_compensation = 1; // if a frequency offset is set then perform fo estimation and compensation
|
||||
|
||||
if (init_nr_ue_signal(UE, 1, 0) != 0)
|
||||
{
|
||||
printf("Error at UE NR initialisation\n");
|
||||
@@ -492,6 +522,7 @@ int main(int argc, char **argv)
|
||||
|
||||
// printf("txlev %d (%f)\n",txlev,10*log10(txlev));
|
||||
|
||||
|
||||
for (i=0; i<frame_length_complex_samples; i++) {
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
|
||||
@@ -510,11 +541,32 @@ int main(int argc, char **argv)
|
||||
//multipath_channel(gNB2UE,s_re,s_im,r_re,r_im,frame_length_complex_samples,0);
|
||||
|
||||
//AWGN
|
||||
sigma2_dB = 10*log10((double)txlev)-SNR;
|
||||
sigma2_dB = 20*log10((double)AMP/4)-SNR;
|
||||
sigma2 = pow(10,sigma2_dB/10);
|
||||
// printf("sigma2 %f (%f dB)\n",sigma2,sigma2_dB);
|
||||
//printf("sigma2 %f (%f dB), tx_lev %f (%f dB)\n",sigma2,sigma2_dB,txlev,10*log10((double)txlev));
|
||||
|
||||
for (i=0; i<frame_parms->samples_per_subframe; i++) {
|
||||
if(eps!=0.0)
|
||||
rf_rx(r_re, // real part of txdata
|
||||
r_im, // imag part of txdata
|
||||
NULL, // interference real part
|
||||
NULL, // interference imag part
|
||||
0, // interference power
|
||||
frame_parms->nb_antennas_rx, // number of rx antennas
|
||||
frame_length_complex_samples, // number of samples in frame
|
||||
1.0e9/fs, //sampling time (ns)
|
||||
cfo, // frequency offset in Hz
|
||||
0.0, // drift (not implemented)
|
||||
0.0, // noise figure (not implemented)
|
||||
0.0, // rx gain in dB ?
|
||||
200, // 3rd order non-linearity in dB ?
|
||||
&ip, // initial phase
|
||||
30.0e3, // phase noise cutoff in kHz
|
||||
-500.0, // phase noise amplitude in dBc
|
||||
0.0, // IQ imbalance (dB),
|
||||
0.0); // IQ phase imbalance (rad)
|
||||
|
||||
|
||||
for (i=0; i<frame_length_complex_samples; i++) {
|
||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||
|
||||
((short*) UE->common_vars.rxdata[aa])[2*i] = (short) ((r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
||||
|
||||
@@ -96,3 +96,8 @@ target_link_libraries(pucch_uci_test
|
||||
-Wl,--start-group UTIL SCHED_NR_UE_LIB PHY PHY_COMMON PHY_UE PHY_NR_UE -Wl,--end-group
|
||||
pthread m ${ATLAS_LIBRARIES}
|
||||
)
|
||||
add_executable(pucch_uci_generator_test ${OPENAIR1_DIR}/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_generator_test.c ${SRC_UNIT_TESTS} )
|
||||
target_link_libraries(pucch_uci_generator_test
|
||||
-Wl,--start-group UTIL SCHED_NR_UE_LIB PHY PHY_COMMON PHY_UE PHY_NR_UE -Wl,--end-group
|
||||
pthread m ${ATLAS_LIBRARIES}
|
||||
)
|
||||
@@ -192,11 +192,10 @@ int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf) { retu
|
||||
|
||||
void * get_shlibmodule_fptr(char *modname, char *fname) { return(NULL) ; }
|
||||
|
||||
void exit_fun(const char* s)
|
||||
{
|
||||
/*void exit_fun (const char *s) {
|
||||
VOID_PARAMETER s;
|
||||
undefined_function(__FUNCTION__);
|
||||
}
|
||||
}*/
|
||||
|
||||
uint32_t ue_get_SR(module_id_t module_idP, int CC_id, frame_t frameP,
|
||||
uint8_t eNB_id, rnti_t rnti, sub_frame_t subframe){
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
/*************** LOCAL VARIABLES***********************************/
|
||||
|
||||
static nfapi_config_request_t config_t;
|
||||
static nfapi_config_request_t* config =&config_t;
|
||||
static nfapi_config_request_t *config =&config_t;
|
||||
|
||||
/*************** FUNCTIONS ****************************************/
|
||||
|
||||
@@ -86,8 +86,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_eNB, uint8_t abstract
|
||||
*
|
||||
*********************************************************************/
|
||||
|
||||
void phase_shift_samples(int16_t *samples, int length, int16_t phase_shift_re, int16_t phase_shift_im)
|
||||
{
|
||||
void phase_shift_samples(int16_t *samples, int length, int16_t phase_shift_re, int16_t phase_shift_im) {
|
||||
int16_t sample_re, sample_im;
|
||||
|
||||
for (int i = 0; i < length; i++) {
|
||||
@@ -112,22 +111,23 @@ void phase_shift_samples(int16_t *samples, int length, int16_t phase_shift_re, i
|
||||
*
|
||||
*********************************************************************/
|
||||
|
||||
void display_data(int pss_sequence_number, int16_t *rxdata, int position)
|
||||
{
|
||||
void display_data(int pss_sequence_number, int16_t *rxdata, int position) {
|
||||
#ifdef DEBUG_TEST_PSS
|
||||
int16_t *pss_sequence[NUMBER_PSS_SEQUENCE] = {primary_synch0_time, primary_synch1_time, primary_synch2_time};
|
||||
int16_t *pss_sequence_time = pss_sequence[pss_sequence_number];
|
||||
printf(" pss %6d data \n", pss_sequence_number);
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
if (pss_sequence_number < NUMBER_PSS_SEQUENCE) {
|
||||
printf("[i %6d] : %4d [i %6d] : %8i at address : %p \n", i, pss_sequence_time[2*i], (i + position), rxdata[2*i + (position*2)], &(rxdata[2*i + (position*2)]));
|
||||
printf("[q %6d] : %4d [q %6d] : %8i at address : %p \n", i, pss_sequence_time[2*i+1], (i + position), rxdata[2*i + 1 + (position*2)], &(rxdata[2*i + 1 + (position*2)]));
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
printf("[i %6d] : Undef [i %6d] : %8i at address : %p \n", i, (i + position), rxdata[2*i + (position*2)], &(rxdata[2*i + (position*2)]));
|
||||
printf("[q %6d] : Undef [q %6d] : %8i at address : %p \n", i, (i + position), rxdata[2*i + 1 + (position*2)], &(rxdata[2*i + 1 + (position*2)]));
|
||||
}
|
||||
}nr_init_frame_parms
|
||||
}
|
||||
|
||||
nr_init_frame_parms
|
||||
printf(" ... ... \n");
|
||||
#else
|
||||
(void) pss_sequence_number;
|
||||
@@ -149,11 +149,9 @@ void display_data(int pss_sequence_number, int16_t *rxdata, int position)
|
||||
*
|
||||
*********************************************************************/
|
||||
|
||||
void display_test_configuration_pss(int position, int pss_sequence_number)
|
||||
{
|
||||
void display_test_configuration_pss(int position, int pss_sequence_number) {
|
||||
const char next_test_text[] = "------------------------------------------------\n";
|
||||
const char test_text_pss[] = "Test nr pss with Nid2 %i at position %i \n";
|
||||
|
||||
printf(next_test_text);
|
||||
printf(test_text_pss, pss_sequence_number, position);
|
||||
}
|
||||
@@ -171,8 +169,7 @@ void display_test_configuration_pss(int position, int pss_sequence_number)
|
||||
*
|
||||
*********************************************************************/
|
||||
|
||||
void display_test_configuration_sss(int sss_sequence_number)
|
||||
{
|
||||
void display_test_configuration_sss(int sss_sequence_number) {
|
||||
const char test_text_sss[] = "Test nr sss with Nid1 %i \n";
|
||||
printf(test_text_sss, sss_sequence_number);
|
||||
}
|
||||
@@ -191,8 +188,7 @@ void display_test_configuration_sss(int sss_sequence_number)
|
||||
*
|
||||
*********************************************************************/
|
||||
|
||||
void undefined_function(const char *function)
|
||||
{
|
||||
void undefined_function(const char *function) {
|
||||
printf("%s undefined \n", function);
|
||||
printf("Warning: function \"%s\" has been replaced by an empty function for avoiding undefined function error at build \n", function);
|
||||
}
|
||||
@@ -210,34 +206,22 @@ void undefined_function(const char *function)
|
||||
*********************************************************************/
|
||||
|
||||
int init_test(unsigned char N_tx, unsigned char N_rx, unsigned char transmission_mode,
|
||||
unsigned char extended_prefix_flag, uint8_t frame_type, uint16_t Nid_cell, uint8_t N_RB_DL)
|
||||
{
|
||||
unsigned char extended_prefix_flag, uint8_t frame_type, uint16_t Nid_cell, uint8_t N_RB_DL) {
|
||||
(void) transmission_mode;
|
||||
NR_DL_FRAME_PARMS *frame_parms;
|
||||
|
||||
int log_level = OAILOG_TRACE;
|
||||
|
||||
logInit();
|
||||
|
||||
// enable these lines if you need debug info
|
||||
//set_comp_log(PHY,LOG_DEBUG,LOG_HIGH,1);
|
||||
set_glog(log_level);
|
||||
|
||||
#ifndef NR_UNIT_TEST
|
||||
|
||||
cpuf = get_cpu_freq_GHz();
|
||||
|
||||
LOG_I(PHY, "[CONFIG] Test of UE synchronisation \n");
|
||||
|
||||
//LOG_I(PHY, "[CONFIG] Test of UE synchronisation \n");
|
||||
set_component_filelog(USIM); // file located in /tmp/testSynchroue.txt
|
||||
|
||||
#endif
|
||||
|
||||
//randominit(0);
|
||||
//set_taus_seed(0);
|
||||
|
||||
printf("Start lte_param_init, frame_type %d, extended_prefix %d\n",frame_type,extended_prefix_flag);
|
||||
|
||||
PHY_vars_UE = malloc(sizeof(PHY_VARS_NR_UE));
|
||||
bzero(PHY_vars_UE, sizeof(PHY_VARS_NR_UE));
|
||||
|
||||
@@ -245,7 +229,6 @@ int init_test(unsigned char N_tx, unsigned char N_rx, unsigned char transmission
|
||||
return(-1);
|
||||
|
||||
frame_parms = &(PHY_vars_UE->frame_parms);
|
||||
|
||||
frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz
|
||||
frame_parms->N_RB_UL = N_RB_DL;
|
||||
frame_parms->Ncp = extended_prefix_flag;
|
||||
@@ -257,38 +240,35 @@ int init_test(unsigned char N_tx, unsigned char N_rx, unsigned char transmission
|
||||
frame_parms->nb_antenna_ports_eNB = 1;
|
||||
frame_parms->threequarter_fs = 0;
|
||||
frame_parms->numerology_index = NUMEROLOGY_INDEX_MAX_NR;
|
||||
|
||||
nr_init_frame_parms_ue(frame_parms);
|
||||
|
||||
int mu = 1;
|
||||
int n_ssb_crb = 0;
|
||||
int ssb_subcarrier_offset = 0;
|
||||
nr_init_frame_parms_ue(frame_parms, mu, extended_prefix_flag, N_RB_DL, n_ssb_crb, ssb_subcarrier_offset);
|
||||
PHY_vars_UE->frame_parms.Nid_cell = (3 * N_ID_1_NUMBER) + N_ID_2_NUMBER; /* set to unvalid value */
|
||||
|
||||
//phy_init_nr_top(frame_parms);
|
||||
|
||||
if (init_nr_ue_signal(PHY_vars_UE, 1, 0) != 0)
|
||||
{
|
||||
if (init_nr_ue_signal(PHY_vars_UE, 1, 0) != 0) {
|
||||
LOG_E(PHY,"Error at UE NR initialisation : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* dummy initialisation of global structure PHY_vars_UE_g */
|
||||
|
||||
/* dummy initialisation of global structure PHY_vars_UE_g */
|
||||
unsigned char NB_UE_INST=1;
|
||||
PHY_vars_UE_g = (PHY_VARS_NR_UE ** *)calloc( NB_UE_INST, sizeof(PHY_VARS_NR_UE **));
|
||||
|
||||
PHY_vars_UE_g = (PHY_VARS_NR_UE***)calloc( NB_UE_INST, sizeof(PHY_VARS_NR_UE**));
|
||||
for (int UE_id=0; UE_id<NB_UE_INST; UE_id++) {
|
||||
PHY_vars_UE_g[UE_id] = (PHY_VARS_NR_UE **) calloc( MAX_NUM_CCs, sizeof(PHY_VARS_NR_UE *));
|
||||
|
||||
for (int UE_id=0; UE_id<NB_UE_INST; UE_id++) {
|
||||
PHY_vars_UE_g[UE_id] = (PHY_VARS_NR_UE**) calloc( MAX_NUM_CCs, sizeof(PHY_VARS_NR_UE*));
|
||||
|
||||
for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||
//(frame_parms[CC_id])->nb_antennas_tx = 1;
|
||||
//(frame_parms[CC_id])->nb_antennas_rx = nb_antennas_rx_ue;
|
||||
// PHY_vars_UE_g[UE_id][CC_id] = init_lte_UE(frame_parms[CC_id], UE_id,abstraction_flag);
|
||||
|
||||
PHY_vars_UE_g[UE_id][CC_id] = calloc(1, sizeof(PHY_VARS_NR_UE));
|
||||
PHY_vars_UE_g[UE_id][CC_id]->Mod_id=UE_id;
|
||||
PHY_vars_UE_g[UE_id][CC_id]->CC_id=CC_id;
|
||||
}
|
||||
}
|
||||
for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||
//(frame_parms[CC_id])->nb_antennas_tx = 1;
|
||||
//(frame_parms[CC_id])->nb_antennas_rx = nb_antennas_rx_ue;
|
||||
// PHY_vars_UE_g[UE_id][CC_id] = init_lte_UE(frame_parms[CC_id], UE_id,abstraction_flag);
|
||||
PHY_vars_UE_g[UE_id][CC_id] = calloc(1, sizeof(PHY_VARS_NR_UE));
|
||||
PHY_vars_UE_g[UE_id][CC_id]->Mod_id=UE_id;
|
||||
PHY_vars_UE_g[UE_id][CC_id]->CC_id=CC_id;
|
||||
}
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
@@ -318,73 +298,66 @@ typedef enum {
|
||||
#define FREQUENCY_15_MHZ (15360000L)
|
||||
#define FREQUENCY (FREQUENCY_15_MHZ) /* to generate a frequency with a sampling of 30,72 MHz 5 gives 770 KHz, 20 gives 1,5 MHz, 40 gives 3 MHz */
|
||||
|
||||
void set_random_rx_buffer(PHY_VARS_NR_UE *PHY_vars_UE, int amp)
|
||||
{
|
||||
NR_DL_FRAME_PARMS *frame_parms = &(PHY_vars_UE->frame_parms);
|
||||
int samples_for_frame = (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti);
|
||||
int16_t random;
|
||||
int16_t *data_p;
|
||||
random_data_format_t data_format = SINUSOIDAL_DATA;
|
||||
|
||||
void set_random_rx_buffer(PHY_VARS_NR_UE *PHY_vars_UE, int amp) {
|
||||
NR_DL_FRAME_PARMS *frame_parms = &(PHY_vars_UE->frame_parms);
|
||||
int samples_for_frame = (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti);
|
||||
int16_t random;
|
||||
int16_t *data_p;
|
||||
random_data_format_t data_format = SINUSOIDAL_DATA;
|
||||
/* reinitialise random for always getting same data */
|
||||
srand(0);
|
||||
|
||||
double n = 0;
|
||||
|
||||
for (int aa=0;aa<PHY_vars_UE->frame_parms.nb_antennas_rx;aa++) {
|
||||
|
||||
for (int aa=0; aa<PHY_vars_UE->frame_parms.nb_antennas_rx; aa++) {
|
||||
data_p = (int16_t *) &(PHY_vars_UE->common_vars.rxdata[aa][0]);
|
||||
|
||||
int frequency_switch = samples_for_frame/LTE_NUMBER_OF_SUBFRAMES_PER_FRAME;
|
||||
int frequency_step = 0;
|
||||
double beat = (2*M_PI*FREQUENCY_15_MHZ)/(SAMPLING_RATE);
|
||||
|
||||
for (int i=0; i< samples_for_frame; i++) {
|
||||
switch(data_format) {
|
||||
case ZERO_DATA:
|
||||
{
|
||||
case ZERO_DATA: {
|
||||
/* all data are forced to zero */
|
||||
random = 0;
|
||||
break;
|
||||
}
|
||||
case SINUSOIDAL_DATA:
|
||||
{
|
||||
|
||||
case SINUSOIDAL_DATA: {
|
||||
/* sinusoidal signal */
|
||||
n = cos(beat*i);
|
||||
random = n * (amp * SCALING_SINUSOIDAL_DATA);
|
||||
frequency_step++;
|
||||
|
||||
if (frequency_step == frequency_switch) {
|
||||
beat = beat/2; /* frequency is divided by 2 */
|
||||
//printf("frequency %f at %d\n", (beat/2*M_PI), i);
|
||||
frequency_step = 0;
|
||||
frequency_step = 0;
|
||||
}
|
||||
|
||||
//printf("%d : cos %d %d \n", i, n, random);
|
||||
break;
|
||||
}
|
||||
case RANDOM_DATA:
|
||||
{
|
||||
|
||||
case RANDOM_DATA: {
|
||||
/* random data can take any value between -SHRT_MAX and SHRT_MAX */
|
||||
/* in this case one can use maxim value for uint16 because there is no saturation */
|
||||
#define SCALING_RANDOM_DATA (24) /* 48 is max value without decimation */
|
||||
#define RANDOM_MAX_AMP (amp * SCALING_RANDOM_DATA)
|
||||
|
||||
#define SCALING_RANDOM_DATA (24) /* 48 is max value without decimation */
|
||||
#define RANDOM_MAX_AMP (amp * SCALING_RANDOM_DATA)
|
||||
random = ((rand() % RANDOM_MAX_AMP) - RANDOM_MAX_AMP/2);
|
||||
break;
|
||||
}
|
||||
case RANDOM_MAX_DATA:
|
||||
{
|
||||
|
||||
case RANDOM_MAX_DATA: {
|
||||
/* random data can take only two value (-RANDOM_MAX) or RANDOM_MAX */
|
||||
/* In this case saturation can occur with value of scaling_value greater than 23 */
|
||||
#define SCALING_RANDOM_MAX_DATA (8)
|
||||
#define RANDOM_VALUE (amp * SCALING_RANDOM_DATA)
|
||||
|
||||
#define SCALING_RANDOM_MAX_DATA (8)
|
||||
#define RANDOM_VALUE (amp * SCALING_RANDOM_DATA)
|
||||
const int random_number[2] = {-1,+1};
|
||||
|
||||
random = random_number[rand()%2] * RANDOM_VALUE;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
|
||||
default: {
|
||||
printf("Format of data is undefined \n");
|
||||
assert(0);
|
||||
break;
|
||||
@@ -393,12 +366,13 @@ random_data_format_t data_format = SINUSOIDAL_DATA;
|
||||
|
||||
data_p[2*i] = random;
|
||||
data_p[2*i+1] = random;
|
||||
|
||||
#if 0
|
||||
|
||||
if (i < 10) {
|
||||
printf("random %d \n", random);
|
||||
printf("random %d \n", random);
|
||||
printf("data[%d] : %d %d at address %p \n", i, data_p[2*i], data_p[2*i+1], &data_p[2*i]);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -418,23 +392,22 @@ random_data_format_t data_format = SINUSOIDAL_DATA;
|
||||
*
|
||||
*********************************************************************/
|
||||
|
||||
int set_pss_in_rx_buffer_from_external_buffer(PHY_VARS_NR_UE *PHY_vars_UE, short *input_buffer)
|
||||
{
|
||||
int set_pss_in_rx_buffer_from_external_buffer(PHY_VARS_NR_UE *PHY_vars_UE, short *input_buffer) {
|
||||
NR_DL_FRAME_PARMS *frame_parms = &(PHY_vars_UE->frame_parms);
|
||||
int samples_for_frame = LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_subframe; /* both i and q */
|
||||
|
||||
for (int aa=0;aa<PHY_vars_UE->frame_parms.nb_antennas_rx;aa++) {
|
||||
for (int aa=0; aa<PHY_vars_UE->frame_parms.nb_antennas_rx; aa++) {
|
||||
for (int i = 0; i < samples_for_frame; i++) {
|
||||
((int16_t*)PHY_vars_UE->common_vars.rxdata[aa])[2*i] = input_buffer[2*i]; /* real part */
|
||||
((int16_t*)PHY_vars_UE->common_vars.rxdata[aa])[2*i+1] = input_buffer[2*i+1]; /* imaginary part */
|
||||
((int16_t *)PHY_vars_UE->common_vars.rxdata[aa])[2*i] = input_buffer[2*i]; /* real part */
|
||||
((int16_t *)PHY_vars_UE->common_vars.rxdata[aa])[2*i+1] = input_buffer[2*i+1]; /* imaginary part */
|
||||
}
|
||||
}
|
||||
|
||||
/* check that sequence has been properly copied */
|
||||
for (int aa=0;aa<PHY_vars_UE->frame_parms.nb_antennas_rx;aa++) {
|
||||
for (int aa=0; aa<PHY_vars_UE->frame_parms.nb_antennas_rx; aa++) {
|
||||
for (int i=0; i<samples_for_frame; i++) {
|
||||
if ((input_buffer[2*i] != ((int16_t*)PHY_vars_UE->common_vars.rxdata[aa])[2*i])
|
||||
|| (input_buffer[2*i+1] != ((int16_t*)PHY_vars_UE->common_vars.rxdata[aa])[2*i+1])) {
|
||||
if ((input_buffer[2*i] != ((int16_t *)PHY_vars_UE->common_vars.rxdata[aa])[2*i])
|
||||
|| (input_buffer[2*i+1] != ((int16_t *)PHY_vars_UE->common_vars.rxdata[aa])[2*i+1])) {
|
||||
printf("Sequence pss was not properly copied into received buffer at index %d \n", i);
|
||||
exit(-1);
|
||||
}
|
||||
@@ -466,15 +439,13 @@ int set_pss_in_rx_buffer_from_external_buffer(PHY_VARS_NR_UE *PHY_vars_UE, short
|
||||
*
|
||||
*********************************************************************/
|
||||
|
||||
int set_pss_in_rx_buffer(PHY_VARS_NR_UE *PHY_vars_UE, int position_symbol, int pss_sequence_number)
|
||||
{
|
||||
int set_pss_in_rx_buffer(PHY_VARS_NR_UE *PHY_vars_UE, int position_symbol, int pss_sequence_number) {
|
||||
NR_DL_FRAME_PARMS *frame_parms = &(PHY_vars_UE->frame_parms);
|
||||
int samples_for_frame = frame_parms->samples_per_frame;
|
||||
int16_t *pss_sequence_time;
|
||||
|
||||
if ((position_symbol > samples_for_frame)
|
||||
|| ((position_symbol + frame_parms->ofdm_symbol_size) > samples_for_frame))
|
||||
{
|
||||
|| ((position_symbol + frame_parms->ofdm_symbol_size) > samples_for_frame)) {
|
||||
printf("This pss sequence can not be fully written in the received window \n");
|
||||
return (-1);
|
||||
}
|
||||
@@ -486,18 +457,18 @@ int set_pss_in_rx_buffer(PHY_VARS_NR_UE *PHY_vars_UE, int position_symbol, int p
|
||||
|
||||
pss_sequence_time = primary_synchro_time_nr[pss_sequence_number];
|
||||
|
||||
for (int aa=0;aa<PHY_vars_UE->frame_parms.nb_antennas_rx;aa++) {
|
||||
for (int aa=0; aa<PHY_vars_UE->frame_parms.nb_antennas_rx; aa++) {
|
||||
for (int i = 0; i < frame_parms->ofdm_symbol_size; i++) {
|
||||
((int16_t*)PHY_vars_UE->common_vars.rxdata[aa])[(position_symbol*2) + (2*i)] = pss_sequence_time[2*i]; /* real part */
|
||||
((int16_t*)PHY_vars_UE->common_vars.rxdata[aa])[(position_symbol*2) + (2*i+1)] = pss_sequence_time[2*i+1]; /* imaginary part */
|
||||
((int16_t *)PHY_vars_UE->common_vars.rxdata[aa])[(position_symbol*2) + (2*i)] = pss_sequence_time[2*i]; /* real part */
|
||||
((int16_t *)PHY_vars_UE->common_vars.rxdata[aa])[(position_symbol*2) + (2*i+1)] = pss_sequence_time[2*i+1]; /* imaginary part */
|
||||
}
|
||||
}
|
||||
|
||||
/* check that sequence has been properly copied */
|
||||
for (int aa=0;aa<PHY_vars_UE->frame_parms.nb_antennas_rx;aa++) {
|
||||
for (int aa=0; aa<PHY_vars_UE->frame_parms.nb_antennas_rx; aa++) {
|
||||
for (int i=0; i<(frame_parms->ofdm_symbol_size); i++) {
|
||||
if ((pss_sequence_time[2*i] != ((int16_t*)PHY_vars_UE->common_vars.rxdata[aa])[(position_symbol*2) + (2*i)])
|
||||
|| (pss_sequence_time[2*i+1] != ((int16_t*)PHY_vars_UE->common_vars.rxdata[aa])[(position_symbol*2) + (2*i+1)])) {
|
||||
if ((pss_sequence_time[2*i] != ((int16_t *)PHY_vars_UE->common_vars.rxdata[aa])[(position_symbol*2) + (2*i)])
|
||||
|| (pss_sequence_time[2*i+1] != ((int16_t *)PHY_vars_UE->common_vars.rxdata[aa])[(position_symbol*2) + (2*i+1)])) {
|
||||
printf("Sequence pss was not properly copied into received buffer at index %d \n", i);
|
||||
exit(-1);
|
||||
}
|
||||
@@ -525,11 +496,9 @@ int set_pss_in_rx_buffer(PHY_VARS_NR_UE *PHY_vars_UE, int position_symbol, int p
|
||||
*
|
||||
*********************************************************************/
|
||||
|
||||
void set_sequence_pss(PHY_VARS_NR_UE *PHY_vars_UE, int position_symbol, int pss_sequence_number)
|
||||
{
|
||||
void set_sequence_pss(PHY_VARS_NR_UE *PHY_vars_UE, int position_symbol, int pss_sequence_number) {
|
||||
NR_DL_FRAME_PARMS *frame_parms = &(PHY_vars_UE->frame_parms);
|
||||
int samples_for_frame = frame_parms->samples_per_frame;
|
||||
|
||||
/* initialise received ue data with random */
|
||||
set_random_rx_buffer(PHY_vars_UE, AMP);
|
||||
|
||||
@@ -543,6 +512,7 @@ void set_sequence_pss(PHY_VARS_NR_UE *PHY_vars_UE, int position_symbol, int pss_
|
||||
printf("This position for pss sequence %d is not supported because it exceeds the frame length %d!\n", position_symbol, samples_for_frame);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (set_pss_in_rx_buffer(PHY_vars_UE, position_symbol, pss_sequence_number) != 0)
|
||||
printf("Warning: pss sequence can not be properly written into received buffer !\n");
|
||||
}
|
||||
|
||||
@@ -0,0 +1,166 @@
|
||||
#include "../../unit_tests/src/pss_util_test.h"
|
||||
#include "PHY/defs_nr_UE.h"
|
||||
#include "PHY/INIT/init_extern.h"
|
||||
#include "PHY/phy_extern_nr_ue.h"
|
||||
|
||||
/*
|
||||
#include "SCHED_NR_UE/defs.h"
|
||||
#include "SCHED_NR/extern.h"
|
||||
|
||||
#include "SCHED_NR_UE/harq_nr.h"
|
||||
*/
|
||||
#include "SCHED_NR_UE/pucch_uci_ue_nr.h"
|
||||
|
||||
/**************** define **************************************/
|
||||
|
||||
#define TST_GNB_ID_0 (0) /* first index of gNB */
|
||||
#define TST_THREAD_ID (0)
|
||||
|
||||
|
||||
int test_pucch_generators(PHY_VARS_NR_UE *ue) {
|
||||
int gNB_id = TST_GNB_ID_0;
|
||||
int thread_number = TST_THREAD_ID;
|
||||
int TB_identifier = 0;
|
||||
int v_return = 0;
|
||||
pucch_format_nr_t format = pucch_format2_nr;
|
||||
uint8_t starting_symbol_index;
|
||||
uint8_t nb_symbols_total = 4;
|
||||
uint16_t starting_prb = 0;; /* it can be considered as first hop on case of pucch hopping */
|
||||
uint16_t second_hop = 0; /* second part for pucch for hopping */
|
||||
uint8_t nb_of_prbs = 1;
|
||||
|
||||
switch (format) {
|
||||
case pucch_format0_nr:
|
||||
nb_symbols_total = 2;
|
||||
nb_of_prbs = 1;
|
||||
starting_symbol_index = 0;
|
||||
break;
|
||||
|
||||
case pucch_format1_nr:
|
||||
nb_symbols_total = 5;
|
||||
nb_of_prbs = 1;
|
||||
starting_symbol_index = 0;
|
||||
break;
|
||||
|
||||
case pucch_format2_nr:
|
||||
nb_symbols_total = 2;
|
||||
nb_of_prbs = 16;
|
||||
starting_symbol_index = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
int m_0 = 0; /* format 0 only */
|
||||
int m_CS = 0; /* for all format except for format 0 */
|
||||
int index_additional_dmrs = I_PUCCH_NO_ADDITIONAL_DMRS;
|
||||
int index_hopping = I_PUCCH_NO_HOPPING;
|
||||
int time_domain_occ = 0;
|
||||
int occ_length = 0;
|
||||
int occ_Index = 0;
|
||||
uint64_t pucch_payload = 0;
|
||||
int tx_amp = 512;
|
||||
int nr_tti_tx = 0;
|
||||
int N_UCI = 0; /* size in bits for Uplink Control Information */
|
||||
|
||||
switch(format) {
|
||||
case pucch_format0_nr: {
|
||||
nr_generate_pucch0(ue,ue->common_vars.txdataF,
|
||||
&ue->frame_parms,
|
||||
&ue->pucch_config_dedicated_nr[gNB_id],
|
||||
tx_amp,
|
||||
nr_tti_tx,
|
||||
(uint8_t)m_0,
|
||||
(uint8_t)m_CS,
|
||||
nb_symbols_total,
|
||||
starting_symbol_index,
|
||||
starting_prb);
|
||||
break;
|
||||
}
|
||||
|
||||
case pucch_format1_nr: {
|
||||
nr_generate_pucch1(ue,ue->common_vars.txdataF,
|
||||
&ue->frame_parms,
|
||||
&ue->pucch_config_dedicated_nr[gNB_id],
|
||||
pucch_payload,
|
||||
tx_amp,
|
||||
nr_tti_tx,
|
||||
(uint8_t)m_0,
|
||||
nb_symbols_total,
|
||||
starting_symbol_index,
|
||||
starting_prb,
|
||||
second_hop,
|
||||
(uint8_t)time_domain_occ,
|
||||
(uint8_t)N_UCI);
|
||||
break;
|
||||
}
|
||||
|
||||
case pucch_format2_nr: {
|
||||
nr_generate_pucch2(ue,
|
||||
ue->pdcch_vars[ue->current_thread_id[nr_tti_tx]][gNB_id]->crnti,
|
||||
ue->common_vars.txdataF,
|
||||
&ue->frame_parms,
|
||||
&ue->pucch_config_dedicated_nr[gNB_id],
|
||||
pucch_payload,
|
||||
tx_amp,
|
||||
nr_tti_tx,
|
||||
nb_symbols_total,
|
||||
starting_symbol_index,
|
||||
nb_of_prbs,
|
||||
starting_prb,
|
||||
(uint8_t)N_UCI);
|
||||
break;
|
||||
}
|
||||
|
||||
case pucch_format3_nr:
|
||||
case pucch_format4_nr: {
|
||||
nr_generate_pucch3_4(ue,
|
||||
ue->pdcch_vars[ue->current_thread_id[nr_tti_tx]][gNB_id]->crnti,
|
||||
ue->common_vars.txdataF,
|
||||
&ue->frame_parms,
|
||||
format,
|
||||
&ue->pucch_config_dedicated_nr[gNB_id],
|
||||
pucch_payload,
|
||||
tx_amp,
|
||||
nr_tti_tx,
|
||||
nb_symbols_total,
|
||||
starting_symbol_index,
|
||||
nb_of_prbs,
|
||||
starting_prb,
|
||||
second_hop,
|
||||
(uint8_t)N_UCI,
|
||||
(uint8_t)occ_length,
|
||||
(uint8_t)occ_Index);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (v_return);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
uint8_t transmission_mode = 1;
|
||||
uint8_t nb_antennas_tx = 1;
|
||||
uint8_t nb_antennas_rx = 1;
|
||||
uint8_t frame_type = FDD;
|
||||
uint8_t N_RB_DL=106;
|
||||
lte_prefix_type_t extended_prefix_flag = NORMAL;
|
||||
int Nid_cell[] = {(3*1+3)};
|
||||
VOID_PARAMETER argc;
|
||||
VOID_PARAMETER argv;
|
||||
printf(" PUCCH TEST \n");
|
||||
printf("-----------\n");
|
||||
|
||||
if (init_test(nb_antennas_tx, nb_antennas_rx, transmission_mode, extended_prefix_flag, frame_type, Nid_cell[0], N_RB_DL) != 0) {
|
||||
printf("Initialisation problem for test \n");
|
||||
exit(-1);;
|
||||
}
|
||||
|
||||
if (test_pucch_generators(PHY_vars_UE) != 0) {
|
||||
printf("\nTest PUCCH is fail \n");
|
||||
} else {
|
||||
printf("\nTest PUCCH is pass \n");
|
||||
}
|
||||
|
||||
free_context_synchro_nr();
|
||||
return(0);
|
||||
}
|
||||
@@ -107,10 +107,10 @@ void rf_rx(double **r_re,
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if (fabs(f_off) > 10000.0) {
|
||||
/* if (fabs(f_off) > 10000.0) {
|
||||
printf("rf.c: Illegal f_off %f\n",f_off);
|
||||
exit(-1);
|
||||
}
|
||||
}*/
|
||||
|
||||
if (fabs(drift) > 1000.0) {
|
||||
printf("rf.c: Illegal drift %f\n",drift);
|
||||
|
||||
@@ -437,7 +437,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
|
||||
/*if (slotP==2)
|
||||
nr_schedule_css_dlsch_phytest(module_idP, frameP, slotP);*/
|
||||
|
||||
if (slotP==2)
|
||||
if (slotP==1)
|
||||
nr_schedule_uss_dlsch_phytest(module_idP, frameP, slotP);
|
||||
|
||||
/*
|
||||
|
||||
@@ -292,7 +292,7 @@ int nr_ue_dcireq(nr_dcireq_t *dcireq) {
|
||||
|
||||
uint32_t number_of_search_space_per_slot=1;
|
||||
uint32_t first_symbol_index=0;
|
||||
uint32_t search_space_duration=1; // element of search space
|
||||
uint32_t search_space_duration=0; // element of search space
|
||||
uint32_t coreset_duration; // element of coreset
|
||||
|
||||
coreset_duration = num_symbols * number_of_search_space_per_slot;
|
||||
|
||||
@@ -444,6 +444,7 @@ static void *UE_thread_synch(void *arg) {
|
||||
|
||||
//write_output("txdata_sym.m", "txdata_sym", UE->common_vars.rxdata[0], (10*UE->frame_parms.samples_per_slot), 1, 1);
|
||||
|
||||
freq_offset = UE->common_vars.freq_offset; // frequency offset computed with pss in initial sync
|
||||
hw_slot_offset = (UE->rx_offset<<1) / UE->frame_parms.samples_per_slot;
|
||||
printf("Got synch: hw_slot_offset %d, carrier off %d Hz, rxgain %d (DL %u, UL %u), UE_scan_carrier %d\n",
|
||||
hw_slot_offset,
|
||||
@@ -457,16 +458,13 @@ static void *UE_thread_synch(void *arg) {
|
||||
// rerun with new cell parameters and frequency-offset
|
||||
for (i=0; i<openair0_cfg[UE->rf_map.card].rx_num_channels; i++) {
|
||||
openair0_cfg[UE->rf_map.card].rx_gain[UE->rf_map.chain+i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET;
|
||||
if (UE->UE_scan_carrier == 1) {
|
||||
if (freq_offset >= 0)
|
||||
openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] += abs(UE->common_vars.freq_offset);
|
||||
openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] += abs(freq_offset);
|
||||
else
|
||||
openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] -= abs(UE->common_vars.freq_offset);
|
||||
openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] -= abs(freq_offset);
|
||||
openair0_cfg[UE->rf_map.card].tx_freq[UE->rf_map.chain+i] =
|
||||
openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i]+uplink_frequency_offset[CC_id][i];
|
||||
downlink_frequency[CC_id][i] = openair0_cfg[CC_id].rx_freq[i];
|
||||
freq_offset=0;
|
||||
}
|
||||
}
|
||||
|
||||
// reconfigure for potentially different bandwidth
|
||||
@@ -602,7 +600,7 @@ static void *UE_thread_synch(void *arg) {
|
||||
|
||||
phy_scope_UE(form_ue[0],
|
||||
PHY_vars_UE_g[0][0],
|
||||
0,0,7);
|
||||
0,0,1);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -693,6 +691,7 @@ static void *UE_thread_rxn_txnp4(void *arg) {
|
||||
|
||||
NR_UE_MAC_INST_t *UE_mac = get_mac_inst(0);
|
||||
UE_mac->scheduled_response.dl_config = &UE->dcireq.dl_config_req;
|
||||
UE_mac->scheduled_response.slot = proc->nr_tti_rx;
|
||||
nr_ue_scheduled_response(&UE_mac->scheduled_response);
|
||||
|
||||
#ifdef UE_SLOT_PARALLELISATION
|
||||
@@ -920,7 +919,7 @@ void *UE_thread(void *arg) {
|
||||
if(thread_idx>=RX_NB_TH)
|
||||
thread_idx = 0;
|
||||
|
||||
printf("slot_nr %d nb slot frame %d\n",slot_nr, nb_slot_frame);
|
||||
//printf("slot_nr %d nb slot frame %d\n",slot_nr, nb_slot_frame);
|
||||
|
||||
slot_nr++;
|
||||
slot_nr %= nb_slot_frame;
|
||||
@@ -1110,6 +1109,7 @@ void *UE_thread(void *arg) {
|
||||
|
||||
NR_UE_MAC_INST_t *UE_mac = get_mac_inst(0);
|
||||
UE_mac->scheduled_response.dl_config = &UE->dcireq.dl_config_req;
|
||||
UE_mac->scheduled_response.slot = proc->nr_tti_rx;
|
||||
nr_ue_scheduled_response(&UE_mac->scheduled_response);
|
||||
|
||||
//write_output("uerxdata_frame.m", "uerxdata_frame", UE->common_vars.rxdata[0], UE->frame_parms.samples_per_frame, 1, 1);
|
||||
|
||||
@@ -130,6 +130,7 @@ static char *itti_dump_file = NULL;
|
||||
|
||||
int UE_scan = 0;
|
||||
int UE_scan_carrier = 0;
|
||||
int UE_fo_compensation = 0;
|
||||
runmode_t mode = normal_txrx;
|
||||
|
||||
FILE *input_fd=NULL;
|
||||
@@ -978,6 +979,7 @@ int main( int argc, char **argv ) {
|
||||
|
||||
UE[CC_id]->UE_scan = UE_scan;
|
||||
UE[CC_id]->UE_scan_carrier = UE_scan_carrier;
|
||||
UE[CC_id]->UE_fo_compensation = UE_fo_compensation;
|
||||
UE[CC_id]->mode = mode;
|
||||
printf("UE[%d]->mode = %d\n",CC_id,mode);
|
||||
|
||||
|
||||
@@ -55,6 +55,7 @@
|
||||
#define CONFIG_HLP_UENANTR "set UE number of rx antennas\n"
|
||||
#define CONFIG_HLP_UENANTT "set UE number of tx antennas\n"
|
||||
#define CONFIG_HLP_UESCAN "set UE to scan around carrier\n"
|
||||
#define CONFIG_HLP_UEFO "set UE to enable estimation and compensation of frequency offset\n"
|
||||
#define CONFIG_HLP_DUMPFRAME "dump UE received frame to rxsig_frame0.dat and exit\n"
|
||||
#define CONFIG_HLP_DLSHIFT "dynamic shift for LLR compuation for TM3/4 (default 0)\n"
|
||||
#define CONFIG_HLP_UELOOP "get softmodem (UE) to loop through memory instead of acquiring from HW\n"
|
||||
@@ -135,6 +136,7 @@
|
||||
{"ue-nb-ant-rx", CONFIG_HLP_UENANTR, 0, u8ptr:&nb_antenna_rx, defuintval:1, TYPE_UINT8, 0}, \
|
||||
{"ue-nb-ant-tx", CONFIG_HLP_UENANTT, 0, u8ptr:&nb_antenna_tx, defuintval:1, TYPE_UINT8, 0}, \
|
||||
{"ue-scan-carrier", CONFIG_HLP_UESCAN, PARAMFLAG_BOOL, iptr:&UE_scan_carrier, defintval:0, TYPE_INT, 0}, \
|
||||
{"ue-fo-compensation", CONFIG_HLP_UEFO, PARAMFLAG_BOOL, iptr:&UE_fo_compensation, defintval:0, TYPE_INT, 0}, \
|
||||
{"ue-max-power", NULL, 0, iptr:&(tx_max_power[0]), defintval:90, TYPE_INT, 0}, \
|
||||
{"r" , CONFIG_HLP_PRB, 0, iptr:&(frame_parms[0]->N_RB_DL), defintval:25, TYPE_UINT, 0}, \
|
||||
{"dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, iptr:(int32_t *)&dlsch_demod_shift, defintval:0, TYPE_INT, 0}, \
|
||||
|
||||
Reference in New Issue
Block a user