diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index d8fd96353dac937711e6440104ea6c23f8a3ffac..8ba602c25d248647570567cba9a113fbe29e4d07 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -134,7 +134,7 @@ else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2") endif() if (CPUINFO MATCHES "sse4_2") - set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2 -msse4.2") + set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.2") endif() if (CPUINFO MATCHES "sse4_1") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1") diff --git a/openair1/PHY/CODING/3gpplte_sse.c b/openair1/PHY/CODING/3gpplte_sse.c index 41c0f65dc35f15dfa5e6f1d83a8fae39f0fa1d8c..3dda77e4ee3769044d6cccf358f77cc6582cbbdb 100755 --- a/openair1/PHY/CODING/3gpplte_sse.c +++ b/openair1/PHY/CODING/3gpplte_sse.c @@ -37,6 +37,7 @@ #include "extern_3GPPinterleaver.h" #else #include "vars.h" +#include <stdint.h> #endif #include <stdio.h> #include <string.h> @@ -48,6 +49,7 @@ #define print_shorts(s,x) printf("%s %x,%x,%x,%x,%x,%x,%x,%x\n",s,(x)[0],(x)[1],(x)[2],(x)[3],(x)[4],(x)[5],(x)[6],(x)[7]) #define print_ints(s,x) printf("%s %x %x %x %x\n",s,(x)[0],(x)[1],(x)[2],(x)[3]) +#define print_bytes2(s,x) printf("%s %x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x\n",s,(x)[0],(x)[1],(x)[2],(x)[3],(x)[4],(x)[5],(x)[6],(x)[7],(x)[8],(x)[9],(x)[10],(x)[11],(x)[12],(x)[13],(x)[14],(x)[15],(x)[16],(x)[17],(x)[18],(x)[19],(x)[20],(x)[21],(x)[22],(x)[23],(x)[24],(x)[25],(x)[26],(x)[27],(x)[28],(x)[29],(x)[30],(x)[31]) //#define DEBUG_TURBO_ENCODER 1 #define CALLGRIND 1 @@ -143,9 +145,10 @@ void treillis_table_init(void) char interleave_compact_byte(short * base_interleaver,unsigned char * input, unsigned char * output, int n) { - char expandInput[768*8] __attribute__((aligned(16))); + char expandInput[768*8] __attribute__((aligned(32))); int i,loop=n>>4; #if defined(__x86_64__) || defined(__i386__) +#ifndef __AVX2__ __m128i *i_128=(__m128i *)input, *o_128=(__m128i*)expandInput; __m128i tmp1, tmp2, tmp3, tmp4; __m128i BIT_MASK = _mm_set_epi8( 0b00000001, @@ -164,6 +167,43 @@ char interleave_compact_byte(short * base_interleaver,unsigned char * input, uns 0b00100000, 0b01000000, 0b10000000); + +#else + __m256i *i_256=(__m256i *)input, *o_256=(__m256i*)expandInput; + __m256i tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + __m256i BIT_MASK = _mm256_set_epi8( 0b00000001, + 0b00000010, + 0b00000100, + 0b00001000, + 0b00010000, + 0b00100000, + 0b01000000, + 0b10000000, + 0b00000001, + 0b00000010, + 0b00000100, + 0b00001000, + 0b00010000, + 0b00100000, + 0b01000000, + 0b10000000, + 0b00000001, + 0b00000010, + 0b00000100, + 0b00001000, + 0b00010000, + 0b00100000, + 0b01000000, + 0b10000000, + 0b00000001, + 0b00000010, + 0b00000100, + 0b00001000, + 0b00010000, + 0b00100000, + 0b01000000, + 0b10000000); +#endif #elif defined(__arm__) uint8x16_t *i_128=(uint8x16_t *)input, *o_128=(uint8x16_t *)expandInput; uint8x16_t tmp1,tmp2; @@ -187,46 +227,123 @@ char interleave_compact_byte(short * base_interleaver,unsigned char * input, uns 0b00000010, 0b00000001}; #endif + +#ifndef __AVX2__ if ((n&15) > 0) loop++; - +#else + loop=n>>5; + if ((n&31) > 0) + loop++; +#endif for (i=0; i<loop ; i++ ) { /* int cur_byte=i<<3; */ /* for (b=0;b<8;b++) */ /* expandInput[cur_byte+b] = (input[i]&(1<<(7-b)))>>(7-b); */ #if defined(__x86_64__) || defined(__i386__) - tmp1=_mm_load_si128(i_128++); - tmp2=_mm_unpacklo_epi8(tmp1,tmp1); - tmp3=_mm_unpacklo_epi16(tmp2,tmp2); - tmp4=_mm_unpacklo_epi32(tmp3,tmp3); +#ifndef __AVX2__ + tmp1=_mm_load_si128(i_128++); // tmp1 = B0,B1,...,B15 + tmp2=_mm_unpacklo_epi8(tmp1,tmp1); // tmp2 = B0,B0,B1,B1,...,B7,B7 + tmp3=_mm_unpacklo_epi16(tmp2,tmp2); // tmp3 = B0,B0,B0,B0,B1,B1,B1,B1,B2,B2,B2,B2,B3,B3,B3,B3 + tmp4=_mm_unpacklo_epi32(tmp3,tmp3); // tmp4 - B0,B0,B0,B0,B0,B0,B0,B0,B1,B1,B1,B1,B1,B1,B1,B1 *o_128++=_mm_cmpeq_epi8(_mm_and_si128(tmp4,BIT_MASK),BIT_MASK); - tmp4=_mm_unpackhi_epi32(tmp3,tmp3); + tmp4=_mm_unpackhi_epi32(tmp3,tmp3); // tmp4 - B2,B2,B2,B2,B2,B2,B2,B2,B3,B3,B3,B3,B3,B3,B3,B3 *o_128++=_mm_cmpeq_epi8(_mm_and_si128(tmp4,BIT_MASK),BIT_MASK);; - tmp3=_mm_unpackhi_epi16(tmp2,tmp2); - tmp4=_mm_unpacklo_epi32(tmp3,tmp3); + tmp3=_mm_unpackhi_epi16(tmp2,tmp2); // tmp3 = B4,B4,B4,B4,B5,B5,B5,B5,B6,B6,B6,B6,B7,B7,B7,B7 + tmp4=_mm_unpacklo_epi32(tmp3,tmp3); // tmp4 - B4,B4,B4,B4,B4,B4,B4,B4,B5,B5,B5,B5,B5,B5,B5,B5 *o_128++=_mm_cmpeq_epi8(_mm_and_si128(tmp4,BIT_MASK),BIT_MASK);; - tmp4=_mm_unpackhi_epi32(tmp3,tmp3); + tmp4=_mm_unpackhi_epi32(tmp3,tmp3); // tmp4 - B6,B6,B6,B6,B6,B6,B6,B6,B7,B7,B7,B7,B7,B7,B7,B7 *o_128++=_mm_cmpeq_epi8(_mm_and_si128(tmp4,BIT_MASK),BIT_MASK);; - tmp2=_mm_unpackhi_epi8(tmp1,tmp1); - tmp3=_mm_unpacklo_epi16(tmp2,tmp2); - tmp4=_mm_unpacklo_epi32(tmp3,tmp3); + tmp2=_mm_unpackhi_epi8(tmp1,tmp1); // tmp2 = B8,B8,B9,B9,...,B15,B15 + tmp3=_mm_unpacklo_epi16(tmp2,tmp2); // tmp3 = B8,B8,B8,B8,B9,B9,B9,B9,B10,B10,B10,B10,B11,B11,B11,B11 + tmp4=_mm_unpacklo_epi32(tmp3,tmp3); // tmp4 = B8,B8,B8,B8,B8,B8,B8,B8,B9,B9,B9,B9,B9,B9,B9,B9 *o_128++=_mm_cmpeq_epi8(_mm_and_si128(tmp4,BIT_MASK),BIT_MASK);; - tmp4=_mm_unpackhi_epi32(tmp3,tmp3); + tmp4=_mm_unpackhi_epi32(tmp3,tmp3); // tmp4 = B10,B10,B10,B10,B10,B10,B10,B10,B11,B11,B11,B11,B11,B11,B11,B11 *o_128++=_mm_cmpeq_epi8(_mm_and_si128(tmp4,BIT_MASK),BIT_MASK);; - tmp3=_mm_unpackhi_epi16(tmp2,tmp2); - tmp4=_mm_unpacklo_epi32(tmp3,tmp3); + tmp3=_mm_unpackhi_epi16(tmp2,tmp2); // tmp3 = B12,B12,B12,B12,B13,B13,B13,B13,B14,B14,B14,B14,B15,B15,B15,B15 + tmp4=_mm_unpacklo_epi32(tmp3,tmp3); // tmp4 = B12,B12,B12,B12,B12,B12,B12,B12,B13,B13,B13,B13,B13,B13,B13,B13 *o_128++=_mm_cmpeq_epi8(_mm_and_si128(tmp4,BIT_MASK),BIT_MASK);; - tmp4=_mm_unpackhi_epi32(tmp3,tmp3); + tmp4=_mm_unpackhi_epi32(tmp3,tmp3); // tmp4 = B14,B14,B14,B14,B14,B14,B14,B14,B15,B15,B15,B15,B15,B15,B15,B15 *o_128++=_mm_cmpeq_epi8(_mm_and_si128(tmp4,BIT_MASK),BIT_MASK);; - +#else + tmp1=_mm256_load_si256(i_256++); // tmp1 = B0,B1,...,B15,...,B31 + //print_bytes2("in",(uint8_t*)&tmp1); + tmp2=_mm256_unpacklo_epi8(tmp1,tmp1); // tmp2 = B0,B0,B1,B1,...,B7,B7,B16,B16,B17,B17,...,B23,B23 + tmp3=_mm256_unpacklo_epi16(tmp2,tmp2); // tmp3 = B0,B0,B0,B0,B1,B1,B1,B1,B2,B2,B2,B2,B3,B3,B3,B3,B16,B16,B16,B16,...,B19,B19,B19,B19 + tmp4=_mm256_unpacklo_epi32(tmp3,tmp3); // tmp4 - B0,B0,B0,B0,B0,B0,B0,B0,B1,B1,B1,B1,B1,B1,B1,B1,B16,B16...,B17..,B17 + tmp5=_mm256_unpackhi_epi32(tmp3,tmp3); // tmp5 - B2,B2,B2,B2,B2,B2,B2,B2,B3,B3,B3,B3,B3,B3,B3,B3,B18...,B18,B19,...,B19 + tmp6=_mm256_insertf128_si256(tmp4,_mm256_extracti128_si256(tmp5,0),1); // tmp6 = B0 B1 B2 B3 + tmp7=_mm256_insertf128_si256(tmp5,_mm256_extracti128_si256(tmp4,1),0); // tmp7 = B16 B17 B18 B19 + //print_bytes2("tmp2",(uint8_t*)&tmp2); + //print_bytes2("tmp3",(uint8_t*)&tmp3); + //print_bytes2("tmp4",(uint8_t*)&tmp4); + //print_bytes2("tmp5",(uint8_t*)&tmp4); + //print_bytes2("tmp6",(uint8_t*)&tmp6); + //print_bytes2("tmp7",(uint8_t*)&tmp7); + o_256[0]=_mm256_cmpeq_epi8(_mm256_and_si256(tmp6,BIT_MASK),BIT_MASK); + //print_bytes2("out",(uint8_t*)o_256); + o_256[4]=_mm256_cmpeq_epi8(_mm256_and_si256(tmp7,BIT_MASK),BIT_MASK);; + //print_bytes2("out",(uint8_t*)(o_256+4)); + + tmp3=_mm256_unpackhi_epi16(tmp2,tmp2); // tmp3 = B4,B4,B4,B4,B5,B5,B5,B5,B6,B6,B6,B6,B7,B7,B7,B7,B20,B20,B20,B20,...,B23,B23,B23,B23 + tmp4=_mm256_unpacklo_epi32(tmp3,tmp3); // tmp4 - B4,B4,B4,B4,B4,B4,B4,B4,B5,B5,B5,B5,B5,B5,B5,B5,B20,B20...,B21..,B21 + tmp5=_mm256_unpackhi_epi32(tmp3,tmp3); // tmp5 - B6,B6,B6,B6,B6,B6,B6,B6,B7,B7,B7,B7,B7,B7,B7,B7,B22...,B22,B23,...,B23 + tmp6=_mm256_insertf128_si256(tmp4,_mm256_extracti128_si256(tmp5,0),1); // tmp6 = B4 B5 B6 B7 + tmp7=_mm256_insertf128_si256(tmp5,_mm256_extracti128_si256(tmp4,1),0); // tmp7 = B20 B21 B22 B23 + //print_bytes2("tmp2",(uint8_t*)&tmp2); + //print_bytes2("tmp3",(uint8_t*)&tmp3); + //print_bytes2("tmp4",(uint8_t*)&tmp4); + //print_bytes2("tmp5",(uint8_t*)&tmp4); + //print_bytes2("tmp6",(uint8_t*)&tmp6); + //print_bytes2("tmp7",(uint8_t*)&tmp7); + o_256[1]=_mm256_cmpeq_epi8(_mm256_and_si256(tmp6,BIT_MASK),BIT_MASK); + //print_bytes2("out",(uint8_t*)(o_256+1)); + o_256[5]=_mm256_cmpeq_epi8(_mm256_and_si256(tmp7,BIT_MASK),BIT_MASK);; + //print_bytes2("out",(uint8_t*)(o_256+4)); + + tmp2=_mm256_unpackhi_epi8(tmp1,tmp1); // tmp2 = B8 B9 B10 B11 B12 B13 B14 B15 B25 B26 B27 B28 B29 B30 B31 + tmp3=_mm256_unpacklo_epi16(tmp2,tmp2); // tmp3 = B8,B9,B10,B11,B26,B27,B28,B29 + tmp4=_mm256_unpacklo_epi32(tmp3,tmp3); // tmp4 - B8,B9,B26,B27 + tmp5=_mm256_unpackhi_epi32(tmp3,tmp3); // tmp5 - B10,B11,B28,B29 + tmp6=_mm256_insertf128_si256(tmp4,_mm256_extracti128_si256(tmp5,0),1); // tmp6 = B8 B9 B10 B11 + tmp7=_mm256_insertf128_si256(tmp5,_mm256_extracti128_si256(tmp4,1),0); // tmp7 = B26 B27 B28 B29 + //print_bytes2("tmp2",(uint8_t*)&tmp2); + //print_bytes2("tmp3",(uint8_t*)&tmp3); + //print_bytes2("tmp4",(uint8_t*)&tmp4); + //print_bytes2("tmp5",(uint8_t*)&tmp4); + //print_bytes2("tmp6",(uint8_t*)&tmp6); + //print_bytes2("tmp7",(uint8_t*)&tmp7); + o_256[2]=_mm256_cmpeq_epi8(_mm256_and_si256(tmp6,BIT_MASK),BIT_MASK); + //print_bytes2("out",(uint8_t*)(o_256+2)); + o_256[6]=_mm256_cmpeq_epi8(_mm256_and_si256(tmp7,BIT_MASK),BIT_MASK);; + //print_bytes2("out",(uint8_t*)(o_256+4)); + + tmp3=_mm256_unpackhi_epi16(tmp2,tmp2); // tmp3 = B12 B13 B14 B15 B28 B29 B30 B31 + tmp4=_mm256_unpacklo_epi32(tmp3,tmp3); // tmp4 = B12 B13 B28 B29 + tmp5=_mm256_unpackhi_epi32(tmp3,tmp3); // tmp5 = B14 B15 B30 B31 + tmp6=_mm256_insertf128_si256(tmp4,_mm256_extracti128_si256(tmp5,0),1); // tmp6 = B12 B13 B14 B15 + tmp7=_mm256_insertf128_si256(tmp5,_mm256_extracti128_si256(tmp4,1),0); // tmp7 = B28 B29 B30 B31 + //print_bytes2("tmp2",(uint8_t*)&tmp2); + //print_bytes2("tmp3",(uint8_t*)&tmp3); + //print_bytes2("tmp4",(uint8_t*)&tmp4); + //print_bytes2("tmp5",(uint8_t*)&tmp4); + //print_bytes2("tmp6",(uint8_t*)&tmp6); + //print_bytes2("tmp7",(uint8_t*)&tmp7); + o_256[3]=_mm256_cmpeq_epi8(_mm256_and_si256(tmp6,BIT_MASK),BIT_MASK); + //print_bytes2("out",(uint8_t*)(o_256+3)); + o_256[7]=_mm256_cmpeq_epi8(_mm256_and_si256(tmp7,BIT_MASK),BIT_MASK);; + //print_bytes2("out",(uint8_t*)(o_256+7)); + + o_256+=8; +#endif #elif defined(__arm__) tmp1=vld1q_u8((uint8_t*)i_128); //print_bytes("tmp1:",(uint8_t*)&tmp1); @@ -305,8 +422,13 @@ char interleave_compact_byte(short * base_interleaver,unsigned char * input, uns short * ptr_intl=base_interleaver; #if defined(__x86_64) || defined(__i386__) +#ifndef __AVX2__ __m128i tmp; - uint16_t *systematic2_ptr=(unsigned short *) output; + uint16_t *systematic2_ptr=(uint16_t *) output; +#else + __m256i tmp; + uint32_t *systematic2_ptr=(uint32_t *) output; +#endif #elif defined(__arm__) uint8x16_t tmp; const uint8_t __attribute__ ((aligned (16))) _Powers[16]= @@ -316,11 +438,15 @@ char interleave_compact_byte(short * base_interleaver,unsigned char * input, uns uint8x16_t Powers= vld1q_u8(_Powers); uint8_t *systematic2_ptr=(uint8_t *) output; #endif +#ifndef __AVX2 int input_length_words=n>>1; - +#else + int input_length_words=n>>2; +#endif for ( i=0; i< input_length_words ; i ++ ) { #if defined(__x86_64__) || defined(__i386__) +#ifndef __AVX2__ tmp=_mm_insert_epi8(tmp,expandInput[*ptr_intl++],7); tmp=_mm_insert_epi8(tmp,expandInput[*ptr_intl++],6); tmp=_mm_insert_epi8(tmp,expandInput[*ptr_intl++],5); @@ -338,6 +464,41 @@ char interleave_compact_byte(short * base_interleaver,unsigned char * input, uns tmp=_mm_insert_epi8(tmp,expandInput[*ptr_intl++],8+1); tmp=_mm_insert_epi8(tmp,expandInput[*ptr_intl++],8+0); *systematic2_ptr++=(unsigned short)_mm_movemask_epi8(tmp); +#else + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],7); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],6); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],5); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],4); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],3); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],2); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],1); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],0); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],8+7); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],8+6); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],8+5); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],8+4); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],8+3); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],8+2); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],8+1); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],8+0); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],16+7); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],16+6); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],16+5); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],16+4); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],16+3); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],16+2); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],16+1); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],24+0); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],24+7); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],24+6); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],24+5); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],24+4); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],24+3); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],24+2); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],24+1); + tmp=_mm256_insert_epi8(tmp,expandInput[*ptr_intl++],24+0); + *systematic2_ptr++=(unsigned int)_mm256_movemask_epi8(tmp); +#endif #elif defined(__arm__) tmp=vsetq_lane_u8(expandInput[*ptr_intl++],tmp,7); tmp=vsetq_lane_u8(expandInput[*ptr_intl++],tmp,6); @@ -485,7 +646,7 @@ void threegpplte_turbo_encoder(unsigned char *input, int main(int argc,char **argv) { - unsigned char input[INPUT_LENGTH+16],state,state2; + unsigned char input[INPUT_LENGTH+32],state,state2; unsigned char output[12+(3*(INPUT_LENGTH<<3))],x,z; int i; unsigned char out; @@ -510,7 +671,7 @@ int main(int argc,char **argv) memset((void*)input,0,INPUT_LENGTH+16); for (i=0; i<INPUT_LENGTH; i++) { input[i] = i*219; - printf("Input %d : %x\n",i,input[i]); + printf("Input %d : %d\n",i,input[i]); } threegpplte_turbo_encoder(&input[0], diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c index de9acefb6ee3696609ff0001f915f209364bebc3..ad464b16babd2b06c64035f0a40379bf73da58fe 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c @@ -281,7 +281,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, // avgs = cmax(avgs,avg[(aarx<<1)+aatx]); - lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2); + lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2)+3; // + log2_approx(frame_parms->nb_antennas_tx_eNB-1) //-1 because log2_approx counts the number of bits // + log2_approx(frame_parms->nb_antennas_rx-1); diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 1190c9523f9209646b385da856e452771a3e6902..ef7f640e5023237e85f75913f0893d419e9c5b3d 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -4033,7 +4033,7 @@ PMI_FEEDBACK: printf("[continue] effective rate : %f (%2.1f%%,%f)): increase snr \n",rate*effective_rate, 100*effective_rate, rate); } - if (((double)errs[0]/(round_trials[0]))<1e-2) + if (((double)errs[0]/(round_trials[0]))<(10.0/n_frames)) break; }// SNR