|
|
|
@@ -51,26 +51,27 @@ int beam_precoding(int32_t **txdataF,
|
|
|
|
|
LTE_DL_FRAME_PARMS *frame_parms,
|
|
|
|
|
int32_t ***beam_weights,
|
|
|
|
|
int slot,
|
|
|
|
|
int symbol)
|
|
|
|
|
int symbol,
|
|
|
|
|
int aa)
|
|
|
|
|
{
|
|
|
|
|
uint8_t p,aa;
|
|
|
|
|
uint8_t p;
|
|
|
|
|
uint16_t re=0;
|
|
|
|
|
int slot_offset_F;
|
|
|
|
|
|
|
|
|
|
slot_offset_F = slot*(frame_parms->ofdm_symbol_size)*((frame_parms->Ncp==1) ? 6 : 7);
|
|
|
|
|
|
|
|
|
|
// clear txdata_BF[aa][re] for each call of ue_spec_beamforming
|
|
|
|
|
for(aa=0;aa<frame_parms->nb_antennas_tx;aa++)
|
|
|
|
|
memset(txdataF_BF[aa],0,sizeof(int32_t)*(frame_parms->ofdm_symbol_size));
|
|
|
|
|
memset(txdataF_BF[aa],0,sizeof(int32_t)*(frame_parms->ofdm_symbol_size));
|
|
|
|
|
|
|
|
|
|
for (re=0;re<frame_parms->ofdm_symbol_size;re++) {
|
|
|
|
|
for (p=0; p<2; p++) {
|
|
|
|
|
if (txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) {
|
|
|
|
|
for (aa=0;aa<frame_parms->nb_antennas_tx;aa++) {
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[0] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[0])>>15);
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[0] -= (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[1])>>15);
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[1])>>15);
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[0])>>15);
|
|
|
|
|
for (p=0; p<14; p++) {
|
|
|
|
|
//if (p==0 || p==1 || p==5 || p>7)
|
|
|
|
|
// mult_cpx_conj_vector((int16_t*)txdataF[p], (int16_t*)beam_weights[p][aa], (int16_t*)txdataF_BF[aa], frame_parms->ofdm_symbol_size, 15);
|
|
|
|
|
for (re=0;re<frame_parms->ofdm_symbol_size;re++) {
|
|
|
|
|
if ((p==0 || p==1 || p==5 || p>=7) && txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) {
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[0] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[0])>>15);
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[0] -= (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[1])>>15);
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[1])>>15);
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[0])>>15);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
printf("beamforming.c:txdataF[%d][%d]=%d+j%d, beam_weights[%d][%d][%d]=%d+j%d,txdata_BF[%d][%d]=%d+j%d\n",
|
|
|
|
@@ -83,44 +84,8 @@ int beam_precoding(int32_t **txdataF,
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[0],
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[1]);
|
|
|
|
|
*/
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) { //that means this RE is actually using TM7
|
|
|
|
|
for (aa=0;aa<frame_parms->nb_antennas_tx;aa++) {
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[0] += (int16_t)((((int16_t*)&txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[5][aa][re])[0])>>15);
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[0] -= (int16_t)((((int16_t*)&txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[5][aa][re])[1])>>15);
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[5][aa][re])[1])>>15);
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[5][aa][re])[0])>>15);
|
|
|
|
|
|
|
|
|
|
/* printf("beamforming.c:txdata[5][%d]=%d+j%d, beam_weights[5][%d][%d]=%d+j%d,txdata_BF[%d][%d]=%d+j%d\n",
|
|
|
|
|
slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re,
|
|
|
|
|
((int16_t*)&txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0],
|
|
|
|
|
((int16_t*)&txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1],
|
|
|
|
|
aa,re,
|
|
|
|
|
((int16_t*)&beam_weights[5][aa][re])[0],
|
|
|
|
|
((int16_t*)&beam_weights[5][aa][re])[1],
|
|
|
|
|
aa,re,
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[0],
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[1]); */
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (txdataF[7][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) { //that means this RE is actually using TM8-10
|
|
|
|
|
for (p=7;p<15;p++) {
|
|
|
|
|
if (txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) { //that means this RE is actually allocated
|
|
|
|
|
for (aa=0;aa<frame_parms->nb_antennas_tx;aa++) {
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[0] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[0])>>15);
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[0] -= (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[1])>>15);
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[1])>>15);
|
|
|
|
|
((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[0])>>15);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|