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
lizhongxiao
OpenXG-RAN
Commits
364ea768
Commit
364ea768
authored
Mar 26, 2021
by
Laurent THOMAS
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix warings
parent
b3515527
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
488 additions
and
426 deletions
+488
-426
openair1/PHY/LTE_REFSIG/lte_gold.c
openair1/PHY/LTE_REFSIG/lte_gold.c
+3
-3
openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c
openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c
+2
-2
openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c
openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c
+1
-1
openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c
openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c
+1
-1
openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+1
-1
openair1/PHY/NR_REFSIG/dmrs_nr.c
openair1/PHY/NR_REFSIG/dmrs_nr.c
+1
-1
openair1/SIMULATION/TOOLS/random_channel.c
openair1/SIMULATION/TOOLS/random_channel.c
+479
-417
No files found.
openair1/PHY/LTE_REFSIG/lte_gold.c
View file @
364ea768
...
...
@@ -56,7 +56,7 @@ void lte_gold(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_table[20][2][14]
(((
1
+
(
Nid_cell
<<
1
))
*
(
1
+
(((
frame_parms
->
Ncp
==
0
)
?
4
:
3
)
*
l
)
+
(
7
*
(
1
+
ns
))))
<<
10
);
//cinit
//x2 = frame_parms->Ncp + (Nid_cell<<1) + (1+(Nid_cell<<1))*(1 + (3*l) + (7*(1+ns))); //cinit
//n = 0
x1
=
1
+
(
1
<<
31
);
x1
=
1
+
(
1
U
<<
31
);
x2
=
x2
^
((
x2
^
(
x2
>>
1
)
^
(
x2
>>
2
)
^
(
x2
>>
3
))
<<
31
);
// skip first 50 double words (1600 bits)
...
...
@@ -103,7 +103,7 @@ void lte_gold_ue_spec(uint32_t lte_gold_uespec_table[2][20][2][21],uint16_t Nid_
//x2 = frame_parms->Ncp + (Nid_cell<<1) + (1+(Nid_cell<<1))*(1 + (3*l) + (7*(1+ns))); //cinit
//n = 0
// printf("cinit (ns %d, l %d) => %d\n",ns,l,x2);
x1
=
1
+
(
1
<<
31
);
x1
=
1
+
(
1
U
<<
31
);
x2
=
x2
^
((
x2
^
(
x2
>>
1
)
^
(
x2
>>
2
)
^
(
x2
>>
3
))
<<
31
);
// skip first 50 double words (1600 bits)
...
...
@@ -143,7 +143,7 @@ void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][38],uint16_
//x2 = frame_parms->Ncp + (Nid_cell<<1) + (1+(Nid_cell<<1))*(1 + (3*l) + (7*(1+ns))); //cinit
//n = 0
//printf("cinit (ns %d, l %d) => %d\n",ns,l,x2);
x1
=
1
+
(
1
<<
31
);
x1
=
1
+
(
1
U
<<
31
);
x2
=
x2
^
((
x2
^
(
x2
>>
1
)
^
(
x2
>>
2
)
^
(
x2
>>
3
))
<<
31
);
//skip first 50 double words (1600 bits)
...
...
openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c
View file @
364ea768
...
...
@@ -59,7 +59,7 @@ void lte_gold_mbsfn(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_mbsfn_tabl
//n = 0
// printf("cinit (sfn %d, l %d) => %d\n",sfn,l,x2);
// Initializing the Sequence
x1
=
1
+
(
1
<<
31
);
x1
=
1
+
(
1
U
<<
31
);
x2
=
x2
^
((
x2
^
(
x2
>>
1
)
^
(
x2
>>
2
)
^
(
x2
>>
3
))
<<
31
);
// skip first 50 double words (1600 bits)
// printf("n=0 : x1 %x, x2 %x\n",x1,x2);
...
...
@@ -90,7 +90,7 @@ void lte_gold_mbsfn_khz_1dot25(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold
for
(
sfn
=
0
;
sfn
<
10
;
sfn
++
)
{
x2
=
(
Nid_mbsfn
)
+
(((
1
+
(
Nid_mbsfn
<<
1
))
*
(
1
+
(
7
*
(
1
+
sfn
))))
<<
9
);
//cinit
x1
=
1
+
(
1
<<
31
);
x1
=
1
+
(
1
U
<<
31
);
x2
=
x2
^
((
x2
^
(
x2
>>
1
)
^
(
x2
>>
2
)
^
(
x2
>>
3
))
<<
31
);
for
(
n
=
1
;
n
<
50
;
n
++
)
{
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c
View file @
364ea768
...
...
@@ -121,7 +121,7 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
for
(
n
=
0
;
n
<
(
1
+
(
G
>>
5
));
n
++
)
{
#ifdef DEBUG_SCRAMBLING
for
(
int
k
=
0
;
k
<
32
;
k
++
)
printf
(
"scrambling %d : %
d xor %d
= %d
\n
"
,
k
+
(
n
<<
5
),
e
[
k
],(
s
>>
k
)
&
1
,
e
[
k
]
^
((
s
>>
k
)
&
1
));
for
(
int
k
=
0
;
k
<
32
;
k
++
)
printf
(
"scrambling %d : %
x xor %x
= %d
\n
"
,
k
+
(
n
<<
5
),
e
[
k
],(
s
>>
k
)
&
1
,
e
[
k
]
^
((
s
>>
k
)
&
1
));
#endif
e
[
0
]
=
(
e
[
0
])
^
(
s
&
1
);
...
...
openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c
View file @
364ea768
...
...
@@ -41,7 +41,7 @@ extern inline uint32_t lte_gold_generic(uint32_t *x1, uint32_t *x2, uint8_t res
{
// Init value for x1: x1(0) = 1, x1(n) = 0, n=1,2,...,30
// x1(31) = [x1(3) + x1(0)]mod2 = 1
*
x1
=
1
+
(
1
<<
31
);
*
x1
=
1
+
(
1
U
<<
31
);
// Init value for x2: cinit = sum_{i=0}^30 x2*2^i
// x2(31) = [x2(3) + x2(2) + x2(1) + x2(0)]mod2
// = (*x2>>3) ^ (*x2>>2) + (*x2>>1) + *x2
...
...
openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
View file @
364ea768
...
...
@@ -374,7 +374,7 @@ static inline unsigned int lte_gold_unscram(unsigned int *x1, unsigned int *x2,
int
n
;
if
(
reset
)
{
*
x1
=
1
+
(
1
<<
31
);
*
x1
=
1
+
(
1
U
<<
31
);
*
x2
=*
x2
^
((
*
x2
^
(
*
x2
>>
1
)
^
(
*
x2
>>
2
)
^
(
*
x2
>>
3
))
<<
31
);
// skip first 50 double words (1600 bits)
...
...
openair1/PHY/NR_REFSIG/dmrs_nr.c
View file @
364ea768
...
...
@@ -150,7 +150,7 @@ void pseudo_random_sequence_optimised(unsigned int size, uint32_t *c, uint32_t c
unsigned
int
n
,
x1
,
x2
;
/* init of m-sequences */
x1
=
1
+
(
1
<<
31
);
x1
=
1
+
(
1
U
<<
31
);
x2
=
cinit
;
x2
=
x2
^
((
x2
^
(
x2
>>
1
)
^
(
x2
>>
2
)
^
(
x2
>>
3
))
<<
31
);
...
...
openair1/SIMULATION/TOOLS/random_channel.c
View file @
364ea768
...
...
@@ -62,7 +62,7 @@ static double snr_dB=25;
static
double
sinr_dB
=
0
;
static
unsigned
int
max_chan
;
static
channel_desc_t
**
defined_channels
;
static
char
modellist_name
[
MAX_OPTNAME_SIZE
]
=
{
0
};
static
char
modellist_name
[
MAX_OPTNAME_SIZE
]
=
{
0
};
void
fill_channel_desc
(
channel_desc_t
*
chan_desc
,
...
...
@@ -139,8 +139,10 @@ void fill_channel_desc(channel_desc_t *chan_desc,
if
(
R_sqrt
==
NULL
)
{
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
++
)
{
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
))
{
chan_desc
->
R_sqrt
[
i
][
j
].
x
=
1
.
0
;
chan_desc
->
R_sqrt
[
i
][
j
].
y
=
0
.
0
;
...
...
@@ -203,7 +205,8 @@ double tdl_a_delays[] = {0.0000,
4
.
7966
,
5
.
0066
,
5
.
3043
,
9
.
6586
};
9
.
6586
};
double
tdl_a_amps_dB
[]
=
{
-
13
.
4
,
0
,
-
2
.
2
,
...
...
@@ -226,7 +229,8 @@ double tdl_a_amps_dB[] = {-13.4,
-
18
.
9
,
-
16
.
6
,
-
19
.
9
,
-
29
.
7
};
-
29
.
7
};
double
tdl_b_delays
[]
=
{
0
.
0000
,
0
.
1072
,
...
...
@@ -250,7 +254,8 @@ double tdl_b_delays[] = {0.0000,
3
.
6187
,
4
.
1067
,
4
.
2790
,
4
.
7834
};
4
.
7834
};
double
tdl_b_amps_dB
[]
=
{
0
,
-
2
.
2
,
...
...
@@ -274,7 +279,8 @@ double tdl_b_amps_dB[] = {0,
-
11
.
4
,
-
14
.
9
,
-
9
.
2
,
-
11
.
3
};
-
11
.
3
};
double
tdl_c_delays
[]
=
{
0
,
0
.
2099
,
...
...
@@ -299,7 +305,8 @@ double tdl_c_delays[] = {0,
6
.
3065
,
6
.
6374
,
7
.
0427
,
8
.
6523
};
8
.
6523
};
double
tdl_c_amps_dB
[]
=
{
-
4
.
4
,
-
1
.
2
,
...
...
@@ -324,7 +331,8 @@ double tdl_c_amps_dB[] = {-4.4,
-
16
,
-
15
.
7
,
-
21
.
6
,
-
22
.
8
};
-
22
.
8
};
double
tdl_d_delays
[]
=
{
//0,
0
,
...
...
@@ -339,10 +347,11 @@ double tdl_d_delays[] = {//0,
7
.
937
,
9
.
424
,
9
.
708
,
12
.
525
};
12
.
525
};
double
tdl_d_amps_dB
[]
=
{
//-0.2,
//-13.5,
//-13.5,
-
.
00147
,
-
18
.
8
,
-
21
,
...
...
@@ -355,7 +364,8 @@ double tdl_d_amps_dB[] = {//-0.2,
-
23
.
6
,
-
24
.
8
,
-
30
.
0
,
-
27
.
7
};
-
27
.
7
};
#define TDL_D_RICEAN_FACTOR .046774
...
...
@@ -372,7 +382,8 @@ double tdl_e_delays[] = {0,
3
.
7136
,
5
.
4524
,
12
.
0034
,
20
.
6519
};
20
.
6519
};
double
tdl_e_amps_dB
[]
=
{
//-0.03,
//-22.03,
...
...
@@ -389,7 +400,8 @@ double tdl_e_amps_dB[] = {//-0.03,
-
25
.
6
,
-
20
.
2
,
-
29
.
8
,
-
29
.
2
};
-
29
.
2
};
#define TDL_E_RICEAN_FACTOR 0.0063096
...
...
@@ -492,6 +504,74 @@ struct complex *R_sqrt_22_EPA_medium[1] = {R_sqrt_22_EPA_medium_tap};
//Rayleigh1_orth_eff_ch_TM4
void
tdlModel
(
int
tdl_paths
,
double
*
tdl_delays
,
double
*
tdl_amps_dB
,
double
DS_TDL
,
channel_desc_t
*
chan_desc
)
{
int
nb_rx
=
chan_desc
->
nb_rx
;
int
nb_tx
=
chan_desc
->
nb_tx
;
int
tdl_pathsby3
=
tdl_paths
/
3
;
if
((
tdl_paths
%
3
)
>
0
)
tdl_pathsby3
++
;
chan_desc
->
nb_taps
=
tdl_paths
;
chan_desc
->
Td
=
tdl_delays
[
tdl_paths
-
1
]
*
DS_TDL
;
printf
(
"last path (%d) at %f * %e = %e
\n
"
,
tdl_paths
-
1
,
tdl_delays
[
tdl_paths
-
1
],
DS_TDL
,
chan_desc
->
Td
);
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
printf
(
"TDL : %f Ms/s, nb_taps %d, Td %e, channel_length %d
\n
"
,
chan_desc
->
sampling_rate
,
tdl_paths
,
chan_desc
->
Td
,
chan_desc
->
channel_length
);
double
sum_amps
=
0
;
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
for
(
int
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
tdl_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
}
for
(
int
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
chan_desc
->
amps
[
i
]
/=
sum_amps
;
tdl_delays
[
i
]
*=
DS_TDL
;
}
chan_desc
->
delays
=
tdl_delays
;
chan_desc
->
aoa
=
0
;
chan_desc
->
random_aoa
=
0
;
chan_desc
->
ch
=
(
struct
complex
**
)
malloc
(
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
*
));
chan_desc
->
chF
=
(
struct
complex
**
)
malloc
(
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
*
));
chan_desc
->
a
=
(
struct
complex
**
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
struct
complex
*
));
for
(
int
i
=
0
;
i
<
nb_tx
*
nb_rx
;
i
++
)
chan_desc
->
ch
[
i
]
=
(
struct
complex
*
)
malloc
(
chan_desc
->
channel_length
*
sizeof
(
struct
complex
));
for
(
int
i
=
0
;
i
<
nb_tx
*
nb_rx
;
i
++
)
chan_desc
->
chF
[
i
]
=
(
struct
complex
*
)
malloc
(
1200
*
sizeof
(
struct
complex
));
for
(
int
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
chan_desc
->
a
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
chan_desc
->
R_sqrt
=
(
struct
complex
**
)
malloc
(
6
*
sizeof
(
struct
complex
**
));
if
(
nb_tx
==
2
&&
nb_rx
==
2
)
{
for
(
int
i
=
0
;
i
<
(
tdl_pathsby3
);
i
++
)
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R22_sqrt
[
i
][
0
];
}
else
if
(
nb_tx
==
2
&&
nb_rx
==
1
)
{
for
(
int
i
=
0
;
i
<
(
tdl_pathsby3
);
i
++
)
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R21_sqrt
[
i
][
0
];
}
else
if
(
nb_tx
==
1
&&
nb_rx
==
2
)
{
for
(
int
i
=
0
;
i
<
(
tdl_pathsby3
);
i
++
)
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R12_sqrt
[
i
][
0
];
}
else
{
for
(
int
i
=
0
;
i
<
(
tdl_pathsby3
);
i
++
)
{
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
for
(
int
j
=
0
;
j
<
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
;
j
+=
(
nb_tx
*
nb_rx
+
1
))
{
chan_desc
->
R_sqrt
[
i
][
j
].
x
=
1
.
0
;
chan_desc
->
R_sqrt
[
i
][
j
].
y
=
0
.
0
;
}
LOG_W
(
OCM
,
"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity
\n
"
,
nb_tx
,
nb_rx
);
}
}
}
channel_desc_t
*
new_channel_desc_scm
(
uint8_t
nb_tx
,
uint8_t
nb_rx
,
...
...
@@ -504,21 +584,21 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
double
path_loss_dB
,
float
noise_power_dB
)
{
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
)
{
defined_channels
[
i
]
=
chan_desc
;
chan_desc
->
chan_idx
=
i
;
break
;
}
else
{
}
else
{
AssertFatal
(
i
<
(
max_chan
-
1
),
"No more channel descriptors available, increase channelmod.max_chan parameter above %u
\n
"
,
max_chan
);
}
}
uint16_t
i
,
j
;
double
sum_amps
;
double
aoa
,
ricean_factor
,
Td
,
maxDoppler
;
int
channel_length
,
nb_taps
;
chan_desc
->
modelid
=
channel_model
;
chan_desc
->
nb_tx
=
nb_tx
;
...
...
@@ -531,9 +611,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
first_run
=
1
;
chan_desc
->
ip
=
0
.
0
;
chan_desc
->
noise_power_dB
=
noise_power_dB
;
LOG_I
(
OCM
,
"Channel Model (inside of new_channel_desc_scm)=%d
\n\n
"
,
channel_model
);
int
tdl_paths
=
0
;
double
*
tdl_amps_dB
;
double
*
tdl_delays
;
...
...
@@ -557,6 +635,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
sum_amps
=
0
;
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
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
scm_c_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
...
...
@@ -595,6 +674,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R12_sqrt
[
i
][
0
];
}
else
{
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_RSQRT_6
;
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
));
...
...
@@ -617,6 +697,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
sum_amps
=
0
;
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
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
scm_c_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
...
...
@@ -655,6 +736,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R12_sqrt
[
i
][
0
];
}
else
{
chan_desc
->
free_flags
=
chan_desc
->
free_flags
|
CHANMODEL_FREE_RSQRT_6
;
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
));
...
...
@@ -668,8 +750,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
}
break
;
/* tapped delay line (TDL) channel model from TR 38.901 Section 7.7.2 */
/* tapped delay line (TDL) channel model from TR 38.901 Section 7.7.2 */
#define tdl_m(MoDel)\
DevAssert(sizeof(tdl_ ## MoDel ## _amps_dB) == sizeof(tdl_ ## MoDel ## _delays)); \
tdl_paths=sizeof(tdl_ ## MoDel ## _amps_dB)/sizeof(*tdl_ ## MoDel ## _amps_dB);\
...
...
@@ -677,86 +758,33 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
tdl_amps_dB=tdl_ ## MoDel ## _amps_dB
case
TDL_A
:
case
TDL_B
:
case
TDL_C
:
case
TDL_D
:
case
TDL_E
:
chan_desc
->
ricean_factor
=
1
;
if
(
channel_model
==
TDL_A
)
{
tdl_m
(
a
);
}
else
if
(
channel_model
==
TDL_B
)
{
tdl_m
(
b
);
}
else
if
(
channel_model
==
TDL_C
)
{
tdl_m
(
c
);
}
else
if
(
channel_model
==
TDL_D
)
{
tdl_m
(
d
);
chan_desc
->
ricean_factor
=
TDL_D_RICEAN_FACTOR
;
}
else
if
(
channel_model
==
TDL_E
)
{
tdl_m
(
e
);
chan_desc
->
ricean_factor
=
TDL_E_RICEAN_FACTOR
;
}
int
tdl_pathsby3
=
tdl_paths
/
3
;
if
((
tdl_paths
%
3
)
>
0
)
tdl_pathsby3
++
;
chan_desc
->
nb_taps
=
tdl_paths
;
chan_desc
->
Td
=
tdl_delays
[
tdl_paths
-
1
]
*
DS_TDL
;
printf
(
"last path (%d) at %f * %e = %e
\n
"
,
tdl_paths
-
1
,
tdl_delays
[
tdl_paths
-
1
],
DS_TDL
,
chan_desc
->
Td
);
chan_desc
->
channel_length
=
(
int
)
(
2
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
+
1
+
2
/
(
M_PI
*
M_PI
)
*
log
(
4
*
M_PI
*
chan_desc
->
sampling_rate
*
chan_desc
->
Td
));
printf
(
"TDL : %f Ms/s, nb_taps %d, Td %e, channel_length %d
\n
"
,
chan_desc
->
sampling_rate
,
tdl_paths
,
chan_desc
->
Td
,
chan_desc
->
channel_length
);
sum_amps
=
0
;
chan_desc
->
amps
=
(
double
*
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
double
));
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
tdl_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
}
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
{
chan_desc
->
amps
[
i
]
/=
sum_amps
;
tdl_delays
[
i
]
*=
DS_TDL
;
}
chan_desc
->
delays
=
tdl_delays
;
chan_desc
->
aoa
=
0
;
chan_desc
->
random_aoa
=
0
;
chan_desc
->
ch
=
(
struct
complex
**
)
malloc
(
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
*
));
chan_desc
->
chF
=
(
struct
complex
**
)
malloc
(
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
*
));
chan_desc
->
a
=
(
struct
complex
**
)
malloc
(
chan_desc
->
nb_taps
*
sizeof
(
struct
complex
*
));
for
(
i
=
0
;
i
<
nb_tx
*
nb_rx
;
i
++
)
chan_desc
->
ch
[
i
]
=
(
struct
complex
*
)
malloc
(
chan_desc
->
channel_length
*
sizeof
(
struct
complex
));
for
(
i
=
0
;
i
<
nb_tx
*
nb_rx
;
i
++
)
chan_desc
->
chF
[
i
]
=
(
struct
complex
*
)
malloc
(
1200
*
sizeof
(
struct
complex
));
for
(
i
=
0
;
i
<
chan_desc
->
nb_taps
;
i
++
)
chan_desc
->
a
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
chan_desc
->
R_sqrt
=
(
struct
complex
**
)
malloc
(
6
*
sizeof
(
struct
complex
**
));
tdlModel
(
tdl_paths
,
tdl_delays
,
tdl_amps_dB
,
DS_TDL
,
chan_desc
);
break
;
if
(
nb_tx
==
2
&&
nb_rx
==
2
)
{
for
(
i
=
0
;
i
<
(
tdl_pathsby3
);
i
++
)
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R22_sqrt
[
i
][
0
];
}
else
if
(
nb_tx
==
2
&&
nb_rx
==
1
)
{
for
(
i
=
0
;
i
<
(
tdl_pathsby3
);
i
++
)
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R21_sqrt
[
i
][
0
];
}
else
if
(
nb_tx
==
1
&&
nb_rx
==
2
)
{
for
(
i
=
0
;
i
<
(
tdl_pathsby3
);
i
++
)
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
&
R12_sqrt
[
i
][
0
];
}
else
{
for
(
i
=
0
;
i
<
(
tdl_pathsby3
);
i
++
)
{
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
case
TDL_B
:
chan_desc
->
ricean_factor
=
1
;
tdl_m
(
b
);
tdlModel
(
tdl_paths
,
tdl_delays
,
tdl_amps_dB
,
DS_TDL
,
chan_desc
);
break
;
for
(
j
=
0
;
j
<
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
;
j
+=
(
nb_tx
*
nb_rx
+
1
))
{
chan_desc
->
R_sqrt
[
i
][
j
].
x
=
1
.
0
;
chan_desc
->
R_sqrt
[
i
][
j
].
y
=
0
.
0
;
}
case
TDL_C
:
chan_desc
->
ricean_factor
=
1
;
tdl_m
(
c
);
tdlModel
(
tdl_paths
,
tdl_delays
,
tdl_amps_dB
,
DS_TDL
,
chan_desc
);
break
;
LOG_W
(
OCM
,
"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity
\n
"
,
nb_tx
,
nb_rx
);
}
}
case
TDL_D
:
chan_desc
->
ricean_factor
=
TDL_D_RICEAN_FACTOR
;
tdl_m
(
d
);
tdlModel
(
tdl_paths
,
tdl_delays
,
tdl_amps_dB
,
DS_TDL
,
chan_desc
);
break
;
case
TDL_E
:
chan_desc
->
ricean_factor
=
TDL_E_RICEAN_FACTOR
;
tdl_m
(
e
);
tdlModel
(
tdl_paths
,
tdl_delays
,
tdl_amps_dB
,
DS_TDL
,
chan_desc
);
break
;
case
EPA
:
...
...
@@ -766,6 +794,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
sum_amps
=
0
;
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
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
epa_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
...
...
@@ -799,6 +828,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
}
else
{
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
++
)
{
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
...
...
@@ -820,6 +850,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
sum_amps
=
0
;
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
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
epa_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
...
...
@@ -874,6 +905,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
sum_amps
=
0
;
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
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
epa_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
...
...
@@ -928,6 +960,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
sum_amps
=
0
;
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
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
epa_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
...
...
@@ -982,6 +1015,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
sum_amps
=
0
;
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
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
eva_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
...
...
@@ -1015,6 +1049,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
}
else
{
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
++
)
{
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
...
...
@@ -1036,6 +1071,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
sum_amps
=
0
;
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
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
etu_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
...
...
@@ -1069,6 +1105,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
}
else
{
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
++
)
{
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
...
...
@@ -1090,6 +1127,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
sum_amps
=
0
;
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
++
)
{
chan_desc
->
amps
[
i
]
=
pow
(
10
,.
1
*
mbsfn_amps_dB
[
i
]);
sum_amps
+=
chan_desc
->
amps
[
i
];
...
...
@@ -1117,6 +1155,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
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
++
)
{
chan_desc
->
R_sqrt
[
i
]
=
(
struct
complex
*
)
malloc
(
nb_tx
*
nb_rx
*
nb_tx
*
nb_rx
*
sizeof
(
struct
complex
));
...
...
@@ -1628,13 +1667,14 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
return
(
chan_desc
);
}
/* channel_desc_t *new_channel_desc_scm */
channel_desc_t
*
find_channel_desc_fromname
(
char
*
modelname
)
{
for
(
int
i
=
0
;
i
<
max_chan
;
i
++
)
{
channel_desc_t
*
find_channel_desc_fromname
(
char
*
modelname
)
{
for
(
int
i
=
0
;
i
<
max_chan
;
i
++
)
{
if
(
defined_channels
[
i
]
!=
NULL
)
{
if
(
strcmp
(
defined_channels
[
i
]
->
model_name
,
modelname
)
==
0
)
return
defined_channels
[
i
];
}
}
LOG_E
(
OCM
,
"Model %s not found
\n
"
,
modelname
);
return
NULL
;
}
/* channel_desc_t * new_channel_desc_fromconfig */
...
...
@@ -1644,8 +1684,10 @@ channel_desc_t * find_channel_desc_fromname( char *modelname ) {
void
free_channel_desc_scm
(
channel_desc_t
*
ch
)
{
// Must be made cleanly, a lot of leaks...
defined_channels
[
ch
->
chan_idx
]
=
NULL
;
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
]);
...
...
@@ -1654,14 +1696,18 @@ void free_channel_desc_scm(channel_desc_t *ch) {
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
++
)
for
(
int
i
=
0
;
i
<
ch
->
nb_taps
;
i
++
)
free
(
ch
->
R_sqrt
[
i
]);
free
(
ch
->
R_sqrt
);
free
(
ch
->
ch
);
free
(
ch
->
chF
);
...
...
@@ -1677,6 +1723,7 @@ void set_channeldesc_owner(channel_desc_t *cdesc, uint32_t module_id) {
void
set_channeldesc_name
(
channel_desc_t
*
cdesc
,
char
*
modelname
)
{
if
(
cdesc
->
model_name
!=
NULL
)
free
(
cdesc
->
model_name
);
cdesc
->
model_name
=
strdup
(
modelname
);
}
...
...
@@ -1869,6 +1916,7 @@ double N_RB2channel_bandwidth(uint16_t N_RB) {
LOG_E
(
OCM
,
"Unknown N_PRB
\n
"
);
return
(
-
1
);
}
return
(
channel_bandwidth
);
}
...
...
@@ -1894,6 +1942,7 @@ static void display_channelmodel(channel_desc_t *cd,int debug, telnet_printfunc_
cd
->
max_Doppler
,
cd
->
path_loss_dB
,
cd
->
noise_power_dB
,
cd
->
channel_offset
,
cd
->
forgetting_factor
);
prnt
(
"Initial phase: %lf nb_path: %i
\n
"
,
cd
->
ip
,
cd
->
nb_paths
);
for
(
int
i
=
0
;
i
<
cd
->
nb_taps
;
i
++
)
{
prnt
(
"taps: %i lin. ampli. : %lf delay: %lf
\n
"
,
i
,
cd
->
amps
[
i
],
cd
->
delays
[
i
]);
}
...
...
@@ -1920,8 +1969,10 @@ static int channelmod_show_cmd(char *buff, int debug, telnet_printfunc_t prnt) {
}
else
{
channelmod_print_help
(
buff
,
debug
,
prnt
);
}
free
(
subcmd
);
}
return
CMDSTATUS_FOUND
;
}
...
...
@@ -1931,10 +1982,12 @@ static int channelmod_modify_cmd(char *buff, int debug, telnet_printfunc_t prnt)
char
*
param
=
NULL
,
*
value
=
NULL
;
int
cd_id
=
-
1
;
int
s
=
sscanf
(
buff
,
"%i %ms %ms
\n
"
,
&
cd_id
,
&
param
,
&
value
);
if
(
cd_id
<
0
||
cd_id
>=
max_chan
)
{
prnt
(
"ERROR, %i: Channel model id outof range (0-%i)
\n
"
,
cd_id
,
max_chan
-
1
);
return
CMDSTATUS_FOUND
;
}
if
(
defined_channels
[
cd_id
]
==
NULL
)
{
prnt
(
"ERROR, %i: Channel model has not been set
\n
"
,
cd_id
);
return
CMDSTATUS_FOUND
;
...
...
@@ -1943,18 +1996,21 @@ static int channelmod_modify_cmd(char *buff, int debug, telnet_printfunc_t prnt)
if
(
s
==
3
)
{
if
(
strcmp
(
param
,
"riceanf"
)
==
0
)
{
double
dbl
=
atof
(
value
);
if
(
dbl
<
0
||
dbl
>
1
)
prnt
(
"ERROR: ricean factor range: 0 to 1, %lf is outof range
\n
"
,
dbl
);
else
defined_channels
[
cd_id
]
->
ricean_factor
=
dbl
;
}
else
if
(
strcmp
(
param
,
"aoa"
)
==
0
)
{
double
dbl
=
atof
(
value
);
if
(
dbl
<
0
||
dbl
>
6
.
28
)
prnt
(
"ERROR: angle of arrival range: 0 to 2*Pi, %lf is outof range
\n
"
,
dbl
);
else
defined_channels
[
cd_id
]
->
aoa
=
dbl
;
}
else
if
(
strcmp
(
param
,
"randaoa"
)
==
0
)
{
int
i
=
atoi
(
value
);
if
(
i
!=
0
&&
i
!=
1
)
prnt
(
"ERROR: randaoa is a boolean, must be 0 or 1
\n
"
);
else
...
...
@@ -1970,6 +2026,7 @@ static int channelmod_modify_cmd(char *buff, int debug, telnet_printfunc_t prnt)
defined_channels
[
cd_id
]
->
channel_offset
=
i
;
}
else
if
(
strcmp
(
param
,
"forgetf"
)
==
0
)
{
double
dbl
=
atof
(
value
);
if
(
dbl
<
0
||
dbl
>
1
)
prnt
(
"ERROR: forgetting factor range: 0 to 1 (disable variation), %lf is outof range
\n
"
,
dbl
);
else
...
...
@@ -1978,18 +2035,22 @@ static int channelmod_modify_cmd(char *buff, int debug, telnet_printfunc_t prnt)
prnt
(
"ERROR: %s, unknown channel parameter
\n
"
,
param
);
return
CMDSTATUS_FOUND
;
}
display_channelmodel
(
defined_channels
[
cd_id
],
debug
,
prnt
);
free
(
param
);
free
(
value
);
random_channel
(
defined_channels
[
cd_id
],
false
);
}
return
CMDSTATUS_FOUND
;
}
int
modelid_fromstrtype
(
char
*
modeltype
)
{
int
modelid
=
map_str_to_int
(
channelmod_names
,
modeltype
);
if
(
modelid
<
0
)
LOG_E
(
OCM
,
"random_channel.c: Error channel model %s unknown
\n
"
,
modeltype
);
return
modelid
;
}
...
...
@@ -2003,13 +2064,11 @@ double channelmod_get_sinr_dB(void) {
void
init_channelmod
(
void
)
{
paramdef_t
channelmod_params
[]
=
CHANNELMOD_PARAMS_DESC
;
int
numparams
=
sizeof
(
channelmod_params
)
/
sizeof
(
paramdef_t
);
int
ret
=
config_get
(
channelmod_params
,
numparams
,
CHANNELMOD_SECTION
);
AssertFatal
(
ret
>=
0
,
"configuration couldn't be performed"
);
defined_channels
=
calloc
(
max_chan
,
sizeof
(
channel_desc_t
*
));
defined_channels
=
calloc
(
max_chan
,
sizeof
(
channel_desc_t
*
));
AssertFatal
(
defined_channels
!=
NULL
,
"couldn't allocate %u channel descriptors
\n
"
,
max_chan
);
/* look for telnet server, if it is loaded, add the channel modeling commands to it */
add_telnetcmd_func_t
addcmd
=
(
add_telnetcmd_func_t
)
get_shlibmodule_fptr
(
"telnetsrv"
,
TELNET_ADDCMD_FNAME
);
...
...
@@ -2024,7 +2083,6 @@ int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double
paramlist_def_t
channel_list
;
memset
(
&
channel_list
,
0
,
sizeof
(
paramlist_def_t
));
memcpy
(
channel_list
.
listname
,
modellist_name
,
sizeof
(
channel_list
.
listname
)
-
1
);
int
numparams
=
sizeof
(
achannel_params
)
/
sizeof
(
paramdef_t
);
config_getlist
(
&
channel_list
,
achannel_params
,
numparams
,
CHANNELMOD_SECTION
);
AssertFatal
(
channel_list
.
numelt
>
0
,
"List %s.%s not found in config file
\n
"
,
CHANNELMOD_SECTION
,
channel_list
.
listname
);
...
...
@@ -2037,15 +2095,18 @@ int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double
int
pindex_TYPE
=
config_paramidx_fromname
(
achannel_params
,
numparams
,
CHANNELMOD_MODEL_TYPE_PNAME
);
for
(
int
i
=
0
;
i
<
channel_list
.
numelt
;
i
++
)
{
int
modid
=
modelid_fromstrtype
(
*
(
channel_list
.
paramarray
[
i
][
pindex_TYPE
].
strptr
)
);
if
(
modid
<
0
)
{
LOG_E
(
OCM
,
"Valid channel model types:
\n
"
);
for
(
int
m
=
0
;
channelmod_names
[
i
].
name
!=
NULL
;
m
++
)
{
printf
(
" %s "
,
map_int_to_str
(
channelmod_names
,
m
));
}
AssertFatal
(
0
,
"
\n
Choose a valid model type
\n
"
);
}
channel_desc_t
*
channeldesc_p
=
new_channel_desc_scm
(
nb_tx
,
nb_rx
,
modid
,
sampling_rate
,
channel_bandwidth
,
*
(
channel_list
.
paramarray
[
i
][
pindex_DT
].
dblptr
),
*
(
channel_list
.
paramarray
[
i
][
pindex_FF
].
dblptr
),
*
(
channel_list
.
paramarray
[
i
][
pindex_CO
].
iptr
),
*
(
channel_list
.
paramarray
[
i
][
pindex_PL
].
dblptr
),
...
...
@@ -2055,6 +2116,7 @@ int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double
LOG_I
(
OCM
,
"Model %s type %s allocated from config file, list %s
\n
"
,
*
(
channel_list
.
paramarray
[
i
][
pindex_NAME
].
strptr
),
*
(
channel_list
.
paramarray
[
i
][
pindex_TYPE
].
strptr
),
modellist_name
);
}
/* for loop on channel_list */
return
channel_list
.
numelt
;
}
/* load_channelist */
...
...
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