Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
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
alex037yang
OpenXG-RAN
Commits
d4bd2cdc
Commit
d4bd2cdc
authored
Jul 29, 2020
by
frtabu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
implement modifying channel model algo while running, complete function freeing a model
parent
f5d1dbb7
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
135 additions
and
62 deletions
+135
-62
common/utils/telnetsrv/telnetsrv.c
common/utils/telnetsrv/telnetsrv.c
+8
-6
common/utils/telnetsrv/telnetsrv.h
common/utils/telnetsrv/telnetsrv.h
+3
-2
openair1/SIMULATION/TOOLS/random_channel.c
openair1/SIMULATION/TOOLS/random_channel.c
+65
-33
openair1/SIMULATION/TOOLS/sim.h
openair1/SIMULATION/TOOLS/sim.h
+25
-2
targets/ARCH/rfsimulator/simulator.c
targets/ARCH/rfsimulator/simulator.c
+34
-19
No files found.
common/utils/telnetsrv/telnetsrv.c
View file @
d4bd2cdc
...
@@ -508,7 +508,7 @@ int process_command(char *buf) {
...
@@ -508,7 +508,7 @@ int process_command(char *buf) {
}
}
rt
=
CMDSTATUS_FOUND
;
rt
=
CMDSTATUS_FOUND
;
}
else
if
(
str
ncasecmp
(
cmd
,
"get"
,
3
)
==
0
||
strncasecmp
(
cmd
,
"set"
,
3
)
==
0
)
{
}
else
if
(
str
casecmp
(
cmd
,
"get"
)
==
0
||
strcasecmp
(
cmd
,
"set"
)
==
0
)
{
rt
=
setgetvar
(
i
,
cmd
[
0
],
cmdb
);
rt
=
setgetvar
(
i
,
cmd
[
0
],
cmdb
);
}
else
{
}
else
{
for
(
k
=
0
;
telnetparams
.
CmdParsers
[
i
].
cmd
[
k
].
cmdfunc
!=
NULL
;
k
++
)
{
for
(
k
=
0
;
telnetparams
.
CmdParsers
[
i
].
cmd
[
k
].
cmdfunc
!=
NULL
;
k
++
)
{
...
@@ -516,7 +516,7 @@ int process_command(char *buf) {
...
@@ -516,7 +516,7 @@ int process_command(char *buf) {
if
(
telnetparams
.
CmdParsers
[
i
].
cmd
[
k
].
qptr
!=
NULL
)
{
if
(
telnetparams
.
CmdParsers
[
i
].
cmd
[
k
].
qptr
!=
NULL
)
{
notifiedFIFO_elt_t
*
msg
=
newNotifiedFIFO_elt
(
sizeof
(
telnetsrv_qmsg_t
),
0
,
NULL
,
NULL
);
notifiedFIFO_elt_t
*
msg
=
newNotifiedFIFO_elt
(
sizeof
(
telnetsrv_qmsg_t
),
0
,
NULL
,
NULL
);
telnetsrv_qmsg_t
*
cmddata
=
NotifiedFifoData
(
msg
);
telnetsrv_qmsg_t
*
cmddata
=
NotifiedFifoData
(
msg
);
cmddata
->
cmdfunc
=
telnetparams
.
CmdParsers
[
i
].
cmd
[
k
].
cmdfunc
;
cmddata
->
cmdfunc
=
(
qcmdfunc_t
)
telnetparams
.
CmdParsers
[
i
].
cmd
[
k
].
cmdfunc
;
cmddata
->
prnt
=
client_printf
;
cmddata
->
prnt
=
client_printf
;
cmddata
->
debug
=
telnetparams
.
telnetdbg
;
cmddata
->
debug
=
telnetparams
.
telnetdbg
;
cmddata
->
cmdbuff
=
strdup
(
cmdb
);
cmddata
->
cmdbuff
=
strdup
(
cmdb
);
...
@@ -684,12 +684,12 @@ void run_telnetsrv(void) {
...
@@ -684,12 +684,12 @@ void run_telnetsrv(void) {
return
;
return
;
}
}
void
poll_telnetcmdq
(
void
*
qid
)
{
void
poll_telnetcmdq
(
void
*
qid
,
void
*
arg
)
{
notifiedFIFO_elt_t
*
msg
=
pollNotifiedFIFO
((
notifiedFIFO_t
*
)
qid
);
notifiedFIFO_elt_t
*
msg
=
pollNotifiedFIFO
((
notifiedFIFO_t
*
)
qid
);
if
(
msg
!=
NULL
)
{
if
(
msg
!=
NULL
)
{
telnetsrv_qmsg_t
*
msgdata
=
NotifiedFifoData
(
msg
);
telnetsrv_qmsg_t
*
msgdata
=
NotifiedFifoData
(
msg
);
msgdata
->
cmdfunc
(
msgdata
->
cmdbuff
,
msgdata
->
debug
,
msgdata
->
prnt
);
msgdata
->
cmdfunc
(
msgdata
->
cmdbuff
,
msgdata
->
debug
,
msgdata
->
prnt
,
arg
);
free
(
msgdata
->
cmdbuff
);
free
(
msgdata
->
cmdbuff
);
delNotifiedFIFO_elt
(
msg
);
delNotifiedFIFO_elt
(
msg
);
}
}
...
@@ -826,8 +826,10 @@ int telnetsrv_checkbuildver(char *mainexec_buildversion, char **shlib_buildvers
...
@@ -826,8 +826,10 @@ int telnetsrv_checkbuildver(char *mainexec_buildversion, char **shlib_buildvers
}
}
int
telnetsrv_getfarray
(
loader_shlibfunc_t
**
farray
)
{
int
telnetsrv_getfarray
(
loader_shlibfunc_t
**
farray
)
{
*
farray
=
malloc
(
sizeof
(
loader_shlibfunc_t
));
*
farray
=
malloc
(
sizeof
(
loader_shlibfunc_t
)
*
2
);
(
*
farray
)[
0
].
fname
=
TELNET_ADDCMD_FNAME
;
(
*
farray
)[
0
].
fname
=
TELNET_ADDCMD_FNAME
;
(
*
farray
)[
0
].
fptr
=
(
int
(
*
)(
void
)
)
add_telnetcmd
;
(
*
farray
)[
0
].
fptr
=
(
int
(
*
)(
void
)
)
add_telnetcmd
;
return
1
;
(
*
farray
)[
1
].
fname
=
TELNET_POLLCMDQ_FNAME
;
(
*
farray
)[
1
].
fptr
=
(
int
(
*
)(
void
)
)
poll_telnetcmdq
;
return
(
2
);
}
}
common/utils/telnetsrv/telnetsrv.h
View file @
d4bd2cdc
...
@@ -53,6 +53,7 @@
...
@@ -53,6 +53,7 @@
/* to add a set of new command to the telnet server shell */
/* to add a set of new command to the telnet server shell */
typedef
void
(
*
telnet_printfunc_t
)(
const
char
*
format
,
...);
typedef
void
(
*
telnet_printfunc_t
)(
const
char
*
format
,
...);
typedef
int
(
*
cmdfunc_t
)(
char
*
,
int
,
telnet_printfunc_t
prnt
);
typedef
int
(
*
cmdfunc_t
)(
char
*
,
int
,
telnet_printfunc_t
prnt
);
typedef
int
(
*
qcmdfunc_t
)(
char
*
,
int
,
telnet_printfunc_t
prnt
,
void
*
arg
);
#define TELNETSRV_CMDFLAG_PUSHINTPOOLQ (1<<0) // ask the telnet server to push the command in a thread pool queue
#define TELNETSRV_CMDFLAG_PUSHINTPOOLQ (1<<0) // ask the telnet server to push the command in a thread pool queue
typedef
struct
cmddef
{
typedef
struct
cmddef
{
...
@@ -67,7 +68,7 @@ typedef struct cmddef {
...
@@ -67,7 +68,7 @@ typedef struct cmddef {
/* structure used to send a command via a message queue to enable */
/* structure used to send a command via a message queue to enable */
/* executing a command in a thread different from the telnet server thread */
/* executing a command in a thread different from the telnet server thread */
typedef
struct
telnetsrv_qmsg
{
typedef
struct
telnetsrv_qmsg
{
cmdfunc_t
cmdfunc
;
q
cmdfunc_t
cmdfunc
;
telnet_printfunc_t
prnt
;
telnet_printfunc_t
prnt
;
int
debug
;
int
debug
;
char
*
cmdbuff
;
char
*
cmdbuff
;
...
@@ -144,7 +145,7 @@ VT escape sequence definition, for smarter display....
...
@@ -144,7 +145,7 @@ VT escape sequence definition, for smarter display....
#define TELNET_ADDCMD_FNAME "add_telnetcmd"
#define TELNET_ADDCMD_FNAME "add_telnetcmd"
#define TELNET_POLLCMDQ_FNAME "poll_telnetcmdq"
#define TELNET_POLLCMDQ_FNAME "poll_telnetcmdq"
typedef
int
(
*
add_telnetcmd_func_t
)(
char
*
,
telnetshell_vardef_t
*
,
telnetshell_cmddef_t
*
);
typedef
int
(
*
add_telnetcmd_func_t
)(
char
*
,
telnetshell_vardef_t
*
,
telnetshell_cmddef_t
*
);
typedef
void
(
*
poll_telnetcmdq_func_t
)(
void
*
qid
);
typedef
void
(
*
poll_telnetcmdq_func_t
)(
void
*
qid
,
void
*
arg
);
#ifdef TELNETSERVERCODE
#ifdef TELNETSERVERCODE
int
add_telnetcmd
(
char
*
modulename
,
telnetshell_vardef_t
*
var
,
telnetshell_cmddef_t
*
cmd
);
int
add_telnetcmd
(
char
*
modulename
,
telnetshell_vardef_t
*
var
,
telnetshell_cmddef_t
*
cmd
);
void
set_sched
(
pthread_t
tid
,
int
pid
,
int
priority
);
void
set_sched
(
pthread_t
tid
,
int
pid
,
int
priority
);
...
...
openair1/SIMULATION/TOOLS/random_channel.c
View file @
d4bd2cdc
...
@@ -68,7 +68,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
...
@@ -68,7 +68,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
uint8_t
nb_taps
,
uint8_t
nb_taps
,
uint8_t
channel_length
,
uint8_t
channel_length
,
double
*
amps
,
double
*
amps
,
double
*
delays
,
double
*
delays
,
struct
complex
**
R_sqrt
,
struct
complex
**
R_sqrt
,
double
Td
,
double
Td
,
double
sampling_rate
,
double
sampling_rate
,
...
@@ -93,6 +93,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
...
@@ -93,6 +93,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
if
(
delays
==
NULL
)
{
if
(
delays
==
NULL
)
{
chan_desc
->
delays
=
(
double
*
)
malloc
(
nb_taps
*
sizeof
(
double
));
chan_desc
->
delays
=
(
double
*
)
malloc
(
nb_taps
*
sizeof
(
double
));
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_DELAY
;
delta_tau
=
Td
/
nb_taps
;
delta_tau
=
Td
/
nb_taps
;
for
(
i
=
0
;
i
<
nb_taps
;
i
++
)
for
(
i
=
0
;
i
<
nb_taps
;
i
++
)
...
@@ -134,10 +135,9 @@ void fill_channel_desc(channel_desc_t *chan_desc,
...
@@ -134,10 +135,9 @@ void fill_channel_desc(channel_desc_t *chan_desc,
if
(
R_sqrt
==
NULL
)
{
if
(
R_sqrt
==
NULL
)
{
chan_desc
->
R_sqrt
=
(
struct
complex
**
)
calloc
(
nb_taps
,
sizeof
(
struct
complex
*
));
chan_desc
->
R_sqrt
=
(
struct
complex
**
)
calloc
(
nb_taps
,
sizeof
(
struct
complex
*
));
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_RSQRT_NTAPS
;
for
(
i
=
0
;
i
<
nb_taps
;
i
++
)
{
for
(
i
=
0
;
i
<
nb_taps
;
i
++
)
{
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
calloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
,
sizeof
(
struct
complex
));
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
calloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
,
sizeof
(
struct
complex
));
for
(
j
=
0
;
j
<
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
;
j
+=
(
nb_tx
*
nb_rx
+
1
))
{
for
(
j
=
0
;
j
<
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
;
j
+=
(
nb_tx
*
nb_rx
+
1
))
{
chan_desc
->
R_sqrt
[
i
][
j
].
x
=
1
.
0
;
chan_desc
->
R_sqrt
[
i
][
j
].
x
=
1
.
0
;
chan_desc
->
R_sqrt
[
i
][
j
].
y
=
0
.
0
;
chan_desc
->
R_sqrt
[
i
][
j
].
y
=
0
.
0
;
...
@@ -145,7 +145,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
...
@@ -145,7 +145,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
}
}
}
else
{
}
else
{
chan_desc
->
R_sqrt
=
(
struct
complex
**
)
calloc
(
nb_taps
,
sizeof
(
struct
complex
*
));
chan_desc
->
R_sqrt
=
(
struct
complex
**
)
calloc
(
nb_taps
,
sizeof
(
struct
complex
*
));
for
(
i
=
0
;
i
<
nb_taps
;
i
++
)
{
for
(
i
=
0
;
i
<
nb_taps
;
i
++
)
{
//chan_desc->R_sqrt[i] = (struct complex*) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex));
//chan_desc->R_sqrt[i] = (struct complex*) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex));
//chan_desc->R_sqrt = (struct complex*)&R_sqrt[i][0];
//chan_desc->R_sqrt = (struct complex*)&R_sqrt[i][0];
...
@@ -175,7 +175,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
...
@@ -175,7 +175,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
double
mbsfn_delays
[]
=
{
0
,.
03
,.
15
,.
31
,.
37
,
1
.
09
,
12
.
490
,
12
.
52
,
12
.
64
,
12
.
80
,
12
.
86
,
13
.
58
,
27
.
49
,
27
.
52
,
27
.
64
,
27
.
80
,
27
.
86
,
28
.
58
};
double
mbsfn_delays
[]
=
{
0
,.
03
,.
15
,.
31
,.
37
,
1
.
09
,
12
.
490
,
12
.
52
,
12
.
64
,
12
.
80
,
12
.
86
,
13
.
58
,
27
.
49
,
27
.
52
,
27
.
64
,
27
.
80
,
27
.
86
,
28
.
58
};
double
mbsfn_amps_dB
[]
=
{
0
,
-
1
.
5
,
-
1
.
4
,
-
3
.
6
,
-
0
.
6
,
-
7
.
0
,
-
10
,
-
11
.
5
,
-
11
.
4
,
-
13
.
6
,
-
10
.
6
,
-
17
.
0
,
-
20
,
-
21
.
5
,
-
21
.
4
,
-
23
.
6
,
-
20
.
6
,
-
27
};
double
mbsfn_amps_dB
[]
=
{
0
,
-
1
.
5
,
-
1
.
4
,
-
3
.
6
,
-
0
.
6
,
-
7
.
0
,
-
10
,
-
11
.
5
,
-
11
.
4
,
-
13
.
6
,
-
10
.
6
,
-
17
.
0
,
-
20
,
-
21
.
5
,
-
21
.
4
,
-
23
.
6
,
-
20
.
6
,
-
27
};
double
scm_c_delays
[]
=
{
0
,
0
.
0125
,
0
.
0250
,
0
.
3625
,
0
.
3750
,
0
.
3875
,
0
.
2500
,
0
.
2625
,
0
.
2750
,
1
.
0375
,
1
.
0500
,
1
.
0625
,
2
.
7250
,
2
.
7375
,
2
.
7500
,
4
.
6000
,
4
.
6125
,
4
.
6250
};
double
scm_c_delays
[]
=
{
0
,
0
.
0125
,
0
.
0250
,
0
.
3625
,
0
.
3750
,
0
.
3875
,
0
.
2500
,
0
.
2625
,
0
.
2750
,
1
.
0375
,
1
.
0500
,
1
.
0625
,
2
.
7250
,
2
.
7375
,
2
.
7500
,
4
.
6000
,
4
.
6125
,
4
.
6250
};
double
scm_c_amps_dB
[]
=
{
0
.
00
,
-
2
.
22
,
-
3
.
98
,
-
1
.
86
,
-
4
.
08
,
-
5
.
84
,
-
1
.
08
,
-
3
.
30
,
-
5
.
06
,
-
9
.
08
,
-
11
.
30
,
-
13
.
06
,
-
15
.
14
,
-
17
.
36
,
-
19
.
12
,
-
20
.
64
,
-
22
.
85
,
-
24
.
62
};
double
scm_c_amps_dB
[]
=
{
0
.
00
,
-
2
.
22
,
-
3
.
98
,
-
1
.
86
,
-
4
.
08
,
-
5
.
84
,
-
1
.
08
,
-
3
.
30
,
-
5
.
06
,
-
9
.
08
,
-
11
.
30
,
-
13
.
06
,
-
15
.
14
,
-
17
.
36
,
-
19
.
12
,
-
20
.
64
,
-
22
.
85
,
-
24
.
62
};
double
epa_delays
[]
=
{
0
,.
03
,.
07
,.
09
,.
11
,.
19
,.
41
};
double
epa_delays
[]
=
{
0
,.
03
,.
07
,.
09
,.
11
,.
19
,.
41
};
...
@@ -282,10 +282,10 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -282,10 +282,10 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
SCM_t
channel_model
,
SCM_t
channel_model
,
double
sampling_rate
,
double
sampling_rate
,
double
channel_bandwidth
,
double
channel_bandwidth
,
double
forgetting_factor
,
double
forgetting_factor
,
int32_t
channel_offset
,
int32_t
channel_offset
,
double
path_loss_dB
)
{
double
path_loss_dB
)
{
channel_desc_t
*
chan_desc
=
(
channel_desc_t
*
)
malloc
(
sizeof
(
channel_desc_t
));
channel_desc_t
*
chan_desc
=
(
channel_desc_t
*
)
calloc
(
1
,
sizeof
(
channel_desc_t
));
for
(
int
i
=
0
;
i
<
max_chan
;
i
++
)
{
for
(
int
i
=
0
;
i
<
max_chan
;
i
++
)
{
if
(
defined_channels
[
i
]
==
NULL
)
{
if
(
defined_channels
[
i
]
==
NULL
)
{
defined_channels
[
i
]
=
chan_desc
;
defined_channels
[
i
]
=
chan_desc
;
...
@@ -330,7 +330,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -330,7 +330,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
sum_amps
=
0
;
sum_amps
=
0
;
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_AMPS
;
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
scm_c_amps_dB
[
i
]);
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
scm_c_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
sum_amps
+=
chan_desc
->
amps
[
i
];
...
@@ -368,9 +368,10 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -368,9 +368,10 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
for
(
i
=
0
;
i
<
6
;
i
++
)
for
(
i
=
0
;
i
<
6
;
i
++
)
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R12_sqrt
[
i
][
0
];
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R12_sqrt
[
i
][
0
];
}
else
{
}
else
{
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_RSQRT_6
;
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
for
(
j
=
0
;
j
<
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
;
j
+=
(
nb_tx
*
nb_rx
+
1
))
{
for
(
j
=
0
;
j
<
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
;
j
+=
(
nb_tx
*
nb_rx
+
1
))
{
chan_desc
->
R_sqrt
[
i
][
j
].
x
=
1
.
0
;
chan_desc
->
R_sqrt
[
i
][
j
].
x
=
1
.
0
;
chan_desc
->
R_sqrt
[
i
][
j
].
y
=
0
.
0
;
chan_desc
->
R_sqrt
[
i
][
j
].
y
=
0
.
0
;
...
@@ -389,7 +390,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -389,7 +390,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
sum_amps
=
0
;
sum_amps
=
0
;
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_AMPS
;
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
scm_c_amps_dB
[
i
]);
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
scm_c_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
sum_amps
+=
chan_desc
->
amps
[
i
];
...
@@ -427,6 +428,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -427,6 +428,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
for
(
i
=
0
;
i
<
6
;
i
++
)
for
(
i
=
0
;
i
<
6
;
i
++
)
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R12_sqrt
[
i
][
0
];
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R12_sqrt
[
i
][
0
];
}
else
{
}
else
{
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_RSQRT_6
;
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
...
@@ -447,7 +449,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -447,7 +449,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
sum_amps
=
0
;
sum_amps
=
0
;
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_AMPS
;
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
epa_amps_dB
[
i
]);
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
epa_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
sum_amps
+=
chan_desc
->
amps
[
i
];
...
@@ -466,7 +468,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -466,7 +468,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
for
(
i
=
0
;
i
<
nb_tx
*
nb_rx
;
i
++
)
for
(
i
=
0
;
i
<
nb_tx
*
nb_rx
;
i
++
)
chan_desc
->
ch
[
i
]
=
(
struct
complex
*
)
malloc
(
chan_desc
->
channel_length
*
sizeof
(
struct
complex
));
chan_desc
->
ch
[
i
]
=
(
struct
complex
*
)
malloc
(
chan_desc
->
channel_length
*
sizeof
(
struct
complex
));
for
(
i
=
0
;
i
<
nb_tx
*
nb_rx
;
i
++
)
for
(
i
=
0
;
i
<
nb_tx
*
nb_rx
;
i
++
)
chan_desc
->
chF
[
i
]
=
(
struct
complex
*
)
malloc
(
1200
*
sizeof
(
struct
complex
));
chan_desc
->
chF
[
i
]
=
(
struct
complex
*
)
malloc
(
1200
*
sizeof
(
struct
complex
));
...
@@ -480,7 +482,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -480,7 +482,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R22_sqrt
[
i
][
0
];
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R22_sqrt
[
i
][
0
];
}
else
{
}
else
{
chan_desc
->
R_sqrt
=
(
struct
complex
**
)
malloc
(
6
*
sizeof
(
struct
complex
**
));
chan_desc
->
R_sqrt
=
(
struct
complex
**
)
malloc
(
6
*
sizeof
(
struct
complex
**
));
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_RSQRT_6
;
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
...
@@ -501,7 +503,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -501,7 +503,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
sum_amps
=
0
;
sum_amps
=
0
;
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_AMPS
;
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
epa_amps_dB
[
i
]);
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
epa_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
sum_amps
+=
chan_desc
->
amps
[
i
];
...
@@ -547,7 +549,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -547,7 +549,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n");
LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n");
}
}
}*/
}*/
break
;
break
;
case
EPA_high
:
case
EPA_high
:
chan_desc
->
nb_taps
=
7
;
chan_desc
->
nb_taps
=
7
;
...
@@ -555,7 +557,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -555,7 +557,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
sum_amps
=
0
;
sum_amps
=
0
;
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_AMPS
;
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
epa_amps_dB
[
i
]);
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
epa_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
sum_amps
+=
chan_desc
->
amps
[
i
];
...
@@ -609,7 +611,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -609,7 +611,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
sum_amps
=
0
;
sum_amps
=
0
;
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_AMPS
;
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
epa_amps_dB
[
i
]);
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
epa_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
sum_amps
+=
chan_desc
->
amps
[
i
];
...
@@ -663,7 +665,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -663,7 +665,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
sum_amps
=
0
;
sum_amps
=
0
;
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_AMPS
;
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
eva_amps_dB
[
i
]);
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
eva_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
sum_amps
+=
chan_desc
->
amps
[
i
];
...
@@ -696,8 +698,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -696,8 +698,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R22_sqrt
[
i
][
0
];
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R22_sqrt
[
i
][
0
];
}
else
{
}
else
{
chan_desc
->
R_sqrt
=
(
struct
complex
**
)
malloc
(
6
*
sizeof
(
struct
complex
**
));
chan_desc
->
R_sqrt
=
(
struct
complex
**
)
malloc
(
6
*
sizeof
(
struct
complex
**
));
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_RSQRT_6
;
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
for
(
j
=
0
;
j
<
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
;
j
+=
(
nb_tx
*
nb_rx
+
1
))
{
for
(
j
=
0
;
j
<
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
;
j
+=
(
nb_tx
*
nb_rx
+
1
))
{
...
@@ -717,7 +719,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -717,7 +719,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
sum_amps
=
0
;
sum_amps
=
0
;
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_AMPS
;
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
etu_amps_dB
[
i
]);
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
etu_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
sum_amps
+=
chan_desc
->
amps
[
i
];
...
@@ -750,7 +752,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -750,7 +752,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R22_sqrt
[
i
][
0
];
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R22_sqrt
[
i
][
0
];
}
else
{
}
else
{
chan_desc
->
R_sqrt
=
(
struct
complex
**
)
malloc
(
6
*
sizeof
(
struct
complex
**
));
chan_desc
->
R_sqrt
=
(
struct
complex
**
)
malloc
(
6
*
sizeof
(
struct
complex
**
));
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_RSQRT_6
;
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
...
@@ -771,7 +773,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -771,7 +773,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
sum_amps
=
0
;
sum_amps
=
0
;
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_AMPS
;
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
mbsfn_amps_dB
[
i
]);
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
mbsfn_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
sum_amps
+=
chan_desc
->
amps
[
i
];
...
@@ -798,7 +800,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -798,7 +800,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
a
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
chan_desc
->
a
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
chan_desc
->
R_sqrt
=
(
struct
complex
**
)
malloc
(
6
*
sizeof
(
struct
complex
*
));
chan_desc
->
R_sqrt
=
(
struct
complex
**
)
malloc
(
6
*
sizeof
(
struct
complex
*
));
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_RSQRT_6
;
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
...
@@ -1309,11 +1311,37 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -1309,11 +1311,37 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
nb_paths
=
10
;
chan_desc
->
nb_paths
=
10
;
return
(
chan_desc
);
return
(
chan_desc
);
}
}
void
free_channel_desc_scm
(
channel_desc_t
*
ch
)
{
void
free_channel_desc_scm
(
channel_desc_t
*
ch
)
{
// Must be made cleanly, a lot of leaks...
// Must be made cleanly, a lot of leaks...
defined_channels
[
ch
->
chan_idx
]
=
NULL
;
defined_channels
[
ch
->
chan_idx
]
=
NULL
;
free
(
ch
);
if
(
ch
->
free_flags
&
CHANMODEL_FREE_AMPS
)
free
(
ch
->
amps
);
for
(
int
i
=
0
;
i
<
ch
->
nb_tx
*
ch
->
nb_rx
;
i
++
)
{
free
(
ch
->
ch
[
i
]);
free
(
ch
->
chF
[
i
]);
}
for
(
int
i
=
0
;
i
<
ch
->
nb_taps
;
i
++
)
{
free
(
ch
->
a
[
i
]);
}
if
(
ch
->
free_flags
&
CHANMODEL_FREE_DELAY
)
free
(
ch
->
delays
);
if
(
ch
->
free_flags
&
CHANMODEL_FREE_RSQRT_6
)
for
(
int
i
=
0
;
i
<
6
;
i
++
)
free
(
ch
->
R_sqrt
[
i
]);
if
(
ch
->
free_flags
&
CHANMODEL_FREE_RSQRT_NTAPS
)
for
(
int
i
=
0
;
i
<
ch
->
nb_taps
;
i
++
)
free
(
ch
->
R_sqrt
[
i
]);
free
(
ch
->
R_sqrt
);
free
(
ch
->
ch
);
free
(
ch
->
chF
);
free
(
ch
->
a
);
free
(
ch
);
}
void
set_channeldesc_owner
(
channel_desc_t
*
cdesc
,
uint32_t
module_id
)
{
cdesc
->
module_id
=
module_id
;
}
}
int
random_channel
(
channel_desc_t
*
desc
,
uint8_t
abstraction_flag
)
{
int
random_channel
(
channel_desc_t
*
desc
,
uint8_t
abstraction_flag
)
{
...
@@ -1454,7 +1482,7 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
...
@@ -1454,7 +1482,7 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
return
(
0
);
return
(
0
);
}
}
double
N_RB2sampling_rate
(
uint16_t
N_RB
)
{
double
N_RB2sampling_rate
(
uint16_t
N_RB
)
{
double
sampling_rate
;
double
sampling_rate
;
...
@@ -1522,6 +1550,10 @@ static int channelmod_print_help(char *buff, int debug, telnet_printfunc_t prnt
...
@@ -1522,6 +1550,10 @@ static int channelmod_print_help(char *buff, int debug, telnet_printfunc_t prnt
static
void
display_channelmodel
(
channel_desc_t
*
cd
,
int
debug
,
telnet_printfunc_t
prnt
)
{
static
void
display_channelmodel
(
channel_desc_t
*
cd
,
int
debug
,
telnet_printfunc_t
prnt
)
{
char
*
module_id_str
[]
=
MODULEID_STR_INIT
;
if
(
cd
->
module_id
!=
0
)
{
prnt
(
"model owner: %s
\n
"
,
module_id_str
[
cd
->
module_id
]);
}
prnt
(
"nb_tx: %i nb_rx: %i taps: %i bandwidth: %lf sampling: %lf
\n
"
,
cd
->
nb_tx
,
cd
->
nb_rx
,
cd
->
nb_taps
,
cd
->
channel_bandwidth
,
cd
->
sampling_rate
);
prnt
(
"nb_tx: %i nb_rx: %i taps: %i bandwidth: %lf sampling: %lf
\n
"
,
cd
->
nb_tx
,
cd
->
nb_rx
,
cd
->
nb_taps
,
cd
->
channel_bandwidth
,
cd
->
sampling_rate
);
prnt
(
"channel length: %i Max path delay: %lf ricean fact.: %lf angle of arrival: %lf (randomized:%s)
\n
"
,
prnt
(
"channel length: %i Max path delay: %lf ricean fact.: %lf angle of arrival: %lf (randomized:%s)
\n
"
,
cd
->
channel_length
,
cd
->
Td
,
cd
->
ricean_factor
,
cd
->
aoa
,
(
cd
->
random_aoa
?
"Yes"
:
"No"
));
cd
->
channel_length
,
cd
->
Td
,
cd
->
ricean_factor
,
cd
->
aoa
,
(
cd
->
random_aoa
?
"Yes"
:
"No"
));
...
@@ -1617,10 +1649,10 @@ static int channelmod_modify_cmd(char *buff, int debug, telnet_printfunc_t prnt)
...
@@ -1617,10 +1649,10 @@ static int channelmod_modify_cmd(char *buff, int debug, telnet_printfunc_t prnt)
return
CMDSTATUS_FOUND
;
return
CMDSTATUS_FOUND
;
}
}
int
modelid_fromname
(
char
*
modelname
)
{
int
modelid_fromname
(
char
*
modelname
)
{
int
modelid
=
map_str_to_int
(
channelmod_names
,
modelname
);
int
modelid
=
map_str_to_int
(
channelmod_names
,
modelname
);
AssertFatal
(
modelid
>
0
,
if
(
modelid
<
0
)
"random_channel.c: Error channel model %s unknown
\n
"
,
modelname
);
LOG_E
(
OCM
,
"random_channel.c: Error channel model %s unknown
\n
"
,
modelname
);
return
modelid
;
return
modelid
;
}
}
...
...
openair1/SIMULATION/TOOLS/sim.h
View file @
d4bd2cdc
...
@@ -40,6 +40,16 @@ The present clause specifies several numerical functions for testing of digital
...
@@ -40,6 +40,16 @@ The present clause specifies several numerical functions for testing of digital
#define NB_SAMPLES_CHANNEL_OFFSET 4
#define NB_SAMPLES_CHANNEL_OFFSET 4
typedef
enum
{
UNSPECIFIED_MODID
=
0
,
RFSIMU_MODULEID
=
1
}
channelmod_moduleid_t
;
#define MODULEID_STR_INIT {"","rfsimulator"}
#define CHANMODEL_FREE_DELAY 1<<0
#define CHANMODEL_FREE_RSQRT_6 1<<1
#define CHANMODEL_FREE_RSQRT_NTAPS 1<<2
#define CHANMODEL_FREE_AMPS 1<<3
typedef
struct
{
typedef
struct
{
///Number of tx antennas
///Number of tx antennas
uint8_t
nb_tx
;
uint8_t
nb_tx
;
...
@@ -96,6 +106,10 @@ typedef struct {
...
@@ -96,6 +106,10 @@ typedef struct {
unsigned
int
chan_idx
;
unsigned
int
chan_idx
;
/// id of the channel modeling algorithm
/// id of the channel modeling algorithm
int
modelid
;
int
modelid
;
/// identifies channel descriptor owner (the module which created this descriptor)
channelmod_moduleid_t
module_id
;
/// flags to properly trigger memory free
unsigned
int
free_flags
;
}
channel_desc_t
;
}
channel_desc_t
;
typedef
struct
{
typedef
struct
{
...
@@ -278,9 +292,18 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
...
@@ -278,9 +292,18 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
double
forgetting_factor
,
double
forgetting_factor
,
int32_t
channel_offset
,
int32_t
channel_offset
,
double
path_loss_dB
);
double
path_loss_dB
);
/**
\brief free memory allocated for a model descriptor
\param ch points to the model, which cannot be used after calling this fuction
*/
void
free_channel_desc_scm
(
channel_desc_t
*
ch
);
/**
\brief This set the ownerid of a model descriptor, can be later used to check what module created a channel model
\param cdesc points to the model descriptor
\param module_id identifies the channel model. should be define as a macro in simu.h
*/
void
set_channeldesc_owner
(
channel_desc_t
*
cdesc
,
channelmod_moduleid_t
module_id
);
/** \fn void random_channel(channel_desc_t *desc)
/** \fn void random_channel(channel_desc_t *desc)
\brief This routine generates a random channel response (time domain) according to a tapped delay line model.
\brief This routine generates a random channel response (time domain) according to a tapped delay line model.
\param desc Pointer to the channel descriptor
\param desc Pointer to the channel descriptor
...
...
targets/ARCH/rfsimulator/simulator.c
View file @
d4bd2cdc
...
@@ -89,9 +89,9 @@ extern RAN_CONTEXT_t RC;
...
@@ -89,9 +89,9 @@ extern RAN_CONTEXT_t RC;
static
int
rfsimu_setchanmod_cmd
(
char
*
buff
,
int
debug
,
telnet_printfunc_t
prnt
);
static
int
rfsimu_setchanmod_cmd
(
char
*
buff
,
int
debug
,
telnet_printfunc_t
prnt
,
void
*
arg
);
static
telnetshell_cmddef_t
rfsimu_cmdarray
[]
=
{
static
telnetshell_cmddef_t
rfsimu_cmdarray
[]
=
{
{
"setmodel"
,
"<model name>"
,
rfsimu_setchanmod_cmd
,
TELNETSRV_CMDFLAG_PUSHINTPOOLQ
},
{
"setmodel"
,
"<model name>"
,
(
cmdfunc_t
)
rfsimu_setchanmod_cmd
,
TELNETSRV_CMDFLAG_PUSHINTPOOLQ
},
{
""
,
""
,
NULL
},
{
""
,
""
,
NULL
},
};
};
...
@@ -185,6 +185,7 @@ void allocCirBuf(rfsimulator_state_t *bridge, int sock) {
...
@@ -185,6 +185,7 @@ void allocCirBuf(rfsimulator_state_t *bridge, int sock) {
bridge
->
chan_forgetfact
,
// forgetting_factor
bridge
->
chan_forgetfact
,
// forgetting_factor
bridge
->
chan_offset
,
// maybe used for TA
bridge
->
chan_offset
,
// maybe used for TA
bridge
->
chan_pathloss
);
// path_loss in dB
bridge
->
chan_pathloss
);
// path_loss in dB
set_channeldesc_owner
(
ptr
->
channel_model
,
RFSIMU_MODULEID
);
random_channel
(
ptr
->
channel_model
,
false
);
random_channel
(
ptr
->
channel_model
,
false
);
}
}
}
}
...
@@ -311,25 +312,38 @@ void rfsimulator_readconfig(rfsimulator_state_t *rfsimulator) {
...
@@ -311,25 +312,38 @@ void rfsimulator_readconfig(rfsimulator_state_t *rfsimulator) {
rfsimulator
->
typeStamp
=
UE_MAGICDL_FDD
;
rfsimulator
->
typeStamp
=
UE_MAGICDL_FDD
;
}
}
static
int
rfsimu_setchanmod_cmd
(
char
*
buff
,
int
debug
,
telnet_printfunc_t
prnt
)
{
static
int
rfsimu_setchanmod_cmd
(
char
*
buff
,
int
debug
,
telnet_printfunc_t
prnt
,
void
*
arg
)
{
char
*
modelname
=
NULL
;
char
*
modelname
=
NULL
;
int
s
=
sscanf
(
buff
,
"%ms
\n
"
,
&
modelname
);
int
s
=
sscanf
(
buff
,
"%ms
\n
"
,
&
modelname
);
int
channelmod
=
modelid_fromname
(
modelname
);
if
(
s
==
1
)
{
for
(
int
i
=
0
;
i
<
FD_SETSIZE
;
i
++
)
{
int
channelmod
=
modelid_fromname
(
modelname
);
/* if(rfsimulator->buf[i].conn_sock > 0) {
if
(
channelmod
<
0
)
channel_desc_t *cm = rfsimulator->buf[i].channel_model;
prnt
(
"ERROR: model %s unknown
\n
"
,
modelname
);
else
{
rfsimulator->buf[i].channel_model=new_channel_desc_scm(cm->nb_tx,cm->nb_rx,
rfsimulator_state_t
*
t
=
(
rfsimulator_state_t
*
)
arg
;
channelmod,
for
(
int
i
=
0
;
i
<
FD_SETSIZE
;
i
++
)
{
cm->sampling_rate,
buffer_t
*
b
=&
t
->
buf
[
i
];
cm->channel_bandwidth,
if
(
b
->
conn_sock
>=
0
)
{
cm->forgetting_factor, // forgetting_factor
channel_desc_t
*
newmodel
=
new_channel_desc_scm
(
t
->
tx_num_channels
,
t
->
rx_num_channels
,
cm->channel_offset, // maybe used for TA
channelmod
,
cm-> path_loss_dB); // path_loss in dB
t
->
sample_rate
,
free_channel_desc_scm(cm);
t
->
tx_bw
,
random_channel(ptr->channel_model,false);
t
->
chan_forgetfact
,
// forgetting_factor
} */
t
->
chan_offset
,
// maybe used for TA
t
->
chan_pathloss
);
// path_loss in dB
set_channeldesc_owner
(
newmodel
,
RFSIMU_MODULEID
);
random_channel
(
newmodel
,
false
);
channel_desc_t
*
oldmodel
=
b
->
channel_model
;
b
->
channel_model
=
newmodel
;
free_channel_desc_scm
(
oldmodel
);
prnt
(
"New model %s applied to channel connected to sock %d
\n
"
,
modelname
,
i
);
}
}
}
}
else
{
prnt
(
"ERROR: no model specified
\n
"
);
}
}
free
(
modelname
);
return
CMDSTATUS_FOUND
;
return
CMDSTATUS_FOUND
;
}
}
...
@@ -683,7 +697,8 @@ int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimestamp, vo
...
@@ -683,7 +697,8 @@ int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimestamp, vo
// it seems legacy behavior is: never in UL, each frame in DL
// it seems legacy behavior is: never in UL, each frame in DL
if
(
reGenerateChannel
)
if
(
reGenerateChannel
)
random_channel
(
ptr
->
channel_model
,
0
);
random_channel
(
ptr
->
channel_model
,
0
);
t
->
poll_telnetcmdq
(
t
->
telnetcmd_qid
);
if
(
t
->
poll_telnetcmdq
)
t
->
poll_telnetcmdq
(
t
->
telnetcmd_qid
,
t
);
for
(
int
a
=
0
;
a
<
nbAnt
;
a
++
)
{
for
(
int
a
=
0
;
a
<
nbAnt
;
a
++
)
{
if
(
ptr
->
channel_model
!=
NULL
)
// apply a channel model
if
(
ptr
->
channel_model
!=
NULL
)
// apply a channel model
rxAddInput
(
ptr
->
circularBuf
,
(
struct
complex16
*
)
samplesVoid
[
a
],
rxAddInput
(
ptr
->
circularBuf
,
(
struct
complex16
*
)
samplesVoid
[
a
],
...
...
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