Merge branch 'develop' into enhancement-64-phy_test
Conflicts: openair1/SCHED/phy_procedures_lte_ue.c targets/RT/USER/lte-softmodem.c
This commit is contained in:
@@ -1,31 +1,3 @@
|
||||
/*******************************************************************************
|
||||
OpenAirInterface
|
||||
Copyright(c) 1999 - 2014 Eurecom
|
||||
|
||||
OpenAirInterface is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
OpenAirInterface is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenAirInterface.The full GNU General Public License is
|
||||
included in this distribution in the file called "COPYING". If not,
|
||||
see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Contact Information
|
||||
OpenAirInterface Admin: openair_admin@eurecom.fr
|
||||
OpenAirInterface Tech : openair_tech@eurecom.fr
|
||||
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
|
||||
|
||||
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
||||
|
||||
*******************************************************************************/
|
||||
short primary_synch0[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-26120,-19785,11971,-30502,-24020,-22288,32117,6492,31311,9658,-16384,-28378,25100,-21063,-7292,-31946,20429,25618,14948,29158,11971,-30502,31311,9658,25100,-21063,-16384,28377,-24020,22287,32117,6492,-7292,31945,20429,25618,-26120,-19785,-16384,-28378,-16384,28377,-26120,-19785,-32402,4883,31311,-9659,32117,6492,-7292,-31946,32767,-1,25100,-21063,-24020,22287,-32402,4883,-32402,4883,-24020,22287,25100,-21063,32767,-1,-7292,-31946,32117,6492,31311,-9659,-32402,4883,-26120,-19785,-16384,28377,-16384,-28378,-26120,-19785,20429,25618,-7292,31945,32117,6492,-24020,22287,-16384,28377,25100,-21063,31311,9658,11971,-30502,14948,29158,20429,25618,-7292,-31946,25100,-21063,-16384,-28378,31311,9658,32117,6492,-24020,-22288,11971,-30502,-26120,-19785,32767,0,0,0,0,0,0,0,0,0,0,0};
|
||||
short primary_synch1[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-31754,-8086,-24020,-22288,2448,32675,-26120,19784,27073,18458,-16384,28377,25100,21062,-29523,14217,-7292,31945,-13477,-29868,-24020,-22288,27073,18458,25100,21062,-16384,-28378,2448,-32676,-26120,19784,-29523,-14218,-7292,31945,-31754,-8086,-16384,28377,-16384,-28378,-31754,-8086,31311,-9659,27073,-18459,-26120,19784,-29523,14217,32767,-1,25100,21062,2448,-32676,31311,-9659,31311,-9659,2448,-32676,25100,21062,32767,0,-29523,14217,-26120,19784,27073,-18459,31311,-9659,-31754,-8086,-16384,-28378,-16384,28377,-31754,-8086,-7292,31945,-29523,-14218,-26120,19784,2448,-32676,-16384,-28378,25100,21062,27073,18458,-24020,-22288,-13477,-29868,-7292,31945,-29523,14217,25100,21062,-16384,28377,27073,18458,-26120,19784,2448,32675,-24020,-22288,-31754,-8086,32767,0,0,0,0,0,0,0,0,0,0,0};
|
||||
short primary_synch2[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-31754,8085,-24020,22287,2448,-32676,-26120,-19785,27073,-18459,-16384,-28378,25100,-21063,-29523,-14218,-7292,-31946,-13477,29867,-24020,22287,27073,-18459,25100,-21063,-16384,28377,2448,32675,-26120,-19785,-29523,14217,-7292,-31946,-31754,8085,-16384,-28378,-16384,28377,-31754,8085,31311,9658,27073,18458,-26120,-19785,-29523,-14218,32767,0,25100,-21063,2448,32675,31311,9658,31311,9658,2448,32675,25100,-21063,32767,0,-29523,-14218,-26120,-19785,27073,18458,31311,9658,-31754,8085,-16384,28377,-16384,-28378,-31754,8085,-7292,-31946,-29523,14217,-26120,-19785,2448,32675,-16384,28377,25100,-21063,27073,-18459,-24020,22287,-13477,29867,-7292,-31946,-29523,-14218,25100,-21063,-16384,-28378,27073,-18459,-26120,-19785,2448,-32676,-24020,22287,-31754,8085,32767,-1,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
#include "gain_control.h"
|
||||
#endif
|
||||
|
||||
#if defined(OAI_USRP) || defined(EXMIMO)
|
||||
#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_LMSSDR)
|
||||
#include "common_lib.h"
|
||||
extern openair0_config_t openair0_cfg[];
|
||||
#endif
|
||||
@@ -291,17 +291,10 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
||||
frame_parms->Ncp=NORMAL;
|
||||
frame_parms->frame_type=FDD;
|
||||
init_frame_parms(frame_parms,1);
|
||||
|
||||
// write_output("rxdata0.m","rxd0",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
||||
|
||||
/*#ifdef OAI_USRP
|
||||
for (aarx = 0; aarx<frame_parms->nb_antennas_rx;aarx++) {
|
||||
rxdata128 = (__m128i*)phy_vars_ue->lte_ue_common_vars.rxdata[aarx];
|
||||
for (i=0; i<(frame_parms->samples_per_tti*10)>>2; i++) {
|
||||
rxdata128[i] = _mm_srai_epi16(rxdata128[i],4);
|
||||
}
|
||||
}
|
||||
#endif*/
|
||||
/*
|
||||
write_output("rxdata0.m","rxd0",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
||||
exit(-1);
|
||||
*/
|
||||
sync_pos = lte_sync_time(phy_vars_ue->lte_ue_common_vars.rxdata,
|
||||
frame_parms,
|
||||
(int *)&phy_vars_ue->lte_ue_common_vars.eNb_id);
|
||||
@@ -336,9 +329,11 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
||||
|
||||
#else
|
||||
#ifndef OAI_USRP
|
||||
#ifndef OAI_BLADERF
|
||||
#ifndef OAI_BLADERF
|
||||
#ifndef OAI_LMSSDR
|
||||
phy_adjust_gain(phy_vars_ue,0);
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -569,7 +564,7 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
||||
phy_vars_ue->lte_frame_parms.phich_config_common.phich_duration,
|
||||
phich_string[phy_vars_ue->lte_frame_parms.phich_config_common.phich_resource],
|
||||
phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB);
|
||||
#if defined(OAI_USRP) || defined(EXMIMO)
|
||||
#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_LMSSDR)
|
||||
LOG_I(PHY,"[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n",
|
||||
phy_vars_ue->Mod_id,
|
||||
phy_vars_ue->frame_rx,
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
#endif
|
||||
|
||||
extern int mac_get_rrc_status(uint8_t Mod_id,uint8_t eNB_flag,uint8_t index);
|
||||
#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_BLADERF)
|
||||
#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
#include "common_lib.h"
|
||||
extern openair0_config_t openair0_cfg[];
|
||||
#endif
|
||||
@@ -97,10 +97,10 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t
|
||||
#ifdef EXMIMO
|
||||
len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB (LNA %d, vga %d dB)\n",phy_vars_ue->rx_total_gain_dB, openair0_cfg[0].rxg_mode[0],(int)openair0_cfg[0].rx_gain[0]);
|
||||
#endif
|
||||
#if defined(OAI_USRP) || defined(OAI_BLADERF)
|
||||
#if defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB\n",phy_vars_ue->rx_total_gain_dB);
|
||||
#endif
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF)
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
len += sprintf(&buffer[len], "[UE_PROC] Frequency offset %d Hz (%d), estimated carrier frequency %f Hz\n",phy_vars_ue->lte_ue_common_vars.freq_offset,openair_daq_vars.freq_offset,openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset);
|
||||
#endif
|
||||
len += sprintf(&buffer[len], "[UE PROC] UE mode = %s (%d)\n",mode_string[phy_vars_ue->UE_mode[0]],phy_vars_ue->UE_mode[0]);
|
||||
|
||||
@@ -1,200 +0,0 @@
|
||||
/*******************************************************************************
|
||||
OpenAirInterface
|
||||
Copyright(c) 1999 - 2014 Eurecom
|
||||
|
||||
OpenAirInterface is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
OpenAirInterface is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenAirInterface.The full GNU General Public License is
|
||||
included in this distribution in the file called "COPYING". If not,
|
||||
see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Contact Information
|
||||
OpenAirInterface Admin: openair_admin@eurecom.fr
|
||||
OpenAirInterface Tech : openair_tech@eurecom.fr
|
||||
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
|
||||
|
||||
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
||||
|
||||
*******************************************************************************/
|
||||
#include "defs.h"
|
||||
|
||||
int mult_cpx_matrix_h(short *x1[2][2],
|
||||
short *x2[2][2],
|
||||
short *y[2][2],
|
||||
unsigned int N,
|
||||
unsigned short output_shift,
|
||||
short hermitian)
|
||||
{
|
||||
|
||||
if (hermitian) {
|
||||
// this computes x1^H*x2 and stores it in y
|
||||
mult_cpx_vector_h(x2[0][0],x1[0][0],y[0][0],N,output_shift,1);
|
||||
mult_cpx_vector_h(x2[0][1],x1[0][1],y[0][0],N,output_shift,1);
|
||||
mult_cpx_vector_h(x2[0][0],x1[1][0],y[1][0],N,output_shift,1);
|
||||
mult_cpx_vector_h(x2[0][1],x1[1][1],y[1][0],N,output_shift,1);
|
||||
mult_cpx_vector_h(x2[1][0],x1[0][0],y[0][1],N,output_shift,1);
|
||||
mult_cpx_vector_h(x2[1][1],x1[0][1],y[0][1],N,output_shift,1);
|
||||
mult_cpx_vector_h(x2[1][0],x1[1][0],y[1][1],N,output_shift,1);
|
||||
mult_cpx_vector_h(x2[1][1],x1[1][1],y[1][1],N,output_shift,1);
|
||||
} else {
|
||||
// this computes x1*x2^H and stores it in y
|
||||
mult_cpx_vector_h(x1[0][0],x2[0][0],y[0][0],N,output_shift,1);
|
||||
mult_cpx_vector_h(x1[0][1],x2[0][1],y[0][0],N,output_shift,1);
|
||||
mult_cpx_vector_h(x1[0][0],x2[1][0],y[0][1],N,output_shift,1);
|
||||
mult_cpx_vector_h(x1[0][1],x2[1][1],y[0][1],N,output_shift,1);
|
||||
mult_cpx_vector_h(x1[1][0],x2[0][0],y[1][0],N,output_shift,1);
|
||||
mult_cpx_vector_h(x1[1][1],x2[0][1],y[1][0],N,output_shift,1);
|
||||
mult_cpx_vector_h(x1[1][0],x2[1][0],y[1][1],N,output_shift,1);
|
||||
mult_cpx_vector_h(x1[1][1],x2[1][1],y[1][1],N,output_shift,1);
|
||||
}
|
||||
}
|
||||
|
||||
int mult_cpx_matrix_vector(int *x1[2][2],
|
||||
int *x2[2],
|
||||
int *y[2],
|
||||
unsigned int N,
|
||||
unsigned short output_shift)
|
||||
{
|
||||
|
||||
Zero_Buffer(y[0],N*8);
|
||||
Zero_Buffer(y[1],N*8);
|
||||
|
||||
// this computes x1*x2 and stores it in y (32 bit)
|
||||
mult_cpx_vector_add32((short*)x2[0],(short*)x1[0][0],(short*)y[0],N);
|
||||
mult_cpx_vector_add32((short*)x2[1],(short*)x1[0][1],(short*)y[0],N);
|
||||
mult_cpx_vector_add32((short*)x2[0],(short*)x1[1][0],(short*)y[1],N);
|
||||
mult_cpx_vector_add32((short*)x2[1],(short*)x1[1][1],(short*)y[1],N);
|
||||
|
||||
// shift and pack
|
||||
shift_and_pack((short*)y[0],N,output_shift);
|
||||
shift_and_pack((short*)y[1],N,output_shift);
|
||||
|
||||
}
|
||||
|
||||
#ifdef MAIN_MM
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
main ()
|
||||
{
|
||||
short x1_00[256] __attribute__((aligned(16)));
|
||||
short x1_10[256] __attribute__((aligned(16)));
|
||||
short x1_01[256] __attribute__((aligned(16)));
|
||||
short x1_11[256] __attribute__((aligned(16)));
|
||||
short x2_0[256] __attribute__((aligned(16)));
|
||||
short x2_1[256] __attribute__((aligned(16)));
|
||||
short y_0[256] __attribute__((aligned(16)));
|
||||
short y_1[256] __attribute__((aligned(16)));
|
||||
|
||||
int *x1[2][2];
|
||||
int *x2[2];
|
||||
int *y[2];
|
||||
int i,m,n;
|
||||
|
||||
x1[0][0] = (int*)x1_00;
|
||||
x1[0][1] = (int*)x1_01;
|
||||
x1[1][0] = (int*)x1_10;
|
||||
x1[1][1] = (int*)x1_11;
|
||||
x2[0] = (int*)x2_0;
|
||||
x2[1] = (int*)x2_1;
|
||||
y[0] = (int*)y_0;
|
||||
y[1] = (int*)y_1;
|
||||
|
||||
for(m=0; m<2; m++) {
|
||||
for(n=0; n<2; n++) {
|
||||
for(i=0; i<256; i+=4) {
|
||||
((short*)x1[m][n])[i] = ((short) rand())/4;
|
||||
((short*)x1[m][n])[i+1] = ((short) rand())/4;
|
||||
((short*)x1[m][n])[i+2] = -((short*)x1[m][n])[i+1];
|
||||
((short*)x1[m][n])[i+3] = ((short*)x1[m][n])[i];
|
||||
}
|
||||
}
|
||||
|
||||
for(i=0; i<256; i+=4) {
|
||||
((short*)x2[m])[i] = ((short) rand())/4;
|
||||
((short*)x2[m])[i+1] = ((short) rand())/4;
|
||||
((short*)x2[m])[i+2] = ((short*)x2[m])[i];
|
||||
((short*)x2[m])[i+3] = ((short*)x2[m])[i+1];
|
||||
}
|
||||
|
||||
Zero_Buffer(y[m],512);
|
||||
}
|
||||
|
||||
/*
|
||||
input[0] = 100;
|
||||
input[1] = 200;
|
||||
input[2] = -200;
|
||||
input[3] = 100;
|
||||
input[4] = 1000;
|
||||
input[5] = 2000;
|
||||
input[6] = -2000;
|
||||
input[7] = 1000;
|
||||
input[8] = 100;
|
||||
input[9] = 200;
|
||||
input[10] = -200;
|
||||
input[11] = 100;
|
||||
input[12] = 1000;
|
||||
input[13] = 2000;
|
||||
input[14] = -2000;
|
||||
input[15] = 1000;
|
||||
|
||||
input2[0] = 2;
|
||||
input2[1] = 1;
|
||||
input2[2] = 2;
|
||||
input2[3] = 1;
|
||||
input2[4] = 20;
|
||||
input2[5] = 10;
|
||||
input2[6] = 20;
|
||||
input2[7] = 10;
|
||||
input2[8] = 2;
|
||||
input2[9] = 1;
|
||||
input2[10] = 2;
|
||||
input2[11] = 1;
|
||||
input2[12] = 2000;
|
||||
input2[13] = 1000;
|
||||
input2[14] = 2000;
|
||||
input2[15] = 1000;
|
||||
|
||||
x1[0][0] = (int*)input;
|
||||
x1[0][1] = (int*)input;
|
||||
x1[1][0] = (int*)input;
|
||||
x1[1][1] = (int*)input;
|
||||
|
||||
x2[0] = (int*)input2;
|
||||
x2[1] = (int*)input2;
|
||||
|
||||
y[0] = (int*)output;
|
||||
y[1] = (int*)output2;
|
||||
*/
|
||||
|
||||
mult_cpx_matrix_vector(x1,x2,y,64,15);
|
||||
|
||||
//mult_cpx_vector_add32(x2[0],x1[0][0],y[0],64);
|
||||
|
||||
for (i=0; i<128; i+=2)
|
||||
printf("i=%d, x1 = [%d+1i*%d %d+1i*%d; %d+1i*%d %d+1i*%d]; x2 = [%d+1i*%d; %d+1i*%d]; y = [%d+1i*%d; %d+1i*%d]; y_m= round(x1*x2./pow2(15)); y-y_m \n",
|
||||
i,
|
||||
((short*)x1[0][0])[2*i], ((short*)x1[0][0])[2*i+2],
|
||||
((short*)x1[0][1])[2*i], ((short*)x1[0][1])[2*i+2],
|
||||
((short*)x1[1][0])[2*i], ((short*)x1[1][0])[2*i+2],
|
||||
((short*)x1[1][1])[2*i], ((short*)x1[1][1])[2*i+2],
|
||||
((short*)x2[0])[2*i], ((short*)x2[0])[2*i+1],
|
||||
((short*)x2[1])[2*i], ((short*)x2[1])[2*i+1],
|
||||
((short*)y[0])[2*i], ((short*)y[0])[2*i+1],
|
||||
((short*)y[1])[2*i], ((short*)y[1])[2*i+1]);
|
||||
|
||||
//((int*)y[0])[i], ((int*)y[0])[i+1],
|
||||
//((int*)y[1])[i], ((int*)y[1])[i+1]);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -50,7 +50,7 @@ int mult_cpx_conj_vector(int16_t *x1,
|
||||
uint32_t N,
|
||||
int output_shift)
|
||||
{
|
||||
// Multiply elementwise two complex vectors of N elements with repeated formatted output
|
||||
// Multiply elementwise the complex conjugate of x1 with x2.
|
||||
// x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
|
||||
// We assume x1 with a dinamic of 15 bit maximum
|
||||
//
|
||||
@@ -90,7 +90,7 @@ int mult_cpx_conj_vector(int16_t *x1,
|
||||
tmp_im = _mm_shufflelo_epi16(*x1_128,_MM_SHUFFLE(2,3,0,1));
|
||||
tmp_im = _mm_shufflehi_epi16(tmp_im,_MM_SHUFFLE(2,3,0,1));
|
||||
tmp_im = _mm_sign_epi16(tmp_im,*(__m128i*)&conjug[0]);
|
||||
tmp_im = _mm_madd_epi16(tmp_im,*x1_128);
|
||||
tmp_im = _mm_madd_epi16(tmp_im,*x2_128);
|
||||
tmp_re = _mm_srai_epi32(tmp_re,output_shift);
|
||||
tmp_im = _mm_srai_epi32(tmp_im,output_shift);
|
||||
tmpy0 = _mm_unpacklo_epi32(tmp_re,tmp_im);
|
||||
@@ -130,3 +130,4 @@ int mult_cpx_conj_vector(int16_t *x1,
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,366 +0,0 @@
|
||||
/*******************************************************************************
|
||||
OpenAirInterface
|
||||
Copyright(c) 1999 - 2014 Eurecom
|
||||
|
||||
OpenAirInterface is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
OpenAirInterface is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenAirInterface.The full GNU General Public License is
|
||||
included in this distribution in the file called "COPYING". If not,
|
||||
see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Contact Information
|
||||
OpenAirInterface Admin: openair_admin@eurecom.fr
|
||||
OpenAirInterface Tech : openair_tech@eurecom.fr
|
||||
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
|
||||
|
||||
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
||||
|
||||
*******************************************************************************/
|
||||
#include "defs.h"
|
||||
|
||||
static __m128i shift __attribute__ ((aligned(16)));
|
||||
|
||||
|
||||
int mult_cpx_vector_h(short *x1,
|
||||
short *x2,
|
||||
short *y,
|
||||
unsigned int N,
|
||||
unsigned short output_shift,
|
||||
short sign)
|
||||
{
|
||||
// Multiply elementwise the complex vector x1 with the complex conjugate of the complex vecotr x2 of N elements and adds it to the vector y.
|
||||
// x1 - input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
// We assume x1 with a dinamic of 15 bit maximum
|
||||
//
|
||||
// x2 - input 2 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
// We assume x2 with a dinamic of 14 bit maximum
|
||||
//
|
||||
// y - output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
//
|
||||
// N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4;
|
||||
//
|
||||
// log2_amp - increase the output amplitude by a factor 2^log2_amp (default is 0)
|
||||
// WARNING: log2_amp>0 can cause overflow!!
|
||||
// sign - +1..add, -1..substract
|
||||
|
||||
unsigned int i; // loop counter
|
||||
|
||||
register __m128i m0,m1,m2;
|
||||
|
||||
short *temps;
|
||||
int *tempd;
|
||||
|
||||
__m128i *x1_128;
|
||||
__m128i *x2_128;
|
||||
__m128i *y_128;
|
||||
__m128i mask;
|
||||
|
||||
__m128i temp;
|
||||
|
||||
shift = _mm_cvtsi32_si128(output_shift);
|
||||
x1_128 = (__m128i *)&x1[0];
|
||||
x2_128 = (__m128i *)&x2[0];
|
||||
y_128 = (__m128i *)&y[0];
|
||||
|
||||
if (sign == -1)
|
||||
mask = (__m128i) _mm_set_epi16 (-1,1,-1,-1,-1,1,-1,-1);
|
||||
else
|
||||
mask = (__m128i) _mm_set_epi16 (1,-1,1,1,1,-1,1,1);
|
||||
|
||||
// we compute 2*4 cpx multiply for each loop
|
||||
for(i=0; i<(N>>3); i++) {
|
||||
|
||||
// printf("i=%d\n",i);
|
||||
|
||||
// unroll 1
|
||||
// temps = (short *)x1_128;
|
||||
// printf("x1 : %d,%d,%d,%d,%d,%d,%d,%d\n",temps[0],temps[1],temps[2],temps[3],temps[4],temps[5],temps[6],temps[7]);
|
||||
m1 = x1_128[0];
|
||||
m2 = x2_128[0];
|
||||
|
||||
// temps = (short *)&x2_128[0];
|
||||
// printf("x2 : %x,%x,%x,%x,%x,%x,%x,%x\n",temps[0],temps[1],temps[2],temps[3],temps[4],temps[5],temps[6],temps[7]);
|
||||
|
||||
// bring x2 in conjugate form
|
||||
// the first two instructions might be replaced with a single one in SSE3
|
||||
m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
||||
m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
||||
m2 = _mm_mullo_epi16(m2, mask);
|
||||
|
||||
// temp = m2;
|
||||
// temps = (short *)&temp;
|
||||
// printf("x2 conj : %x,%x,%x,%x,%x,%x,%x,%x\n",temps[0],temps[1],temps[2],temps[3],temps[4],temps[5],temps[6],temps[7]);
|
||||
|
||||
m0 = _mm_madd_epi16(m1,m2); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
|
||||
|
||||
// temp = m0;
|
||||
|
||||
// tempd = &temp;
|
||||
// printf("m0 : %d,%d,%d,%d\n",tempd[0],tempd[1],tempd[2],tempd[3]);
|
||||
|
||||
m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
|
||||
|
||||
// temp = m0;
|
||||
|
||||
// tempd = (int *)&temp;
|
||||
// printf("m0 : %d,%d,%d,%d\n",tempd[0],tempd[1],tempd[2],tempd[3]);
|
||||
|
||||
m0 = _mm_packs_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
|
||||
m0 = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
|
||||
|
||||
y_128[0] = _mm_add_epi16(m0,y_128[0]);
|
||||
|
||||
// temps = (short *)&y_128[0];
|
||||
// printf("y0 : %d,%d,%d,%d,%d,%d,%d,%d\n",temps[0],temps[1],temps[2],temps[3],temps[4],temps[5],temps[6],temps[7]);
|
||||
|
||||
// unroll 2
|
||||
m1 = x1_128[1];
|
||||
m2 = x2_128[1];
|
||||
|
||||
m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
||||
m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
||||
m2 = _mm_mullo_epi16(m2, mask);
|
||||
|
||||
m0 = _mm_madd_epi16(m1,m2); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
|
||||
|
||||
m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
|
||||
|
||||
m0 = _mm_packs_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
|
||||
m0 = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
|
||||
|
||||
y_128[1] = _mm_add_epi16(m0,y_128[1]);
|
||||
|
||||
// unroll 3
|
||||
m1 = x1_128[2];
|
||||
m2 = x2_128[2];
|
||||
|
||||
m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
||||
m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
||||
m2 = _mm_mullo_epi16(m2, mask);
|
||||
|
||||
m0 = _mm_madd_epi16(m1,m2); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
|
||||
|
||||
m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
|
||||
|
||||
m0 = _mm_packs_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
|
||||
m0 = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
|
||||
|
||||
y_128[2] = _mm_add_epi16(m0,y_128[2]);
|
||||
|
||||
|
||||
// unroll 4
|
||||
m1 = x1_128[3];
|
||||
m2 = x2_128[3];
|
||||
|
||||
m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
||||
m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
||||
m2 = _mm_mullo_epi16(m2, mask);
|
||||
|
||||
m0 = _mm_madd_epi16(m1,m2); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
|
||||
|
||||
m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
|
||||
|
||||
m0 = _mm_packs_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
|
||||
m0 = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
|
||||
|
||||
y_128[3] = _mm_add_epi16(m0,y_128[3]);
|
||||
|
||||
x1_128+=4;
|
||||
x2_128+=4;
|
||||
y_128 +=4;
|
||||
// printf("x1_128 = %p, x2_128 =%p, y_128=%p\n",x1_128,x2_128,y_128);
|
||||
|
||||
}
|
||||
|
||||
|
||||
_mm_empty();
|
||||
_m_empty();
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int mult_cpx_vector_h_add32(short *x1,
|
||||
short *x2,
|
||||
short *y,
|
||||
unsigned int N,
|
||||
short sign)
|
||||
{
|
||||
// Multiply elementwise the complex vector x1 with the complex conjugate of the complex vecotr x2 of N elements and adds it to the vector y.
|
||||
// x1 - input 1 in 16bit format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
// We assume x1 with a dinamic of 15 bit maximum
|
||||
//
|
||||
// x2 - input 2 in 16bit format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
// We assume x2 with a dinamic of 14 bit maximum
|
||||
//
|
||||
// y - output in 32bit format |Re0 Im0|,......,|Re(N-1) Im(N-1)|
|
||||
//
|
||||
// N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4;
|
||||
//
|
||||
// sign - +1..add, -1..substract
|
||||
|
||||
unsigned int i; // loop counter
|
||||
|
||||
register __m128i m0,m1,m2;
|
||||
|
||||
short *temps;
|
||||
int *tempd;
|
||||
|
||||
__m128i *x1_128;
|
||||
__m128i *x2_128;
|
||||
__m128i *y_128;
|
||||
__m128i mask;
|
||||
|
||||
__m128i temp;
|
||||
|
||||
x1_128 = (__m128i *)&x1[0];
|
||||
x2_128 = (__m128i *)&x2[0];
|
||||
y_128 = (__m128i *)&y[0];
|
||||
|
||||
if (sign == -1)
|
||||
mask = (__m128i) _mm_set_epi16 (-1,1,-1,-1,-1,1,-1,-1);
|
||||
else
|
||||
mask = (__m128i) _mm_set_epi16 (1,-1,1,1,1,-1,1,1);
|
||||
|
||||
// we compute 2*4 cpx multiply for each loop
|
||||
for(i=0; i<(N>>3); i++) {
|
||||
|
||||
m1 = x1_128[0];
|
||||
m2 = x2_128[0];
|
||||
|
||||
// bring x2 in conjugate form
|
||||
// the first two instructions might be replaced with a single one in SSE3
|
||||
m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
||||
m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
||||
m2 = _mm_mullo_epi16(m2, mask);
|
||||
|
||||
m0 = _mm_madd_epi16(m1,m2); // 1- compute x1[0]*x2[0], result is 32bit
|
||||
|
||||
y_128[0] = _mm_add_epi32(m0,y_128[0]);
|
||||
|
||||
// unroll 2
|
||||
m1 = x1_128[1];
|
||||
m2 = x2_128[1];
|
||||
|
||||
m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
||||
m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
||||
m2 = _mm_mullo_epi16(m2, mask);
|
||||
|
||||
m0 = _mm_madd_epi16(m1,m2);
|
||||
|
||||
y_128[1] = _mm_add_epi32(m0,y_128[1]);
|
||||
|
||||
// unroll 3
|
||||
m1 = x1_128[2];
|
||||
m2 = x2_128[2];
|
||||
|
||||
m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
||||
m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
||||
m2 = _mm_mullo_epi16(m2, mask);
|
||||
|
||||
m0 = _mm_madd_epi16(m1,m2);
|
||||
|
||||
y_128[2] = _mm_add_epi32(m0,y_128[2]);
|
||||
|
||||
|
||||
// unroll 4
|
||||
m1 = x1_128[3];
|
||||
m2 = x2_128[3];
|
||||
|
||||
m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
||||
m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
||||
m2 = _mm_mullo_epi16(m2, mask);
|
||||
|
||||
m0 = _mm_madd_epi16(m1,m2);
|
||||
|
||||
y_128[3] = _mm_add_epi32(m0,y_128[3]);
|
||||
|
||||
x1_128+=4;
|
||||
x2_128+=4;
|
||||
y_128 +=4;
|
||||
|
||||
}
|
||||
|
||||
|
||||
_mm_empty();
|
||||
_m_empty();
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
#ifdef MAIN
|
||||
#define L 16
|
||||
|
||||
main ()
|
||||
{
|
||||
|
||||
short input[256] __attribute__((aligned(16)));
|
||||
short input2[256] __attribute__((aligned(16)));
|
||||
short output[256] __attribute__((aligned(16)));
|
||||
|
||||
int i;
|
||||
|
||||
Zero_Buffer(output,256*2);
|
||||
|
||||
for (i=0; i<16; i+=2)
|
||||
printf("output[%d] = %d + %d i\n",i,output[i],output[i+1]);
|
||||
|
||||
input[0] = 100;
|
||||
input[1] = 200;
|
||||
input[2] = 100;
|
||||
input[3] = 200;
|
||||
input[4] = 1234;
|
||||
input[5] = -1234;
|
||||
input[6] = 1234;
|
||||
input[7] = -1234;
|
||||
input[8] = 100;
|
||||
input[9] = 200;
|
||||
input[10] = 100;
|
||||
input[11] = 200;
|
||||
input[12] = 1000;
|
||||
input[13] = 2000;
|
||||
input[14] = 1000;
|
||||
input[15] = 2000;
|
||||
|
||||
input2[0] = 1;
|
||||
input2[1] = 2;
|
||||
input2[2] = 1;
|
||||
input2[3] = 2;
|
||||
input2[4] = 10;
|
||||
input2[5] = 20;
|
||||
input2[6] = 10;
|
||||
input2[7] = 20;
|
||||
input2[8] = 1;
|
||||
input2[9] = 2;
|
||||
input2[10] = 1;
|
||||
input2[11] = 2;
|
||||
input2[12] = 1000;
|
||||
input2[13] = 2000;
|
||||
input2[14] = 1000;
|
||||
input2[15] = 2000;
|
||||
|
||||
|
||||
mult_cpx_vector_h(input2,input2,output,8,0,1);
|
||||
|
||||
for (i=0; i<16; i+=2)
|
||||
printf("output[%d] = %d + %d i\n",i,output[i],output[i+1]);
|
||||
|
||||
Zero_Buffer(output,256*2);
|
||||
mult_cpx_vector_h(input2,input2,output,8,0,-1);
|
||||
|
||||
for (i=0; i<16; i+=2)
|
||||
printf("output[%d] = %d + %d i\n",i,output[i],output[i+1]);
|
||||
|
||||
}
|
||||
|
||||
#endif //MAIN
|
||||
+26
-182
@@ -64,6 +64,8 @@ struct complex32 {
|
||||
int32_t i;
|
||||
};
|
||||
|
||||
//cmult_sv.h
|
||||
|
||||
/*!\fn void multadd_real_vector_complex_scalar(int16_t *x,int16_t *alpha,int16_t *y,uint32_t N)
|
||||
This function performs componentwise multiplication and accumulation of a complex scalar and a real vector.
|
||||
@param x Vector input (Q1.15)
|
||||
@@ -95,192 +97,14 @@ void multadd_complex_vector_real_scalar(int16_t *x,
|
||||
uint8_t zero_flag,
|
||||
uint32_t N);
|
||||
|
||||
|
||||
/*!\fn int32_t mult_cpx_vector(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift)
|
||||
This function performs optimized componentwise multiplication of two Q1.15 vectors in repeated format.
|
||||
|
||||
@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
|
||||
@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
@param N Length of Vector WARNING: N must be a multiple of 8 (4x loop unrolling and two complex multiplies per cycle)
|
||||
@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
|
||||
|
||||
The function implemented is : \f$\mathbf{y} = \mathbf{x_1}\odot\mathbf{x_2}\f$
|
||||
*/
|
||||
int32_t mult_cpx_vector(int16_t *x1,
|
||||
int16_t *x2,
|
||||
int16_t *y,
|
||||
uint32_t N,
|
||||
int32_t output_shift);
|
||||
|
||||
/*!\fn int32_t mult_cpx_vector_norep(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift)
|
||||
This function performs optimized componentwise multiplication of two Q1.15 vectors with normal formatted output.
|
||||
|
||||
@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
|
||||
@param y Output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
|
||||
@param N Length of Vector WARNING: N must be a multiple of 8 (4x loop unrolling and two complex multiplies per cycle)
|
||||
@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
|
||||
|
||||
The function implemented is : \f$\mathbf{y} = \mathbf{x_1}\odot\mathbf{x_2}\f$
|
||||
*/
|
||||
int32_t mult_cpx_vector_norep(int16_t *x1,
|
||||
int16_t *x2,
|
||||
int16_t *y,
|
||||
uint32_t N,
|
||||
int32_t output_shift);
|
||||
|
||||
|
||||
/*!\fn int32_t mult_cpx_vector_norep2(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift)
|
||||
This function performs optimized componentwise multiplication of two Q1.15 vectors with normal formatted output.
|
||||
|
||||
@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
|
||||
@param y Output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
|
||||
@param N Length of Vector WARNING: N must be a multiple of 8 (no unrolling and two complex multiplies per cycle)
|
||||
@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
|
||||
|
||||
The function implemented is : \f$\mathbf{y} = \mathbf{x_1}\odot\mathbf{x_2}\f$
|
||||
*/
|
||||
int32_t mult_cpx_vector_norep2(int16_t *x1,
|
||||
int16_t *x2,
|
||||
int16_t *y,
|
||||
uint32_t N,
|
||||
int32_t output_shift);
|
||||
|
||||
int32_t mult_cpx_vector_norep_conj(int16_t *x1,
|
||||
int16_t *x2,
|
||||
int16_t *y,
|
||||
uint32_t N,
|
||||
int32_t output_shift);
|
||||
|
||||
int32_t mult_cpx_vector_norep_conj2(int16_t *x1,
|
||||
int16_t *x2,
|
||||
int16_t *y,
|
||||
uint32_t N,
|
||||
int32_t output_shift);
|
||||
|
||||
/*!\fn int32_t mult_cpx_vector2(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift)
|
||||
This function performs optimized componentwise multiplication of two Q1.15 vectors.
|
||||
|
||||
@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
|
||||
@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
@param N Length of Vector WARNING: N must be a multiple of 2 (2 complex multiplies per cycle)
|
||||
@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
|
||||
|
||||
The function implemented is : \f$\mathbf{y} = \mathbf{x_1}\odot\mathbf{x_2}\f$
|
||||
*/
|
||||
int32_t mult_cpx_vector2(int16_t *x1,
|
||||
int16_t *x2,
|
||||
int16_t *y,
|
||||
uint32_t N,
|
||||
int32_t output_shift);
|
||||
|
||||
/*!\fn int32_t mult_cpx_vector_add(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift)
|
||||
This function performs optimized componentwise multiplication of two Q1.15 vectors. The output IS ADDED TO y. WARNING: make sure that output_shift is set to the right value, so that the result of the multiplication has the comma at the same place as y.
|
||||
|
||||
@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
|
||||
@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
@param N Length of Vector WARNING: N>=4
|
||||
@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
|
||||
|
||||
The function implemented is : \f$\mathbf{y} += \mathbf{x_1}\odot\mathbf{x_2}\f$
|
||||
*/
|
||||
|
||||
int32_t mult_cpx_vector_add(int16_t *x1,
|
||||
int16_t *x2,
|
||||
int16_t *y,
|
||||
uint32_t N,
|
||||
int32_t output_shift);
|
||||
|
||||
|
||||
int32_t mult_cpx_vector_h_add32(int16_t *x1,
|
||||
int16_t *x2,
|
||||
int16_t *y,
|
||||
uint32_t N,
|
||||
int16_t sign);
|
||||
|
||||
int32_t mult_cpx_vector_add32(int16_t *x1,
|
||||
int16_t *x2,
|
||||
int16_t *y,
|
||||
uint32_t N);
|
||||
|
||||
int32_t mult_vector32(int16_t *x1,
|
||||
int16_t *x2,
|
||||
int rotate_cpx_vector(int16_t *x,
|
||||
int16_t *alpha,
|
||||
int16_t *y,
|
||||
uint32_t N);
|
||||
|
||||
int32_t mult_vector32_scalar(int16_t *x1,
|
||||
int32_t x2,
|
||||
int16_t *y,
|
||||
uint32_t N);
|
||||
|
||||
int32_t mult_cpx_vector32_conj(int16_t *x,
|
||||
int16_t *y,
|
||||
uint32_t N);
|
||||
|
||||
int32_t mult_cpx_vector32_real(int16_t *x1,
|
||||
int16_t *x2,
|
||||
int16_t *y,
|
||||
uint32_t N);
|
||||
|
||||
int32_t shift_and_pack(int16_t *y,
|
||||
uint32_t N,
|
||||
int32_t output_shift);
|
||||
|
||||
/*!\fn int32_t mult_cpx_vector_h(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift,int16_t sign)
|
||||
This function performs optimized componentwise multiplication of the vector x1 with the conjugate of the vector x2. The output IS ADDED TO y. WARNING: make sure that output_shift is set to the right value, so that the result of the multiplication has the comma at the same place as y.
|
||||
|
||||
@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
@param x2 Input 2 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
@param N Length of Vector (complex samples) WARNING: N>=4
|
||||
@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
|
||||
@param sign +1..add, -1..substract
|
||||
|
||||
The function implemented is : \f$\mathbf{y} = \mathbf{y} + \mathbf{x_1}\odot\mathbf{x_2}^*\f$
|
||||
*/
|
||||
int32_t mult_cpx_vector_h(int16_t *x1,
|
||||
int16_t *x2,
|
||||
int16_t *y,
|
||||
uint32_t N,
|
||||
int32_t output_shift,
|
||||
int16_t sign);
|
||||
|
||||
/*!\fn int32_t mult_cpx_matrix_h(int16_t *x1[2][2],int16_t *x2[2][2],int16_t *y[2][2],uint32_t N,uint16_t output_shift,int16_t hermitian)
|
||||
This function performs optimized componentwise matrix multiplication of the 2x2 matrices x1 with the 2x2 matrices x2. The output IS ADDED TO y (i.e. make sure y is initilized correctly). WARNING: make sure that output_shift is set to the right value, so that the result of the multiplication has the comma at the same place as y.
|
||||
|
||||
@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
@param x2 Input 2 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
@param N Length of Vector (complex samples) WARNING: N>=4
|
||||
@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
|
||||
@param hermitian if !=0 the hermitian transpose is returned (i.e. A^H*B instead of A*B^H)
|
||||
*/
|
||||
int32_t mult_cpx_matrix_h(int16_t *x1[2][2],
|
||||
int16_t *x2[2][2],
|
||||
int16_t *y[2][2],
|
||||
uint32_t N,
|
||||
uint16_t output_shift,
|
||||
int16_t hermitian);
|
||||
uint32_t N,
|
||||
uint16_t output_shift);
|
||||
|
||||
|
||||
/*!\fn int32_t mult_cpx_matrix_vector(int32_t *x1[2][2],int32_t *x2[2],int32_t *y[2],uint32_t N,uint16_t output_shift)
|
||||
This function performs optimized componentwise matrix-vector multiplication of the 2x2 matrices x1 with the 2x1 vectors x2. The output IS ADDED TO y (i.e. make sure y is initilized correctly). WARNING: make sure that output_shift is set to the right value, so that the result of the multiplication has the comma at the same place as y.
|
||||
|
||||
@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
||||
@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
|
||||
@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| WARNING: y must be different for x2
|
||||
@param N Length of Vector (complex samples) WARNING: N>=4
|
||||
@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
|
||||
*/
|
||||
int32_t mult_cpx_matrix_vector(int32_t *x1[2][2],
|
||||
int32_t *x2[2],
|
||||
int32_t *y[2],
|
||||
uint32_t N,
|
||||
uint16_t output_shift);
|
||||
|
||||
/*!\fn void init_fft(uint16_t size,uint8_t logsize,uint16_t *rev)
|
||||
\brief Initialize the FFT engine for a given size
|
||||
@@ -289,6 +113,25 @@ int32_t mult_cpx_matrix_vector(int32_t *x1[2][2],
|
||||
@param rev Pointer to bit-reversal permutation array
|
||||
*/
|
||||
|
||||
//cmult_vv.c
|
||||
/*!
|
||||
Multiply elementwise the complex conjugate of x1 with x2.
|
||||
@param x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
|
||||
We assume x1 with a dinamic of 15 bit maximum
|
||||
@param x2 - input 2 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
|
||||
We assume x2 with a dinamic of 14 bit maximum
|
||||
@param y - output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
|
||||
@param N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4;
|
||||
@param output_shift - shift to be applied to generate output
|
||||
*/
|
||||
|
||||
int mult_cpx_conj_vector(int16_t *x1,
|
||||
int16_t *x2,
|
||||
int16_t *y,
|
||||
uint32_t N,
|
||||
int output_shift);
|
||||
|
||||
// lte_dfts.c
|
||||
void init_fft(uint16_t size,
|
||||
uint8_t logsize,
|
||||
uint16_t *rev);
|
||||
@@ -355,6 +198,7 @@ int32_t rotate_cpx_vector(int16_t *x,
|
||||
uint16_t output_shift);
|
||||
|
||||
|
||||
//cadd_sv.c
|
||||
|
||||
/*!\fn int32_t add_cpx_vector(int16_t *x,int16_t *alpha,int16_t *y,uint32_t N)
|
||||
This function performs componentwise addition of a vector with a complex scalar.
|
||||
|
||||
@@ -88,7 +88,7 @@ FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void )
|
||||
fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
|
||||
fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
|
||||
fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
|
||||
fl_set_xyplot_ybounds(fdui->rxsig_t,30,70);
|
||||
fl_set_xyplot_ybounds(fdui->rxsig_t,10,70);
|
||||
|
||||
// Time-domain channel response
|
||||
fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" );
|
||||
@@ -396,7 +396,7 @@ FD_lte_phy_scope_ue *create_lte_phy_scope_ue( void )
|
||||
fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
|
||||
fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
|
||||
fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
|
||||
fl_set_xyplot_ybounds(fdui->rxsig_t,30,70);
|
||||
fl_set_xyplot_ybounds(fdui->rxsig_t,10,70);
|
||||
|
||||
// Time-domain channel response
|
||||
fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" );
|
||||
|
||||
@@ -26,6 +26,9 @@
|
||||
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
||||
|
||||
*******************************************************************************/
|
||||
#ifndef __TIME_MEAS_DEFS__H__
|
||||
#define __TIME_MEAS_DEFS__H__
|
||||
|
||||
#include <unistd.h>
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
@@ -148,3 +151,4 @@ static inline void copy_meas(time_stats_t *dst_ts,time_stats_t *src_ts)
|
||||
dst_ts->max=src_ts->max;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -76,6 +76,13 @@
|
||||
#define openair_free(y,x) free((y))
|
||||
#define PAGE_SIZE 4096
|
||||
|
||||
//#ifdef SHRLIBDEV
|
||||
//extern int rxrescale;
|
||||
//#define RX_IQRESCALELEN rxrescale
|
||||
//#else
|
||||
//#define RX_IQRESCALELEN 15
|
||||
//#endif
|
||||
|
||||
//! \brief Allocate \c size bytes of memory on the heap with alignment 16 and zero it afterwards.
|
||||
//! If no more memory is available, this function will terminate the program with an assertion error.
|
||||
static inline void* malloc16_clear( size_t size )
|
||||
|
||||
@@ -44,7 +44,14 @@
|
||||
/** @defgroup _ref_implementation_ OpenAirInterface LTE Implementation
|
||||
* @{
|
||||
|
||||
* @defgroup _PHY_RF_INTERFACE_ Generic PHY - RF Interface
|
||||
* @defgroup _PHY_RF_INTERFACE_ PHY - RF Interface
|
||||
* @ingroup _PHY_RF_INTERFACE_
|
||||
* @{
|
||||
* @defgroup _GENERIC_PHY_RF_INTERFACE_ Generic PHY - RF Interface
|
||||
* @defgroup _USRP_PHY_RF_INTERFACE_ PHY - USRP RF Interface
|
||||
* @defgroup _BLADERF_PHY_RF_INTERFACE_ PHY - BLADERF RF Interface
|
||||
* @}
|
||||
*
|
||||
* @ingroup _ref_implementation_
|
||||
* @{
|
||||
* This module is responsible for defining the generic interface between PHY and RF Target
|
||||
|
||||
@@ -113,7 +113,7 @@ extern int rx_sig_fifo;
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
extern uint32_t downlink_frequency[MAX_NUM_CCs][4];
|
||||
#endif
|
||||
|
||||
@@ -189,7 +189,7 @@ void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe)
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
//unsigned int gain_table[31] = {100,112,126,141,158,178,200,224,251,282,316,359,398,447,501,562,631,708,794,891,1000,1122,1258,1412,1585,1778,1995,2239,2512,2818,3162};
|
||||
/*
|
||||
unsigned int get_tx_amp_prach(int power_dBm, int power_max_dBm, int N_RB_UL)
|
||||
@@ -657,7 +657,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
||||
uint8_t ack_status=0;
|
||||
int8_t Po_PUCCH;
|
||||
int32_t ulsch_start=0;
|
||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
int overflow=0;
|
||||
int k,l;
|
||||
#endif
|
||||
@@ -955,7 +955,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
||||
}
|
||||
phy_vars_ue->tx_total_RE = nb_rb*12;
|
||||
|
||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
tx_amp = get_tx_amp(phy_vars_ue->tx_power_dBm,
|
||||
phy_vars_ue->tx_power_max_dBm,
|
||||
phy_vars_ue->lte_frame_parms.N_RB_UL,
|
||||
@@ -1055,7 +1055,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
||||
phy_vars_ue->tx_power_dBm = Po_PUCCH;
|
||||
phy_vars_ue->tx_total_RE = 12;
|
||||
|
||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
tx_amp = get_tx_amp(Po_PUCCH,
|
||||
phy_vars_ue->tx_power_max_dBm,
|
||||
phy_vars_ue->lte_frame_parms.N_RB_UL,
|
||||
@@ -1119,7 +1119,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
||||
phy_vars_ue->tx_power_dBm = Po_PUCCH;
|
||||
phy_vars_ue->tx_total_RE = 12;
|
||||
|
||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
tx_amp = get_tx_amp(Po_PUCCH,
|
||||
phy_vars_ue->tx_power_max_dBm,
|
||||
phy_vars_ue->lte_frame_parms.N_RB_UL,
|
||||
@@ -1221,7 +1221,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
||||
if (abstraction_flag == 0) {
|
||||
nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
|
||||
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) //this is the EXPRESS MIMO case
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case
|
||||
ulsch_start = (phy_vars_ue->rx_offset+subframe_tx*frame_parms->samples_per_tti-
|
||||
openair_daq_vars.timing_advance-
|
||||
phy_vars_ue->timing_advance-
|
||||
@@ -1248,7 +1248,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
if (frame_parms->Ncp == 1)
|
||||
PHY_ofdm_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
|
||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
dummy_tx_buffer,
|
||||
#else
|
||||
&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],
|
||||
@@ -1259,7 +1259,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
||||
CYCLIC_PREFIX);
|
||||
else
|
||||
normal_prefix_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
|
||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
dummy_tx_buffer,
|
||||
#else
|
||||
&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],
|
||||
@@ -1280,7 +1280,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
||||
}
|
||||
*/
|
||||
#ifndef OFDMA_ULSCH
|
||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
apply_7_5_kHz(phy_vars_ue,dummy_tx_buffer,0);
|
||||
apply_7_5_kHz(phy_vars_ue,dummy_tx_buffer,1);
|
||||
#else
|
||||
@@ -1295,7 +1295,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
||||
*/
|
||||
#endif
|
||||
|
||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
overflow = ulsch_start - 9*frame_parms->samples_per_tti;
|
||||
|
||||
//if ((slot_tx==4) && (aa==0)) printf("ulsch_start %d, overflow %d\n",ulsch_start,overflow);
|
||||
@@ -1385,7 +1385,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
||||
|
||||
phy_vars_ue->tx_total_RE = 96;
|
||||
|
||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = get_tx_amp(phy_vars_ue->tx_power_dBm,
|
||||
phy_vars_ue->tx_power_max_dBm,
|
||||
phy_vars_ue->lte_frame_parms.N_RB_UL,
|
||||
@@ -1534,9 +1534,11 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t
|
||||
|
||||
#else
|
||||
#ifndef OAI_USRP
|
||||
#ifndef OAI_BLADERF
|
||||
#ifndef OAI_BLADERF
|
||||
#ifndef OAI_LMSSDR
|
||||
phy_adjust_gain (phy_vars_ue,0);
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_OUT);
|
||||
@@ -2652,19 +2654,13 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
|
||||
if (ret == (1+phy_vars_ue->dlsch_ue[eNB_id][0]->max_turbo_iterations)) {
|
||||
phy_vars_ue->dlsch_errors[eNB_id]++;
|
||||
|
||||
//#ifdef DEBUG_PHY_PROC
|
||||
#ifdef DEBUG_PHY_PROC
|
||||
LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d,TBS %d)\n",
|
||||
phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
|
||||
harq_pid,frame_rx,subframe_prev,
|
||||
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
|
||||
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs,
|
||||
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS);
|
||||
|
||||
/*
|
||||
if (abstraction_flag ==0 )
|
||||
dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid);
|
||||
mac_xface->macphy_exit("");
|
||||
*/
|
||||
} else {
|
||||
LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d (slot_rx %d): Received DLSCH (rv %d,mcs %d,TBS %d)\n",
|
||||
phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
|
||||
|
||||
@@ -656,7 +656,17 @@ int main(int argc, char **argv)
|
||||
printf("dual_stream_UE=%d\n", dual_stream_UE);
|
||||
}
|
||||
|
||||
lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,tdd_config,N_RB_DL,threequarter_fs,osf,perfect_ce);
|
||||
lte_param_init(n_tx,
|
||||
n_rx,
|
||||
transmission_mode,
|
||||
extended_prefix_flag,
|
||||
frame_type,
|
||||
Nid_cell,
|
||||
tdd_config,
|
||||
N_RB_DL,
|
||||
threequarter_fs,
|
||||
osf,
|
||||
perfect_ce);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -173,7 +173,9 @@ int main(int argc, char **argv)
|
||||
|
||||
lte_frame_type_t frame_type = FDD;
|
||||
|
||||
uint32_t Nsoft = 1827072;
|
||||
|
||||
/*
|
||||
#ifdef XFORMS
|
||||
FD_lte_phy_scope_ue *form_ue;
|
||||
char title[255];
|
||||
@@ -183,6 +185,7 @@ int main(int argc, char **argv)
|
||||
sprintf (title, "LTE DL SCOPE UE");
|
||||
fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
|
||||
#endif
|
||||
*/
|
||||
|
||||
logInit();
|
||||
number_of_cards = 1;
|
||||
@@ -382,14 +385,14 @@ int main(int argc, char **argv)
|
||||
0);
|
||||
|
||||
// Create transport channel structures for 2 transport blocks (MIMO)
|
||||
PHY_vars_eNB->dlsch_eNB_MCH = new_eNB_dlsch(1,8,N_RB_DL,0);
|
||||
PHY_vars_eNB->dlsch_eNB_MCH = new_eNB_dlsch(1,8,Nsoft,N_RB_DL,0);
|
||||
|
||||
if (!PHY_vars_eNB->dlsch_eNB_MCH) {
|
||||
printf("Can't get eNB dlsch structures\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
PHY_vars_UE->dlsch_ue_MCH[0] = new_ue_dlsch(1,8,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0);
|
||||
PHY_vars_UE->dlsch_ue_MCH[0] = new_ue_dlsch(1,8,Nsoft,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0);
|
||||
|
||||
PHY_vars_eNB->lte_frame_parms.num_MBSFN_config = 1;
|
||||
PHY_vars_eNB->lte_frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0;
|
||||
|
||||
@@ -194,6 +194,7 @@ int main(int argc, char **argv)
|
||||
int nb_rb_set = 0;
|
||||
int sf;
|
||||
|
||||
int threequarter_fs=0;
|
||||
opp_enabled=1; // to enable the time meas
|
||||
|
||||
cpu_freq_GHz = (double)get_cpu_freq_GHz();
|
||||
@@ -203,7 +204,7 @@ int main(int argc, char **argv)
|
||||
|
||||
logInit();
|
||||
|
||||
while ((c = getopt (argc, argv, "hapZbm:n:Y:X:x:s:w:e:q:d:D:O:c:r:i:f:y:c:oA:C:R:g:N:l:S:T:QB:PI:L")) != -1) {
|
||||
while ((c = getopt (argc, argv, "hapZEbm:n:Y:X:x:s:w:e:q:d:D:O:c:r:i:f:y:c:oA:C:R:g:N:l:S:T:QB:PI:L")) != -1) {
|
||||
switch (c) {
|
||||
case 'a':
|
||||
channel_model = AWGN;
|
||||
@@ -373,6 +374,10 @@ int main(int argc, char **argv)
|
||||
cyclic_shift = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'E':
|
||||
threequarter_fs=1;
|
||||
break;
|
||||
|
||||
case 'N':
|
||||
N0 = atoi(optarg);
|
||||
break;
|
||||
@@ -470,6 +475,7 @@ int main(int argc, char **argv)
|
||||
0,
|
||||
tdd_config,
|
||||
N_RB_DL,
|
||||
threequarter_fs,
|
||||
osf,
|
||||
0);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user