|
Post by DarioG on Feb 23, 2020 10:52:55 GMT
of course ~0.2 seconds using fixed point. wanna try DSP instructions...
|
|
|
Post by DarioG on Feb 23, 2020 17:40:47 GMT
|
|
|
Post by DarioG on Feb 24, 2020 18:12:27 GMT
DSP version, 3 times faster and *almost* perfect (only some saturation to check...)
int iterate(int real0, int imag0) { /*register*/ /*nint_t*/ int realq, imagq, real, imag; int i;
real = real0; imag = imag0; // CORCONbits.RND=1; for(i=0; i<MAXITERATE; i++) { volatile register int result1 asm("A"); volatile register int result2 asm("B"); // result=__builtin_lac(real,0); result1=__builtin_mpy(real,real,0,0,0,0,0,0); realq=__builtin_sac(result1,-(15-NORM_BITS)); result2=__builtin_mpy(imag,imag,0,0,0,0,0,0); imagq=__builtin_sac(result2,-(15-NORM_BITS)); // https://microchipdeveloper.com/dsp0201:mac-instructions // realq = (real*real) >> NORM_BITS; // imagq = (imag*imag) >> NORM_BITS;
result1=__builtin_addab(result1,result2); if(/*__builtin_readsfr(*/ACCAH/*)*/ > NORM_FACT /*result1 > 4L*NORM_FACT*/) break;
// if((realq + imagq) > (nint_t)4*NORM_FACT) // break; result1=__builtin_mpy(real,imag,0,0,0,0,0,0); // result1=__builtin_mac(result1,real,imag, 0,0,0, 0,0,0 ,imag,result2); // result2=__builtin_mpy(imag,imag,0,0,0,0,0,0); // per dopo! imag=__builtin_sac(result1,-(15-(NORM_BITS-1))); imag += imag0; // imag = ((real*imag) >> (NORM_BITS-1)) + imag0;
/* result1=__builtin_mpy(real,real,0,0,0,0,0,0); //result2=__builtin_mpy(imag,imag,0,0,0,0,0,0); // messa sopra... mi tocca imag result1=__builtin_subab(result1,result2); real = (ACCAH << 2)+real0;*/ real = realq - imagq + real0; } return i; }
|
|
|
Post by DarioG on Feb 24, 2020 18:12:49 GMT
|
|