Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Michael Black
OpenXG UE
Commits
afee2b19
Commit
afee2b19
authored
Jan 28, 2019
by
frtabu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Go on removing printf arguments warnings, add a suppression file to be used with cppcheck command
parent
05bc6767
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
1174 additions
and
1393 deletions
+1174
-1393
ci-scripts/cppcheck_suppressions.list
ci-scripts/cppcheck_suppressions.list
+6
-0
common/utils/backtrace.c
common/utils/backtrace.c
+7
-8
common/utils/hashtable/obj_hashtable.c
common/utils/hashtable/obj_hashtable.c
+189
-172
openair1/PHY/CODING/ccoding_byte.c
openair1/PHY/CODING/ccoding_byte.c
+1
-1
openair1/PHY/CODING/lte_rate_matching.c
openair1/PHY/CODING/lte_rate_matching.c
+3
-4
openair1/PHY/CODING/lte_segmentation.c
openair1/PHY/CODING/lte_segmentation.c
+2
-2
openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c
openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c
+4
-27
openair1/PHY/LTE_REFSIG/lte_ul_ref.c
openair1/PHY/LTE_REFSIG/lte_ul_ref.c
+15
-28
openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
+238
-292
openair1/SIMULATION/LTE_PHY/dlsim.c
openair1/SIMULATION/LTE_PHY/dlsim.c
+709
-859
No files found.
ci-scripts/cppcheck_suppressions.list
0 → 100644
View file @
afee2b19
// suppress error about keysP not free, it is done by calling func */
memleak:common/utils/hashtable/obj_hashtable.c
// followings errors are in file not used in oai exec's included in CI
invalidPrintfArgType_sint:openair1/PHY/CODING/TESTBENCH/ltetest.c
memleak:openair1/PHY/CODING/TESTBENCH/ltetest.c
invalidPrintfArgType_sint:openair1/PHY/CODING/TESTBENCH/pdcch_test.c
common/utils/backtrace.c
View file @
afee2b19
...
...
@@ -31,18 +31,18 @@
#include "backtrace.h"
/* Obtain a backtrace and print it to stdout. */
void
display_backtrace
(
void
)
{
void
display_backtrace
(
void
)
{
void
*
array
[
10
];
size_t
size
;
char
**
strings
;
size_t
i
;
char
*
test
=
getenv
(
"NO_BACKTRACE"
);
if
(
test
!=
0
)
*
((
int
*
)
0
)
=
0
;
char
*
test
=
getenv
(
"NO_BACKTRACE"
);
if
(
test
!=
0
)
*
((
int
*
)
0
)
=
0
;
size
=
backtrace
(
array
,
10
);
strings
=
backtrace_symbols
(
array
,
size
);
printf
(
"Obtained %zd stack frames.
\n
"
,
size
);
printf
(
"Obtained %u stack frames.
\n
"
,
(
unsigned
int
)
size
);
for
(
i
=
0
;
i
<
size
;
i
++
)
printf
(
"%s
\n
"
,
strings
[
i
]);
...
...
@@ -50,8 +50,7 @@ void display_backtrace(void)
free
(
strings
);
}
void
backtrace_handle_signal
(
siginfo_t
*
info
)
{
void
backtrace_handle_signal
(
siginfo_t
*
info
)
{
display_backtrace
();
//exit(EXIT_FAILURE);
}
common/utils/hashtable/obj_hashtable.c
View file @
afee2b19
...
...
@@ -2,9 +2,9 @@
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
...
...
@@ -30,13 +30,12 @@
* This is a simple/naive hash function which adds the key's ASCII char values. It will probably generate lots of collisions on large hash tables.
*/
static
hash_size_t
def_hashfunc
(
const
void
*
keyP
,
int
key_sizeP
)
{
hash_size_t
hash
=
0
;
static
hash_size_t
def_hashfunc
(
const
void
*
keyP
,
int
key_sizeP
)
{
hash_size_t
hash
=
0
;
while
(
key_sizeP
)
hash
^=
((
unsigned
char
*
)
keyP
)[
key_sizeP
--
];
while
(
key_sizeP
)
hash
^=
((
unsigned
char
*
)
keyP
)[
key_sizeP
--
];
return
hash
;
return
hash
;
}
//-------------------------------------------------------------------------------------------------------------------------------
...
...
@@ -46,201 +45,221 @@ static hash_size_t def_hashfunc(const void *keyP, int key_sizeP)
* The user can also specify a hash function. If the hashfunc argument is NULL, a default hash function is used.
* If an error occurred, NULL is returned. All other values in the returned obj_hash_table_t pointer should be released with hashtable_destroy().
*/
obj_hash_table_t
*
obj_hashtable_create
(
hash_size_t
sizeP
,
hash_size_t
(
*
hashfuncP
)(
const
void
*
,
int
),
void
(
*
freekeyfuncP
)(
void
*
),
void
(
*
freedatafuncP
)(
void
*
))
{
obj_hash_table_t
*
hashtbl
;
obj_hash_table_t
*
obj_hashtable_create
(
hash_size_t
sizeP
,
hash_size_t
(
*
hashfuncP
)(
const
void
*
,
int
),
void
(
*
freekeyfuncP
)(
void
*
),
void
(
*
freedatafuncP
)(
void
*
))
{
obj_hash_table_t
*
hashtbl
;
if
(
!
(
hashtbl
=
malloc
(
sizeof
(
obj_hash_table_t
))))
return
NULL
;
if
(
!
(
hashtbl
=
malloc
(
sizeof
(
obj_hash_table_t
))))
return
NULL
;
if
(
!
(
hashtbl
->
nodes
=
calloc
(
sizeP
,
sizeof
(
obj_hash_node_t
*
))))
{
free
(
hashtbl
);
return
NULL
;
}
if
(
!
(
hashtbl
->
nodes
=
calloc
(
sizeP
,
sizeof
(
obj_hash_node_t
*
))))
{
free
(
hashtbl
);
return
NULL
;
}
hashtbl
->
size
=
sizeP
;
hashtbl
->
size
=
sizeP
;
if
(
hashfuncP
)
hashtbl
->
hashfunc
=
hashfuncP
;
else
hashtbl
->
hashfunc
=
def_hashfunc
;
if
(
hashfuncP
)
hashtbl
->
hashfunc
=
hashfuncP
;
else
hashtbl
->
hashfunc
=
def_hashfunc
;
if
(
freekeyfuncP
)
hashtbl
->
freekeyfunc
=
freekeyfuncP
;
else
hashtbl
->
freekeyfunc
=
free
;
if
(
freekeyfuncP
)
hashtbl
->
freekeyfunc
=
freekeyfuncP
;
else
hashtbl
->
freekeyfunc
=
free
;
if
(
freedatafuncP
)
hashtbl
->
freedatafunc
=
freedatafuncP
;
else
hashtbl
->
freedatafunc
=
free
;
if
(
freedatafuncP
)
hashtbl
->
freedatafunc
=
freedatafuncP
;
else
hashtbl
->
freedatafunc
=
free
;
return
hashtbl
;
return
hashtbl
;
}
//-------------------------------------------------------------------------------------------------------------------------------
/*
* Cleanup
* The hashtable_destroy() walks through the linked lists for each possible hash value, and releases the elements. It also releases the nodes array and the obj_hash_table_t.
*/
hashtable_rc_t
obj_hashtable_destroy
(
obj_hash_table_t
*
hashtblP
)
{
hash_size_t
n
;
obj_hash_node_t
*
node
,
*
oldnode
;
hashtable_rc_t
obj_hashtable_destroy
(
obj_hash_table_t
*
hashtblP
)
{
hash_size_t
n
;
obj_hash_node_t
*
node
,
*
oldnode
;
for
(
n
=
0
;
n
<
hashtblP
->
size
;
++
n
)
{
node
=
hashtblP
->
nodes
[
n
];
while
(
node
)
{
oldnode
=
node
;
node
=
node
->
next
;
hashtblP
->
freekeyfunc
(
oldnode
->
key
)
;
hashtblP
->
freedatafunc
(
oldnode
->
data
);
free
(
oldnode
);
}
for
(
n
=
0
;
n
<
hashtblP
->
size
;
++
n
)
{
node
=
hashtblP
->
nodes
[
n
];
while
(
node
)
{
oldnode
=
node
;
node
=
node
->
next
;
hashtblP
->
freekeyfunc
(
oldnode
->
key
);
hashtblP
->
freedatafunc
(
oldnode
->
data
);
free
(
oldnode
);
}
free
(
hashtblP
->
nodes
);
free
(
hashtblP
);
return
HASH_TABLE_OK
;
}
free
(
hashtblP
->
nodes
);
free
(
hashtblP
);
return
HASH_TABLE_OK
;
}
//-------------------------------------------------------------------------------------------------------------------------------
hashtable_rc_t
obj_hashtable_is_key_exists
(
obj_hash_table_t
*
hashtblP
,
void
*
keyP
,
int
key_sizeP
)
hashtable_rc_t
obj_hashtable_is_key_exists
(
obj_hash_table_t
*
hashtblP
,
void
*
keyP
,
int
key_sizeP
)
//-------------------------------------------------------------------------------------------------------------------------------
{
obj_hash_node_t
*
node
;
hash_size_t
hash
;
obj_hash_node_t
*
node
;
hash_size_t
hash
;
if
(
hashtblP
==
NULL
)
{
return
HASH_TABLE_BAD_PARAMETER_HASHTABLE
;
}
hash
=
hashtblP
->
hashfunc
(
keyP
,
key_sizeP
)
%
hashtblP
->
size
;
node
=
hashtblP
->
nodes
[
hash
]
;
while
(
node
)
{
if
(
node
->
key
==
keyP
)
{
return
HASH_TABLE_OK
;
}
else
if
(
node
->
key_size
==
key_size
P
)
{
if
(
memcmp
(
node
->
key
,
keyP
,
key_sizeP
)
==
0
)
{
return
HASH_TABLE_OK
;
}
}
node
=
node
->
next
;
if
(
hashtblP
==
NULL
)
{
return
HASH_TABLE_BAD_PARAMETER_HASHTABLE
;
}
hash
=
hashtblP
->
hashfunc
(
keyP
,
key_sizeP
)
%
hashtblP
->
size
;
node
=
hashtblP
->
nodes
[
hash
];
while
(
node
)
{
if
(
node
->
key
==
key
P
)
{
return
HASH_TABLE_OK
;
}
else
if
(
node
->
key_size
==
key_sizeP
)
{
if
(
memcmp
(
node
->
key
,
keyP
,
key_sizeP
)
==
0
)
{
return
HASH_TABLE_OK
;
}
}
return
HASH_TABLE_KEY_NOT_EXISTS
;
node
=
node
->
next
;
}
return
HASH_TABLE_KEY_NOT_EXISTS
;
}
//-------------------------------------------------------------------------------------------------------------------------------
/*
* Adding a new element
* To make sure the hash value is not bigger than size, the result of the user provided hash function is used modulo size.
*/
hashtable_rc_t
obj_hashtable_insert
(
obj_hash_table_t
*
hashtblP
,
void
*
keyP
,
int
key_sizeP
,
void
*
dataP
)
{
obj_hash_node_t
*
node
;
hash_size_t
hash
;
hashtable_rc_t
obj_hashtable_insert
(
obj_hash_table_t
*
hashtblP
,
void
*
keyP
,
int
key_sizeP
,
void
*
dataP
)
{
obj_hash_node_t
*
node
;
hash_size_t
hash
;
if
(
hashtblP
==
NULL
)
{
return
HASH_TABLE_BAD_PARAMETER_HASHTABLE
;
}
hash
=
hashtblP
->
hashfunc
(
keyP
,
key_sizeP
)
%
hashtblP
->
size
;
node
=
hashtblP
->
nodes
[
hash
];
while
(
node
)
{
if
(
node
->
key
==
keyP
)
{
if
(
node
->
data
)
{
hashtblP
->
freedatafunc
(
node
->
data
);
}
node
->
data
=
dataP
;
// waste of memory here (keyP is lost) we should free it now
return
HASH_TABLE_INSERT_OVERWRITTEN_DATA
;
}
node
=
node
->
next
;
}
if
(
!
(
node
=
malloc
(
sizeof
(
obj_hash_node_t
))))
return
-
1
;
node
->
key
=
keyP
;
node
->
data
=
dataP
;
if
(
hashtblP
->
nodes
[
hash
])
{
node
->
next
=
hashtblP
->
nodes
[
hash
];
}
else
{
node
->
next
=
NULL
;
if
(
hashtblP
==
NULL
)
{
return
HASH_TABLE_BAD_PARAMETER_HASHTABLE
;
}
hash
=
hashtblP
->
hashfunc
(
keyP
,
key_sizeP
)
%
hashtblP
->
size
;
node
=
hashtblP
->
nodes
[
hash
];
while
(
node
)
{
if
(
node
->
key
==
keyP
)
{
if
(
node
->
data
)
{
hashtblP
->
freedatafunc
(
node
->
data
);
}
node
->
data
=
dataP
;
// waste of memory here (keyP is lost) we should free it now
return
HASH_TABLE_INSERT_OVERWRITTEN_DATA
;
}
hashtblP
->
nodes
[
hash
]
=
node
;
return
HASH_TABLE_OK
;
node
=
node
->
next
;
}
if
(
!
(
node
=
malloc
(
sizeof
(
obj_hash_node_t
))))
return
-
1
;
node
->
key
=
keyP
;
node
->
data
=
dataP
;
if
(
hashtblP
->
nodes
[
hash
])
{
node
->
next
=
hashtblP
->
nodes
[
hash
];
}
else
{
node
->
next
=
NULL
;
}
hashtblP
->
nodes
[
hash
]
=
node
;
return
HASH_TABLE_OK
;
}
//-------------------------------------------------------------------------------------------------------------------------------
/*
* To remove an element from the hash table, we just search for it in the linked list for that hash value,
* and remove it if it is found. If it was not found, it is an error and -1 is returned.
*/
hashtable_rc_t
obj_hashtable_remove
(
obj_hash_table_t
*
hashtblP
,
const
void
*
keyP
,
int
key_sizeP
)
{
obj_hash_node_t
*
node
,
*
prevnode
=
NULL
;
hash_size_t
hash
;
hashtable_rc_t
obj_hashtable_remove
(
obj_hash_table_t
*
hashtblP
,
const
void
*
keyP
,
int
key_sizeP
)
{
obj_hash_node_t
*
node
,
*
prevnode
=
NULL
;
hash_size_t
hash
;
if
(
hashtblP
==
NULL
)
{
return
HASH_TABLE_BAD_PARAMETER_HASHTABLE
;
}
if
(
hashtblP
==
NULL
)
{
return
HASH_TABLE_BAD_PARAMETER_HASHTABLE
;
}
hash
=
hashtblP
->
hashfunc
(
keyP
,
key_sizeP
)
%
hashtblP
->
size
;
node
=
hashtblP
->
nodes
[
hash
];
while
(
node
)
{
if
((
node
->
key
==
keyP
)
||
((
node
->
key_size
==
key_sizeP
)
&&
(
memcmp
(
node
->
key
,
keyP
,
key_sizeP
)
==
0
))){
if
(
prevnode
)
{
prevnode
->
next
=
node
->
next
;
}
else
{
hashtblP
->
nodes
[
hash
]
=
node
->
next
;
}
hashtblP
->
freekeyfunc
(
node
->
key
);
hashtblP
->
freedatafunc
(
node
->
data
);
free
(
node
);
return
HASH_TABLE_OK
;
}
prevnode
=
node
;
node
=
node
->
next
;
hash
=
hashtblP
->
hashfunc
(
keyP
,
key_sizeP
)
%
hashtblP
->
size
;
node
=
hashtblP
->
nodes
[
hash
];
while
(
node
)
{
if
((
node
->
key
==
keyP
)
||
((
node
->
key_size
==
key_sizeP
)
&&
(
memcmp
(
node
->
key
,
keyP
,
key_sizeP
)
==
0
)))
{
if
(
prevnode
)
{
prevnode
->
next
=
node
->
next
;
}
else
{
hashtblP
->
nodes
[
hash
]
=
node
->
next
;
}
hashtblP
->
freekeyfunc
(
node
->
key
);
hashtblP
->
freedatafunc
(
node
->
data
);
free
(
node
);
return
HASH_TABLE_OK
;
}
return
HASH_TABLE_KEY_NOT_EXISTS
;
prevnode
=
node
;
node
=
node
->
next
;
}
return
HASH_TABLE_KEY_NOT_EXISTS
;
}
//-------------------------------------------------------------------------------------------------------------------------------
/*
* Searching for an element is easy. We just search through the linked list for the corresponding hash value.
* NULL is returned if we didn't find it.
*/
hashtable_rc_t
obj_hashtable_get
(
obj_hash_table_t
*
hashtblP
,
const
void
*
keyP
,
int
key_sizeP
,
void
**
dataP
)
{
obj_hash_node_t
*
node
;
hash_size_t
hash
;
hashtable_rc_t
obj_hashtable_get
(
obj_hash_table_t
*
hashtblP
,
const
void
*
keyP
,
int
key_sizeP
,
void
**
dataP
)
{
obj_hash_node_t
*
node
;
hash_size_t
hash
;
if
(
hashtblP
==
NULL
)
{
*
dataP
=
NULL
;
return
HASH_TABLE_BAD_PARAMETER_HASHTABLE
;
}
hash
=
hashtblP
->
hashfunc
(
keyP
,
key_sizeP
)
%
hashtblP
->
size
;
node
=
hashtblP
->
nodes
[
hash
];
while
(
node
)
{
if
(
node
->
key
==
keyP
)
{
*
dataP
=
node
->
data
;
return
HASH_TABLE_OK
;
}
else
if
(
node
->
key_size
==
key_sizeP
)
{
if
(
memcmp
(
node
->
key
,
keyP
,
key_sizeP
)
==
0
)
{
*
dataP
=
node
->
data
;
return
HASH_TABLE_OK
;
}
}
node
=
node
->
next
;
}
if
(
hashtblP
==
NULL
)
{
*
dataP
=
NULL
;
return
HASH_TABLE_KEY_NOT_EXISTS
;
return
HASH_TABLE_BAD_PARAMETER_HASHTABLE
;
}
hash
=
hashtblP
->
hashfunc
(
keyP
,
key_sizeP
)
%
hashtblP
->
size
;
node
=
hashtblP
->
nodes
[
hash
];
while
(
node
)
{
if
(
node
->
key
==
keyP
)
{
*
dataP
=
node
->
data
;
return
HASH_TABLE_OK
;
}
else
if
(
node
->
key_size
==
key_sizeP
)
{
if
(
memcmp
(
node
->
key
,
keyP
,
key_sizeP
)
==
0
)
{
*
dataP
=
node
->
data
;
return
HASH_TABLE_OK
;
}
}
node
=
node
->
next
;
}
*
dataP
=
NULL
;
return
HASH_TABLE_KEY_NOT_EXISTS
;
}
//-------------------------------------------------------------------------------------------------------------------------------
/*
* Function to return all keys of an object hash table
*/
hashtable_rc_t
obj_hashtable_get_keys
(
obj_hash_table_t
*
hashtblP
,
void
**
keysP
,
unsigned
int
*
sizeP
)
{
size_t
n
=
0
;
obj_hash_node_t
*
node
=
NULL
;
obj_hash_node_t
*
next
=
NULL
;
*
sizeP
=
0
;
keysP
=
calloc
(
hashtblP
->
num_elements
,
sizeof
(
void
*
));
if
(
keysP
)
{
for
(
n
=
0
;
n
<
hashtblP
->
size
;
++
n
)
{
for
(
node
=
hashtblP
->
nodes
[
n
];
node
;
node
=
next
)
{
keysP
[
*
sizeP
++
]
=
node
->
key
;
next
=
node
->
next
;
}
}
return
HASH_TABLE_OK
;
hashtable_rc_t
obj_hashtable_get_keys
(
obj_hash_table_t
*
hashtblP
,
void
**
keysP
,
unsigned
int
*
sizeP
)
{
size_t
n
=
0
;
obj_hash_node_t
*
node
=
NULL
;
obj_hash_node_t
*
next
=
NULL
;
*
sizeP
=
0
;
keysP
=
calloc
(
hashtblP
->
num_elements
,
sizeof
(
void
*
));
if
(
keysP
)
{
for
(
n
=
0
;
n
<
hashtblP
->
size
;
++
n
)
{
for
(
node
=
hashtblP
->
nodes
[
n
];
node
;
node
=
next
)
{
keysP
[
*
sizeP
++
]
=
node
->
key
;
next
=
node
->
next
;
}
}
return
HASH_TABLE_SYSTEM_ERROR
;
// cppcheck-suppress memleak
return
HASH_TABLE_OK
;
}
return
HASH_TABLE_SYSTEM_ERROR
;
}
//-------------------------------------------------------------------------------------------------------------------------------
/*
...
...
@@ -253,34 +272,32 @@ hashtable_rc_t obj_hashtable_get_keys(obj_hash_table_t *hashtblP, void ** keysP,
* This allows us to reuse hashtable_insert() and hashtable_remove(), when moving the elements to the new table.
* After that, we can just free the old table and copy the elements from newtbl to hashtbl.
*/
hashtable_rc_t
obj_hashtable_resize
(
obj_hash_table_t
*
hashtblP
,
hash_size_t
sizeP
)
{
obj_hash_table_t
newtbl
;
hash_size_t
n
;
obj_hash_node_t
*
node
,
*
next
;
hashtable_rc_t
obj_hashtable_resize
(
obj_hash_table_t
*
hashtblP
,
hash_size_t
sizeP
)
{
obj_hash_table_t
newtbl
;
hash_size_t
n
;
obj_hash_node_t
*
node
,
*
next
;
if
(
hashtblP
==
NULL
)
{
return
HASH_TABLE_BAD_PARAMETER_HASHTABLE
;
}
if
(
hashtblP
==
NULL
)
{
return
HASH_TABLE_BAD_PARAMETER_HASHTABLE
;
}
newtbl
.
size
=
sizeP
;
newtbl
.
hashfunc
=
hashtblP
->
hashfunc
;
newtbl
.
size
=
sizeP
;
newtbl
.
hashfunc
=
hashtblP
->
hashfunc
;
if
(
!
(
newtbl
.
nodes
=
calloc
(
sizeP
,
sizeof
(
obj_hash_node_t
*
))))
return
HASH_TABLE_SYSTEM_ERROR
;
if
(
!
(
newtbl
.
nodes
=
calloc
(
sizeP
,
sizeof
(
obj_hash_node_t
*
))))
return
HASH_TABLE_SYSTEM_ERROR
;
for
(
n
=
0
;
n
<
hashtblP
->
size
;
++
n
)
{
for
(
node
=
hashtblP
->
nodes
[
n
];
node
;
node
=
next
)
{
next
=
node
->
next
;
obj_hashtable_insert
(
&
newtbl
,
node
->
key
,
node
->
key_size
,
node
->
data
);
obj_hashtable_remove
(
hashtblP
,
node
->
key
,
node
->
key_size
);
}
for
(
n
=
0
;
n
<
hashtblP
->
size
;
++
n
)
{
for
(
node
=
hashtblP
->
nodes
[
n
];
node
;
node
=
next
)
{
next
=
node
->
next
;
obj_hashtable_insert
(
&
newtbl
,
node
->
key
,
node
->
key_size
,
node
->
data
);
obj_hashtable_remove
(
hashtblP
,
node
->
key
,
node
->
key_size
);
}
}
free
(
hashtblP
->
nodes
);
hashtblP
->
size
=
newtbl
.
size
;
hashtblP
->
nodes
=
newtbl
.
nodes
;
return
HASH_TABLE_OK
;
free
(
hashtblP
->
nodes
);
hashtblP
->
size
=
newtbl
.
size
;
hashtblP
->
nodes
=
newtbl
.
nodes
;
return
HASH_TABLE_OK
;
}
...
...
openair1/PHY/CODING/ccoding_byte.c
View file @
afee2b19
...
...
@@ -130,7 +130,7 @@ ccodedot11_encode (unsigned int numbytes,
*
outPtr
++
=
(
out
>>
1
)
&
1
;
#ifdef DEBUG_CCODE
printf
(
"%
d
: %u -> %d (%u)
\n
"
,
dummy
,
state
,
out
,
ccodedot11_table
[
state
]);
printf
(
"%
u
: %u -> %d (%u)
\n
"
,
dummy
,
state
,
out
,
ccodedot11_table
[
state
]);
dummy
+=
2
;
#endif //DEBUG_CCODE
bit_index
=
(
bit_index
==
0
)
?
1
:
0
;
...
...
openair1/PHY/CODING/lte_rate_matching.c
View file @
afee2b19
...
...
@@ -236,7 +236,7 @@ void sub_block_deinterleaving_cc(uint32_t D,int8_t *d,int8_t *w) {
ND
=
Kpi
-
D
;
#ifdef RM_DEBUG2
printf
(
"sub_block_interleaving_cc : D = %d (%d), d %p, w %p
\n
"
,
D
,
D
*
3
,
d
,
w
);
printf
(
"RCC = %d, Kpi=%d, ND=%ld
\n
"
,
RCC
,
Kpi
,
ND
);
printf
(
"RCC = %d, Kpi=%d, ND=%ld
\n
"
,
RCC
,
Kpi
,
(
long
)
ND
);
#endif
ND3
=
ND
*
3
;
k
=
0
;
...
...
@@ -253,7 +253,8 @@ void sub_block_deinterleaving_cc(uint32_t D,int8_t *d,int8_t *w) {
d
[
index3
-
ND3
+
1
]
=
w
[
Kpi
+
k
];
d
[
index3
-
ND3
+
2
]
=
w
[(
Kpi
<<
1
)
+
k
];
#ifdef RM_DEBUG2
printf
(
"row %d, index %d k %d index3-ND3 %ld w(%d,%d,%d)
\n
"
,
row
,
index
,
k
,
index3
-
ND3
,
w
[
k
],
w
[
Kpi
+
k
],
w
[(
Kpi
<<
1
)
+
k
]);
printf
(
"row %d, index %d k %d index3-ND3 %ld w(%d,%d,%d)
\n
"
,
row
,
index
,
k
,(
long
)(
index3
-
ND3
),
w
[
k
],
w
[
Kpi
+
k
],
w
[(
Kpi
<<
1
)
+
k
]);
#endif
index3
+=
96
;
index
+=
32
;
...
...
@@ -453,7 +454,6 @@ uint32_t lte_rate_matching_turbo(uint32_t RTC,
int
threed
=
0
;
uint32_t
nulled
=
0
;
static
unsigned
char
*
counter_buffer
[
MAX_NUM_DLSCH_SEGMENTS
][
4
];
FILE
*
counter_fd
;
char
fname
[
512
];
#endif
...
...
@@ -476,7 +476,6 @@ uint32_t lte_rate_matching_turbo(uint32_t RTC,
}
else
if
(
rvidx
==
3
)
{
sprintf
(
fname
,
"mcs%d_rate_matching_RB_%d.txt"
,
m
,
nb_rb
);
// sprintf(fname,"mcs0_rate_matching_RB_6.txt");
counter_fd
=
fopen
(
fname
,
"w"
);
}
#endif
...
...
openair1/PHY/CODING/lte_segmentation.c
View file @
afee2b19
...
...
@@ -124,8 +124,8 @@ int lte_segmentation(unsigned char *input_buffer,
Bprime
,
*
Cplus
,
*
Kplus
,
*
Cminus
,
*
Kminus
);
*
F
=
((
*
Cplus
)
*
(
*
Kplus
)
+
(
*
Cminus
)
*
(
*
Kminus
)
-
(
Bprime
));
#ifdef DEBUG_SEGMENTATION
printf
(
"C %u, Cplus %u, Cminus %u, Kplus %u, Kminus %u, Bprime_bytes %u, Bprime %u, F %u
\n
"
,
*
C
,
*
Cplus
,
*
Cminus
,
*
Kplus
,
*
Kminus
,
Bprime
>>
3
,
Bprime
,
*
F
);
#endif
printf
(
"C %u, Cplus %u, Cminus %u, Kplus %u, Kminus %u, Bprime_bytes %u, Bprime %u, F %u
\n
"
,
*
C
,
*
Cplus
,
*
Cminus
,
*
Kplus
,
*
Kminus
,
Bprime
>>
3
,
Bprime
,
*
F
);
if
((
input_buffer
)
&&
(
output_buffers
))
{
for
(
k
=
0
;
k
<*
F
>>
3
;
k
++
)
{
...
...
openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c
View file @
afee2b19
...
...
@@ -35,30 +35,22 @@
int
lte_dl_mbsfn
(
PHY_VARS_eNB
*
eNB
,
int32_t
*
output
,
short
amp
,
int
subframe
,
unsigned
char
l
)
{
unsigned
char
l
)
{
unsigned
int
mprime
,
mprime_dword
,
mprime_qpsk_symb
,
m
;
unsigned
short
k
=
0
,
a
;
int32_t
qpsk
[
4
];
a
=
(
amp
*
ONE_OVER_SQRT2_Q15
)
>>
15
;
((
short
*
)
&
qpsk
[
0
])[
0
]
=
a
;
((
short
*
)
&
qpsk
[
0
])[
1
]
=
a
;
((
short
*
)
&
qpsk
[
1
])[
0
]
=
-
a
;
((
short
*
)
&
qpsk
[
1
])[
1
]
=
a
;
((
short
*
)
&
qpsk
[
2
])[
0
]
=
a
;
((
short
*
)
&
qpsk
[
2
])[
1
]
=
-
a
;
((
short
*
)
&
qpsk
[
3
])[
0
]
=
-
a
;
((
short
*
)
&
qpsk
[
3
])[
1
]
=
-
a
;
mprime
=
3
*
(
110
-
eNB
->
frame_parms
.
N_RB_DL
);
for
(
m
=
0
;
m
<
eNB
->
frame_parms
.
N_RB_DL
*
6
;
m
++
)
{
if
((
l
==
0
)
||
(
l
==
2
))
k
=
m
<<
1
;
else
if
(
l
==
1
)
...
...
@@ -69,7 +61,6 @@ int lte_dl_mbsfn(PHY_VARS_eNB *eNB, int32_t *output,
}
k
+=
eNB
->
frame_parms
.
first_carrier_offset
;
mprime_dword
=
mprime
>>
4
;
mprime_qpsk_symb
=
mprime
&
0xf
;
...
...
@@ -80,22 +71,18 @@ int lte_dl_mbsfn(PHY_VARS_eNB *eNB, int32_t *output,
output
[
k
]
=
qpsk
[(
eNB
->
lte_gold_mbsfn_table
[
subframe
][
l
][
mprime_dword
]
>>
(
2
*
mprime_qpsk_symb
))
&
3
];
//output[k] = (lte_gold_table[eNB_offset][subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3;
#ifdef DEBUG_DL_MBSFN
LOG_D
(
PHY
,
"subframe %d, l %d, m %d, mprime %d, mprime_dword %d, mprime_qpsk_symbol %d
\n
"
,
subframe
,
l
,
m
,
mprime
,
mprime_dword
,
mprime_qpsk_symb
);
subframe
,
l
,
m
,
mprime
,
mprime_dword
,
mprime_qpsk_symb
);
LOG_D
(
PHY
,
"index = %d (k %d)(%x)
\n
"
,(
eNB
->
lte_gold_mbsfn_table
[
subframe
][
l
][
mprime_dword
]
>>
(
2
*
mprime_qpsk_symb
))
&
3
,
k
,
eNB
->
lte_gold_mbsfn_table
[
subframe
][
l
][
mprime_dword
]);
#endif
mprime
++
;
#ifdef DEBUG_DL_MBSFN
if
(
m
<
18
)
printf
(
"subframe %d, l %d output[%d] = (%d,%d)
\n
"
,
subframe
,
l
,
k
,((
short
*
)
&
output
[
k
])[
0
],((
short
*
)
&
output
[
k
])[
1
]);
#endif
}
return
(
0
);
...
...
@@ -106,15 +93,11 @@ int lte_dl_mbsfn(PHY_VARS_eNB *eNB, int32_t *output,
int
lte_dl_mbsfn_rx
(
PHY_VARS_UE
*
ue
,
int
*
output
,
int
subframe
,
unsigned
char
l
)
{
unsigned
char
l
)
{
unsigned
int
mprime
,
mprime_dword
,
mprime_qpsk_symb
,
m
;
unsigned
short
k
=
0
;
unsigned
int
qpsk
[
4
];
// This includes complex conjugate for channel estimation
((
short
*
)
&
qpsk
[
0
])[
0
]
=
ONE_OVER_SQRT2_Q15
;
((
short
*
)
&
qpsk
[
0
])[
1
]
=
-
ONE_OVER_SQRT2_Q15
;
((
short
*
)
&
qpsk
[
1
])[
0
]
=
-
ONE_OVER_SQRT2_Q15
;
...
...
@@ -123,23 +106,18 @@ int lte_dl_mbsfn_rx(PHY_VARS_UE *ue,
((
short
*
)
&
qpsk
[
2
])[
1
]
=
ONE_OVER_SQRT2_Q15
;
((
short
*
)
&
qpsk
[
3
])[
0
]
=
-
ONE_OVER_SQRT2_Q15
;
((
short
*
)
&
qpsk
[
3
])[
1
]
=
ONE_OVER_SQRT2_Q15
;
mprime
=
3
*
(
110
-
ue
->
frame_parms
.
N_RB_DL
);
for
(
m
=
0
;
m
<
ue
->
frame_parms
.
N_RB_DL
*
6
;
m
++
)
{
mprime_dword
=
mprime
>>
4
;
mprime_qpsk_symb
=
mprime
&
0xf
;
// this is r_mprime from 3GPP 36-211 6.10.1.2
output
[
k
]
=
qpsk
[(
ue
->
lte_gold_mbsfn_table
[
subframe
][
l
][
mprime_dword
]
>>
(
2
*
mprime_qpsk_symb
))
&
3
];
#ifdef DEBUG_DL_MBSFN
printf
(
"subframe %d, l %d, m %
d, mprime %d, mprime_dword %d, mprime_qpsk_symbol %d
\n
"
,
printf
(
"subframe %d, l %d, m %
u, mprime %u, mprime_dword %u, mprime_qpsk_symbol %u
\n
"
,
subframe
,
l
,
m
,
mprime
,
mprime_dword
,
mprime_qpsk_symb
);
printf
(
"index = %d (k %d) (%x)
\n
"
,(
ue
->
lte_gold_mbsfn_table
[
subframe
][
l
][
mprime_dword
]
>>
(
2
*
mprime_qpsk_symb
))
&
3
,
k
,
ue
->
lte_gold_mbsfn_table
[
subframe
][
l
][
mprime_dword
]);
#endif
mprime
++
;
#ifdef DEBUG_DL_MBSFN
...
...
@@ -148,7 +126,6 @@ int lte_dl_mbsfn_rx(PHY_VARS_UE *ue,
#endif
k
++
;
}
return
(
0
);
...
...
openair1/PHY/LTE_REFSIG/lte_ul_ref.c
View file @
afee2b19
...
...
@@ -20,9 +20,9 @@
*/
#ifdef MAIN
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#endif
#include "lte_refsig.h"
#include "PHY/defs_eNB.h"
...
...
@@ -43,8 +43,7 @@ char ref24[720] = {
-
1
,
3
,
1
,
-
3
,
3
,
-
1
,
1
,
3
,
-
3
,
3
,
1
,
3
,
-
3
,
3
,
1
,
1
,
-
1
,
1
,
3
,
-
3
,
3
,
-
3
,
-
1
,
-
3
,
-
3
,
3
,
-
3
,
-
3
,
-
3
,
1
,
-
3
,
-
3
,
3
,
-
1
,
1
,
1
,
1
,
3
,
1
,
-
1
,
3
,
-
3
,
-
3
,
1
,
3
,
1
,
1
,
-
3
,
3
,
-
1
,
3
,
3
,
1
,
1
,
-
3
,
3
,
3
,
3
,
3
,
1
,
-
1
,
3
,
-
1
,
1
,
1
,
-
1
,
-
3
,
-
1
,
-
1
,
1
,
3
,
3
,
-
1
,
-
3
,
1
,
1
,
3
,
-
3
,
1
,
1
,
-
3
,
-
1
,
-
1
,
1
,
3
,
1
,
3
,
1
,
-
1
,
3
,
1
,
1
,
-
3
,
-
1
,
-
3
,
-
1
,
-
1
,
-
1
,
-
1
,
-
3
,
-
3
,
-
1
,
1
,
1
,
3
,
3
,
-
1
,
3
,
-
1
,
1
,
-
1
,
-
3
,
1
,
-
1
,
-
3
,
-
3
,
1
,
-
3
,
-
1
,
-
1
,
-
3
,
1
,
1
,
3
,
-
1
,
1
,
3
,
1
,
-
3
,
1
,
-
3
,
1
,
1
,
-
1
,
-
1
,
3
,
-
1
,
-
3
,
3
,
-
3
,
-
3
,
-
3
,
1
,
1
,
1
,
1
,
-
1
,
-
1
,
3
,
-
3
,
-
3
,
3
,
-
3
,
1
,
-
1
,
-
1
,
1
,
-
1
,
1
,
1
,
-
1
,
-
3
,
-
1
,
1
,
-
1
,
3
,
-
1
,
-
3
,
-
3
,
3
,
3
,
-
1
,
-
1
,
-
3
,
-
1
,
3
,
1
,
3
,
1
,
3
,
1
,
1
,
-
1
,
3
,
1
,
-
1
,
1
,
3
,
-
3
,
-
1
,
-
1
,
1
,
-
3
,
1
,
3
,
-
3
,
1
,
-
1
,
-
3
,
3
,
-
3
,
3
,
-
1
,
-
1
,
-
1
,
-
1
,
1
,
-
3
,
-
3
,
-
3
,
1
,
-
3
,
-
3
,
-
3
,
1
,
-
3
,
1
,
1
,
-
3
,
3
,
3
,
-
1
,
-
3
,
-
1
,
3
,
-
3
,
3
,
3
,
3
,
-
1
,
1
,
1
,
-
3
,
1
,
-
1
,
1
,
1
,
-
3
,
1
,
1
,
-
1
,
1
,
-
3
,
-
3
,
3
,
-
1
,
3
,
-
1
,
-
1
,
-
3
,
-
3
,
-
3
,
-
1
,
-
3
,
-
3
,
1
,
-
1
,
1
,
3
,
3
,
-
1
,
1
,
-
1
,
3
,
1
,
3
,
3
,
-
3
,
-
3
,
1
,
3
,
1
,
-
1
,
-
3
,
-
3
,
-
3
,
3
,
3
,
-
3
,
3
,
3
,
-
1
,
-
3
,
3
,
-
1
,
1
,
-
3
,
1
,
1
,
3
,
3
,
1
,
1
,
1
,
-
1
,
-
1
,
1
,
-
3
,
3
,
-
1
,
1
,
1
,
-
3
,
3
,
3
,
-
1
,
-
3
,
3
,
-
3
,
-
1
,
-
3
,
-
1
,
3
,
-
1
,
-
1
,
-
1
,
-
1
,
-
3
,
-
1
,
3
,
3
,
1
,
-
1
,
1
,
3
,
3
,
3
,
-
1
,
1
,
1
,
-
3
,
1
,
3
,
-
1
,
-
3
,
3
,
-
3
,
-
3
,
3
,
1
,
3
,
1
,
-
3
,
3
,
1
,
3
,
1
,
1
,
3
,
3
,
-
1
,
-
1
,
-
3
,
1
,
-
3
,
-
1
,
3
,
1
,
1
,
3
,
-
1
,
-
1
,
1
,
-
3
,
1
,
3
,
-
3
,
1
,
-
1
,
-
3
,
-
1
,
3
,
1
,
3
,
1
,
-
1
,
-
3
,
-
3
,
-
1
,
-
1
,
-
3
,
-
3
,
-
3
,
-
1
,
-
1
,
-
3
,
3
,
-
1
,
-
1
,
-
1
,
-
1
,
1
,
1
,
-
3
,
3
,
1
,
3
,
3
,
1
,
-
1
,
1
,
-
3
,
1
,
-
3
,
1
,
1
,
-
3
,
-
1
,
1
,
3
,
-
1
,
3
,
3
,
-
1
,
-
3
,
1
,
-
1
,
-
3
,
3
,
3
,
3
,
-
1
,
1
,
1
,
3
,
-
1
,
-
3
,
-
1
,
3
,
-
1
,
-
1
,
-
1
,
1
,
1
,
1
,
1
,
1
,
-
1
,
3
,
-
1
,
-
3
,
1
,
1
,
3
,
-
3
,
1
,
-
3
,
-
1
,
1
,
1
,
-
3
,
-
3
,
3
,
1
,
1
,
-
3
,
1
,
3
,
3
,
1
,
-
1
,
-
3
,
3
,
-
1
,
3
,
3
,
3
,
-
3
,
1
,
-
1
,
1
,
-
1
,
-
3
,
-
1
,
1
,
3
,
-
1
,
3
,
-
3
,
-
3
,
-
1
,
-
3
,
3
,
-
3
,
-
3
,
-
3
,
-
1
,
-
1
,
-
3
,
-
1
,
-
3
,
3
,
1
,
3
,
-
3
,
-
1
,
3
,
-
1
,
1
,
-
1
,
3
,
-
3
,
1
,
-
1
,
-
3
,
-
3
,
1
,
1
,
-
1
,
1
,
-
1
,
1
,
-
1
,
3
,
1
,
-
3
,
-
1
,
1
,
-
1
,
1
,
-
1
,
-
1
,
3
,
3
,
-
3
,
-
1
,
1
,
-
3
,
-
3
,
-
1
,
-
3
,
3
,
1
,
-
1
,
-
3
,
-
1
,
-
3
,
-
3
,
3
,
-
3
,
3
,
-
3
,
-
1
,
1
,
3
,
1
,
-
3
,
1
,
3
,
3
,
-
1
,
-
3
,
-
1
,
-
1
,
-
1
,
-
1
,
3
,
3
,
3
,
1
,
3
,
3
,
-
3
,
1
,
3
,
-
1
,
3
,
-
1
,
3
,
3
,
-
3
,
3
,
1
,
-
1
,
3
,
3
,
1
,
-
1
,
3
,
3
,
-
1
,
-
3
,
3
,
-
3
,
-
1
,
-
1
,
3
,
-
1
,
3
,
-
1
,
-
1
,
1
,
1
,
1
,
1
,
-
1
,
-
1
,
-
3
,
-
1
,
3
,
1
,
-
1
,
1
,
-
1
,
3
,
-
1
,
3
,
1
,
1
,
-
1
,
-
1
,
-
3
,
1
,
1
,
-
3
,
1
,
3
,
-
3
,
1
,
1
,
-
3
,
-
3
,
-
1
,
-
1
,
-
3
,
-
1
,
1
,
3
,
1
,
1
,
-
3
,
-
1
,
-
1
,
-
3
,
3
,
-
3
,
3
,
1
,
-
3
,
3
,
-
3
,
1
,
-
1
,
1
,
-
3
,
1
,
1
,
1
,
-
1
,
-
3
,
3
,
3
,
1
,
1
,
3
,
-
1
,
-
3
,
-
1
,
-
1
,
-
1
,
3
,
1
,
-
3
,
-
3
,
-
1
,
3
,
-
3
,
-
1
,
-
3
,
-
1
,
-
3
,
-
1
,
-
1
,
-
3
,
-
1
,
-
1
,
1
,
-
3
,
-
1
,
-
1
,
1
,
-
1
,
-
3
,
1
,
1
,
-
3
,
1
,
-
3
,
-
3
,
3
,
1
,
1
,
-
1
,
3
,
-
1
,
-
1
,
1
,
1
,
-
1
,
-
1
,
-
3
,
-
1
,
3
,
-
1
,
3
,
-
1
,
1
,
3
,
1
,
-
1
,
3
,
1
,
3
,
-
3
,
-
3
,
1
,
-
1
,
-
1
,
1
,
3
};
void
generate_ul_ref_sigs
(
void
)
{
void
generate_ul_ref_sigs
(
void
)
{
double
qbar
,
phase
;
unsigned
int
u
,
v
,
Msc_RS
,
q
,
m
,
n
;
...
...
@@ -53,7 +52,7 @@ void generate_ul_ref_sigs(void)
for
(
u
=
0
;
u
<
30
;
u
++
)
{
for
(
v
=
0
;
v
<
2
;
v
++
)
{
qbar
=
ref_primes
[
Msc_RS
]
*
(
u
+
1
)
/
(
double
)
31
;
ul_ref_sigs
[
u
][
v
][
Msc_RS
]
=
(
int16_t
*
)
malloc16
(
2
*
sizeof
(
int16_t
)
*
dftsizes
[
Msc_RS
]);
ul_ref_sigs
[
u
][
v
][
Msc_RS
]
=
(
int16_t
*
)
malloc16
(
2
*
sizeof
(
int16_t
)
*
dftsizes
[
Msc_RS
]);
if
((((
int
)
floor
(
2
*
qbar
))
&
1
)
==
0
)
q
=
(
int
)(
floor
(
qbar
+
.
5
))
-
v
;
...
...
@@ -61,7 +60,7 @@ void generate_ul_ref_sigs(void)
q
=
(
int
)(
floor
(
qbar
+
.
5
))
+
v
;
#ifdef MAIN
printf
(
"Msc_RS %
d (%d), u %d, v %d -> q %d
(qbar %f)
\n
"
,
Msc_RS
,
dftsizes
[
Msc_RS
],
u
,
v
,
q
,
qbar
);
printf
(
"Msc_RS %
u (%d), u %u, v %u -> q %u
(qbar %f)
\n
"
,
Msc_RS
,
dftsizes
[
Msc_RS
],
u
,
v
,
q
,
qbar
);
#endif
for
(
n
=
0
;
n
<
dftsizes
[
Msc_RS
];
n
++
)
{
...
...
@@ -89,32 +88,26 @@ void generate_ul_ref_sigs(void)
// These are the sequences for RB 1
for
(
u
=
0
;
u
<
30
;
u
++
)
{
ul_ref_sigs
[
u
][
0
][
0
]
=
(
int16_t
*
)
malloc16
(
2
*
sizeof
(
int16_t
)
*
dftsizes
[
0
]);
ul_ref_sigs
[
u
][
0
][
0
]
=
(
int16_t
*
)
malloc16
(
2
*
sizeof
(
int16_t
)
*
dftsizes
[
0
]);
for
(
n
=
0
;
n
<
dftsizes
[
0
];
n
++
)
{
ul_ref_sigs
[
u
][
0
][
0
][
n
<<
1
]
=
(
int16_t
)(
floor
(
32767
*
cos
(
M_PI
*
ref12
[(
u
*
12
)
+
n
]
/
4
)));
ul_ref_sigs
[
u
][
0
][
0
][
1
+
(
n
<<
1
)]
=
(
int16_t
)(
floor
(
32767
*
sin
(
M_PI
*
ref12
[(
u
*
12
)
+
n
]
/
4
)));
}
}
// These are the sequences for RB 2
for
(
u
=
0
;
u
<
30
;
u
++
)
{
ul_ref_sigs
[
u
][
0
][
1
]
=
(
int16_t
*
)
malloc16
(
2
*
sizeof
(
int16_t
)
*
dftsizes
[
1
]);
ul_ref_sigs
[
u
][
0
][
1
]
=
(
int16_t
*
)
malloc16
(
2
*
sizeof
(
int16_t
)
*
dftsizes
[
1
]);
for
(
n
=
0
;
n
<
dftsizes
[
1
];
n
++
)
{
ul_ref_sigs
[
u
][
0
][
1
][
n
<<
1
]
=
(
int16_t
)(
floor
(
32767
*
cos
(
M_PI
*
ref24
[(
u
*
24
)
+
n
]
/
4
)));
ul_ref_sigs
[
u
][
0
][
1
][
1
+
(
n
<<
1
)]
=
(
int16_t
)(
floor
(
32767
*
sin
(
M_PI
*
ref24
[(
u
*
24
)
+
n
]
/
4
)));
}
}
}
void
generate_ul_ref_sigs_rx
(
void
)
{
void
generate_ul_ref_sigs_rx
(
void
)
{
double
qbar
,
phase
;
unsigned
int
u
,
v
,
Msc_RS
,
q
,
m
,
n
;
...
...
@@ -123,7 +116,7 @@ void generate_ul_ref_sigs_rx(void)
for
(
u
=
0
;
u
<
30
;
u
++
)
{
for
(
v
=
0
;
v
<
2
;
v
++
)
{
qbar
=
ref_primes
[
Msc_RS
]
*
(
u
+
1
)
/
(
double
)
31
;
ul_ref_sigs_rx
[
u
][
v
][
Msc_RS
]
=
(
int16_t
*
)
malloc16
(
2
*
sizeof
(
int16_t
)
*
dftsizes
[
Msc_RS
]);
ul_ref_sigs_rx
[
u
][
v
][
Msc_RS
]
=
(
int16_t
*
)
malloc16
(
2
*
sizeof
(
int16_t
)
*
dftsizes
[
Msc_RS
]);
if
((((
int
)
floor
(
2
*
qbar
))
&
1
)
==
0
)
q
=
(
int
)(
floor
(
qbar
+
.
5
))
-
v
;
...
...
@@ -131,7 +124,7 @@ void generate_ul_ref_sigs_rx(void)
q
=
(
int
)(
floor
(
qbar
+
.
5
))
+
v
;
#ifdef MAIN
printf
(
"Msc_RS %
d (%d), u %d, v %d -> q %d
(qbar %f)
\n
"
,
Msc_RS
,
dftsizes
[
Msc_RS
],
u
,
v
,
q
,
qbar
);
printf
(
"Msc_RS %
u (%d), u %u, v %u -> q %u
(qbar %f)
\n
"
,
Msc_RS
,
dftsizes
[
Msc_RS
],
u
,
v
,
q
,
qbar
);
#endif
for
(
n
=
0
;
n
<
dftsizes
[
Msc_RS
];
n
++
)
{
...
...
@@ -159,7 +152,7 @@ void generate_ul_ref_sigs_rx(void)
// These are the sequences for RB 1
for
(
u
=
0
;
u
<
30
;
u
++
)
{
ul_ref_sigs_rx
[
u
][
0
][
0
]
=
(
int16_t
*
)
malloc16
(
2
*
sizeof
(
int16_t
)
*
dftsizes
[
0
]);
ul_ref_sigs_rx
[
u
][
0
][
0
]
=
(
int16_t
*
)
malloc16
(
2
*
sizeof
(
int16_t
)
*
dftsizes
[
0
]);
for
(
n
=
0
;
n
<
dftsizes
[
0
];
n
++
)
{
ul_ref_sigs_rx
[
u
][
0
][
0
][
n
<<
1
]
=
(
int16_t
)(
floor
(
32767
*
cos
(
M_PI
*
ref12
[(
u
*
12
)
+
n
]
/
4
)));
...
...
@@ -169,21 +162,17 @@ void generate_ul_ref_sigs_rx(void)
// These are the sequences for RB 2
for
(
u
=
0
;
u
<
30
;
u
++
)
{
ul_ref_sigs_rx
[
u
][
0
][
1
]
=
(
int16_t
*
)
malloc16
(
2
*
sizeof
(
int16_t
)
*
dftsizes
[
1
]);
ul_ref_sigs_rx
[
u
][
0
][
1
]
=
(
int16_t
*
)
malloc16
(
2
*
sizeof
(
int16_t
)
*
dftsizes
[
1
]);
for
(
n
=
0
;
n
<
dftsizes
[
1
];
n
++
)
{
ul_ref_sigs_rx
[
u
][
0
][
1
][
n
<<
1
]
=
(
int16_t
)(
floor
(
32767
*
cos
(
M_PI
*
ref24
[(
u
*
24
)
+
n
]
/
4
)));
ul_ref_sigs_rx
[
u
][
0
][
1
][
1
+
(
n
<<
1
)]
=
(
int16_t
)(
floor
(
32767
*
sin
(
M_PI
*
ref24
[(
u
*
24
)
+
n
]
/
4
)));
}
}
}
void
free_ul_ref_sigs
(
void
)
{
void
free_ul_ref_sigs
(
void
)
{
unsigned
int
u
,
v
,
Msc_RS
;
for
(
Msc_RS
=
0
;
Msc_RS
<
34
;
Msc_RS
++
)
{
...
...
@@ -204,9 +193,7 @@ void free_ul_ref_sigs(void)
}
#ifdef MAIN
main
()
{
main
()
{
generate_ul_ref_sigs
();
generate_ul_ref_sigs_rx
();
free_ul_ref_sigs
();
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
View file @
afee2b19
...
...
@@ -53,71 +53,74 @@
*/
#define is_not_pilot(pilots,first_pilot,re) (1)
/*extern void thread_top_init(char *thread_name,
int affinity,
uint64_t runtime,
uint64_t deadline,
uint64_t period);*/
int affinity,
uint64_t runtime,
uint64_t deadline,
uint64_t period);*/
extern
WORKER_CONF_t
get_thread_worker_conf
(
void
);
void
free_eNB_dlsch
(
LTE_eNB_DLSCH_t
*
dlsch
)
{
void
free_eNB_dlsch
(
LTE_eNB_DLSCH_t
*
dlsch
)
{
int
i
,
r
,
aa
,
layer
;
if
(
dlsch
)
{
for
(
layer
=
0
;
layer
<
4
;
layer
++
)
{
for
(
aa
=
0
;
aa
<
64
;
aa
++
)
free16
(
dlsch
->
ue_spec_bf_weights
[
layer
][
aa
],
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES
*
sizeof
(
int32_t
));
free16
(
dlsch
->
ue_spec_bf_weights
[
layer
],
64
*
sizeof
(
int32_t
*
));
free16
(
dlsch
->
ue_spec_bf_weights
[
layer
],
64
*
sizeof
(
int32_t
*
));
}
for
(
i
=
0
;
i
<
dlsch
->
Mdlharq
;
i
++
)
{
if
(
dlsch
->
harq_processes
[
i
])
{
if
(
dlsch
->
harq_processes
[
i
]
->
b
)
{
free16
(
dlsch
->
harq_processes
[
i
]
->
b
,
MAX_DLSCH_PAYLOAD_BYTES
);
dlsch
->
harq_processes
[
i
]
->
b
=
NULL
;
}
for
(
r
=
0
;
r
<
MAX_NUM_DLSCH_SEGMENTS
;
r
++
)
{
if
(
dlsch
->
harq_processes
[
i
]
->
c
[
r
])
{
free16
(
dlsch
->
harq_processes
[
i
]
->
c
[
r
],((
r
==
0
)
?
8
:
0
)
+
3
+
768
);
dlsch
->
harq_processes
[
i
]
->
c
[
r
]
=
NULL
;
}
if
(
dlsch
->
harq_processes
[
i
]
->
d
[
r
])
{
free16
(
dlsch
->
harq_processes
[
i
]
->
d
[
r
],(
96
+
12
+
3
+
(
3
*
6144
)));
dlsch
->
harq_processes
[
i
]
->
d
[
r
]
=
NULL
;
}
}
free16
(
dlsch
->
harq_processes
[
i
],
sizeof
(
LTE_DL_eNB_HARQ_t
));
dlsch
->
harq_processes
[
i
]
=
NULL
;
}
free16
(
dlsch
->
harq_processes
[
i
],
sizeof
(
LTE_DL_eNB_HARQ_t
));
dlsch
->
harq_processes
[
i
]
=
NULL
;
}
}
free16
(
dlsch
,
sizeof
(
LTE_eNB_DLSCH_t
));
dlsch
=
NULL
;
}
}
LTE_eNB_DLSCH_t
*
new_eNB_dlsch
(
unsigned
char
Kmimo
,
unsigned
char
Mdlharq
,
uint32_t
Nsoft
,
unsigned
char
N_RB_DL
,
uint8_t
abstraction_flag
,
LTE_DL_FRAME_PARMS
*
frame_parms
)
{
LTE_eNB_DLSCH_t
*
new_eNB_dlsch
(
unsigned
char
Kmimo
,
unsigned
char
Mdlharq
,
uint32_t
Nsoft
,
unsigned
char
N_RB_DL
,
uint8_t
abstraction_flag
,
LTE_DL_FRAME_PARMS
*
frame_parms
)
{
LTE_eNB_DLSCH_t
*
dlsch
;
unsigned
char
exit_flag
=
0
,
i
,
j
,
r
,
aa
,
layer
;
int
re
;
unsigned
char
bw_scaling
=
1
;
switch
(
N_RB_DL
)
{
case
6
:
bw_scaling
=
16
;
break
;
case
6
:
bw_scaling
=
16
;
break
;
case
25
:
bw_scaling
=
4
;
break
;
case
25
:
bw_scaling
=
4
;
break
;
case
50
:
bw_scaling
=
2
;
break
;
case
50
:
bw_scaling
=
2
;
break
;
default:
bw_scaling
=
1
;
break
;
default:
bw_scaling
=
1
;
break
;
}
dlsch
=
(
LTE_eNB_DLSCH_t
*
)
malloc16
(
sizeof
(
LTE_eNB_DLSCH_t
));
...
...
@@ -128,15 +131,16 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
dlsch
->
Mdlharq
=
Mdlharq
;
dlsch
->
Mlimit
=
8
;
dlsch
->
Nsoft
=
Nsoft
;
for
(
layer
=
0
;
layer
<
4
;
layer
++
)
{
dlsch
->
ue_spec_bf_weights
[
layer
]
=
(
int32_t
**
)
malloc16
(
64
*
sizeof
(
int32_t
*
));
dlsch
->
ue_spec_bf_weights
[
layer
]
=
(
int32_t
**
)
malloc16
(
64
*
sizeof
(
int32_t
*
));
for
(
aa
=
0
;
aa
<
64
;
aa
++
)
{
dlsch
->
ue_spec_bf_weights
[
layer
][
aa
]
=
(
int32_t
*
)
malloc16
(
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES
*
sizeof
(
int32_t
));
for
(
re
=
0
;
re
<
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES
;
re
++
)
{
dlsch
->
ue_spec_bf_weights
[
layer
][
aa
][
re
]
=
0x00007fff
;
}
dlsch
->
ue_spec_bf_weights
[
layer
][
aa
]
=
(
int32_t
*
)
malloc16
(
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES
*
sizeof
(
int32_t
));
for
(
re
=
0
;
re
<
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES
;
re
++
)
{
dlsch
->
ue_spec_bf_weights
[
layer
][
aa
][
re
]
=
0x00007fff
;
}
}
}
...
...
@@ -159,7 +163,7 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
if
(
dlsch
->
harq_processes
[
i
])
{
bzero
(
dlsch
->
harq_processes
[
i
],
sizeof
(
LTE_DL_eNB_HARQ_t
));
// dlsch->harq_processes[i]->first_tx=1;
dlsch
->
harq_processes
[
i
]
->
b
=
(
unsigned
char
*
)
malloc16
(
MAX_DLSCH_PAYLOAD_BYTES
/
bw_scaling
);
dlsch
->
harq_processes
[
i
]
->
b
=
(
unsigned
char
*
)
malloc16
(
MAX_DLSCH_PAYLOAD_BYTES
/
bw_scaling
);
if
(
dlsch
->
harq_processes
[
i
]
->
b
)
{
bzero
(
dlsch
->
harq_processes
[
i
]
->
b
,
MAX_DLSCH_PAYLOAD_BYTES
/
bw_scaling
);
...
...
@@ -171,14 +175,16 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
if
(
abstraction_flag
==
0
)
{
for
(
r
=
0
;
r
<
MAX_NUM_DLSCH_SEGMENTS
/
bw_scaling
;
r
++
)
{
// account for filler in first segment and CRCs for multiple segment case
dlsch
->
harq_processes
[
i
]
->
c
[
r
]
=
(
uint8_t
*
)
malloc16
(((
r
==
0
)
?
8
:
0
)
+
3
+
768
);
dlsch
->
harq_processes
[
i
]
->
d
[
r
]
=
(
uint8_t
*
)
malloc16
((
96
+
12
+
3
+
(
3
*
6144
)));
dlsch
->
harq_processes
[
i
]
->
c
[
r
]
=
(
uint8_t
*
)
malloc16
(((
r
==
0
)
?
8
:
0
)
+
3
+
768
);
dlsch
->
harq_processes
[
i
]
->
d
[
r
]
=
(
uint8_t
*
)
malloc16
((
96
+
12
+
3
+
(
3
*
6144
)));
if
(
dlsch
->
harq_processes
[
i
]
->
c
[
r
])
{
bzero
(
dlsch
->
harq_processes
[
i
]
->
c
[
r
],((
r
==
0
)
?
8
:
0
)
+
3
+
768
);
}
else
{
printf
(
"Can't get c
\n
"
);
exit_flag
=
2
;
}
if
(
dlsch
->
harq_processes
[
i
]
->
d
[
r
])
{
bzero
(
dlsch
->
harq_processes
[
i
]
->
d
[
r
],(
96
+
12
+
3
+
(
3
*
6144
)));
}
else
{
...
...
@@ -197,13 +203,12 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
for
(
i
=
0
;
i
<
Mdlharq
;
i
++
)
{
dlsch
->
harq_processes
[
i
]
->
round
=
0
;
for
(
j
=
0
;
j
<
96
;
j
++
)
for
(
r
=
0
;
r
<
MAX_NUM_DLSCH_SEGMENTS
/
bw_scaling
;
r
++
)
{
// printf("dlsch->harq_processes[%d]->d[%d] %p\n",i,r,dlsch->harq_processes[i]->d[r]);
if
(
dlsch
->
harq_processes
[
i
]
->
d
[
r
])
dlsch
->
harq_processes
[
i
]
->
d
[
r
][
j
]
=
LTE_NULL
;
}
for
(
j
=
0
;
j
<
96
;
j
++
)
for
(
r
=
0
;
r
<
MAX_NUM_DLSCH_SEGMENTS
/
bw_scaling
;
r
++
)
{
// printf("dlsch->harq_processes[%d]->d[%d] %p\n",i,r,dlsch->harq_processes[i]->d[r]);
if
(
dlsch
->
harq_processes
[
i
]
->
d
[
r
])
dlsch
->
harq_processes
[
i
]
->
d
[
r
][
j
]
=
LTE_NULL
;
}
}
return
(
dlsch
);
...
...
@@ -211,16 +216,12 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
}
LOG_D
(
PHY
,
"new_eNB_dlsch exit flag %d, size of %ld
\n
"
,
exit_flag
,
sizeof
(
LTE_eNB_DLSCH_t
));
exit_flag
,
sizeof
(
LTE_eNB_DLSCH_t
));
free_eNB_dlsch
(
dlsch
);
return
(
NULL
);
}
void
clean_eNb_dlsch
(
LTE_eNB_DLSCH_t
*
dlsch
)
{
void
clean_eNb_dlsch
(
LTE_eNB_DLSCH_t
*
dlsch
)
{
unsigned
char
Mdlharq
;
unsigned
char
i
,
j
,
r
;
...
...
@@ -228,8 +229,10 @@ void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch)
Mdlharq
=
dlsch
->
Mdlharq
;
dlsch
->
rnti
=
0
;
#ifdef PHY_TX_THREAD
for
(
i
=
0
;
i
<
10
;
i
++
)
dlsch
->
active
[
i
]
=
0
;
#else
dlsch
->
active
=
0
;
#endif
...
...
@@ -244,11 +247,10 @@ void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch)
dlsch
->
harq_processes
[
i
]
->
status
=
0
;
dlsch
->
harq_processes
[
i
]
->
round
=
0
;
for
(
j
=
0
;
j
<
96
;
j
++
)
for
(
r
=
0
;
r
<
MAX_NUM_DLSCH_SEGMENTS
;
r
++
)
if
(
dlsch
->
harq_processes
[
i
]
->
d
[
r
])
dlsch
->
harq_processes
[
i
]
->
d
[
r
][
j
]
=
LTE_NULL
;
for
(
j
=
0
;
j
<
96
;
j
++
)
for
(
r
=
0
;
r
<
MAX_NUM_DLSCH_SEGMENTS
;
r
++
)
if
(
dlsch
->
harq_processes
[
i
]
->
d
[
r
])
dlsch
->
harq_processes
[
i
]
->
d
[
r
][
j
]
=
LTE_NULL
;
}
}
}
...
...
@@ -258,31 +260,24 @@ void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch)
int
dlsch_encoding_2threads0
(
te_params
*
tep
)
{
LTE_eNB_DLSCH_t
*
dlsch
=
tep
->
dlsch
;
unsigned
int
G
=
tep
->
G
;
unsigned
char
harq_pid
=
tep
->
harq_pid
;
unsigned
int
total_worker
=
tep
->
total_worker
;
unsigned
int
current_worker
=
tep
->
current_worker
;
unsigned
short
nb_rb
=
dlsch
->
harq_processes
[
harq_pid
]
->
nb_rb
;
unsigned
int
Kr
=
0
,
Kr_bytes
,
r
,
r_offset
=
0
;
// unsigned short m=dlsch->harq_processes[harq_pid]->mcs;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING_W
,
VCD_FUNCTION_IN
);
if
(
dlsch
->
harq_processes
[
harq_pid
]
->
round
==
0
)
{
// this is a new packet
for
(
r
=
(
dlsch
->
harq_processes
[
harq_pid
]
->
C
/
(
total_worker
+
1
))
*
current_worker
;
r
<
(
dlsch
->
harq_processes
[
harq_pid
]
->
C
/
(
total_worker
+
1
))
*
(
current_worker
+
1
);
r
++
)
{
if
(
r
<
dlsch
->
harq_processes
[
harq_pid
]
->
Cminus
)
Kr
=
dlsch
->
harq_processes
[
harq_pid
]
->
Kminus
;
else
Kr
=
dlsch
->
harq_processes
[
harq_pid
]
->
Kplus
;
Kr_bytes
=
Kr
>>
3
;
encoder
(
dlsch
->
harq_processes
[
harq_pid
]
->
c
[
r
],
Kr
>>
3
,
&
dlsch
->
harq_processes
[
harq_pid
]
->
d
[
r
][
96
],
...
...
@@ -293,25 +288,24 @@ int dlsch_encoding_2threads0(te_params *tep) {
&
dlsch
->
harq_processes
[
harq_pid
]
->
d
[
r
][
96
],
dlsch
->
harq_processes
[
harq_pid
]
->
w
[
r
]);
}
}
// Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the
// outputs for each code segment, see Section 5.1.5 p.20
for
(
r
=
0
,
r_offset
=
0
;
r
<
(
dlsch
->
harq_processes
[
harq_pid
]
->
C
/
(
total_worker
+
1
))
*
(
current_worker
+
1
);
r
++
)
{
if
(
r
<
(
dlsch
->
harq_processes
[
harq_pid
]
->
C
/
(
total_worker
+
1
))
*
(
current_worker
)){
int
Nl
=
dlsch
->
harq_processes
[
harq_pid
]
->
Nl
;
if
(
r
<
(
dlsch
->
harq_processes
[
harq_pid
]
->
C
/
(
total_worker
+
1
))
*
(
current_worker
))
{
int
Nl
=
dlsch
->
harq_processes
[
harq_pid
]
->
Nl
;
int
Qm
=
dlsch
->
harq_processes
[
harq_pid
]
->
Qm
;
int
C
=
dlsch
->
harq_processes
[
harq_pid
]
->
C
;
int
Gp
=
G
/
Nl
/
Qm
;
int
GpmodC
=
Gp
%
C
;
if
(
r
<
(
C
-
(
GpmodC
)))
r_offset
+=
Nl
*
Qm
*
(
Gp
/
C
);
r_offset
+=
Nl
*
Qm
*
(
Gp
/
C
);
else
r_offset
+=
Nl
*
Qm
*
((
GpmodC
==
0
?
0
:
1
)
+
(
Gp
/
C
));
}
else
{
r_offset
+=
Nl
*
Qm
*
((
GpmodC
==
0
?
0
:
1
)
+
(
Gp
/
C
));
}
else
{
r_offset
+=
lte_rate_matching_turbo
(
dlsch
->
harq_processes
[
harq_pid
]
->
RTC
[
r
],
G
,
//G
dlsch
->
harq_processes
[
harq_pid
]
->
w
[
r
],
...
...
@@ -330,7 +324,6 @@ int dlsch_encoding_2threads0(te_params *tep) {
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING_W
,
VCD_FUNCTION_OUT
);
return
(
0
);
}
...
...
@@ -339,19 +332,16 @@ extern int oai_exit;
void
*
te_thread
(
void
*
param
)
{
cpu_set_t
cpuset
;
CPU_ZERO
(
&
cpuset
);
thread_top_init
(
"te_thread"
,
1
,
200000
,
250000
,
500000
);
pthread_setname_np
(
pthread_self
(),
"te processing"
);
LOG_I
(
PHY
,
"thread te created id=%ld
\n
"
,
syscall
(
__NR_gettid
));
te_params
*
tep
=
(
te_params
*
)
param
;
//wait_sync("te_thread");
while
(
!
oai_exit
)
{
while
(
!
oai_exit
)
{
if
(
wait_on_condition
(
&
tep
->
mutex_te
,
&
tep
->
cond_te
,
&
tep
->
instance_cnt_te
,
"te thread"
)
<
0
)
break
;
if
(
oai_exit
)
break
;
dlsch_encoding_2threads0
(
tep
);
...
...
@@ -363,6 +353,7 @@ void *te_thread(void *param) {
exit_fun
(
"ERROR pthread_cond_signal"
);
return
(
NULL
);
}
/*if(opp_enabled == 1 && te_wakeup_stats0->p_time>50*3000){
print_meas_now(te_wakeup_stats0,"coding_wakeup",stderr);
printf("te_thread0 delay for waking up in frame_rx: %d subframe_rx: %d \n",proc->frame_rx,proc->subframe_rx);
...
...
@@ -375,61 +366,56 @@ void *te_thread(void *param) {
int
dlsch_encoding_2threads
(
PHY_VARS_eNB
*
eNB
,
unsigned
char
*
a
,
uint8_t
num_pdcch_symbols
,
LTE_eNB_DLSCH_t
*
dlsch
,
int
frame
,
uint8_t
subframe
,
time_stats_t
*
rm_stats
,
time_stats_t
*
te_stats
,
time_stats_t
*
te_wait_stats
,
time_stats_t
*
te_main_stats
,
time_stats_t
*
te_wakeup_stats0
,
time_stats_t
*
te_wakeup_stats1
,
time_stats_t
*
i_stats
,
int
worker_num
)
{
unsigned
char
*
a
,
uint8_t
num_pdcch_symbols
,
LTE_eNB_DLSCH_t
*
dlsch
,
int
frame
,
uint8_t
subframe
,
time_stats_t
*
rm_stats
,
time_stats_t
*
te_stats
,
time_stats_t
*
te_wait_stats
,
time_stats_t
*
te_main_stats
,
time_stats_t
*
te_wakeup_stats0
,
time_stats_t
*
te_wakeup_stats1
,
time_stats_t
*
i_stats
,
int
worker_num
)
{
//start_meas(&eNB->dlsch_turbo_encoding_preperation_stats);
LTE_DL_FRAME_PARMS
*
frame_parms
=
&
eNB
->
frame_parms
;
L1_proc_t
*
proc
=
&
eNB
->
proc
;
unsigned
int
G
;
unsigned
int
crc
=
1
;
unsigned
char
harq_pid
=
dlsch
->
harq_ids
[
frame
%
2
][
subframe
];
if
(
harq_pid
>=
dlsch
->
Mdlharq
)
{
LOG_E
(
PHY
,
"dlsch_encoding_2threads illegal harq_pid %d
\n
"
,
harq_pid
);
return
(
-
1
);
}
unsigned
short
nb_rb
=
dlsch
->
harq_processes
[
harq_pid
]
->
nb_rb
;
unsigned
int
A
;
unsigned
char
mod_order
;
unsigned
int
Kr
=
0
,
Kr_bytes
,
r
,
r_offset
=
0
;
// unsigned short m=dlsch->harq_processes[harq_pid]->mcs;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING
,
VCD_FUNCTION_IN
);
A
=
dlsch
->
harq_processes
[
harq_pid
]
->
TBS
;
//6228
mod_order
=
dlsch
->
harq_processes
[
harq_pid
]
->
Qm
;
G
=
get_G
(
frame_parms
,
nb_rb
,
dlsch
->
harq_processes
[
harq_pid
]
->
rb_alloc
,
mod_order
,
dlsch
->
harq_processes
[
harq_pid
]
->
Nl
,
num_pdcch_symbols
,
frame
,
subframe
,
dlsch
->
harq_processes
[
harq_pid
]
->
mimo_mode
==
TM7
?
7
:
0
);
G
=
get_G
(
frame_parms
,
nb_rb
,
dlsch
->
harq_processes
[
harq_pid
]
->
rb_alloc
,
mod_order
,
dlsch
->
harq_processes
[
harq_pid
]
->
Nl
,
num_pdcch_symbols
,
frame
,
subframe
,
dlsch
->
harq_processes
[
harq_pid
]
->
mimo_mode
==
TM7
?
7
:
0
);
if
(
dlsch
->
harq_processes
[
harq_pid
]
->
round
==
0
)
{
// this is a new packet
start_meas
(
&
eNB
->
dlsch_turbo_encoding_preperation_stats
);
// Add 24-bit crc (polynomial A) to payload
crc
=
crc24a
(
a
,
A
)
>>
8
;
stop_meas
(
&
eNB
->
dlsch_turbo_encoding_preperation_stats
);
a
[
A
>>
3
]
=
((
uint8_t
*
)
&
crc
)[
2
];
a
[
1
+
(
A
>>
3
)]
=
((
uint8_t
*
)
&
crc
)[
1
];
a
[
2
+
(
A
>>
3
)]
=
((
uint8_t
*
)
&
crc
)[
0
];
a
[
A
>>
3
]
=
((
uint8_t
*
)
&
crc
)[
2
];
a
[
1
+
(
A
>>
3
)]
=
((
uint8_t
*
)
&
crc
)[
1
];
a
[
2
+
(
A
>>
3
)]
=
((
uint8_t
*
)
&
crc
)[
0
];
dlsch
->
harq_processes
[
harq_pid
]
->
B
=
A
+
24
;
memcpy
(
dlsch
->
harq_processes
[
harq_pid
]
->
b
,
a
,(
A
/
8
)
+
4
);
//stop_meas(&eNB->dlsch_turbo_encoding_preperation_stats);
start_meas
(
&
eNB
->
dlsch_turbo_encoding_segmentation_stats
);
if
(
lte_segmentation
(
dlsch
->
harq_processes
[
harq_pid
]
->
b
,
dlsch
->
harq_processes
[
harq_pid
]
->
c
,
dlsch
->
harq_processes
[
harq_pid
]
->
B
,
...
...
@@ -442,48 +428,46 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
return
(
-
1
);
stop_meas
(
&
eNB
->
dlsch_turbo_encoding_segmentation_stats
);
start_meas
(
&
eNB
->
dlsch_turbo_encoding_signal_stats
);
for
(
int
i
=
0
;
i
<
worker_num
;
i
++
)
{
for
(
int
i
=
0
;
i
<
worker_num
;
i
++
)
{
proc
->
tep
[
i
].
eNB
=
eNB
;
proc
->
tep
[
i
].
dlsch
=
dlsch
;
proc
->
tep
[
i
].
G
=
G
;
proc
->
tep
[
i
].
harq_pid
=
harq_pid
;
proc
->
tep
[
i
].
total_worker
=
worker_num
;
proc
->
tep
[
i
].
current_worker
=
i
;
pthread_mutex_lock
(
&
proc
->
tep
[
i
].
mutex_te
);
if
(
proc
->
tep
[
i
].
instance_cnt_te
==
0
)
{
printf
(
"[eNB] TE thread busy
\n
"
);
exit_fun
(
"TE thread busy"
);
pthread_mutex_unlock
(
&
proc
->
tep
[
i
].
mutex_te
);
return
(
-
1
);
}
++
proc
->
tep
[
i
].
instance_cnt_te
;
// wakeup worker to do segments
if
(
pthread_cond_signal
(
&
proc
->
tep
[
i
].
cond_te
)
!=
0
)
{
printf
(
"[eNB] ERROR pthread_cond_signal for te thread %d exit
\n
"
,
i
);
exit_fun
(
"ERROR pthread_cond_signal"
);
return
(
-
1
);
}
pthread_mutex_unlock
(
&
proc
->
tep
[
i
].
mutex_te
);
}
stop_meas
(
&
eNB
->
dlsch_turbo_encoding_signal_stats
);
start_meas
(
te_main_stats
);
for
(
r
=
(
dlsch
->
harq_processes
[
harq_pid
]
->
C
/
(
worker_num
+
1
))
*
worker_num
;
r
<
dlsch
->
harq_processes
[
harq_pid
]
->
C
;
r
++
)
{
for
(
r
=
(
dlsch
->
harq_processes
[
harq_pid
]
->
C
/
(
worker_num
+
1
))
*
worker_num
;
r
<
dlsch
->
harq_processes
[
harq_pid
]
->
C
;
r
++
)
{
if
(
r
<
dlsch
->
harq_processes
[
harq_pid
]
->
Cminus
)
Kr
=
dlsch
->
harq_processes
[
harq_pid
]
->
Kminus
;
else
Kr
=
dlsch
->
harq_processes
[
harq_pid
]
->
Kplus
;
Kr_bytes
=
Kr
>>
3
;
start_meas
(
te_stats
);
encoder
(
dlsch
->
harq_processes
[
harq_pid
]
->
c
[
r
],
Kr
>>
3
,
...
...
@@ -491,7 +475,6 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
(
r
==
0
)
?
dlsch
->
harq_processes
[
harq_pid
]
->
F
:
0
);
stop_meas
(
te_stats
);
start_meas
(
i_stats
);
dlsch
->
harq_processes
[
harq_pid
]
->
RTC
[
r
]
=
sub_block_interleaving_turbo
(
4
+
(
Kr_bytes
*
8
),
...
...
@@ -499,17 +482,14 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
dlsch
->
harq_processes
[
harq_pid
]
->
w
[
r
]);
stop_meas
(
i_stats
);
}
}
else
{
for
(
int
i
=
0
;
i
<
worker_num
;
i
++
)
{
}
else
{
for
(
int
i
=
0
;
i
<
worker_num
;
i
++
)
{
proc
->
tep
[
i
].
eNB
=
eNB
;
proc
->
tep
[
i
].
dlsch
=
dlsch
;
proc
->
tep
[
i
].
G
=
G
;
proc
->
tep
[
i
].
total_worker
=
worker_num
;
proc
->
tep
[
i
].
current_worker
=
i
;
if
(
pthread_cond_signal
(
&
proc
->
tep
[
i
].
cond_te
)
!=
0
)
{
printf
(
"[eNB] ERROR pthread_cond_signal for te thread exit
\n
"
);
exit_fun
(
"ERROR pthread_cond_signal"
);
...
...
@@ -521,7 +501,6 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
// Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the
// outputs for each code segment, see Section 5.1.5 p.20
for
(
r
=
0
,
r_offset
=
0
;
r
<
dlsch
->
harq_processes
[
harq_pid
]
->
C
;
r
++
)
{
// get information for E for the segments that are handled by the worker thread
if
(
r
<
(
dlsch
->
harq_processes
[
harq_pid
]
->
C
/
(
worker_num
+
1
))
*
worker_num
)
{
int
Nl
=
dlsch
->
harq_processes
[
harq_pid
]
->
Nl
;
...
...
@@ -529,209 +508,186 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
int
C
=
dlsch
->
harq_processes
[
harq_pid
]
->
C
;
int
Gp
=
G
/
Nl
/
Qm
;
int
GpmodC
=
Gp
%
C
;
if
(
r
<
(
C
-
(
GpmodC
)))
r_offset
+=
Nl
*
Qm
*
(
Gp
/
C
);
r_offset
+=
Nl
*
Qm
*
(
Gp
/
C
);
else
r_offset
+=
Nl
*
Qm
*
((
GpmodC
==
0
?
0
:
1
)
+
(
Gp
/
C
));
}
else
{
r_offset
+=
Nl
*
Qm
*
((
GpmodC
==
0
?
0
:
1
)
+
(
Gp
/
C
));
}
else
{
start_meas
(
rm_stats
);
r_offset
+=
lte_rate_matching_turbo
(
dlsch
->
harq_processes
[
harq_pid
]
->
RTC
[
r
],
G
,
//G
dlsch
->
harq_processes
[
harq_pid
]
->
w
[
r
],
dlsch
->
harq_processes
[
harq_pid
]
->
e
+
r_offset
,
dlsch
->
harq_processes
[
harq_pid
]
->
C
,
// C
dlsch
->
Nsoft
,
// Nsoft,
dlsch
->
Mdlharq
,
dlsch
->
Kmimo
,
dlsch
->
harq_processes
[
harq_pid
]
->
rvidx
,
dlsch
->
harq_processes
[
harq_pid
]
->
Qm
,
dlsch
->
harq_processes
[
harq_pid
]
->
Nl
,
r
,
nb_rb
);
//
m); // r
G
,
//G
dlsch
->
harq_processes
[
harq_pid
]
->
w
[
r
],
dlsch
->
harq_processes
[
harq_pid
]
->
e
+
r_offset
,
dlsch
->
harq_processes
[
harq_pid
]
->
C
,
// C
dlsch
->
Nsoft
,
// Nsoft,
dlsch
->
Mdlharq
,
dlsch
->
Kmimo
,
dlsch
->
harq_processes
[
harq_pid
]
->
rvidx
,
dlsch
->
harq_processes
[
harq_pid
]
->
Qm
,
dlsch
->
harq_processes
[
harq_pid
]
->
Nl
,
r
,
nb_rb
);
//
m); // r
stop_meas
(
rm_stats
);
}
}
stop_meas
(
te_main_stats
);
stop_meas
(
te_main_stats
);
start_meas
(
te_wait_stats
);
if
(
worker_num
==
1
)
{
if
(
worker_num
==
1
)
{
wait_on_busy_condition
(
&
proc
->
tep
[
0
].
mutex_te
,
&
proc
->
tep
[
0
].
cond_te
,
&
proc
->
tep
[
0
].
instance_cnt_te
,
"te thread 0"
);
}
else
if
(
worker_num
==
2
)
{
}
else
if
(
worker_num
==
2
)
{
wait_on_busy_condition
(
&
proc
->
tep
[
0
].
mutex_te
,
&
proc
->
tep
[
0
].
cond_te
,
&
proc
->
tep
[
0
].
instance_cnt_te
,
"te thread 0"
);
wait_on_busy_condition
(
&
proc
->
tep
[
1
].
mutex_te
,
&
proc
->
tep
[
1
].
cond_te
,
&
proc
->
tep
[
1
].
instance_cnt_te
,
"te thread 1"
);
}
else
{
}
else
{
wait_on_busy_condition
(
&
proc
->
tep
[
0
].
mutex_te
,
&
proc
->
tep
[
0
].
cond_te
,
&
proc
->
tep
[
0
].
instance_cnt_te
,
"te thread 0"
);
wait_on_busy_condition
(
&
proc
->
tep
[
1
].
mutex_te
,
&
proc
->
tep
[
1
].
cond_te
,
&
proc
->
tep
[
1
].
instance_cnt_te
,
"te thread 1"
);
wait_on_busy_condition
(
&
proc
->
tep
[
2
].
mutex_te
,
&
proc
->
tep
[
2
].
cond_te
,
&
proc
->
tep
[
2
].
instance_cnt_te
,
"te thread 2"
);
}
stop_meas
(
te_wait_stats
);
/*if(opp_enabled == 1 && te_wait_stats->p_time>100*3000){
print_meas_now(te_wait_stats,"coding_wait",stderr);
printf("coding delay in wait on codition in frame_rx: %d \n",proc->frame_rx);
printf("coding delay in wait on codition in frame_rx: %d \n",proc->frame_rx);
}*/
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING
,
VCD_FUNCTION_OUT
);
return
(
0
);
}
int
dlsch_encoding_all
(
PHY_VARS_eNB
*
eNB
,
unsigned
char
*
a
,
uint8_t
num_pdcch_symbols
,
LTE_eNB_DLSCH_t
*
dlsch
,
int
frame
,
uint8_t
subframe
,
time_stats_t
*
rm_stats
,
time_stats_t
*
te_stats
,
time_stats_t
*
te_wait_stats
,
time_stats_t
*
te_main_stats
,
time_stats_t
*
te_wakeup_stats0
,
time_stats_t
*
te_wakeup_stats1
,
time_stats_t
*
i_stats
)
{
int
encoding_return
=
0
;
unsigned
int
L
,
C
,
B
;
B
=
dlsch
->
harq_processes
[
dlsch
->
harq_ids
[
frame
%
2
][
subframe
]]
->
B
;
if
(
B
<=
6144
)
{
L
=
0
;
C
=
1
;
}
else
{
L
=
24
;
C
=
B
/
(
6144
-
L
);
if
((
6144
-
L
)
*
C
<
B
)
{
C
=
C
+
1
;
}
}
if
(
get_thread_worker_conf
()
==
WORKER_ENABLE
)
{
if
(
C
>=
8
)
//one main three worker
{
encoding_return
=
dlsch_encoding_2threads
(
eNB
,
a
,
num_pdcch_symbols
,
dlsch
,
frame
,
subframe
,
rm_stats
,
te_stats
,
te_wait_stats
,
te_main_stats
,
te_wakeup_stats0
,
te_wakeup_stats1
,
i_stats
,
3
);
}
else
if
(
C
>=
6
)
//one main two worker
{
encoding_return
=
dlsch_encoding_2threads
(
eNB
,
a
,
num_pdcch_symbols
,
dlsch
,
frame
,
subframe
,
rm_stats
,
te_stats
,
te_wait_stats
,
te_main_stats
,
te_wakeup_stats0
,
te_wakeup_stats1
,
i_stats
,
2
);
}
else
if
(
C
>=
4
)
//one main one worker
{
encoding_return
=
dlsch_encoding_2threads
(
eNB
,
a
,
num_pdcch_symbols
,
dlsch
,
frame
,
subframe
,
rm_stats
,
te_stats
,
te_wait_stats
,
te_main_stats
,
te_wakeup_stats0
,
te_wakeup_stats1
,
i_stats
,
1
);
}
else
{
encoding_return
=
dlsch_encoding
(
eNB
,
a
,
num_pdcch_symbols
,
dlsch
,
frame
,
subframe
,
rm_stats
,
te_stats
,
i_stats
);
}
unsigned
char
*
a
,
uint8_t
num_pdcch_symbols
,
LTE_eNB_DLSCH_t
*
dlsch
,
int
frame
,
uint8_t
subframe
,
time_stats_t
*
rm_stats
,
time_stats_t
*
te_stats
,
time_stats_t
*
te_wait_stats
,
time_stats_t
*
te_main_stats
,
time_stats_t
*
te_wakeup_stats0
,
time_stats_t
*
te_wakeup_stats1
,
time_stats_t
*
i_stats
)
{
int
encoding_return
=
0
;
unsigned
int
L
,
C
,
B
;
B
=
dlsch
->
harq_processes
[
dlsch
->
harq_ids
[
frame
%
2
][
subframe
]]
->
B
;
if
(
B
<=
6144
)
{
L
=
0
;
C
=
1
;
}
else
{
L
=
24
;
C
=
B
/
(
6144
-
L
);
if
((
6144
-
L
)
*
C
<
B
)
{
C
=
C
+
1
;
}
else
{
encoding_return
=
dlsch_encoding
(
eNB
,
a
,
num_pdcch_symbols
,
dlsch
,
frame
,
subframe
,
rm_stats
,
te_stats
,
i_stats
);
}
if
(
get_thread_worker_conf
()
==
WORKER_ENABLE
)
{
if
(
C
>=
8
)
{
//one main three worker
encoding_return
=
dlsch_encoding_2threads
(
eNB
,
a
,
num_pdcch_symbols
,
dlsch
,
frame
,
subframe
,
rm_stats
,
te_stats
,
te_wait_stats
,
te_main_stats
,
te_wakeup_stats0
,
te_wakeup_stats1
,
i_stats
,
3
);
}
else
if
(
C
>=
6
)
{
//one main two worker
encoding_return
=
dlsch_encoding_2threads
(
eNB
,
a
,
num_pdcch_symbols
,
dlsch
,
frame
,
subframe
,
rm_stats
,
te_stats
,
te_wait_stats
,
te_main_stats
,
te_wakeup_stats0
,
te_wakeup_stats1
,
i_stats
,
2
);
}
else
if
(
C
>=
4
)
{
//one main one worker
encoding_return
=
dlsch_encoding_2threads
(
eNB
,
a
,
num_pdcch_symbols
,
dlsch
,
frame
,
subframe
,
rm_stats
,
te_stats
,
te_wait_stats
,
te_main_stats
,
te_wakeup_stats0
,
te_wakeup_stats1
,
i_stats
,
1
);
}
else
{
encoding_return
=
dlsch_encoding
(
eNB
,
a
,
num_pdcch_symbols
,
dlsch
,
frame
,
subframe
,
rm_stats
,
te_stats
,
i_stats
);
}
return
encoding_return
;
}
else
{
encoding_return
=
dlsch_encoding
(
eNB
,
a
,
num_pdcch_symbols
,
dlsch
,
frame
,
subframe
,
rm_stats
,
te_stats
,
i_stats
);
}
return
encoding_return
;
}
int
dlsch_encoding
(
PHY_VARS_eNB
*
eNB
,
unsigned
char
*
a
,
unsigned
char
*
a
,
uint8_t
num_pdcch_symbols
,
LTE_eNB_DLSCH_t
*
dlsch
,
int
frame
,
uint8_t
subframe
,
time_stats_t
*
rm_stats
,
time_stats_t
*
te_stats
,
time_stats_t
*
i_stats
)
{
time_stats_t
*
i_stats
)
{
unsigned
int
G
;
unsigned
int
crc
=
1
;
LTE_DL_FRAME_PARMS
*
frame_parms
=
&
eNB
->
frame_parms
;
unsigned
char
harq_pid
=
dlsch
->
harq_ids
[
frame
%
2
][
subframe
];
if
(
harq_pid
>=
dlsch
->
Mdlharq
)
{
LOG_E
(
PHY
,
"dlsch_encoding illegal harq_pid %d
\n
"
,
harq_pid
);
return
(
-
1
);
}
unsigned
short
nb_rb
=
dlsch
->
harq_processes
[
harq_pid
]
->
nb_rb
;
unsigned
int
A
;
unsigned
char
mod_order
;
unsigned
int
Kr
=
0
,
Kr_bytes
,
r
,
r_offset
=
0
;
// unsigned short m=dlsch->harq_processes[harq_pid]->mcs;
uint8_t
beamforming_mode
=
0
;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING
,
VCD_FUNCTION_IN
);
A
=
dlsch
->
harq_processes
[
harq_pid
]
->
TBS
;
//6228
// printf("Encoder: A: %d\n",A);
mod_order
=
dlsch
->
harq_processes
[
harq_pid
]
->
Qm
;
...
...
@@ -742,8 +698,8 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
beamforming_mode
=
8
;
else
if
(
dlsch
->
harq_processes
[
harq_pid
]
->
mimo_mode
==
TM9_10
)
beamforming_mode
=
9
;
G
=
get_G
(
frame_parms
,
nb_rb
,
dlsch
->
harq_processes
[
harq_pid
]
->
rb_alloc
,
mod_order
,
dlsch
->
harq_processes
[
harq_pid
]
->
Nl
,
num_pdcch_symbols
,
frame
,
subframe
,
beamforming_mode
);
G
=
get_G
(
frame_parms
,
nb_rb
,
dlsch
->
harq_processes
[
harq_pid
]
->
rb_alloc
,
mod_order
,
dlsch
->
harq_processes
[
harq_pid
]
->
Nl
,
num_pdcch_symbols
,
frame
,
subframe
,
beamforming_mode
);
// if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet
if
(
dlsch
->
harq_processes
[
harq_pid
]
->
round
==
0
)
{
// this is a new packet
...
...
@@ -758,14 +714,12 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
printf("\n");
*/
// Add 24-bit crc (polynomial A) to payload
crc
=
crc24a
(
a
,
A
)
>>
8
;
a
[
A
>>
3
]
=
((
uint8_t
*
)
&
crc
)[
2
];
a
[
1
+
(
A
>>
3
)]
=
((
uint8_t
*
)
&
crc
)[
1
];
a
[
2
+
(
A
>>
3
)]
=
((
uint8_t
*
)
&
crc
)[
0
];
a
[
A
>>
3
]
=
((
uint8_t
*
)
&
crc
)[
2
];
a
[
1
+
(
A
>>
3
)]
=
((
uint8_t
*
)
&
crc
)[
1
];
a
[
2
+
(
A
>>
3
)]
=
((
uint8_t
*
)
&
crc
)[
0
];
// printf("CRC %x (A %d)\n",crc,A);
dlsch
->
harq_processes
[
harq_pid
]
->
B
=
A
+
24
;
// dlsch->harq_processes[harq_pid]->b = a;
memcpy
(
dlsch
->
harq_processes
[
harq_pid
]
->
b
,
a
,(
A
/
8
)
+
4
);
...
...
@@ -782,25 +736,20 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
return
(
-
1
);
for
(
r
=
0
;
r
<
dlsch
->
harq_processes
[
harq_pid
]
->
C
;
r
++
)
{
if
(
r
<
dlsch
->
harq_processes
[
harq_pid
]
->
Cminus
)
Kr
=
dlsch
->
harq_processes
[
harq_pid
]
->
Kminus
;
else
Kr
=
dlsch
->
harq_processes
[
harq_pid
]
->
Kplus
;
Kr_bytes
=
Kr
>>
3
;
#ifdef DEBUG_DLSCH_CODING
printf
(
"Generating Code Segment %
d (%d
bits)
\n
"
,
r
,
Kr
);
printf
(
"Generating Code Segment %
u (%u
bits)
\n
"
,
r
,
Kr
);
// generate codewords
printf
(
"bits_per_codeword (Kr)= %d, A %d
\n
"
,
Kr
,
A
);
printf
(
"bits_per_codeword (Kr)= %u, A %u
\n
"
,
Kr
,
A
);
printf
(
"N_RB = %d
\n
"
,
nb_rb
);
printf
(
"Ncp %d
\n
"
,
frame_parms
->
Ncp
);
printf
(
"mod_order %d
\n
"
,
mod_order
);
#endif
start_meas
(
te_stats
);
encoder
(
dlsch
->
harq_processes
[
harq_pid
]
->
c
[
r
],
Kr
>>
3
,
...
...
@@ -821,7 +770,6 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
dlsch
->
harq_processes
[
harq_pid
]
->
w
[
r
]);
stop_meas
(
i_stats
);
}
}
// Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the
...
...
@@ -829,16 +777,15 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
for
(
r
=
0
;
r
<
dlsch
->
harq_processes
[
harq_pid
]
->
C
;
r
++
)
{
#ifdef DEBUG_DLSCH_CODING
printf
(
"Rate Matching, Code segment %
d (coded bits (G) %d,unpunctured/repeated bits per code segment %d
,mod_order %d, nb_rb %d)...
\n
"
,
r
,
G
,
Kr
*
3
,
mod_order
,
nb_rb
);
printf
(
"Rate Matching, Code segment %
u (coded bits (G) %u,unpunctured/repeated bits per code segment %u
,mod_order %d, nb_rb %d)...
\n
"
,
r
,
G
,
Kr
*
3
,
mod_order
,
nb_rb
);
#endif
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
"
,
dlsch
->
harq_processes
[
harq_pid
]
->
rvidx
);
#endif
r_offset
+=
lte_rate_matching_turbo
(
dlsch
->
harq_processes
[
harq_pid
]
->
RTC
[
r
],
G
,
//G
...
...
@@ -853,7 +800,7 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
dlsch
->
harq_processes
[
harq_pid
]
->
Nl
,
r
,
nb_rb
);
// m); // r
// m); // r
stop_meas
(
rm_stats
);
#ifdef DEBUG_DLSCH_CODING
...
...
@@ -864,7 +811,6 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING
,
VCD_FUNCTION_OUT
);
return
(
0
);
}
...
...
openair1/SIMULATION/LTE_PHY/dlsim.c
View file @
afee2b19
...
...
@@ -89,14 +89,11 @@ THREAD_STRUCT thread_struct;
int
emulate_rf
=
0
;
void
handler
(
int
sig
)
{
void
handler
(
int
sig
)
{
void
*
array
[
10
];
size_t
size
;
// get void*'s for all entries on the stack
size
=
backtrace
(
array
,
10
);
// print out all the frames to stderr
fprintf
(
stderr
,
"Error: signal %d:
\n
"
,
sig
);
backtrace_symbols_fd
(
array
,
size
,
2
);
...
...
@@ -114,17 +111,13 @@ uint64_t DLSCH_alloc_pdu_1[2];
#define CCCH_RB_ALLOC computeRIV(eNB->frame_parms.N_RB_UL,0,2)
//#define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13
//#define DLSCH_RB_ALLOC 0x0001
void
do_OFDM_mod_l
(
int32_t
**
txdataF
,
int32_t
**
txdata
,
uint16_t
next_slot
,
LTE_DL_FRAME_PARMS
*
frame_parms
)
{
void
do_OFDM_mod_l
(
int32_t
**
txdataF
,
int32_t
**
txdata
,
uint16_t
next_slot
,
LTE_DL_FRAME_PARMS
*
frame_parms
)
{
int
aa
,
slot_offset
,
slot_offset_F
;
slot_offset_F
=
(
next_slot
)
*
(
frame_parms
->
ofdm_symbol_size
)
*
((
frame_parms
->
Ncp
==
1
)
?
6
:
7
);
slot_offset
=
(
next_slot
)
*
(
frame_parms
->
samples_per_tti
>>
1
);
for
(
aa
=
0
;
aa
<
frame_parms
->
nb_antennas_tx
;
aa
++
)
{
// printf("Thread %d starting ... aa %d (%llu)\n",omp_get_thread_num(),aa,rdtsc());
if
(
frame_parms
->
Ncp
==
1
)
PHY_ofdm_mod
(
&
txdataF
[
aa
][
slot_offset_F
],
// input
&
txdata
[
aa
][
slot_offset
],
// output
...
...
@@ -138,15 +131,11 @@ void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_
7
,
frame_parms
);
}
}
}
void
DL_channel
(
RU_t
*
ru
,
PHY_VARS_UE
*
UE
,
uint
subframe
,
int
awgn_flag
,
double
SNR
,
int
tx_lev
,
int
hold_channel
,
int
abstx
,
int
num_rounds
,
int
trials
,
int
round
,
channel_desc_t
*
eNB2UE
[
4
],
double
*
s_re
[
2
],
double
*
s_im
[
2
],
double
*
r_re
[
2
],
double
*
r_im
[
2
],
FILE
*
csv_fd
)
{
double
*
s_re
[
2
],
double
*
s_im
[
2
],
double
*
r_re
[
2
],
double
*
r_im
[
2
],
FILE
*
csv_fd
)
{
int
i
,
u
;
int
aa
,
aarx
,
aatx
;
double
channelx
,
channely
;
...
...
@@ -157,19 +146,18 @@ void DL_channel(RU_t *ru,PHY_VARS_UE *UE,uint subframe,int awgn_flag,double SNR,
for
(
i
=
0
;
i
<
2
*
UE
->
frame_parms
.
samples_per_tti
;
i
++
)
{
for
(
aa
=
0
;
aa
<
ru
->
frame_parms
.
nb_antennas_tx
;
aa
++
)
{
if
(
awgn_flag
==
0
)
{
s_re
[
aa
][
i
]
=
((
double
)(((
short
*
)
ru
->
common
.
txdata
[
aa
]))[(
2
*
subframe
*
UE
->
frame_parms
.
samples_per_tti
)
+
(
i
<<
1
)]);
s_im
[
aa
][
i
]
=
((
double
)(((
short
*
)
ru
->
common
.
txdata
[
aa
]))[(
2
*
subframe
*
UE
->
frame_parms
.
samples_per_tti
)
+
(
i
<<
1
)
+
1
]);
s_re
[
aa
][
i
]
=
((
double
)(((
short
*
)
ru
->
common
.
txdata
[
aa
]))[(
2
*
subframe
*
UE
->
frame_parms
.
samples_per_tti
)
+
(
i
<<
1
)]);
s_im
[
aa
][
i
]
=
((
double
)(((
short
*
)
ru
->
common
.
txdata
[
aa
]))[(
2
*
subframe
*
UE
->
frame_parms
.
samples_per_tti
)
+
(
i
<<
1
)
+
1
]);
}
else
{
for
(
aarx
=
0
;
aarx
<
UE
->
frame_parms
.
nb_antennas_rx
;
aarx
++
)
{
if
(
aa
==
0
)
{
r_re
[
aarx
][
i
]
=
((
double
)(((
short
*
)
ru
->
common
.
txdata
[
aa
]))[(
2
*
subframe
*
UE
->
frame_parms
.
samples_per_tti
)
+
(
i
<<
1
)]);
r_im
[
aarx
][
i
]
=
((
double
)(((
short
*
)
ru
->
common
.
txdata
[
aa
]))[(
2
*
subframe
*
UE
->
frame_parms
.
samples_per_tti
)
+
(
i
<<
1
)
+
1
]);
}
else
{
r_re
[
aarx
][
i
]
+=
((
double
)(((
short
*
)
ru
->
common
.
txdata
[
aa
]))[(
2
*
subframe
*
UE
->
frame_parms
.
samples_per_tti
)
+
(
i
<<
1
)]);
r_im
[
aarx
][
i
]
+=
((
double
)(((
short
*
)
ru
->
common
.
txdata
[
aa
]))[(
2
*
subframe
*
UE
->
frame_parms
.
samples_per_tti
)
+
(
i
<<
1
)
+
1
]);
}
}
for
(
aarx
=
0
;
aarx
<
UE
->
frame_parms
.
nb_antennas_rx
;
aarx
++
)
{
if
(
aa
==
0
)
{
r_re
[
aarx
][
i
]
=
((
double
)(((
short
*
)
ru
->
common
.
txdata
[
aa
]))[(
2
*
subframe
*
UE
->
frame_parms
.
samples_per_tti
)
+
(
i
<<
1
)]);
r_im
[
aarx
][
i
]
=
((
double
)(((
short
*
)
ru
->
common
.
txdata
[
aa
]))[(
2
*
subframe
*
UE
->
frame_parms
.
samples_per_tti
)
+
(
i
<<
1
)
+
1
]);
}
else
{
r_re
[
aarx
][
i
]
+=
((
double
)(((
short
*
)
ru
->
common
.
txdata
[
aa
]))[(
2
*
subframe
*
UE
->
frame_parms
.
samples_per_tti
)
+
(
i
<<
1
)]);
r_im
[
aarx
][
i
]
+=
((
double
)(((
short
*
)
ru
->
common
.
txdata
[
aa
]))[(
2
*
subframe
*
UE
->
frame_parms
.
samples_per_tti
)
+
(
i
<<
1
)
+
1
]);
}
}
}
}
}
...
...
@@ -177,27 +165,26 @@ void DL_channel(RU_t *ru,PHY_VARS_UE *UE,uint subframe,int awgn_flag,double SNR,
// Multipath channel
if
(
awgn_flag
==
0
)
{
multipath_channel
(
eNB2UE
[
round
],
s_re
,
s_im
,
r_re
,
r_im
,
2
*
UE
->
frame_parms
.
samples_per_tti
,
hold_channel
);
2
*
UE
->
frame_parms
.
samples_per_tti
,
hold_channel
);
// printf("amc: ****************** eNB2UE[%d]->n_rx = %d,dd %d\n",round,eNB2UE[round]->nb_rx,eNB2UE[round]->channel_offset);
if
(
abstx
==
1
&&
num_rounds
>
1
)
if
(
round
==
0
&&
hold_channel
==
0
)
{
random_channel
(
eNB2UE
[
1
],
0
);
random_channel
(
eNB2UE
[
2
],
0
);
random_channel
(
eNB2UE
[
3
],
0
);
random_channel
(
eNB2UE
[
1
],
0
);
random_channel
(
eNB2UE
[
2
],
0
);
random_channel
(
eNB2UE
[
3
],
0
);
}
if
(
UE
->
perfect_ce
==
1
)
{
// fill in perfect channel estimates
freq_channel
(
eNB2UE
[
round
],
UE
->
frame_parms
.
N_RB_DL
,
12
*
UE
->
frame_parms
.
N_RB_DL
+
1
);
/*
LOG_M("channel.m","ch",eNB2UE[round]->ch[0],eNB2UE[round]->channel_length,1,8);
LOG_M("channelF.m","chF",eNB2UE[round]->chF[0],12*UE->frame_parms.N_RB_DL + 1,1,8);
LOG_M("channel.m","ch",eNB2UE[round]->ch[0],eNB2UE[round]->channel_length,1,8);
LOG_M("channelF.m","chF",eNB2UE[round]->chF[0],12*UE->frame_parms.N_RB_DL + 1,1,8);
*/
}
}
if
(
abstx
)
{
if
(
trials
==
0
&&
round
==
0
)
{
// calculate freq domain representation to compute SINR
...
...
@@ -206,51 +193,51 @@ void DL_channel(RU_t *ru,PHY_VARS_UE *UE,uint subframe,int awgn_flag,double SNR,
fprintf
(
csv_fd
,
"%f,"
,
SNR
);
for
(
u
=
0
;
u
<
2
*
ru
->
frame_parms
.
N_RB_DL
;
u
++
)
{
for
(
aarx
=
0
;
aarx
<
eNB2UE
[
0
]
->
nb_rx
;
aarx
++
)
{
for
(
aatx
=
0
;
aatx
<
eNB2UE
[
0
]
->
nb_tx
;
aatx
++
)
{
channelx
=
eNB2UE
[
0
]
->
chF
[
aarx
+
(
aatx
*
eNB2UE
[
0
]
->
nb_rx
)][
u
].
x
;
channely
=
eNB2UE
[
0
]
->
chF
[
aarx
+
(
aatx
*
eNB2UE
[
0
]
->
nb_rx
)][
u
].
y
;
fprintf
(
csv_fd
,
"%e+i*(%e),"
,
channelx
,
channely
);
}
}
for
(
aarx
=
0
;
aarx
<
eNB2UE
[
0
]
->
nb_rx
;
aarx
++
)
{
for
(
aatx
=
0
;
aatx
<
eNB2UE
[
0
]
->
nb_tx
;
aatx
++
)
{
channelx
=
eNB2UE
[
0
]
->
chF
[
aarx
+
(
aatx
*
eNB2UE
[
0
]
->
nb_rx
)][
u
].
x
;
channely
=
eNB2UE
[
0
]
->
chF
[
aarx
+
(
aatx
*
eNB2UE
[
0
]
->
nb_rx
)][
u
].
y
;
fprintf
(
csv_fd
,
"%e+i*(%e),"
,
channelx
,
channely
);
}
}
}
if
(
num_rounds
>
1
)
{
freq_channel
(
eNB2UE
[
1
],
ru
->
frame_parms
.
N_RB_DL
,
2
*
ru
->
frame_parms
.
N_RB_DL
+
1
);
for
(
u
=
0
;
u
<
2
*
ru
->
frame_parms
.
N_RB_DL
;
u
++
)
{
for
(
aarx
=
0
;
aarx
<
eNB2UE
[
1
]
->
nb_rx
;
aarx
++
)
{
for
(
aatx
=
0
;
aatx
<
eNB2UE
[
1
]
->
nb_tx
;
aatx
++
)
{
channelx
=
eNB2UE
[
1
]
->
chF
[
aarx
+
(
aatx
*
eNB2UE
[
1
]
->
nb_rx
)][
u
].
x
;
channely
=
eNB2UE
[
1
]
->
chF
[
aarx
+
(
aatx
*
eNB2UE
[
1
]
->
nb_rx
)][
u
].
y
;
fprintf
(
csv_fd
,
"%e+i*(%e),"
,
channelx
,
channely
);
}
}
}
freq_channel
(
eNB2UE
[
2
],
ru
->
frame_parms
.
N_RB_DL
,
2
*
ru
->
frame_parms
.
N_RB_DL
+
1
);
for
(
u
=
0
;
u
<
2
*
ru
->
frame_parms
.
N_RB_DL
;
u
++
)
{
for
(
aarx
=
0
;
aarx
<
eNB2UE
[
2
]
->
nb_rx
;
aarx
++
)
{
for
(
aatx
=
0
;
aatx
<
eNB2UE
[
2
]
->
nb_tx
;
aatx
++
)
{
channelx
=
eNB2UE
[
2
]
->
chF
[
aarx
+
(
aatx
*
eNB2UE
[
2
]
->
nb_rx
)][
u
].
x
;
channely
=
eNB2UE
[
2
]
->
chF
[
aarx
+
(
aatx
*
eNB2UE
[
2
]
->
nb_rx
)][
u
].
y
;
fprintf
(
csv_fd
,
"%e+i*(%e),"
,
channelx
,
channely
);
}
}
}
freq_channel
(
eNB2UE
[
3
],
ru
->
frame_parms
.
N_RB_DL
,
2
*
ru
->
frame_parms
.
N_RB_DL
+
1
);
for
(
u
=
0
;
u
<
2
*
ru
->
frame_parms
.
N_RB_DL
;
u
++
)
{
for
(
aarx
=
0
;
aarx
<
eNB2UE
[
3
]
->
nb_rx
;
aarx
++
)
{
for
(
aatx
=
0
;
aatx
<
eNB2UE
[
3
]
->
nb_tx
;
aatx
++
)
{
channelx
=
eNB2UE
[
3
]
->
chF
[
aarx
+
(
aatx
*
eNB2UE
[
3
]
->
nb_rx
)][
u
].
x
;
channely
=
eNB2UE
[
3
]
->
chF
[
aarx
+
(
aatx
*
eNB2UE
[
3
]
->
nb_rx
)][
u
].
y
;
fprintf
(
csv_fd
,
"%e+i*(%e),"
,
channelx
,
channely
);
}
}
}
freq_channel
(
eNB2UE
[
1
],
ru
->
frame_parms
.
N_RB_DL
,
2
*
ru
->
frame_parms
.
N_RB_DL
+
1
);
for
(
u
=
0
;
u
<
2
*
ru
->
frame_parms
.
N_RB_DL
;
u
++
)
{
for
(
aarx
=
0
;
aarx
<
eNB2UE
[
1
]
->
nb_rx
;
aarx
++
)
{
for
(
aatx
=
0
;
aatx
<
eNB2UE
[
1
]
->
nb_tx
;
aatx
++
)
{
channelx
=
eNB2UE
[
1
]
->
chF
[
aarx
+
(
aatx
*
eNB2UE
[
1
]
->
nb_rx
)][
u
].
x
;
channely
=
eNB2UE
[
1
]
->
chF
[
aarx
+
(
aatx
*
eNB2UE
[
1
]
->
nb_rx
)][
u
].
y
;
fprintf
(
csv_fd
,
"%e+i*(%e),"
,
channelx
,
channely
);
}
}
}
freq_channel
(
eNB2UE
[
2
],
ru
->
frame_parms
.
N_RB_DL
,
2
*
ru
->
frame_parms
.
N_RB_DL
+
1
);
for
(
u
=
0
;
u
<
2
*
ru
->
frame_parms
.
N_RB_DL
;
u
++
)
{
for
(
aarx
=
0
;
aarx
<
eNB2UE
[
2
]
->
nb_rx
;
aarx
++
)
{
for
(
aatx
=
0
;
aatx
<
eNB2UE
[
2
]
->
nb_tx
;
aatx
++
)
{
channelx
=
eNB2UE
[
2
]
->
chF
[
aarx
+
(
aatx
*
eNB2UE
[
2
]
->
nb_rx
)][
u
].
x
;
channely
=
eNB2UE
[
2
]
->
chF
[
aarx
+
(
aatx
*
eNB2UE
[
2
]
->
nb_rx
)][
u
].
y
;
fprintf
(
csv_fd
,
"%e+i*(%e),"
,
channelx
,
channely
);
}
}
}
freq_channel
(
eNB2UE
[
3
],
ru
->
frame_parms
.
N_RB_DL
,
2
*
ru
->
frame_parms
.
N_RB_DL
+
1
);
for
(
u
=
0
;
u
<
2
*
ru
->
frame_parms
.
N_RB_DL
;
u
++
)
{
for
(
aarx
=
0
;
aarx
<
eNB2UE
[
3
]
->
nb_rx
;
aarx
++
)
{
for
(
aatx
=
0
;
aatx
<
eNB2UE
[
3
]
->
nb_tx
;
aatx
++
)
{
channelx
=
eNB2UE
[
3
]
->
chF
[
aarx
+
(
aatx
*
eNB2UE
[
3
]
->
nb_rx
)][
u
].
x
;
channely
=
eNB2UE
[
3
]
->
chF
[
aarx
+
(
aatx
*
eNB2UE
[
3
]
->
nb_rx
)][
u
].
y
;
fprintf
(
csv_fd
,
"%e+i*(%e),"
,
channelx
,
channely
);
}
}
}
}
}
}
...
...
@@ -264,25 +251,23 @@ void DL_channel(RU_t *ru,PHY_VARS_UE *UE,uint subframe,int awgn_flag,double SNR,
for
(
i
=
0
;
i
<
2
*
UE
->
frame_parms
.
samples_per_tti
;
i
++
)
{
for
(
aa
=
0
;
aa
<
UE
->
frame_parms
.
nb_antennas_rx
;
aa
++
)
{
//printf("s_re[0][%d]=> %f , r_re[0][%d]=> %f\n",i,s_re[aa][i],i,r_re[aa][i]);
((
short
*
)
UE
->
common_vars
.
rxdata
[
aa
])[(
2
*
subframe
*
UE
->
frame_parms
.
samples_per_tti
)
+
2
*
i
]
=
(
short
)
(
r_re
[
aa
][
i
]
+
sqrt
(
sigma2
/
2
)
*
gaussdouble
(
0
.
0
,
1
.
0
));
((
short
*
)
UE
->
common_vars
.
rxdata
[
aa
])[(
2
*
subframe
*
UE
->
frame_parms
.
samples_per_tti
)
+
2
*
i
+
1
]
=
(
short
)
(
r_im
[
aa
][
i
]
+
(
iqim
*
r_re
[
aa
][
i
])
+
sqrt
(
sigma2
/
2
)
*
gaussdouble
(
0
.
0
,
1
.
0
));
((
short
*
)
UE
->
common_vars
.
rxdata
[
aa
])[(
2
*
subframe
*
UE
->
frame_parms
.
samples_per_tti
)
+
2
*
i
]
=
(
short
)
(
r_re
[
aa
][
i
]
+
sqrt
(
sigma2
/
2
)
*
gaussdouble
(
0
.
0
,
1
.
0
));
((
short
*
)
UE
->
common_vars
.
rxdata
[
aa
])[(
2
*
subframe
*
UE
->
frame_parms
.
samples_per_tti
)
+
2
*
i
+
1
]
=
(
short
)
(
r_im
[
aa
][
i
]
+
(
iqim
*
r_re
[
aa
][
i
])
+
sqrt
(
sigma2
/
2
)
*
gaussdouble
(
0
.
0
,
1
.
0
));
}
}
}
uint16_t
fill_tx_req
(
nfapi_tx_request_body_t
*
tx_req_body
,
uint16_t
absSF
,
uint16_t
pdu_length
,
uint16_t
pdu_index
,
uint8_t
*
pdu
)
{
uint16_t
absSF
,
uint16_t
pdu_length
,
uint16_t
pdu_index
,
uint8_t
*
pdu
)
{
nfapi_tx_request_pdu_t
*
TX_req
=
&
tx_req_body
->
tx_pdu_list
[
tx_req_body
->
number_of_pdus
];
LOG_D
(
MAC
,
"Filling TX_req %d for pdu length %d
\n
"
,
tx_req_body
->
number_of_pdus
,
pdu_length
);
tx_req_body
->
number_of_pdus
,
pdu_length
);
TX_req
->
pdu_length
=
pdu_length
;
TX_req
->
pdu_index
=
pdu_index
;
TX_req
->
num_segments
=
1
;
...
...
@@ -290,40 +275,37 @@ fill_tx_req(nfapi_tx_request_body_t *tx_req_body,
TX_req
->
segments
[
0
].
segment_data
=
pdu
;
tx_req_body
->
tl
.
tag
=
NFAPI_TX_REQUEST_BODY_TAG
;
tx_req_body
->
number_of_pdus
++
;
return
(((
absSF
/
10
)
<<
4
)
+
(
absSF
%
10
));
}
void
fill_dlsch_config
(
nfapi_dl_config_request_body_t
*
dl_req
,
uint16_t
length
,
uint16_t
pdu_index
,
uint16_t
rnti
,
uint8_t
resource_allocation_type
,
uint8_t
virtual_resource_block_assignment_flag
,
uint16_t
resource_block_coding
,
uint8_t
modulation
,
uint8_t
redundancy_version
,
uint8_t
transport_blocks
,
uint8_t
transport_block_to_codeword_swap_flag
,
uint8_t
transmission_scheme
,
uint8_t
number_of_layers
,
uint8_t
number_of_subbands
,
// uint8_t codebook_index,
uint8_t
ue_category_capacity
,
uint8_t
pa
,
uint8_t
delta_power_offset_index
,
uint8_t
ngap
,
uint8_t
nprb
,
uint8_t
transmission_mode
,
uint8_t
num_bf_prb_per_subband
,
uint8_t
num_bf_vector
)
{
fill_dlsch_config
(
nfapi_dl_config_request_body_t
*
dl_req
,
uint16_t
length
,
uint16_t
pdu_index
,
uint16_t
rnti
,
uint8_t
resource_allocation_type
,
uint8_t
virtual_resource_block_assignment_flag
,
uint16_t
resource_block_coding
,
uint8_t
modulation
,
uint8_t
redundancy_version
,
uint8_t
transport_blocks
,
uint8_t
transport_block_to_codeword_swap_flag
,
uint8_t
transmission_scheme
,
uint8_t
number_of_layers
,
uint8_t
number_of_subbands
,
// uint8_t codebook_index,
uint8_t
ue_category_capacity
,
uint8_t
pa
,
uint8_t
delta_power_offset_index
,
uint8_t
ngap
,
uint8_t
nprb
,
uint8_t
transmission_mode
,
uint8_t
num_bf_prb_per_subband
,
uint8_t
num_bf_vector
)
{
nfapi_dl_config_request_pdu_t
*
dl_config_pdu
=
&
dl_req
->
dl_config_pdu_list
[
dl_req
->
number_pdu
];
memset
((
void
*
)
dl_config_pdu
,
0
,
sizeof
(
nfapi_dl_config_request_pdu_t
));
sizeof
(
nfapi_dl_config_request_pdu_t
));
dl_config_pdu
->
pdu_type
=
NFAPI_DL_CONFIG_DLSCH_PDU_TYPE
;
dl_config_pdu
->
pdu_size
=
(
uint8_t
)
(
2
+
sizeof
(
nfapi_dl_config_dlsch_pdu
));
dl_config_pdu
->
dlsch_pdu
.
dlsch_pdu_rel8
.
tl
.
tag
=
NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG
;
...
...
@@ -354,159 +336,132 @@ fill_dlsch_config(nfapi_dl_config_request_body_t * dl_req,
}
void
fill_DCI
(
PHY_VARS_eNB
*
eNB
,
int
frame
,
int
subframe
,
Sched_Rsp_t
*
sched_resp
,
uint8_t
input_buffer
[
NUMBER_OF_UE_MAX
][
20000
],
int
n_rnti
,
int
n_users
,
int
transmission_mode
,
int
retrans
,
int
common_flag
,
int
NB_RB
,
int
DLSCH_RB_ALLOC
,
int
TPC
,
int
mcs1
,
int
mcs2
,
int
ndi
,
int
rv
,
int
pa
,
int
*
num_common_dci
,
int
*
num_ue_spec_dci
,
int
*
num_dci
)
{
int
frame
,
int
subframe
,
Sched_Rsp_t
*
sched_resp
,
uint8_t
input_buffer
[
NUMBER_OF_UE_MAX
][
20000
],
int
n_rnti
,
int
n_users
,
int
transmission_mode
,
int
retrans
,
int
common_flag
,
int
NB_RB
,
int
DLSCH_RB_ALLOC
,
int
TPC
,
int
mcs1
,
int
mcs2
,
int
ndi
,
int
rv
,
int
pa
,
int
*
num_common_dci
,
int
*
num_ue_spec_dci
,
int
*
num_dci
)
{
int
k
;
nfapi_dl_config_request_body_t
*
dl_req
=&
sched_resp
->
DL_req
->
dl_config_request_body
;
nfapi_dl_config_request_pdu_t
*
dl_config_pdu
;
nfapi_tx_request_body_t
*
TX_req
=&
sched_resp
->
TX_req
->
tx_request_body
;
int
NB_RB4TBS
=
common_flag
==
0
?
NB_RB
:
(
2
+
TPC
);
dl_req
->
number_dci
=
0
;
dl_req
->
number_pdu
=
0
;
TX_req
->
number_of_pdus
=
0
;
for
(
k
=
0
;
k
<
n_users
;
k
++
)
{
switch
(
transmission_mode
)
{
case
1
:
case
2
:
case
7
:
dl_config_pdu
=
&
dl_req
->
dl_config_pdu_list
[
dl_req
->
number_pdu
];
memset
((
void
*
)
dl_config_pdu
,
0
,
sizeof
(
nfapi_dl_config_request_pdu_t
));
dl_config_pdu
->
pdu_type
=
NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE
;
dl_config_pdu
->
pdu_size
=
(
uint8_t
)
(
2
+
sizeof
(
nfapi_dl_config_dci_dl_pdu
));
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
dci_format
=
(
common_flag
==
0
)
?
NFAPI_DL_DCI_FORMAT_1
:
NFAPI_DL_DCI_FORMAT_1A
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
aggregation_level
=
4
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
tl
.
tag
=
NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
rnti
=
(
common_flag
==
0
)
?
n_rnti
+
k
:
SI_RNTI
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
rnti_type
=
(
common_flag
==
0
)
?
1
:
2
;
// CRNTI : see Table 4-10 from SCF082 - nFAPI specifications
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
transmission_power
=
6000
;
// equal to RS power
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
harq_process
=
0
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
tpc
=
TPC
;
// dont adjust power when retransmitting
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
new_data_indicator_1
=
(
common_flag
==
0
)
?
ndi
:
0
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
mcs_1
=
mcs1
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
redundancy_version_1
=
rv
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
resource_block_coding
=
(
common_flag
==
0
)
?
DLSCH_RB_ALLOC
:
computeRIV
(
eNB
->
frame_parms
.
N_RB_DL
,
0
,
NB_RB
);
//deactivate second codeword
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
mcs_2
=
0
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
redundancy_version_2
=
1
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
downlink_assignment_index
=
0
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
cce_idx
=
0
;
dl_req
->
number_dci
++
;
dl_req
->
number_pdu
++
;
dl_req
->
tl
.
tag
=
NFAPI_DL_CONFIG_REQUEST_BODY_TAG
;
AssertFatal
(
TPC
>=
0
&&
TPC
<
2
,
"TPC should be 0 or 1
\n
"
);
fill_dlsch_config
(
dl_req
,
get_TBS_DL
(
mcs1
,
NB_RB4TBS
),
(
retrans
>
0
)
?
-
1
:
0
,
/* retransmission, no pdu_index */
(
common_flag
==
0
)
?
n_rnti
:
SI_RNTI
,
0
,
// type 0 allocation from 7.1.6 in 36.213
0
,
// virtual_resource_block_assignment_flag, unused here
DLSCH_RB_ALLOC
,
// resource_block_coding,
get_Qm
(
mcs1
),
rv
,
// redundancy version
1
,
// transport blocks
0
,
// transport block to codeword swap flag
transmission_mode
==
1
?
0
:
1
,
// transmission_scheme
1
,
// number of layers
1
,
// number of subbands
// uint8_t codebook_index,
4
,
// UE category capacity
pa
,
// pa
0
,
// delta_power_offset for TM5
0
,
// ngap
0
,
// nprb
transmission_mode
,
0
,
//number of PRBs treated as one subband, not used here
0
// number of beamforming vectors, not used here
);
fill_tx_req
(
TX_req
,
(
frame
*
10
)
+
subframe
,
get_TBS_DL
(
mcs1
,
NB_RB4TBS
),
0
,
input_buffer
[
k
]);
break
;
case
3
:
if
(
common_flag
==
0
)
{
if
(
eNB
->
frame_parms
.
nb_antennas_tx
==
2
)
{
if
(
eNB
->
frame_parms
.
frame_type
==
TDD
)
{
}
else
{
}
}
}
break
;
case
4
:
if
(
common_flag
==
0
)
{
if
(
eNB
->
frame_parms
.
nb_antennas_tx
==
2
)
{
if
(
eNB
->
frame_parms
.
frame_type
==
TDD
)
{
}
else
{
}
}
else
if
(
eNB
->
frame_parms
.
nb_antennas_tx
==
4
)
{
case
1
:
case
2
:
case
7
:
dl_config_pdu
=
&
dl_req
->
dl_config_pdu_list
[
dl_req
->
number_pdu
];
memset
((
void
*
)
dl_config_pdu
,
0
,
sizeof
(
nfapi_dl_config_request_pdu_t
));
dl_config_pdu
->
pdu_type
=
NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE
;
dl_config_pdu
->
pdu_size
=
(
uint8_t
)
(
2
+
sizeof
(
nfapi_dl_config_dci_dl_pdu
));
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
dci_format
=
(
common_flag
==
0
)
?
NFAPI_DL_DCI_FORMAT_1
:
NFAPI_DL_DCI_FORMAT_1A
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
aggregation_level
=
4
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
tl
.
tag
=
NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
rnti
=
(
common_flag
==
0
)
?
n_rnti
+
k
:
SI_RNTI
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
rnti_type
=
(
common_flag
==
0
)
?
1
:
2
;
// CRNTI : see Table 4-10 from SCF082 - nFAPI specifications
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
transmission_power
=
6000
;
// equal to RS power
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
harq_process
=
0
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
tpc
=
TPC
;
// dont adjust power when retransmitting
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
new_data_indicator_1
=
(
common_flag
==
0
)
?
ndi
:
0
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
mcs_1
=
mcs1
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
redundancy_version_1
=
rv
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
resource_block_coding
=
(
common_flag
==
0
)
?
DLSCH_RB_ALLOC
:
computeRIV
(
eNB
->
frame_parms
.
N_RB_DL
,
0
,
NB_RB
);
//deactivate second codeword
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
mcs_2
=
0
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
redundancy_version_2
=
1
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
downlink_assignment_index
=
0
;
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
cce_idx
=
0
;
dl_req
->
number_dci
++
;
dl_req
->
number_pdu
++
;
dl_req
->
tl
.
tag
=
NFAPI_DL_CONFIG_REQUEST_BODY_TAG
;
AssertFatal
(
TPC
>=
0
&&
TPC
<
2
,
"TPC should be 0 or 1
\n
"
);
fill_dlsch_config
(
dl_req
,
get_TBS_DL
(
mcs1
,
NB_RB4TBS
),
(
retrans
>
0
)
?
-
1
:
0
,
/* retransmission, no pdu_index */
(
common_flag
==
0
)
?
n_rnti
:
SI_RNTI
,
0
,
// type 0 allocation from 7.1.6 in 36.213
0
,
// virtual_resource_block_assignment_flag, unused here
DLSCH_RB_ALLOC
,
// resource_block_coding,
get_Qm
(
mcs1
),
rv
,
// redundancy version
1
,
// transport blocks
0
,
// transport block to codeword swap flag
transmission_mode
==
1
?
0
:
1
,
// transmission_scheme
1
,
// number of layers
1
,
// number of subbands
// uint8_t codebook_index,
4
,
// UE category capacity
pa
,
// pa
0
,
// delta_power_offset for TM5
0
,
// ngap
0
,
// nprb
transmission_mode
,
0
,
//number of PRBs treated as one subband, not used here
0
// number of beamforming vectors, not used here
);
fill_tx_req
(
TX_req
,
(
frame
*
10
)
+
subframe
,
get_TBS_DL
(
mcs1
,
NB_RB4TBS
),
0
,
input_buffer
[
k
]);
break
;
}
case
3
:
if
(
common_flag
==
0
)
{
if
(
eNB
->
frame_parms
.
nb_antennas_tx
==
2
)
{
if
(
eNB
->
frame_parms
.
frame_type
==
TDD
)
{
}
else
{
}
}
}
}
else
{
break
;
case
4
:
if
(
common_flag
==
0
)
{
if
(
eNB
->
frame_parms
.
nb_antennas_tx
==
2
)
{
if
(
eNB
->
frame_parms
.
frame_type
==
TDD
)
{
}
else
{
}
}
else
if
(
eNB
->
frame_parms
.
nb_antennas_tx
==
4
)
{
}
}
else
{
}
break
;
case
5
:
case
6
:
break
;
default:
printf
(
"Unsupported Transmission Mode %d!!!
\n
"
,
transmission_mode
);
exit
(
-
1
);
break
;
default:
printf
(
"Unsupported Transmission Mode %d!!!
\n
"
,
transmission_mode
);
exit
(
-
1
);
break
;
}
}
*
num_dci
=
dl_req
->
number_dci
;
*
num_ue_spec_dci
=
dl_req
->
number_dci
;
*
num_common_dci
=
0
;
...
...
@@ -541,46 +496,33 @@ int verbose=0, help=0;
double
SNR
,
snr0
=-
2
.
0
,
snr1
,
rate
=
0
;
int
print_perf
=
0
;
int
main
(
int
argc
,
char
**
argv
)
{
int
main
(
int
argc
,
char
**
argv
)
{
int
k
,
i
,
j
,
aa
;
int
re
;
int
s
,
Kr
,
Kr_bytes
;
LTE_DL_FRAME_PARMS
*
frame_parms
;
double
s_re0
[
30720
*
2
],
s_im0
[
30720
*
2
],
r_re0
[
30720
*
2
],
r_im0
[
30720
*
2
];
double
s_re1
[
30720
*
2
],
s_im1
[
30720
*
2
],
r_re1
[
30720
*
2
],
r_im1
[
30720
*
2
];
double
*
s_re
[
2
]
=
{
s_re0
,
s_re1
};
double
*
s_im
[
2
]
=
{
s_im0
,
s_im1
};
double
*
r_re
[
2
]
=
{
r_re0
,
r_re1
};
double
*
r_im
[
2
]
=
{
r_im0
,
r_im1
};
double
*
s_re
[
2
]
=
{
s_re0
,
s_re1
};
double
*
s_im
[
2
]
=
{
s_im0
,
s_im1
};
double
*
r_re
[
2
]
=
{
r_re0
,
r_re1
};
double
*
r_im
[
2
]
=
{
r_im0
,
r_im1
};
uint8_t
transmission_mode
=
1
,
n_tx_port
=
1
,
n_tx_phy
=
1
,
n_rx
=
2
;
int
eNB_id
=
0
;
unsigned
char
round
;
unsigned
char
i_mod
=
2
;
int
NB_RB
;
SCM_t
channel_model
=
Rayleigh1
;
// unsigned char *input_data,*decoded_output;
DCI_ALLOC_t
da
;
DCI_ALLOC_t
*
dci_alloc
=
&
da
;
unsigned
int
coded_bits_per_codeword
=
0
,
nsymb
;
//,tbs=0;
unsigned
int
tx_lev
=
0
,
tx_lev_dB
=
0
,
trials
;
unsigned
int
errs
[
4
],
errs2
[
4
],
round_trials
[
4
],
dci_errors
[
4
];
//,num_layers;
memset
(
errs
,
0
,
4
*
sizeof
(
unsigned
int
));
memset
(
errs2
,
0
,
4
*
sizeof
(
unsigned
int
));
memset
(
round_trials
,
0
,
4
*
sizeof
(
unsigned
int
));
memset
(
dci_errors
,
0
,
4
*
sizeof
(
unsigned
int
));
//int re_allocated;
char
fname
[
32
],
vname
[
32
];
FILE
*
bler_fd
;
...
...
@@ -589,25 +531,20 @@ int main(int argc, char **argv)
char
time_meas_fname
[
256
];
// FILE *tikz_fd;
// char tikz_fname[256];
FILE
*
input_trch_fd
=
NULL
;
unsigned
char
input_trch_file
=
0
;
FILE
*
input_fd
=
NULL
;
unsigned
char
input_file
=
0
;
channel_desc_t
*
eNB2UE
[
4
];
//uint8_t num_pdcch_symbols_2=0;
//char stats_buffer[4096];
//int len;
//int u;
int
n
=
0
;
//int iii;
int
ch_realization
;
//int pmi_feedback=0;
int
hold_channel
=
0
;
// void *data;
// int ii;
// int bler;
...
...
@@ -617,23 +554,18 @@ int main(int argc, char **argv)
frame_t
frame_type
=
FDD
;
FD_lte_phy_scope_ue
*
form_ue
=
NULL
;
char
title
[
255
];
int
numCCE
=
0
;
//int dci_length_bytes=0,dci_length=0;
//double channel_bandwidth = 5.0, sampling_rate=7.68;
int
common_flag
=
0
,
TPC
=
0
;
double
cpu_freq_GHz
;
// time_stats_t ts;//,sts,usts;
int
avg_iter
,
iter_trials
;
int
rballocset
=
0
;
int
test_passed
=
0
;
double
effective_rate
=
0
.
0
;
char
channel_model_input
[
10
]
=
"I"
;
int
TB0_active
=
1
;
// LTE_DL_UE_HARQ_t *dlsch0_ue_harq;
// LTE_DL_eNB_HARQ_t *dlsch0_eNB_harq;
uint8_t
Kmimo
;
...
...
@@ -642,11 +574,9 @@ int main(int argc, char **argv)
int
sf
;
int
CCE_table
[
800
];
opp_enabled
=
1
;
// to enable the time meas
FILE
*
csv_fd
=
NULL
;
char
csv_fname
[
FILENAME_MAX
];
int
DLSCH_RB_ALLOC
=
0
;
int
dci_received
;
PHY_VARS_eNB
*
eNB
;
RU_t
*
ru
;
...
...
@@ -659,42 +589,40 @@ int main(int argc, char **argv)
nfapi_tx_request_t
TX_req
;
Sched_Rsp_t
sched_resp
;
int
pa
=
dB0
;
#if defined(__arm__)
FILE
*
proc_fd
=
NULL
;
char
buf
[
64
];
memset
(
buf
,
0
,
sizeof
(
buf
));
proc_fd
=
fopen
(
"/sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq"
,
"r"
);
if
(
!
proc_fd
)
printf
(
"cannot open /sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq"
);
printf
(
"cannot open /sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq"
);
else
{
while
(
fgets
(
buf
,
63
,
proc_fd
))
printf
(
"%s"
,
buf
);
while
(
fgets
(
buf
,
63
,
proc_fd
))
printf
(
"%s"
,
buf
);
}
fclose
(
proc_fd
);
cpu_freq_GHz
=
((
double
)
atof
(
buf
))
/
1e6
;
#else
cpu_freq_GHz
=
get_cpu_freq_GHz
();
#endif
printf
(
"Detected cpu_freq %f GHz
\n
"
,
cpu_freq_GHz
);
memset
((
void
*
)
&
sched_resp
,
0
,
sizeof
(
sched_resp
));
memset
((
void
*
)
&
sched_resp
,
0
,
sizeof
(
sched_resp
));
sched_resp
.
DL_req
=
&
DL_req
;
sched_resp
.
UL_req
=
&
UL_req
;
sched_resp
.
HI_DCI0_req
=
&
HI_DCI0_req
;
sched_resp
.
TX_req
=
&
TX_req
;
memset
((
void
*
)
&
DL_req
,
0
,
sizeof
(
DL_req
));
memset
((
void
*
)
&
UL_req
,
0
,
sizeof
(
UL_req
));
memset
((
void
*
)
&
HI_DCI0_req
,
0
,
sizeof
(
HI_DCI0_req
));
memset
((
void
*
)
&
TX_req
,
0
,
sizeof
(
TX_req
));
memset
((
void
*
)
&
DL_req
,
0
,
sizeof
(
DL_req
));
memset
((
void
*
)
&
UL_req
,
0
,
sizeof
(
UL_req
));
memset
((
void
*
)
&
HI_DCI0_req
,
0
,
sizeof
(
HI_DCI0_req
));
memset
((
void
*
)
&
TX_req
,
0
,
sizeof
(
TX_req
));
DL_req
.
dl_config_request_body
.
dl_config_pdu_list
=
dl_config_pdu_list
;
TX_req
.
tx_request_body
.
tx_pdu_list
=
tx_pdu_list
;
set_parallel_conf
(
"PARALLEL_SINGLE_THREAD"
);
cpuf
=
cpu_freq_GHz
;
//signal(SIGSEGV, handler);
//signal(SIGABRT, handler);
// default parameters
n_frames
=
1000
;
snr0
=
0
;
...
...
@@ -748,13 +676,8 @@ int main(int argc, char **argv)
{
"help"
,
"display help and exit"
,
PARAMFLAG_BOOL
,
iptr
:&
help
,
defintval
:
0
,
TYPE_INT
,
0
},
{
""
,
""
,
0
,
iptr
:
NULL
,
defintval
:
0
,
TYPE_INT
,
0
},
};
struct
option
*
long_options
=
parse_oai_options
(
options
);
struct
option
*
long_options
=
parse_oai_options
(
options
);
int
option_index
;
int
res
;
while
((
res
=
getopt_long_only
(
argc
,
argv
,
""
,
long_options
,
&
option_index
))
==
0
)
{
...
...
@@ -769,16 +692,16 @@ int main(int argc, char **argv)
case
TYPE_DOUBLE
:
*
(
double
*
)
options
[
option_index
].
dblptr
=
atof
(
optarg
);
break
;
case
TYPE_UINT8
:
*
(
uint8_t
*
)
options
[
option_index
].
dblptr
=
atoi
(
optarg
);
break
;
case
TYPE_UINT16
:
*
(
uint16_t
*
)
options
[
option_index
].
dblptr
=
atoi
(
optarg
);
break
;
default:
case
TYPE_UINT8
:
*
(
uint8_t
*
)
options
[
option_index
].
dblptr
=
atoi
(
optarg
);
break
;
case
TYPE_UINT16
:
*
(
uint16_t
*
)
options
[
option_index
].
dblptr
=
atoi
(
optarg
);
break
;
default:
printf
(
"not decoded type.
\n
"
);
exit
(
1
);
}
...
...
@@ -787,51 +710,51 @@ int main(int argc, char **argv)
}
switch
(
long_options
[
option_index
].
name
[
0
])
{
case
'a'
:
awgn_flag
=
1
;
channel_model
=
AWGN
;
break
;
case
'a'
:
awgn_flag
=
1
;
channel_model
=
AWGN
;
break
;
case
'D'
:
frame_type
=
TDD
;
break
;
case
'D'
:
frame_type
=
TDD
;
break
;
case
'e'
:
num_rounds
=
1
;
common_flag
=
1
;
TPC
=
atoi
(
optarg
);
break
;
case
'e'
:
num_rounds
=
1
;
common_flag
=
1
;
TPC
=
atoi
(
optarg
);
break
;
case
'i'
:
input_fd
=
fopen
(
optarg
,
"r"
);
input_file
=
1
;
dci_flag
=
1
;
break
;
case
'i'
:
input_fd
=
fopen
(
optarg
,
"r"
);
input_file
=
1
;
dci_flag
=
1
;
break
;
case
'I'
:
input_trch_fd
=
fopen
(
optarg
,
"r"
);
input_trch_file
=
1
;
break
;
case
'I'
:
input_trch_fd
=
fopen
(
optarg
,
"r"
);
input_trch_file
=
1
;
break
;
case
't'
:
mcs_i
=
atoi
(
optarg
);
i_mod
=
get_Qm
(
mcs_i
);
break
;
case
't'
:
mcs_i
=
atoi
(
optarg
);
i_mod
=
get_Qm
(
mcs_i
);
break
;
case
'r'
:
DLSCH_RB_ALLOC
=
atoi
(
optarg
);
rballocset
=
1
;
break
;
case
'r'
:
DLSCH_RB_ALLOC
=
atoi
(
optarg
);
rballocset
=
1
;
break
;
case
'g'
:
strncpy
(
channel_model_input
,
optarg
,
9
);
struct
tmp
{
char
opt
;
int
m
;
int
M
;
}
tmp
[]
=
{
{
'A'
,
SCM_A
,
2
},
case
'g'
:
strncpy
(
channel_model_input
,
optarg
,
9
);
struct
tmp
{
char
opt
;
int
m
;
int
M
;
}
tmp
[]
=
{
{
'A'
,
SCM_A
,
2
},
{
'B'
,
SCM_B
,
3
},
{
'C'
,
SCM_C
,
4
},
{
'D'
,
SCM_D
,
5
},
...
...
@@ -858,96 +781,95 @@ int main(int argc, char **argv)
AssertFatal
(
ptr
->
opt
!=
0
,
"Unsupported channel model: %s !
\n
"
,
optarg
);
break
;
case
'u'
:
dual_stream_UE
=
1
;
UE
->
use_ia_receiver
=
1
;
if
((
n_tx_port
!=
2
)
||
(
transmission_mode
!=
5
))
{
printf
(
"IA receiver only supported for TM5!"
);
exit
(
-
1
);
}
case
'u'
:
dual_stream_UE
=
1
;
UE
->
use_ia_receiver
=
1
;
break
;
if
((
n_tx_port
!=
2
)
||
(
transmission_mode
!=
5
))
{
printf
(
"IA receiver only supported for TM5!"
);
exit
(
-
1
);
}
case
'v'
:
i_mod
=
atoi
(
optarg
);
break
;
if
(
i_mod
!=
2
&&
i_mod
!=
4
&&
i_mod
!=
6
)
{
printf
(
"Wrong i_mod %d, should be 2,4 or 6
\n
"
,
i_mod
);
exit
(
-
1
);
}
case
'v'
:
i_mod
=
atoi
(
optarg
);
break
;
if
(
i_mod
!=
2
&&
i_mod
!=
4
&&
i_mod
!=
6
)
{
printf
(
"Wrong i_mod %d, should be 2,4 or 6
\n
"
,
i_mod
);
exit
(
-
1
);
}
case
'q'
:
n_tx_port
=
atoi
(
optarg
);
break
;
if
((
n_tx_port
==
0
)
||
((
n_tx_port
>
2
)))
{
printf
(
"Unsupported number of cell specific antennas ports %d
\n
"
,
n_tx_port
);
exit
(
-
1
);
}
case
'q'
:
n_tx_port
=
atoi
(
optarg
);
break
;
if
((
n_tx_port
==
0
)
||
((
n_tx_port
>
2
)))
{
printf
(
"Unsupported number of cell specific antennas ports %d
\n
"
,
n_tx_port
);
exit
(
-
1
);
}
break
;
case
'x'
:
transmission_mode
=
atoi
(
optarg
);
case
'x'
:
transmission_mode
=
atoi
(
optarg
);
if
((
transmission_mode
!=
1
)
&&
(
transmission_mode
!=
2
)
&&
(
transmission_mode
!=
3
)
&&
(
transmission_mode
!=
4
)
&&
(
transmission_mode
!=
5
)
&&
(
transmission_mode
!=
6
)
&&
(
transmission_mode
!=
7
))
{
printf
(
"Unsupported transmission mode %d
\n
"
,
transmission_mode
);
exit
(
-
1
);
}
if
((
transmission_mode
!=
1
)
&&
(
transmission_mode
!=
2
)
&&
(
transmission_mode
!=
3
)
&&
(
transmission_mode
!=
4
)
&&
(
transmission_mode
!=
5
)
&&
(
transmission_mode
!=
6
)
&&
(
transmission_mode
!=
7
))
{
printf
(
"Unsupported transmission mode %d
\n
"
,
transmission_mode
);
exit
(
-
1
);
}
if
(
transmission_mode
>
1
&&
transmission_mode
<
7
)
{
n_tx_port
=
2
;
}
if
(
transmission_mode
>
1
&&
transmission_mode
<
7
)
{
n_tx_port
=
2
;
}
break
;
break
;
case
'y'
:
n_tx_phy
=
atoi
(
optarg
);
case
'y'
:
n_tx_phy
=
atoi
(
optarg
);
if
(
n_tx_phy
<
n_tx_port
)
{
printf
(
"n_tx_phy mush not be smaller than n_tx_port"
);
exit
(
-
1
);
}
if
(
n_tx_phy
<
n_tx_port
)
{
printf
(
"n_tx_phy mush not be smaller than n_tx_port"
);
exit
(
-
1
);
}
if
((
transmission_mode
>
1
&&
transmission_mode
<
7
)
&&
n_tx_port
<
2
)
{
printf
(
"n_tx_port must be >1 for transmission_mode %d
\n
"
,
transmission_mode
);
exit
(
-
1
);
}
if
((
transmission_mode
>
1
&&
transmission_mode
<
7
)
&&
n_tx_port
<
2
)
{
printf
(
"n_tx_port must be >1 for transmission_mode %d
\n
"
,
transmission_mode
);
exit
(
-
1
);
}
if
(
transmission_mode
==
7
&&
(
n_tx_phy
!=
1
&&
n_tx_phy
!=
2
&&
n_tx_phy
!=
4
&&
n_tx_phy
!=
8
&&
n_tx_phy
!=
16
&&
n_tx_phy
!=
64
&&
n_tx_phy
!=
128
)
)
{
printf
(
"Physical number of antennas not supported for TM7.
\n
"
);
exit
(
-
1
);
}
if
(
transmission_mode
==
7
&&
(
n_tx_phy
!=
1
&&
n_tx_phy
!=
2
&&
n_tx_phy
!=
4
&&
n_tx_phy
!=
8
&&
n_tx_phy
!=
16
&&
n_tx_phy
!=
64
&&
n_tx_phy
!=
128
))
{
printf
(
"Physical number of antennas not supported for TM7.
\n
"
);
exit
(
-
1
);
}
break
;
break
;
case
'z'
:
n_rx
=
atoi
(
optarg
);
case
'z'
:
n_rx
=
atoi
(
optarg
);
if
((
n_rx
==
0
)
||
(
n_rx
>
2
))
{
printf
(
"Unsupported number of rx antennas %d
\n
"
,
n_rx
);
exit
(
-
1
);
}
if
((
n_rx
==
0
)
||
(
n_rx
>
2
))
{
printf
(
"Unsupported number of rx antennas %d
\n
"
,
n_rx
);
exit
(
-
1
);
}
break
;
break
;
case
'Q'
:
set_parallel_conf
(
optarg
);
break
;
case
'Q'
:
set_parallel_conf
(
optarg
);
break
;
default:
printf
(
"Wrong option: %s
\n
"
,
long_options
[
option_index
].
name
);
exit
(
1
);
break
;
default:
printf
(
"Wrong option: %s
\n
"
,
long_options
[
option_index
].
name
);
exit
(
1
);
break
;
}
}
...
...
@@ -957,18 +879,19 @@ int main(int argc, char **argv)
}
if
(
help
||
verbose
)
display_options_values
(
options
,
true
);
display_options_values
(
options
,
true
);
if
(
help
)
exit
(
0
);
if
(
thread_struct
.
parallel_conf
!=
PARALLEL_SINGLE_THREAD
)
set_worker_conf
(
"WORKER_ENABLE"
);
if
(
transmission_mode
>
1
)
pa
=
dBm3
;
printf
(
"dlsim: tmode %d, pa %d
\n
"
,
transmission_mode
,
pa
);
printf
(
"dlsim: tmode %d, pa %d
\n
"
,
transmission_mode
,
pa
);
AssertFatal
(
load_configmodule
(
argc
,
argv
,
CONFIG_ENABLECMDLINEONLY
)
!=
NULL
,
"cannot load configuration module, exiting
\n
"
);
"cannot load configuration module, exiting
\n
"
);
logInit
();
set_glog_onlinelog
(
true
);
// enable these lines if you need debug info
...
...
@@ -981,29 +904,33 @@ int main(int argc, char **argv)
if
(
common_flag
==
0
)
{
switch
(
N_RB_DL
)
{
case
6
:
if
(
rballocset
==
0
)
DLSCH_RB_ALLOC
=
0x3f
;
num_pdcch_symbols
=
3
;
break
;
case
25
:
if
(
rballocset
==
0
)
DLSCH_RB_ALLOC
=
0x1fff
;
break
;
case
50
:
if
(
rballocset
==
0
)
DLSCH_RB_ALLOC
=
0x1ffff
;
break
;
case
100
:
if
(
rballocset
==
0
)
DLSCH_RB_ALLOC
=
0x1ffffff
;
break
;
case
6
:
if
(
rballocset
==
0
)
DLSCH_RB_ALLOC
=
0x3f
;
num_pdcch_symbols
=
3
;
break
;
case
25
:
if
(
rballocset
==
0
)
DLSCH_RB_ALLOC
=
0x1fff
;
break
;
case
50
:
if
(
rballocset
==
0
)
DLSCH_RB_ALLOC
=
0x1ffff
;
break
;
case
100
:
if
(
rballocset
==
0
)
DLSCH_RB_ALLOC
=
0x1ffffff
;
break
;
}
NB_RB
=
conv_nprb
(
0
,
DLSCH_RB_ALLOC
,
N_RB_DL
);
}
else
{
}
else
{
if
(
rballocset
==
0
)
NB_RB
=
8
;
else
NB_RB
=
DLSCH_RB_ALLOC
;
AssertFatal
(
NB_RB
<=
N_RB_DL
,
"illegal NB_RB %d
\n
"
,
NB_RB
);
}
...
...
@@ -1025,42 +952,44 @@ int main(int argc, char **argv)
n_users
=
2
;
printf
(
"dual_stream_UE=%d
\n
"
,
dual_stream_UE
);
}
RC
.
nb_L1_inst
=
1
;
RC
.
nb_RU
=
1
;
lte_param_init
(
&
eNB
,
&
UE
,
&
ru
,
n_tx_port
,
n_tx_phy
,
1
,
n_tx_port
,
n_tx_phy
,
1
,
n_rx
,
transmission_mode
,
extended_prefix_flag
,
frame_type
,
Nid_cell
,
tdd_config
,
N_RB_DL
,
pa
,
threequarter_fs
,
osf
,
perfect_ce
);
RC
.
eNB
=
(
PHY_VARS_eNB
***
)
malloc
(
sizeof
(
PHY_VARS_eNB
**
));
transmission_mode
,
extended_prefix_flag
,
frame_type
,
Nid_cell
,
tdd_config
,
N_RB_DL
,
pa
,
threequarter_fs
,
osf
,
perfect_ce
);
RC
.
eNB
=
(
PHY_VARS_eNB
**
*
)
malloc
(
sizeof
(
PHY_VARS_eNB
**
));
RC
.
eNB
[
0
]
=
(
PHY_VARS_eNB
**
)
malloc
(
sizeof
(
PHY_VARS_eNB
*
));
RC
.
ru
=
(
RU_t
**
)
malloc
(
sizeof
(
RC
.
ru
));
RC
.
eNB
[
0
][
0
]
=
eNB
;
RC
.
ru
[
0
]
=
ru
;
printf
(
"lte_param_init done
\n
"
);
if
((
transmission_mode
==
1
)
||
(
transmission_mode
==
7
))
{
for
(
aa
=
0
;
aa
<
ru
->
nb_tx
;
aa
++
)
for
(
re
=
0
;
re
<
ru
->
frame_parms
.
ofdm_symbol_size
;
re
++
)
ru
->
beam_weights
[
0
][
0
][
aa
][
re
]
=
0x00007fff
/
eNB
->
frame_parms
.
nb_antennas_tx
;
for
(
re
=
0
;
re
<
ru
->
frame_parms
.
ofdm_symbol_size
;
re
++
)
ru
->
beam_weights
[
0
][
0
][
aa
][
re
]
=
0x00007fff
/
eNB
->
frame_parms
.
nb_antennas_tx
;
}
if
(
transmission_mode
<
7
)
ru
->
do_precoding
=
0
;
ru
->
do_precoding
=
0
;
else
ru
->
do_precoding
=
1
;
ru
->
do_precoding
=
1
;
eNB
->
mac_enabled
=
1
;
if
(
get_thread_worker_conf
()
==
WORKER_ENABLE
)
{
extern
void
init_td_thread
(
PHY_VARS_eNB
*
);
extern
void
init_te_thread
(
PHY_VARS_eNB
*
);
...
...
@@ -1069,27 +998,21 @@ int main(int argc, char **argv)
}
// callback functions required for phy_procedures_tx
// eNB_id_i = UE->n_connected_eNB;
printf
(
"Setting mcs1 = %d
\n
"
,
mcs1
);
printf
(
"Setting mcs2 = %d
\n
"
,
mcs2
);
printf
(
"NPRB = %d
\n
"
,
NB_RB
);
printf
(
"n_frames = %d
\n
"
,
n_frames
);
printf
(
"Transmission mode %d with %dx%d antenna configuration, Extended Prefix %d
\n
"
,
transmission_mode
,
n_tx_phy
,
n_rx
,
extended_prefix_flag
);
snr1
=
snr0
+
snr_int
;
printf
(
"SNR0 %f, SNR1 %f
\n
"
,
snr0
,
snr1
);
uint8_t
input_buffer
[
NUMBER_OF_UE_MAX
][
20000
];
for
(
i
=
0
;
i
<
n_users
;
i
++
)
for
(
j
=
0
;
j
<
20000
;
j
++
)
input_buffer
[
i
][
j
]
=
(
uint8_t
)((
taus
())
&
255
);
for
(
i
=
0
;
i
<
n_users
;
i
++
)
for
(
j
=
0
;
j
<
20000
;
j
++
)
input_buffer
[
i
][
j
]
=
(
uint8_t
)((
taus
())
&
255
);
frame_parms
=
&
eNB
->
frame_parms
;
nsymb
=
(
eNB
->
frame_parms
.
Ncp
==
0
)
?
14
:
12
;
printf
(
"Channel Model= (%s,%d)
\n
"
,
channel_model_input
,
channel_model
);
printf
(
"SCM-A=%d, SCM-B=%d, SCM-C=%d, SCM-D=%d, EPA=%d, EVA=%d, ETU=%d, Rayleigh8=%d, Rayleigh1=%d, Rayleigh1_corr=%d, Rayleigh1_anticorr=%d, Rice1=%d, Rice8=%d
\n
"
,
SCM_A
,
SCM_B
,
SCM_C
,
SCM_D
,
EPA
,
EVA
,
ETU
,
Rayleigh8
,
Rayleigh1
,
Rayleigh1_corr
,
Rayleigh1_anticorr
,
Rice1
,
Rice8
);
...
...
@@ -1100,10 +1023,12 @@ int main(int argc, char **argv)
sprintf
(
bler_fname
,
"bler_tx%d_chan%d_nrx%d_mcs%d.csv"
,
transmission_mode
,
channel_model
,
n_rx
,
mcs1
);
bler_fd
=
fopen
(
bler_fname
,
"w"
);
if
(
bler_fd
==
NULL
)
{
fprintf
(
stderr
,
"Cannot create file %s!
\n
"
,
bler_fname
);
exit
(
-
1
);
}
fprintf
(
bler_fd
,
"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
\n
"
);
if
(
test_perf
!=
0
)
{
...
...
@@ -1117,6 +1042,7 @@ int main(int argc, char **argv)
N_RB_DL
,
mcs1
,
n_tx_phy
,
n_rx
,
num_pdcch_symbols
,
channel_model_input
,
transmission_mode
);
//mkdir(dirname,0777);
time_meas_fd
=
fopen
(
time_meas_fname
,
"w"
);
if
(
time_meas_fd
==
NULL
)
{
fprintf
(
stderr
,
"Cannot create file %s!
\n
"
,
time_meas_fname
);
exit
(
-
1
);
...
...
@@ -1127,11 +1053,13 @@ int main(int argc, char **argv)
// CSV file
sprintf
(
csv_fname
,
"dataout_tx%d_u2%d_mcs%d_chan%d_nsimus%d_R%d.m"
,
transmission_mode
,
dual_stream_UE
,
mcs1
,
channel_model
,
n_frames
,
num_rounds
);
csv_fd
=
fopen
(
csv_fname
,
"w"
);
fprintf
(
csv_fd
,
"data_all%d=["
,
mcs1
);
if
(
csv_fd
==
NULL
)
{
fprintf
(
stderr
,
"Cannot create file %s!
\n
"
,
csv_fname
);
exit
(
-
1
);
}
fprintf
(
csv_fd
,
"data_all%d=["
,
mcs1
);
}
/*
...
...
@@ -1230,38 +1158,35 @@ int main(int argc, char **argv)
break;
}
*/
UE
->
pdcch_vars
[
UE
->
current_thread_id
[
subframe
]][
0
]
->
crnti
=
n_rnti
;
UE
->
n_connected_eNB
=
1
;
printf
(
"Allocating %dx%d eNB->UE channel descriptor
\n
"
,
eNB
->
frame_parms
.
nb_antennas_tx
,
UE
->
frame_parms
.
nb_antennas_rx
);
eNB2UE
[
0
]
=
new_channel_desc_scm
(
eNB
->
frame_parms
.
nb_antennas_tx
,
UE
->
frame_parms
.
nb_antennas_rx
,
channel_model
,
N_RB2sampling_rate
(
eNB
->
frame_parms
.
N_RB_DL
),
N_RB2channel_bandwidth
(
eNB
->
frame_parms
.
N_RB_DL
),
N_RB2channel_bandwidth
(
eNB
->
frame_parms
.
N_RB_DL
),
forgetting_factor
,
rx_sample_offset
,
0
);
reset_meas
(
&
eNB2UE
[
0
]
->
random_channel
);
reset_meas
(
&
eNB2UE
[
0
]
->
interp_time
);
if
(
num_rounds
>
1
)
{
for
(
n
=
1
;
n
<
4
;
n
++
)
{
eNB2UE
[
n
]
=
new_channel_desc_scm
(
eNB
->
frame_parms
.
nb_antennas_tx
,
UE
->
frame_parms
.
nb_antennas_rx
,
channel_model
,
N_RB2sampling_rate
(
eNB
->
frame_parms
.
N_RB_DL
),
N_RB2channel_bandwidth
(
eNB
->
frame_parms
.
N_RB_DL
),
forgetting_factor
,
N_RB2sampling_rate
(
eNB
->
frame_parms
.
N_RB_DL
),
N_RB2channel_bandwidth
(
eNB
->
frame_parms
.
N_RB_DL
),
forgetting_factor
,
rx_sample_offset
,
0
);
reset_meas
(
&
eNB2UE
[
n
]
->
random_channel
);
reset_meas
(
&
eNB2UE
[
n
]
->
interp_time
);
}
}
if
(
eNB2UE
[
0
]
==
NULL
)
{
printf
(
"Problem generating channel model. Exiting.
\n
"
);
exit
(
-
1
);
...
...
@@ -1273,20 +1198,23 @@ int main(int argc, char **argv)
Kmimo
=
1
;
switch
(
ue_category
)
{
case
1
:
Nsoft
=
250368
;
break
;
case
2
:
case
3
:
Nsoft
=
1237248
;
break
;
case
4
:
Nsoft
=
1827072
;
break
;
default:
printf
(
"Unsupported UE category %d
\n
"
,
ue_category
);
exit
(
-
1
);
break
;
case
1
:
Nsoft
=
250368
;
break
;
case
2
:
case
3
:
Nsoft
=
1237248
;
break
;
case
4
:
Nsoft
=
1827072
;
break
;
default:
printf
(
"Unsupported UE category %d
\n
"
,
ue_category
);
exit
(
-
1
);
break
;
}
for
(
k
=
0
;
k
<
NUMBER_OF_UE_MAX
;
k
++
)
{
...
...
@@ -1321,15 +1249,13 @@ int main(int argc, char **argv)
}
}
UE
->
dlsch_SI
[
0
]
=
new_ue_dlsch
(
1
,
1
,
Nsoft
,
MAX_TURBO_ITERATIONS
,
N_RB_DL
,
0
);
UE
->
dlsch_ra
[
0
]
=
new_ue_dlsch
(
1
,
1
,
Nsoft
,
MAX_TURBO_ITERATIONS
,
N_RB_DL
,
0
);
UE
->
ulsch
[
0
]
=
new_ue_ulsch
(
N_RB_DL
,
0
);
UE
->
dlsch_SI
[
0
]
=
new_ue_dlsch
(
1
,
1
,
Nsoft
,
MAX_TURBO_ITERATIONS
,
N_RB_DL
,
0
);
UE
->
dlsch_ra
[
0
]
=
new_ue_dlsch
(
1
,
1
,
Nsoft
,
MAX_TURBO_ITERATIONS
,
N_RB_DL
,
0
);
UE
->
ulsch
[
0
]
=
new_ue_ulsch
(
N_RB_DL
,
0
);
// structure for SIC at UE
UE
->
dlsch_eNB
[
0
]
=
new_eNB_dlsch
(
Kmimo
,
8
,
Nsoft
,
N_RB_DL
,
0
,
&
eNB
->
frame_parms
);
if
(
DLSCH_alloc_pdu2_1E
[
0
].
tpmi
==
5
)
{
eNB
->
UE_stats
[
0
].
DL_pmi_single
=
(
unsigned
short
)(
taus
()
&
0xffff
);
if
(
n_users
>
1
)
...
...
@@ -1344,38 +1270,33 @@ int main(int argc, char **argv)
L1_rxtx_proc_t
*
proc_eNB
=
&
eNB
->
proc
.
L1_proc
;
if
(
input_fd
==
NULL
)
{
DL_req
.
dl_config_request_body
.
number_pdcch_ofdm_symbols
=
num_pdcch_symbols
;
DL_req
.
sfn_sf
=
(
proc_eNB
->
frame_tx
<<
4
)
+
subframe
;
TX_req
.
sfn_sf
=
(
proc_eNB
->
frame_tx
<<
4
)
+
subframe
;
// UE specific DCI
fill_DCI
(
eNB
,
proc_eNB
->
frame_tx
,
subframe
,
&
sched_resp
,
input_buffer
,
n_rnti
,
n_users
,
transmission_mode
,
0
,
common_flag
,
NB_RB
,
DLSCH_RB_ALLOC
,
TPC
,
mcs1
,
mcs2
,
1
,
0
,
pa
,
&
num_common_dci
,
&
num_ue_spec_dci
,
&
num_dci
);
proc_eNB
->
frame_tx
,
subframe
,
&
sched_resp
,
input_buffer
,
n_rnti
,
n_users
,
transmission_mode
,
0
,
common_flag
,
NB_RB
,
DLSCH_RB_ALLOC
,
TPC
,
mcs1
,
mcs2
,
1
,
0
,
pa
,
&
num_common_dci
,
&
num_ue_spec_dci
,
&
num_dci
);
numCCE
=
get_nCCE
(
num_pdcch_symbols
,
&
eNB
->
frame_parms
,
get_mi
(
&
eNB
->
frame_parms
,
subframe
));
if
(
n_frames
==
1
)
printf
(
"num_pdcch_symbols %d, numCCE %d, num_dci %d/%d/%d
\n
"
,
num_pdcch_symbols
,
numCCE
,
num_dci
,
num_ue_spec_dci
,
num_common_dci
);
}
snr_step
=
input_snr_step
;
...
...
@@ -1401,13 +1322,11 @@ int main(int argc, char **argv)
round_trials
[
1
]
=
0
;
round_trials
[
2
]
=
0
;
round_trials
[
3
]
=
0
;
dci_errors
[
0
]
=
0
;
dci_errors
[
1
]
=
0
;
dci_errors
[
2
]
=
0
;
dci_errors
[
3
]
=
0
;
// avg_ber = 0;
round
=
0
;
avg_iter
=
0
;
iter_trials
=
0
;
...
...
@@ -1422,15 +1341,17 @@ int main(int argc, char **argv)
reset_meas
(
&
eNB
->
dlsch_turbo_encoding_stats
);
reset_meas
(
&
eNB
->
dlsch_common_and_dci
);
reset_meas
(
&
eNB
->
dlsch_ue_specific
);
for
(
int
i
=
0
;
i
<
RX_NB_TH
;
i
++
)
{
reset_meas
(
&
UE
->
phy_proc_rx
[
i
]);
// total UE rx
reset_meas
(
&
UE
->
ue_front_end_stat
[
i
]);
reset_meas
(
&
UE
->
phy_proc_rx
[
i
]);
// total UE rx
reset_meas
(
&
UE
->
ue_front_end_stat
[
i
]);
reset_meas
(
&
UE
->
pdsch_procedures_stat
[
i
]);
reset_meas
(
&
UE
->
dlsch_procedures_stat
[
i
]);
reset_meas
(
&
UE
->
dlsch_decoding_stats
[
i
]);
reset_meas
(
&
UE
->
dlsch_llr_stats_parallelization
[
i
][
0
]);
reset_meas
(
&
UE
->
dlsch_llr_stats_parallelization
[
i
][
1
]);
reset_meas
(
&
UE
->
dlsch_procedures_stat
[
i
]);
reset_meas
(
&
UE
->
dlsch_decoding_stats
[
i
]);
reset_meas
(
&
UE
->
dlsch_llr_stats_parallelization
[
i
][
0
]);
reset_meas
(
&
UE
->
dlsch_llr_stats_parallelization
[
i
][
1
]);
}
reset_meas
(
&
UE
->
ofdm_demod_stats
);
reset_meas
(
&
UE
->
crnti_procedures_stats
);
reset_meas
(
&
UE
->
dlsch_channel_estimation_stats
);
...
...
@@ -1449,7 +1370,7 @@ int main(int argc, char **argv)
reset_meas
(
&
UE
->
dlsch_tc_intl1_stats
);
reset_meas
(
&
UE
->
dlsch_tc_intl2_stats
);
// initialization
// initialization
// initialization
varArray_t
*
table_tx
=
initVarArray
(
1000
,
sizeof
(
double
));
varArray_t
*
table_tx_ifft
=
initVarArray
(
1000
,
sizeof
(
double
));
varArray_t
*
table_tx_mod
=
initVarArray
(
1000
,
sizeof
(
double
));
...
...
@@ -1466,17 +1387,16 @@ int main(int argc, char **argv)
varArray_t
*
table_rx_dec
=
initVarArray
(
1000
,
sizeof
(
double
));
for
(
trials
=
0
;
trials
<
n_frames
;
trials
++
)
{
//printf("Trial %d\n",trials);
//printf("Trial %d\n",trials);
fflush
(
stdout
);
round
=
0
;
//if (trials%100==0)
eNB2UE
[
0
]
->
first_run
=
1
;
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
eNB_id
][
0
]
->
harq_ack
[
subframe
].
ack
=
0
;
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
eNB_id
][
1
]
->
harq_ack
[
subframe
].
ack
=
0
;
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
eNB_id
][
0
]
->
harq_ack
[
subframe
].
ack
=
0
;
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
eNB_id
][
1
]
->
harq_ack
[
subframe
].
ack
=
0
;
while
((
round
<
num_rounds
)
&&
(
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
eNB_id
][
0
]
->
harq_ack
[
subframe
].
ack
==
0
))
{
//
printf("Trial %d, round %d\n",trials,round);
//
printf("Trial %d, round %d\n",trials,round);
round_trials
[
round
]
++
;
//if(transmission_mode>=5)
...
...
@@ -1492,7 +1412,7 @@ int main(int argc, char **argv)
}
else
hold_channel
=
0
;
//(round==0) ? 0 : 1;
//PMI_FEEDBACK:
//PMI_FEEDBACK:
// printf("Trial %d : Round %d, pmi_feedback %d \n",trials,round,pmi_feedback);
for
(
aa
=
0
;
aa
<
eNB
->
frame_parms
.
nb_antennas_tx
;
aa
++
)
{
...
...
@@ -1500,91 +1420,73 @@ int main(int argc, char **argv)
}
if
(
input_fd
==
NULL
)
{
// Simulate HARQ procedures!!!
memset
(
CCE_table
,
0
,
800
*
sizeof
(
int
));
if
(
/*common_flag == 0*/
1
)
{
memset
(
CCE_table
,
0
,
800
*
sizeof
(
int
));
num_dci
=
0
;
num_common_dci
=
0
;
num_ue_spec_dci
=
0
;
if
(
/*common_flag == 0*/
1
)
{
num_dci
=
0
;
num_common_dci
=
0
;
num_ue_spec_dci
=
0
;
if
(
round
==
0
)
{
// First round
TB0_active
=
1
;
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
rvidx
=
round
&
3
;
DL_req
.
sfn_sf
=
(
proc_eNB
->
frame_tx
<<
4
)
+
subframe
;
TX_req
.
sfn_sf
=
(
proc_eNB
->
frame_tx
<<
4
)
+
subframe
;
fill_DCI
(
eNB
,
proc_eNB
->
frame_tx
,
subframe
,
&
sched_resp
,
input_buffer
,
n_rnti
,
n_users
,
transmission_mode
,
0
,
common_flag
,
NB_RB
,
DLSCH_RB_ALLOC
,
TPC
,
mcs1
,
mcs2
,
!
(
trials
&
1
),
round
&
3
,
pa
,
&
num_common_dci
,
&
num_ue_spec_dci
,
&
num_dci
);
}
else
{
DL_req
.
sfn_sf
=
(
proc_eNB
->
frame_tx
<<
4
)
+
subframe
;
TX_req
.
sfn_sf
=
(
proc_eNB
->
frame_tx
<<
4
)
+
subframe
;
fill_DCI
(
eNB
,
proc_eNB
->
frame_tx
,
subframe
,
&
sched_resp
,
input_buffer
,
n_rnti
,
n_users
,
transmission_mode
,
1
,
common_flag
,
NB_RB
,
DLSCH_RB_ALLOC
,
TPC
,
(
TB0_active
==
1
)
?
mcs1
:
0
,
mcs2
,
!
(
trials
&
1
),(
TB0_active
==
1
)
?
round
&
3
:
0
,
pa
,
&
num_common_dci
,
&
num_ue_spec_dci
,
&
num_dci
);
}
}
proc_eNB
->
subframe_tx
=
subframe
;
sched_resp
.
subframe
=
subframe
;
sched_resp
.
frame
=
proc_eNB
->
frame_tx
;
eNB
->
abstraction_flag
=
0
;
schedule_response
(
&
sched_resp
);
phy_procedures_eNB_TX
(
eNB
,
proc_eNB
,
1
);
if
(
uncoded_ber_bit
==
NULL
)
{
// this is for user 0 only
printf
(
"nb_rb %d, rb_alloc %x, mcs %d
\n
"
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
nb_rb
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
rb_alloc
[
0
],
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
mcs
);
coded_bits_per_codeword
=
get_G
(
&
eNB
->
frame_parms
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
nb_rb
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
rb_alloc
,
get_Qm
(
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
mcs
),
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
Nl
,
num_pdcch_symbols
,
0
,
subframe
,
transmission_mode
>=
7
?
transmission_mode
:
0
);
uncoded_ber_bit
=
(
short
*
)
malloc
(
sizeof
(
short
)
*
coded_bits_per_codeword
);
printf
(
"uncoded_ber_bit=%p
\n
"
,
uncoded_ber_bit
);
}
start_meas
(
&
eNB
->
ofdm_mod_stats
);
ru
->
proc
.
subframe_tx
=
subframe
;
memcpy
((
void
*
)
&
ru
->
frame_parms
,(
void
*
)
&
eNB
->
frame_parms
,
sizeof
(
LTE_DL_FRAME_PARMS
));
feptx_prec
(
ru
);
feptx_ofdm
(
ru
);
stop_meas
(
&
eNB
->
ofdm_mod_stats
);
// generate next subframe for channel estimation
DL_req
.
dl_config_request_body
.
number_dci
=
0
;
DL_req
.
dl_config_request_body
.
number_pdu
=
0
;
TX_req
.
tx_request_body
.
number_of_pdus
=
0
;
proc_eNB
->
subframe_tx
=
subframe
+
1
;
sched_resp
.
subframe
=
subframe
+
1
;
schedule_response
(
&
sched_resp
);
phy_procedures_eNB_TX
(
eNB
,
proc_eNB
,
0
);
ru
->
proc
.
subframe_tx
=
(
subframe
+
1
)
%
10
;
feptx_prec
(
ru
);
feptx_ofdm
(
ru
);
DL_req
.
sfn_sf
=
(
proc_eNB
->
frame_tx
<<
4
)
+
subframe
;
TX_req
.
sfn_sf
=
(
proc_eNB
->
frame_tx
<<
4
)
+
subframe
;
fill_DCI
(
eNB
,
proc_eNB
->
frame_tx
,
subframe
,
&
sched_resp
,
input_buffer
,
n_rnti
,
n_users
,
transmission_mode
,
0
,
common_flag
,
NB_RB
,
DLSCH_RB_ALLOC
,
TPC
,
mcs1
,
mcs2
,
!
(
trials
&
1
),
round
&
3
,
pa
,
&
num_common_dci
,
&
num_ue_spec_dci
,
&
num_dci
);
}
else
{
DL_req
.
sfn_sf
=
(
proc_eNB
->
frame_tx
<<
4
)
+
subframe
;
TX_req
.
sfn_sf
=
(
proc_eNB
->
frame_tx
<<
4
)
+
subframe
;
fill_DCI
(
eNB
,
proc_eNB
->
frame_tx
,
subframe
,
&
sched_resp
,
input_buffer
,
n_rnti
,
n_users
,
transmission_mode
,
1
,
common_flag
,
NB_RB
,
DLSCH_RB_ALLOC
,
TPC
,
(
TB0_active
==
1
)
?
mcs1
:
0
,
mcs2
,
!
(
trials
&
1
),(
TB0_active
==
1
)
?
round
&
3
:
0
,
pa
,
&
num_common_dci
,
&
num_ue_spec_dci
,
&
num_dci
);
}
}
proc_eNB
->
frame_tx
++
;
proc_eNB
->
subframe_tx
=
subframe
;
sched_resp
.
subframe
=
subframe
;
sched_resp
.
frame
=
proc_eNB
->
frame_tx
;
eNB
->
abstraction_flag
=
0
;
schedule_response
(
&
sched_resp
);
phy_procedures_eNB_TX
(
eNB
,
proc_eNB
,
1
);
if
(
uncoded_ber_bit
==
NULL
)
{
// this is for user 0 only
printf
(
"nb_rb %d, rb_alloc %x, mcs %d
\n
"
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
nb_rb
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
rb_alloc
[
0
],
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
mcs
);
coded_bits_per_codeword
=
get_G
(
&
eNB
->
frame_parms
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
nb_rb
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
rb_alloc
,
get_Qm
(
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
mcs
),
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
Nl
,
num_pdcch_symbols
,
0
,
subframe
,
transmission_mode
>=
7
?
transmission_mode
:
0
);
uncoded_ber_bit
=
(
short
*
)
malloc
(
sizeof
(
short
)
*
coded_bits_per_codeword
);
printf
(
"uncoded_ber_bit=%p
\n
"
,
uncoded_ber_bit
);
}
start_meas
(
&
eNB
->
ofdm_mod_stats
);
ru
->
proc
.
subframe_tx
=
subframe
;
memcpy
((
void
*
)
&
ru
->
frame_parms
,(
void
*
)
&
eNB
->
frame_parms
,
sizeof
(
LTE_DL_FRAME_PARMS
));
feptx_prec
(
ru
);
feptx_ofdm
(
ru
);
stop_meas
(
&
eNB
->
ofdm_mod_stats
);
// generate next subframe for channel estimation
DL_req
.
dl_config_request_body
.
number_dci
=
0
;
DL_req
.
dl_config_request_body
.
number_pdu
=
0
;
TX_req
.
tx_request_body
.
number_of_pdus
=
0
;
proc_eNB
->
subframe_tx
=
subframe
+
1
;
sched_resp
.
subframe
=
subframe
+
1
;
schedule_response
(
&
sched_resp
);
phy_procedures_eNB_TX
(
eNB
,
proc_eNB
,
0
);
ru
->
proc
.
subframe_tx
=
(
subframe
+
1
)
%
10
;
feptx_prec
(
ru
);
feptx_ofdm
(
ru
);
proc_eNB
->
frame_tx
++
;
tx_lev
=
0
;
for
(
aa
=
0
;
aa
<
eNB
->
frame_parms
.
nb_antennas_tx
;
aa
++
)
{
...
...
@@ -1595,176 +1497,153 @@ int main(int argc, char **argv)
tx_lev_dB
=
(
unsigned
int
)
dB_fixed
(
tx_lev
);
if
(
n_frames
==
1
)
{
printf
(
"tx_lev = %d (%d dB)
\n
"
,
tx_lev
,
tx_lev_dB
);
printf
(
"tx_lev = %u (%u dB)
\n
"
,
tx_lev
,
tx_lev_dB
);
LOG_M
(
"txsig0.m"
,
"txs0"
,
&
ru
->
common
.
txdata
[
0
][
subframe
*
eNB
->
frame_parms
.
samples_per_tti
],
eNB
->
frame_parms
.
samples_per_tti
,
1
,
1
);
if
(
transmission_mode
<
7
)
{
LOG_M
(
"txsigF0.m"
,
"txsF0x"
,
&
ru
->
common
.
txdataF_BF
[
0
][
subframe
*
nsymb
*
eNB
->
frame_parms
.
ofdm_symbol_size
],
nsymb
*
eNB
->
frame_parms
.
ofdm_symbol_size
,
1
,
1
);
LOG_M
(
"txsigF0.m"
,
"txsF0x"
,
&
ru
->
common
.
txdataF_BF
[
0
][
subframe
*
nsymb
*
eNB
->
frame_parms
.
ofdm_symbol_size
],
nsymb
*
eNB
->
frame_parms
.
ofdm_symbol_size
,
1
,
1
);
}
else
if
(
transmission_mode
==
7
)
{
LOG_M
(
"txsigF0.m"
,
"txsF0"
,
&
ru
->
common
.
txdataF_BF
[
5
][
subframe
*
nsymb
*
eNB
->
frame_parms
.
ofdm_symbol_size
],
nsymb
*
eNB
->
frame_parms
.
ofdm_symbol_size
,
1
,
1
);
LOG_M
(
"txsigF0_BF.m"
,
"txsF0_BF"
,
&
ru
->
common
.
txdataF_BF
[
0
][
0
],
eNB
->
frame_parms
.
ofdm_symbol_size
,
1
,
1
);
}
}
}
DL_channel
(
ru
,
UE
,
subframe
,
awgn_flag
,
SNR
,
tx_lev
,
hold_channel
,
abstx
,
num_rounds
,
trials
,
round
,
eNB2UE
,
s_re
,
s_im
,
r_re
,
r_im
,
csv_fd
);
UE_rxtx_proc_t
*
proc
=
&
UE
->
proc
.
proc_rxtx
[
UE
->
current_thread_id
[
subframe
]];
proc
->
subframe_rx
=
subframe
;
UE
->
UE_mode
[
0
]
=
PUSCH
;
// first symbol has to be done separately in one-shot mode
slot_fep
(
UE
,
0
,
(
proc
->
subframe_rx
<<
1
),
UE
->
rx_offset
,
0
,
0
);
if
(
n_frames
==
1
)
printf
(
"Running phy_procedures_UE_RX
\n
"
);
if
(
dci_flag
==
0
)
{
memcpy
(
dci_alloc
,
eNB
->
pdcch_vars
[
subframe
&
1
].
dci_alloc
,
num_dci
*
sizeof
(
DCI_ALLOC_t
));
UE
->
pdcch_vars
[
UE
->
current_thread_id
[
proc
->
subframe_rx
]][
eNB_id
]
->
num_pdcch_symbols
=
num_pdcch_symbols
;
if
(
n_frames
==
1
)
printf
(
"bypassing PDCCH/DCI detection
\n
"
);
if
(
generate_ue_dlsch_params_from_dci
(
proc
->
frame_rx
,
proc
->
subframe_rx
,
(
void
*
)
&
dci_alloc
[
0
].
dci_pdu
,
common_flag
==
0
?
n_rnti
:
SI_RNTI
,
dci_alloc
[
0
].
format
,
UE
->
pdcch_vars
[
UE
->
current_thread_id
[
proc
->
subframe_rx
]][
eNB_id
],
UE
->
pdsch_vars
[
UE
->
current_thread_id
[
proc
->
subframe_rx
]][
eNB_id
],
UE
->
dlsch
[
UE
->
current_thread_id
[
proc
->
subframe_rx
]][
0
],
&
UE
->
frame_parms
,
UE
->
pdsch_config_dedicated
,
SI_RNTI
,
0
,
P_RNTI
,
UE
->
transmission_mode
[
eNB_id
]
<
7
?
0
:
UE
->
transmission_mode
[
eNB_id
],
0
)
==
0
)
{
dump_dci
(
&
UE
->
frame_parms
,
&
dci_alloc
[
0
]);
//UE->dlsch[UE->current_thread_id[proc->subframe_rx]][eNB_id][0]->active = 1;
//UE->dlsch[UE->current_thread_id[proc->subframe_rx]][eNB_id][1]->active = 1;
UE
->
pdcch_vars
[
UE
->
current_thread_id
[
proc
->
subframe_rx
]][
eNB_id
]
->
num_pdcch_symbols
=
num_pdcch_symbols
;
UE
->
dlsch_received
[
eNB_id
]
++
;
}
else
{
LOG_E
(
PHY
,
"Problem in DCI!
\n
"
);
}
}
dci_received
=
UE
->
pdcch_vars
[
UE
->
current_thread_id
[
proc
->
subframe_rx
]][
eNB_id
]
->
dci_received
;
phy_procedures_UE_RX
(
UE
,
proc
,
0
,
0
,
dci_flag
,
normal_txrx
);
dci_received
=
dci_received
-
UE
->
pdcch_vars
[
UE
->
current_thread_id
[
proc
->
subframe_rx
]][
eNB_id
]
->
dci_received
;
if
(
dci_flag
&&
(
dci_received
==
0
))
{
printf
(
"DCI not received
\n
"
);
dci_errors
[
round
]
++
;
LOG_M
(
"pdcchF0_ext.m"
,
"pdcchF_ext"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
rxdataF_ext
[
0
],
2
*
3
*
UE
->
frame_parms
.
ofdm_symbol_size
,
1
,
1
);
LOG_M
(
"pdcch00_ch0_ext.m"
,
"pdcch00_ch0_ext"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
dl_ch_estimates_ext
[
0
],
300
*
3
,
1
,
1
);
LOG_M
(
"pdcch_rxF_comp0.m"
,
"pdcch0_rxF_comp0"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
rxdataF_comp
[
0
],
4
*
300
,
1
,
1
);
LOG_M
(
"pdcch_rxF_llr.m"
,
"pdcch_llr"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
llr
,
2400
,
1
,
4
);
LOG_M
(
"rxsig0.m"
,
"rxs0"
,
&
UE
->
common_vars
.
rxdata
[
0
][
0
],
10
*
UE
->
frame_parms
.
samples_per_tti
,
1
,
1
);
LOG_M
(
"rxsigF0.m"
,
"rxsF0"
,
&
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
rxdataF
[
0
][
0
],
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
,
1
,
1
);
exit
(
-
1
);
}
}
DL_channel
(
ru
,
UE
,
subframe
,
awgn_flag
,
SNR
,
tx_lev
,
hold_channel
,
abstx
,
num_rounds
,
trials
,
round
,
eNB2UE
,
s_re
,
s_im
,
r_re
,
r_im
,
csv_fd
);
UE_rxtx_proc_t
*
proc
=
&
UE
->
proc
.
proc_rxtx
[
UE
->
current_thread_id
[
subframe
]];
proc
->
subframe_rx
=
subframe
;
UE
->
UE_mode
[
0
]
=
PUSCH
;
// first symbol has to be done separately in one-shot mode
slot_fep
(
UE
,
0
,
(
proc
->
subframe_rx
<<
1
),
UE
->
rx_offset
,
0
,
0
);
int
bit_errors
=
0
;
if
((
test_perf
==
0
)
&&
(
n_frames
==
1
))
{
if
(
n_frames
==
1
)
printf
(
"Running phy_procedures_UE_RX
\n
"
);
dlsch_unscrambling
(
&
eNB
->
frame_parms
,
0
,
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
],
coded_bits_per_codeword
,
UE
->
pdsch_vars
[
UE
->
current_thread_id
[
subframe
]][
0
]
->
llr
[
0
],
0
,
subframe
<<
1
);
for
(
i
=
0
;
i
<
coded_bits_per_codeword
;
i
++
)
if
((
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
e
[
i
]
==
1
&&
UE
->
pdsch_vars
[
UE
->
current_thread_id
[
subframe
]][
0
]
->
llr
[
0
][
i
]
>
0
)
||
(
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
e
[
i
]
==
0
&&
UE
->
pdsch_vars
[
UE
->
current_thread_id
[
subframe
]][
0
]
->
llr
[
0
][
i
]
<
0
))
{
uncoded_ber_bit
[
bit_errors
++
]
=
1
;
printf
(
"error in pos %d : %d => %d
\n
"
,
i
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
e
[
i
],
UE
->
pdsch_vars
[
UE
->
current_thread_id
[
subframe
]][
0
]
->
llr
[
0
][
i
]);
}
else
{
/*
printf("no error in pos %d : %d => %d\n",i,
eNB->dlsch[0][0]->harq_processes[0]->e[i],
UE->pdsch_vars[UE->current_thread_id[subframe]][0]->llr[0][i]);
*/
}
LOG_M
(
"dlsch_ber_bit.m"
,
"ber_bit"
,
uncoded_ber_bit
,
coded_bits_per_codeword
,
1
,
0
);
LOG_M
(
"ch0.m"
,
"ch0"
,
eNB2UE
[
0
]
->
ch
[
0
],
eNB2UE
[
0
]
->
channel_length
,
1
,
8
);
if
(
eNB
->
frame_parms
.
nb_antennas_tx
>
1
)
LOG_M
(
"ch1.m"
,
"ch1"
,
eNB2UE
[
0
]
->
ch
[
eNB
->
frame_parms
.
nb_antennas_rx
],
eNB2UE
[
0
]
->
channel_length
,
1
,
8
);
//common vars
LOG_M
(
"rxsig0.m"
,
"rxs0"
,
&
UE
->
common_vars
.
rxdata
[
0
][
0
],
10
*
UE
->
frame_parms
.
samples_per_tti
,
1
,
1
);
LOG_M
(
"rxsigF0.m"
,
"rxsF0"
,
&
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
rxdataF
[
0
][
0
],
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
,
1
,
1
);
if
(
UE
->
frame_parms
.
nb_antennas_rx
>
1
)
{
LOG_M
(
"rxsig1.m"
,
"rxs1"
,
UE
->
common_vars
.
rxdata
[
1
],
UE
->
frame_parms
.
samples_per_tti
,
1
,
1
);
LOG_M
(
"rxsigF1.m"
,
"rxsF1"
,
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
rxdataF
[
1
],
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
,
1
,
1
);
}
LOG_M
(
"dlsch00_r0.m"
,
"dl00_r0"
,
&
(
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
dl_ch_estimates
[
eNB_id
][
0
][
0
]),
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
,
1
,
1
);
if
(
UE
->
frame_parms
.
nb_antennas_rx
>
1
)
LOG_M
(
"dlsch01_r0.m"
,
"dl01_r0"
,
&
(
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
dl_ch_estimates
[
eNB_id
][
1
][
0
]),
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
,
1
,
1
);
if
(
dci_flag
==
0
)
{
memcpy
(
dci_alloc
,
eNB
->
pdcch_vars
[
subframe
&
1
].
dci_alloc
,
num_dci
*
sizeof
(
DCI_ALLOC_t
));
UE
->
pdcch_vars
[
UE
->
current_thread_id
[
proc
->
subframe_rx
]][
eNB_id
]
->
num_pdcch_symbols
=
num_pdcch_symbols
;
if
(
eNB
->
frame_parms
.
nb_antennas_tx
>
1
)
LOG_M
(
"dlsch10_r0.m"
,
"dl10_r0"
,
&
(
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
dl_ch_estimates
[
eNB_id
][
2
][
0
]),
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
,
1
,
1
);
if
(
n_frames
==
1
)
printf
(
"bypassing PDCCH/DCI detection
\n
"
);
if
(
generate_ue_dlsch_params_from_dci
(
proc
->
frame_rx
,
proc
->
subframe_rx
,
(
void
*
)
&
dci_alloc
[
0
].
dci_pdu
,
common_flag
==
0
?
n_rnti
:
SI_RNTI
,
dci_alloc
[
0
].
format
,
UE
->
pdcch_vars
[
UE
->
current_thread_id
[
proc
->
subframe_rx
]][
eNB_id
],
UE
->
pdsch_vars
[
UE
->
current_thread_id
[
proc
->
subframe_rx
]][
eNB_id
],
UE
->
dlsch
[
UE
->
current_thread_id
[
proc
->
subframe_rx
]][
0
],
&
UE
->
frame_parms
,
UE
->
pdsch_config_dedicated
,
SI_RNTI
,
0
,
P_RNTI
,
UE
->
transmission_mode
[
eNB_id
]
<
7
?
0
:
UE
->
transmission_mode
[
eNB_id
],
0
)
==
0
)
{
dump_dci
(
&
UE
->
frame_parms
,
&
dci_alloc
[
0
]);
//UE->dlsch[UE->current_thread_id[proc->subframe_rx]][eNB_id][0]->active = 1;
//UE->dlsch[UE->current_thread_id[proc->subframe_rx]][eNB_id][1]->active = 1;
UE
->
pdcch_vars
[
UE
->
current_thread_id
[
proc
->
subframe_rx
]][
eNB_id
]
->
num_pdcch_symbols
=
num_pdcch_symbols
;
UE
->
dlsch_received
[
eNB_id
]
++
;
}
else
{
LOG_E
(
PHY
,
"Problem in DCI!
\n
"
);
}
}
if
((
UE
->
frame_parms
.
nb_antennas_rx
>
1
)
&&
(
eNB
->
frame_parms
.
nb_antennas_tx
>
1
))
LOG_M
(
"dlsch11_r0.m"
,
"dl11_r0"
,
&
(
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
dl_ch_estimates
[
eNB_id
][
3
][
0
]),
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
/
2
,
1
,
1
);
dci_received
=
UE
->
pdcch_vars
[
UE
->
current_thread_id
[
proc
->
subframe_rx
]][
eNB_id
]
->
dci_received
;
phy_procedures_UE_RX
(
UE
,
proc
,
0
,
0
,
dci_flag
,
normal_txrx
);
dci_received
=
dci_received
-
UE
->
pdcch_vars
[
UE
->
current_thread_id
[
proc
->
subframe_rx
]][
eNB_id
]
->
dci_received
;
if
(
dci_flag
&&
(
dci_received
==
0
))
{
printf
(
"DCI not received
\n
"
);
dci_errors
[
round
]
++
;
LOG_M
(
"pdcchF0_ext.m"
,
"pdcchF_ext"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
rxdataF_ext
[
0
],
2
*
3
*
UE
->
frame_parms
.
ofdm_symbol_size
,
1
,
1
);
LOG_M
(
"pdcch00_ch0_ext.m"
,
"pdcch00_ch0_ext"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
dl_ch_estimates_ext
[
0
],
300
*
3
,
1
,
1
);
LOG_M
(
"pdcch_rxF_comp0.m"
,
"pdcch0_rxF_comp0"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
rxdataF_comp
[
0
],
4
*
300
,
1
,
1
);
LOG_M
(
"pdcch_rxF_llr.m"
,
"pdcch_llr"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
llr
,
2400
,
1
,
4
);
LOG_M
(
"rxsig0.m"
,
"rxs0"
,
&
UE
->
common_vars
.
rxdata
[
0
][
0
],
10
*
UE
->
frame_parms
.
samples_per_tti
,
1
,
1
);
LOG_M
(
"rxsigF0.m"
,
"rxsF0"
,
&
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
rxdataF
[
0
][
0
],
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
,
1
,
1
);
exit
(
-
1
);
}
//pdsch_vars
printf
(
"coded_bits_per_codeword %d
\n
"
,
coded_bits_per_codeword
);
int
bit_errors
=
0
;
if
((
test_perf
==
0
)
&&
(
n_frames
==
1
))
{
dlsch_unscrambling
(
&
eNB
->
frame_parms
,
0
,
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
],
coded_bits_per_codeword
,
UE
->
pdsch_vars
[
UE
->
current_thread_id
[
subframe
]][
0
]
->
llr
[
0
],
0
,
subframe
<<
1
);
for
(
i
=
0
;
i
<
coded_bits_per_codeword
;
i
++
)
if
((
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
e
[
i
]
==
1
&&
UE
->
pdsch_vars
[
UE
->
current_thread_id
[
subframe
]][
0
]
->
llr
[
0
][
i
]
>
0
)
||
(
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
e
[
i
]
==
0
&&
UE
->
pdsch_vars
[
UE
->
current_thread_id
[
subframe
]][
0
]
->
llr
[
0
][
i
]
<
0
))
{
uncoded_ber_bit
[
bit_errors
++
]
=
1
;
printf
(
"error in pos %d : %d => %d
\n
"
,
i
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
e
[
i
],
UE
->
pdsch_vars
[
UE
->
current_thread_id
[
subframe
]][
0
]
->
llr
[
0
][
i
]);
}
else
{
/*
printf("no error in pos %d : %d => %d\n",i,
eNB->dlsch[0][0]->harq_processes[0]->e[i],
UE->pdsch_vars[UE->current_thread_id[subframe]][0]->llr[0][i]);
*/
}
dump_dlsch2
(
UE
,
eNB_id
,
subframe
,
&
coded_bits_per_codeword
,
round
,
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
]
->
current_harq_pid
);
LOG_M
(
"dlsch_ber_bit.m"
,
"ber_bit"
,
uncoded_ber_bit
,
coded_bits_per_codeword
,
1
,
0
);
LOG_M
(
"ch0.m"
,
"ch0"
,
eNB2UE
[
0
]
->
ch
[
0
],
eNB2UE
[
0
]
->
channel_length
,
1
,
8
);
LOG_M
(
"dlsch_e.m"
,
"e"
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
e
,
coded_bits_per_codeword
,
1
,
4
);
if
(
eNB
->
frame_parms
.
nb_antennas_tx
>
1
)
LOG_M
(
"ch1.m"
,
"ch1"
,
eNB2UE
[
0
]
->
ch
[
eNB
->
frame_parms
.
nb_antennas_rx
],
eNB2UE
[
0
]
->
channel_length
,
1
,
8
);
//pdcch_
vars
LOG_M
(
"pdcchF0_ext.m"
,
"pdcchF_ext"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
rxdataF_ext
[
0
],
2
*
3
*
UE
->
frame_parms
.
ofdm_symbol_size
,
1
,
1
);
LOG_M
(
"pdcch00_ch0_ext.m"
,
"pdcch00_ch0_ext"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
dl_ch_estimates_ext
[
0
],
300
*
3
,
1
,
1
);
//common
vars
LOG_M
(
"rxsig0.m"
,
"rxs0"
,
&
UE
->
common_vars
.
rxdata
[
0
][
0
],
10
*
UE
->
frame_parms
.
samples_per_tti
,
1
,
1
);
LOG_M
(
"rxsigF0.m"
,
"rxsF0"
,
&
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
rxdataF
[
0
][
0
],
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
,
1
,
1
);
LOG_M
(
"pdcch_rxF_comp0.m"
,
"pdcch0_rxF_comp0"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
rxdataF_comp
[
0
],
4
*
300
,
1
,
1
);
LOG_M
(
"pdcch_rxF_llr.m"
,
"pdcch_llr"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
llr
,
2400
,
1
,
4
);
if
(
UE
->
frame_parms
.
nb_antennas_rx
>
1
)
{
LOG_M
(
"rxsig1.m"
,
"rxs1"
,
UE
->
common_vars
.
rxdata
[
1
],
UE
->
frame_parms
.
samples_per_tti
,
1
,
1
);
LOG_M
(
"rxsigF1.m"
,
"rxsF1"
,
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
rxdataF
[
1
],
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
,
1
,
1
);
}
}
LOG_M
(
"dlsch00_r0.m"
,
"dl00_r0"
,
&
(
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
dl_ch_estimates
[
eNB_id
][
0
][
0
]),
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
,
1
,
1
);
if
(
UE
->
frame_parms
.
nb_antennas_rx
>
1
)
LOG_M
(
"dlsch01_r0.m"
,
"dl01_r0"
,
&
(
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
dl_ch_estimates
[
eNB_id
][
1
][
0
]),
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
,
1
,
1
);
if
(
eNB
->
frame_parms
.
nb_antennas_tx
>
1
)
LOG_M
(
"dlsch10_r0.m"
,
"dl10_r0"
,
&
(
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
dl_ch_estimates
[
eNB_id
][
2
][
0
]),
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
,
1
,
1
);
if
((
UE
->
frame_parms
.
nb_antennas_rx
>
1
)
&&
(
eNB
->
frame_parms
.
nb_antennas_tx
>
1
))
LOG_M
(
"dlsch11_r0.m"
,
"dl11_r0"
,
&
(
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
dl_ch_estimates
[
eNB_id
][
3
][
0
]),
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
/
2
,
1
,
1
);
//pdsch_vars
printf
(
"coded_bits_per_codeword %u
\n
"
,
coded_bits_per_codeword
);
dump_dlsch2
(
UE
,
eNB_id
,
subframe
,
&
coded_bits_per_codeword
,
round
,
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
]
->
current_harq_pid
);
LOG_M
(
"dlsch_e.m"
,
"e"
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
e
,
coded_bits_per_codeword
,
1
,
4
);
//pdcch_vars
LOG_M
(
"pdcchF0_ext.m"
,
"pdcchF_ext"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
rxdataF_ext
[
0
],
2
*
3
*
UE
->
frame_parms
.
ofdm_symbol_size
,
1
,
1
);
LOG_M
(
"pdcch00_ch0_ext.m"
,
"pdcch00_ch0_ext"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
dl_ch_estimates_ext
[
0
],
300
*
3
,
1
,
1
);
LOG_M
(
"pdcch_rxF_comp0.m"
,
"pdcch0_rxF_comp0"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
rxdataF_comp
[
0
],
4
*
300
,
1
,
1
);
LOG_M
(
"pdcch_rxF_llr.m"
,
"pdcch_llr"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
llr
,
2400
,
1
,
4
);
}
if
(
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
eNB_id
][
0
]
->
harq_ack
[
subframe
].
ack
==
1
)
{
avg_iter
+=
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
eNB_id
][
0
]
->
last_iteration_cnt
;
iter_trials
++
;
...
...
@@ -1773,18 +1652,13 @@ int main(int argc, char **argv)
UE
->
total_TBS
[
eNB_id
]
=
UE
->
total_TBS
[
eNB_id
]
+
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
eNB_id
][
0
]
->
harq_processes
[
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
eNB_id
][
0
]
->
current_harq_pid
]
->
TBS
;
TB0_active
=
0
;
}
// DLSCH received ok
else
{
}
// DLSCH received ok
else
{
errs
[
round
]
++
;
avg_iter
+=
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
eNB_id
][
0
]
->
last_iteration_cnt
-
1
;
iter_trials
++
;
if
(
n_frames
==
1
)
{
//if ((n_frames==1) || (SNR>=30)) {
printf
(
"DLSCH errors found (round %d), uncoded ber %f
\n
"
,
round
,(
double
)
bit_errors
/
coded_bits_per_codeword
);
...
...
@@ -1795,11 +1669,11 @@ int main(int argc, char **argv)
Kr
=
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
]
->
harq_processes
[
0
]
->
Kplus
;
Kr_bytes
=
Kr
>>
3
;
printf
(
"Decoded_output (Segment %d):
\n
"
,
s
);
for
(
i
=
0
;
i
<
Kr_bytes
;
i
++
)
printf
(
"%d : %x (%x)
\n
"
,
i
,
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
]
->
harq_processes
[
0
]
->
c
[
s
][
i
],
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
]
->
harq_processes
[
0
]
->
c
[
s
][
i
]
^
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
c
[
s
][
i
]);
printf
(
"%d : %x (%x)
\n
"
,
i
,
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
]
->
harq_processes
[
0
]
->
c
[
s
][
i
],
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
]
->
harq_processes
[
0
]
->
c
[
s
][
i
]
^
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
c
[
s
][
i
]);
}
sprintf
(
fname
,
"rxsig0_r%d.m"
,
round
);
...
...
@@ -1807,7 +1681,6 @@ int main(int argc, char **argv)
LOG_M
(
fname
,
vname
,
&
UE
->
common_vars
.
rxdata
[
0
][
0
],
10
*
UE
->
frame_parms
.
samples_per_tti
,
1
,
1
);
sprintf
(
fname
,
"rxsigF0_r%d.m"
,
round
);
sprintf
(
vname
,
"rxs0F_r%d"
,
round
);
LOG_M
(
fname
,
vname
,
&
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
rxdataF
[
0
][
0
],
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
,
1
,
1
);
if
(
UE
->
frame_parms
.
nb_antennas_rx
>
1
)
{
...
...
@@ -1822,67 +1695,63 @@ int main(int argc, char **argv)
sprintf
(
fname
,
"dlsch00_r%d.m"
,
round
);
sprintf
(
vname
,
"dl00_r%d"
,
round
);
LOG_M
(
fname
,
vname
,
&
(
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
dl_ch_estimates
[
eNB_id
][
0
][
0
]),
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
,
1
,
1
);
&
(
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
dl_ch_estimates
[
eNB_id
][
0
][
0
]),
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
,
1
,
1
);
if
(
UE
->
frame_parms
.
nb_antennas_rx
>
1
)
{
sprintf
(
fname
,
"dlsch01_r%d.m"
,
round
);
sprintf
(
vname
,
"dl01_r%d"
,
round
);
LOG_M
(
fname
,
vname
,
&
(
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
dl_ch_estimates
[
eNB_id
][
1
][
0
]),
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
/
2
,
1
,
1
);
&
(
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
dl_ch_estimates
[
eNB_id
][
1
][
0
]),
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
/
2
,
1
,
1
);
}
if
(
eNB
->
frame_parms
.
nb_antennas_tx
>
1
)
{
sprintf
(
fname
,
"dlsch10_r%d.m"
,
round
);
sprintf
(
vname
,
"dl10_r%d"
,
round
);
LOG_M
(
fname
,
vname
,
&
(
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
dl_ch_estimates
[
eNB_id
][
2
][
0
]),
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
/
2
,
1
,
1
);
&
(
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
dl_ch_estimates
[
eNB_id
][
2
][
0
]),
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
/
2
,
1
,
1
);
}
if
((
UE
->
frame_parms
.
nb_antennas_rx
>
1
)
&&
(
eNB
->
frame_parms
.
nb_antennas_tx
>
1
))
{
sprintf
(
fname
,
"dlsch11_r%d.m"
,
round
);
sprintf
(
vname
,
"dl11_r%d"
,
round
);
LOG_M
(
fname
,
vname
,
&
(
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
dl_ch_estimates
[
eNB_id
][
3
][
0
]),
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
/
2
,
1
,
1
);
&
(
UE
->
common_vars
.
common_vars_rx_data_per_thread
[
UE
->
current_thread_id
[
subframe
]].
dl_ch_estimates
[
eNB_id
][
3
][
0
]),
UE
->
frame_parms
.
ofdm_symbol_size
*
nsymb
/
2
,
1
,
1
);
}
//pdsch_vars
dump_dlsch2
(
UE
,
eNB_id
,
subframe
,
&
coded_bits_per_codeword
,
round
,
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
]
->
current_harq_pid
);
//LOG_M("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
//LOG_M("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0);
//LOG_M("dlsch_w.m","w",eNB->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4);
//LOG_M("dlsch_w.m","w",UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0);
//pdcch_vars
LOG_M
(
"pdcchF0_ext.m"
,
"pdcchF_ext"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
rxdataF_ext
[
0
],
2
*
3
*
UE
->
frame_parms
.
ofdm_symbol_size
,
1
,
1
);
LOG_M
(
"pdcch00_ch0_ext.m"
,
"pdcch00_ch0_ext"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
dl_ch_estimates_ext
[
0
],
300
*
3
,
1
,
1
);
LOG_M
(
"pdcch_rxF_comp0.m"
,
"pdcch0_rxF_comp0"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
rxdataF_comp
[
0
],
4
*
300
,
1
,
1
);
LOG_M
(
"pdcch_rxF_llr.m"
,
"pdcch_llr"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
llr
,
2400
,
1
,
4
);
//pdcch_vars
LOG_M
(
"pdcchF0_ext.m"
,
"pdcchF_ext"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
rxdataF_ext
[
0
],
2
*
3
*
UE
->
frame_parms
.
ofdm_symbol_size
,
1
,
1
);
LOG_M
(
"pdcch00_ch0_ext.m"
,
"pdcch00_ch0_ext"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
dl_ch_estimates_ext
[
0
],
300
*
3
,
1
,
1
);
LOG_M
(
"pdcch_rxF_comp0.m"
,
"pdcch0_rxF_comp0"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
rxdataF_comp
[
0
],
4
*
300
,
1
,
1
);
LOG_M
(
"pdcch_rxF_llr.m"
,
"pdcch_llr"
,
UE
->
pdcch_vars
[
0
][
eNB_id
]
->
llr
,
2400
,
1
,
4
);
if
(
round
==
3
)
exit
(
-
1
);
}
// printf("round %d errors %d/%d\n",round,errs[round],trials);
round
++
;
// UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->round++;
}
if
(
xforms
==
1
)
{
phy_scope_UE
(
form_ue
,
UE
,
eNB_id
,
0
,
// UE_id
subframe
);
}
if
(
xforms
==
1
)
{
phy_scope_UE
(
form_ue
,
UE
,
eNB_id
,
0
,
// UE_id
subframe
);
}
UE
->
proc
.
proc_rxtx
[
UE
->
current_thread_id
[
subframe
]].
frame_rx
++
;
}
//round
UE
->
proc
.
proc_rxtx
[
UE
->
current_thread_id
[
subframe
]].
frame_rx
++
;
}
//round
// printf("\n");
...
...
@@ -1899,40 +1768,34 @@ int main(int argc, char **argv)
UE
->
total_TBS_last
[
eNB_id
]
=
UE
->
total_TBS
[
eNB_id
];
}
/* calculate the total processing time for each packet,
* get the max, min, and number of packets that exceed t>2000us
*/
double
t_tx
=
inMicroS
(
eNB
->
phy_proc_tx
.
p_time
);
double
t_tx
=
inMicroS
(
eNB
->
phy_proc_tx
.
p_time
);
double
t_tx_ifft
=
inMicroS
(
eNB
->
ofdm_mod_stats
.
p_time
);
double
t_rx
=
inMicroS
(
UE
->
phy_proc_rx
[
UE
->
current_thread_id
[
subframe
]].
p_time
);
sumUpStats
(
&
phy_proc_rx_tot
,
UE
->
phy_proc_rx
,
UE
->
current_thread_id
[
subframe
]);
sumUpStats
(
&
ue_front_end_tot
,
UE
->
ue_front_end_stat
,
UE
->
current_thread_id
[
subframe
]);
sumUpStats
(
&
pdsch_procedures_tot
,
UE
->
pdsch_procedures_stat
,
UE
->
current_thread_id
[
subframe
]);
sumUpStats
(
&
dlsch_procedures_tot
,
UE
->
dlsch_procedures_stat
,
UE
->
current_thread_id
[
subframe
]);
sumUpStats
(
&
dlsch_decoding_tot
,
UE
->
dlsch_decoding_stats
,
UE
->
current_thread_id
[
subframe
]);
sumUpStatsSlot
(
&
dlsch_llr_tot
,
UE
->
dlsch_llr_stats_parallelization
,
UE
->
current_thread_id
[
subframe
]);
double
t_rx_fft
=
inMicroS
(
UE
->
ofdm_demod_stats
.
p_time
);
sumUpStats
(
&
phy_proc_rx_tot
,
UE
->
phy_proc_rx
,
UE
->
current_thread_id
[
subframe
]);
sumUpStats
(
&
ue_front_end_tot
,
UE
->
ue_front_end_stat
,
UE
->
current_thread_id
[
subframe
]);
sumUpStats
(
&
pdsch_procedures_tot
,
UE
->
pdsch_procedures_stat
,
UE
->
current_thread_id
[
subframe
]);
sumUpStats
(
&
dlsch_procedures_tot
,
UE
->
dlsch_procedures_stat
,
UE
->
current_thread_id
[
subframe
]);
sumUpStats
(
&
dlsch_decoding_tot
,
UE
->
dlsch_decoding_stats
,
UE
->
current_thread_id
[
subframe
]);
sumUpStatsSlot
(
&
dlsch_llr_tot
,
UE
->
dlsch_llr_stats_parallelization
,
UE
->
current_thread_id
[
subframe
]);
double
t_rx_fft
=
inMicroS
(
UE
->
ofdm_demod_stats
.
p_time
);
double
t_rx_demod
=
inMicroS
(
UE
->
dlsch_rx_pdcch_stats
.
p_time
);
double
t_rx_dec
=
inMicroS
(
UE
->
dlsch_decoding_stats
[
UE
->
current_thread_id
[
subframe
]].
p_time
);
if
(
t_tx
>
2000
)
// 2ms is too much time for a subframe
n_tx_dropped
++
;
if
(
t_rx
>
2000
)
n_rx_dropped
++
;
appendVarArray
(
table_tx
,
&
t_tx
);
appendVarArray
(
table_tx
,
&
t_tx
);
appendVarArray
(
table_tx_ifft
,
&
t_tx_ifft
);
appendVarArray
(
table_rx
,
&
t_rx
);
appendVarArray
(
table_rx_fft
,
&
t_rx_fft
);
appendVarArray
(
table_rx_demod
,
&
t_rx_demod
);
appendVarArray
(
table_rx_dec
,
&
t_rx_dec
);
}
//trials
// round_trials[0]: number of code word : goodput the protocol
...
...
@@ -1953,12 +1816,10 @@ int main(int argc, char **argv)
}
effective_rate
=
1
.
0
-
((
double
)(
errs
[
0
]
+
errs
[
1
]
+
errs
[
2
]
+
errs
[
3
])
/
((
double
)
round_trials
[
0
]
+
round_trials
[
1
]
+
round_trials
[
2
]
+
round_trials
[
3
]));
printf
(
"
\n
**********************SNR = %f dB (tx_lev %f)**************************
\n
"
,
SNR
,
(
double
)
tx_lev_dB
+
10
*
log10
(
UE
->
frame_parms
.
ofdm_symbol_size
/
(
NB_RB
*
12
)));
printf
(
"Errors (%d(%d)/%d %d/%d %d/%d %d/%d), Pe = (%e,%e,%e,%e), dci_errors %d/%d, Pe = %e => effective rate %f, normalized delay %f (%f)
\n
"
,
printf
(
"Errors (%u(%u)/%u %u/%u %u/%u %u/%u), Pe = (%e,%e,%e,%e), dci_errors %u/%u, Pe = %e => effective rate %f, normalized delay %f (%f)
\n
"
,
errs
[
0
],
errs2
[
0
],
round_trials
[
0
],
...
...
@@ -1982,39 +1843,37 @@ int main(int argc, char **argv)
(
1
.
0
*
(
round_trials
[
0
]
-
errs
[
0
])
+
2
.
0
*
(
round_trials
[
1
]
-
errs
[
1
])
+
3
.
0
*
(
round_trials
[
2
]
-
errs
[
2
])
+
4
.
0
*
(
round_trials
[
3
]
-
errs
[
3
]))
/
((
double
)
round_trials
[
0
])
/
(
double
)
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
TBS
,
(
1
.
0
*
(
round_trials
[
0
]
-
errs
[
0
])
+
2
.
0
*
(
round_trials
[
1
]
-
errs
[
1
])
+
3
.
0
*
(
round_trials
[
2
]
-
errs
[
2
])
+
4
.
0
*
(
round_trials
[
3
]
-
errs
[
3
]))
/
((
double
)
round_trials
[
0
]));
double
timeBase
=
1
/
(
1000
*
cpu_freq_GHz
);
if
(
print_perf
==
1
)
{
printf
(
"
\n
eNB TX function statistics (per 1ms subframe)
\n
"
);
printDistribution
(
&
eNB
->
phy_proc_tx
,
table_tx
,
"PHY proc tx"
);
printStatIndent
(
&
eNB
->
dlsch_common_and_dci
,
"DL common channels and dci time"
);
printStatIndent
(
&
eNB
->
dlsch_ue_specific
,
"DL per ue part time"
);
printStatIndent2
(
&
eNB
->
dlsch_encoding_stats
,
"DLSCH encoding time"
);
printStatIndent3
(
&
eNB
->
dlsch_rate_matching_stats
,
"DLSCH rate matching time"
);
printStatIndent3
(
&
eNB
->
dlsch_turbo_encoding_stats
,
"DLSCH turbo encoding time"
);
printStatIndent3
(
&
eNB
->
dlsch_interleaving_stats
,
"DLSCH interleaving time"
);
printStatIndent2
(
&
eNB
->
dlsch_scrambling_stats
,
"DLSCH scrambling time"
);
printStatIndent2
(
&
eNB
->
dlsch_modulation_stats
,
"DLSCH modulation time"
);
printDistribution
(
&
eNB
->
ofdm_mod_stats
,
table_tx_ifft
,
"OFDM_mod (idft) time"
);
printDistribution
(
&
eNB
->
phy_proc_tx
,
table_tx
,
"PHY proc tx"
);
printStatIndent
(
&
eNB
->
dlsch_common_and_dci
,
"DL common channels and dci time"
);
printStatIndent
(
&
eNB
->
dlsch_ue_specific
,
"DL per ue part time"
);
printStatIndent2
(
&
eNB
->
dlsch_encoding_stats
,
"DLSCH encoding time"
);
printStatIndent3
(
&
eNB
->
dlsch_rate_matching_stats
,
"DLSCH rate matching time"
);
printStatIndent3
(
&
eNB
->
dlsch_turbo_encoding_stats
,
"DLSCH turbo encoding time"
);
printStatIndent3
(
&
eNB
->
dlsch_interleaving_stats
,
"DLSCH interleaving time"
);
printStatIndent2
(
&
eNB
->
dlsch_scrambling_stats
,
"DLSCH scrambling time"
);
printStatIndent2
(
&
eNB
->
dlsch_modulation_stats
,
"DLSCH modulation time"
);
printDistribution
(
&
eNB
->
ofdm_mod_stats
,
table_tx_ifft
,
"OFDM_mod (idft) time"
);
printf
(
"
\n
UE RX function statistics (per 1ms subframe)
\n
"
);
printDistribution
(
&
phy_proc_rx_tot
,
table_rx
,
"Total PHY proc rx"
);
printStatIndent
(
&
ue_front_end_tot
,
"Front end processing"
);
printStatIndent
(
&
dlsch_llr_tot
,
"rx_pdsch processing"
);
printStatIndent2
(
&
pdsch_procedures_tot
,
"pdsch processing"
);
printStatIndent2
(
&
dlsch_procedures_tot
,
"dlsch processing"
);
printStatIndent2
(
&
UE
->
crnti_procedures_stats
,
"C-RNTI processing"
);
printStatIndent
(
&
UE
->
ofdm_demod_stats
,
"ofdm demodulation"
);
printStatIndent
(
&
UE
->
dlsch_channel_estimation_stats
,
"DLSCH channel estimation time"
);
printStatIndent
(
&
UE
->
dlsch_freq_offset_estimation_stats
,
"DLSCH frequency offset estimation time"
);
printStatIndent
(
&
dlsch_decoding_tot
,
"DLSCH Decoding time "
);
printStatIndent
(
&
UE
->
dlsch_unscrambling_stats
,
"DLSCH unscrambling time"
);
printDistribution
(
&
phy_proc_rx_tot
,
table_rx
,
"Total PHY proc rx"
);
printStatIndent
(
&
ue_front_end_tot
,
"Front end processing"
);
printStatIndent
(
&
dlsch_llr_tot
,
"rx_pdsch processing"
);
printStatIndent2
(
&
pdsch_procedures_tot
,
"pdsch processing"
);
printStatIndent2
(
&
dlsch_procedures_tot
,
"dlsch processing"
);
printStatIndent2
(
&
UE
->
crnti_procedures_stats
,
"C-RNTI processing"
);
printStatIndent
(
&
UE
->
ofdm_demod_stats
,
"ofdm demodulation"
);
printStatIndent
(
&
UE
->
dlsch_channel_estimation_stats
,
"DLSCH channel estimation time"
);
printStatIndent
(
&
UE
->
dlsch_freq_offset_estimation_stats
,
"DLSCH frequency offset estimation time"
);
printStatIndent
(
&
dlsch_decoding_tot
,
"DLSCH Decoding time "
);
printStatIndent
(
&
UE
->
dlsch_unscrambling_stats
,
"DLSCH unscrambling time"
);
printStatIndent
(
&
UE
->
dlsch_rate_unmatching_stats
,
"DLSCH Rate Unmatching"
);
printf
(
"|__ DLSCH Turbo Decoding(%d bits), avg iterations: %.1f %.2f us (%d cycles, %d trials)
\n
"
,
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
]
->
harq_processes
[
0
]
->
Cminus
?
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
]
->
harq_processes
[
0
]
->
Kminus
:
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
]
->
harq_processes
[
0
]
->
Kplus
,
printf
(
"|__ DLSCH Turbo Decoding(%d bits), avg iterations: %.1f %.2f us (%d cycles, %d trials)
\n
"
,
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
]
->
harq_processes
[
0
]
->
Cminus
?
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
]
->
harq_processes
[
0
]
->
Kminus
:
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
]
->
harq_processes
[
0
]
->
Kplus
,
UE
->
dlsch_tc_intl1_stats
.
trials
/
(
double
)
UE
->
dlsch_tc_init_stats
.
trials
,
(
double
)
UE
->
dlsch_turbo_decoding_stats
.
diff
/
UE
->
dlsch_turbo_decoding_stats
.
trials
*
timeBase
,
(
int
)((
double
)
UE
->
dlsch_turbo_decoding_stats
.
diff
/
UE
->
dlsch_turbo_decoding_stats
.
trials
),
...
...
@@ -2026,11 +1885,10 @@ int main(int argc, char **argv)
printStatIndent2
(
&
UE
->
dlsch_tc_ext_stats
,
"ext"
);
printStatIndent2
(
&
UE
->
dlsch_tc_intl1_stats
,
"turbo internal interleaver"
);
printStatIndent2
(
&
UE
->
dlsch_tc_intl2_stats
,
"intl2+HardDecode+CRC"
);
}
if
((
transmission_mode
!=
3
)
&&
(
transmission_mode
!=
4
))
{
fprintf
(
bler_fd
,
"%f;%d;%d;%f;%
d;%d;%d;%d;%d;%d;%d;%d;%d
\n
"
,
fprintf
(
bler_fd
,
"%f;%d;%d;%f;%
u;%u;%u;%u;%u;%u;%u;%u;%u
\n
"
,
SNR
,
mcs1
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
TBS
,
...
...
@@ -2045,7 +1903,7 @@ int main(int argc, char **argv)
round_trials
[
3
],
dci_errors
[
0
]);
}
else
{
fprintf
(
bler_fd
,
"%f;%d;%d;%d;%d;%f;%
d;%d;%d;%d;%d;%d;%d;%d;%d
\n
"
,
fprintf
(
bler_fd
,
"%f;%d;%d;%d;%d;%f;%
u;%u;%u;%u;%u;%u;%u;%u;%u
\n
"
,
SNR
,
mcs1
,
mcs2
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
TBS
,
...
...
@@ -2062,7 +1920,6 @@ int main(int argc, char **argv)
dci_errors
[
0
]);
}
if
(
abstx
)
{
//ABSTRACTION
blerr
[
0
]
=
(
double
)
errs
[
0
]
/
(
round_trials
[
0
]);
...
...
@@ -2079,7 +1936,7 @@ int main(int argc, char **argv)
if
(
(
test_perf
!=
0
)
&&
(
100
*
effective_rate
>
test_perf
))
{
//fprintf(time_meas_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err\n");
if
((
transmission_mode
!=
3
)
&&
(
transmission_mode
!=
4
))
{
fprintf
(
time_meas_fd
,
"%f;%d;%d;%f;%
d;%d;%d;%d;%d;%d;%d;%d;%d
;"
,
fprintf
(
time_meas_fd
,
"%f;%d;%d;%f;%
u;%u;%u;%u;%u;%u;%u;%u;%u
;"
,
SNR
,
mcs1
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
TBS
,
...
...
@@ -2093,9 +1950,8 @@ int main(int argc, char **argv)
errs
[
3
],
round_trials
[
3
],
dci_errors
[
0
]);
//fprintf(time_meas_fd,"SNR; MCS; TBS; rate; DL_DECOD_ITER; err0; trials0; err1; trials1; err2; trials2; err3; trials3; PE; dci_err;PE;ND;\n");
fprintf
(
time_meas_fd
,
"%f;%d;%d;%f; %2.1f%%;%f;%f;%
d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%d;%d
;%e;%f;%f;"
,
fprintf
(
time_meas_fd
,
"%f;%d;%d;%f; %2.1f%%;%f;%f;%
u;%u;%u;%u;%u;%u;%u;%u;%e;%e;%e;%e;%u;%u
;%e;%f;%f;"
,
SNR
,
mcs1
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
TBS
,
...
...
@@ -2122,7 +1978,7 @@ int main(int argc, char **argv)
(
double
)
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
TBS
,
(
1
.
0
*
(
round_trials
[
0
]
-
errs
[
0
])
+
2
.
0
*
(
round_trials
[
1
]
-
errs
[
1
])
+
3
.
0
*
(
round_trials
[
2
]
-
errs
[
2
])
+
4
.
0
*
(
round_trials
[
3
]
-
errs
[
3
]))
/
((
double
)
round_trials
[
0
]));
}
else
{
fprintf
(
time_meas_fd
,
"%f;%d;%d;%d;%d;%f;%
d;%d;%d;%d;%d;%d;%d;%d;%d
;"
,
fprintf
(
time_meas_fd
,
"%f;%d;%d;%d;%d;%f;%
u;%u;%u;%u;%u;%u;%u;%u;%u
;"
,
SNR
,
mcs1
,
mcs2
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
TBS
,
...
...
@@ -2137,9 +1993,8 @@ int main(int argc, char **argv)
errs
[
3
],
round_trials
[
3
],
dci_errors
[
0
]);
//fprintf(time_meas_fd,"SNR; MCS; TBS; rate; DL_DECOD_ITER; err0; trials0; err1; trials1; err2; trials2; err3; trials3; PE; dci_err;PE;ND;\n");
fprintf
(
time_meas_fd
,
"%f;%d;%d;%d;%d;%f;%2.1f;%f;%f;%
d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%d;%d
;%e;%f;%f;"
,
fprintf
(
time_meas_fd
,
"%f;%d;%d;%d;%d;%f;%2.1f;%f;%f;%
u;%u;%u;%u;%u;%u;%u;%u;%e;%e;%e;%e;%u;%u
;%e;%f;%f;"
,
SNR
,
mcs1
,
mcs2
,
eNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
TBS
,
...
...
@@ -2199,49 +2054,45 @@ int main(int argc, char **argv)
fprintf
(
time_meas_fd
,
"%f;%f;%f;%f;%f;%f;%d;"
,
squareRoot
(
&
UE
->
phy_proc_tx
),
t_tx_max
,
t_tx_min
,
median
(
table_tx
),
q1
(
table_tx
),
q3
(
table_tx
),
n_tx_dropped
);
//fprintf(time_meas_fd,"IFFT;\n");
fprintf
(
time_meas_fd
,
"%f;%f;%f;%f;"
,
squareRoot
(
&
eNB
->
ofdm_mod_stats
),
squareRoot
(
&
eNB
->
ofdm_mod_stats
),
median
(
table_tx_ifft
),
q1
(
table_tx_ifft
),
q3
(
table_tx_ifft
));
//fprintf(time_meas_fd,"MOD;\n");
fprintf
(
time_meas_fd
,
"%f;%f;%f;%f;"
,
squareRoot
(
&
eNB
->
dlsch_modulation_stats
),
squareRoot
(
&
eNB
->
dlsch_modulation_stats
),
median
(
table_tx_mod
),
q1
(
table_tx_mod
),
q3
(
table_tx_mod
));
//fprintf(time_meas_fd,"ENC;\n");
fprintf
(
time_meas_fd
,
"%f;%f;%f;%f;"
,
squareRoot
(
&
eNB
->
dlsch_encoding_stats
),
squareRoot
(
&
eNB
->
dlsch_encoding_stats
),
median
(
table_tx_enc
),
q1
(
table_tx_enc
),
q3
(
table_tx_enc
));
//fprintf(time_meas_fd,"eNB_PROC_RX_STD;eNB_PROC_RX_MAX;eNB_PROC_RX_MIN;eNB_PROC_RX_MED;eNB_PROC_RX_Q1;eNB_PROC_RX_Q3;eNB_PROC_RX_DROPPED;\n");
fprintf
(
time_meas_fd
,
"%f;%f;%f;%f;%f;%f;%d;"
,
squareRoot
(
&
phy_proc_rx_tot
),
t_rx_max
,
t_rx_min
,
squareRoot
(
&
phy_proc_rx_tot
),
t_rx_max
,
t_rx_min
,
median
(
table_rx
),
q1
(
table_rx
),
q3
(
table_rx
),
n_rx_dropped
);
//fprintf(time_meas_fd,"FFT;\n");
fprintf
(
time_meas_fd
,
"%f;%f;%f;%f;"
,
squareRoot
(
&
UE
->
ofdm_demod_stats
),
squareRoot
(
&
UE
->
ofdm_demod_stats
),
median
(
table_rx_fft
),
q1
(
table_rx_fft
),
q3
(
table_rx_fft
));
//fprintf(time_meas_fd,"DEMOD;\n");
fprintf
(
time_meas_fd
,
"%f;%f;%f;%f;"
,
squareRoot
(
&
UE
->
dlsch_demodulation_stats
),
squareRoot
(
&
UE
->
dlsch_demodulation_stats
),
median
(
table_rx_demod
),
q1
(
table_rx_demod
),
q3
(
table_rx_demod
));
//fprintf(time_meas_fd,"DEC;\n");
fprintf
(
time_meas_fd
,
"%f;%f;%f;%f
\n
"
,
squareRoot
(
&
UE
->
dlsch_decoding_stats
[
subframe
]),
squareRoot
(
&
UE
->
dlsch_decoding_stats
[
subframe
]),
median
(
table_rx_dec
),
q1
(
table_rx_dec
),
q3
(
table_rx_dec
));
printf
(
"[passed] effective rate : %f (%2.1f%%,%f)): log and break
\n
"
,
rate
*
effective_rate
,
100
*
effective_rate
,
rate
);
test_passed
=
1
;
test_passed
=
1
;
break
;
}
else
if
(
test_perf
!=
0
)
{
printf
(
"[continue] effective rate : %f (%2.1f%%,%f)): increase snr
\n
"
,
rate
*
effective_rate
,
100
*
effective_rate
,
rate
);
test_passed
=
0
;
test_passed
=
0
;
}
if
(((
double
)
errs
[
0
]
/
(
round_trials
[
0
]))
<
(
10
.
0
/
n_frames
))
break
;
}
// SNR
}
//ch_realization
fclose
(
bler_fd
);
if
(
test_perf
!=
0
)
...
...
@@ -2265,7 +2116,6 @@ int main(int argc, char **argv)
free
(
uncoded_ber_bit
);
uncoded_ber_bit
=
NULL
;
printf
(
"Freeing dlsch structures
\n
"
);
for
(
i
=
0
;
i
<
2
;
i
++
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment