int signal_energy_nodc(int *input,unsigned int length) { int i; int temp,temp2; register __m64 mm0,mm1,mm2,mm3; __m64 *in = (__m64 *)input; #ifdef MAIN short *printb; #endif mm0 = _m_pxor(mm0,mm0); mm3 = _m_pxor(mm3,mm3); for (i=0;i<length>>1;i++) { mm1 = in[i]; mm2 = mm1; mm1 = _m_pmaddwd(mm1,mm1);// SIMD complex multiplication mm1 = _m_psradi(mm1,shift); mm0 = _m_paddd(mm0,mm1); // temp2 = mm0; // printf("%d %d\n",((int *)&in[i])[0],((int *)&in[i])[1]); // printb = (short *)&mm2; // printf("mm2 %d : %d %d %d %d\n",i,printb[0],printb[1],printb[2],printb[3]); } /* #ifdef MAIN printb = (short *)&mm3; printf("%d %d %d %d\n",printb[0],printb[1],printb[2],printb[3]); #endif */ mm1 = mm0; mm0 = _m_psrlqi(mm0,32); mm0 = _m_paddd(mm0,mm1); temp = _m_to_int(mm0); temp/=length; temp<<=shift; // this is the average of x^2 #ifdef MAIN printf("E x^2 = %d\n",temp); #endif _mm_empty(); _m_empty(); return((temp>0)?temp:1); }
void main() { a = _m_paddd( b, c ); printf( "m1="AS_DWORDS"\n" "m2="AS_DWORDS"\n" "mm="AS_DWORDS"\n", b._32[1], b._32[0], c._32[1], c._32[0], a._32[1], a._32[0] ); }
int signal_energy(int *input,unsigned int length) { int i; int temp,temp2; register __m64 mm0,mm1,mm2,mm3; __m64 *in = (__m64 *)input; #ifdef MAIN short *printb; #endif mm0 = _m_pxor(mm0,mm0); mm3 = _m_pxor(mm3,mm3); for (i=0;i<length>>1;i++) { mm1 = in[i]; mm2 = mm1; mm1 = _m_pmaddwd(mm1,mm1); mm1 = _m_psradi(mm1,shift);// shift any 32 bits blocs of the word by the value shift mm0 = _m_paddd(mm0,mm1);// add the two 64 bits words 4 bytes by 4 bytes // temp2 = mm0; // printf("%d %d\n",((int *)&temp2)[0],((int *)&temp2)[1]); // printb = (short *)&mm2; // printf("mm2 %d : %d %d %d %d\n",i,printb[0],printb[1],printb[2],printb[3]); mm2 = _m_psrawi(mm2,shift_DC); mm3 = _m_paddw(mm3,mm2);// add the two 64 bits words 2 bytes by 2 bytes // printb = (short *)&mm3; // printf("mm3 %d : %d %d %d %d\n",i,printb[0],printb[1],printb[2],printb[3]); } /* #ifdef MAIN printb = (short *)&mm3; printf("%d %d %d %d\n",printb[0],printb[1],printb[2],printb[3]); #endif */ mm1 = mm0; mm0 = _m_psrlqi(mm0,32); mm0 = _m_paddd(mm0,mm1); temp = _m_to_int(mm0); temp/=length; temp<<=shift; // this is the average of x^2 // now remove the DC component mm2 = _m_psrlqi(mm3,32); mm2 = _m_paddw(mm2,mm3); mm2 = _m_pmaddwd(mm2,mm2); temp2 = _m_to_int(mm2); temp2/=(length*length); temp2<<=(2*shift_DC); #ifdef MAIN printf("E x^2 = %d\n",temp); #endif temp -= temp2; #ifdef MAIN printf("(E x)^2=%d\n",temp2); #endif _mm_empty(); _m_empty(); return((temp>0)?temp:1); }