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
promise
OpenXG-RAN
Commits
8d5bb7c0
Commit
8d5bb7c0
authored
Oct 16, 2017
by
lfarizav
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
new generate_prach_freq function
parent
ca98dc9d
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
511 additions
and
7 deletions
+511
-7
openair1/PHY/INIT/lte_init.c
openair1/PHY/INIT/lte_init.c
+2
-3
openair1/PHY/LTE_TRANSPORT/prach.c
openair1/PHY/LTE_TRANSPORT/prach.c
+500
-0
openair1/PHY/LTE_TRANSPORT/proto.h
openair1/PHY/LTE_TRANSPORT/proto.h
+1
-0
openair1/SCHED/phy_procedures_lte_ue.c
openair1/SCHED/phy_procedures_lte_ue.c
+4
-1
targets/SIMU/USER/channel_sim.c
targets/SIMU/USER/channel_sim.c
+2
-2
targets/SIMU/USER/oaisim_functions.c
targets/SIMU/USER/oaisim_functions.c
+2
-1
No files found.
openair1/PHY/INIT/lte_init.c
View file @
8d5bb7c0
...
...
@@ -1152,13 +1152,12 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
}
// init RX buffers
if
(
do_ofdm_mod
)
{
common_vars
->
rxdata
=
(
int32_t
**
)
malloc16
(
fp
->
nb_antennas_rx
*
sizeof
(
int32_t
*
)
);
for
(
i
=
0
;
i
<
fp
->
nb_antennas_rx
;
i
++
)
{
common_vars
->
rxdata
[
i
]
=
(
int32_t
*
)
malloc16_clear
(
(
fp
->
samples_per_tti
*
10
+
2048
)
*
sizeof
(
int32_t
)
);
}
if
(
do_ofdm_mod
)
{
common_vars
->
common_vars_rx_data_per_thread
[
0
].
rxdataF
=
(
int32_t
**
)
malloc16
(
fp
->
nb_antennas_rx
*
sizeof
(
int32_t
*
));
printf
(
"[lte_init_f] address of rxdataF in memory: %p, thread %d
\n
"
,
&
common_vars
->
common_vars_rx_data_per_thread
[
0
].
rxdataF
,
0
);
for
(
i
=
0
;
i
<
fp
->
nb_antennas_rx
;
i
++
)
{
...
...
openair1/PHY/LTE_TRANSPORT/prach.c
View file @
8d5bb7c0
...
...
@@ -674,6 +674,7 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1
}
n_ra_prb
=
get_prach_prb_offset
(
&
(
ue
->
frame_parms
),
tdd_mapindex
,
Nf
);
printf
(
"[prach.c] n_ra_prb %d
\n
"
,
n_ra_prb
);
prach_root_sequence_map
=
(
prach_fmt
<
4
)
?
prach_root_sequence_map0_3
:
prach_root_sequence_map4
;
/*
...
...
@@ -1086,6 +1087,505 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1
return
signal_energy
(
(
int
*
)
prach
,
256
);
}
int32_t
generate_prach_freq
(
PHY_VARS_UE
*
ue
,
uint8_t
eNB_id
,
uint8_t
subframe
,
uint16_t
Nf
)
{
lte_frame_type_t
frame_type
=
ue
->
frame_parms
.
frame_type
;
//uint8_t tdd_config = ue->frame_parms.tdd_config;
uint16_t
rootSequenceIndex
=
ue
->
frame_parms
.
prach_config_common
.
rootSequenceIndex
;
uint8_t
prach_ConfigIndex
=
ue
->
frame_parms
.
prach_config_common
.
prach_ConfigInfo
.
prach_ConfigIndex
;
uint8_t
Ncs_config
=
ue
->
frame_parms
.
prach_config_common
.
prach_ConfigInfo
.
zeroCorrelationZoneConfig
;
uint8_t
restricted_set
=
ue
->
frame_parms
.
prach_config_common
.
prach_ConfigInfo
.
highSpeedFlag
;
//uint8_t n_ra_prboffset = ue->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset;
uint8_t
preamble_index
=
ue
->
prach_resources
[
eNB_id
]
->
ra_PreambleIndex
;
uint8_t
tdd_mapindex
=
ue
->
prach_resources
[
eNB_id
]
->
ra_TDD_map_index
;
int16_t
*
prachF
=
ue
->
prach_vars
[
eNB_id
]
->
prachF
;
static
int16_t
prach_tmp
[
45600
*
2
]
__attribute__
((
aligned
(
32
)));
int16_t
*
prach
=
prach_tmp
;
int16_t
*
prach2
;
int16_t
amp
=
ue
->
prach_vars
[
eNB_id
]
->
amp
;
int16_t
Ncp
;
uint8_t
n_ra_prb
;
uint16_t
NCS
;
uint16_t
*
prach_root_sequence_map
;
uint16_t
preamble_offset
,
preamble_shift
;
uint16_t
preamble_index0
,
n_shift_ra
,
n_shift_ra_bar
;
uint16_t
d_start
,
numshift
;
uint8_t
prach_fmt
=
get_prach_fmt
(
prach_ConfigIndex
,
frame_type
);
//uint8_t Nsp=2;
//uint8_t f_ra,t1_ra;
uint16_t
N_ZC
=
(
prach_fmt
<
4
)
?
839
:
139
;
uint8_t
not_found
;
int
k
;
int16_t
*
Xu
;
uint16_t
u
;
int32_t
Xu_re
,
Xu_im
;
uint16_t
offset
,
offset2
;
int
prach_start
;
int
i
,
prach_len
;
uint16_t
first_nonzero_root_idx
=
0
;
#if defined(EXMIMO) || defined(OAI_USRP)
prach_start
=
(
subframe
*
ue
->
frame_parms
.
symbols_per_tti
*
ue
->
frame_parms
.
ofdm_symbol_size
);
#ifdef PRACH_DEBUG
LOG_I
(
PHY
,
"[UE %d] prach_start %d, rx_offset %d, hw_timing_advance %d, N_TA_offset %d
\n
"
,
ue
->
Mod_id
,
prach_start
,
ue
->
rx_offset
,
ue
->
hw_timing_advance
,
ue
->
N_TA_offset
);
#endif
if
(
prach_start
<
0
)
prach_start
+=
(
ue
->
frame_parms
.
symbols_per_tti
*
ue
->
frame_parms
.
ofdm_symbol_size
*
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME
);
if
(
prach_start
>=
(
ue
->
frame_parms
.
symbols_per_tti
*
ue
->
frame_parms
.
ofdm_symbol_size
*
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME
))
prach_start
-=
(
ue
->
frame_parms
.
symbols_per_tti
*
ue
->
frame_parms
.
ofdm_symbol_size
*
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME
);
#else //normal case (simulation)
prach_start
=
subframe
*
ue
->
frame_parms
.
symbols_per_tti
*
ue
->
frame_parms
.
ofdm_symbol_size
;
LOG_D
(
PHY
,
"[UE %d] prach_start %d, rx_offset %d, hw_timing_advance %d, N_TA_offset %d
\n
"
,
ue
->
Mod_id
,
prach_start
,
ue
->
rx_offset
,
ue
->
hw_timing_advance
,
ue
->
N_TA_offset
);
#endif
// First compute physical root sequence
if
(
restricted_set
==
0
)
{
if
(
Ncs_config
>
15
)
{
LOG_E
(
PHY
,
"[PHY] FATAL, Illegal Ncs_config for unrestricted format %"
PRIu8
"
\n
"
,
Ncs_config
);
mac_xface
->
macphy_exit
(
"PRACH: Illegal Ncs_config for unrestricted format"
);
return
0
;
// not reached
}
NCS
=
NCS_unrestricted
[
Ncs_config
];
}
else
{
if
(
Ncs_config
>
14
)
{
LOG_E
(
PHY
,
"[PHY] FATAL, Illegal Ncs_config for restricted format %"
PRIu8
"
\n
"
,
Ncs_config
);
mac_xface
->
macphy_exit
(
"PRACH: Illegal Ncs_config for restricted format"
);
return
0
;
// not reached
}
NCS
=
NCS_restricted
[
Ncs_config
];
}
n_ra_prb
=
get_prach_prb_offset
(
&
(
ue
->
frame_parms
),
tdd_mapindex
,
Nf
);
printf
(
"[prach.c] n_ra_prb %d
\n
"
,
n_ra_prb
);
prach_root_sequence_map
=
(
prach_fmt
<
4
)
?
prach_root_sequence_map0_3
:
prach_root_sequence_map4
;
/*
// this code is not part of get_prach_prb_offset
if (frame_type == TDD) { // TDD
if (tdd_preamble_map[prach_ConfigIndex][tdd_config].num_prach==0) {
LOG_E( PHY, "[PHY][UE %"PRIu8"] Illegal prach_ConfigIndex %"PRIu8" for ", ue->Mod_id, prach_ConfigIndex );
}
// adjust n_ra_prboffset for frequency multiplexing (p.36 36.211)
f_ra = tdd_preamble_map[prach_ConfigIndex][tdd_config].map[tdd_mapindex].f_ra;
if (prach_fmt < 4) {
if ((f_ra&1) == 0) {
n_ra_prb = n_ra_prboffset + 6*(f_ra>>1);
} else {
n_ra_prb = ue->frame_parms.N_RB_UL - 6 - n_ra_prboffset + 6*(f_ra>>1);
}
} else {
if ((tdd_config >2) && (tdd_config<6))
Nsp = 2;
t1_ra = tdd_preamble_map[prach_ConfigIndex][tdd_config].map[0].t1_ra;
if ((((Nf&1)*(2-Nsp)+t1_ra)&1) == 0) {
n_ra_prb = 6*f_ra;
} else {
n_ra_prb = ue->frame_parms.N_RB_UL - 6*(f_ra+1);
}
}
}
*/
// This is the relative offset (for unrestricted case) in the root sequence table (5.7.2-4 from 36.211) for the given preamble index
preamble_offset
=
((
NCS
==
0
)
?
preamble_index
:
(
preamble_index
/
(
N_ZC
/
NCS
)));
if
(
restricted_set
==
0
)
{
// This is the \nu corresponding to the preamble index
preamble_shift
=
(
NCS
==
0
)
?
0
:
(
preamble_index
%
(
N_ZC
/
NCS
));
preamble_shift
*=
NCS
;
}
else
{
// This is the high-speed case
#ifdef PRACH_DEBUG
LOG_D
(
PHY
,
"[UE %d] High-speed mode, NCS_config %d
\n
"
,
ue
->
Mod_id
,
Ncs_config
);
#endif
not_found
=
1
;
preamble_index0
=
preamble_index
;
// set preamble_offset to initial rootSequenceIndex and look if we need more root sequences for this
// preamble index and find the corresponding cyclic shift
preamble_offset
=
0
;
// relative rootSequenceIndex;
while
(
not_found
==
1
)
{
// current root depending on rootSequenceIndex and preamble_offset
int
index
=
(
rootSequenceIndex
+
preamble_offset
)
%
N_ZC
;
if
(
prach_fmt
<
4
)
{
// prach_root_sequence_map points to prach_root_sequence_map0_3
DevAssert
(
index
<
sizeof
(
prach_root_sequence_map0_3
)
/
sizeof
(
prach_root_sequence_map0_3
[
0
])
);
}
else
{
// prach_root_sequence_map points to prach_root_sequence_map4
DevAssert
(
index
<
sizeof
(
prach_root_sequence_map4
)
/
sizeof
(
prach_root_sequence_map4
[
0
])
);
}
u
=
prach_root_sequence_map
[
index
];
uint16_t
n_group_ra
=
0
;
if
(
(
du
[
u
]
<
(
N_ZC
/
3
))
&&
(
du
[
u
]
>=
NCS
)
)
{
n_shift_ra
=
du
[
u
]
/
NCS
;
d_start
=
(
du
[
u
]
<<
1
)
+
(
n_shift_ra
*
NCS
);
n_group_ra
=
N_ZC
/
d_start
;
n_shift_ra_bar
=
max
(
0
,(
N_ZC
-
(
du
[
u
]
<<
1
)
-
(
n_group_ra
*
d_start
))
/
N_ZC
);
}
else
if
(
(
du
[
u
]
>=
(
N_ZC
/
3
))
&&
(
du
[
u
]
<=
((
N_ZC
-
NCS
)
>>
1
))
)
{
n_shift_ra
=
(
N_ZC
-
(
du
[
u
]
<<
1
))
/
NCS
;
d_start
=
N_ZC
-
(
du
[
u
]
<<
1
)
+
(
n_shift_ra
*
NCS
);
n_group_ra
=
du
[
u
]
/
d_start
;
n_shift_ra_bar
=
min
(
n_shift_ra
,
max
(
0
,(
du
[
u
]
-
(
n_group_ra
*
d_start
))
/
NCS
));
}
else
{
n_shift_ra
=
0
;
n_shift_ra_bar
=
0
;
}
// This is the number of cyclic shifts for the current root u
numshift
=
(
n_shift_ra
*
n_group_ra
)
+
n_shift_ra_bar
;
if
(
numshift
>
0
&&
preamble_index0
==
preamble_index
)
first_nonzero_root_idx
=
preamble_offset
;
if
(
preamble_index0
<
numshift
)
{
not_found
=
0
;
preamble_shift
=
(
d_start
*
(
preamble_index0
/
n_shift_ra
))
+
((
preamble_index0
%
n_shift_ra
)
*
NCS
);
}
else
{
// skip to next rootSequenceIndex and recompute parameters
preamble_offset
++
;
preamble_index0
-=
numshift
;
}
}
}
// now generate PRACH signal
#ifdef PRACH_DEBUG
if
(
NCS
>
0
)
LOG_D
(
PHY
,
"Generate PRACH for RootSeqIndex %d, Preamble Index %d, NCS %d (NCS_config %d, N_ZC/NCS %d) n_ra_prb %d: Preamble_offset %d, Preamble_shift %d
\n
"
,
rootSequenceIndex
,
preamble_index
,
NCS
,
Ncs_config
,
N_ZC
/
NCS
,
n_ra_prb
,
preamble_offset
,
preamble_shift
);
#endif
// nsymb = (frame_parms->Ncp==0) ? 14:12;
// subframe_offset = (unsigned int)frame_parms->ofdm_symbol_size*subframe*nsymb;
k
=
(
12
*
n_ra_prb
)
-
6
*
ue
->
frame_parms
.
N_RB_UL
;
if
(
k
<
0
)
k
+=
ue
->
frame_parms
.
ofdm_symbol_size
;
k
*=
12
;
k
+=
13
;
Xu
=
(
int16_t
*
)
ue
->
X_u
[
preamble_offset
-
first_nonzero_root_idx
];
/*
k+=(12*ue->frame_parms.first_carrier_offset);
if (k>(12*ue->frame_parms.ofdm_symbol_size))
k-=(12*ue->frame_parms.ofdm_symbol_size);
*/
k
*=
2
;
switch
(
ue
->
frame_parms
.
N_RB_UL
)
{
case
6
:
memset
((
void
*
)
prachF
,
0
,
4
*
1536
);
break
;
case
15
:
memset
((
void
*
)
prachF
,
0
,
4
*
3072
);
break
;
case
25
:
memset
((
void
*
)
prachF
,
0
,
4
*
6144
);
break
;
case
50
:
memset
((
void
*
)
prachF
,
0
,
4
*
12288
);
break
;
case
75
:
memset
((
void
*
)
prachF
,
0
,
4
*
18432
);
break
;
case
100
:
if
(
ue
->
frame_parms
.
threequarter_fs
==
0
)
memset
((
void
*
)
prachF
,
0
,
4
*
24576
);
else
memset
((
void
*
)
prachF
,
0
,
4
*
18432
);
break
;
}
for
(
offset
=
0
,
offset2
=
0
;
offset
<
N_ZC
;
offset
++
,
offset2
+=
preamble_shift
)
{
if
(
offset2
>=
N_ZC
)
offset2
-=
N_ZC
;
Xu_re
=
(((
int32_t
)
Xu
[
offset
<<
1
]
*
amp
)
>>
15
);
Xu_im
=
(((
int32_t
)
Xu
[
1
+
(
offset
<<
1
)]
*
amp
)
>>
15
);
prachF
[
k
++
]
=
((
Xu_re
*
ru
[
offset2
<<
1
])
-
(
Xu_im
*
ru
[
1
+
(
offset2
<<
1
)]))
>>
15
;
prachF
[
k
++
]
=
((
Xu_im
*
ru
[
offset2
<<
1
])
+
(
Xu_re
*
ru
[
1
+
(
offset2
<<
1
)]))
>>
15
;
if
(
k
==
(
12
*
2
*
ue
->
frame_parms
.
ofdm_symbol_size
))
k
=
0
;
}
switch
(
prach_fmt
)
{
case
0
:
Ncp
=
3168
;
break
;
case
1
:
case
3
:
Ncp
=
21024
;
break
;
case
2
:
Ncp
=
6240
;
break
;
case
4
:
Ncp
=
448
;
break
;
default:
Ncp
=
3168
;
break
;
}
switch
(
ue
->
frame_parms
.
N_RB_UL
)
{
case
6
:
Ncp
>>=
4
;
prach
+=
4
;
// makes prach2 aligned to 128-bit
break
;
case
15
:
Ncp
>>=
3
;
break
;
case
25
:
Ncp
>>=
2
;
break
;
case
50
:
Ncp
>>=
1
;
break
;
case
75
:
Ncp
=
(
Ncp
*
3
)
>>
2
;
break
;
}
if
(
ue
->
frame_parms
.
threequarter_fs
==
1
)
Ncp
=
(
Ncp
*
3
)
>>
2
;
prach2
=
prach
+
(
Ncp
<<
1
);
// do IDFT
switch
(
ue
->
frame_parms
.
N_RB_UL
)
{
case
6
:
if
(
prach_fmt
==
4
)
{
idft256
(
prachF
,
prach2
,
1
);
memmove
(
prach
,
prach
+
512
,
Ncp
<<
2
);
prach_len
=
256
+
Ncp
;
}
else
{
idft1536
(
prachF
,
prach2
,
1
);
memmove
(
prach
,
prach
+
3072
,
Ncp
<<
2
);
prach_len
=
1536
+
Ncp
;
if
(
prach_fmt
>
1
)
{
memmove
(
prach2
+
3072
,
prach2
,
6144
);
prach_len
=
2
*
1536
+
Ncp
;
}
}
break
;
case
15
:
if
(
prach_fmt
==
4
)
{
idft512
(
prachF
,
prach2
,
1
);
//TODO: account for repeated format in dft output
memmove
(
prach
,
prach
+
1024
,
Ncp
<<
2
);
prach_len
=
512
+
Ncp
;
}
else
{
idft3072
(
prachF
,
prach2
);
memmove
(
prach
,
prach
+
6144
,
Ncp
<<
2
);
prach_len
=
3072
+
Ncp
;
if
(
prach_fmt
>
1
)
{
memmove
(
prach2
+
6144
,
prach2
,
12288
);
prach_len
=
2
*
3072
+
Ncp
;
}
}
break
;
case
25
:
default:
if
(
prach_fmt
==
4
)
{
idft1024
(
prachF
,
prach2
,
1
);
memmove
(
prach
,
prach
+
2048
,
Ncp
<<
2
);
prach_len
=
1024
+
Ncp
;
}
else
{
idft6144
(
prachF
,
prach2
);
/*for (i=0;i<6144*2;i++)
prach2[i]<<=1;*/
memmove
(
prach
,
prach
+
12288
,
Ncp
<<
2
);
prach_len
=
6144
+
Ncp
;
if
(
prach_fmt
>
1
)
{
memmove
(
prach2
+
12288
,
prach2
,
24576
);
prach_len
=
2
*
6144
+
Ncp
;
}
}
break
;
case
50
:
if
(
prach_fmt
==
4
)
{
idft2048
(
prachF
,
prach2
,
1
);
memmove
(
prach
,
prach
+
4096
,
Ncp
<<
2
);
prach_len
=
2048
+
Ncp
;
}
else
{
idft12288
(
prachF
,
prach2
);
memmove
(
prach
,
prach
+
24576
,
Ncp
<<
2
);
prach_len
=
12288
+
Ncp
;
if
(
prach_fmt
>
1
)
{
memmove
(
prach2
+
24576
,
prach2
,
49152
);
prach_len
=
2
*
12288
+
Ncp
;
}
}
break
;
case
75
:
if
(
prach_fmt
==
4
)
{
idft3072
(
prachF
,
prach2
);
//TODO: account for repeated format in dft output
memmove
(
prach
,
prach
+
6144
,
Ncp
<<
2
);
prach_len
=
3072
+
Ncp
;
}
else
{
idft18432
(
prachF
,
prach2
);
memmove
(
prach
,
prach
+
36864
,
Ncp
<<
2
);
prach_len
=
18432
+
Ncp
;
if
(
prach_fmt
>
1
)
{
memmove
(
prach2
+
36834
,
prach2
,
73728
);
prach_len
=
2
*
18432
+
Ncp
;
}
}
break
;
case
100
:
if
(
ue
->
frame_parms
.
threequarter_fs
==
0
)
{
if
(
prach_fmt
==
4
)
{
idft4096
(
prachF
,
prach2
,
1
);
memmove
(
prach
,
prach
+
8192
,
Ncp
<<
2
);
prach_len
=
4096
+
Ncp
;
}
else
{
idft24576
(
prachF
,
prach2
);
memmove
(
prach
,
prach
+
49152
,
Ncp
<<
2
);
prach_len
=
24576
+
Ncp
;
if
(
prach_fmt
>
1
)
{
memmove
(
prach2
+
49152
,
prach2
,
98304
);
prach_len
=
2
*
24576
+
Ncp
;
}
}
}
else
{
if
(
prach_fmt
==
4
)
{
idft3072
(
prachF
,
prach2
);
//TODO: account for repeated format in dft output
memmove
(
prach
,
prach
+
6144
,
Ncp
<<
2
);
prach_len
=
3072
+
Ncp
;
}
else
{
idft18432
(
prachF
,
prach2
);
memmove
(
prach
,
prach
+
36864
,
Ncp
<<
2
);
prach_len
=
18432
+
Ncp
;
printf
(
"Generated prach for 100 PRB, 3/4 sampling
\n
"
);
if
(
prach_fmt
>
1
)
{
memmove
(
prach2
+
36834
,
prach2
,
73728
);
prach_len
=
2
*
18432
+
Ncp
;
}
}
}
break
;
}
//LOG_D(PHY,"prach_len=%d\n",prach_len);
if
(
prach_fmt
==
4
)
{
LOG_E
(
PHY
,
"prach_fmt4 not fully implemented"
);
mac_xface
->
macphy_exit
(
"prach_fmt4 not fully implemented"
);
return
0
;
// not reached
}
else
{
#if defined(EXMIMO) || defined(OAI_USRP)
int
j
;
int
overflow
=
prach_start
+
prach_len
-
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME
*
ue
->
frame_parms
.
symbols_per_tti
*
ue
->
frame_parms
.
ofdm_symbol_size
;
LOG_D
(
PHY
,
"prach_start=%d, overflow=%d
\n
"
,
prach_start
,
overflow
);
for
(
i
=
prach_start
,
j
=
0
;
i
<
min
(
ue
->
frame_parms
.
ue
->
frame_parms
.
symbols_per_tti
*
ue
->
frame_parms
.
ofdm_symbol_size
*
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME
,
prach_start
+
prach_len
);
i
++
,
j
++
)
{
((
int16_t
*
)
ue
->
common_vars
.
txdata
[
0
])[
2
*
i
]
=
prach
[
2
*
j
]
<<
4
;
((
int16_t
*
)
ue
->
common_vars
.
txdata
[
0
])[
2
*
i
+
1
]
=
prach
[
2
*
j
+
1
]
<<
4
;
}
for
(
i
=
0
;
i
<
overflow
;
i
++
,
j
++
)
{
((
int16_t
*
)
ue
->
common_vars
.
txdata
[
0
])[
2
*
i
]
=
prach
[
2
*
j
]
<<
4
;
((
int16_t
*
)
ue
->
common_vars
.
txdata
[
0
])[
2
*
i
+
1
]
=
prach
[
2
*
j
+
1
]
<<
4
;
}
#if defined(EXMIMO)
// handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on
for
(
k
=
prach_start
-
(
ue
->
frame_parms
.
ue
->
frame_parms
.
symbols_per_tti
*
ue
->
frame_parms
.
ofdm_symbol_size
>>
1
)
;
k
<
prach_start
;
k
++
)
{
if
(
k
<
0
)
ue
->
common_vars
.
txdata
[
0
][
k
+
ue
->
frame_parms
.
ue
->
frame_parms
.
symbols_per_tti
*
ue
->
frame_parms
.
ofdm_symbol_size
*
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME
]
&=
0xFFFEFFFE
;
else
if
(
k
>
(
ue
->
frame_parms
.
ue
->
frame_parms
.
symbols_per_tti
*
ue
->
frame_parms
.
ofdm_symbol_size
*
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME
))
ue
->
common_vars
.
txdata
[
0
][
k
-
ue
->
frame_parms
.
ue
->
frame_parms
.
symbols_per_tti
*
ue
->
frame_parms
.
ofdm_symbol_size
*
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME
]
&=
0xFFFEFFFE
;
else
ue
->
common_vars
.
txdata
[
0
][
k
]
&=
0xFFFEFFFE
;
}
#endif
#else
for
(
i
=
0
;
i
<
prach_len
;
i
++
)
{
((
int16_t
*
)(
&
ue
->
common_vars
.
txdata
[
0
][
prach_start
]))[
2
*
i
]
=
prach
[
2
*
i
];
((
int16_t
*
)(
&
ue
->
common_vars
.
txdata
[
0
][
prach_start
]))[
2
*
i
+
1
]
=
prach
[
2
*
i
+
1
];
}
#endif
}
#ifdef PRACH_DEBUG
write_output
(
"prach_txF0.m"
,
"prachtxF0"
,
prachF
,
prach_len
-
Ncp
,
1
,
1
);
write_output
(
"prach_tx0.m"
,
"prachtx0"
,
prach
+
(
Ncp
<<
1
),
prach_len
-
Ncp
,
1
,
1
);
write_output
(
"txsig.m"
,
"txs"
,(
int16_t
*
)(
&
ue
->
common_vars
.
txdata
[
0
][
0
]),
2
*
ue
->
frame_parms
.
symbols_per_tti
*
ue
->
frame_parms
.
ofdm_symbol_size
,
1
,
1
);
exit
(
-
1
);
#endif
return
signal_energy
(
(
int
*
)
prach
,
256
);
}
//__m128i mmtmpX0,mmtmpX1,mmtmpX2,mmtmpX3;
void
rx_prach
(
PHY_VARS_eNB
*
eNB
,
...
...
openair1/PHY/LTE_TRANSPORT/proto.h
View file @
8d5bb7c0
...
...
@@ -2150,6 +2150,7 @@ int is_prach_subframe(LTE_DL_FRAME_PARMS *frame_parms,frame_t frame, uint8_t sub
*/
int32_t
generate_prach
(
PHY_VARS_UE
*
phy_vars_ue
,
uint8_t
eNB_id
,
uint8_t
subframe
,
uint16_t
Nf
);
int32_t
generate_prach_freq
(
PHY_VARS_UE
*
phy_vars_ue
,
uint8_t
eNB_id
,
uint8_t
subframe
,
uint16_t
Nf
);
/*!
\brief Process PRACH waveform
...
...
openair1/SCHED/phy_procedures_lte_ue.c
View file @
8d5bb7c0
...
...
@@ -1483,6 +1483,9 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
// start_meas(&ue->tx_prach);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH
,
VCD_FUNCTION_IN
);
if
(
ue
->
do_ofdm_mod
)
prach_power
=
generate_prach_freq
(
ue
,
eNB_id
,
subframe_tx
,
frame_tx
);
else
prach_power
=
generate_prach
(
ue
,
eNB_id
,
subframe_tx
,
frame_tx
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH
,
VCD_FUNCTION_OUT
);
// stop_meas(&ue->tx_prach);
...
...
targets/SIMU/USER/channel_sim.c
View file @
8d5bb7c0
...
...
@@ -531,7 +531,7 @@ void do_DL_sig_freq(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][
txdataF
=
PHY_vars_eNB_g
[
eNB_id
][
CC_id
]
->
common_vars
.
txdataF
[
0
];
sf_offset
=
subframe
*
frame_parms
->
ofdm_symbol_size
*
frame_parms
->
symbols_per_tti
;
//
for (int idx=0;idx<10;idx++) printf("dumping raw subframe %d: txdataF[%d] = (%d,%d)\n", subframe, idx, ((short*)&txdataF[0][sf_offset+idx])[0], ((short*)&txdataF[0][sf_offset+idx])[1]);
for
(
int
idx
=
0
;
idx
<
10
;
idx
++
)
printf
(
"dumping raw subframe %d: txdataF[%d] = (%d,%d)
\n
"
,
subframe
,
idx
,
((
short
*
)
&
txdataF
[
0
][
sf_offset
+
idx
])[
0
],
((
short
*
)
&
txdataF
[
0
][
sf_offset
+
idx
])[
1
]);
tx_pwr
=
dac_fixed_gain
(
s_re_f
,
...
...
@@ -1156,7 +1156,7 @@ void do_UL_prach(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX
if
(
abstraction_flag
!=
0
)
{
#ifdef PHY_ABSTRACTION_UL
LOG_D
(
OCM
,
"[SIM][UL] UE %d, Abstraction for do_UL_prach is not implemented in frequency domain
\n
"
,
UE_id
);
exit
(
1
);
exit
(
-
1
);
#else
#endif
}
else
{
//without abstraction
...
...
targets/SIMU/USER/oaisim_functions.c
View file @
8d5bb7c0
...
...
@@ -1046,6 +1046,7 @@ int eNB_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void *
int
CC_id
=
device
->
CC_id
;
int
subframe
;
int
n_ra_prb
;
int
read_samples
,
max_samples
;
openair0_timestamp
last
=
last_eNB_rx_timestamp
[
eNB_id
][
CC_id
];
...
...
@@ -1114,7 +1115,7 @@ int eNB_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void *
0
,
// frame is only used for abstraction
eNB_id
,
CC_id
);
write_output
(
"txprachF.m"
,
"prach_txF"
,
PHY_vars_UE_g
[
0
][
0
]
->
prach_vars
[
0
]
->
prachF
,
frame_parms
->
ofdm_symbol_size
*
frame_parms
->
symbols_per_tti
,
1
,
1
);
write_output
(
"txprachF.m"
,
"prach_txF"
,
PHY_vars_UE_g
[
0
][
0
]
->
prach_vars
[
0
]
->
prachF
,
12
*
frame_parms
->
ofdm_symbol_size
*
frame_parms
->
symbols_per_tti
,
1
,
1
);
//generate_prach(PHY_vars_UE_g[0][0],eNB_id,subframe,frame);
//PHY_vars_UE_g[0][0]->generate_prach=1;
}
...
...
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