From 47e150fbb845fecf4771188fa773954a2cd30da7 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 4 Aug 2023 10:57:25 +0200 Subject: [PATCH] fixes radix-2 butterfly for NEON, dft size 512 works properly now --- openair1/PHY/TOOLS/Makefile | 3 +++ openair1/PHY/TOOLS/oai_dfts_neon.c | 25 +++++++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/openair1/PHY/TOOLS/Makefile b/openair1/PHY/TOOLS/Makefile index da87365809..8ed80cfdd1 100644 --- a/openair1/PHY/TOOLS/Makefile +++ b/openair1/PHY/TOOLS/Makefile @@ -14,3 +14,6 @@ oai_dfts_sse4.s: oai_dfts.c dft_cycles_avx2: oai_dfts_avx2 ./oai_dfts_avx2 | egrep cycles + +oai_dfts_aarch64: oai_dfts_neon.c + gcc -O2 -std=gnu99 -gdwarf-2 -lgcc -lrt -g -ggdb -o oai_dfts_neon oai_dfts_neon.c ../../../common/utils/time_meas.c ../../SIMULATION/TOOLS/taus.c $$OPENAIR_HOME/common/utils/LOG/log.c ../../SIMULATION/TOOLS/rangen_double.c -I$$OPENAIR_HOME -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR_TARGETS/COMMON -I$$OPENAIR_HOME/radio/COMMON -I$$OPENAIR2_DIR -I$$OPENAIR2_DIR/COMMON -I$$OPENAIR_HOME/common/utils -I$$OPENAIR_HOME/common/utils/T -I$$OPENAIR_HOME/common/utils/msc -I$$OPENAIR_HOME/nfapi/open-nFAPI/nfapi/public_inc -DMR_MAIN -DNB_ANTENNAS_RX=1 -DNB_ANTENNAS_TX=1 -DMAX_NUM_CCs=1 -lm -lpthread diff --git a/openair1/PHY/TOOLS/oai_dfts_neon.c b/openair1/PHY/TOOLS/oai_dfts_neon.c index fa183893d4..8b2dcd9aa7 100644 --- a/openair1/PHY/TOOLS/oai_dfts_neon.c +++ b/openair1/PHY/TOOLS/oai_dfts_neon.c @@ -287,8 +287,11 @@ static inline void bfly2_16(int16x8_t *x0, int16x8_t *x1, int16x8_t *y0, int16x8 static inline void bfly2_16(int16x8_t *x0, int16x8_t *x1, int16x8_t *y0, int16x8_t *y1, int16x8_t *tw, int16x8_t *twb) { - *y0 = vqaddq_s16(*x0,*x1); - *y1 = vqsubq_s16(*x0,*x1); + int16x8_t x1t; + + x1t = packed_cmult2(*(x1),*(tw),*(twb)); + *y0 = vqaddq_s16(*x0,x1t); + *y1 = vqsubq_s16(*x0,x1t); } static inline void ibfly2(int16x8_t *x0, int16x8_t *x1,int16x8_t *y0, int16x8_t *y1,int16x8_t *tw) @@ -1534,7 +1537,7 @@ void dft512(int16_t *x,int16_t *y,unsigned char scale) { simdshort_q15_t xtmp[256],*xtmpp,*x64 = (simdshort_q15_t *)x; - simd_q15_t ytmp[128],*tw512a_128p=(simd_q15_t *)tw512a,*tw512b_128p=(simd_q15_t *)tw512b,*y128=(simd_q15_t *)y,*y128p=(simd_q15_t *)y; + simd_q15_t ytmp[128],*tw512_128p=(simd_q15_t*)tw512,*tw512a_128p=(simd_q15_t *)tw512a,*tw512b_128p=(simd_q15_t *)tw512b,*y128=(simd_q15_t *)y,*y128p=(simd_q15_t *)y; simd_q15_t *ytmpp = &ytmp[0]; int i; simd_q15_t ONE_OVER_SQRT2_Q15_128 = set1_int16(ONE_OVER_SQRT2_Q15); @@ -7147,7 +7150,7 @@ void idft(uint8_t sizeidx, int16_t *input,int16_t *output,unsigned char scale_fl #ifdef MR_MAIN #include #include - +/* #define LOG_M write_output int write_output(const char *fname,const char *vname,void *data,int length,int dec,char format) { @@ -7303,6 +7306,12 @@ int write_output(const char *fname,const char *vname,void *data,int length,int d return 0; } +*/ +#include "common/config/config_paramdesc.h" +void exit_function(const char *file, const char *function, const int line, const char *s, const int assert) { return; } +int oai_exit=0; +int config_get(paramdef_t *params,int numparams, char *prefix) { return;} +int config_check_unknown_cmdlineopt(char *prefix) { return; } int main(int argc, char**argv) { @@ -7669,6 +7678,10 @@ int main(int argc, char**argv) printf("\n\n512-point(%f cycles)\n",(double)ts.diff/(double)ts.trials); LOG_M("y512.m","y512",y,512,1,1); LOG_M("x512.m","x512",x,512,1,1); + dft512((int16_t*)y,(int16_t*)x,1); + LOG_M("y512_dft.m","y512",y,512,1,1); + LOG_M("x512_dft.m","x512",x,512,1,1); + /* printf("X: "); for (i=0;i<64;i++) @@ -7810,8 +7823,8 @@ int main(int argc, char**argv) LOG_M("y4096.m","y4096",y,4096,1,1); LOG_M("x4096.m","x4096",x,4096,1,1); - dft4096((int16_t *)y,(int16_t *)x2,1); - LOG_M("x4096_2.m","x4096_2",x2,4096,1,1); + dft4096((int16_t *)y,(int16_t *)x,1); + LOG_M("x4096_2.m","x4096_2",x,4096,1,1); // NR 160Mhz, 434 PRB, 3/4 sampling memset((void*)x, 0, 6144*sizeof(int32_t));