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
zzha zzha
OpenXG-RAN
Commits
cf4a005e
Commit
cf4a005e
authored
Sep 09, 2015
by
Xiwen JIANG
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Beamforming channel estimation based on UE specific reference signal
parent
5adc20ca
Changes
16
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
915 additions
and
222 deletions
+915
-222
openair1/PHY/INIT/lte_init.c
openair1/PHY/INIT/lte_init.c
+2
-2
openair1/PHY/LTE_ESTIMATION/bf_freq_domain_filters.m
openair1/PHY/LTE_ESTIMATION/bf_freq_domain_filters.m
+20
-20
openair1/PHY/LTE_ESTIMATION/defs.h
openair1/PHY/LTE_ESTIMATION/defs.h
+0
-1
openair1/PHY/LTE_ESTIMATION/filt12_32.h
openair1/PHY/LTE_ESTIMATION/filt12_32.h
+14
-0
openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c
openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c
+650
-34
openair1/PHY/LTE_REFSIG/defs.h
openair1/PHY/LTE_REFSIG/defs.h
+6
-2
openair1/PHY/LTE_REFSIG/lte_dl_ue_spec.c
openair1/PHY/LTE_REFSIG/lte_dl_ue_spec.c
+66
-59
openair1/PHY/LTE_REFSIG/lte_dl_uespec.c
openair1/PHY/LTE_REFSIG/lte_dl_uespec.c
+0
-0
openair1/PHY/LTE_REFSIG/lte_gold.c
openair1/PHY/LTE_REFSIG/lte_gold.c
+26
-26
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
+57
-26
openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
+35
-31
openair1/PHY/LTE_TRANSPORT/pilots_ue_spec.c
openair1/PHY/LTE_TRANSPORT/pilots_ue_spec.c
+2
-2
openair1/PHY/LTE_TRANSPORT/proto.h
openair1/PHY/LTE_TRANSPORT/proto.h
+2
-0
openair1/PHY/MODULATION/slot_fep.c
openair1/PHY/MODULATION/slot_fep.c
+16
-8
openair1/PHY/defs.h
openair1/PHY/defs.h
+2
-2
openair1/SIMULATION/LTE_PHY/dlsim.c
openair1/SIMULATION/LTE_PHY/dlsim.c
+17
-9
No files found.
openair1/PHY/INIT/lte_init.c
View file @
cf4a005e
...
...
@@ -948,8 +948,8 @@ void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS
pdsch
->
rxdataF_uespec_pilots
[
idx
]
=
(
int32_t
*
)
malloc16_clear
(
sizeof
(
int32_t
)
*
frame_parms
->
N_RB_DL
*
12
);
pdsch
->
rxdataF_comp0
[
idx
]
=
(
int32_t
*
)
malloc16_clear
(
sizeof
(
int32_t
)
*
num
);
pdsch
->
dl_ch_estimates_ext
[
idx
]
=
(
int32_t
*
)
malloc16_clear
(
sizeof
(
int32_t
)
*
num
);
pdsch
->
dl_bf_ch_estimates
[
idx
]
=
(
int32_t
*
)
malloc16_clear
(
sizeof
(
int32_t
)
*
num
);
pdsch
->
dl_bf_ch_estimates_ext
[
idx
]
=
(
int32_t
*
)
malloc16_clear
(
sizeof
(
int32_t
)
*
frame_parms
->
symbols_per_tti
*
(
frame_parms
->
ofdm_symbol_size
+
LTE_CE_FILTER_LENGTH
)
);
pdsch
->
dl_bf_ch_estimates
[
idx
]
=
(
int32_t
*
)
malloc16_clear
(
sizeof
(
int32_t
)
*
frame_parms
->
ofdm_symbol_size
*
7
*
2
);
pdsch
->
dl_bf_ch_estimates_ext
[
idx
]
=
(
int32_t
*
)
malloc16_clear
(
sizeof
(
int32_t
)
*
num
);
pdsch
->
dl_ch_rho_ext
[
idx
]
=
(
int32_t
*
)
malloc16_clear
(
sizeof
(
int32_t
)
*
num
);
pdsch
->
dl_ch_rho2_ext
[
idx
]
=
(
int32_t
*
)
malloc16_clear
(
sizeof
(
int32_t
)
*
num
);
pdsch
->
dl_ch_mag0
[
idx
]
=
(
int32_t
*
)
malloc16_clear
(
sizeof
(
int32_t
)
*
num
);
...
...
openair1/PHY/LTE_ESTIMATION/bf_freq_domain_filters.m
View file @
cf4a005e
filt
er_length = 12
;
filt
_len = 16
;
F = -3/4:1/4:7/4;
F_l = zeros(8,
12
);
F_r = zeros(8,
12
);
F_m = zeros(8,
12
);
F_l = zeros(8,
filt_len
);
F_r = zeros(8,
filt_len
);
F_m = zeros(8,
filt_len
);
F2 =-3/5:1/5:8/5;
for i=0:3
F_l(i+1,:) = floor(16384*[F(8+i:-1:4) zeros(1,7-i)]);
F_r(i+1,:) = floor(16384*[zeros(1,4+i) F(4:end-i)]);
F_m(i+1,:) = floor(16384*[F(4-i:8) F(7:-1:1+i)]);
F_l(i+1,:) = floor(16384*[F(8+i:-1:4) zeros(1,7-i)
zeros(1,4)
]);
F_r(i+1,:) = floor(16384*[zeros(1,4+i) F(4:end-i)
zeros(1,4)
]);
F_m(i+1,:) = floor(16384*[F(4-i:8) F(7:-1:1+i)
zeros(1,4)
]);
end
for i=0:1
F_l(i+5,:) = floor(16384*[F(8:-1:4-i) zeros(1,7-i)]);
F_r(i+5,:) = floor(16384*[zeros(1,5+i) F2(5+i) F2(7:end-i)]);
F_m(i+5,:) = floor(16384*[F(4-i:8) F2(8-i) F2(6:-1:1+i)]);
F_l(i+5,:) = floor(16384*[F(8:-1:4-i) zeros(1,7-i)
zeros(1,4)
]);
F_r(i+5,:) = floor(16384*[zeros(1,5+i) F2(5+i) F2(7:end-i)
zeros(1,4)
]);
F_m(i+5,:) = floor(16384*[F(4-i:8) F2(8-i) F2(6:-1:1+i)
zeros(1,4)
]);
end
for i=2:3
F_l(i+5,:) = floor(16384*[F2(end:-1:7) F2(8-i) zeros(1,5)]);
F_r(i+5,:) = floor(16384*[zeros(1,4+i) F(4:end-i)]);
F_m(i+5,:) = floor(16384*[F2(4-i:6) F2(4+i) F(8:-1:1+i)]);
F_l(i+5,:) = floor(16384*[F2(end:-1:7) F2(8-i) zeros(1,5)
zeros(1,4)
]);
F_r(i+5,:) = floor(16384*[zeros(1,4+i) F(4:end-i)
zeros(1,4)
]);
F_m(i+5,:) = floor(16384*[F2(4-i:6) F2(4+i) F(8:-1:1+i)
zeros(1,4)
]);
end
fd = fopen("filt1
2
_32.h","w");
fd = fopen("filt1
6
_32.h","w");
for i=0:3
fprintf(fd,"short filt
12_l%d[12] = {\n",i
);
fprintf(fd,"short filt
%d_l%d[%d] = {\n",filt_len,i,filt_len
);
fprintf(fd,"%d,",F_l(i+1,1:end-1));
fprintf(fd,"%d};\n\n",F_l(i+1,end));
fprintf(fd,"short filt
12_r%d[12] = {\n",i
);
fprintf(fd,"short filt
%d_r%d[%d] = {\n",filt_len,i,filt_len
);
fprintf(fd,"%d,",F_r(i+1,1:end-1));
fprintf(fd,"%d};\n\n",F_r(i+1,end));
fprintf(fd,"short filt
12_m%d[12] = {\n",i
);
fprintf(fd,"short filt
%d_m%d[%d] = {\n",filt_len,i,filt_len
);
fprintf(fd,"%d,",F_m(i+1,1:end-1));
fprintf(fd,"%d};\n\n",F_m(i+1,end));
end
for i=0:3
fprintf(fd,"short filt
12_l%d_dc[12] = {\n",i
);
fprintf(fd,"short filt
%d_l%d_dc[%d] = {\n",filt_len,i,filt_len
);
fprintf(fd,"%d,",F_l(i+5,1:end-1));
fprintf(fd,"%d};\n\n",F_l(i+5,end));
fprintf(fd,"short filt
12_r%d_dc[12] = {\n",i
);
fprintf(fd,"short filt
%d_r%d_dc[%d] = {\n",filt_len,i,filt_len
);
fprintf(fd,"%d,",F_r(i+5,1:end-1));
fprintf(fd,"%d};\n\n",F_r(i+5,end));
fprintf(fd,"short filt
12_m%d_dc[12] = {\n",i
);
fprintf(fd,"short filt
%d_m%d_dc[%d] = {\n",filt_len,i,filt_len
);
fprintf(fd,"%d,",F_m(i+5,1:end-1));
fprintf(fd,"%d};\n\n",F_m(i+5,end));
end
...
...
openair1/PHY/LTE_ESTIMATION/defs.h
View file @
cf4a005e
...
...
@@ -123,7 +123,6 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
uint8_t
l
,
uint8_t
symbol
);
int
lte_dl_bf_channel_estimation
(
PHY_VARS_UE
*
phy_vars_ue
,
module_id_t
eNB_id
,
uint8_t
eNB_offset
,
...
...
openair1/PHY/LTE_ESTIMATION/filt12_32.h
View file @
cf4a005e
...
...
@@ -70,3 +70,17 @@ short filt12_r3_dc[12] = {
short
filt12_m3_dc
[
12
]
=
{
-
9831
,
-
6554
,
-
3277
,
0
,
3276
,
6553
,
9830
,
16384
,
12288
,
8192
,
4096
,
0
};
short
filt12_1
[
12
]
=
{
16384
,
16384
,
16384
,
16384
,
16384
,
16384
,
16384
,
16384
,
16384
,
16384
,
16384
,
16384
};
short
filt12_2l0
[
12
]
=
{
16384
,
12288
,
8192
,
4096
,
-
4096
,
0
,
0
,
0
,
0
,
0
,
0
,
0
};
short
filt12_2r0
[
12
]
=
{
0
,
4096
,
8192
,
12288
,
16384
,
20480
,
0
,
0
,
0
,
0
,
0
,
0
};
short
filt12_2l1
[
12
]
=
{
20480
,
16384
,
12288
,
8192
,
4096
,
0
,
0
,
0
,
0
,
0
,
0
,
0
};
short
filt12_2r1
[
12
]
=
{
-
4096
,
0
,
4096
,
8192
,
12288
,
16384
,
0
,
0
,
0
,
0
,
0
,
0
};
openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c
View file @
cf4a005e
This diff is collapsed.
Click to expand it.
openair1/PHY/LTE_REFSIG/defs.h
View file @
cf4a005e
...
...
@@ -54,6 +54,8 @@ void lte_gold(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_table[20][2][14]
void
lte_gold_ue_spec
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint32_t
lte_gold_uespec_table
[
2
][
20
][
2
][
21
],
uint16_t
Nid_cell
,
uint16_t
*
n_idDMRS
);
void
lte_gold_ue_spec_port5
(
uint32_t
lte_gold_uespec_port5_table
[
20
][
38
],
uint16_t
Nid_cell
,
uint16_t
n_rnti
);
/*!\brief This function generates the LTE Gold sequence (36-211, Sec 7.2), specifically for DL UE-specific reference signals for antenna ports 7..14.
@param frame_parms LTE DL Frame parameters
@param lte_gold_uespec_table pointer to table where sequences are stored
...
...
@@ -96,7 +98,7 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
uint8_t
Ns
,
uint8_t
lprime
,
uint8_t
p
,
int
SS_flag
);
int
SS_flag
);
/*! \brief This function generates the MBSFN reference signal sequence (36-211, Sec 6.10.1.2)
@param phy_vars_eNB Pointer to eNB variables
...
...
@@ -130,7 +132,9 @@ int lte_dl_ue_spec_rx(PHY_VARS_UE *phy_vars_ue,
mod_sym_t
*
output
,
unsigned
char
Ns
,
unsigned
char
p
,
int
SS_flag
);
int
lprime
,
int
SS_flag
,
uint16_t
nRB_PDSCH
);
int
lte_dl_mbsfn_rx
(
PHY_VARS_UE
*
phy_vars_ue
,
int
*
output
,
...
...
openair1/PHY/LTE_REFSIG/lte_dl_ue_spec.c
View file @
cf4a005e
...
...
@@ -59,12 +59,12 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
uint8_t
Ns
,
uint8_t
lprime
,
uint8_t
p
,
int
SS_flag
)
int
SS_flag
)
{
mod_sym_t
qpsk
[
4
],
nqpsk
[
4
];
/*
mod_sym_t qpsk[4],nqpsk[4];
int16_t k=0,a;
int
mprime
,
mprime_dword
,
mprime
_qpsk_symb
;
int mprime,
ind,ind_dword,ind
_qpsk_symb;
unsigned nushift,kprime;
// LTE_eNB_DLSCH_t *dlsch = phy_vars_eNB->dlsch_eNB[UE_id][0];
...
...
@@ -103,12 +103,13 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
k = kprime+phy_vars_eNB->lte_frame_parms.first_carrier_offset;
printf("lte_dl_ue_spec:k=%d\n",k);
for
(
mprime
=
0
;
mprime
<
3
*
phy_vars_eNB
->
lte_frame_parms
.
N_RB_DL
-
1
;
mprime
++
)
{
mprime_dword
=
mprime
>>
4
;
mprime_qpsk_symb
=
mprime
&
0xf
;
for (mprime=0;mprime<3*nRB_PDSCH-1;mprime++) {
ind = 3*lprime*nRB_PDSCH+mprime;
ind_dword = ind>>4;
ind_qpsk_symb = ind&0xf;
//output[k] = qpsk[(phy_vars_eNB->lte_gold_uespec_port5_table[0][Ns][lprime
][ind_dword]>>(2*ind_qpsk_symb))&3];
output
[
k
]
=
0xffffffff
;
output[k] = qpsk[(phy_vars_UE->lte_gold_uespec_port5_table[Ns
][ind_dword]>>(2*ind_qpsk_symb))&3];
//
output[k] = 0xffffffff;
k += 4;
if (k >= phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) {
...
...
@@ -125,19 +126,21 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
LOG_E(PHY,"Illegal p %d UE specific pilots\n",p);
}
return
(
0
);
return(0);
*/
}
int
lte_dl_ue_spec_rx
(
PHY_VARS_UE
*
phy_vars_ue
,
mod_sym_t
*
output
,
unsigned
char
Ns
,
unsigned
char
p
,
int
SS_flag
)
mod_sym_t
*
output
,
unsigned
char
Ns
,
unsigned
char
p
,
int
lprime
,
int
SS_flag
,
uint16_t
nRB_PDSCH
)
{
mod_sym_t
qpsk
[
4
],
nqpsk
[
4
],
*
qpsk_p
,
*
output_p
;
int16_t
a
;
int
w
,
lprime
,
mprime
,
ind
,
l
,
ind_dword
,
ind_qpsk_symb
,
nPRB
;
int
w
,
mprime
,
ind
,
l
,
ind_dword
,
ind_qpsk_symb
,
nPRB
;
short
pamp
;
// Compute the correct pilot amplitude, sqrt_rho_b = Q3.13
...
...
@@ -169,7 +172,7 @@ int lte_dl_ue_spec_rx(PHY_VARS_UE *phy_vars_ue,
output_p
=
output
;
for
(
lprime
=
0
;
lprime
<
2
;
lprime
++
)
{
//
for (lprime=0; lprime<2; lprime++) {
ind
=
3
*
lprime
*
phy_vars_ue
->
lte_frame_parms
.
N_RB_DL
;
l
=
lprime
+
((
Ns
&
1
)
<<
1
);
...
...
@@ -288,25 +291,29 @@ int lte_dl_ue_spec_rx(PHY_VARS_UE *phy_vars_ue,
output_p
++
;
ind
++
;
}
}
//
}
}
else
{
LOG_E
(
PHY
,
"Special subframe not supported for UE specific pilots yet
\n
"
);
}
}
}
else
if
(
p
==
5
)
{
if
(
SS_flag
==
0
)
{
if
(
phy_vars_ue
->
lte_frame_parms
.
Ncp
==
NORMAL
)
{
for
(
lprime
=
0
;
lprime
<
2
;
lprime
++
)
{
ind
=
3
*
lprime
*
phy_vars_ue
->
lte_frame_parms
.
N_RB_DL
;
for
(
mprime
=
0
;
mprime
<
3
*
phy_vars_ue
->
lte_frame_parms
.
N_RB_DL
-
1
;
mprime
++
)
{
ind_dword
=
ind
>>
4
;
ind_qpsk_symb
=
ind
&
0xf
;
*
output_p
=
qpsk_p
[(
phy_vars_ue
->
lte_gold_uespec_port5_table
[
Ns
][
lprime
][
ind_dword
]
>>
(
2
*
ind_qpsk_symb
))
&
3
];
*
output_p
++
;
}
output_p
=
output
;
if
(
phy_vars_ue
->
lte_frame_parms
.
Ncp
==
NORMAL
)
{
//for (lprime=0;lprime<4;lprime++) {
for
(
mprime
=
0
;
mprime
<
3
*
nRB_PDSCH
;
mprime
++
)
{
ind
=
3
*
lprime
*
nRB_PDSCH
+
mprime
;
ind_dword
=
ind
>>
4
;
ind_qpsk_symb
=
ind
&
0xf
;
*
output_p
=
qpsk
[(
phy_vars_ue
->
lte_gold_uespec_port5_table
[
Ns
][
ind_dword
]
>>
(
2
*
ind_qpsk_symb
))
&
3
];
//printf("lprime=%d,ind=%d,Ns=%d,output_p=(%d,%d)\n",lprime,ind,Ns,((short *)&output_p[0])[0],((short *)&output_p[0])[1]);
*
output_p
++
;
}
// }
}
}
}
else
{
...
...
@@ -343,44 +350,44 @@ main()
lte_gold
(
Nid_cell
,
Ncp
);
lte_dl_ue_spec
(
output00
,
ONE_OVER_SQRT2_Q15
,
50
,
Nid_cell
,
Ncp
,
0
,
0
,
0
,
0
);
ONE_OVER_SQRT2_Q15
,
50
,
Nid_cell
,
Ncp
,
0
,
0
,
0
,
0
);
lte_dl_ue_spec
(
output10
,
ONE_OVER_SQRT2_Q15
,
50
,
Nid_cell
,
Ncp
,
0
,
1
,
0
,
0
);
ONE_OVER_SQRT2_Q15
,
50
,
Nid_cell
,
Ncp
,
0
,
1
,
0
,
0
);
lte_dl_ue_spec
(
output01
,
ONE_OVER_SQRT2_Q15
,
50
,
Nid_cell
,
Ncp
,
0
,
0
,
1
,
0
);
ONE_OVER_SQRT2_Q15
,
50
,
Nid_cell
,
Ncp
,
0
,
0
,
1
,
0
);
lte_dl_ue_spec
(
output11
,
ONE_OVER_SQRT2_Q15
,
50
,
Nid_cell
,
Ncp
,
0
,
1
,
1
,
0
);
ONE_OVER_SQRT2_Q15
,
50
,
Nid_cell
,
Ncp
,
0
,
1
,
1
,
0
);
write_output
(
"dl_ue_spec00.m"
,
"dl_cs00"
,
output00
,
1024
,
1
,
1
);
...
...
openair1/PHY/LTE_REFSIG/lte_dl_uespec.c
deleted
100644 → 0
View file @
5adc20ca
openair1/PHY/LTE_REFSIG/lte_gold.c
View file @
cf4a005e
...
...
@@ -142,7 +142,7 @@ void lte_gold_ue_spec(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_uespec_t
}
}
void
lte_gold_ue_spec_port5
(
uint32_t
lte_gold_uespec_port5_table
[
20
][
2
][
21
],
uint16_t
Nid_cell
,
uint16_t
n_rnti
)
void
lte_gold_ue_spec_port5
(
uint32_t
lte_gold_uespec_port5_table
[
20
][
38
],
uint16_t
Nid_cell
,
uint16_t
n_rnti
)
{
unsigned
char
ns
,
l
;
...
...
@@ -151,36 +151,36 @@ void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][2][21],uint
for
(
ns
=
0
;
ns
<
20
;
ns
++
)
{
for
(
l
=
0
;
l
<
2
;
l
++
)
{
//
for (l=0; l<2; l++) {
x2
=
((((
ns
>>
1
)
+
1
)
*
((
Nid_cell
<<
1
)
+
1
))
<<
16
)
+
n_rnti
;
//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
);
x2
=
x2
^
((
x2
^
(
x2
>>
1
)
^
(
x2
>>
2
)
^
(
x2
>>
3
))
<<
31
);
x2
=
((((
ns
>>
1
)
+
1
)
*
((
Nid_cell
<<
1
)
+
1
))
<<
16
)
+
n_rnti
;
//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
);
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);
for
(
n
=
1
;
n
<
50
;
n
++
)
{
x1
=
(
x1
>>
1
)
^
(
x1
>>
4
);
x1
=
x1
^
(
x1
<<
31
)
^
(
x1
<<
28
);
x2
=
(
x2
>>
1
)
^
(
x2
>>
2
)
^
(
x2
>>
3
)
^
(
x2
>>
4
);
x2
=
x2
^
(
x2
<<
31
)
^
(
x2
<<
30
)
^
(
x2
<<
29
)
^
(
x2
<<
28
);
// printf("x1 : %x, x2 : %x\n",x1,x2);
}
for
(
n
=
0
;
n
<
14
;
n
++
)
{
x1
=
(
x1
>>
1
)
^
(
x1
>>
4
);
x1
=
x1
^
(
x1
<<
31
)
^
(
x1
<<
28
);
x2
=
(
x2
>>
1
)
^
(
x2
>>
2
)
^
(
x2
>>
3
)
^
(
x2
>>
4
);
x2
=
x2
^
(
x2
<<
31
)
^
(
x2
<<
30
)
^
(
x2
<<
29
)
^
(
x2
<<
28
);
lte_gold_uespec_port5_table
[
ns
][
l
][
n
]
=
x1
^
x2
;
// printf("n=%d : c %x\n",n,x1^x2);
}
// skip first 50 double words (1600 bits)
//printf("n=0 : x1 %x, x2 %x\n",x1,x2);
for
(
n
=
1
;
n
<
50
;
n
++
)
{
x1
=
(
x1
>>
1
)
^
(
x1
>>
4
);
x1
=
x1
^
(
x1
<<
31
)
^
(
x1
<<
28
);
x2
=
(
x2
>>
1
)
^
(
x2
>>
2
)
^
(
x2
>>
3
)
^
(
x2
>>
4
);
x2
=
x2
^
(
x2
<<
31
)
^
(
x2
<<
30
)
^
(
x2
<<
29
)
^
(
x2
<<
28
);
// printf("x1 : %x, x2 : %x\n",x1,x2);
}
for
(
n
=
0
;
n
<
38
;
n
++
)
{
x1
=
(
x1
>>
1
)
^
(
x1
>>
4
);
x1
=
x1
^
(
x1
<<
31
)
^
(
x1
<<
28
);
x2
=
(
x2
>>
1
)
^
(
x2
>>
2
)
^
(
x2
>>
3
)
^
(
x2
>>
4
);
x2
=
x2
^
(
x2
<<
31
)
^
(
x2
<<
30
)
^
(
x2
<<
29
)
^
(
x2
<<
28
);
lte_gold_uespec_port5_table
[
ns
][
n
]
=
x1
^
x2
;
// printf("n=%d : c %x\n",n,x1^x2);
}
// }
}
}
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
View file @
cf4a005e
This diff is collapsed.
Click to expand it.
openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
View file @
cf4a005e
...
...
@@ -71,13 +71,13 @@ uint8_t is_not_pilot(uint8_t pilots, uint8_t re, uint8_t nushift, uint8_t use2nd
}
//uint8_t is_not_UEspecRS(int first_layer,int re)
uint8_t
is_not_UEspecRS
(
u
int8_t
lprime
,
uint8_t
re
,
uint8_t
nushift
,
uint8_t
Ncp
,
uint8_t
beamforming_mode
)
uint8_t
is_not_UEspecRS
(
int8_t
lprime
,
uint8_t
re
,
uint8_t
nushift
,
uint8_t
Ncp
,
uint8_t
beamforming_mode
)
{
uint8_t
offset
=
(
lprime
==
2
)
?
2
:
0
;
if
(
lprime
==
0
)
uint8_t
offset
=
(
lprime
==
1
||
lprime
==
3
)
?
2
:
0
;
if
(
lprime
==-
1
)
return
(
1
);
switch
(
beamforming_mode
)
{
switch
(
beamforming_mode
)
{
case
7
:
if
(
Ncp
==
NORMAL
){
if
((
re
!=
nushift
+
offset
)
&&
(
re
!=
((
nushift
+
4
+
offset
)
%
12
))
&&
(
re
!=
((
nushift
+
8
+
offset
)
%
12
)))
...
...
@@ -225,7 +225,7 @@ int allocate_REs_in_RB(PHY_VARS_eNB *phy_vars_eNB,
uint8_t
layer
;
int
s
=
1
;
uint8_t
mprime2
=
mprime
,
mprime_dword
,
mprime
_qpsk_symb
;
int
mprime2
=
mprime
,
ind
,
ind_dword
,
ind
_qpsk_symb
;
mod_sym_t
qpsk
[
4
];
gain_lin_QPSK
=
(
int16_t
)((
amp
*
ONE_OVER_SQRT2_Q15
)
>>
15
);
...
...
@@ -1022,12 +1022,13 @@ break;
//printf("precoding UE spec RS\n");
for
(
aa
=
0
;
aa
<
nb_antennas_tx_phy
;
aa
++
)
{
mprime_dword
=
mprime2
>>
4
;
mprime_qpsk_symb
=
mprime2
&
0xf
;
ind
=
3
*
lprime
*
dlsch0_harq
->
nb_rb
+
mprime2
;
ind_dword
=
ind
>>
4
;
ind_qpsk_symb
=
ind
&
0xf
;
tmp_sample1
=
qpsk
[(
phy_vars_eNB
->
lte_gold_uespec_port5_table
[
0
][
Ns
][
lprime
][
mprime_dword
]
>>
(
2
*
mprime_qpsk_symb
))
&
3
];
//printf("tmp_sample1=%d+i%d\n",((int16_t*)&tmp_sample1)[0],((int16_t*)&tmp_sample1)[1]);
//printf("beamforing_weights[%d][%d]=%d+i%d\n",re,aa,((int16_t*)&beamforming_weights[re][aa])[0],((int16_t*)&beamforming_weights[re][aa])[1]);
tmp_sample1
=
qpsk
[(
phy_vars_eNB
->
lte_gold_uespec_port5_table
[
0
][
Ns
][
ind_dword
]
>>
(
2
*
ind_qpsk_symb
))
&
3
];
//printf("lprime=%d,nb_rb=%d,mprime2=%d,ind=%d,Ns=%d,tmp_sample1=(%d,%d)\n",lprime,dlsch0_harq->nb_rb,mprime2,ind,Ns,((int16_t*)&tmp_sample1)[0],((int16_t*)&tmp_sample1)[1]);
((
int16_t
*
)
&
txdataF
[
aa
][
tti_offset
])[
0
]
+=
(
int16_t
)((((
int16_t
*
)
&
tmp_sample1
)[
0
]
*
((
uint16_t
*
)
&
beamforming_weights
[
re
][
aa
])[
0
])
>>
15
);
((
int16_t
*
)
&
txdataF
[
aa
][
tti_offset
])[
0
]
+=-
(
int16_t
)((((
int16_t
*
)
&
tmp_sample1
)[
1
]
*
((
uint16_t
*
)
&
beamforming_weights
[
re
][
aa
])[
1
])
>>
15
);
...
...
@@ -1037,8 +1038,11 @@ break;
// ((int16_t*)&txdataF[aa][tti_offset])[0] = 0xffff;
// ((int16_t*)&txdataF[aa][tti_offset])[1] = 0xffff;
//printf("tmp_sample1=%d+i%d\n",((int16_t*)&tmp_sample1)[0],((int16_t*)&tmp_sample1)[1]);
//printf("beamforing_weights[%d][%d]=%d+i%d\n",re,aa,((int16_t*)&beamforming_weights[re][aa])[0],((int16_t*)&beamforming_weights[re][aa])[1]);
//printf("txdataF[%d][%d]= %d+i%d\n ",aa,tti_offset,((int16_t*)&txdataF[aa][tti_offset])[0],((int16_t*)&txdataF[aa][tti_offset])[1]);
mprime2
=
mprime2
++
;
//printf("**txdataF[%d][%d]= %d+i%d\n ",aa,tti_offset,((int16_t*)&txdataF[aa][tti_offset])[0],((int16_t*)&txdataF[aa][tti_offset])[1]);
}
}
...
...
@@ -1291,7 +1295,8 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
MIMO_mode_t
mimo_mode
=
dlsch0_harq
->
mimo_mode
;
uint8_t
beamforming_mode
=
0
;
int32_t
**
beamforming_weights_RB
=
beamforming_weights
;
uint8_t
lprime
,
mprime
=
0
,
Ns
;
uint8_t
mprime
=
0
,
Ns
;
int8_t
lprime
=-
1
;
#ifdef DEBUG_DLSCH_MODULATION
uint8_t
Nl0
=
dlsch0_harq
->
Nl
;
...
...
@@ -1375,19 +1380,25 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
beamforming_mode
=
7
;
mprime
=
0
;
if
(
frame_parms
->
Ncp
==
0
)
{
// normal prefix
if
((
l
==
6
)
||
(
l
==
12
))
lprime
=
2
;
// pilots in nushift+3, nushift+9
else
if
((
l
==
3
)
||
(
l
==
9
))
lprime
=
1
;
// pilots in nushift, nushift+6
if
(
l
==
12
)
lprime
=
3
;
// pilots in nushift+3, nushift+9
else
if
(
l
==
9
)
lprime
=
2
;
// pilots in nushift, nushift+6
else
if
(
l
==
6
)
lprime
=
1
;
// pilots in nushift+3, nushift+9
else
if
(
l
==
3
)
lprime
=
0
;
// pilots in nushift, nushift+6
else
lprime
=
0
;
lprime
=
-
1
;
}
else
{
if
(
(
l
==
7
)
)
if
(
l
==
10
)
lprime
=
2
;
else
if
(
(
l
==
4
)
||
(
l
==
10
)
)
else
if
(
l
==
7
)
lprime
=
1
;
else
else
if
(
l
==
4
)
lprime
=
0
;
else
lprime
=-
1
;
}
}
else
if
(
mimo_mode
==
TM8
){
beamforming_mode
=
8
;
...
...
@@ -1395,10 +1406,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
beamforming_mode
=
9
;
}
if
(
l
<=
(
nsymb
>>
2
))
Ns
=
0
;
else
Ns
=
1
;
Ns
=
2
*
subframe_offset
+
(
l
>=
(
nsymb
>>
1
));
re_offset
=
frame_parms
->
first_carrier_offset
;
symbol_offset
=
(
uint32_t
)
frame_parms
->
ofdm_symbol_size
*
(
l
+
(
subframe_offset
*
nsymb
));
...
...
@@ -1566,7 +1574,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
qam_table_s1
=
NULL
;
if
(
rb_alloc_ind
>
0
)
{
//
printf("Allocated rb %d/symbol %d, skip_half %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,l,skip_half,subframe_offset,symbol_offset,re_offset,jj);
// printf("Allocated rb %d/symbol %d, skip_half %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,l,skip_half,subframe_offset,symbol_offset,re_offset,jj);
allocate_REs_in_RB
(
phy_vars_eNB
,
txdataF
,
&
jj
,
...
...
@@ -1588,12 +1596,8 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
Ns
,
beamforming_weights_RB
);
if
(
mimo_mode
==
TM7
){
if
(
frame_parms
->
Ncp
==
0
&&
(
l
==
3
||
l
==
6
||
l
==
9
||
l
==
12
))
mprime
+=
3
;
else
if
(
frame_parms
->
Ncp
==
1
&&
(
l
==
4
||
l
==
7
||
l
==
10
))
mprime
+=
4
;
}
if
(
mimo_mode
==
TM7
&&
lprime
>=
0
)
mprime
+=
3
+
frame_parms
->
Ncp
;
}
...
...
openair1/PHY/LTE_TRANSPORT/pilots_ue_spec.c
View file @
cf4a005e
...
...
@@ -48,7 +48,7 @@ void generate_ue_spec_pilots(PHY_VARS_eNB *phy_vars_eNB,
uint8_t
beamforming_mode
)
{
LTE_DL_FRAME_PARMS
*
frame_parms
=
&
phy_vars_eNB
->
lte_frame_parms
;
/*
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
uint32_t tti,tti_offset,slot_offset,Nsymb,samples_per_symbol;
uint8_t second_pilot,aa;
...
...
@@ -123,7 +123,7 @@ void generate_ue_spec_pilots(PHY_VARS_eNB *phy_vars_eNB,
default:
msg("[generate_ue_spec_pilots(in uespec_pilots.c)]ERROR:beamforming mode %d is not supported\n",beamforming_mode);
}
}
*/
}
/*int generate_ue_spec_pilots_slot(PHY_VARS_eNB *phy_vars_eNB,
...
...
openair1/PHY/LTE_TRANSPORT/proto.h
View file @
cf4a005e
...
...
@@ -1756,6 +1756,8 @@ int is_pmch_subframe(frame_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_parm
uint8_t
is_not_pilot
(
uint8_t
pilots
,
uint8_t
re
,
uint8_t
nushift
,
uint8_t
use2ndpilots
);
uint8_t
is_not_UEspecRS
(
int8_t
lprime
,
uint8_t
re
,
uint8_t
nushift
,
uint8_t
Ncp
,
uint8_t
beamforming_mode
);
uint32_t
dlsch_decoding_abstraction
(
double
*
dlsch_MIPB
,
LTE_DL_FRAME_PARMS
*
lte_frame_parms
,
LTE_UE_DLSCH_t
*
dlsch
,
...
...
openair1/PHY/MODULATION/slot_fep.c
View file @
cf4a005e
...
...
@@ -64,6 +64,11 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
unsigned
int
frame_length_samples
=
frame_parms
->
samples_per_tti
*
10
;
unsigned
int
rx_offset
;
/*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id];
unsigned char harq_pid = dlsch_ue[0]->current_harq_pid;
LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid];
int uespec_pilot[9][1200];*/
void
(
*
dft
)(
int16_t
*
,
int16_t
*
,
int
);
int
tmp_dft_in
[
256
];
// This is for misalignment issues for 6 and 15 PRBs
...
...
@@ -241,15 +246,18 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
}
}
// printf("slot_fep:transmission_mode[%d] = %d\n", eNB_id, phy_vars_ue->transmission_mode[eNB_id]);
if
(
phy_vars_ue
->
transmission_mode
[
eNB_id
]
==
7
)
if
(
frame_parms
->
Ncp
==
0
&&
(
symbol
==
3
)
||
(
symbol
==
6
)
||
(
symbol
==
9
)
||
(
symbol
==
12
))
lte_dl_bf_channel_estimation
(
phy_vars_ue
,
eNB_id
,
0
,
Ns
,
5
,
symbol
);
else
if
(
frame_parms
->
Ncp
==
1
&&
(
symbol
==
4
)
||
(
symbol
==
7
)
||
(
symbol
==
10
))
msg
(
"slot_fep(slot_fep.c):channel estimation not supported yet for TM7 extented CP.
\n
"
);
else
if
(
phy_vars_ue
->
transmission_mode
[
eNB_id
]
>
7
)
msg
(
"slot_fep(slot_fep.c):transmission mode not supported yet.
\n
"
);
if
(
phy_vars_ue
->
transmission_mode
[
eNB_id
]
==
7
)
{
if
(
frame_parms
->
Ncp
==
0
&&
((
symbol
==
3
)
||
(
symbol
==
6
)
||
(
symbol
==
9
)
||
(
symbol
==
12
)))
lte_dl_bf_channel_estimation
(
phy_vars_ue
,
eNB_id
,
0
,
Ns
,
5
,
symbol
);
else
if
(
frame_parms
->
Ncp
==
1
&&
((
symbol
==
4
)
||
(
symbol
==
7
)
||
(
symbol
==
10
)))
msg
(
"slot_fep(slot_fep.c):channel estimation not supported yet for TM7 extented CP.
\n
"
);
}
else
if
(
phy_vars_ue
->
transmission_mode
[
eNB_id
]
>
7
)
{
msg
(
"slot_fep(slot_fep.c):transmission mode not supported yet.
\n
"
);
}
}
#ifdef DEBUG_FEP
...
...
openair1/PHY/defs.h
View file @
cf4a005e
...
...
@@ -243,7 +243,7 @@ typedef struct PHY_VARS_eNB_s {
uint32_t
lte_gold_table
[
20
][
2
][
14
];
/// UE-specific reference symbols (p=5), TM 7
uint32_t
lte_gold_uespec_port5_table
[
NUMBER_OF_UE_MAX
][
20
][
2
][
21
];
uint32_t
lte_gold_uespec_port5_table
[
NUMBER_OF_UE_MAX
][
20
][
38
];
/// UE-specific reference symbols (p=7...14), TM 8/9/10
uint32_t
lte_gold_uespec_table
[
2
][
20
][
2
][
21
];
...
...
@@ -510,7 +510,7 @@ typedef struct {
uint32_t
lte_gold_table
[
7
][
20
][
2
][
14
];
/// UE-specific reference symbols (p=5), TM 7
uint32_t
lte_gold_uespec_port5_table
[
20
][
2
][
21
];
uint32_t
lte_gold_uespec_port5_table
[
20
][
38
];
/// ue-specific reference symbols
uint32_t
lte_gold_uespec_table
[
2
][
20
][
2
][
21
];
...
...
openair1/SIMULATION/LTE_PHY/dlsim.c
View file @
cf4a005e
...
...
@@ -172,7 +172,6 @@ void lte_param_init(unsigned char N_tx, unsigned char N_tx_phy, unsigned char N_
phy_init_lte_ue
(
PHY_vars_UE
,
1
,
0
);
phy_init_lte_eNB
(
PHY_vars_eNB
,
0
,
0
,
0
);
generate_pcfich_reg_mapping
(
&
PHY_vars_UE
->
lte_frame_parms
);
generate_phich_reg_mapping
(
&
PHY_vars_UE
->
lte_frame_parms
);
...
...
@@ -746,6 +745,7 @@ int main(int argc, char **argv)
if
(
transmission_mode
==
7
){
lte_gold_ue_spec_port5
(
PHY_vars_eNB
->
lte_gold_uespec_port5_table
[
0
],
Nid_cell
,
n_rnti
);
lte_gold_ue_spec_port5
(
PHY_vars_UE
->
lte_gold_uespec_port5_table
,
Nid_cell
,
n_rnti
);
beamforming_weights
=
(
int32_t
**
)
malloc
(
12
*
N_RB_DL
*
sizeof
(
int32_t
*
));
for
(
re
=
0
;
re
<
12
*
N_RB_DL
;
re
++
){
beamforming_weights
[
re
]
=
(
int32_t
*
)
malloc
(
n_tx_phy
*
sizeof
(
int32_t
));
...
...
@@ -3064,10 +3064,12 @@ PMI_FEEDBACK:
pilot2
=
6
;
pilot3
=
9
;
}
start_meas
(
&
PHY_vars_UE
->
phy_proc_rx
);
// Inner receiver scheduling for 3 slots
for
(
Ns
=
(
2
*
subframe
);
Ns
<
((
2
*
subframe
)
+
3
);
Ns
++
)
{
for
(
l
=
0
;
l
<
pilot2
;
l
++
)
{
if
(
n_frames
==
1
)
...
...
@@ -3085,14 +3087,15 @@ PMI_FEEDBACK:
no_prefix if 1 prefix is removed by HW
*/
start_meas
(
&
PHY_vars_UE
->
ofdm_demod_stats
);
slot_fep
(
PHY_vars_UE
,
l
,
Ns
%
20
,
0
,
0
);
stop_meas
(
&
PHY_vars_UE
->
ofdm_demod_stats
);
if
(
Ns
==
(
2
*
subframe
)
||
Ns
==
(
2
*
subframe
+
1
))
{
start_meas
(
&
PHY_vars_UE
->
ofdm_demod_stats
);
slot_fep
(
PHY_vars_UE
,
l
,
Ns
%
20
,
0
,
0
);
stop_meas
(
&
PHY_vars_UE
->
ofdm_demod_stats
);
}
//write_output("rxsigF0.m","rxsF0", &PHY_vars_UE->lte_ue_common_vars.rxdataF[0][0],PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
if
(
PHY_vars_UE
->
perfect_ce
==
1
)
{
...
...
@@ -3120,6 +3123,11 @@ PMI_FEEDBACK:
for
(
i
=
0
;
i
<
frame_parms
->
N_RB_DL
*
12
;
i
++
)
{
((
int16_t
*
)
PHY_vars_UE
->
lte_ue_common_vars
.
dl_ch_estimates
[
0
][(
aa
<<
1
)
+
aarx
])[
2
*
i
+
((
l
+
(
Ns
%
2
)
*
pilot2
)
*
frame_parms
->
ofdm_symbol_size
+
LTE_CE_FILTER_LENGTH
)
*
2
]
=
(
short
)(
AMP
);
((
int16_t
*
)
PHY_vars_UE
->
lte_ue_common_vars
.
dl_ch_estimates
[
0
][(
aa
<<
1
)
+
aarx
])[
2
*
i
+
1
+
((
l
+
(
Ns
%
2
)
*
pilot2
)
*
frame_parms
->
ofdm_symbol_size
+
LTE_CE_FILTER_LENGTH
)
*
2
]
=
0
/
2
;
if
(
transmission_mode
==
7
){
((
int16_t
*
)
PHY_vars_UE
->
lte_ue_pdsch_vars
[
0
]
->
dl_bf_ch_estimates
[(
aa
<<
1
)
+
aarx
])[
2
*
i
+
((
l
+
(
Ns
%
2
)
*
pilot2
)
*
frame_parms
->
ofdm_symbol_size
)
*
2
]
=
(
short
)(
AMP
);
((
int16_t
*
)
PHY_vars_UE
->
lte_ue_pdsch_vars
[
0
]
->
dl_bf_ch_estimates
[(
aa
<<
1
)
+
aarx
])[
2
*
i
+
1
+
((
l
+
(
Ns
%
2
)
*
pilot2
)
*
frame_parms
->
ofdm_symbol_size
)
*
2
]
=
0
/
2
;
}
}
}
}
...
...
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