diff --git a/tp.gpt b/tp.gpt index 8c98e46..6e75114 100644 --- a/tp.gpt +++ b/tp.gpt @@ -1,9 +1,16 @@ -#plot "tp.dat" using 1:3 title "input", "tp.dat" using 1:5 title "two pole", "tp.dat" using 1:6 title "34LAG", "tp.dat" using 1:7 title "78LAG" +plot "tp.dat" using 1:3 title "input" with linespoints, "tp.dat" using 1:5 title "two pole" with linespoints, "tp.dat" using 1:6 title "34LAG" with linespoints, "tp.dat" using 1:7 title "78LAG" with linespoints, "tp.dat" using 1:13 title "two pole 15 16" with linespoints + + #plot "tp.dat" using 1:3 title "input" with linespoints, "tp.dat" using 1:5 title "two pole" with linespoints, "tp.dat" using 1:7 title "78LAG" with linespoints, "tp.dat" using 1:9 title "78LAG TWICE" with linespoints, "tp.dat" using 1:11 title "two pole 15 16" -plot "tp.dat" using 1:3 title "input" with linespoints, "tp.dat" using 1:5 title "two pole" with linespoints, "tp.dat" using 1:11 title "two pole 15 16" with linespoints, "tp.dat" using 1:13 title "zero only" with linespoints -plot "tp.dat" using 1:3 title "input" with linespoints, "tp.dat" using 1:5 title "two pole" with linespoints, "tp.dat" using 1:15 title "7 8 two pole ZG" with linespoints, "tp.dat" using 1:17 title "zero only^3" with linespoints,"tp.dat" using 1:19 title "zero only^4" with linespoints +# +# + +#plot "tp.dat" using 1:3 title "input" with linespoints, "tp.dat" using 1:5 title "two pole" with linespoints, "tp.dat" using 1:13 title "two pole 15 16" with linespoints + + +#plot "tp.dat" using 1:3 title "input" with linespoints, "tp.dat" using 1:5 title "two pole" with linespoints, "tp.dat" using 1:15 title "7 8 two pole ZG" with linespoints, "tp.dat" using 1:17 title "zero only^3" with linespoints,"tp.dat" using 1:19 title "zero only^4" with linespoints !sleep 10 !sleep 10 diff --git a/two_pole_7_8.c b/two_pole_7_8.c index 91abe26..5ddcec0 100644 --- a/two_pole_7_8.c +++ b/two_pole_7_8.c @@ -86,7 +86,7 @@ two_pole_7_8 ( int16_t input ) { int16_t /* squared version of LAG_7_8 */ two_pole_7_8_zg ( int16_t input ) { // with zero guard - static int32_t y1=0,y2=0, x1,x2; + static int32_t y1=0,y2=0, x1,x2,x3,x4,x5,x6,x7,x8; int32_t * res; int32_t y0; @@ -107,8 +107,10 @@ two_pole_7_8_zg ( int16_t input ) { // with zero guard // y0 = x0 + (14.0 / 8.0) * (double) y1 - (49.0/64.0) * (double) y2; - - y0 = (x0>>1) + (x0>>2) + (x0>>6) + (x2>>1) + // 49/64 * x0 + 1/2 * x2 + // (z-j)(z+j) zeros at half nyquist (Z^2 + 1) x0 + x2 + y0 = //(x0>>1) + (x2>>1) + + (x0+x1+x2+x3) + + //(x0>>1) + (x0>>2) + (x0>>6) + (x2>>1) + // 49/64 * x0 + 1/2 * x2 // (14.0 / 8.0) * (double) y1 // this is 7/4 y1 + y1 - (y1>>2) @@ -130,6 +132,8 @@ two_pole_7_8_zg ( int16_t input ) { // with zero guard y2 = y1; y1 = y0; + x4 = x3; + x3 = x2; x2 = x1; x1 = x0; @@ -146,7 +150,7 @@ two_pole_7_8_zg ( int16_t input ) { // with zero guard // this is a 64 bit machine (the pi) // -int16_t /* squared version of LAG_7_8 */ +int16_t /* squared version of LAG_15_16 */ two_pole_15_16 ( int16_t input ) { static int32_t y1=0,y2=0, x1, x2; @@ -155,31 +159,45 @@ two_pole_15_16 ( int16_t input ) { int32_t x0 = input; - // x0 times 0.125 - // the minus 3 divides by 8 : DOUBLE POLE + x0 <<= (BIN_FRACS_15_16) ; // now all calculations are done times BIN_FRACS^2 y0 = x0 + - // (30.0 / 16.0) * (double) y1 - // this is 7/8 + // + // this is 7/8 which is 2 * 15/16... y1 + y1 - (y1>>3) // // // - (49.0/64.0) * (double) y2; // - - ( (y2>>1) + // half - (y2>>2) + // quarter - (y2>>3) + // eighth - (y2>>8) // 256th - ); + ; + + + //- ( (y2>>1) + // half + // (y2>>2) + // quarter + // (y2>>3) + // eighth + // (y2>>8) // 256th + // ); + // + // try to do the shfts in a way effecient for the HYTEC PIC18 compiler + // + y2>>=1; + y0 -= y2; + y2>>=1; + y0 -= y2; + y2>>=1; + y0 -= y2; + y2>>=5; + y0 -= y2; + y2 = y1; y1 = y0; - // gain of the filter is 256 ((1/16)^2) if x0 is allowed in withiout pre-dividing + // gain of the filter is 256 ((1/16)^2) if x0 is allowed in without pre-dividing // y0 >>= 8;