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
ZhouShuya
OpenXG-RAN
Commits
97a9dfd8
Commit
97a9dfd8
authored
Nov 05, 2020
by
Khodr Saaifan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
UE: implement pdsch channel estimation for dmrs_config type2
parent
1de69e8e
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
404 additions
and
57 deletions
+404
-57
openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
+54
-0
openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
+36
-0
openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+314
-57
No files found.
openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
View file @
97a9dfd8
...
...
@@ -185,3 +185,57 @@ short filt8_rr1[8] = {
short
filt8_rr2
[
8
]
=
{
-
4096
,
-
8192
,
-
12288
,
-
16384
,
0
,
0
,
0
,
0
};
short
filt8_l2
[
8
]
=
{
0
,
0
,
13107
,
9830
,
6554
,
3277
,
0
,
0
};
short
filt8_r2
[
8
]
=
{
0
,
0
,
3277
,
6554
,
9830
,
13107
,
0
,
0
};
short
filt8_m2
[
8
]
=
{
0
,
0
,
0
,
0
,
13107
,
9830
,
6554
,
3277
};
short
filt8_mm2
[
8
]
=
{
0
,
0
,
0
,
0
,
3277
,
6554
,
9830
,
13107
};
short
filt8_rl2
[
8
]
=
{
19661
,
22938
,
26214
,
29491
,
0
,
0
,
0
,
0
};
short
filt8_rm2
[
8
]
=
{
-
3277
,
-
6554
,
-
9830
,
-
13107
,
0
,
0
,
0
,
0
};
//-3277,-6554,-9830,-13107
short
filt8_l3
[
8
]
=
{
22938
,
19661
,
0
,
0
,
13107
,
9830
,
6554
,
3277
};
short
filt8_r3
[
8
]
=
{
-
7537
,
-
4260
,
0
,
0
,
3277
,
6554
,
9830
,
13107
};
//-6554,-3277
short
filt8_rl3
[
8
]
=
{
0
,
0
,
19661
,
22938
,
0
,
0
,
0
,
0
};
short
filt8_rr3
[
8
]
=
{
0
,
0
,
-
4260
,
-
7537
,
0
,
0
,
0
,
0
};
//-3277,-6554
short
filt8_dcrl1
[
8
]
=
{
14895
,
13405
,
11916
,
10426
,
8937
,
7447
,
5958
,
4468
};
short
filt8_dcrh1
[
8
]
=
{
2979
,
1489
,
0
,
0
,
0
,
0
,
0
,
0
};
short
filt8_dcll1
[
8
]
=
{
13405
,
14895
,
0
,
0
,
0
,
0
,
0
,
0
};
short
filt8_dclh1
[
8
]
=
{
1489
,
2979
,
4468
,
5958
,
7447
,
8937
,
10426
,
11916
};
short
filt8_dcrl2
[
8
]
=
{
0
,
0
,
0
,
0
,
14895
,
13405
,
11916
,
10426
};
short
filt8_dcrh2
[
8
]
=
{
8937
,
7447
,
5958
,
4468
,
2979
,
1489
,
0
,
0
,};
short
filt8_dcll2
[
8
]
=
{
7447
,
8937
,
10426
,
11916
,
13405
,
14895
,
0
,
0
};
short
filt8_dclh2
[
8
]
=
{
0
,
0
,
0
,
0
,
1489
,
2979
,
4468
,
5958
};
openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
View file @
97a9dfd8
...
...
@@ -133,4 +133,40 @@ extern short filt8_rr1[8];
extern
short
filt8_rr2
[
8
];
extern
short
filt8_rm2
[
8
];
extern
short
filt8_rl2
[
8
];
extern
short
filt8_l2
[
8
];
extern
short
filt8_r2
[
8
];
extern
short
filt8_m2
[
8
];
extern
short
filt8_mm2
[
8
];
extern
short
filt8_l3
[
8
];
extern
short
filt8_r3
[
8
];
extern
short
filt8_rr3
[
8
];
extern
short
filt8_rl3
[
8
];
extern
short
filt8_dcrl1
[
8
];
extern
short
filt8_dcrh1
[
8
];
extern
short
filt8_dcll1
[
8
];
extern
short
filt8_dclh1
[
8
];
extern
short
filt8_dcrl2
[
8
];
extern
short
filt8_dcrh2
[
8
];
extern
short
filt8_dcll2
[
8
];
extern
short
filt8_dclh2
[
8
];
#endif
\ No newline at end of file
openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
View file @
97a9dfd8
...
...
@@ -24,6 +24,7 @@
#include "SCHED_NR_UE/defs.h"
#include "nr_estimation.h"
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
#include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
#include "filt16a_32.h"
//#define DEBUG_PDSCH
...
...
@@ -652,8 +653,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
unsigned
char
aarx
;
unsigned
short
k
;
unsigned
int
pilot_cnt
;
int16_t
ch
[
2
],
*
pil
,
*
rxF
,
*
dl_ch
;
int16_t
*
fl
,
*
fm
,
*
fr
,
*
fml
,
*
fmr
,
*
fmm
,
*
fdcl
,
*
fdcr
,
*
fdclh
,
*
fdcrh
;
int16_t
ch
_l
[
2
],
ch_r
[
2
],
ch
[
2
],
*
pil
,
*
rxF
,
*
dl_ch
;
int16_t
*
fl
,
*
fm
,
*
fr
,
*
fml
,
*
fmr
,
*
fmm
,
*
fdcl
,
*
fdcr
,
*
fdclh
,
*
fdcrh
,
*
frl
,
*
frr
;
int
ch_offset
,
symbol_offset
;
//uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1];
...
...
@@ -662,9 +663,6 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
int
**
dl_ch_estimates
=
ue
->
pdsch_vars
[
ue
->
current_thread_id
[
Ns
]][
eNB_offset
]
->
dl_ch_estimates
;
int
**
rxdataF
=
ue
->
common_vars
.
common_vars_rx_data_per_thread
[
ue
->
current_thread_id
[
Ns
]].
rxdataF
;
nushift
=
(
p
>>
1
)
&
1
;
ue
->
frame_parms
.
nushift
=
nushift
;
if
(
ue
->
high_speed_flag
==
0
)
// use second channel estimate position for temporary storage
ch_offset
=
ue
->
frame_parms
.
ofdm_symbol_size
;
else
...
...
@@ -680,51 +678,101 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
ue
->
frame_parms
.
Ncp
,
Ns
,
k
,
symbol
);
#endif
switch
(
nushift
)
{
case
0
:
fl
=
filt8_l0
;
fm
=
filt8_m0
;
fr
=
filt8_r0
;
fmm
=
filt8_mm0
;
fml
=
filt8_m0
;
fmr
=
filt8_mr0
;
fdcl
=
filt8_dcl0
;
fdcr
=
filt8_dcr0
;
fdclh
=
filt8_dcl0_h
;
fdcrh
=
filt8_dcr0_h
;
break
;
case
1
:
fl
=
filt8_l1
;
fm
=
filt8_m1
;
fr
=
filt8_r1
;
fmm
=
filt8_mm1
;
fml
=
filt8_ml1
;
fmr
=
filt8_m1
;
fdcl
=
filt8_dcl1
;
fdcr
=
filt8_dcr1
;
fdclh
=
filt8_dcl1_h
;
fdcrh
=
filt8_dcr1_h
;
break
;
default:
msg
(
"pdsch_channel_estimation: nushift=%d -> ERROR
\n
"
,
nushift
);
return
(
-
1
);
break
;
}
// generate pilot
// generate pilot for gNB port number 1000+p
uint16_t
rb_offset
=
(
bwp_start_subcarrier
-
ue
->
frame_parms
.
first_carrier_offset
)
/
12
;
int
config_type
=
ue
->
dmrs_DownlinkConfig
.
pdsch_dmrs_type
;
nr_pdsch_dmrs_rx
(
ue
,
Ns
,
ue
->
nr_gold_pdsch
[
eNB_offset
][
Ns
][
0
],
&
pilot
[
0
],
1000
,
0
,
nb_rb_pdsch
+
rb_offset
);
uint8_t
config_type
=
ue
->
dmrs_DownlinkConfig
.
pdsch_dmrs_type
;
int8_t
delta
=
get_delta
(
p
,
config_type
);
nr_pdsch_dmrs_rx
(
ue
,
Ns
,
ue
->
nr_gold_pdsch
[
eNB_offset
][
Ns
][
0
],
&
pilot
[
0
],
1000
+
p
,
0
,
nb_rb_pdsch
+
rb_offset
);
if
(
config_type
==
pdsch_dmrs_type1
){
nushift
=
(
p
>>
1
)
&
1
;
ue
->
frame_parms
.
nushift
=
nushift
;
switch
(
delta
)
{
case
0
:
//port 0,1
fl
=
filt8_l0
;
//left interpolation Filter for DMRS config. 1
fm
=
filt8_m0
;
//left middle interpolation Filter
fr
=
filt8_r0
;
//right interpolation Filter
fmm
=
filt8_mm0
;;
//middle middle interpolation Filter
fml
=
filt8_m0
;
//left middle interpolation Filter
fmr
=
filt8_mr0
;
//middle right interpolation Filter
fdcl
=
filt8_dcl0
;
//left DC interpolation Filter (even RB)
fdcr
=
filt8_dcr0
;
//right DC interpolation Filter (even RB)
fdclh
=
filt8_dcl0_h
;
//left DC interpolation Filter (odd RB)
fdcrh
=
filt8_dcr0_h
;
//right DC interpolation Filter (odd RB)
frl
=
NULL
;
frr
=
NULL
;
break
;
case
1
:
//port2,3
fl
=
filt8_l1
;
fm
=
filt8_m1
;
fr
=
filt8_r1
;
fmm
=
filt8_mm1
;
fml
=
filt8_ml1
;
fmr
=
filt8_m1
;
fdcl
=
filt8_dcl1
;
fdcr
=
filt8_dcr1
;
fdclh
=
filt8_dcl1_h
;
fdcrh
=
filt8_dcr1_h
;
frl
=
NULL
;
frr
=
NULL
;
break
;
default:
msg
(
"pdsch_channel_estimation: nushift=%d -> ERROR
\n
"
,
nushift
);
return
(
-
1
);
break
;
}
}
else
{
//pdsch_dmrs_type2
nushift
=
delta
;
ue
->
frame_parms
.
nushift
=
nushift
>>
1
;
//SFN:fixMe IT MUST BE WITHOUT >>1
switch
(
delta
)
{
case
0
:
//port 0,1
fl
=
filt8_l2
;
//left interpolation Filter should be fml
fr
=
filt8_r2
;
//right interpolation Filter should be fmr
fm
=
filt8_l2
;
fmm
=
filt8_r2
;
fml
=
filt8_ml2
;
fmr
=
filt8_mr2
;
frl
=
filt8_rl2
;
frr
=
filt8_rm2
;
fdcl
=
filt8_dcl1
;
fdcr
=
filt8_dcr1
;
fdclh
=
filt8_dcl1_h
;
fdcrh
=
filt8_dcr1_h
;
break
;
case
2
:
//port2,3
fl
=
filt8_l3
;
fm
=
filt8_m2
;
fr
=
filt8_r3
;
fmm
=
filt8_mm2
;
fml
=
filt8_l2
;
fmr
=
filt8_r2
;
frl
=
filt8_rl3
;
frr
=
filt8_rr3
;
fdcl
=
NULL
;
fdcr
=
NULL
;
fdclh
=
NULL
;
fdcrh
=
NULL
;
break
;
default:
msg
(
"pdsch_channel_estimation: nushift=%d -> ERROR
\n
"
,
nushift
);
return
(
-
1
);
break
;
}
}
for
(
aarx
=
0
;
aarx
<
ue
->
frame_parms
.
nb_antennas_rx
;
aarx
++
)
{
pil
=
(
int16_t
*
)
&
pilot
[
rb_offset
*
((
config_type
==
pdsch_dmrs_type1
)
?
6
:
4
)];
k
=
k
%
ue
->
frame_parms
.
ofdm_symbol_size
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
k
+
nushift
)];
dl_ch
=
(
int16_t
*
)
&
dl_ch_estimates
[
aarx
][
ch_offset
];
re_offset
=
k
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
re_offset
+
nushift
)];
dl_ch
=
(
int16_t
*
)
&
dl_ch_estimates
[
p
*
ue
->
frame_parms
.
nb_antennas_rx
+
aarx
][
ch_offset
];
memset
(
dl_ch
,
0
,
4
*
(
ue
->
frame_parms
.
ofdm_symbol_size
));
if
(
ue
->
high_speed_flag
==
0
)
// multiply previous channel estimate by ch_est_alpha
...
...
@@ -737,7 +785,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
printf
(
"rxF addr %p p %d
\n
"
,
rxF
,
p
);
printf
(
"dl_ch addr %p nushift %d
\n
"
,
dl_ch
,
nushift
);
#endif
//if ((ue->frame_parms.N_RB_DL&1)==0) {
if
(
config_type
==
pdsch_dmrs_type1
)
{
// Treat first 2 pilots specially (left edge)
ch
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
...
...
@@ -867,7 +916,6 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
ch
,
dl_ch
,
8
);
//}
// check if PRB crosses DC and improve estimates around DC
if
((
bwp_start_subcarrier
<
ue
->
frame_parms
.
ofdm_symbol_size
)
&&
(
bwp_start_subcarrier
+
nb_rb_pdsch
*
12
>=
ue
->
frame_parms
.
ofdm_symbol_size
))
{
...
...
@@ -920,20 +968,229 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
dl_ch
,
8
);
}
}
}
else
{
//pdsch_dmrs_type2 |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0|
// Treat first 4 pilots specially (left edge)
ch_l
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
ch_l
[
1
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
1
]
+
(
int32_t
)
pil
[
1
]
*
rxF
[
0
])
>>
15
);
#ifdef DEBUG_PDSCH
dl_ch
=
(
int16_t
*
)
&
dl_ch_estimates
[
aarx
][
ch_offset
];
for
(
uint16_t
idxP
=
0
;
idxP
<
ceil
((
float
)
nb_rb_pdsch
*
12
/
8
);
idxP
++
)
{
for
(
uint8_t
idxI
=
0
;
idxI
<
16
;
idxI
+=
2
)
{
printf
(
"%d
\t
%d
\t
"
,
dl_ch
[
idxP
*
16
+
idxI
],
dl_ch
[
idxP
*
16
+
idxI
+
1
]);
}
printf
(
"%d
\n
"
,
idxP
);
printf
(
"ch 0 %d
\n
"
,((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
]));
printf
(
"pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d)
\n
"
,
rxF
[
0
],
rxF
[
1
],
&
rxF
[
0
],
ch_l
[
0
],
ch_l
[
1
],
pil
[
0
],
pil
[
1
]);
#endif
pil
+=
2
;
re_offset
=
(
re_offset
+
1
)
%
ue
->
frame_parms
.
ofdm_symbol_size
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
nushift
+
re_offset
)];
ch_r
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
ch_r
[
1
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
1
]
+
(
int32_t
)
pil
[
1
]
*
rxF
[
0
])
>>
15
);
ch
[
0
]
=
(
ch_l
[
0
]
+
ch_r
[
0
])
>>
1
;
ch
[
1
]
=
(
ch_l
[
1
]
+
ch_r
[
1
])
>>
1
;
dl_ch
[(
0
+
2
*
nushift
)]
=
ch
[
0
];
dl_ch
[(
1
+
2
*
nushift
)]
=
ch
[
1
];
dl_ch
[
2
+
2
*
nushift
]
=
ch
[
0
];
dl_ch
[
3
+
2
*
nushift
]
=
ch
[
1
];
multadd_real_vector_complex_scalar
(
fl
,
ch
,
dl_ch
,
8
);
pil
+=
2
;
re_offset
=
(
re_offset
+
5
)
%
ue
->
frame_parms
.
ofdm_symbol_size
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
nushift
+
re_offset
)];
ch_l
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
ch_l
[
1
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
1
]
+
(
int32_t
)
pil
[
1
]
*
rxF
[
0
])
>>
15
);
pil
+=
2
;
re_offset
=
(
re_offset
+
1
)
%
ue
->
frame_parms
.
ofdm_symbol_size
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
nushift
+
re_offset
)];
ch_r
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
ch_r
[
1
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
1
]
+
(
int32_t
)
pil
[
1
]
*
rxF
[
0
])
>>
15
);
ch
[
0
]
=
(
ch_l
[
0
]
+
ch_r
[
0
])
>>
1
;
ch
[
1
]
=
(
ch_l
[
1
]
+
ch_r
[
1
])
>>
1
;
multadd_real_vector_complex_scalar
(
fr
,
ch
,
dl_ch
,
8
);
dl_ch
+=
12
;
dl_ch
[
0
+
2
*
nushift
]
=
ch
[
0
];
dl_ch
[
1
+
2
*
nushift
]
=
ch
[
1
];
dl_ch
[
2
+
2
*
nushift
]
=
ch
[
0
];
dl_ch
[
3
+
2
*
nushift
]
=
ch
[
1
];
dl_ch
+=
4
;
for
(
pilot_cnt
=
4
;
pilot_cnt
<
4
*
nb_rb_pdsch
;
pilot_cnt
+=
4
)
{
multadd_real_vector_complex_scalar
(
fml
,
ch
,
dl_ch
,
8
);
pil
+=
2
;
re_offset
=
(
re_offset
+
5
)
%
ue
->
frame_parms
.
ofdm_symbol_size
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
nushift
+
re_offset
)];
ch_l
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
ch_l
[
1
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
1
]
+
(
int32_t
)
pil
[
1
]
*
rxF
[
0
])
>>
15
);
#ifdef DEBUG_PDSCH
printf
(
"pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d)
\n
"
,
pilot_cnt
,
rxF
[
0
],
rxF
[
1
],
ch_l
[
0
],
ch_l
[
1
],
pil
[
0
],
pil
[
1
]);
#endif
pil
+=
2
;
re_offset
=
(
re_offset
+
1
)
%
ue
->
frame_parms
.
ofdm_symbol_size
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
nushift
+
re_offset
)];
ch_r
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
ch_r
[
1
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
1
]
+
(
int32_t
)
pil
[
1
]
*
rxF
[
0
])
>>
15
);
ch
[
0
]
=
(
ch_l
[
0
]
+
ch_r
[
0
])
>>
1
;
ch
[
1
]
=
(
ch_l
[
1
]
+
ch_r
[
1
])
>>
1
;
#ifdef DEBUG_PDSCH
printf
(
"pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d)
\n
"
,
pilot_cnt
+
1
,
rxF
[
0
],
rxF
[
1
],
ch_r
[
0
],
ch_r
[
1
],
pil
[
0
],
pil
[
1
]);
#endif
multadd_real_vector_complex_scalar
(
fmr
,
ch
,
dl_ch
,
8
);
dl_ch
+=
8
;
dl_ch
[
0
+
2
*
nushift
]
=
ch
[
0
];
dl_ch
[
1
+
2
*
nushift
]
=
ch
[
1
];
dl_ch
[
2
+
2
*
nushift
]
=
ch
[
0
];
dl_ch
[
3
+
2
*
nushift
]
=
ch
[
1
];
multadd_real_vector_complex_scalar
(
fm
,
ch
,
dl_ch
,
8
);
pil
+=
2
;
re_offset
=
(
re_offset
+
5
)
%
ue
->
frame_parms
.
ofdm_symbol_size
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
nushift
+
re_offset
)];
ch_l
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
ch_l
[
1
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
1
]
+
(
int32_t
)
pil
[
1
]
*
rxF
[
0
])
>>
15
);
pil
+=
2
;
re_offset
=
(
re_offset
+
1
)
%
ue
->
frame_parms
.
ofdm_symbol_size
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
nushift
+
re_offset
)];
ch_r
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
ch_r
[
1
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
1
]
+
(
int32_t
)
pil
[
1
]
*
rxF
[
0
])
>>
15
);
#ifdef DEBUG_PDSCH
printf
(
"pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d)
\n
"
,
pilot_cnt
+
1
,
rxF
[
0
],
rxF
[
1
],
ch_r
[
0
],
ch_r
[
1
],
pil
[
0
],
pil
[
1
]);
#endif
ch
[
0
]
=
(
ch_l
[
0
]
+
ch_r
[
0
])
>>
1
;
ch
[
1
]
=
(
ch_l
[
1
]
+
ch_r
[
1
])
>>
1
;
multadd_real_vector_complex_scalar
(
fmm
,
ch
,
dl_ch
,
8
);
dl_ch
+=
12
;
dl_ch
[
0
+
2
*
nushift
]
=
ch
[
0
];
dl_ch
[
1
+
2
*
nushift
]
=
ch
[
1
];
dl_ch
[
2
+
2
*
nushift
]
=
ch
[
0
];
dl_ch
[
3
+
2
*
nushift
]
=
ch
[
1
];
dl_ch
+=
4
;
}
// Treat last 2 pilots specially (right edge)
// dl_ch-2+nushift<<1
multadd_real_vector_complex_scalar
(
frl
,
dl_ch
-
2
+
2
*
nushift
,
dl_ch
,
8
);
multadd_real_vector_complex_scalar
(
frr
,
dl_ch
-
14
+
2
*
nushift
,
/*14*/
dl_ch
,
8
);
// check if PRB crosses DC and improve estimates around DC
if
((
bwp_start_subcarrier
<
ue
->
frame_parms
.
ofdm_symbol_size
)
&&
(
bwp_start_subcarrier
+
nb_rb_pdsch
*
12
>=
ue
->
frame_parms
.
ofdm_symbol_size
)
&&
(
p
<
2
))
{
dl_ch
=
(
int16_t
*
)
&
dl_ch_estimates
[
p
*
ue
->
frame_parms
.
nb_antennas_rx
+
aarx
][
ch_offset
];
uint16_t
idxDC
=
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
-
bwp_start_subcarrier
);
dl_ch
+=
(
idxDC
-
8
);
dl_ch
=
memset
(
dl_ch
,
0
,
sizeof
(
int16_t
)
*
20
);
dl_ch
-=
2
;
ch_r
[
0
]
=
dl_ch
[
0
];
ch_r
[
1
]
=
dl_ch
[
1
]
;
dl_ch
+=
22
;
ch_l
[
0
]
=
dl_ch
[
0
];
ch_l
[
1
]
=
dl_ch
[
1
]
;
// for proper allignment of SIMD vectors
if
((
ue
->
frame_parms
.
N_RB_DL
&
1
)
==
0
)
{
dl_ch
-=
20
;
//Interpolate fdcrl1 with ch_r
multadd_real_vector_complex_scalar
(
filt8_dcrl1
,
ch_r
,
dl_ch
,
8
);
//Interpolate fdclh1 with ch_l
multadd_real_vector_complex_scalar
(
filt8_dclh1
,
ch_l
,
dl_ch
,
8
);
dl_ch
+=
16
;
//Interpolate fdcrh1 with ch_r
multadd_real_vector_complex_scalar
(
filt8_dcrh1
,
ch_r
,
dl_ch
,
8
);
//Interpolate fdcll1 with ch_l
multadd_real_vector_complex_scalar
(
filt8_dcll1
,
ch_l
,
dl_ch
,
8
);
}
else
{
dl_ch
-=
28
;
//Interpolate fdcrl1 with ch_r
multadd_real_vector_complex_scalar
(
filt8_dcrl2
,
ch_r
,
dl_ch
,
8
);
//Interpolate fdclh1 with ch_l
multadd_real_vector_complex_scalar
(
filt8_dclh2
,
ch_l
,
dl_ch
,
8
);
dl_ch
+=
16
;
//Interpolate fdcrh1 with ch_r
multadd_real_vector_complex_scalar
(
filt8_dcrh2
,
ch_r
,
dl_ch
,
8
);
//Interpolate fdcll1 with ch_l
multadd_real_vector_complex_scalar
(
filt8_dcll2
,
ch_l
,
dl_ch
,
8
);
}
}
}
#endif
}
#ifdef DEBUG_PDSCH
dl_ch
=
(
int16_t
*
)
&
dl_ch_estimates
[
p
*
ue
->
frame_parms
.
nb_antennas_rx
+
aarx
][
ch_offset
];
for
(
uint16_t
idxP
=
0
;
idxP
<
ceil
((
float
)
nb_rb_pdsch
*
12
/
8
);
idxP
++
)
{
for
(
uint8_t
idxI
=
0
;
idxI
<
16
;
idxI
+=
2
)
{
printf
(
"%d
\t
%d
\t
"
,
dl_ch
[
idxP
*
16
+
idxI
],
dl_ch
[
idxP
*
16
+
idxI
+
1
]);
}
printf
(
"%d
\n
"
,
idxP
);
}
#endif
}
return
(
0
);
}
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