@init function halfband(x0) local( a0 a1 a2 a3 a4 a5 a6 a7 b0 b1 b2 b3 b4 b5 b6 b7) instance( x1 x2 x3 a0o a1o a2o a3o a4o a5o a6o a7o b0o b1o b2o b3o b4o b5o b6o b7o a0t a1t a2t a3t a4t a5t a6t a7t b0t b1t b2t b3t b4t b5t b6t b7t) ( a0 = x2 + (x0 - a0o)*0.006185967461045014; a1 = a0o + (a0 - a1o)*0.054230780876613788; a2 = a1o + (a1 - a2o)*0.143280861566087270; a3 = a2o + (a2 - a3o)*0.262004358403954640; a4 = a3o + (a3 - a4o)*0.398796973552973666; a5 = a4o + (a4 - a5o)*0.545323651071132232; a6 = a5o + (a5 - a6o)*0.698736833646440347; a7 = a6o + (a6 - a7o)*0.862917812650502936; b0 = x3 + (x1 - b0o)*0.024499027624721819; b1 = b0o + (b0 - b1o)*0.094283481125726432; b2 = b1o + (b1 - b2o)*0.199699579426327684; b3 = b2o + (b2 - b3o)*0.328772348316831664; b4 = b3o + (b3 - b4o)*0.471167216679969414; b5 = b4o + (b4 - b5o)*0.621096845120503893; b6 = b5o + (b5 - b6o)*0.778944517099529166; b7 = b6o + (b6 - b7o)*0.952428157718303137; x3 = x2; x2 = x1; x1 = x0; a0o = a0t; a0t = a0; a1o = a1t; a1t = a1; a2o = a2t; a2t = a2; a3o = a3t; a3t = a3; a4o = a4t; a4t = a4; a5o = a5t; a5t = a5; a6o = a6t; a6t = a6; a7o = a7t; a7t = a7; b0o = b0t; b0t = b0; b1o = b1t; b1t = b1; b2o = b2t; b2t = b2; b3o = b3t; b3t = b3; b4o = b4t; b4t = b4; b5o = b5t; b5t = b5; b6o = b6t; b6t = b6; b7o = b7t; b7t = b7; (a7 + b7)*0.5; ); function decimate(x0) local( c0 c1 c2 c3 c4 c5 c6 c7) instance( i x1 x2 a0o a1o a2o a3o a4o a5o a6o a7o b0o b1o b2o b3o b4o b5o b6o b7o) ( // every first of two results is scrapped (i = !i) ? ( // no computation needs to be done here besides buffering, // however it requires fewer local variables to do half now. c0 = x2 + (x0 - b0o)*0.024499027624721819; c1 = b0o + (c0 - b1o)*0.094283481125726432; c2 = b1o + (c1 - b2o)*0.199699579426327684; c3 = b2o + (c2 - b3o)*0.328772348316831664; c4 = b3o + (c3 - b4o)*0.471167216679969414; c5 = b4o + (c4 - b5o)*0.621096845120503893; c6 = b5o + (c5 - b6o)*0.778944517099529166; c7 = b6o + (c6 - b7o)*0.952428157718303137; b0o = c0; b1o = c1; b2o = c2; b3o = c3; b4o = c4; b5o = c5; b6o = c6; b7o = c7; x2 = x1; x1 = x0; ) : ( c0 = x2 + (x0 - a0o)*0.006185967461045014; c1 = a0o + (c0 - a1o)*0.054230780876613788; c2 = a1o + (c1 - a2o)*0.143280861566087270; c3 = a2o + (c2 - a3o)*0.262004358403954640; c4 = a3o + (c3 - a4o)*0.398796973552973666; c5 = a4o + (c4 - a5o)*0.545323651071132232; c6 = a5o + (c5 - a6o)*0.698736833646440347; c7 = a6o + (c6 - a7o)*0.862917812650502936; a0o = c0; a1o = c1; a2o = c2; a3o = c3; a4o = c4; a5o = c5; a6o = c6; a7o = c7; x2 = x1; x1 = x0; (c7 + b7o)*0.5; ); ); // note: do not zero-stuff! send the input each time. // the function stuffs zeros for you to save a couple cycles and slots. function interpolate(x0) local( c0 c1 c2 c3 c4 c5 c6 c7) instance( i x1 a0o a1o a2o a3o a4o a5o a6o a7o b0o b1o b2o b3o b4o b5o b6o b7o) ( (i = !i) ? ( c0 = x1 + (x0 - a0o)*0.006185967461045014; c1 = a0o + (c0 - a1o)*0.054230780876613788; c2 = a1o + (c1 - a2o)*0.143280861566087270; c3 = a2o + (c2 - a3o)*0.262004358403954640; c4 = a3o + (c3 - a4o)*0.398796973552973666; c5 = a4o + (c4 - a5o)*0.545323651071132232; c6 = a5o + (c5 - a6o)*0.698736833646440347; c7 = a6o + (c6 - a7o)*0.862917812650502936; a0o = c0; a1o = c1; a2o = c2; a3o = c3; a4o = c4; a5o = c5; a6o = c6; a7o = c7; c7; ) : ( c0 = x1 + (x0 - b0o)*0.024499027624721819; c1 = b0o + (c0 - b1o)*0.094283481125726432; c2 = b1o + (c1 - b2o)*0.199699579426327684; c3 = b2o + (c2 - b3o)*0.328772348316831664; c4 = b3o + (c3 - b4o)*0.471167216679969414; c5 = b4o + (c4 - b5o)*0.621096845120503893; c6 = b5o + (c5 - b6o)*0.778944517099529166; c7 = b6o + (c6 - b7o)*0.952428157718303137; x1 = x0; b0o = c0; b1o = c1; b2o = c2; b3o = c3; b4o = c4; b5o = c5; b6o = c6; b7o = c7; c7; ); );